diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..fb51f847 --- /dev/null +++ b/404.html @@ -0,0 +1,1623 @@ + + + + + + + + + + + + + + + + + + + + Computação em Nuvem - 2024/1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + +
+
+ +

404 - Not found

+ +
+ +
+
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/adicional/index.html b/adicional/index.html new file mode 100644 index 00000000..e1427690 --- /dev/null +++ b/adicional/index.html @@ -0,0 +1 @@ + Adicional - Computação em Nuvem - 2024/1
Skip to content

Video - Vint Cerf

O primeiro passo para trabalharmos com redes é compreender o contexto ao qual estamos inseridos e também saber o que deve ser protegido e implementado. Neste sentido, seria interessante vocês acessarem o vídeo disponível no link abaixo. Nele um dos criadores do TCP/IP Vint Cerf vai abordar os principais acontecimentos tecnológicos para entendermos o que é a Internet e as redes de computadores.



Video - OpenInfra 2022

OpenStack é a plataforma de nuvem de código aberto líder mundial. Ele é usado por centenas de provedores locais de nuvem pública , telcos e milhares de empresas , com mais de 25 milhões de núcleos sendo executados em produção, de acordo com a OpenStack User Survey 2021. O OpenStack, sem dúvida, dominou o mercado e se tornou o padrão de fato para código aberto implementações de infraestrutura em nuvem. Sua adoção continua a crescer e sua participação de mercado deve chegar a US$ 8 bilhões em 2023.

\ No newline at end of file diff --git a/assets/favicon.png b/assets/favicon.png new file mode 100644 index 00000000..89d127b1 Binary files /dev/null and b/assets/favicon.png differ diff --git a/assets/images/2022-10-24_10-56.png b/assets/images/2022-10-24_10-56.png new file mode 100644 index 00000000..5dccb820 Binary files /dev/null and b/assets/images/2022-10-24_10-56.png differ diff --git a/assets/images/IaC.png b/assets/images/IaC.png new file mode 100644 index 00000000..ecb3064c Binary files /dev/null and b/assets/images/IaC.png differ diff --git a/assets/images/IntelAmt1.jpg b/assets/images/IntelAmt1.jpg new file mode 100644 index 00000000..ed5e97a6 Binary files /dev/null and b/assets/images/IntelAmt1.jpg differ diff --git a/assets/images/IntelAmt2.jpg b/assets/images/IntelAmt2.jpg new file mode 100644 index 00000000..b3287517 Binary files /dev/null and b/assets/images/IntelAmt2.jpg differ diff --git a/assets/images/IntelAmt3.jpg b/assets/images/IntelAmt3.jpg new file mode 100644 index 00000000..dfb08069 Binary files /dev/null and b/assets/images/IntelAmt3.jpg differ diff --git a/assets/images/IntelAmt4.jpg b/assets/images/IntelAmt4.jpg new file mode 100644 index 00000000..898aec19 Binary files /dev/null and b/assets/images/IntelAmt4.jpg differ diff --git a/assets/images/IntelAmt5.jpg b/assets/images/IntelAmt5.jpg new file mode 100644 index 00000000..9078338c Binary files /dev/null and b/assets/images/IntelAmt5.jpg differ diff --git a/assets/images/IntelAmt6.jpg b/assets/images/IntelAmt6.jpg new file mode 100644 index 00000000..c3183442 Binary files /dev/null and b/assets/images/IntelAmt6.jpg differ diff --git a/assets/images/cat5e6.jpg b/assets/images/cat5e6.jpg new file mode 100644 index 00000000..f55abb8c Binary files /dev/null and b/assets/images/cat5e6.jpg differ diff --git a/assets/images/container.png b/assets/images/container.png new file mode 100644 index 00000000..c76bb848 Binary files /dev/null and b/assets/images/container.png differ diff --git a/assets/images/desenhoServidores.png b/assets/images/desenhoServidores.png new file mode 100644 index 00000000..b2145f7d Binary files /dev/null and b/assets/images/desenhoServidores.png differ diff --git a/assets/images/docker.png b/assets/images/docker.png new file mode 100644 index 00000000..d9f40673 Binary files /dev/null and b/assets/images/docker.png differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 00000000..1cf13b9f Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/images/illustration.png b/assets/images/illustration.png new file mode 100644 index 00000000..69f739c0 Binary files /dev/null and b/assets/images/illustration.png differ diff --git a/assets/images/jujuStatusAposAbrirVault.png b/assets/images/jujuStatusAposAbrirVault.png new file mode 100644 index 00000000..1deaa68f Binary files /dev/null and b/assets/images/jujuStatusAposAbrirVault.png differ diff --git a/assets/images/kit.png b/assets/images/kit.png new file mode 100644 index 00000000..b734ac29 Binary files /dev/null and b/assets/images/kit.png differ diff --git a/assets/images/kit_nv.png b/assets/images/kit_nv.png new file mode 100644 index 00000000..9e38e11b Binary files /dev/null and b/assets/images/kit_nv.png differ diff --git a/assets/images/kubernetes.png b/assets/images/kubernetes.png new file mode 100644 index 00000000..471c7963 Binary files /dev/null and b/assets/images/kubernetes.png differ diff --git a/assets/images/macaddress_nuc.jpg b/assets/images/macaddress_nuc.jpg new file mode 100644 index 00000000..016d5796 Binary files /dev/null and b/assets/images/macaddress_nuc.jpg differ diff --git a/assets/images/nuvem.jpg b/assets/images/nuvem.jpg new file mode 100644 index 00000000..db7832f9 Binary files /dev/null and b/assets/images/nuvem.jpg differ diff --git a/assets/images/nuvem.png b/assets/images/nuvem.png new file mode 100644 index 00000000..2df7278d Binary files /dev/null and b/assets/images/nuvem.png differ diff --git a/assets/images/openstack.png b/assets/images/openstack.png new file mode 100644 index 00000000..ea51131d Binary files /dev/null and b/assets/images/openstack.png differ diff --git a/assets/images/patch.png b/assets/images/patch.png new file mode 100644 index 00000000..62d894c3 Binary files /dev/null and b/assets/images/patch.png differ diff --git a/assets/images/pin_cat6.webp b/assets/images/pin_cat6.webp new file mode 100644 index 00000000..b650e1b7 Binary files /dev/null and b/assets/images/pin_cat6.webp differ diff --git a/assets/images/prairie_1.jpeg b/assets/images/prairie_1.jpeg new file mode 100644 index 00000000..10610bae Binary files /dev/null and b/assets/images/prairie_1.jpeg differ diff --git a/assets/images/prairie_2.jpeg b/assets/images/prairie_2.jpeg new file mode 100644 index 00000000..f164dda1 Binary files /dev/null and b/assets/images/prairie_2.jpeg differ diff --git a/assets/images/prairie_3.jpeg b/assets/images/prairie_3.jpeg new file mode 100644 index 00000000..fd61bd6f Binary files /dev/null and b/assets/images/prairie_3.jpeg differ diff --git a/assets/images/rot3FIM.png b/assets/images/rot3FIM.png new file mode 100644 index 00000000..fe7221f6 Binary files /dev/null and b/assets/images/rot3FIM.png differ diff --git a/assets/images/roteador.jpg b/assets/images/roteador.jpg new file mode 100644 index 00000000..77016190 Binary files /dev/null and b/assets/images/roteador.jpg differ diff --git a/assets/images/roteiro1_Diagrama.png b/assets/images/roteiro1_Diagrama.png new file mode 100644 index 00000000..2614b9df Binary files /dev/null and b/assets/images/roteiro1_Diagrama.png differ diff --git a/assets/images/tiago.png b/assets/images/tiago.png new file mode 100644 index 00000000..97c53cf4 Binary files /dev/null and b/assets/images/tiago.png differ diff --git a/assets/images/tool_IaC.png b/assets/images/tool_IaC.png new file mode 100644 index 00000000..21cebd01 Binary files /dev/null and b/assets/images/tool_IaC.png differ diff --git a/assets/images/topologia.png b/assets/images/topologia.png new file mode 100644 index 00000000..77081dfd Binary files /dev/null and b/assets/images/topologia.png differ diff --git a/assets/images/topology_terraform.png b/assets/images/topology_terraform.png new file mode 100644 index 00000000..27ffc7f8 Binary files /dev/null and b/assets/images/topology_terraform.png differ diff --git a/assets/images/tree.png b/assets/images/tree.png new file mode 100644 index 00000000..41bb08b4 Binary files /dev/null and b/assets/images/tree.png differ diff --git a/assets/javascripts/bundle.9c69f0bc.min.js b/assets/javascripts/bundle.9c69f0bc.min.js new file mode 100644 index 00000000..91fc7b5d --- /dev/null +++ b/assets/javascripts/bundle.9c69f0bc.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var oa=Object.create;var xr=Object.defineProperty;var ia=Object.getOwnPropertyDescriptor;var aa=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,sa=Object.getPrototypeOf,Sr=Object.prototype.hasOwnProperty,sn=Object.prototype.propertyIsEnumerable;var an=(e,t,r)=>t in e?xr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,H=(e,t)=>{for(var r in t||(t={}))Sr.call(t,r)&&an(e,r,t[r]);if(kt)for(var r of kt(t))sn.call(t,r)&&an(e,r,t[r]);return e};var cn=(e,t)=>{var r={};for(var n in e)Sr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&kt)for(var n of kt(e))t.indexOf(n)<0&&sn.call(e,n)&&(r[n]=e[n]);return r};var yt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ca=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of aa(t))!Sr.call(e,o)&&o!==r&&xr(e,o,{get:()=>t[o],enumerable:!(n=ia(t,o))||n.enumerable});return e};var Ye=(e,t,r)=>(r=e!=null?oa(sa(e)):{},ca(t||!e||!e.__esModule?xr(r,"default",{value:e,enumerable:!0}):r,e));var fn=yt((wr,un)=>{(function(e,t){typeof wr=="object"&&typeof un!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(wr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function c(O){var Ue=O.type,He=O.tagName;return!!(He==="INPUT"&&a[Ue]&&!O.readOnly||He==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function u(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function f(O){!O.hasAttribute("data-focus-visible-added")||(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(s(r.activeElement)&&u(r.activeElement),n=!0)}function l(O){n=!1}function d(O){!s(O.target)||(n||c(O.target))&&u(O.target)}function h(O){!s(O.target)||(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),f(O.target))}function b(O){document.visibilityState==="hidden"&&(o&&(n=!0),U())}function U(){document.addEventListener("mousemove",W),document.addEventListener("mousedown",W),document.addEventListener("mouseup",W),document.addEventListener("pointermove",W),document.addEventListener("pointerdown",W),document.addEventListener("pointerup",W),document.addEventListener("touchmove",W),document.addEventListener("touchstart",W),document.addEventListener("touchend",W)}function G(){document.removeEventListener("mousemove",W),document.removeEventListener("mousedown",W),document.removeEventListener("mouseup",W),document.removeEventListener("pointermove",W),document.removeEventListener("pointerdown",W),document.removeEventListener("pointerup",W),document.removeEventListener("touchmove",W),document.removeEventListener("touchstart",W),document.removeEventListener("touchend",W)}function W(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,G())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",l,!0),document.addEventListener("pointerdown",l,!0),document.addEventListener("touchstart",l,!0),document.addEventListener("visibilitychange",b,!0),U(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var pn=yt(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(u){return!1}},r=t(),n=function(u){var f={next:function(){var p=u.shift();return{done:p===void 0,value:p}}};return r&&(f[Symbol.iterator]=function(){return f}),f},o=function(u){return encodeURIComponent(u).replace(/%20/g,"+")},i=function(u){return decodeURIComponent(String(u).replace(/\+/g," "))},a=function(){var u=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var l=typeof p;if(l!=="undefined")if(l==="string")p!==""&&this._fromString(p);else if(p instanceof u){var d=this;p.forEach(function(G,W){d.append(W,G)})}else if(p!==null&&l==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),u._entries&&(u._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(c,u){typeof c!="string"&&(c=String(c)),u&&typeof u!="string"&&(u=String(u));var f=document,p;if(u&&(e.location===void 0||u!==e.location.href)){u=u.toLowerCase(),f=document.implementation.createHTMLDocument(""),p=f.createElement("base"),p.href=u,f.head.appendChild(p);try{if(p.href.indexOf(u)!==0)throw new Error(p.href)}catch(O){throw new Error("URL unable to set base "+u+" due to "+O)}}var l=f.createElement("a");l.href=c,p&&(f.body.appendChild(l),l.href=l.href);var d=f.createElement("input");if(d.type="url",d.value=c,l.protocol===":"||!/:/.test(l.href)||!d.checkValidity()&&!u)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:l});var h=new e.URLSearchParams(this.search),b=!0,U=!0,G=this;["append","delete","set"].forEach(function(O){var Ue=h[O];h[O]=function(){Ue.apply(h,arguments),b&&(U=!1,G.search=h.toString(),U=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var W=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==W&&(W=this.search,U&&(b=!1,this.searchParams._fromString(this.search),b=!0))}})},a=i.prototype,s=function(c){Object.defineProperty(a,c,{get:function(){return this._anchorElement[c]},set:function(u){this._anchorElement[c]=u},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(c){s(c)}),Object.defineProperty(a,"search",{get:function(){return this._anchorElement.search},set:function(c){this._anchorElement.search=c,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(a,{toString:{get:function(){var c=this;return function(){return c.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(c){this._anchorElement.href=c,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(c){this._anchorElement.pathname=c},enumerable:!0},origin:{get:function(){var c={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],u=this._anchorElement.port!=c&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(u?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(c){},enumerable:!0},username:{get:function(){return""},set:function(c){},enumerable:!0}}),i.createObjectURL=function(c){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(c){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var kn=yt((zs,It)=>{/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */var ln,mn,dn,hn,bn,vn,gn,yn,xn,Ht,Or,Sn,wn,En,rt,On,_n,Tn,Mn,Ln,An,Cn,Rn,Pt;(function(e){var t=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(n){e(r(t,r(n)))}):typeof It=="object"&&typeof It.exports=="object"?e(r(t,r(It.exports))):e(r(t));function r(n,o){return n!==t&&(typeof Object.create=="function"?Object.defineProperty(n,"__esModule",{value:!0}):n.__esModule=!0),function(i,a){return n[i]=o?o(i,a):a}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])};ln=function(n,o){if(typeof o!="function"&&o!==null)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");t(n,o);function i(){this.constructor=n}n.prototype=o===null?Object.create(o):(i.prototype=o.prototype,new i)},mn=Object.assign||function(n){for(var o,i=1,a=arguments.length;i=0;f--)(u=n[f])&&(c=(s<3?u(c):s>3?u(o,i,c):u(o,i))||c);return s>3&&c&&Object.defineProperty(o,i,c),c},bn=function(n,o){return function(i,a){o(i,a,n)}},vn=function(n,o){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,o)},gn=function(n,o,i,a){function s(c){return c instanceof i?c:new i(function(u){u(c)})}return new(i||(i=Promise))(function(c,u){function f(d){try{l(a.next(d))}catch(h){u(h)}}function p(d){try{l(a.throw(d))}catch(h){u(h)}}function l(d){d.done?c(d.value):s(d.value).then(f,p)}l((a=a.apply(n,o||[])).next())})},yn=function(n,o){var i={label:0,sent:function(){if(c[0]&1)throw c[1];return c[1]},trys:[],ops:[]},a,s,c,u;return u={next:f(0),throw:f(1),return:f(2)},typeof Symbol=="function"&&(u[Symbol.iterator]=function(){return this}),u;function f(l){return function(d){return p([l,d])}}function p(l){if(a)throw new TypeError("Generator is already executing.");for(;i;)try{if(a=1,s&&(c=l[0]&2?s.return:l[0]?s.throw||((c=s.return)&&c.call(s),0):s.next)&&!(c=c.call(s,l[1])).done)return c;switch(s=0,c&&(l=[l[0]&2,c.value]),l[0]){case 0:case 1:c=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,s=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(c=i.trys,!(c=c.length>0&&c[c.length-1])&&(l[0]===6||l[0]===2)){i=0;continue}if(l[0]===3&&(!c||l[1]>c[0]&&l[1]=n.length&&(n=void 0),{value:n&&n[a++],done:!n}}};throw new TypeError(o?"Object is not iterable.":"Symbol.iterator is not defined.")},Or=function(n,o){var i=typeof Symbol=="function"&&n[Symbol.iterator];if(!i)return n;var a=i.call(n),s,c=[],u;try{for(;(o===void 0||o-- >0)&&!(s=a.next()).done;)c.push(s.value)}catch(f){u={error:f}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(u)throw u.error}}return c},Sn=function(){for(var n=[],o=0;o1||f(b,U)})})}function f(b,U){try{p(a[b](U))}catch(G){h(c[0][3],G)}}function p(b){b.value instanceof rt?Promise.resolve(b.value.v).then(l,d):h(c[0][2],b)}function l(b){f("next",b)}function d(b){f("throw",b)}function h(b,U){b(U),c.shift(),c.length&&f(c[0][0],c[0][1])}},_n=function(n){var o,i;return o={},a("next"),a("throw",function(s){throw s}),a("return"),o[Symbol.iterator]=function(){return this},o;function a(s,c){o[s]=n[s]?function(u){return(i=!i)?{value:rt(n[s](u)),done:s==="return"}:c?c(u):u}:c}},Tn=function(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var o=n[Symbol.asyncIterator],i;return o?o.call(n):(n=typeof Ht=="function"?Ht(n):n[Symbol.iterator](),i={},a("next"),a("throw"),a("return"),i[Symbol.asyncIterator]=function(){return this},i);function a(c){i[c]=n[c]&&function(u){return new Promise(function(f,p){u=n[c](u),s(f,p,u.done,u.value)})}}function s(c,u,f,p){Promise.resolve(p).then(function(l){c({value:l,done:f})},u)}},Mn=function(n,o){return Object.defineProperty?Object.defineProperty(n,"raw",{value:o}):n.raw=o,n};var r=Object.create?function(n,o){Object.defineProperty(n,"default",{enumerable:!0,value:o})}:function(n,o){n.default=o};Ln=function(n){if(n&&n.__esModule)return n;var o={};if(n!=null)for(var i in n)i!=="default"&&Object.prototype.hasOwnProperty.call(n,i)&&Pt(o,n,i);return r(o,n),o},An=function(n){return n&&n.__esModule?n:{default:n}},Cn=function(n,o,i,a){if(i==="a"&&!a)throw new TypeError("Private accessor was defined without a getter");if(typeof o=="function"?n!==o||!a:!o.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?a:i==="a"?a.call(n):a?a.value:o.get(n)},Rn=function(n,o,i,a,s){if(a==="m")throw new TypeError("Private method is not writable");if(a==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof o=="function"?n!==o||!s:!o.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return a==="a"?s.call(n,i):s?s.value=i:o.set(n,i),i},e("__extends",ln),e("__assign",mn),e("__rest",dn),e("__decorate",hn),e("__param",bn),e("__metadata",vn),e("__awaiter",gn),e("__generator",yn),e("__exportStar",xn),e("__createBinding",Pt),e("__values",Ht),e("__read",Or),e("__spread",Sn),e("__spreadArrays",wn),e("__spreadArray",En),e("__await",rt),e("__asyncGenerator",On),e("__asyncDelegator",_n),e("__asyncValues",Tn),e("__makeTemplateObject",Mn),e("__importStar",Ln),e("__importDefault",An),e("__classPrivateFieldGet",Cn),e("__classPrivateFieldSet",Rn)})});var Kr=yt((At,Yr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof At=="object"&&typeof Yr=="object"?Yr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof At=="object"?At.ClipboardJS=r():t.ClipboardJS=r()})(At,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return na}});var a=i(279),s=i.n(a),c=i(370),u=i.n(c),f=i(817),p=i.n(f);function l(j){try{return document.execCommand(j)}catch(_){return!1}}var d=function(_){var E=p()(_);return l("cut"),E},h=d;function b(j){var _=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[_?"right":"left"]="-9999px";var k=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(k,"px"),E.setAttribute("readonly",""),E.value=j,E}var U=function(_,E){var k=b(_);E.container.appendChild(k);var I=p()(k);return l("copy"),k.remove(),I},G=function(_){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},k="";return typeof _=="string"?k=U(_,E):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?k=U(_.value,E):(k=p()(_),l("copy")),k},W=G;function O(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(E){return typeof E}:O=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},O(j)}var Ue=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=_.action,k=E===void 0?"copy":E,I=_.container,Q=_.target,Oe=_.text;if(k!=="copy"&&k!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Q!==void 0)if(Q&&O(Q)==="object"&&Q.nodeType===1){if(k==="copy"&&Q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(k==="cut"&&(Q.hasAttribute("readonly")||Q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Oe)return W(Oe,{container:I});if(Q)return k==="cut"?h(Q):W(Q,{container:I})},He=Ue;function Ce(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ce=function(E){return typeof E}:Ce=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},Ce(j)}function Bi(j,_){if(!(j instanceof _))throw new TypeError("Cannot call a class as a function")}function on(j,_){for(var E=0;E<_.length;E++){var k=_[E];k.enumerable=k.enumerable||!1,k.configurable=!0,"value"in k&&(k.writable=!0),Object.defineProperty(j,k.key,k)}}function Gi(j,_,E){return _&&on(j.prototype,_),E&&on(j,E),j}function Ji(j,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");j.prototype=Object.create(_&&_.prototype,{constructor:{value:j,writable:!0,configurable:!0}}),_&&gr(j,_)}function gr(j,_){return gr=Object.setPrototypeOf||function(k,I){return k.__proto__=I,k},gr(j,_)}function Xi(j){var _=ta();return function(){var k=Ct(j),I;if(_){var Q=Ct(this).constructor;I=Reflect.construct(k,arguments,Q)}else I=k.apply(this,arguments);return Zi(this,I)}}function Zi(j,_){return _&&(Ce(_)==="object"||typeof _=="function")?_:ea(j)}function ea(j){if(j===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return j}function ta(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(j){return!1}}function Ct(j){return Ct=Object.setPrototypeOf?Object.getPrototypeOf:function(E){return E.__proto__||Object.getPrototypeOf(E)},Ct(j)}function yr(j,_){var E="data-clipboard-".concat(j);if(!!_.hasAttribute(E))return _.getAttribute(E)}var ra=function(j){Ji(E,j);var _=Xi(E);function E(k,I){var Q;return Bi(this,E),Q=_.call(this),Q.resolveOptions(I),Q.listenClick(k),Q}return Gi(E,[{key:"resolveOptions",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=Ce(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var Q=this;this.listener=u()(I,"click",function(Oe){return Q.onClick(Oe)})}},{key:"onClick",value:function(I){var Q=I.delegateTarget||I.currentTarget,Oe=this.action(Q)||"copy",Rt=He({action:Oe,container:this.container,target:this.target(Q),text:this.text(Q)});this.emit(Rt?"success":"error",{action:Oe,text:Rt,trigger:Q,clearSelection:function(){Q&&Q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return yr("action",I)}},{key:"defaultTarget",value:function(I){var Q=yr("target",I);if(Q)return document.querySelector(Q)}},{key:"defaultText",value:function(I){return yr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var Q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return W(I,Q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Q=typeof I=="string"?[I]:I,Oe=!!document.queryCommandSupported;return Q.forEach(function(Rt){Oe=Oe&&!!document.queryCommandSupported(Rt)}),Oe}}]),E}(s()),na=ra},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,c){for(;s&&s.nodeType!==o;){if(typeof s.matches=="function"&&s.matches(c))return s;s=s.parentNode}}n.exports=a},438:function(n,o,i){var a=i(828);function s(f,p,l,d,h){var b=u.apply(this,arguments);return f.addEventListener(l,b,h),{destroy:function(){f.removeEventListener(l,b,h)}}}function c(f,p,l,d,h){return typeof f.addEventListener=="function"?s.apply(null,arguments):typeof l=="function"?s.bind(null,document).apply(null,arguments):(typeof f=="string"&&(f=document.querySelectorAll(f)),Array.prototype.map.call(f,function(b){return s(b,p,l,d,h)}))}function u(f,p,l,d){return function(h){h.delegateTarget=a(h.target,p),h.delegateTarget&&d.call(f,h)}}n.exports=c},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(n,o,i){var a=i(879),s=i(438);function c(l,d,h){if(!l&&!d&&!h)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(h))throw new TypeError("Third argument must be a Function");if(a.node(l))return u(l,d,h);if(a.nodeList(l))return f(l,d,h);if(a.string(l))return p(l,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function u(l,d,h){return l.addEventListener(d,h),{destroy:function(){l.removeEventListener(d,h)}}}function f(l,d,h){return Array.prototype.forEach.call(l,function(b){b.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(l,function(b){b.removeEventListener(d,h)})}}}function p(l,d,h){return s(document.body,l,d,h)}n.exports=c},817:function(n){function o(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),u=document.createRange();u.selectNodeContents(i),c.removeAllRanges(),c.addRange(u),a=c.toString()}return a}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,a,s){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var c=this;function u(){c.off(i,u),a.apply(s,arguments)}return u._=a,this.on(i,u,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),c=0,u=s.length;for(c;c{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var _s=/["'&<>]/;Si.exports=Ts;function Ts(e){var t=""+e,r=_s.exec(t);if(!r)return t;var n,o="",i=0,a=0;for(i=r.index;i0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,a=o.isStopped,s=o.observers;return i||a?_r:(this.currentObservers=null,s.push(r),new Re(function(){n.currentObservers=null,Pe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,a=n.isStopped;o?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new qn(r,n)},t}(F);var qn=function(e){re(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:_r},t}(w);var St={now:function(){return(St.delegate||Date).now()},delegate:void 0};var wt=function(e){re(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=St);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,a=n._infiniteTimeWindow,s=n._timestampProvider,c=n._windowTime;o||(i.push(r),!a&&i.push(s.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,a=o._buffer,s=a.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=at.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){if(o===void 0&&(o=0),o!=null&&o>0||o==null&&this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);r.actions.some(function(i){return i.id===n})||(at.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Nt);var Kn=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(zt);var Te=new Kn(Yn);var C=new F(function(e){return e.complete()});function qt(e){return e&&T(e.schedule)}function kr(e){return e[e.length-1]}function De(e){return T(kr(e))?e.pop():void 0}function ye(e){return qt(kr(e))?e.pop():void 0}function Qt(e,t){return typeof kr(e)=="number"?e.pop():t}var st=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Yt(e){return T(e==null?void 0:e.then)}function Kt(e){return T(e[it])}function Bt(e){return Symbol.asyncIterator&&T(e==null?void 0:e[Symbol.asyncIterator])}function Gt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function va(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Jt=va();function Xt(e){return T(e==null?void 0:e[Jt])}function Zt(e){return In(this,arguments,function(){var r,n,o,i;return $t(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,jt(r.read())];case 3:return n=a.sent(),o=n.value,i=n.done,i?[4,jt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,jt(o)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function er(e){return T(e==null?void 0:e.getReader)}function N(e){if(e instanceof F)return e;if(e!=null){if(Kt(e))return ga(e);if(st(e))return ya(e);if(Yt(e))return xa(e);if(Bt(e))return Bn(e);if(Xt(e))return Sa(e);if(er(e))return wa(e)}throw Gt(e)}function ga(e){return new F(function(t){var r=e[it]();if(T(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function ya(e){return new F(function(t){for(var r=0;r=2,!0))}function oe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new w}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,c=s===void 0?!0:s;return function(u){var f,p,l,d=0,h=!1,b=!1,U=function(){p==null||p.unsubscribe(),p=void 0},G=function(){U(),f=l=void 0,h=b=!1},W=function(){var O=f;G(),O==null||O.unsubscribe()};return g(function(O,Ue){d++,!b&&!h&&U();var He=l=l!=null?l:r();Ue.add(function(){d--,d===0&&!b&&!h&&(p=Ur(W,c))}),He.subscribe(Ue),!f&&d>0&&(f=new Be({next:function(Ce){return He.next(Ce)},error:function(Ce){b=!0,U(),p=Ur(G,o,Ce),He.error(Ce)},complete:function(){h=!0,U(),p=Ur(G,a),He.complete()}}),N(O).subscribe(f))})(u)}}function Ur(e,t){for(var r=[],n=2;ne.next(document)),e}function B(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=pe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function pe(e,t=document){return t.querySelector(e)||void 0}function Ne(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function nr(e){return R(v(document.body,"focusin"),v(document.body,"focusout")).pipe(Ze(1),m(()=>{let t=Ne();return typeof t!="undefined"?e.contains(t):!1}),q(e===Ne()),K())}function ze(e){return{x:e.offsetLeft,y:e.offsetTop}}function vo(e){return R(v(window,"load"),v(window,"resize")).pipe($e(0,Te),m(()=>ze(e)),q(ze(e)))}function or(e){return{x:e.scrollLeft,y:e.scrollTop}}function pt(e){return R(v(e,"scroll"),v(window,"resize")).pipe($e(0,Te),m(()=>or(e)),q(or(e)))}var yo=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!zr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),za?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!zr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=Na.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),xo=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),wo=typeof WeakMap!="undefined"?new WeakMap:new yo,Eo=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=qa.getInstance(),n=new ts(t,r,this);wo.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Eo.prototype[e]=function(){var t;return(t=wo.get(this))[e].apply(t,arguments)}});var rs=function(){return typeof ir.ResizeObserver!="undefined"?ir.ResizeObserver:Eo}(),Oo=rs;var _o=new w,ns=P(()=>$(new Oo(e=>{for(let t of e)_o.next(t)}))).pipe(S(e=>R(xe,$(e)).pipe(L(()=>e.disconnect()))),X(1));function Ae(e){return{width:e.offsetWidth,height:e.offsetHeight}}function de(e){return ns.pipe(x(t=>t.observe(e)),S(t=>_o.pipe(M(({target:r})=>r===e),L(()=>t.unobserve(e)),m(()=>Ae(e)))),q(Ae(e)))}function mt(e){return{width:e.scrollWidth,height:e.scrollHeight}}var To=new w,os=P(()=>$(new IntersectionObserver(e=>{for(let t of e)To.next(t)},{threshold:0}))).pipe(S(e=>R(xe,$(e)).pipe(L(()=>e.disconnect()))),X(1));function cr(e){return os.pipe(x(t=>t.observe(e)),S(t=>To.pipe(M(({target:r})=>r===e),L(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function Mo(e,t=16){return pt(e).pipe(m(({y:r})=>{let n=Ae(e),o=mt(e);return r>=o.height-n.height-t}),K())}var ur={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function Lo(e){return ur[e].checked}function qe(e,t){ur[e].checked!==t&&ur[e].click()}function dt(e){let t=ur[e];return v(t,"change").pipe(m(()=>t.checked),q(t.checked))}function is(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ao(){return v(window,"keydown").pipe(M(e=>!(e.metaKey||e.ctrlKey)),m(e=>({mode:Lo("search")?"search":"global",type:e.key,claim(){e.preventDefault(),e.stopPropagation()}})),M(({mode:e,type:t})=>{if(e==="global"){let r=Ne();if(typeof r!="undefined")return!is(r,t)}return!0}),oe())}function Se(){return new URL(location.href)}function fr(e){location.href=e.href}function Co(){return new w}function Ro(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Ro(e,r)}function A(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)Ro(n,o);return n}function ko(e,t){let r=t;if(e.length>r){for(;e[r]!==" "&&--r>0;);return`${e.substring(0,r)}...`}return e}function pr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function Ho(){return location.hash.substring(1)}function Po(e){let t=A("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function as(){return v(window,"hashchange").pipe(m(Ho),q(Ho()),M(e=>e.length>0),X(1))}function Io(){return as().pipe(m(e=>pe(`[id="${e}"]`)),M(e=>typeof e!="undefined"))}function qr(e){let t=matchMedia(e);return rr(r=>t.addListener(()=>r(t.matches))).pipe(q(t.matches))}function $o(){let e=matchMedia("print");return R(v(window,"beforeprint").pipe(m(()=>!0)),v(window,"afterprint").pipe(m(()=>!1))).pipe(q(e.matches))}function Qr(e,t){return e.pipe(S(r=>r?t():C))}function lr(e,t={credentials:"same-origin"}){return fe(fetch(`${e}`,t)).pipe(ae(()=>C),S(r=>r.status!==200?Ot(()=>new Error(r.statusText)):$(r)))}function ke(e,t){return lr(e,t).pipe(S(r=>r.json()),X(1))}function jo(e,t){let r=new DOMParser;return lr(e,t).pipe(S(n=>n.text()),m(n=>r.parseFromString(n,"text/xml")),X(1))}function Fo(e){let t=A("script",{src:e});return P(()=>(document.head.appendChild(t),R(v(t,"load"),v(t,"error").pipe(S(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),L(()=>document.head.removeChild(t)),se(1))))}function Uo(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function Do(){return R(v(window,"scroll",{passive:!0}),v(window,"resize",{passive:!0})).pipe(m(Uo),q(Uo()))}function Wo(){return{width:innerWidth,height:innerHeight}}function Vo(){return v(window,"resize",{passive:!0}).pipe(m(Wo),q(Wo()))}function No(){return Y([Do(),Vo()]).pipe(m(([e,t])=>({offset:e,size:t})),X(1))}function mr(e,{viewport$:t,header$:r}){let n=t.pipe(J("size")),o=Y([n,r]).pipe(m(()=>ze(e)));return Y([r,t,o]).pipe(m(([{height:i},{offset:a,size:s},{x:c,y:u}])=>({offset:{x:a.x-c,y:a.y-u+i},size:s})))}function zo(e,{tx$:t}){let r=v(e,"message").pipe(m(({data:n})=>n));return t.pipe(Lt(()=>r,{leading:!0,trailing:!0}),x(n=>e.postMessage(n)),S(()=>r),oe())}var ss=z("#__config"),ht=JSON.parse(ss.textContent);ht.base=`${new URL(ht.base,Se())}`;function he(){return ht}function ee(e){return ht.features.includes(e)}function te(e,t){return typeof t!="undefined"?ht.translations[e].replace("#",t.toString()):ht.translations[e]}function we(e,t=document){return z(`[data-md-component=${e}]`,t)}function ne(e,t=document){return B(`[data-md-component=${e}]`,t)}function cs(e){let t=z(".md-typeset > :first-child",e);return v(t,"click",{once:!0}).pipe(m(()=>z(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function qo(e){return!ee("announce.dismiss")||!e.childElementCount?C:P(()=>{let t=new w;return t.pipe(q({hash:__md_get("__announce")})).subscribe(({hash:r})=>{var n;r&&r===((n=__md_get("__announce"))!=null?n:r)&&(e.hidden=!0,__md_set("__announce",r))}),cs(e).pipe(x(r=>t.next(r)),L(()=>t.complete()),m(r=>H({ref:e},r)))})}function us(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function Qo(e,t){let r=new w;return r.subscribe(({hidden:n})=>{e.hidden=n}),us(e,t).pipe(x(n=>r.next(n)),L(()=>r.complete()),m(n=>H({ref:e},n)))}var ni=Ye(Kr());function Yo(e){return A("aside",{class:"md-annotation",tabIndex:0},A("div",{class:"md-annotation__inner md-tooltip"},A("div",{class:"md-tooltip__inner md-typeset"})),A("span",{class:"md-annotation__index"},A("span",{"data-md-annotation-id":e})))}function Ko(e){return A("button",{class:"md-clipboard md-icon",title:te("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function Br(e,t){let r=t&2,n=t&1,o=Object.keys(e.terms).filter(a=>!e.terms[a]).reduce((a,s)=>[...a,A("del",null,s)," "],[]).slice(0,-1),i=new URL(e.location);return ee("search.highlight")&&i.searchParams.set("h",Object.entries(e.terms).filter(([,a])=>a).reduce((a,[s])=>`${a} ${s}`.trim(),"")),A("a",{href:`${i}`,class:"md-search-result__link",tabIndex:-1},A("article",{class:["md-search-result__article",...r?["md-search-result__article--document"]:[]].join(" "),"data-md-score":e.score.toFixed(2)},r>0&&A("div",{class:"md-search-result__icon md-icon"}),A("h1",{class:"md-search-result__title"},e.title),n>0&&e.text.length>0&&A("p",{class:"md-search-result__teaser"},ko(e.text,320)),e.tags&&e.tags.map(a=>A("span",{class:"md-tag"},a)),n>0&&o.length>0&&A("p",{class:"md-search-result__terms"},te("search.result.term.missing"),": ",...o)))}function Bo(e){let t=e[0].score,r=[...e],n=r.findIndex(u=>!u.location.includes("#")),[o]=r.splice(n,1),i=r.findIndex(u=>u.scoreBr(u,1)),...s.length?[A("details",{class:"md-search-result__more"},A("summary",{tabIndex:-1},s.length>0&&s.length===1?te("search.result.more.one"):te("search.result.more.other",s.length)),...s.map(u=>Br(u,1)))]:[]];return A("li",{class:"md-search-result__item"},c)}function Go(e){return A("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>A("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?pr(r):r)))}function Gr(e){let t=`tabbed-control tabbed-control--${e}`;return A("div",{class:t,hidden:!0},A("button",{class:"tabbed-button",tabIndex:-1}))}function Jo(e){return A("div",{class:"md-typeset__scrollwrap"},A("div",{class:"md-typeset__table"},e))}function fs(e){let t=he(),r=new URL(`../${e.version}/`,t.base);return A("li",{class:"md-version__item"},A("a",{href:`${r}`,class:"md-version__link"},e.title))}function Xo(e,t){return A("div",{class:"md-version"},A("button",{class:"md-version__current","aria-label":te("select.version.title")},t.title),A("ul",{class:"md-version__list"},e.map(fs)))}function ps(e,t){let r=P(()=>Y([vo(e),pt(t)])).pipe(m(([{x:n,y:o},i])=>{let{width:a}=Ae(e);return{x:n-i.x+a/2,y:o-i.y}}));return nr(e).pipe(S(n=>r.pipe(m(o=>({active:n,offset:o})),se(+!n||1/0))))}function Zo(e,t){return P(()=>{let r=new w;r.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}});let n=r.pipe(ce(1));cr(e).pipe(Z(n)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),r.pipe(Vr(500,Te),m(()=>t.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}});let o=z(":scope > :last-child",e),i=v(o,"mousedown",{once:!0});return r.pipe(S(({active:a})=>a?i:C),x(a=>a.preventDefault())).subscribe(()=>e.blur()),ps(e,t).pipe(x(a=>r.next(a)),L(()=>r.complete()),m(a=>H({ref:e},a)))})}function ls(e){let t=[];for(let r of B(".c, .c1, .cm",e)){let n,o=r.firstChild;if(o instanceof Text)for(;n=/\((\d+)\)/.exec(o.textContent);){let i=o.splitText(n.index);o=i.splitText(n[0].length),t.push(i)}}return t}function ei(e,t){t.append(...Array.from(e.childNodes))}function ti(e,t,{print$:r}){let n=new Map;for(let o of ls(t)){let[,i]=o.textContent.match(/\((\d+)\)/);pe(`li:nth-child(${i})`,e)&&(n.set(+i,Yo(+i)),o.replaceWith(n.get(+i)))}return n.size===0?C:P(()=>{let o=new w;return r.pipe(Z(o.pipe(ce(1)))).subscribe(i=>{e.hidden=!i;for(let[a,s]of n){let c=z(".md-typeset",s),u=z(`li:nth-child(${a})`,e);i?ei(c,u):ei(u,c)}}),R(...[...n].map(([,i])=>Zo(i,t))).pipe(L(()=>o.complete()),oe())})}var ms=0;function oi(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return oi(t)}}function ri(e){return de(e).pipe(m(({width:t})=>({scrollable:mt(e).width>t})),J("scrollable"))}function ii(e,t){let{matches:r}=matchMedia("(hover)"),n=P(()=>{let o=new w;if(o.subscribe(({scrollable:a})=>{a&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")}),ni.default.isSupported()){let a=e.closest("pre");a.id=`__code_${++ms}`,a.insertBefore(Ko(a.id),e)}let i=e.closest(".highlight");if(i instanceof HTMLElement){let a=oi(i);if(typeof a!="undefined"&&(i.classList.contains("annotate")||ee("content.code.annotate"))){let s=ti(a,e,t);return ri(e).pipe(x(c=>o.next(c)),L(()=>o.complete()),m(c=>H({ref:e},c)),et(de(i).pipe(Z(o.pipe(ce(1))),m(({width:c,height:u})=>c&&u),K(),S(c=>c?s:C))))}}return ri(e).pipe(x(a=>o.next(a)),L(()=>o.complete()),m(a=>H({ref:e},a)))});return cr(e).pipe(M(o=>o),se(1),S(()=>n))}var ai=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:transparent}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color)}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}defs #flowchart-circleEnd,defs #flowchart-circleStart,defs #flowchart-crossEnd,defs #flowchart-crossStart,defs #flowchart-pointEnd,defs #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}.actor,defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{stroke:var(--md-mermaid-node-fg-color)}text.actor>tspan{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-default-fg-color--lighter)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-edge-color)}.loopText>tspan,.messageText{font-family:var(--md-mermaid-font-family)!important}#arrowhead path,.loopText>tspan,.messageText{fill:var(--md-mermaid-edge-color);stroke:none}.loopLine{stroke:var(--md-mermaid-node-fg-color)}.labelBox,.loopLine{fill:var(--md-mermaid-node-bg-color)}.labelBox{stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-node-fg-color);font-family:var(--md-mermaid-font-family)}";var Jr,hs=0;function bs(){return typeof mermaid=="undefined"||mermaid instanceof Element?Fo("https://unpkg.com/mermaid@9.0.1/dist/mermaid.min.js"):$(void 0)}function si(e){return e.classList.remove("mermaid"),Jr||(Jr=bs().pipe(x(()=>mermaid.initialize({startOnLoad:!1,themeCSS:ai})),m(()=>{}),X(1))),Jr.subscribe(()=>{e.classList.add("mermaid");let t=`__mermaid_${hs++}`,r=A("div",{class:"mermaid"});mermaid.mermaidAPI.render(t,e.textContent,n=>{let o=r.attachShadow({mode:"closed"});o.innerHTML=n,e.replaceWith(r)})}),Jr.pipe(m(()=>({ref:e})))}function vs(e,{target$:t,print$:r}){let n=!0;return R(t.pipe(m(o=>o.closest("details:not([open])")),M(o=>e===o),m(()=>({action:"open",reveal:!0}))),r.pipe(M(o=>o||!n),x(()=>n=e.open),m(o=>({action:o?"open":"close"}))))}function ci(e,t){return P(()=>{let r=new w;return r.subscribe(({action:n,reveal:o})=>{n==="open"?e.setAttribute("open",""):e.removeAttribute("open"),o&&e.scrollIntoView()}),vs(e,t).pipe(x(n=>r.next(n)),L(()=>r.complete()),m(n=>H({ref:e},n)))})}var ui=A("table");function fi(e){return e.replaceWith(ui),ui.replaceWith(Jo(e)),$({ref:e})}function gs(e){let t=B(":scope > input",e),r=t.find(n=>n.checked)||t[0];return R(...t.map(n=>v(n,"change").pipe(m(()=>z(`label[for="${n.id}"]`))))).pipe(q(z(`label[for="${r.id}"]`)),m(n=>({active:n})))}function pi(e){let t=Gr("prev");e.append(t);let r=Gr("next");e.append(r);let n=z(".tabbed-labels",e);return P(()=>{let o=new w,i=o.pipe(ce(1));return Y([o,de(e)]).pipe($e(1,Te),Z(i)).subscribe({next([{active:a},s]){let c=ze(a),{width:u}=Ae(a);e.style.setProperty("--md-indicator-x",`${c.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let f=or(n);(c.xf.x+s.width)&&n.scrollTo({left:Math.max(0,c.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),Y([pt(n),de(n)]).pipe(Z(i)).subscribe(([a,s])=>{let c=mt(n);t.hidden=a.x<16,r.hidden=a.x>c.width-s.width-16}),R(v(t,"click").pipe(m(()=>-1)),v(r,"click").pipe(m(()=>1))).pipe(Z(i)).subscribe(a=>{let{width:s}=Ae(n);n.scrollBy({left:s*a,behavior:"smooth"})}),ee("content.tabs.link")&&o.pipe(Le(1)).subscribe(({active:a})=>{let s=a.innerText.trim();for(let u of B("[data-tabs]"))for(let f of B(":scope > input",u))if(z(`label[for="${f.id}"]`).innerText.trim()===s){f.click();break}let c=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([s,...c])])}),gs(e).pipe(x(a=>o.next(a)),L(()=>o.complete()),m(a=>H({ref:e},a)))}).pipe(Ge(ue))}function li(e,{target$:t,print$:r}){return R(...B("pre:not(.mermaid) > code",e).map(n=>ii(n,{print$:r})),...B("pre.mermaid",e).map(n=>si(n)),...B("table:not([class])",e).map(n=>fi(n)),...B("details",e).map(n=>ci(n,{target$:t,print$:r})),...B("[data-tabs]",e).map(n=>pi(n)))}function ys(e,{alert$:t}){return t.pipe(S(r=>R($(!0),$(!1).pipe(Fe(2e3))).pipe(m(n=>({message:r,active:n})))))}function mi(e,t){let r=z(".md-typeset",e);return P(()=>{let n=new w;return n.subscribe(({message:o,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=o}),ys(e,t).pipe(x(o=>n.next(o)),L(()=>n.complete()),m(o=>H({ref:e},o)))})}function xs({viewport$:e}){if(!ee("header.autohide"))return $(!1);let t=e.pipe(m(({offset:{y:o}})=>o),Me(2,1),m(([o,i])=>[oMath.abs(i-o.y)>100),m(([,[o]])=>o),K()),n=dt("search");return Y([e,n]).pipe(m(([{offset:o},i])=>o.y>400&&!i),K(),S(o=>o?r:$(!1)),q(!1))}function di(e,t){return P(()=>Y([de(e),xs(t)])).pipe(m(([{height:r},n])=>({height:r,hidden:n})),K((r,n)=>r.height===n.height&&r.hidden===n.hidden),X(1))}function hi(e,{header$:t,main$:r}){return P(()=>{let n=new w,o=n.pipe(ce(1));return n.pipe(J("active"),Xe(t)).subscribe(([{active:i},{hidden:a}])=>{e.classList.toggle("md-header--shadow",i&&!a),e.hidden=a}),r.subscribe(n),t.pipe(Z(o),m(i=>H({ref:e},i)))})}function Ss(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:n}})=>{let{height:o}=Ae(e);return{active:n>=o}}),J("active"))}function bi(e,t){return P(()=>{let r=new w;r.subscribe(({active:o})=>{e.classList.toggle("md-header__title--active",o)});let n=pe("article h1");return typeof n=="undefined"?C:Ss(n,t).pipe(x(o=>r.next(o)),L(()=>r.complete()),m(o=>H({ref:e},o)))})}function vi(e,{viewport$:t,header$:r}){let n=r.pipe(m(({height:i})=>i),K()),o=n.pipe(S(()=>de(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),J("bottom"))));return Y([n,o,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:c},size:{height:u}}])=>(u=Math.max(0,u-Math.max(0,a-c,i)-Math.max(0,u+c-s)),{offset:a-i,height:u,active:a-i<=c})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function ws(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return $(...e).pipe(ie(r=>v(r,"change").pipe(m(()=>r))),q(e[Math.max(0,t.index)]),m(r=>({index:e.indexOf(r),color:{scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),X(1))}function gi(e){return P(()=>{let t=new w;t.subscribe(n=>{document.body.setAttribute("data-md-color-switching","");for(let[o,i]of Object.entries(n.color))document.body.setAttribute(`data-md-color-${o}`,i);for(let o=0;o{document.body.removeAttribute("data-md-color-switching")});let r=B("input",e);return ws(r).pipe(x(n=>t.next(n)),L(()=>t.complete()),m(n=>H({ref:e},n)))})}var Xr=Ye(Kr());function Es(e){e.setAttribute("data-md-copying","");let t=e.innerText;return e.removeAttribute("data-md-copying"),t}function yi({alert$:e}){Xr.default.isSupported()&&new F(t=>{new Xr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Es(z(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(x(t=>{t.trigger.focus()}),m(()=>te("clipboard.copied"))).subscribe(e)}function Os(e){if(e.length<2)return[""];let[t,r]=[...e].sort((o,i)=>o.length-i.length).map(o=>o.replace(/[^/]+$/,"")),n=0;if(t===r)n=t.length;else for(;t.charCodeAt(n)===r.charCodeAt(n);)n++;return e.map(o=>o.replace(t.slice(0,n),""))}function dr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return $(t);{let r=he();return jo(new URL("sitemap.xml",e||r.base)).pipe(m(n=>Os(B("loc",n).map(o=>o.textContent))),ae(()=>C),je([]),x(n=>__md_set("__sitemap",n,sessionStorage,e)))}}function xi({document$:e,location$:t,viewport$:r}){let n=he();if(location.protocol==="file:")return;"scrollRestoration"in history&&(history.scrollRestoration="manual",v(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}));let o=pe("link[rel=icon]");typeof o!="undefined"&&(o.href=o.href);let i=dr().pipe(m(u=>u.map(f=>`${new URL(f,n.base)}`)),S(u=>v(document.body,"click").pipe(M(f=>!f.metaKey&&!f.ctrlKey),S(f=>{if(f.target instanceof Element){let p=f.target.closest("a");if(p&&!p.target){let l=new URL(p.href);if(l.search="",l.hash="",l.pathname!==location.pathname&&u.includes(l.toString()))return f.preventDefault(),$({url:new URL(p.href)})}}return xe}))),oe()),a=v(window,"popstate").pipe(M(u=>u.state!==null),m(u=>({url:new URL(location.href),offset:u.state})),oe());R(i,a).pipe(K((u,f)=>u.url.href===f.url.href),m(({url:u})=>u)).subscribe(t);let s=t.pipe(J("pathname"),S(u=>lr(u.href).pipe(ae(()=>(fr(u),xe)))),oe());i.pipe(ft(s)).subscribe(({url:u})=>{history.pushState({},"",`${u}`)});let c=new DOMParser;s.pipe(S(u=>u.text()),m(u=>c.parseFromString(u,"text/html"))).subscribe(e),e.pipe(Le(1)).subscribe(u=>{for(let f of["title","link[rel=canonical]","meta[name=author]","meta[name=description]","[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...ee("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let p=pe(f),l=pe(f,u);typeof p!="undefined"&&typeof l!="undefined"&&p.replaceWith(l)}}),e.pipe(Le(1),m(()=>we("container")),S(u=>B("script",u)),Ir(u=>{let f=A("script");if(u.src){for(let p of u.getAttributeNames())f.setAttribute(p,u.getAttribute(p));return u.replaceWith(f),new F(p=>{f.onload=()=>p.complete()})}else return f.textContent=u.textContent,u.replaceWith(f),C})).subscribe(),R(i,a).pipe(ft(e)).subscribe(({url:u,offset:f})=>{u.hash&&!f?Po(u.hash):window.scrollTo(0,(f==null?void 0:f.y)||0)}),r.pipe(Mt(i),Ze(250),J("offset")).subscribe(({offset:u})=>{history.replaceState(u,"")}),R(i,a).pipe(Me(2,1),M(([u,f])=>u.url.pathname===f.url.pathname),m(([,u])=>u)).subscribe(({offset:u})=>{window.scrollTo(0,(u==null?void 0:u.y)||0)})}var Ms=Ye(Zr());var wi=Ye(Zr());function en(e,t){let r=new RegExp(e.separator,"img"),n=(o,i,a)=>`${i}${a}`;return o=>{o=o.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator})(${o.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(t?(0,wi.default)(a):a).replace(i,n).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Ei(e){return e.split(/"([^"]+)"/g).map((t,r)=>r&1?t.replace(/^\b|^(?![^\x00-\x7F]|$)|\s+/g," +"):t).join("").replace(/"|(?:^|\s+)[*+\-:^~]+(?=\s+|$)/g,"").trim()}function bt(e){return e.type===1}function Oi(e){return e.type===2}function vt(e){return e.type===3}function As({config:e,docs:t}){e.lang.length===1&&e.lang[0]==="en"&&(e.lang=[te("search.config.lang")]),e.separator==="[\\s\\-]+"&&(e.separator=te("search.config.separator"));let n={pipeline:te("search.config.pipeline").split(/\s*,\s*/).filter(Boolean),suggestions:ee("search.suggest")};return{config:e,docs:t,options:n}}function _i(e,t){let r=he(),n=new Worker(e),o=new w,i=zo(n,{tx$:o}).pipe(m(a=>{if(vt(a))for(let s of a.data.items)for(let c of s)c.location=`${new URL(c.location,r.base)}`;return a}),oe());return fe(t).pipe(m(a=>({type:0,data:As(a)}))).subscribe(o.next.bind(o)),{tx$:o,rx$:i}}function Ti({document$:e}){let t=he(),r=ke(new URL("../versions.json",t.base)).pipe(ae(()=>C)),n=r.pipe(m(o=>{let[,i]=t.base.match(/([^/]+)\/?$/);return o.find(({version:a,aliases:s})=>a===i||s.includes(i))||o[0]}));r.pipe(m(o=>new Map(o.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),S(o=>v(document.body,"click").pipe(M(i=>!i.metaKey&&!i.ctrlKey),ge(n),S(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&o.has(s.href)){let c=s.href;return!i.target.closest(".md-version")&&o.get(c)===a?C:(i.preventDefault(),$(c))}}return C}),S(i=>{let{version:a}=o.get(i);return dr(new URL(i)).pipe(m(s=>{let u=Se().href.replace(t.base,"");return s.includes(u)?new URL(`../${a}/${u}`,t.base):new URL(i)}))})))).subscribe(o=>fr(o)),Y([r,n]).subscribe(([o,i])=>{z(".md-header__topic").appendChild(Xo(o,i))}),e.pipe(S(()=>n)).subscribe(o=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){let s=((a=t.version)==null?void 0:a.default)||"latest";i=!o.aliases.includes(s),__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ne("outdated"))s.hidden=!1})}function Cs(e,{rx$:t}){let r=(__search==null?void 0:__search.transform)||Ei,{searchParams:n}=Se();n.has("q")&&qe("search",!0);let o=t.pipe(M(bt),se(1),m(()=>n.get("q")||""));dt("search").pipe(M(s=>!s),se(1)).subscribe(()=>{let s=new URL(location.href);s.searchParams.delete("q"),history.replaceState({},"",`${s}`)}),o.subscribe(s=>{s&&(e.value=s,e.focus())});let i=nr(e),a=R(v(e,"keyup"),v(e,"focus").pipe(Fe(1)),o).pipe(m(()=>r(e.value)),q(""),K());return Y([a,i]).pipe(m(([s,c])=>({value:s,focus:c})),X(1))}function Mi(e,{tx$:t,rx$:r}){let n=new w,o=n.pipe(ce(1));return n.pipe(J("value"),m(({value:i})=>({type:2,data:i}))).subscribe(t.next.bind(t)),n.pipe(J("focus")).subscribe(({focus:i})=>{i?(qe("search",i),e.placeholder=""):e.placeholder=te("search.placeholder")}),v(e.form,"reset").pipe(Z(o)).subscribe(()=>e.focus()),Cs(e,{tx$:t,rx$:r}).pipe(x(i=>n.next(i)),L(()=>n.complete()),m(i=>H({ref:e},i)),oe())}function Li(e,{rx$:t},{query$:r}){let n=new w,o=Mo(e.parentElement).pipe(M(Boolean)),i=z(":scope > :first-child",e),a=z(":scope > :last-child",e),s=t.pipe(M(bt),se(1));return n.pipe(ge(r),Mt(s)).subscribe(([{items:u},{value:f}])=>{if(f)switch(u.length){case 0:i.textContent=te("search.result.none");break;case 1:i.textContent=te("search.result.one");break;default:i.textContent=te("search.result.other",pr(u.length))}else i.textContent=te("search.result.placeholder")}),n.pipe(x(()=>a.innerHTML=""),S(({items:u})=>R($(...u.slice(0,10)),$(...u.slice(10)).pipe(Me(4),Nr(o),S(([f])=>f))))).subscribe(u=>a.appendChild(Bo(u))),t.pipe(M(vt),m(({data:u})=>u)).pipe(x(u=>n.next(u)),L(()=>n.complete()),m(u=>H({ref:e},u)))}function Rs(e,{query$:t}){return t.pipe(m(({value:r})=>{let n=Se();return n.hash="",n.searchParams.delete("h"),n.searchParams.set("q",r),{url:n}}))}function Ai(e,t){let r=new w;return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),v(e,"click").subscribe(n=>n.preventDefault()),Rs(e,t).pipe(x(n=>r.next(n)),L(()=>r.complete()),m(n=>H({ref:e},n)))}function Ci(e,{rx$:t},{keyboard$:r}){let n=new w,o=we("search-query"),i=R(v(o,"keydown"),v(o,"focus")).pipe(Ie(ue),m(()=>o.value),K());return n.pipe(Xe(i),m(([{suggestions:s},c])=>{let u=c.split(/([\s-]+)/);if((s==null?void 0:s.length)&&u[u.length-1]){let f=s[s.length-1];f.startsWith(u[u.length-1])&&(u[u.length-1]=f)}else u.length=0;return u})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(M(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&o.selectionStart===o.value.length&&(o.value=e.innerText);break}}),t.pipe(M(vt),m(({data:s})=>s)).pipe(x(s=>n.next(s)),L(()=>n.complete()),m(()=>({ref:e})))}function Ri(e,{index$:t,keyboard$:r}){let n=he();try{let o=(__search==null?void 0:__search.worker)||n.search,i=_i(o,t),a=we("search-query",e),s=we("search-result",e),{tx$:c,rx$:u}=i;c.pipe(M(Oi),ft(u.pipe(M(bt))),se(1)).subscribe(c.next.bind(c)),r.pipe(M(({mode:l})=>l==="search")).subscribe(l=>{let d=Ne();switch(l.type){case"Enter":if(d===a){let h=new Map;for(let b of B(":first-child [href]",s)){let U=b.firstElementChild;h.set(b,parseFloat(U.getAttribute("data-md-score")))}if(h.size){let[[b]]=[...h].sort(([,U],[,G])=>G-U);b.click()}l.claim()}break;case"Escape":case"Tab":qe("search",!1),a.blur();break;case"ArrowUp":case"ArrowDown":if(typeof d=="undefined")a.focus();else{let h=[a,...B(":not(details) > [href], summary, details[open] [href]",s)],b=Math.max(0,(Math.max(0,h.indexOf(d))+h.length+(l.type==="ArrowUp"?-1:1))%h.length);h[b].focus()}l.claim();break;default:a!==Ne()&&a.focus()}}),r.pipe(M(({mode:l})=>l==="global")).subscribe(l=>{switch(l.type){case"f":case"s":case"/":a.focus(),a.select(),l.claim();break}});let f=Mi(a,i),p=Li(s,i,{query$:f});return R(f,p).pipe(et(...ne("search-share",e).map(l=>Ai(l,{query$:f})),...ne("search-suggest",e).map(l=>Ci(l,i,{keyboard$:r}))))}catch(o){return e.hidden=!0,xe}}function ki(e,{index$:t,location$:r}){return Y([t,r.pipe(q(Se()),M(n=>!!n.searchParams.get("h")))]).pipe(m(([n,o])=>en(n.config,!0)(o.searchParams.get("h"))),m(n=>{var a;let o=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let c=s.textContent,u=n(c);u.length>c.length&&o.set(s,u)}for(let[s,c]of o){let{childNodes:u}=A("span",null,c);s.replaceWith(...Array.from(u))}return{ref:e,nodes:o}}))}function ks(e,{viewport$:t,main$:r}){let n=e.parentElement,o=n.offsetTop-n.parentElement.offsetTop;return Y([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(o,Math.max(0,s-i))-o,{height:a,locked:s>=i+o})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function tn(e,n){var o=n,{header$:t}=o,r=cn(o,["header$"]);let i=z(".md-sidebar__scrollwrap",e),{y:a}=ze(i);return P(()=>{let s=new w;return s.pipe($e(0,Te),ge(t)).subscribe({next([{height:c},{height:u}]){i.style.height=`${c-2*a}px`,e.style.top=`${u}px`},complete(){i.style.height="",e.style.top=""}}),ks(e,r).pipe(x(c=>s.next(c)),L(()=>s.complete()),m(c=>H({ref:e},c)))})}function Hi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return _t(ke(`${r}/releases/latest`).pipe(ae(()=>C),m(n=>({version:n.tag_name})),je({})),ke(r).pipe(ae(()=>C),m(n=>({stars:n.stargazers_count,forks:n.forks_count})),je({}))).pipe(m(([n,o])=>H(H({},n),o)))}else{let r=`https://api.github.com/users/${e}`;return ke(r).pipe(m(n=>({repositories:n.public_repos})),je({}))}}function Pi(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return ke(r).pipe(ae(()=>C),m(({star_count:n,forks_count:o})=>({stars:n,forks:o})),je({}))}function Ii(e){let[t]=e.match(/(git(?:hub|lab))/i)||[];switch(t.toLowerCase()){case"github":let[,r,n]=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);return Hi(r,n);case"gitlab":let[,o,i]=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i);return Pi(o,i);default:return C}}var Hs;function Ps(e){return Hs||(Hs=P(()=>{let t=__md_get("__source",sessionStorage);return t?$(t):Ii(e.href).pipe(x(r=>__md_set("__source",r,sessionStorage)))}).pipe(ae(()=>C),M(t=>Object.keys(t).length>0),m(t=>({facts:t})),X(1)))}function $i(e){let t=z(":scope > :last-child",e);return P(()=>{let r=new w;return r.subscribe(({facts:n})=>{t.appendChild(Go(n)),t.classList.add("md-source__repository--active")}),Ps(e).pipe(x(n=>r.next(n)),L(()=>r.complete()),m(n=>H({ref:e},n)))})}function Is(e,{viewport$:t,header$:r}){return de(document.body).pipe(S(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:n}})=>({hidden:n>=10})),J("hidden"))}function ji(e,t){return P(()=>{let r=new w;return r.subscribe({next({hidden:n}){e.hidden=n},complete(){e.hidden=!1}}),(ee("navigation.tabs.sticky")?$({hidden:!1}):Is(e,t)).pipe(x(n=>r.next(n)),L(()=>r.complete()),m(n=>H({ref:e},n)))})}function $s(e,{viewport$:t,header$:r}){let n=new Map,o=B("[href^=\\#]",e);for(let s of o){let c=decodeURIComponent(s.hash.substring(1)),u=pe(`[id="${c}"]`);typeof u!="undefined"&&n.set(s,u)}let i=r.pipe(J("height"),m(({height:s})=>{let c=we("main"),u=z(":scope > :first-child",c);return s+.8*(u.offsetTop-c.offsetTop)}),oe());return de(document.body).pipe(J("height"),S(s=>P(()=>{let c=[];return $([...n].reduce((u,[f,p])=>{for(;c.length&&n.get(c[c.length-1]).tagName>=p.tagName;)c.pop();let l=p.offsetTop;for(;!l&&p.parentElement;)p=p.parentElement,l=p.offsetTop;return u.set([...c=[...c,f]].reverse(),l)},new Map))}).pipe(m(c=>new Map([...c].sort(([,u],[,f])=>u-f))),Xe(i),S(([c,u])=>t.pipe(Fr(([f,p],{offset:{y:l},size:d})=>{let h=l+d.height>=Math.floor(s.height);for(;p.length;){let[,b]=p[0];if(b-u=l&&!h)p=[f.pop(),...p];else break}return[f,p]},[[],[...c]]),K((f,p)=>f[0]===p[0]&&f[1]===p[1])))))).pipe(m(([s,c])=>({prev:s.map(([u])=>u),next:c.map(([u])=>u)})),q({prev:[],next:[]}),Me(2,1),m(([s,c])=>s.prev.length{let o=new w,i=o.pipe(ce(1));return o.subscribe(({prev:a,next:s})=>{for(let[c]of s)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[u]]of a.entries())u.classList.add("md-nav__link--passed"),u.classList.toggle("md-nav__link--active",c===a.length-1)}),ee("navigation.tracking")&&t.pipe(Z(i),J("offset"),Ze(250),Le(1),Z(n.pipe(Le(1))),Tt({delay:250}),ge(o)).subscribe(([,{prev:a}])=>{let s=Se(),c=a[a.length-1];if(c&&c.length){let[u]=c,{hash:f}=new URL(u.href);s.hash!==f&&(s.hash=f,history.replaceState({},"",`${s}`))}else s.hash="",history.replaceState({},"",`${s}`)}),$s(e,{viewport$:t,header$:r}).pipe(x(a=>o.next(a)),L(()=>o.complete()),m(a=>H({ref:e},a)))})}function js(e,{viewport$:t,main$:r,target$:n}){let o=t.pipe(m(({offset:{y:a}})=>a),Me(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return Y([i,o]).pipe(m(([a,s])=>!(a&&s)),K(),Z(n.pipe(Le(1))),jr(!0),Tt({delay:250}),m(a=>({hidden:a})))}function Ui(e,{viewport$:t,header$:r,main$:n,target$:o}){let i=new w,a=i.pipe(ce(1));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(Z(a),J("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),js(e,{viewport$:t,main$:n,target$:o}).pipe(x(s=>i.next(s)),L(()=>i.complete()),m(s=>H({ref:e},s)))}function Di({document$:e,tablet$:t}){e.pipe(S(()=>B(".md-toggle--indeterminate, [data-md-state=indeterminate]")),x(r=>{r.indeterminate=!0,r.checked=!1}),ie(r=>v(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ge(t)).subscribe(([r,n])=>{r.classList.remove("md-toggle--indeterminate"),n&&(r.checked=!1)})}function Fs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Wi({document$:e}){e.pipe(S(()=>B("[data-md-scrollfix]")),x(t=>t.removeAttribute("data-md-scrollfix")),M(Fs),ie(t=>v(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Vi({viewport$:e,tablet$:t}){Y([dt("search"),t]).pipe(m(([r,n])=>r&&!n),S(r=>$(r).pipe(Fe(r?400:100))),ge(e)).subscribe(([r,{offset:{y:n}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${n}px`;else{let o=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",o&&window.scrollTo(0,o)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let n=e[r];typeof n!="object"?n=document.createTextNode(n):n.parentNode&&n.parentNode.removeChild(n),r?t.insertBefore(this.previousSibling,n):t.replaceChild(n,this)}}}));document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var tt=bo(),br=Co(),gt=Io(),rn=Ao(),Ee=No(),vr=qr("(min-width: 960px)"),zi=qr("(min-width: 1220px)"),qi=$o(),Qi=he(),Yi=document.forms.namedItem("search")?(__search==null?void 0:__search.index)||ke(new URL("search/search_index.json",Qi.base)):xe,nn=new w;yi({alert$:nn});ee("navigation.instant")&&xi({document$:tt,location$:br,viewport$:Ee});var Ni;((Ni=Qi.version)==null?void 0:Ni.provider)==="mike"&&Ti({document$:tt});R(br,gt).pipe(Fe(125)).subscribe(()=>{qe("drawer",!1),qe("search",!1)});rn.pipe(M(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=pe("[href][rel=prev]");typeof t!="undefined"&&t.click();break;case"n":case".":let r=pe("[href][rel=next]");typeof r!="undefined"&&r.click();break}});Di({document$:tt,tablet$:vr});Wi({document$:tt});Vi({viewport$:Ee,tablet$:vr});var Qe=di(we("header"),{viewport$:Ee}),hr=tt.pipe(m(()=>we("main")),S(e=>vi(e,{viewport$:Ee,header$:Qe})),X(1)),Us=R(...ne("consent").map(e=>Qo(e,{target$:gt})),...ne("dialog").map(e=>mi(e,{alert$:nn})),...ne("header").map(e=>hi(e,{viewport$:Ee,header$:Qe,main$:hr})),...ne("palette").map(e=>gi(e)),...ne("search").map(e=>Ri(e,{index$:Yi,keyboard$:rn})),...ne("source").map(e=>$i(e))),Ds=P(()=>R(...ne("announce").map(e=>qo(e)),...ne("content").map(e=>li(e,{target$:gt,print$:qi})),...ne("content").map(e=>ee("search.highlight")?ki(e,{index$:Yi,location$:br}):C),...ne("header-title").map(e=>bi(e,{viewport$:Ee,header$:Qe})),...ne("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Qr(zi,()=>tn(e,{viewport$:Ee,header$:Qe,main$:hr})):Qr(vr,()=>tn(e,{viewport$:Ee,header$:Qe,main$:hr}))),...ne("tabs").map(e=>ji(e,{viewport$:Ee,header$:Qe})),...ne("toc").map(e=>Fi(e,{viewport$:Ee,header$:Qe,target$:gt})),...ne("top").map(e=>Ui(e,{viewport$:Ee,header$:Qe,main$:hr,target$:gt})))),Ki=tt.pipe(S(()=>Ds),et(Us),X(1));Ki.subscribe();window.document$=tt;window.location$=br;window.target$=gt;window.keyboard$=rn;window.viewport$=Ee;window.tablet$=vr;window.screen$=zi;window.print$=qi;window.alert$=nn;window.component$=Ki;})(); +//# sourceMappingURL=bundle.9c69f0bc.min.js.map + diff --git a/assets/javascripts/bundle.9c69f0bc.min.js.map b/assets/javascripts/bundle.9c69f0bc.min.js.map new file mode 100644 index 00000000..27a08426 --- /dev/null +++ b/assets/javascripts/bundle.9c69f0bc.min.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/url-polyfill/url-polyfill.js", "node_modules/rxjs/node_modules/tslib/tslib.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "node_modules/array-flat-polyfill/index.mjs", "src/assets/javascripts/bundle.ts", "node_modules/unfetch/polyfill/index.js", "node_modules/rxjs/node_modules/tslib/modules/index.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/concatMap.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/sample.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/assets/javascripts/browser/document/index.ts", "src/assets/javascripts/browser/element/_/index.ts", "src/assets/javascripts/browser/element/focus/index.ts", "src/assets/javascripts/browser/element/offset/_/index.ts", "src/assets/javascripts/browser/element/offset/content/index.ts", "node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js", "src/assets/javascripts/browser/element/size/_/index.ts", "src/assets/javascripts/browser/element/size/content/index.ts", "src/assets/javascripts/browser/element/visibility/index.ts", "src/assets/javascripts/browser/toggle/index.ts", "src/assets/javascripts/browser/keyboard/index.ts", "src/assets/javascripts/browser/location/_/index.ts", "src/assets/javascripts/utilities/h/index.ts", "src/assets/javascripts/utilities/string/index.ts", "src/assets/javascripts/browser/location/hash/index.ts", "src/assets/javascripts/browser/media/index.ts", "src/assets/javascripts/browser/request/index.ts", "src/assets/javascripts/browser/script/index.ts", "src/assets/javascripts/browser/viewport/offset/index.ts", "src/assets/javascripts/browser/viewport/size/index.ts", "src/assets/javascripts/browser/viewport/_/index.ts", "src/assets/javascripts/browser/viewport/at/index.ts", "src/assets/javascripts/browser/worker/index.ts", "src/assets/javascripts/_/index.ts", "src/assets/javascripts/components/_/index.ts", "src/assets/javascripts/components/announce/index.ts", "src/assets/javascripts/components/consent/index.ts", "src/assets/javascripts/components/content/code/_/index.ts", "src/assets/javascripts/templates/annotation/index.tsx", "src/assets/javascripts/templates/clipboard/index.tsx", "src/assets/javascripts/templates/search/index.tsx", "src/assets/javascripts/templates/source/index.tsx", "src/assets/javascripts/templates/tabbed/index.tsx", "src/assets/javascripts/templates/table/index.tsx", "src/assets/javascripts/templates/version/index.tsx", "src/assets/javascripts/components/content/annotation/_/index.ts", "src/assets/javascripts/components/content/annotation/list/index.ts", "src/assets/javascripts/components/content/code/mermaid/index.ts", "src/assets/javascripts/components/content/details/index.ts", "src/assets/javascripts/components/content/table/index.ts", "src/assets/javascripts/components/content/tabs/index.ts", "src/assets/javascripts/components/content/_/index.ts", "src/assets/javascripts/components/dialog/index.ts", "src/assets/javascripts/components/header/_/index.ts", "src/assets/javascripts/components/header/title/index.ts", "src/assets/javascripts/components/main/index.ts", "src/assets/javascripts/components/palette/index.ts", "src/assets/javascripts/integrations/clipboard/index.ts", "src/assets/javascripts/integrations/sitemap/index.ts", "src/assets/javascripts/integrations/instant/index.ts", "src/assets/javascripts/integrations/search/document/index.ts", "src/assets/javascripts/integrations/search/highlighter/index.ts", "src/assets/javascripts/integrations/search/query/transform/index.ts", "src/assets/javascripts/integrations/search/worker/message/index.ts", "src/assets/javascripts/integrations/search/worker/_/index.ts", "src/assets/javascripts/integrations/version/index.ts", "src/assets/javascripts/components/search/query/index.ts", "src/assets/javascripts/components/search/result/index.ts", "src/assets/javascripts/components/search/share/index.ts", "src/assets/javascripts/components/search/suggest/index.ts", "src/assets/javascripts/components/search/_/index.ts", "src/assets/javascripts/components/search/highlight/index.ts", "src/assets/javascripts/components/sidebar/index.ts", "src/assets/javascripts/components/source/facts/github/index.ts", "src/assets/javascripts/components/source/facts/gitlab/index.ts", "src/assets/javascripts/components/source/facts/_/index.ts", "src/assets/javascripts/components/source/_/index.ts", "src/assets/javascripts/components/tabs/index.ts", "src/assets/javascripts/components/toc/index.ts", "src/assets/javascripts/components/top/index.ts", "src/assets/javascripts/patches/indeterminate/index.ts", "src/assets/javascripts/patches/scrollfix/index.ts", "src/assets/javascripts/patches/scrolllock/index.ts", "src/assets/javascripts/polyfills/index.ts"], + "sourceRoot": "../../../..", + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch (error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if (iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(String(value).replace(/\\+/g, ' '));\r\n };\r\n\r\n var polyfillURLSearchParams = function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { writable: true, value: {} });\r\n var typeofSearchString = typeof searchString;\r\n\r\n if (typeofSearchString === 'undefined') {\r\n // do nothing\r\n } else if (typeofSearchString === 'string') {\r\n if (searchString !== '') {\r\n this._fromString(searchString);\r\n }\r\n } else if (searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(name, value);\r\n });\r\n } else if ((searchString !== null) && (typeofSearchString === 'object')) {\r\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\r\n for (var i = 0; i < searchString.length; i++) {\r\n var entry = searchString[i];\r\n if ((Object.prototype.toString.call(entry) === '[object Array]') || (entry.length !== 2)) {\r\n this.append(entry[0], entry[1]);\r\n } else {\r\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\r\n }\r\n }\r\n } else {\r\n for (var key in searchString) {\r\n if (searchString.hasOwnProperty(key)) {\r\n this.append(key, searchString[key]);\r\n }\r\n }\r\n }\r\n } else {\r\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if (name in this._entries) {\r\n this._entries[name].push(String(value));\r\n } else {\r\n this._entries[name] = [String(value)];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [String(value)];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for (var name in this._entries) {\r\n if (this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for (var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push(name);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) {\r\n items.push(value);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n if (iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join('&');\r\n };\r\n\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n var checkIfURLSearchParamsSupported = function() {\r\n try {\r\n var URLSearchParams = global.URLSearchParams;\r\n\r\n return (\r\n (new URLSearchParams('?a=1').toString() === 'a=1') &&\r\n (typeof URLSearchParams.prototype.set === 'function') &&\r\n (typeof URLSearchParams.prototype.entries === 'function')\r\n );\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n if (!checkIfURLSearchParamsSupported()) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n var proto = global.URLSearchParams.prototype;\r\n\r\n if (typeof proto.sort !== 'function') {\r\n proto.sort = function() {\r\n var _this = this;\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n if (!_this._entries) {\r\n _this.delete(name);\r\n }\r\n });\r\n items.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return -1;\r\n } else if (a[0] > b[0]) {\r\n return +1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n if (_this._entries) { // force reset because IE keeps keys index\r\n _this._entries = {};\r\n }\r\n for (var i = 0; i < items.length; i++) {\r\n this.append(items[i][0], items[i][1]);\r\n }\r\n };\r\n }\r\n\r\n if (typeof proto._fromString !== 'function') {\r\n Object.defineProperty(proto, '_fromString', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function(searchString) {\r\n if (this._entries) {\r\n this._entries = {};\r\n } else {\r\n var keys = [];\r\n this.forEach(function(value, name) {\r\n keys.push(name);\r\n });\r\n for (var i = 0; i < keys.length; i++) {\r\n this.delete(keys[i]);\r\n }\r\n }\r\n\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for (var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n });\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new global.URL('b', 'http://a');\r\n u.pathname = 'c d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if (typeof url !== 'string') url = String(url);\r\n if (base && typeof base !== 'string') base = String(base);\r\n\r\n // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if (base && (global.location === void 0 || base !== global.location.href)) {\r\n base = base.toLowerCase();\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) {\r\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\r\n\r\n var inputElement = doc.createElement('input');\r\n inputElement.type = 'url';\r\n inputElement.value = url;\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || (!inputElement.checkValidity() && !base)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n\r\n\r\n // create a linked searchParams which reflect its changes on URL\r\n var searchParams = new global.URLSearchParams(this.search);\r\n var enableSearchUpdate = true;\r\n var enableSearchParamsUpdate = true;\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n if (enableSearchUpdate) {\r\n enableSearchParamsUpdate = false;\r\n _this.search = searchParams.toString();\r\n enableSearchParamsUpdate = true;\r\n }\r\n };\r\n });\r\n\r\n Object.defineProperty(this, 'searchParams', {\r\n value: searchParams,\r\n enumerable: true\r\n });\r\n\r\n var search = void 0;\r\n Object.defineProperty(this, '_updateSearchParams', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function() {\r\n if (this.search !== search) {\r\n search = this.search;\r\n if (enableSearchParamsUpdate) {\r\n enableSearchUpdate = false;\r\n this.searchParams._fromString(this.search);\r\n enableSearchUpdate = true;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperty(proto, 'search', {\r\n get: function() {\r\n return this._anchorElement['search'];\r\n },\r\n set: function(value) {\r\n this._anchorElement['search'] = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href': {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/, '');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname': {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = { 'http:': 80, 'https:': 443, 'ftp:': 21 }[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== '';\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if (!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if ((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch (e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n});\r\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "Array.prototype.flat||Object.defineProperty(Array.prototype,\"flat\",{configurable:!0,value:function r(){var t=isNaN(arguments[0])?1:Number(arguments[0]);return t?Array.prototype.reduce.call(this,function(a,e){return Array.isArray(e)?a.push.apply(a,r.call(e,t-1)):a.push(e),a},[]):Array.prototype.slice.call(this)},writable:!0}),Array.prototype.flatMap||Object.defineProperty(Array.prototype,\"flatMap\",{configurable:!0,value:function(r){return Array.prototype.map.apply(this,arguments).flat()},writable:!0})\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"array-flat-polyfill\"\nimport \"focus-visible\"\nimport \"unfetch/polyfill\"\nimport \"url-polyfill\"\n\nimport {\n EMPTY,\n NEVER,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getOptionalElement,\n requestJSON,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantLoading,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget()\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? __search?.index || requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up instant loading, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantLoading({ document$, location$, viewport$ })\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"[href][rel=prev]\")\n if (typeof prev !== \"undefined\")\n prev.click()\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"[href][rel=next]\")\n if (typeof next !== \"undefined\")\n next.click()\n break\n }\n })\n\n/* Set up patches */\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, { viewport$, header$, target$ })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.component$ = component$ /* Component observable */\n", "self.fetch||(self.fetch=function(e,n){return n=n||{},new Promise(function(t,s){var r=new XMLHttpRequest,o=[],u=[],i={},a=function(){return{ok:2==(r.status/100|0),statusText:r.statusText,status:r.status,url:r.responseURL,text:function(){return Promise.resolve(r.responseText)},json:function(){return Promise.resolve(r.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([r.response]))},clone:a,headers:{keys:function(){return o},entries:function(){return u},get:function(e){return i[e.toLowerCase()]},has:function(e){return e.toLowerCase()in i}}}};for(var c in r.open(n.method||\"get\",e,!0),r.onload=function(){r.getAllResponseHeaders().replace(/^(.*?):[^\\S\\n]*([\\s\\S]*?)$/gm,function(e,n,t){o.push(n=n.toLowerCase()),u.push([n,t]),i[n]=i[n]?i[n]+\",\"+t:t}),t(a())},r.onerror=s,r.withCredentials=\"include\"==n.credentials,n.headers)r.setRequestHeader(c,n.headers[c]);r.send(n.body||null)})});\n", "import tslib from '../tslib.js';\r\nconst {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n} = tslib;\r\nexport {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n};\r\n", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n ReplaySubject,\n Subject,\n fromEvent\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch document\n *\n * Documents are implemented as subjects, so all downstream observables are\n * automatically updated when a new document is emitted.\n *\n * @returns Document subject\n */\nexport function watchDocument(): Subject {\n const document$ = new ReplaySubject(1)\n fromEvent(document, \"DOMContentLoaded\", { once: true })\n .subscribe(() => document$.next(document))\n\n /* Return document */\n return document$\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve all elements matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Elements\n */\nexport function getElements(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T][]\n\nexport function getElements(\n selector: string, node?: ParentNode\n): T[]\n\nexport function getElements(\n selector: string, node: ParentNode = document\n): T[] {\n return Array.from(node.querySelectorAll(selector))\n}\n\n/**\n * Retrieve an element matching a query selector or throw a reference error\n *\n * Note that this function assumes that the element is present. If unsure if an\n * element is existent, use the `getOptionalElement` function instead.\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Element\n */\nexport function getElement(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T]\n\nexport function getElement(\n selector: string, node?: ParentNode\n): T\n\nexport function getElement(\n selector: string, node: ParentNode = document\n): T {\n const el = getOptionalElement(selector, node)\n if (typeof el === \"undefined\")\n throw new ReferenceError(\n `Missing element: expected \"${selector}\" to be present`\n )\n\n /* Return element */\n return el\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Retrieve an optional element matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Element or nothing\n */\nexport function getOptionalElement(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T] | undefined\n\nexport function getOptionalElement(\n selector: string, node?: ParentNode\n): T | undefined\n\nexport function getOptionalElement(\n selector: string, node: ParentNode = document\n): T | undefined {\n return node.querySelector(selector) || undefined\n}\n\n/**\n * Retrieve the currently active element\n *\n * @returns Element or nothing\n */\nexport function getActiveElement(): HTMLElement | undefined {\n return document.activeElement instanceof HTMLElement\n ? document.activeElement || undefined\n : undefined\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n debounceTime,\n distinctUntilChanged,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\nimport { getActiveElement } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch element focus\n *\n * Previously, this function used `focus` and `blur` events to determine whether\n * an element is focused, but this doesn't work if there are focusable elements\n * within the elements itself. A better solutions are `focusin` and `focusout`\n * events, which bubble up the tree and allow for more fine-grained control.\n *\n * `debounceTime` is necessary, because when a focus change happens inside an\n * element, the observable would first emit `false` and then `true` again.\n *\n * @param el - Element\n *\n * @returns Element focus observable\n */\nexport function watchElementFocus(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(document.body, \"focusin\"),\n fromEvent(document.body, \"focusout\")\n )\n .pipe(\n debounceTime(1),\n map(() => {\n const active = getActiveElement()\n return typeof active !== \"undefined\"\n ? el.contains(active)\n : false\n }),\n startWith(el === getActiveElement()),\n distinctUntilChanged()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n animationFrameScheduler,\n auditTime,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Element offset\n */\nexport interface ElementOffset {\n x: number /* Horizontal offset */\n y: number /* Vertical offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element offset\n *\n * @param el - Element\n *\n * @returns Element offset\n */\nexport function getElementOffset(\n el: HTMLElement\n): ElementOffset {\n return {\n x: el.offsetLeft,\n y: el.offsetTop\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element offset\n *\n * @param el - Element\n *\n * @returns Element offset observable\n */\nexport function watchElementOffset(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(window, \"load\"),\n fromEvent(window, \"resize\")\n )\n .pipe(\n auditTime(0, animationFrameScheduler),\n map(() => getElementOffset(el)),\n startWith(getElementOffset(el))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n animationFrameScheduler,\n auditTime,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\nimport { ElementOffset } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element content offset (= scroll offset)\n *\n * @param el - Element\n *\n * @returns Element content offset\n */\nexport function getElementContentOffset(\n el: HTMLElement\n): ElementOffset {\n return {\n x: el.scrollLeft,\n y: el.scrollTop\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element content offset\n *\n * @param el - Element\n *\n * @returns Element content offset observable\n */\nexport function watchElementContentOffset(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(el, \"scroll\"),\n fromEvent(window, \"resize\")\n )\n .pipe(\n auditTime(0, animationFrameScheduler),\n map(() => getElementContentOffset(el)),\n startWith(getElementContentOffset(el))\n )\n}\n", "/**\r\n * A collection of shims that provide minimal functionality of the ES6 collections.\r\n *\r\n * These implementations are not meant to be used outside of the ResizeObserver\r\n * modules as they cover only a limited range of use cases.\r\n */\r\n/* eslint-disable require-jsdoc, valid-jsdoc */\r\nvar MapShim = (function () {\r\n if (typeof Map !== 'undefined') {\r\n return Map;\r\n }\r\n /**\r\n * Returns index in provided array that matches the specified key.\r\n *\r\n * @param {Array} arr\r\n * @param {*} key\r\n * @returns {number}\r\n */\r\n function getIndex(arr, key) {\r\n var result = -1;\r\n arr.some(function (entry, index) {\r\n if (entry[0] === key) {\r\n result = index;\r\n return true;\r\n }\r\n return false;\r\n });\r\n return result;\r\n }\r\n return /** @class */ (function () {\r\n function class_1() {\r\n this.__entries__ = [];\r\n }\r\n Object.defineProperty(class_1.prototype, \"size\", {\r\n /**\r\n * @returns {boolean}\r\n */\r\n get: function () {\r\n return this.__entries__.length;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @param {*} key\r\n * @returns {*}\r\n */\r\n class_1.prototype.get = function (key) {\r\n var index = getIndex(this.__entries__, key);\r\n var entry = this.__entries__[index];\r\n return entry && entry[1];\r\n };\r\n /**\r\n * @param {*} key\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\n class_1.prototype.set = function (key, value) {\r\n var index = getIndex(this.__entries__, key);\r\n if (~index) {\r\n this.__entries__[index][1] = value;\r\n }\r\n else {\r\n this.__entries__.push([key, value]);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.delete = function (key) {\r\n var entries = this.__entries__;\r\n var index = getIndex(entries, key);\r\n if (~index) {\r\n entries.splice(index, 1);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.has = function (key) {\r\n return !!~getIndex(this.__entries__, key);\r\n };\r\n /**\r\n * @returns {void}\r\n */\r\n class_1.prototype.clear = function () {\r\n this.__entries__.splice(0);\r\n };\r\n /**\r\n * @param {Function} callback\r\n * @param {*} [ctx=null]\r\n * @returns {void}\r\n */\r\n class_1.prototype.forEach = function (callback, ctx) {\r\n if (ctx === void 0) { ctx = null; }\r\n for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {\r\n var entry = _a[_i];\r\n callback.call(ctx, entry[1], entry[0]);\r\n }\r\n };\r\n return class_1;\r\n }());\r\n})();\n\n/**\r\n * Detects whether window and document objects are available in current environment.\r\n */\r\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;\n\n// Returns global object of a current environment.\r\nvar global$1 = (function () {\r\n if (typeof global !== 'undefined' && global.Math === Math) {\r\n return global;\r\n }\r\n if (typeof self !== 'undefined' && self.Math === Math) {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined' && window.Math === Math) {\r\n return window;\r\n }\r\n // eslint-disable-next-line no-new-func\r\n return Function('return this')();\r\n})();\n\n/**\r\n * A shim for the requestAnimationFrame which falls back to the setTimeout if\r\n * first one is not supported.\r\n *\r\n * @returns {number} Requests' identifier.\r\n */\r\nvar requestAnimationFrame$1 = (function () {\r\n if (typeof requestAnimationFrame === 'function') {\r\n // It's required to use a bounded function because IE sometimes throws\r\n // an \"Invalid calling object\" error if rAF is invoked without the global\r\n // object on the left hand side.\r\n return requestAnimationFrame.bind(global$1);\r\n }\r\n return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };\r\n})();\n\n// Defines minimum timeout before adding a trailing call.\r\nvar trailingTimeout = 2;\r\n/**\r\n * Creates a wrapper function which ensures that provided callback will be\r\n * invoked only once during the specified delay period.\r\n *\r\n * @param {Function} callback - Function to be invoked after the delay period.\r\n * @param {number} delay - Delay after which to invoke callback.\r\n * @returns {Function}\r\n */\r\nfunction throttle (callback, delay) {\r\n var leadingCall = false, trailingCall = false, lastCallTime = 0;\r\n /**\r\n * Invokes the original callback function and schedules new invocation if\r\n * the \"proxy\" was called during current request.\r\n *\r\n * @returns {void}\r\n */\r\n function resolvePending() {\r\n if (leadingCall) {\r\n leadingCall = false;\r\n callback();\r\n }\r\n if (trailingCall) {\r\n proxy();\r\n }\r\n }\r\n /**\r\n * Callback invoked after the specified delay. It will further postpone\r\n * invocation of the original function delegating it to the\r\n * requestAnimationFrame.\r\n *\r\n * @returns {void}\r\n */\r\n function timeoutCallback() {\r\n requestAnimationFrame$1(resolvePending);\r\n }\r\n /**\r\n * Schedules invocation of the original function.\r\n *\r\n * @returns {void}\r\n */\r\n function proxy() {\r\n var timeStamp = Date.now();\r\n if (leadingCall) {\r\n // Reject immediately following calls.\r\n if (timeStamp - lastCallTime < trailingTimeout) {\r\n return;\r\n }\r\n // Schedule new call to be in invoked when the pending one is resolved.\r\n // This is important for \"transitions\" which never actually start\r\n // immediately so there is a chance that we might miss one if change\r\n // happens amids the pending invocation.\r\n trailingCall = true;\r\n }\r\n else {\r\n leadingCall = true;\r\n trailingCall = false;\r\n setTimeout(timeoutCallback, delay);\r\n }\r\n lastCallTime = timeStamp;\r\n }\r\n return proxy;\r\n}\n\n// Minimum delay before invoking the update of observers.\r\nvar REFRESH_DELAY = 20;\r\n// A list of substrings of CSS properties used to find transition events that\r\n// might affect dimensions of observed elements.\r\nvar transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];\r\n// Check if MutationObserver is available.\r\nvar mutationObserverSupported = typeof MutationObserver !== 'undefined';\r\n/**\r\n * Singleton controller class which handles updates of ResizeObserver instances.\r\n */\r\nvar ResizeObserverController = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserverController.\r\n *\r\n * @private\r\n */\r\n function ResizeObserverController() {\r\n /**\r\n * Indicates whether DOM listeners have been added.\r\n *\r\n * @private {boolean}\r\n */\r\n this.connected_ = false;\r\n /**\r\n * Tells that controller has subscribed for Mutation Events.\r\n *\r\n * @private {boolean}\r\n */\r\n this.mutationEventsAdded_ = false;\r\n /**\r\n * Keeps reference to the instance of MutationObserver.\r\n *\r\n * @private {MutationObserver}\r\n */\r\n this.mutationsObserver_ = null;\r\n /**\r\n * A list of connected observers.\r\n *\r\n * @private {Array}\r\n */\r\n this.observers_ = [];\r\n this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);\r\n this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);\r\n }\r\n /**\r\n * Adds observer to observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be added.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.addObserver = function (observer) {\r\n if (!~this.observers_.indexOf(observer)) {\r\n this.observers_.push(observer);\r\n }\r\n // Add listeners if they haven't been added yet.\r\n if (!this.connected_) {\r\n this.connect_();\r\n }\r\n };\r\n /**\r\n * Removes observer from observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be removed.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.removeObserver = function (observer) {\r\n var observers = this.observers_;\r\n var index = observers.indexOf(observer);\r\n // Remove observer if it's present in registry.\r\n if (~index) {\r\n observers.splice(index, 1);\r\n }\r\n // Remove listeners if controller has no connected observers.\r\n if (!observers.length && this.connected_) {\r\n this.disconnect_();\r\n }\r\n };\r\n /**\r\n * Invokes the update of observers. It will continue running updates insofar\r\n * it detects changes.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.refresh = function () {\r\n var changesDetected = this.updateObservers_();\r\n // Continue running updates if changes have been detected as there might\r\n // be future ones caused by CSS transitions.\r\n if (changesDetected) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Updates every observer from observers list and notifies them of queued\r\n * entries.\r\n *\r\n * @private\r\n * @returns {boolean} Returns \"true\" if any observer has detected changes in\r\n * dimensions of it's elements.\r\n */\r\n ResizeObserverController.prototype.updateObservers_ = function () {\r\n // Collect observers that have active observations.\r\n var activeObservers = this.observers_.filter(function (observer) {\r\n return observer.gatherActive(), observer.hasActive();\r\n });\r\n // Deliver notifications in a separate cycle in order to avoid any\r\n // collisions between observers, e.g. when multiple instances of\r\n // ResizeObserver are tracking the same element and the callback of one\r\n // of them changes content dimensions of the observed target. Sometimes\r\n // this may result in notifications being blocked for the rest of observers.\r\n activeObservers.forEach(function (observer) { return observer.broadcastActive(); });\r\n return activeObservers.length > 0;\r\n };\r\n /**\r\n * Initializes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.connect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already added.\r\n if (!isBrowser || this.connected_) {\r\n return;\r\n }\r\n // Subscription to the \"Transitionend\" event is used as a workaround for\r\n // delayed transitions. This way it's possible to capture at least the\r\n // final state of an element.\r\n document.addEventListener('transitionend', this.onTransitionEnd_);\r\n window.addEventListener('resize', this.refresh);\r\n if (mutationObserverSupported) {\r\n this.mutationsObserver_ = new MutationObserver(this.refresh);\r\n this.mutationsObserver_.observe(document, {\r\n attributes: true,\r\n childList: true,\r\n characterData: true,\r\n subtree: true\r\n });\r\n }\r\n else {\r\n document.addEventListener('DOMSubtreeModified', this.refresh);\r\n this.mutationEventsAdded_ = true;\r\n }\r\n this.connected_ = true;\r\n };\r\n /**\r\n * Removes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.disconnect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already removed.\r\n if (!isBrowser || !this.connected_) {\r\n return;\r\n }\r\n document.removeEventListener('transitionend', this.onTransitionEnd_);\r\n window.removeEventListener('resize', this.refresh);\r\n if (this.mutationsObserver_) {\r\n this.mutationsObserver_.disconnect();\r\n }\r\n if (this.mutationEventsAdded_) {\r\n document.removeEventListener('DOMSubtreeModified', this.refresh);\r\n }\r\n this.mutationsObserver_ = null;\r\n this.mutationEventsAdded_ = false;\r\n this.connected_ = false;\r\n };\r\n /**\r\n * \"Transitionend\" event handler.\r\n *\r\n * @private\r\n * @param {TransitionEvent} event\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {\r\n var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b;\r\n // Detect whether transition may affect dimensions of an element.\r\n var isReflowProperty = transitionKeys.some(function (key) {\r\n return !!~propertyName.indexOf(key);\r\n });\r\n if (isReflowProperty) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Returns instance of the ResizeObserverController.\r\n *\r\n * @returns {ResizeObserverController}\r\n */\r\n ResizeObserverController.getInstance = function () {\r\n if (!this.instance_) {\r\n this.instance_ = new ResizeObserverController();\r\n }\r\n return this.instance_;\r\n };\r\n /**\r\n * Holds reference to the controller's instance.\r\n *\r\n * @private {ResizeObserverController}\r\n */\r\n ResizeObserverController.instance_ = null;\r\n return ResizeObserverController;\r\n}());\n\n/**\r\n * Defines non-writable/enumerable properties of the provided target object.\r\n *\r\n * @param {Object} target - Object for which to define properties.\r\n * @param {Object} props - Properties to be defined.\r\n * @returns {Object} Target object.\r\n */\r\nvar defineConfigurable = (function (target, props) {\r\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\r\n var key = _a[_i];\r\n Object.defineProperty(target, key, {\r\n value: props[key],\r\n enumerable: false,\r\n writable: false,\r\n configurable: true\r\n });\r\n }\r\n return target;\r\n});\n\n/**\r\n * Returns the global object associated with provided element.\r\n *\r\n * @param {Object} target\r\n * @returns {Object}\r\n */\r\nvar getWindowOf = (function (target) {\r\n // Assume that the element is an instance of Node, which means that it\r\n // has the \"ownerDocument\" property from which we can retrieve a\r\n // corresponding global object.\r\n var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;\r\n // Return the local global object if it's not possible extract one from\r\n // provided element.\r\n return ownerGlobal || global$1;\r\n});\n\n// Placeholder of an empty content rectangle.\r\nvar emptyRect = createRectInit(0, 0, 0, 0);\r\n/**\r\n * Converts provided string to a number.\r\n *\r\n * @param {number|string} value\r\n * @returns {number}\r\n */\r\nfunction toFloat(value) {\r\n return parseFloat(value) || 0;\r\n}\r\n/**\r\n * Extracts borders size from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @param {...string} positions - Borders positions (top, right, ...)\r\n * @returns {number}\r\n */\r\nfunction getBordersSize(styles) {\r\n var positions = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n positions[_i - 1] = arguments[_i];\r\n }\r\n return positions.reduce(function (size, position) {\r\n var value = styles['border-' + position + '-width'];\r\n return size + toFloat(value);\r\n }, 0);\r\n}\r\n/**\r\n * Extracts paddings sizes from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @returns {Object} Paddings box.\r\n */\r\nfunction getPaddings(styles) {\r\n var positions = ['top', 'right', 'bottom', 'left'];\r\n var paddings = {};\r\n for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {\r\n var position = positions_1[_i];\r\n var value = styles['padding-' + position];\r\n paddings[position] = toFloat(value);\r\n }\r\n return paddings;\r\n}\r\n/**\r\n * Calculates content rectangle of provided SVG element.\r\n *\r\n * @param {SVGGraphicsElement} target - Element content rectangle of which needs\r\n * to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getSVGContentRect(target) {\r\n var bbox = target.getBBox();\r\n return createRectInit(0, 0, bbox.width, bbox.height);\r\n}\r\n/**\r\n * Calculates content rectangle of provided HTMLElement.\r\n *\r\n * @param {HTMLElement} target - Element for which to calculate the content rectangle.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getHTMLElementContentRect(target) {\r\n // Client width & height properties can't be\r\n // used exclusively as they provide rounded values.\r\n var clientWidth = target.clientWidth, clientHeight = target.clientHeight;\r\n // By this condition we can catch all non-replaced inline, hidden and\r\n // detached elements. Though elements with width & height properties less\r\n // than 0.5 will be discarded as well.\r\n //\r\n // Without it we would need to implement separate methods for each of\r\n // those cases and it's not possible to perform a precise and performance\r\n // effective test for hidden elements. E.g. even jQuery's ':visible' filter\r\n // gives wrong results for elements with width & height less than 0.5.\r\n if (!clientWidth && !clientHeight) {\r\n return emptyRect;\r\n }\r\n var styles = getWindowOf(target).getComputedStyle(target);\r\n var paddings = getPaddings(styles);\r\n var horizPad = paddings.left + paddings.right;\r\n var vertPad = paddings.top + paddings.bottom;\r\n // Computed styles of width & height are being used because they are the\r\n // only dimensions available to JS that contain non-rounded values. It could\r\n // be possible to utilize the getBoundingClientRect if only it's data wasn't\r\n // affected by CSS transformations let alone paddings, borders and scroll bars.\r\n var width = toFloat(styles.width), height = toFloat(styles.height);\r\n // Width & height include paddings and borders when the 'border-box' box\r\n // model is applied (except for IE).\r\n if (styles.boxSizing === 'border-box') {\r\n // Following conditions are required to handle Internet Explorer which\r\n // doesn't include paddings and borders to computed CSS dimensions.\r\n //\r\n // We can say that if CSS dimensions + paddings are equal to the \"client\"\r\n // properties then it's either IE, and thus we don't need to subtract\r\n // anything, or an element merely doesn't have paddings/borders styles.\r\n if (Math.round(width + horizPad) !== clientWidth) {\r\n width -= getBordersSize(styles, 'left', 'right') + horizPad;\r\n }\r\n if (Math.round(height + vertPad) !== clientHeight) {\r\n height -= getBordersSize(styles, 'top', 'bottom') + vertPad;\r\n }\r\n }\r\n // Following steps can't be applied to the document's root element as its\r\n // client[Width/Height] properties represent viewport area of the window.\r\n // Besides, it's as well not necessary as the itself neither has\r\n // rendered scroll bars nor it can be clipped.\r\n if (!isDocumentElement(target)) {\r\n // In some browsers (only in Firefox, actually) CSS width & height\r\n // include scroll bars size which can be removed at this step as scroll\r\n // bars are the only difference between rounded dimensions + paddings\r\n // and \"client\" properties, though that is not always true in Chrome.\r\n var vertScrollbar = Math.round(width + horizPad) - clientWidth;\r\n var horizScrollbar = Math.round(height + vertPad) - clientHeight;\r\n // Chrome has a rather weird rounding of \"client\" properties.\r\n // E.g. for an element with content width of 314.2px it sometimes gives\r\n // the client width of 315px and for the width of 314.7px it may give\r\n // 314px. And it doesn't happen all the time. So just ignore this delta\r\n // as a non-relevant.\r\n if (Math.abs(vertScrollbar) !== 1) {\r\n width -= vertScrollbar;\r\n }\r\n if (Math.abs(horizScrollbar) !== 1) {\r\n height -= horizScrollbar;\r\n }\r\n }\r\n return createRectInit(paddings.left, paddings.top, width, height);\r\n}\r\n/**\r\n * Checks whether provided element is an instance of the SVGGraphicsElement.\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nvar isSVGGraphicsElement = (function () {\r\n // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement\r\n // interface.\r\n if (typeof SVGGraphicsElement !== 'undefined') {\r\n return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };\r\n }\r\n // If it's so, then check that element is at least an instance of the\r\n // SVGElement and that it has the \"getBBox\" method.\r\n // eslint-disable-next-line no-extra-parens\r\n return function (target) { return (target instanceof getWindowOf(target).SVGElement &&\r\n typeof target.getBBox === 'function'); };\r\n})();\r\n/**\r\n * Checks whether provided element is a document element ().\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nfunction isDocumentElement(target) {\r\n return target === getWindowOf(target).document.documentElement;\r\n}\r\n/**\r\n * Calculates an appropriate content rectangle for provided html or svg element.\r\n *\r\n * @param {Element} target - Element content rectangle of which needs to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getContentRect(target) {\r\n if (!isBrowser) {\r\n return emptyRect;\r\n }\r\n if (isSVGGraphicsElement(target)) {\r\n return getSVGContentRect(target);\r\n }\r\n return getHTMLElementContentRect(target);\r\n}\r\n/**\r\n * Creates rectangle with an interface of the DOMRectReadOnly.\r\n * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly\r\n *\r\n * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.\r\n * @returns {DOMRectReadOnly}\r\n */\r\nfunction createReadOnlyRect(_a) {\r\n var x = _a.x, y = _a.y, width = _a.width, height = _a.height;\r\n // If DOMRectReadOnly is available use it as a prototype for the rectangle.\r\n var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;\r\n var rect = Object.create(Constr.prototype);\r\n // Rectangle's properties are not writable and non-enumerable.\r\n defineConfigurable(rect, {\r\n x: x, y: y, width: width, height: height,\r\n top: y,\r\n right: x + width,\r\n bottom: height + y,\r\n left: x\r\n });\r\n return rect;\r\n}\r\n/**\r\n * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.\r\n * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit\r\n *\r\n * @param {number} x - X coordinate.\r\n * @param {number} y - Y coordinate.\r\n * @param {number} width - Rectangle's width.\r\n * @param {number} height - Rectangle's height.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction createRectInit(x, y, width, height) {\r\n return { x: x, y: y, width: width, height: height };\r\n}\n\n/**\r\n * Class that is responsible for computations of the content rectangle of\r\n * provided DOM element and for keeping track of it's changes.\r\n */\r\nvar ResizeObservation = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObservation.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n */\r\n function ResizeObservation(target) {\r\n /**\r\n * Broadcasted width of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastWidth = 0;\r\n /**\r\n * Broadcasted height of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastHeight = 0;\r\n /**\r\n * Reference to the last observed content rectangle.\r\n *\r\n * @private {DOMRectInit}\r\n */\r\n this.contentRect_ = createRectInit(0, 0, 0, 0);\r\n this.target = target;\r\n }\r\n /**\r\n * Updates content rectangle and tells whether it's width or height properties\r\n * have changed since the last broadcast.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObservation.prototype.isActive = function () {\r\n var rect = getContentRect(this.target);\r\n this.contentRect_ = rect;\r\n return (rect.width !== this.broadcastWidth ||\r\n rect.height !== this.broadcastHeight);\r\n };\r\n /**\r\n * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data\r\n * from the corresponding properties of the last observed content rectangle.\r\n *\r\n * @returns {DOMRectInit} Last observed content rectangle.\r\n */\r\n ResizeObservation.prototype.broadcastRect = function () {\r\n var rect = this.contentRect_;\r\n this.broadcastWidth = rect.width;\r\n this.broadcastHeight = rect.height;\r\n return rect;\r\n };\r\n return ResizeObservation;\r\n}());\n\nvar ResizeObserverEntry = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObserverEntry.\r\n *\r\n * @param {Element} target - Element that is being observed.\r\n * @param {DOMRectInit} rectInit - Data of the element's content rectangle.\r\n */\r\n function ResizeObserverEntry(target, rectInit) {\r\n var contentRect = createReadOnlyRect(rectInit);\r\n // According to the specification following properties are not writable\r\n // and are also not enumerable in the native implementation.\r\n //\r\n // Property accessors are not being used as they'd require to define a\r\n // private WeakMap storage which may cause memory leaks in browsers that\r\n // don't support this type of collections.\r\n defineConfigurable(this, { target: target, contentRect: contentRect });\r\n }\r\n return ResizeObserverEntry;\r\n}());\n\nvar ResizeObserverSPI = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback function that is invoked\r\n * when one of the observed elements changes it's content dimensions.\r\n * @param {ResizeObserverController} controller - Controller instance which\r\n * is responsible for the updates of observer.\r\n * @param {ResizeObserver} callbackCtx - Reference to the public\r\n * ResizeObserver instance which will be passed to callback function.\r\n */\r\n function ResizeObserverSPI(callback, controller, callbackCtx) {\r\n /**\r\n * Collection of resize observations that have detected changes in dimensions\r\n * of elements.\r\n *\r\n * @private {Array}\r\n */\r\n this.activeObservations_ = [];\r\n /**\r\n * Registry of the ResizeObservation instances.\r\n *\r\n * @private {Map}\r\n */\r\n this.observations_ = new MapShim();\r\n if (typeof callback !== 'function') {\r\n throw new TypeError('The callback provided as parameter 1 is not a function.');\r\n }\r\n this.callback_ = callback;\r\n this.controller_ = controller;\r\n this.callbackCtx_ = callbackCtx;\r\n }\r\n /**\r\n * Starts observing provided element.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.observe = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is already being observed.\r\n if (observations.has(target)) {\r\n return;\r\n }\r\n observations.set(target, new ResizeObservation(target));\r\n this.controller_.addObserver(this);\r\n // Force the update of observations.\r\n this.controller_.refresh();\r\n };\r\n /**\r\n * Stops observing provided element.\r\n *\r\n * @param {Element} target - Element to stop observing.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.unobserve = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is not being observed.\r\n if (!observations.has(target)) {\r\n return;\r\n }\r\n observations.delete(target);\r\n if (!observations.size) {\r\n this.controller_.removeObserver(this);\r\n }\r\n };\r\n /**\r\n * Stops observing all elements.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.disconnect = function () {\r\n this.clearActive();\r\n this.observations_.clear();\r\n this.controller_.removeObserver(this);\r\n };\r\n /**\r\n * Collects observation instances the associated element of which has changed\r\n * it's content rectangle.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.gatherActive = function () {\r\n var _this = this;\r\n this.clearActive();\r\n this.observations_.forEach(function (observation) {\r\n if (observation.isActive()) {\r\n _this.activeObservations_.push(observation);\r\n }\r\n });\r\n };\r\n /**\r\n * Invokes initial callback function with a list of ResizeObserverEntry\r\n * instances collected from active resize observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.broadcastActive = function () {\r\n // Do nothing if observer doesn't have active observations.\r\n if (!this.hasActive()) {\r\n return;\r\n }\r\n var ctx = this.callbackCtx_;\r\n // Create ResizeObserverEntry instance for every active observation.\r\n var entries = this.activeObservations_.map(function (observation) {\r\n return new ResizeObserverEntry(observation.target, observation.broadcastRect());\r\n });\r\n this.callback_.call(ctx, entries, ctx);\r\n this.clearActive();\r\n };\r\n /**\r\n * Clears the collection of active observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.clearActive = function () {\r\n this.activeObservations_.splice(0);\r\n };\r\n /**\r\n * Tells whether observer has active observations.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObserverSPI.prototype.hasActive = function () {\r\n return this.activeObservations_.length > 0;\r\n };\r\n return ResizeObserverSPI;\r\n}());\n\n// Registry of internal observers. If WeakMap is not available use current shim\r\n// for the Map collection as it has all required methods and because WeakMap\r\n// can't be fully polyfilled anyway.\r\nvar observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();\r\n/**\r\n * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation\r\n * exposing only those methods and properties that are defined in the spec.\r\n */\r\nvar ResizeObserver = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback that is invoked when\r\n * dimensions of the observed elements change.\r\n */\r\n function ResizeObserver(callback) {\r\n if (!(this instanceof ResizeObserver)) {\r\n throw new TypeError('Cannot call a class as a function.');\r\n }\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n var controller = ResizeObserverController.getInstance();\r\n var observer = new ResizeObserverSPI(callback, controller, this);\r\n observers.set(this, observer);\r\n }\r\n return ResizeObserver;\r\n}());\r\n// Expose public methods of ResizeObserver.\r\n[\r\n 'observe',\r\n 'unobserve',\r\n 'disconnect'\r\n].forEach(function (method) {\r\n ResizeObserver.prototype[method] = function () {\r\n var _a;\r\n return (_a = observers.get(this))[method].apply(_a, arguments);\r\n };\r\n});\n\nvar index = (function () {\r\n // Export existing implementation if available.\r\n if (typeof global$1.ResizeObserver !== 'undefined') {\r\n return global$1.ResizeObserver;\r\n }\r\n return ResizeObserver;\r\n})();\n\nexport default index;\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport ResizeObserver from \"resize-observer-polyfill\"\nimport {\n NEVER,\n Observable,\n Subject,\n defer,\n filter,\n finalize,\n map,\n merge,\n of,\n shareReplay,\n startWith,\n switchMap,\n tap\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Element offset\n */\nexport interface ElementSize {\n width: number /* Element width */\n height: number /* Element height */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Resize observer entry subject\n */\nconst entry$ = new Subject()\n\n/**\n * Resize observer observable\n *\n * This observable will create a `ResizeObserver` on the first subscription\n * and will automatically terminate it when there are no more subscribers.\n * It's quite important to centralize observation in a single `ResizeObserver`,\n * as the performance difference can be quite dramatic, as the link shows.\n *\n * @see https://bit.ly/3iIYfEm - Google Groups on performance\n */\nconst observer$ = defer(() => of(\n new ResizeObserver(entries => {\n for (const entry of entries)\n entry$.next(entry)\n })\n))\n .pipe(\n switchMap(observer => merge(NEVER, of(observer))\n .pipe(\n finalize(() => observer.disconnect())\n )\n ),\n shareReplay(1)\n )\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element size\n *\n * @param el - Element\n *\n * @returns Element size\n */\nexport function getElementSize(\n el: HTMLElement\n): ElementSize {\n return {\n width: el.offsetWidth,\n height: el.offsetHeight\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element size\n *\n * This function returns an observable that subscribes to a single internal\n * instance of `ResizeObserver` upon subscription, and emit resize events until\n * termination. Note that this function should not be called with the same\n * element twice, as the first unsubscription will terminate observation.\n *\n * Sadly, we can't use the `DOMRect` objects returned by the observer, because\n * we need the emitted values to be consistent with `getElementSize`, which will\n * return the used values (rounded) and not actual values (unrounded). Thus, we\n * use the `offset*` properties. See the linked GitHub issue.\n *\n * @see https://bit.ly/3m0k3he - GitHub issue\n *\n * @param el - Element\n *\n * @returns Element size observable\n */\nexport function watchElementSize(\n el: HTMLElement\n): Observable {\n return observer$\n .pipe(\n tap(observer => observer.observe(el)),\n switchMap(observer => entry$\n .pipe(\n filter(({ target }) => target === el),\n finalize(() => observer.unobserve(el)),\n map(() => getElementSize(el))\n )\n ),\n startWith(getElementSize(el))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ElementSize } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element content size (= scroll width and height)\n *\n * @param el - Element\n *\n * @returns Element content size\n */\nexport function getElementContentSize(\n el: HTMLElement\n): ElementSize {\n return {\n width: el.scrollWidth,\n height: el.scrollHeight\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n NEVER,\n Observable,\n Subject,\n defer,\n distinctUntilChanged,\n filter,\n finalize,\n map,\n merge,\n of,\n shareReplay,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport {\n getElementContentSize,\n getElementSize,\n watchElementContentOffset\n} from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Intersection observer entry subject\n */\nconst entry$ = new Subject()\n\n/**\n * Intersection observer observable\n *\n * This observable will create an `IntersectionObserver` on first subscription\n * and will automatically terminate it when there are no more subscribers.\n *\n * @see https://bit.ly/3iIYfEm - Google Groups on performance\n */\nconst observer$ = defer(() => of(\n new IntersectionObserver(entries => {\n for (const entry of entries)\n entry$.next(entry)\n }, {\n threshold: 0\n })\n))\n .pipe(\n switchMap(observer => merge(NEVER, of(observer))\n .pipe(\n finalize(() => observer.disconnect())\n )\n ),\n shareReplay(1)\n )\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch element visibility\n *\n * @param el - Element\n *\n * @returns Element visibility observable\n */\nexport function watchElementVisibility(\n el: HTMLElement\n): Observable {\n return observer$\n .pipe(\n tap(observer => observer.observe(el)),\n switchMap(observer => entry$\n .pipe(\n filter(({ target }) => target === el),\n finalize(() => observer.unobserve(el)),\n map(({ isIntersecting }) => isIntersecting)\n )\n )\n )\n}\n\n/**\n * Watch element boundary\n *\n * This function returns an observable which emits whether the bottom content\n * boundary (= scroll offset) of an element is within a certain threshold.\n *\n * @param el - Element\n * @param threshold - Threshold\n *\n * @returns Element boundary observable\n */\nexport function watchElementBoundary(\n el: HTMLElement, threshold = 16\n): Observable {\n return watchElementContentOffset(el)\n .pipe(\n map(({ y }) => {\n const visible = getElementSize(el)\n const content = getElementContentSize(el)\n return y >= (\n content.height - visible.height - threshold\n )\n }),\n distinctUntilChanged()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n startWith\n} from \"rxjs\"\n\nimport { getElement } from \"../element\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle\n */\nexport type Toggle =\n | \"drawer\" /* Toggle for drawer */\n | \"search\" /* Toggle for search */\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle map\n */\nconst toggles: Record = {\n drawer: getElement(\"[data-md-toggle=drawer]\"),\n search: getElement(\"[data-md-toggle=search]\")\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve the value of a toggle\n *\n * @param name - Toggle\n *\n * @returns Toggle value\n */\nexport function getToggle(name: Toggle): boolean {\n return toggles[name].checked\n}\n\n/**\n * Set toggle\n *\n * Simulating a click event seems to be the most cross-browser compatible way\n * of changing the value while also emitting a `change` event. Before, Material\n * used `CustomEvent` to programmatically change the value of a toggle, but this\n * is a much simpler and cleaner solution which doesn't require a polyfill.\n *\n * @param name - Toggle\n * @param value - Toggle value\n */\nexport function setToggle(name: Toggle, value: boolean): void {\n if (toggles[name].checked !== value)\n toggles[name].click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch toggle\n *\n * @param name - Toggle\n *\n * @returns Toggle value observable\n */\nexport function watchToggle(name: Toggle): Observable {\n const el = toggles[name]\n return fromEvent(el, \"change\")\n .pipe(\n map(() => el.checked),\n startWith(el.checked)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n filter,\n fromEvent,\n map,\n share\n} from \"rxjs\"\n\nimport { getActiveElement } from \"../element\"\nimport { getToggle } from \"../toggle\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Keyboard mode\n */\nexport type KeyboardMode =\n | \"global\" /* Global */\n | \"search\" /* Search is open */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Keyboard\n */\nexport interface Keyboard {\n mode: KeyboardMode /* Keyboard mode */\n type: string /* Key type */\n claim(): void /* Key claim */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Check whether an element may receive keyboard input\n *\n * @param el - Element\n * @param type - Key type\n *\n * @returns Test result\n */\nfunction isSusceptibleToKeyboard(\n el: HTMLElement, type: string\n): boolean {\n switch (el.constructor) {\n\n /* Input elements */\n case HTMLInputElement:\n /* @ts-expect-error - omit unnecessary type cast */\n if (el.type === \"radio\")\n return /^Arrow/.test(type)\n else\n return true\n\n /* Select element and textarea */\n case HTMLSelectElement:\n case HTMLTextAreaElement:\n return true\n\n /* Everything else */\n default:\n return el.isContentEditable\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch keyboard\n *\n * @returns Keyboard observable\n */\nexport function watchKeyboard(): Observable {\n return fromEvent(window, \"keydown\")\n .pipe(\n filter(ev => !(ev.metaKey || ev.ctrlKey)),\n map(ev => ({\n mode: getToggle(\"search\") ? \"search\" : \"global\",\n type: ev.key,\n claim() {\n ev.preventDefault()\n ev.stopPropagation()\n }\n } as Keyboard)),\n filter(({ mode, type }) => {\n if (mode === \"global\") {\n const active = getActiveElement()\n if (typeof active !== \"undefined\")\n return !isSusceptibleToKeyboard(active, type)\n }\n return true\n }),\n share()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Subject } from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location\n *\n * This function returns a `URL` object (and not `Location`) to normalize the\n * typings across the application. Furthermore, locations need to be tracked\n * without setting them and `Location` is a singleton which represents the\n * current location.\n *\n * @returns URL\n */\nexport function getLocation(): URL {\n return new URL(location.href)\n}\n\n/**\n * Set location\n *\n * @param url - URL to change to\n */\nexport function setLocation(url: URL): void {\n location.href = url.href\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location\n *\n * @returns Location subject\n */\nexport function watchLocation(): Subject {\n return new Subject()\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { JSX as JSXInternal } from \"preact\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * HTML attributes\n */\ntype Attributes =\n & JSXInternal.HTMLAttributes\n & JSXInternal.SVGAttributes\n & Record\n\n/**\n * Child element\n */\ntype Child =\n | HTMLElement\n | Text\n | string\n | number\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Append a child node to an element\n *\n * @param el - Element\n * @param child - Child node(s)\n */\nfunction appendChild(el: HTMLElement, child: Child | Child[]): void {\n\n /* Handle primitive types (including raw HTML) */\n if (typeof child === \"string\" || typeof child === \"number\") {\n el.innerHTML += child.toString()\n\n /* Handle nodes */\n } else if (child instanceof Node) {\n el.appendChild(child)\n\n /* Handle nested children */\n } else if (Array.isArray(child)) {\n for (const node of child)\n appendChild(el, node)\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * JSX factory\n *\n * @template T - Element type\n *\n * @param tag - HTML tag\n * @param attributes - HTML attributes\n * @param children - Child elements\n *\n * @returns Element\n */\nexport function h(\n tag: T, attributes?: Attributes | null, ...children: Child[]\n): HTMLElementTagNameMap[T]\n\nexport function h(\n tag: string, attributes?: Attributes | null, ...children: Child[]\n): T\n\nexport function h(\n tag: string, attributes?: Attributes | null, ...children: Child[]\n): T {\n const el = document.createElement(tag)\n\n /* Set attributes, if any */\n if (attributes)\n for (const attr of Object.keys(attributes)) {\n if (typeof attributes[attr] === \"undefined\")\n continue\n\n /* Set default attribute or boolean */\n if (typeof attributes[attr] !== \"boolean\")\n el.setAttribute(attr, attributes[attr])\n else\n el.setAttribute(attr, \"\")\n }\n\n /* Append child nodes */\n for (const child of children)\n appendChild(el, child)\n\n /* Return element */\n return el as T\n}\n\n/* ----------------------------------------------------------------------------\n * Namespace\n * ------------------------------------------------------------------------- */\n\nexport declare namespace h {\n namespace JSX {\n type Element = HTMLElement\n type IntrinsicElements = JSXInternal.IntrinsicElements\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Truncate a string after the given number of characters\n *\n * This is not a very reasonable approach, since the summaries kind of suck.\n * It would be better to create something more intelligent, highlighting the\n * search occurrences and making a better summary out of it, but this note was\n * written three years ago, so who knows if we'll ever fix it.\n *\n * @param value - Value to be truncated\n * @param n - Number of characters\n *\n * @returns Truncated value\n */\nexport function truncate(value: string, n: number): string {\n let i = n\n if (value.length > i) {\n while (value[i] !== \" \" && --i > 0) { /* keep eating */ }\n return `${value.substring(0, i)}...`\n }\n return value\n}\n\n/**\n * Round a number for display with repository facts\n *\n * This is a reverse-engineered version of GitHub's weird rounding algorithm\n * for stars, forks and all other numbers. While all numbers below `1,000` are\n * returned as-is, bigger numbers are converted to fixed numbers:\n *\n * - `1,049` => `1k`\n * - `1,050` => `1.1k`\n * - `1,949` => `1.9k`\n * - `1,950` => `2k`\n *\n * @param value - Original value\n *\n * @returns Rounded value\n */\nexport function round(value: number): string {\n if (value > 999) {\n const digits = +((value - 950) % 1000 > 99)\n return `${((value + 0.000001) / 1000).toFixed(digits)}k`\n } else {\n return value.toString()\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n filter,\n fromEvent,\n map,\n shareReplay,\n startWith\n} from \"rxjs\"\n\nimport { getOptionalElement } from \"~/browser\"\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location hash\n *\n * @returns Location hash\n */\nexport function getLocationHash(): string {\n return location.hash.substring(1)\n}\n\n/**\n * Set location hash\n *\n * Setting a new fragment identifier via `location.hash` will have no effect\n * if the value doesn't change. When a new fragment identifier is set, we want\n * the browser to target the respective element at all times, which is why we\n * use this dirty little trick.\n *\n * @param hash - Location hash\n */\nexport function setLocationHash(hash: string): void {\n const el = h(\"a\", { href: hash })\n el.addEventListener(\"click\", ev => ev.stopPropagation())\n el.click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location hash\n *\n * @returns Location hash observable\n */\nexport function watchLocationHash(): Observable {\n return fromEvent(window, \"hashchange\")\n .pipe(\n map(getLocationHash),\n startWith(getLocationHash()),\n filter(hash => hash.length > 0),\n shareReplay(1)\n )\n}\n\n/**\n * Watch location target\n *\n * @returns Location target observable\n */\nexport function watchLocationTarget(): Observable {\n return watchLocationHash()\n .pipe(\n map(id => getOptionalElement(`[id=\"${id}\"]`)!),\n filter(el => typeof el !== \"undefined\")\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n fromEvent,\n fromEventPattern,\n map,\n merge,\n startWith,\n switchMap\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch media query\n *\n * Note that although `MediaQueryList.addListener` is deprecated we have to\n * use it, because it's the only way to ensure proper downward compatibility.\n *\n * @see https://bit.ly/3dUBH2m - GitHub issue\n *\n * @param query - Media query\n *\n * @returns Media observable\n */\nexport function watchMedia(query: string): Observable {\n const media = matchMedia(query)\n return fromEventPattern(next => (\n media.addListener(() => next(media.matches))\n ))\n .pipe(\n startWith(media.matches)\n )\n}\n\n/**\n * Watch print mode\n *\n * @returns Print observable\n */\nexport function watchPrint(): Observable {\n const media = matchMedia(\"print\")\n return merge(\n fromEvent(window, \"beforeprint\").pipe(map(() => true)),\n fromEvent(window, \"afterprint\").pipe(map(() => false))\n )\n .pipe(\n startWith(media.matches)\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Toggle an observable with a media observable\n *\n * @template T - Data type\n *\n * @param query$ - Media observable\n * @param factory - Observable factory\n *\n * @returns Toggled observable\n */\nexport function at(\n query$: Observable, factory: () => Observable\n): Observable {\n return query$\n .pipe(\n switchMap(active => active ? factory() : EMPTY)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n catchError,\n from,\n map,\n of,\n shareReplay,\n switchMap,\n throwError\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch the given URL\n *\n * If the request fails (e.g. when dispatched from `file://` locations), the\n * observable will complete without emitting a value.\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Response observable\n */\nexport function request(\n url: URL | string, options: RequestInit = { credentials: \"same-origin\" }\n): Observable {\n return from(fetch(`${url}`, options))\n .pipe(\n catchError(() => EMPTY),\n switchMap(res => res.status !== 200\n ? throwError(() => new Error(res.statusText))\n : of(res)\n )\n )\n}\n\n/**\n * Fetch JSON from the given URL\n *\n * @template T - Data type\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Data observable\n */\nexport function requestJSON(\n url: URL | string, options?: RequestInit\n): Observable {\n return request(url, options)\n .pipe(\n switchMap(res => res.json()),\n shareReplay(1)\n )\n}\n\n/**\n * Fetch XML from the given URL\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Data observable\n */\nexport function requestXML(\n url: URL | string, options?: RequestInit\n): Observable {\n const dom = new DOMParser()\n return request(url, options)\n .pipe(\n switchMap(res => res.text()),\n map(res => dom.parseFromString(res, \"text/xml\")),\n shareReplay(1)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n defer,\n finalize,\n fromEvent,\n map,\n merge,\n switchMap,\n take,\n throwError\n} from \"rxjs\"\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create and load a `script` element\n *\n * This function returns an observable that will emit when the script was\n * successfully loaded, or throw an error if it didn't.\n *\n * @param src - Script URL\n *\n * @returns Script observable\n */\nexport function watchScript(src: string): Observable {\n const script = h(\"script\", { src })\n return defer(() => {\n document.head.appendChild(script)\n return merge(\n fromEvent(script, \"load\"),\n fromEvent(script, \"error\")\n .pipe(\n switchMap(() => (\n throwError(() => new ReferenceError(`Invalid script: ${src}`))\n ))\n )\n )\n .pipe(\n map(() => undefined),\n finalize(() => document.head.removeChild(script)),\n take(1)\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport offset\n */\nexport interface ViewportOffset {\n x: number /* Horizontal offset */\n y: number /* Vertical offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve viewport offset\n *\n * On iOS Safari, viewport offset can be negative due to overflow scrolling.\n * As this may induce strange behaviors downstream, we'll just limit it to 0.\n *\n * @returns Viewport offset\n */\nexport function getViewportOffset(): ViewportOffset {\n return {\n x: Math.max(0, scrollX),\n y: Math.max(0, scrollY)\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport offset\n *\n * @returns Viewport offset observable\n */\nexport function watchViewportOffset(): Observable {\n return merge(\n fromEvent(window, \"scroll\", { passive: true }),\n fromEvent(window, \"resize\", { passive: true })\n )\n .pipe(\n map(getViewportOffset),\n startWith(getViewportOffset())\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n startWith\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport size\n */\nexport interface ViewportSize {\n width: number /* Viewport width */\n height: number /* Viewport height */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve viewport size\n *\n * @returns Viewport size\n */\nexport function getViewportSize(): ViewportSize {\n return {\n width: innerWidth,\n height: innerHeight\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport size\n *\n * @returns Viewport size observable\n */\nexport function watchViewportSize(): Observable {\n return fromEvent(window, \"resize\", { passive: true })\n .pipe(\n map(getViewportSize),\n startWith(getViewportSize())\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n map,\n shareReplay\n} from \"rxjs\"\n\nimport {\n ViewportOffset,\n watchViewportOffset\n} from \"../offset\"\nimport {\n ViewportSize,\n watchViewportSize\n} from \"../size\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport\n */\nexport interface Viewport {\n offset: ViewportOffset /* Viewport offset */\n size: ViewportSize /* Viewport size */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport\n *\n * @returns Viewport observable\n */\nexport function watchViewport(): Observable {\n return combineLatest([\n watchViewportOffset(),\n watchViewportSize()\n ])\n .pipe(\n map(([offset, size]) => ({ offset, size })),\n shareReplay(1)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n distinctUntilKeyChanged,\n map\n} from \"rxjs\"\n\nimport { Header } from \"~/components\"\n\nimport { getElementOffset } from \"../../element\"\nimport { Viewport } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
/* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport relative to element\n *\n * @param el - Element\n * @param options - Options\n *\n * @returns Viewport observable\n */\nexport function watchViewportAt(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n const size$ = viewport$\n .pipe(\n distinctUntilKeyChanged(\"size\")\n )\n\n /* Compute element offset */\n const offset$ = combineLatest([size$, header$])\n .pipe(\n map(() => getElementOffset(el))\n )\n\n /* Compute relative viewport, return hot observable */\n return combineLatest([header$, viewport$, offset$])\n .pipe(\n map(([{ height }, { offset, size }, { x, y }]) => ({\n offset: {\n x: offset.x - x,\n y: offset.y - y + height\n },\n size\n }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n fromEvent,\n map,\n share,\n switchMap,\n tap,\n throttle\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Worker message\n */\nexport interface WorkerMessage {\n type: unknown /* Message type */\n data?: unknown /* Message data */\n}\n\n/**\n * Worker handler\n *\n * @template T - Message type\n */\nexport interface WorkerHandler<\n T extends WorkerMessage\n> {\n tx$: Subject /* Message transmission subject */\n rx$: Observable /* Message receive observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n *\n * @template T - Worker message type\n */\ninterface WatchOptions {\n tx$: Observable /* Message transmission observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch a web worker\n *\n * This function returns an observable that sends all values emitted by the\n * message observable to the web worker. Web worker communication is expected\n * to be bidirectional (request-response) and synchronous. Messages that are\n * emitted during a pending request are throttled, the last one is emitted.\n *\n * @param worker - Web worker\n * @param options - Options\n *\n * @returns Worker message observable\n */\nexport function watchWorker(\n worker: Worker, { tx$ }: WatchOptions\n): Observable {\n\n /* Intercept messages from worker-like objects */\n const rx$ = fromEvent(worker, \"message\")\n .pipe(\n map(({ data }) => data as T)\n )\n\n /* Send and receive messages, return hot observable */\n return tx$\n .pipe(\n throttle(() => rx$, { leading: true, trailing: true }),\n tap(message => worker.postMessage(message)),\n switchMap(() => rx$),\n share()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getElement, getLocation } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Feature flag\n */\nexport type Flag =\n | \"announce.dismiss\" /* Dismissable announcement bar */\n | \"content.code.annotate\" /* Code annotations */\n | \"content.tabs.link\" /* Link content tabs */\n | \"header.autohide\" /* Hide header */\n | \"navigation.expand\" /* Automatic expansion */\n | \"navigation.indexes\" /* Section pages */\n | \"navigation.instant\" /* Instant loading */\n | \"navigation.sections\" /* Section navigation */\n | \"navigation.tabs\" /* Tabs navigation */\n | \"navigation.tabs.sticky\" /* Tabs navigation (sticky) */\n | \"navigation.top\" /* Back-to-top button */\n | \"navigation.tracking\" /* Anchor tracking */\n | \"search.highlight\" /* Search highlighting */\n | \"search.share\" /* Search sharing */\n | \"search.suggest\" /* Search suggestions */\n | \"toc.integrate\" /* Integrated table of contents */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Translation\n */\nexport type Translation =\n | \"clipboard.copy\" /* Copy to clipboard */\n | \"clipboard.copied\" /* Copied to clipboard */\n | \"search.config.lang\" /* Search language */\n | \"search.config.pipeline\" /* Search pipeline */\n | \"search.config.separator\" /* Search separator */\n | \"search.placeholder\" /* Search */\n | \"search.result.placeholder\" /* Type to start searching */\n | \"search.result.none\" /* No matching documents */\n | \"search.result.one\" /* 1 matching document */\n | \"search.result.other\" /* # matching documents */\n | \"search.result.more.one\" /* 1 more on this page */\n | \"search.result.more.other\" /* # more on this page */\n | \"search.result.term.missing\" /* Missing */\n | \"select.version.title\" /* Version selector */\n\n/**\n * Translations\n */\nexport type Translations = Record\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Versioning\n */\nexport interface Versioning {\n provider: \"mike\" /* Version provider */\n default?: string /* Default version */\n}\n\n/**\n * Configuration\n */\nexport interface Config {\n base: string /* Base URL */\n features: Flag[] /* Feature flags */\n translations: Translations /* Translations */\n search: string /* Search worker URL */\n version?: Versioning /* Versioning */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve global configuration and make base URL absolute\n */\nconst script = getElement(\"#__config\")\nconst config: Config = JSON.parse(script.textContent!)\nconfig.base = `${new URL(config.base, getLocation())}`\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve global configuration\n *\n * @returns Global configuration\n */\nexport function configuration(): Config {\n return config\n}\n\n/**\n * Check whether a feature flag is enabled\n *\n * @param flag - Feature flag\n *\n * @returns Test result\n */\nexport function feature(flag: Flag): boolean {\n return config.features.includes(flag)\n}\n\n/**\n * Retrieve the translation for the given key\n *\n * @param key - Key to be translated\n * @param value - Positional value, if any\n *\n * @returns Translation\n */\nexport function translation(\n key: Translation, value?: string | number\n): string {\n return typeof value !== \"undefined\"\n ? config.translations[key].replace(\"#\", value.toString())\n : config.translations[key]\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getElement, getElements } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Component type\n */\nexport type ComponentType =\n | \"announce\" /* Announcement bar */\n | \"container\" /* Container */\n | \"consent\" /* Consent */\n | \"content\" /* Content */\n | \"dialog\" /* Dialog */\n | \"header\" /* Header */\n | \"header-title\" /* Header title */\n | \"header-topic\" /* Header topic */\n | \"main\" /* Main area */\n | \"outdated\" /* Version warning */\n | \"palette\" /* Color palette */\n | \"search\" /* Search */\n | \"search-query\" /* Search input */\n | \"search-result\" /* Search results */\n | \"search-share\" /* Search sharing */\n | \"search-suggest\" /* Search suggestions */\n | \"sidebar\" /* Sidebar */\n | \"skip\" /* Skip link */\n | \"source\" /* Repository information */\n | \"tabs\" /* Navigation tabs */\n | \"toc\" /* Table of contents */\n | \"top\" /* Back-to-top button */\n\n/**\n * Component\n *\n * @template T - Component type\n * @template U - Reference type\n */\nexport type Component<\n T extends {} = {},\n U extends HTMLElement = HTMLElement\n> =\n T & {\n ref: U /* Component reference */\n }\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Component type map\n */\ninterface ComponentTypeMap {\n \"announce\": HTMLElement /* Announcement bar */\n \"container\": HTMLElement /* Container */\n \"consent\": HTMLElement /* Consent */\n \"content\": HTMLElement /* Content */\n \"dialog\": HTMLElement /* Dialog */\n \"header\": HTMLElement /* Header */\n \"header-title\": HTMLElement /* Header title */\n \"header-topic\": HTMLElement /* Header topic */\n \"main\": HTMLElement /* Main area */\n \"outdated\": HTMLElement /* Version warning */\n \"palette\": HTMLElement /* Color palette */\n \"search\": HTMLElement /* Search */\n \"search-query\": HTMLInputElement /* Search input */\n \"search-result\": HTMLElement /* Search results */\n \"search-share\": HTMLAnchorElement /* Search sharing */\n \"search-suggest\": HTMLElement /* Search suggestions */\n \"sidebar\": HTMLElement /* Sidebar */\n \"skip\": HTMLAnchorElement /* Skip link */\n \"source\": HTMLAnchorElement /* Repository information */\n \"tabs\": HTMLElement /* Navigation tabs */\n \"toc\": HTMLElement /* Table of contents */\n \"top\": HTMLAnchorElement /* Back-to-top button */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve the element for a given component or throw a reference error\n *\n * @template T - Component type\n *\n * @param type - Component type\n * @param node - Node of reference\n *\n * @returns Element\n */\nexport function getComponentElement(\n type: T, node: ParentNode = document\n): ComponentTypeMap[T] {\n return getElement(`[data-md-component=${type}]`, node)\n}\n\n/**\n * Retrieve all elements for a given component\n *\n * @template T - Component type\n *\n * @param type - Component type\n * @param node - Node of reference\n *\n * @returns Elements\n */\nexport function getComponentElements(\n type: T, node: ParentNode = document\n): ComponentTypeMap[T][] {\n return getElements(`[data-md-component=${type}]`, node)\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n finalize,\n fromEvent,\n map,\n startWith,\n tap\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport { getElement } from \"~/browser\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Announcement bar\n */\nexport interface Announce {\n hash: number /* Content hash */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch announcement bar\n *\n * @param el - Announcement bar element\n *\n * @returns Announcement bar observable\n */\nexport function watchAnnounce(\n el: HTMLElement\n): Observable {\n const button = getElement(\".md-typeset > :first-child\", el)\n return fromEvent(button, \"click\", { once: true })\n .pipe(\n map(() => getElement(\".md-typeset\", el)),\n map(content => ({ hash: __md_hash(content.innerHTML) }))\n )\n}\n\n/**\n * Mount announcement bar\n *\n * @param el - Announcement bar element\n *\n * @returns Announcement bar component observable\n */\nexport function mountAnnounce(\n el: HTMLElement\n): Observable> {\n if (!feature(\"announce.dismiss\") || !el.childElementCount)\n return EMPTY\n\n /* Mount component on subscription */\n return defer(() => {\n const push$ = new Subject()\n push$\n .pipe(\n startWith({ hash: __md_get(\"__announce\") })\n )\n .subscribe(({ hash }) => {\n if (hash && hash === (__md_get(\"__announce\") ?? hash)) {\n el.hidden = true\n\n /* Persist preference in local storage */\n __md_set(\"__announce\", hash)\n }\n })\n\n /* Create and return component */\n return watchAnnounce(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n finalize,\n map,\n tap\n} from \"rxjs\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Consent\n */\nexport interface Consent {\n hidden: boolean /* Consent is hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n target$: Observable /* Target observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Target observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch consent\n *\n * @param el - Consent element\n * @param options - Options\n *\n * @returns Consent observable\n */\nexport function watchConsent(\n el: HTMLElement, { target$ }: WatchOptions\n): Observable {\n return target$\n .pipe(\n map(target => ({ hidden: target !== el }))\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Mount consent\n *\n * @param el - Consent element\n * @param options - Options\n *\n * @returns Consent component observable\n */\nexport function mountConsent(\n el: HTMLElement, options: MountOptions\n): Observable> {\n const internal$ = new Subject()\n internal$.subscribe(({ hidden }) => {\n el.hidden = hidden\n })\n\n /* Create and return component */\n return watchConsent(el, options)\n .pipe(\n tap(state => internal$.next(state)),\n finalize(() => internal$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport ClipboardJS from \"clipboard\"\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n finalize,\n map,\n mergeWith,\n switchMap,\n take,\n takeLast,\n takeUntil,\n tap\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n getElementContentSize,\n watchElementSize,\n watchElementVisibility\n} from \"~/browser\"\nimport { renderClipboardButton } from \"~/templates\"\n\nimport { Component } from \"../../../_\"\nimport {\n Annotation,\n mountAnnotationList\n} from \"../../annotation\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Code block\n */\nexport interface CodeBlock {\n scrollable: boolean /* Code block overflows */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Global sequence number for Clipboard.js integration\n */\nlet sequence = 0\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Find candidate list element directly following a code block\n *\n * @param el - Code block element\n *\n * @returns List element or nothing\n */\nfunction findCandidateList(el: HTMLElement): HTMLElement | undefined {\n if (el.nextElementSibling) {\n const sibling = el.nextElementSibling as HTMLElement\n if (sibling.tagName === \"OL\")\n return sibling\n\n /* Skip empty paragraphs - see https://bit.ly/3r4ZJ2O */\n else if (sibling.tagName === \"P\" && !sibling.children.length)\n return findCandidateList(sibling)\n }\n\n /* Everything else */\n return undefined\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch code block\n *\n * This function monitors size changes of the viewport, as well as switches of\n * content tabs with embedded code blocks, as both may trigger overflow.\n *\n * @param el - Code block element\n *\n * @returns Code block observable\n */\nexport function watchCodeBlock(\n el: HTMLElement\n): Observable {\n return watchElementSize(el)\n .pipe(\n map(({ width }) => {\n const content = getElementContentSize(el)\n return {\n scrollable: content.width > width\n }\n }),\n distinctUntilKeyChanged(\"scrollable\")\n )\n}\n\n/**\n * Mount code block\n *\n * This function ensures that an overflowing code block is focusable through\n * keyboard, so it can be scrolled without a mouse to improve on accessibility.\n * Furthermore, if code annotations are enabled, they are mounted if and only\n * if the code block is currently visible, e.g., not in a hidden content tab.\n *\n * @param el - Code block element\n * @param options - Options\n *\n * @returns Code block and annotation component observable\n */\nexport function mountCodeBlock(\n el: HTMLElement, options: MountOptions\n): Observable> {\n const { matches: hover } = matchMedia(\"(hover)\")\n\n /* Defer mounting of code block - see https://bit.ly/3vHVoVD */\n const factory$ = defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ scrollable }) => {\n if (scrollable && hover)\n el.setAttribute(\"tabindex\", \"0\")\n else\n el.removeAttribute(\"tabindex\")\n })\n\n /* Render button for Clipboard.js integration */\n if (ClipboardJS.isSupported()) {\n const parent = el.closest(\"pre\")!\n parent.id = `__code_${++sequence}`\n parent.insertBefore(\n renderClipboardButton(parent.id),\n el\n )\n }\n\n /* Handle code annotations */\n const container = el.closest(\".highlight\")\n if (container instanceof HTMLElement) {\n const list = findCandidateList(container)\n\n /* Mount code annotations, if enabled */\n if (typeof list !== \"undefined\" && (\n container.classList.contains(\"annotate\") ||\n feature(\"content.code.annotate\")\n )) {\n const annotations$ = mountAnnotationList(list, el, options)\n\n /* Create and return component */\n return watchCodeBlock(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state })),\n mergeWith(\n watchElementSize(container)\n .pipe(\n takeUntil(push$.pipe(takeLast(1))),\n map(({ width, height }) => width && height),\n distinctUntilChanged(),\n switchMap(active => active ? annotations$ : EMPTY)\n )\n )\n )\n }\n }\n\n /* Create and return component */\n return watchCodeBlock(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n\n /* Mount code block on first sight */\n return watchElementVisibility(el)\n .pipe(\n filter(visible => visible),\n take(1),\n switchMap(() => factory$)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render an empty annotation\n *\n * @param id - Annotation identifier\n *\n * @returns Element\n */\nexport function renderAnnotation(id: number): HTMLElement {\n return (\n \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { translation } from \"~/_\"\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a 'copy-to-clipboard' button\n *\n * @param id - Unique identifier\n *\n * @returns Element\n */\nexport function renderClipboardButton(id: string): HTMLElement {\n return (\n code`}\n >\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ComponentChild } from \"preact\"\n\nimport { feature, translation } from \"~/_\"\nimport {\n SearchDocument,\n SearchMetadata,\n SearchResultItem\n} from \"~/integrations/search\"\nimport { h, truncate } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Render flag\n */\nconst enum Flag {\n TEASER = 1, /* Render teaser */\n PARENT = 2 /* Render as parent */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper function\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a search document\n *\n * @param document - Search document\n * @param flag - Render flags\n *\n * @returns Element\n */\nfunction renderSearchDocument(\n document: SearchDocument & SearchMetadata, flag: Flag\n): HTMLElement {\n const parent = flag & Flag.PARENT\n const teaser = flag & Flag.TEASER\n\n /* Render missing query terms */\n const missing = Object.keys(document.terms)\n .filter(key => !document.terms[key])\n .reduce((list, key) => [\n ...list, {key}, \" \"\n ], [])\n .slice(0, -1)\n\n /* Assemble query string for highlighting */\n const url = new URL(document.location)\n if (feature(\"search.highlight\"))\n url.searchParams.set(\"h\", Object.entries(document.terms)\n .filter(([, match]) => match)\n .reduce((highlight, [value]) => `${highlight} ${value}`.trim(), \"\")\n )\n\n /* Render article or section, depending on flags */\n return (\n \n \n {parent > 0 &&
}\n

{document.title}

\n {teaser > 0 && document.text.length > 0 &&\n

\n {truncate(document.text, 320)}\n

\n }\n {document.tags && document.tags.map(tag => (\n {tag}\n ))}\n {teaser > 0 && missing.length > 0 &&\n

\n {translation(\"search.result.term.missing\")}: {...missing}\n

\n }\n \n
\n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a search result\n *\n * @param result - Search result\n *\n * @returns Element\n */\nexport function renderSearchResultItem(\n result: SearchResultItem\n): HTMLElement {\n const threshold = result[0].score\n const docs = [...result]\n\n /* Find and extract parent article */\n const parent = docs.findIndex(doc => !doc.location.includes(\"#\"))\n const [article] = docs.splice(parent, 1)\n\n /* Determine last index above threshold */\n let index = docs.findIndex(doc => doc.score < threshold)\n if (index === -1)\n index = docs.length\n\n /* Partition sections */\n const best = docs.slice(0, index)\n const more = docs.slice(index)\n\n /* Render children */\n const children = [\n renderSearchDocument(article, Flag.PARENT | +(!parent && index === 0)),\n ...best.map(section => renderSearchDocument(section, Flag.TEASER)),\n ...more.length ? [\n
\n \n {more.length > 0 && more.length === 1\n ? translation(\"search.result.more.one\")\n : translation(\"search.result.more.other\", more.length)\n }\n \n {...more.map(section => renderSearchDocument(section, Flag.TEASER))}\n
\n ] : []\n ]\n\n /* Render search result */\n return (\n
  • \n {children}\n
  • \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { SourceFacts } from \"~/components\"\nimport { h, round } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render repository facts\n *\n * @param facts - Repository facts\n *\n * @returns Element\n */\nexport function renderSourceFacts(facts: SourceFacts): HTMLElement {\n return (\n
      \n {Object.entries(facts).map(([key, value]) => (\n
    • \n {typeof value === \"number\" ? round(value) : value}\n
    • \n ))}\n
    \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Tabbed control type\n */\ntype TabbedControlType =\n | \"prev\"\n | \"next\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render control for content tabs\n *\n * @param type - Control type\n *\n * @returns Element\n */\nexport function renderTabbedControl(\n type: TabbedControlType\n): HTMLElement {\n const classes = `tabbed-control tabbed-control--${type}`\n return (\n \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a table inside a wrapper to improve scrolling on mobile\n *\n * @param table - Table element\n *\n * @returns Element\n */\nexport function renderTable(table: HTMLElement): HTMLElement {\n return (\n
    \n
    \n {table}\n
    \n
    \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { configuration, translation } from \"~/_\"\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Version\n */\nexport interface Version {\n version: string /* Version identifier */\n title: string /* Version title */\n aliases: string[] /* Version aliases */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a version\n *\n * @param version - Version\n *\n * @returns Element\n */\nfunction renderVersion(version: Version): HTMLElement {\n const config = configuration()\n\n /* Ensure trailing slash, see https://bit.ly/3rL5u3f */\n const url = new URL(`../${version.version}/`, config.base)\n return (\n
  • \n \n {version.title}\n \n
  • \n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a version selector\n *\n * @param versions - Versions\n * @param active - Active version\n *\n * @returns Element\n */\nexport function renderVersionSelector(\n versions: Version[], active: Version\n): HTMLElement {\n return (\n
    \n \n {active.title}\n \n
      \n {versions.map(renderVersion)}\n
    \n
    \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n animationFrameScheduler,\n combineLatest,\n defer,\n finalize,\n fromEvent,\n map,\n switchMap,\n take,\n takeLast,\n takeUntil,\n tap,\n throttleTime\n} from \"rxjs\"\n\nimport {\n ElementOffset,\n getElement,\n getElementSize,\n watchElementContentOffset,\n watchElementFocus,\n watchElementOffset,\n watchElementVisibility\n} from \"~/browser\"\n\nimport { Component } from \"../../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Annotation\n */\nexport interface Annotation {\n active: boolean /* Annotation is active */\n offset: ElementOffset /* Annotation offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch annotation\n *\n * @param el - Annotation element\n * @param container - Containing element\n *\n * @returns Annotation observable\n */\nexport function watchAnnotation(\n el: HTMLElement, container: HTMLElement\n): Observable {\n const offset$ = defer(() => combineLatest([\n watchElementOffset(el),\n watchElementContentOffset(container)\n ]))\n .pipe(\n map(([{ x, y }, scroll]) => {\n const { width } = getElementSize(el)\n return ({\n x: x - scroll.x + width / 2,\n y: y - scroll.y\n })\n })\n )\n\n /* Actively watch annotation on focus */\n return watchElementFocus(el)\n .pipe(\n switchMap(active => offset$\n .pipe(\n map(offset => ({ active, offset })),\n take(+!active || Infinity)\n )\n )\n )\n}\n\n/**\n * Mount annotation\n *\n * @param el - Annotation element\n * @param container - Containing element\n *\n * @returns Annotation component observable\n */\nexport function mountAnnotation(\n el: HTMLElement, container: HTMLElement\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe({\n\n /* Handle emission */\n next({ offset }) {\n el.style.setProperty(\"--md-tooltip-x\", `${offset.x}px`)\n el.style.setProperty(\"--md-tooltip-y\", `${offset.y}px`)\n },\n\n /* Handle complete */\n complete() {\n el.style.removeProperty(\"--md-tooltip-x\")\n el.style.removeProperty(\"--md-tooltip-y\")\n }\n })\n\n /* Start animation only when annotation is visible */\n const done$ = push$.pipe(takeLast(1))\n watchElementVisibility(el)\n .pipe(\n takeUntil(done$)\n )\n .subscribe(visible => {\n el.toggleAttribute(\"data-md-visible\", visible)\n })\n\n /* Track relative origin of tooltip */\n push$\n .pipe(\n throttleTime(500, animationFrameScheduler),\n map(() => container.getBoundingClientRect()),\n map(({ x }) => x)\n )\n .subscribe({\n\n /* Handle emission */\n next(origin) {\n if (origin)\n el.style.setProperty(\"--md-tooltip-0\", `${-origin}px`)\n else\n el.style.removeProperty(\"--md-tooltip-0\")\n },\n\n /* Handle complete */\n complete() {\n el.style.removeProperty(\"--md-tooltip-0\")\n }\n })\n\n /* Close open annotation on click */\n const index = getElement(\":scope > :last-child\", el)\n const blur$ = fromEvent(index, \"mousedown\", { once: true })\n push$\n .pipe(\n switchMap(({ active }) => active ? blur$ : EMPTY),\n tap(ev => ev.preventDefault())\n )\n .subscribe(() => el.blur())\n\n /* Create and return component */\n return watchAnnotation(el, container)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n finalize,\n merge,\n share,\n takeLast,\n takeUntil\n} from \"rxjs\"\n\nimport {\n getElement,\n getElements,\n getOptionalElement\n} from \"~/browser\"\nimport { renderAnnotation } from \"~/templates\"\n\nimport { Component } from \"../../../_\"\nimport {\n Annotation,\n mountAnnotation\n} from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Find all annotation markers in the given code block\n *\n * @param container - Containing element\n *\n * @returns Annotation markers\n */\nfunction findAnnotationMarkers(container: HTMLElement): Text[] {\n const markers: Text[] = []\n for (const comment of getElements(\".c, .c1, .cm\", container)) {\n let match: RegExpExecArray | null\n\n /* Split text at marker and add to list */\n let text = comment.firstChild as Text\n if (text instanceof Text)\n while ((match = /\\((\\d+)\\)/.exec(text.textContent!))) {\n const marker = text.splitText(match.index)\n text = marker.splitText(match[0].length)\n markers.push(marker)\n }\n }\n return markers\n}\n\n/**\n * Swap the child nodes of two elements\n *\n * @param source - Source element\n * @param target - Target element\n */\nfunction swap(source: HTMLElement, target: HTMLElement): void {\n target.append(...Array.from(source.childNodes))\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount annotation list\n *\n * This function analyzes the containing code block and checks for markers\n * referring to elements in the given annotation list. If no markers are found,\n * the list is left untouched. Otherwise, list elements are rendered as\n * annotations inside the code block.\n *\n * @param el - Annotation list element\n * @param container - Containing element\n * @param options - Options\n *\n * @returns Annotation component observable\n */\nexport function mountAnnotationList(\n el: HTMLElement, container: HTMLElement, { print$ }: MountOptions\n): Observable> {\n\n /* Find and replace all markers with empty annotations */\n const annotations = new Map()\n for (const marker of findAnnotationMarkers(container)) {\n const [, id] = marker.textContent!.match(/\\((\\d+)\\)/)!\n if (getOptionalElement(`li:nth-child(${id})`, el)) {\n annotations.set(+id, renderAnnotation(+id))\n marker.replaceWith(annotations.get(+id)!)\n }\n }\n\n /* Keep list if there are no annotations to render */\n if (annotations.size === 0)\n return EMPTY\n\n /* Create and return component */\n return defer(() => {\n const done$ = new Subject()\n\n /* Handle print mode - see https://bit.ly/3rgPdpt */\n print$\n .pipe(\n takeUntil(done$.pipe(takeLast(1)))\n )\n .subscribe(active => {\n el.hidden = !active\n\n /* Show annotations in code block or list (print) */\n for (const [id, annotation] of annotations) {\n const inner = getElement(\".md-typeset\", annotation)\n const child = getElement(`li:nth-child(${id})`, el)\n if (!active)\n swap(child, inner)\n else\n swap(inner, child)\n }\n })\n\n /* Create and return component */\n return merge(...[...annotations]\n .map(([, annotation]) => (\n mountAnnotation(annotation, container)\n ))\n )\n .pipe(\n finalize(() => done$.complete()),\n share()\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n map,\n of,\n shareReplay,\n tap\n} from \"rxjs\"\n\nimport { watchScript } from \"~/browser\"\nimport { h } from \"~/utilities\"\n\nimport { Component } from \"../../../_\"\n\nimport themeCSS from \"./index.css\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mermaid diagram\n */\nexport interface Mermaid {}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Mermaid instance observable\n */\nlet mermaid$: Observable\n\n/**\n * Global sequence number for diagrams\n */\nlet sequence = 0\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch Mermaid script\n *\n * @returns Mermaid scripts observable\n */\nfunction fetchScripts(): Observable {\n return typeof mermaid === \"undefined\" || mermaid instanceof Element\n ? watchScript(\"https://unpkg.com/mermaid@9.0.1/dist/mermaid.min.js\")\n : of(undefined)\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount Mermaid diagram\n *\n * @param el - Code block element\n *\n * @returns Mermaid diagram component observable\n */\nexport function mountMermaid(\n el: HTMLElement\n): Observable> {\n el.classList.remove(\"mermaid\") // Hack: mitigate https://bit.ly/3CiN6Du\n mermaid$ ||= fetchScripts()\n .pipe(\n tap(() => mermaid.initialize({\n startOnLoad: false,\n themeCSS\n })),\n map(() => undefined),\n shareReplay(1)\n )\n\n /* Render diagram */\n mermaid$.subscribe(() => {\n el.classList.add(\"mermaid\") // Hack: mitigate https://bit.ly/3CiN6Du\n const id = `__mermaid_${sequence++}`\n const host = h(\"div\", { class: \"mermaid\" })\n mermaid.mermaidAPI.render(id, el.textContent, (svg: string) => {\n\n /* Create a shadow root and inject diagram */\n const shadow = host.attachShadow({ mode: \"closed\" })\n shadow.innerHTML = svg\n\n /* Replace code block with diagram */\n el.replaceWith(host)\n })\n })\n\n /* Create and return component */\n return mermaid$\n .pipe(\n map(() => ({ ref: el }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n defer,\n filter,\n finalize,\n map,\n merge,\n tap\n} from \"rxjs\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Details\n */\nexport interface Details {\n action: \"open\" | \"close\" /* Details state */\n reveal?: boolean /* Details is revealed */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch details\n *\n * @param el - Details element\n * @param options - Options\n *\n * @returns Details observable\n */\nexport function watchDetails(\n el: HTMLDetailsElement, { target$, print$ }: WatchOptions\n): Observable
    {\n let open = true\n return merge(\n\n /* Open and focus details on location target */\n target$\n .pipe(\n map(target => target.closest(\"details:not([open])\")!),\n filter(details => el === details),\n map(() => ({\n action: \"open\", reveal: true\n }) as Details)\n ),\n\n /* Open details on print and close afterwards */\n print$\n .pipe(\n filter(active => active || !open),\n tap(() => open = el.open),\n map(active => ({\n action: active ? \"open\" : \"close\"\n }) as Details)\n )\n )\n}\n\n/**\n * Mount details\n *\n * This function ensures that `details` tags are opened on anchor jumps and\n * prior to printing, so the whole content of the page is visible.\n *\n * @param el - Details element\n * @param options - Options\n *\n * @returns Details component observable\n */\nexport function mountDetails(\n el: HTMLDetailsElement, options: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject
    ()\n push$.subscribe(({ action, reveal }) => {\n if (action === \"open\")\n el.setAttribute(\"open\", \"\")\n else\n el.removeAttribute(\"open\")\n if (reveal)\n el.scrollIntoView()\n })\n\n /* Create and return component */\n return watchDetails(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, of } from \"rxjs\"\n\nimport { renderTable } from \"~/templates\"\nimport { h } from \"~/utilities\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Data table\n */\nexport interface DataTable {}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Sentinel for replacement\n */\nconst sentinel = h(\"table\")\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount data table\n *\n * This function wraps a data table in another scrollable container, so it can\n * be smoothly scrolled on smaller screen sizes and won't break the layout.\n *\n * @param el - Data table element\n *\n * @returns Data table component observable\n */\nexport function mountDataTable(\n el: HTMLElement\n): Observable> {\n el.replaceWith(sentinel)\n sentinel.replaceWith(renderTable(el))\n\n /* Create and return component */\n return of({ ref: el })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n animationFrameScheduler,\n asyncScheduler,\n auditTime,\n combineLatest,\n defer,\n finalize,\n fromEvent,\n map,\n merge,\n skip,\n startWith,\n subscribeOn,\n takeLast,\n takeUntil,\n tap\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n getElement,\n getElementContentOffset,\n getElementContentSize,\n getElementOffset,\n getElementSize,\n getElements,\n watchElementContentOffset,\n watchElementSize\n} from \"~/browser\"\nimport { renderTabbedControl } from \"~/templates\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Content tabs\n */\nexport interface ContentTabs {\n active: HTMLLabelElement /* Active tab label */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch content tabs\n *\n * @param el - Content tabs element\n *\n * @returns Content tabs observable\n */\nexport function watchContentTabs(\n el: HTMLElement\n): Observable {\n const inputs = getElements(\":scope > input\", el)\n const initial = inputs.find(input => input.checked) || inputs[0]\n return merge(...inputs.map(input => fromEvent(input, \"change\")\n .pipe(\n map(() => getElement(`label[for=\"${input.id}\"]`))\n )\n ))\n .pipe(\n startWith(getElement(`label[for=\"${initial.id}\"]`)),\n map(active => ({ active }))\n )\n}\n\n/**\n * Mount content tabs\n *\n * This function scrolls the active tab into view. While this functionality is\n * provided by browsers as part of `scrollInfoView`, browsers will always also\n * scroll the vertical axis, which we do not want. Thus, we decided to provide\n * this functionality ourselves.\n *\n * @param el - Content tabs element\n *\n * @returns Content tabs component observable\n */\nexport function mountContentTabs(\n el: HTMLElement\n): Observable> {\n\n /* Render content tab previous button for pagination */\n const prev = renderTabbedControl(\"prev\")\n el.append(prev)\n\n /* Render content tab next button for pagination */\n const next = renderTabbedControl(\"next\")\n el.append(next)\n\n /* Mount component on subscription */\n const container = getElement(\".tabbed-labels\", el)\n return defer(() => {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n combineLatest([push$, watchElementSize(el)])\n .pipe(\n auditTime(1, animationFrameScheduler),\n takeUntil(done$)\n )\n .subscribe({\n\n /* Handle emission */\n next([{ active }, size]) {\n const offset = getElementOffset(active)\n const { width } = getElementSize(active)\n\n /* Set tab indicator offset and width */\n el.style.setProperty(\"--md-indicator-x\", `${offset.x}px`)\n el.style.setProperty(\"--md-indicator-width\", `${width}px`)\n\n /* Scroll container to active content tab */\n const content = getElementContentOffset(container)\n if (\n offset.x < content.x ||\n offset.x + width > content.x + size.width\n )\n container.scrollTo({\n left: Math.max(0, offset.x - 16),\n behavior: \"smooth\"\n })\n },\n\n /* Handle complete */\n complete() {\n el.style.removeProperty(\"--md-indicator-x\")\n el.style.removeProperty(\"--md-indicator-width\")\n }\n })\n\n /* Hide content tab buttons on borders */\n combineLatest([\n watchElementContentOffset(container),\n watchElementSize(container)\n ])\n .pipe(\n takeUntil(done$)\n )\n .subscribe(([offset, size]) => {\n const content = getElementContentSize(container)\n prev.hidden = offset.x < 16\n next.hidden = offset.x > content.width - size.width - 16\n })\n\n /* Paginate content tab container on click */\n merge(\n fromEvent(prev, \"click\").pipe(map(() => -1)),\n fromEvent(next, \"click\").pipe(map(() => +1))\n )\n .pipe(\n takeUntil(done$)\n )\n .subscribe(direction => {\n const { width } = getElementSize(container)\n container.scrollBy({\n left: width * direction,\n behavior: \"smooth\"\n })\n })\n\n /* Set up linking of content tabs, if enabled */\n if (feature(\"content.tabs.link\"))\n push$.pipe(skip(1))\n .subscribe(({ active }) => {\n const tab = active.innerText.trim()\n for (const set of getElements(\"[data-tabs]\"))\n for (const input of getElements(\n \":scope > input\", set\n )) {\n const label = getElement(`label[for=\"${input.id}\"]`)\n if (label.innerText.trim() === tab) {\n input.click()\n break\n }\n }\n\n /* Persist active tabs in local storage */\n const tabs = __md_get(\"__tabs\") || []\n __md_set(\"__tabs\", [...new Set([tab, ...tabs])])\n })\n\n /* Create and return component */\n return watchContentTabs(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n .pipe(\n subscribeOn(asyncScheduler)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, merge } from \"rxjs\"\n\nimport { getElements } from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { Annotation } from \"../annotation\"\nimport {\n CodeBlock,\n Mermaid,\n mountCodeBlock,\n mountMermaid\n} from \"../code\"\nimport {\n Details,\n mountDetails\n} from \"../details\"\nimport {\n DataTable,\n mountDataTable\n} from \"../table\"\nimport {\n ContentTabs,\n mountContentTabs\n} from \"../tabs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Content\n */\nexport type Content =\n | Annotation\n | ContentTabs\n | CodeBlock\n | Mermaid\n | DataTable\n | Details\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount content\n *\n * This function mounts all components that are found in the content of the\n * actual article, including code blocks, data tables and details.\n *\n * @param el - Content element\n * @param options - Options\n *\n * @returns Content component observable\n */\nexport function mountContent(\n el: HTMLElement, { target$, print$ }: MountOptions\n): Observable> {\n return merge(\n\n /* Code blocks */\n ...getElements(\"pre:not(.mermaid) > code\", el)\n .map(child => mountCodeBlock(child, { print$ })),\n\n /* Mermaid diagrams */\n ...getElements(\"pre.mermaid\", el)\n .map(child => mountMermaid(child)),\n\n /* Data tables */\n ...getElements(\"table:not([class])\", el)\n .map(child => mountDataTable(child)),\n\n /* Details */\n ...getElements(\"details\", el)\n .map(child => mountDetails(child, { target$, print$ })),\n\n /* Content tabs */\n ...getElements(\"[data-tabs]\", el)\n .map(child => mountContentTabs(child))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n defer,\n delay,\n finalize,\n map,\n merge,\n of,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport { getElement } from \"~/browser\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Dialog\n */\nexport interface Dialog {\n message: string /* Dialog message */\n active: boolean /* Dialog is active */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n alert$: Subject /* Alert subject */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n alert$: Subject /* Alert subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch dialog\n *\n * @param _el - Dialog element\n * @param options - Options\n *\n * @returns Dialog observable\n */\nexport function watchDialog(\n _el: HTMLElement, { alert$ }: WatchOptions\n): Observable {\n return alert$\n .pipe(\n switchMap(message => merge(\n of(true),\n of(false).pipe(delay(2000))\n )\n .pipe(\n map(active => ({ message, active }))\n )\n )\n )\n}\n\n/**\n * Mount dialog\n *\n * This function reveals the dialog in the right corner when a new alert is\n * emitted through the subject that is passed as part of the options.\n *\n * @param el - Dialog element\n * @param options - Options\n *\n * @returns Dialog component observable\n */\nexport function mountDialog(\n el: HTMLElement, options: MountOptions\n): Observable> {\n const inner = getElement(\".md-typeset\", el)\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ message, active }) => {\n el.classList.toggle(\"md-dialog--active\", active)\n inner.textContent = message\n })\n\n /* Create and return component */\n return watchDialog(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n combineLatest,\n combineLatestWith,\n defer,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n map,\n of,\n shareReplay,\n startWith,\n switchMap,\n takeLast,\n takeUntil\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n Viewport,\n watchElementSize,\n watchToggle\n} from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { Main } from \"../../main\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Header\n */\nexport interface Header {\n height: number /* Header visible height */\n hidden: boolean /* Header is hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n main$: Observable
    /* Main area observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Compute whether the header is hidden\n *\n * If the user scrolls past a certain threshold, the header can be hidden when\n * scrolling down, and shown when scrolling up.\n *\n * @param options - Options\n *\n * @returns Toggle observable\n */\nfunction isHidden({ viewport$ }: WatchOptions): Observable {\n if (!feature(\"header.autohide\"))\n return of(false)\n\n /* Compute direction and turning point */\n const direction$ = viewport$\n .pipe(\n map(({ offset: { y } }) => y),\n bufferCount(2, 1),\n map(([a, b]) => [a < b, b] as const),\n distinctUntilKeyChanged(0)\n )\n\n /* Compute whether header should be hidden */\n const hidden$ = combineLatest([viewport$, direction$])\n .pipe(\n filter(([{ offset }, [, y]]) => Math.abs(y - offset.y) > 100),\n map(([, [direction]]) => direction),\n distinctUntilChanged()\n )\n\n /* Compute threshold for hiding */\n const search$ = watchToggle(\"search\")\n return combineLatest([viewport$, search$])\n .pipe(\n map(([{ offset }, search]) => offset.y > 400 && !search),\n distinctUntilChanged(),\n switchMap(active => active ? hidden$ : of(false)),\n startWith(false)\n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch header\n *\n * @param el - Header element\n * @param options - Options\n *\n * @returns Header observable\n */\nexport function watchHeader(\n el: HTMLElement, options: WatchOptions\n): Observable
    {\n return defer(() => combineLatest([\n watchElementSize(el),\n isHidden(options)\n ]))\n .pipe(\n map(([{ height }, hidden]) => ({\n height,\n hidden\n })),\n distinctUntilChanged((a, b) => (\n a.height === b.height &&\n a.hidden === b.hidden\n )),\n shareReplay(1)\n )\n}\n\n/**\n * Mount header\n *\n * This function manages the different states of the header, i.e. whether it's\n * hidden or rendered with a shadow. This depends heavily on the main area.\n *\n * @param el - Header element\n * @param options - Options\n *\n * @returns Header component observable\n */\nexport function mountHeader(\n el: HTMLElement, { header$, main$ }: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject
    ()\n const done$ = push$.pipe(takeLast(1))\n push$\n .pipe(\n distinctUntilKeyChanged(\"active\"),\n combineLatestWith(header$)\n )\n .subscribe(([{ active }, { hidden }]) => {\n el.classList.toggle(\"md-header--shadow\", active && !hidden)\n el.hidden = hidden\n })\n\n /* Link to main area */\n main$.subscribe(push$)\n\n /* Create and return component */\n return header$\n .pipe(\n takeUntil(done$),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n distinctUntilKeyChanged,\n finalize,\n map,\n tap\n} from \"rxjs\"\n\nimport {\n Viewport,\n getElementSize,\n getOptionalElement,\n watchViewportAt\n} from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { Header } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Header\n */\nexport interface HeaderTitle {\n active: boolean /* Header title is active */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch header title\n *\n * @param el - Heading element\n * @param options - Options\n *\n * @returns Header title observable\n */\nexport function watchHeaderTitle(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n return watchViewportAt(el, { viewport$, header$ })\n .pipe(\n map(({ offset: { y } }) => {\n const { height } = getElementSize(el)\n return {\n active: y >= height\n }\n }),\n distinctUntilKeyChanged(\"active\")\n )\n}\n\n/**\n * Mount header title\n *\n * This function swaps the header title from the site title to the title of the\n * current page when the user scrolls past the first headline.\n *\n * @param el - Header title element\n * @param options - Options\n *\n * @returns Header title component observable\n */\nexport function mountHeaderTitle(\n el: HTMLElement, options: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ active }) => {\n el.classList.toggle(\"md-header__title--active\", active)\n })\n\n /* Obtain headline, if any */\n const heading = getOptionalElement(\"article h1\")\n if (typeof heading === \"undefined\")\n return EMPTY\n\n /* Create and return component */\n return watchHeaderTitle(heading, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n map,\n switchMap\n} from \"rxjs\"\n\nimport {\n Viewport,\n watchElementSize\n} from \"~/browser\"\n\nimport { Header } from \"../header\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Main area\n */\nexport interface Main {\n offset: number /* Main area top offset */\n height: number /* Main area visible height */\n active: boolean /* Main area is active */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch main area\n *\n * This function returns an observable that computes the visual parameters of\n * the main area which depends on the viewport vertical offset and height, as\n * well as the height of the header element, if the header is fixed.\n *\n * @param el - Main area element\n * @param options - Options\n *\n * @returns Main area observable\n */\nexport function watchMain(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable
    {\n\n /* Compute necessary adjustment for header */\n const adjust$ = header$\n .pipe(\n map(({ height }) => height),\n distinctUntilChanged()\n )\n\n /* Compute the main area's top and bottom borders */\n const border$ = adjust$\n .pipe(\n switchMap(() => watchElementSize(el)\n .pipe(\n map(({ height }) => ({\n top: el.offsetTop,\n bottom: el.offsetTop + height\n })),\n distinctUntilKeyChanged(\"bottom\")\n )\n )\n )\n\n /* Compute the main area's offset, visible height and if we scrolled past */\n return combineLatest([adjust$, border$, viewport$])\n .pipe(\n map(([header, { top, bottom }, { offset: { y }, size: { height } }]) => {\n height = Math.max(0, height\n - Math.max(0, top - y, header)\n - Math.max(0, height + y - bottom)\n )\n return {\n offset: top - header,\n height,\n active: top - header <= y\n }\n }),\n distinctUntilChanged((a, b) => (\n a.offset === b.offset &&\n a.height === b.height &&\n a.active === b.active\n ))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n asyncScheduler,\n defer,\n finalize,\n fromEvent,\n map,\n mergeMap,\n observeOn,\n of,\n shareReplay,\n startWith,\n tap\n} from \"rxjs\"\n\nimport { getElements } from \"~/browser\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Palette colors\n */\nexport interface PaletteColor {\n scheme?: string /* Color scheme */\n primary?: string /* Primary color */\n accent?: string /* Accent color */\n}\n\n/**\n * Palette\n */\nexport interface Palette {\n index: number /* Palette index */\n color: PaletteColor /* Palette colors */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch color palette\n *\n * @param inputs - Color palette element\n *\n * @returns Color palette observable\n */\nexport function watchPalette(\n inputs: HTMLInputElement[]\n): Observable {\n const current = __md_get(\"__palette\") || {\n index: inputs.findIndex(input => matchMedia(\n input.getAttribute(\"data-md-color-media\")!\n ).matches)\n }\n\n /* Emit changes in color palette */\n return of(...inputs)\n .pipe(\n mergeMap(input => fromEvent(input, \"change\")\n .pipe(\n map(() => input)\n )\n ),\n startWith(inputs[Math.max(0, current.index)]),\n map(input => ({\n index: inputs.indexOf(input),\n color: {\n scheme: input.getAttribute(\"data-md-color-scheme\"),\n primary: input.getAttribute(\"data-md-color-primary\"),\n accent: input.getAttribute(\"data-md-color-accent\")\n }\n } as Palette)),\n shareReplay(1)\n )\n}\n\n/**\n * Mount color palette\n *\n * @param el - Color palette element\n *\n * @returns Color palette component observable\n */\nexport function mountPalette(\n el: HTMLElement\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(palette => {\n document.body.setAttribute(\"data-md-color-switching\", \"\")\n\n /* Set color palette */\n for (const [key, value] of Object.entries(palette.color))\n document.body.setAttribute(`data-md-color-${key}`, value)\n\n /* Toggle visibility */\n for (let index = 0; index < inputs.length; index++) {\n const label = inputs[index].nextElementSibling\n if (label instanceof HTMLElement)\n label.hidden = palette.index !== index\n }\n\n /* Persist preference in local storage */\n __md_set(\"__palette\", palette)\n })\n\n /* Revert transition durations after color switch */\n push$.pipe(observeOn(asyncScheduler))\n .subscribe(() => {\n document.body.removeAttribute(\"data-md-color-switching\")\n })\n\n /* Create and return component */\n const inputs = getElements(\"input\", el)\n return watchPalette(inputs)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport ClipboardJS from \"clipboard\"\nimport {\n Observable,\n Subject,\n map,\n tap\n} from \"rxjs\"\n\nimport { translation } from \"~/_\"\nimport { getElement } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n alert$: Subject /* Alert subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Extract text to copy\n *\n * @param el - HTML element\n *\n * @returns Extracted text\n */\nfunction extract(el: HTMLElement): string {\n el.setAttribute(\"data-md-copying\", \"\")\n const text = el.innerText\n el.removeAttribute(\"data-md-copying\")\n return text\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up Clipboard.js integration\n *\n * @param options - Options\n */\nexport function setupClipboardJS(\n { alert$ }: SetupOptions\n): void {\n if (ClipboardJS.isSupported()) {\n new Observable(subscriber => {\n new ClipboardJS(\"[data-clipboard-target], [data-clipboard-text]\", {\n text: el => (\n el.getAttribute(\"data-clipboard-text\")! ||\n extract(getElement(\n el.getAttribute(\"data-clipboard-target\")!\n ))\n )\n })\n .on(\"success\", ev => subscriber.next(ev))\n })\n .pipe(\n tap(ev => {\n const trigger = ev.trigger as HTMLElement\n trigger.focus()\n }),\n map(() => translation(\"clipboard.copied\"))\n )\n .subscribe(alert$)\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n catchError,\n defaultIfEmpty,\n map,\n of,\n tap\n} from \"rxjs\"\n\nimport { configuration } from \"~/_\"\nimport { getElements, requestXML } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Sitemap, i.e. a list of URLs\n */\nexport type Sitemap = string[]\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Preprocess a list of URLs\n *\n * This function replaces the `site_url` in the sitemap with the actual base\n * URL, to allow instant loading to work in occasions like Netlify previews.\n *\n * @param urls - URLs\n *\n * @returns URL path parts\n */\nfunction preprocess(urls: Sitemap): Sitemap {\n if (urls.length < 2)\n return [\"\"]\n\n /* Take the first two URLs and remove everything after the last slash */\n const [root, next] = [...urls]\n .sort((a, b) => a.length - b.length)\n .map(url => url.replace(/[^/]+$/, \"\"))\n\n /* Compute common prefix */\n let index = 0\n if (root === next)\n index = root.length\n else\n while (root.charCodeAt(index) === next.charCodeAt(index))\n index++\n\n /* Remove common prefix and return in original order */\n return urls.map(url => url.replace(root.slice(0, index), \"\"))\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch the sitemap for the given base URL\n *\n * @param base - Base URL\n *\n * @returns Sitemap observable\n */\nexport function fetchSitemap(base?: URL): Observable {\n const cached = __md_get(\"__sitemap\", sessionStorage, base)\n if (cached) {\n return of(cached)\n } else {\n const config = configuration()\n return requestXML(new URL(\"sitemap.xml\", base || config.base))\n .pipe(\n map(sitemap => preprocess(getElements(\"loc\", sitemap)\n .map(node => node.textContent!)\n )),\n catchError(() => EMPTY), // @todo refactor instant loading\n defaultIfEmpty([]),\n tap(sitemap => __md_set(\"__sitemap\", sitemap, sessionStorage, base))\n )\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n bufferCount,\n catchError,\n concatMap,\n debounceTime,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n fromEvent,\n map,\n merge,\n of,\n sample,\n share,\n skip,\n skipUntil,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"~/_\"\nimport {\n Viewport,\n ViewportOffset,\n getElements,\n getOptionalElement,\n request,\n setLocation,\n setLocationHash\n} from \"~/browser\"\nimport { getComponentElement } from \"~/components\"\nimport { h } from \"~/utilities\"\n\nimport { fetchSitemap } from \"../sitemap\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * History state\n */\nexport interface HistoryState {\n url: URL /* State URL */\n offset?: ViewportOffset /* State viewport offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n document$: Subject /* Document subject */\n location$: Subject /* Location subject */\n viewport$: Observable /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up instant loading\n *\n * When fetching, theoretically, we could use `responseType: \"document\"`, but\n * since all MkDocs links are relative, we need to make sure that the current\n * location matches the document we just loaded. Otherwise any relative links\n * in the document could use the old location.\n *\n * This is the reason why we need to synchronize history events and the process\n * of fetching the document for navigation changes (except `popstate` events):\n *\n * 1. Fetch document via `XMLHTTPRequest`\n * 2. Set new location via `history.pushState`\n * 3. Parse and emit fetched document\n *\n * For `popstate` events, we must not use `history.pushState`, or the forward\n * history will be irreversibly overwritten. In case the request fails, the\n * location change is dispatched regularly.\n *\n * @param options - Options\n */\nexport function setupInstantLoading(\n { document$, location$, viewport$ }: SetupOptions\n): void {\n const config = configuration()\n if (location.protocol === \"file:\")\n return\n\n /* Disable automatic scroll restoration */\n if (\"scrollRestoration\" in history) {\n history.scrollRestoration = \"manual\"\n\n /* Hack: ensure that reloads restore viewport offset */\n fromEvent(window, \"beforeunload\")\n .subscribe(() => {\n history.scrollRestoration = \"auto\"\n })\n }\n\n /* Hack: ensure absolute favicon link to omit 404s when switching */\n const favicon = getOptionalElement(\"link[rel=icon]\")\n if (typeof favicon !== \"undefined\")\n favicon.href = favicon.href\n\n /* Intercept internal navigation */\n const push$ = fetchSitemap()\n .pipe(\n map(paths => paths.map(path => `${new URL(path, config.base)}`)),\n switchMap(urls => fromEvent(document.body, \"click\")\n .pipe(\n filter(ev => !ev.metaKey && !ev.ctrlKey),\n switchMap(ev => {\n if (ev.target instanceof Element) {\n const el = ev.target.closest(\"a\")\n if (el && !el.target) {\n const url = new URL(el.href)\n\n /* Canonicalize URL */\n url.search = \"\"\n url.hash = \"\"\n\n /* Check if URL should be intercepted */\n if (\n url.pathname !== location.pathname &&\n urls.includes(url.toString())\n ) {\n ev.preventDefault()\n return of({\n url: new URL(el.href)\n })\n }\n }\n }\n return NEVER\n })\n )\n ),\n share()\n )\n\n /* Intercept history back and forward */\n const pop$ = fromEvent(window, \"popstate\")\n .pipe(\n filter(ev => ev.state !== null),\n map(ev => ({\n url: new URL(location.href),\n offset: ev.state\n })),\n share()\n )\n\n /* Emit location change */\n merge(push$, pop$)\n .pipe(\n distinctUntilChanged((a, b) => a.url.href === b.url.href),\n map(({ url }) => url)\n )\n .subscribe(location$)\n\n /* Fetch document via `XMLHTTPRequest` */\n const response$ = location$\n .pipe(\n distinctUntilKeyChanged(\"pathname\"),\n switchMap(url => request(url.href)\n .pipe(\n catchError(() => {\n setLocation(url)\n return NEVER\n })\n )\n ),\n share()\n )\n\n /* Set new location via `history.pushState` */\n push$\n .pipe(\n sample(response$)\n )\n .subscribe(({ url }) => {\n history.pushState({}, \"\", `${url}`)\n })\n\n /* Parse and emit fetched document */\n const dom = new DOMParser()\n response$\n .pipe(\n switchMap(res => res.text()),\n map(res => dom.parseFromString(res, \"text/html\"))\n )\n .subscribe(document$)\n\n /* Replace meta tags and components */\n document$\n .pipe(\n skip(1)\n )\n .subscribe(replacement => {\n for (const selector of [\n\n /* Meta tags */\n \"title\",\n \"link[rel=canonical]\",\n \"meta[name=author]\",\n \"meta[name=description]\",\n\n /* Components */\n \"[data-md-component=announce]\",\n \"[data-md-component=container]\",\n \"[data-md-component=header-topic]\",\n \"[data-md-component=outdated]\",\n \"[data-md-component=logo]\",\n \"[data-md-component=skip]\",\n ...feature(\"navigation.tabs.sticky\")\n ? [\"[data-md-component=tabs]\"]\n : []\n ]) {\n const source = getOptionalElement(selector)\n const target = getOptionalElement(selector, replacement)\n if (\n typeof source !== \"undefined\" &&\n typeof target !== \"undefined\"\n ) {\n source.replaceWith(target)\n }\n }\n })\n\n /* Re-evaluate scripts */\n document$\n .pipe(\n skip(1),\n map(() => getComponentElement(\"container\")),\n switchMap(el => getElements(\"script\", el)),\n concatMap(el => {\n const script = h(\"script\")\n if (el.src) {\n for (const name of el.getAttributeNames())\n script.setAttribute(name, el.getAttribute(name)!)\n el.replaceWith(script)\n\n /* Complete when script is loaded */\n return new Observable(observer => {\n script.onload = () => observer.complete()\n })\n\n /* Complete immediately */\n } else {\n script.textContent = el.textContent\n el.replaceWith(script)\n return EMPTY\n }\n })\n )\n .subscribe()\n\n /* Emit history state change */\n merge(push$, pop$)\n .pipe(\n sample(document$)\n )\n .subscribe(({ url, offset }) => {\n if (url.hash && !offset) {\n setLocationHash(url.hash)\n } else {\n window.scrollTo(0, offset?.y || 0)\n }\n })\n\n /* Debounce update of viewport offset */\n viewport$\n .pipe(\n skipUntil(push$),\n debounceTime(250),\n distinctUntilKeyChanged(\"offset\")\n )\n .subscribe(({ offset }) => {\n history.replaceState(offset, \"\")\n })\n\n /* Set viewport offset from history */\n merge(push$, pop$)\n .pipe(\n bufferCount(2, 1),\n filter(([a, b]) => a.url.pathname === b.url.pathname),\n map(([, state]) => state)\n )\n .subscribe(({ offset }) => {\n window.scrollTo(0, offset?.y || 0)\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexDocument } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search document\n */\nexport interface SearchDocument extends SearchIndexDocument {\n parent?: SearchIndexDocument /* Parent article */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search document mapping\n */\nexport type SearchDocumentMap = Map\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search document mapping\n *\n * @param docs - Search index documents\n *\n * @returns Search document map\n */\nexport function setupSearchDocumentMap(\n docs: SearchIndexDocument[]\n): SearchDocumentMap {\n const documents = new Map()\n const parents = new Set()\n for (const doc of docs) {\n const [path, hash] = doc.location.split(\"#\")\n\n /* Extract location, title and tags */\n const location = doc.location\n const title = doc.title\n const tags = doc.tags\n\n /* Escape and cleanup text */\n const text = escapeHTML(doc.text)\n .replace(/\\s+(?=[,.:;!?])/g, \"\")\n .replace(/\\s+/g, \" \")\n\n /* Handle section */\n if (hash) {\n const parent = documents.get(path)!\n\n /* Ignore first section, override article */\n if (!parents.has(parent)) {\n parent.title = doc.title\n parent.text = text\n\n /* Remember that we processed the article */\n parents.add(parent)\n\n /* Add subsequent section */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n parent\n })\n }\n\n /* Add article */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n ...tags && { tags }\n })\n }\n }\n return documents\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexConfig } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search highlight function\n *\n * @param value - Value\n *\n * @returns Highlighted value\n */\nexport type SearchHighlightFn = (value: string) => string\n\n/**\n * Search highlight factory function\n *\n * @param query - Query value\n *\n * @returns Search highlight function\n */\nexport type SearchHighlightFactoryFn = (query: string) => SearchHighlightFn\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search highlighter\n *\n * @param config - Search index configuration\n * @param escape - Whether to escape HTML\n *\n * @returns Search highlight factory function\n */\nexport function setupSearchHighlighter(\n config: SearchIndexConfig, escape: boolean\n): SearchHighlightFactoryFn {\n const separator = new RegExp(config.separator, \"img\")\n const highlight = (_: unknown, data: string, term: string) => {\n return `${data}${term}`\n }\n\n /* Return factory function */\n return (query: string) => {\n query = query\n .replace(/[\\s*+\\-:~^]+/g, \" \")\n .trim()\n\n /* Create search term match expression */\n const match = new RegExp(`(^|${config.separator})(${\n query\n .replace(/[|\\\\{}()[\\]^$+*?.-]/g, \"\\\\$&\")\n .replace(separator, \"|\")\n })`, \"img\")\n\n /* Highlight string value */\n return value => (\n escape\n ? escapeHTML(value)\n : value\n )\n .replace(match, highlight)\n .replace(/<\\/mark>(\\s+)]*>/img, \"$1\")\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search transformation function\n *\n * @param value - Query value\n *\n * @returns Transformed query value\n */\nexport type SearchTransformFn = (value: string) => string\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Default transformation function\n *\n * 1. Search for terms in quotation marks and prepend a `+` modifier to denote\n * that the resulting document must contain all terms, converting the query\n * to an `AND` query (as opposed to the default `OR` behavior). While users\n * may expect terms enclosed in quotation marks to map to span queries, i.e.\n * for which order is important, Lunr.js doesn't support them, so the best\n * we can do is to convert the terms to an `AND` query.\n *\n * 2. Replace control characters which are not located at the beginning of the\n * query or preceded by white space, or are not followed by a non-whitespace\n * character or are at the end of the query string. Furthermore, filter\n * unmatched quotation marks.\n *\n * 3. Trim excess whitespace from left and right.\n *\n * @param query - Query value\n *\n * @returns Transformed query value\n */\nexport function defaultTransform(query: string): string {\n return query\n .split(/\"([^\"]+)\"/g) /* => 1 */\n .map((terms, index) => index & 1\n ? terms.replace(/^\\b|^(?![^\\x00-\\x7F]|$)|\\s+/g, \" +\")\n : terms\n )\n .join(\"\")\n .replace(/\"|(?:^|\\s+)[*+\\-:^~]+(?=\\s+|$)/g, \"\") /* => 2 */\n .trim() /* => 3 */\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A RTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { SearchIndex, SearchResult } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search message type\n */\nexport const enum SearchMessageType {\n SETUP, /* Search index setup */\n READY, /* Search index ready */\n QUERY, /* Search query */\n RESULT /* Search results */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Message containing the data necessary to setup the search index\n */\nexport interface SearchSetupMessage {\n type: SearchMessageType.SETUP /* Message type */\n data: SearchIndex /* Message data */\n}\n\n/**\n * Message indicating the search index is ready\n */\nexport interface SearchReadyMessage {\n type: SearchMessageType.READY /* Message type */\n}\n\n/**\n * Message containing a search query\n */\nexport interface SearchQueryMessage {\n type: SearchMessageType.QUERY /* Message type */\n data: string /* Message data */\n}\n\n/**\n * Message containing results for a search query\n */\nexport interface SearchResultMessage {\n type: SearchMessageType.RESULT /* Message type */\n data: SearchResult /* Message data */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Message exchanged with the search worker\n */\nexport type SearchMessage =\n | SearchSetupMessage\n | SearchReadyMessage\n | SearchQueryMessage\n | SearchResultMessage\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Type guard for search setup messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchSetupMessage(\n message: SearchMessage\n): message is SearchSetupMessage {\n return message.type === SearchMessageType.SETUP\n}\n\n/**\n * Type guard for search ready messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchReadyMessage(\n message: SearchMessage\n): message is SearchReadyMessage {\n return message.type === SearchMessageType.READY\n}\n\n/**\n * Type guard for search query messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchQueryMessage(\n message: SearchMessage\n): message is SearchQueryMessage {\n return message.type === SearchMessageType.QUERY\n}\n\n/**\n * Type guard for search result messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchResultMessage(\n message: SearchMessage\n): message is SearchResultMessage {\n return message.type === SearchMessageType.RESULT\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A RTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n ObservableInput,\n Subject,\n from,\n map,\n share\n} from \"rxjs\"\n\nimport { configuration, feature, translation } from \"~/_\"\nimport { WorkerHandler, watchWorker } from \"~/browser\"\n\nimport { SearchIndex } from \"../../_\"\nimport {\n SearchOptions,\n SearchPipeline\n} from \"../../options\"\nimport {\n SearchMessage,\n SearchMessageType,\n SearchSetupMessage,\n isSearchResultMessage\n} from \"../message\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search worker\n */\nexport type SearchWorker = WorkerHandler\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up search index\n *\n * @param data - Search index\n *\n * @returns Search index\n */\nfunction setupSearchIndex({ config, docs }: SearchIndex): SearchIndex {\n\n /* Override default language with value from translation */\n if (config.lang.length === 1 && config.lang[0] === \"en\")\n config.lang = [\n translation(\"search.config.lang\")\n ]\n\n /* Override default separator with value from translation */\n if (config.separator === \"[\\\\s\\\\-]+\")\n config.separator = translation(\"search.config.separator\")\n\n /* Set pipeline from translation */\n const pipeline = translation(\"search.config.pipeline\")\n .split(/\\s*,\\s*/)\n .filter(Boolean) as SearchPipeline\n\n /* Determine search options */\n const options: SearchOptions = {\n pipeline,\n suggestions: feature(\"search.suggest\")\n }\n\n /* Return search index after defaulting */\n return { config, docs, options }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up search worker\n *\n * This function creates a web worker to set up and query the search index,\n * which is done using Lunr.js. The index must be passed as an observable to\n * enable hacks like _localsearch_ via search index embedding as JSON.\n *\n * @param url - Worker URL\n * @param index - Search index observable input\n *\n * @returns Search worker\n */\nexport function setupSearchWorker(\n url: string, index: ObservableInput\n): SearchWorker {\n const config = configuration()\n const worker = new Worker(url)\n\n /* Create communication channels and resolve relative links */\n const tx$ = new Subject()\n const rx$ = watchWorker(worker, { tx$ })\n .pipe(\n map(message => {\n if (isSearchResultMessage(message)) {\n for (const result of message.data.items)\n for (const document of result)\n document.location = `${new URL(document.location, config.base)}`\n }\n return message\n }),\n share()\n )\n\n /* Set up search index */\n from(index)\n .pipe(\n map(data => ({\n type: SearchMessageType.SETUP,\n data: setupSearchIndex(data)\n } as SearchSetupMessage))\n )\n .subscribe(tx$.next.bind(tx$))\n\n /* Return search worker */\n return { tx$, rx$ }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Subject,\n catchError,\n combineLatest,\n filter,\n fromEvent,\n map,\n of,\n switchMap,\n withLatestFrom\n} from \"rxjs\"\n\nimport { configuration } from \"~/_\"\nimport {\n getElement,\n getLocation,\n requestJSON,\n setLocation\n} from \"~/browser\"\nimport { getComponentElements } from \"~/components\"\nimport {\n Version,\n renderVersionSelector\n} from \"~/templates\"\n\nimport { fetchSitemap } from \"../sitemap\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n document$: Subject /* Document subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up version selector\n *\n * @param options - Options\n */\nexport function setupVersionSelector(\n { document$ }: SetupOptions\n): void {\n const config = configuration()\n const versions$ = requestJSON(\n new URL(\"../versions.json\", config.base)\n )\n .pipe(\n catchError(() => EMPTY) // @todo refactor instant loading\n )\n\n /* Determine current version */\n const current$ = versions$\n .pipe(\n map(versions => {\n const [, current] = config.base.match(/([^/]+)\\/?$/)!\n return versions.find(({ version, aliases }) => (\n version === current || aliases.includes(current)\n )) || versions[0]\n })\n )\n\n /* Intercept inter-version navigation */\n versions$\n .pipe(\n map(versions => new Map(versions.map(version => [\n `${new URL(`../${version.version}/`, config.base)}`,\n version\n ]))),\n switchMap(urls => fromEvent(document.body, \"click\")\n .pipe(\n filter(ev => !ev.metaKey && !ev.ctrlKey),\n withLatestFrom(current$),\n switchMap(([ev, current]) => {\n if (ev.target instanceof Element) {\n const el = ev.target.closest(\"a\")\n if (el && !el.target && urls.has(el.href)) {\n const url = el.href\n // This is a temporary hack to detect if a version inside the\n // version selector or on another part of the site was clicked.\n // If we're inside the version selector, we definitely want to\n // find the same page, as we might have different deployments\n // due to aliases. However, if we're outside the version\n // selector, we must abort here, because we might otherwise\n // interfere with instant loading. We need to refactor this\n // at some point together with instant loading.\n //\n // See https://github.com/squidfunk/mkdocs-material/issues/4012\n if (!ev.target.closest(\".md-version\")) {\n const version = urls.get(url)!\n if (version === current)\n return EMPTY\n }\n ev.preventDefault()\n return of(url)\n }\n }\n return EMPTY\n }),\n switchMap(url => {\n const { version } = urls.get(url)!\n return fetchSitemap(new URL(url))\n .pipe(\n map(sitemap => {\n const location = getLocation()\n const path = location.href.replace(config.base, \"\")\n return sitemap.includes(path)\n ? new URL(`../${version}/${path}`, config.base)\n : new URL(url)\n })\n )\n })\n )\n )\n )\n .subscribe(url => setLocation(url))\n\n /* Render version selector and warning */\n combineLatest([versions$, current$])\n .subscribe(([versions, current]) => {\n const topic = getElement(\".md-header__topic\")\n topic.appendChild(renderVersionSelector(versions, current))\n })\n\n /* Integrate outdated version banner with instant loading */\n document$.pipe(switchMap(() => current$))\n .subscribe(current => {\n\n /* Check if version state was already determined */\n let outdated = __md_get(\"__outdated\", sessionStorage)\n if (outdated === null) {\n const latest = config.version?.default || \"latest\"\n outdated = !current.aliases.includes(latest)\n\n /* Persist version state in session storage */\n __md_set(\"__outdated\", outdated, sessionStorage)\n }\n\n /* Unhide outdated version banner */\n if (outdated)\n for (const warning of getComponentElements(\"outdated\"))\n warning.hidden = false\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n combineLatest,\n delay,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n finalize,\n fromEvent,\n map,\n merge,\n share,\n shareReplay,\n startWith,\n take,\n takeLast,\n takeUntil,\n tap\n} from \"rxjs\"\n\nimport { translation } from \"~/_\"\nimport {\n getLocation,\n setToggle,\n watchElementFocus,\n watchToggle\n} from \"~/browser\"\nimport {\n SearchMessageType,\n SearchQueryMessage,\n SearchWorker,\n defaultTransform,\n isSearchReadyMessage\n} from \"~/integrations\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search query\n */\nexport interface SearchQuery {\n value: string /* Query value */\n focus: boolean /* Query focus */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch search query\n *\n * Note that the focus event which triggers re-reading the current query value\n * is delayed by `1ms` so the input's empty state is allowed to propagate.\n *\n * @param el - Search query element\n * @param worker - Search worker\n *\n * @returns Search query observable\n */\nexport function watchSearchQuery(\n el: HTMLInputElement, { rx$ }: SearchWorker\n): Observable {\n const fn = __search?.transform || defaultTransform\n\n /* Immediately show search dialog */\n const { searchParams } = getLocation()\n if (searchParams.has(\"q\"))\n setToggle(\"search\", true)\n\n /* Intercept query parameter (deep link) */\n const param$ = rx$\n .pipe(\n filter(isSearchReadyMessage),\n take(1),\n map(() => searchParams.get(\"q\") || \"\")\n )\n\n /* Remove query parameter when search is closed */\n watchToggle(\"search\")\n .pipe(\n filter(active => !active),\n take(1)\n )\n .subscribe(() => {\n const url = new URL(location.href)\n url.searchParams.delete(\"q\")\n history.replaceState({}, \"\", `${url}`)\n })\n\n /* Set query from parameter */\n param$.subscribe(value => { // TODO: not ideal - find a better way\n if (value) {\n el.value = value\n el.focus()\n }\n })\n\n /* Intercept focus and input events */\n const focus$ = watchElementFocus(el)\n const value$ = merge(\n fromEvent(el, \"keyup\"),\n fromEvent(el, \"focus\").pipe(delay(1)),\n param$\n )\n .pipe(\n map(() => fn(el.value)),\n startWith(\"\"),\n distinctUntilChanged(),\n )\n\n /* Combine into single observable */\n return combineLatest([value$, focus$])\n .pipe(\n map(([value, focus]) => ({ value, focus })),\n shareReplay(1)\n )\n}\n\n/**\n * Mount search query\n *\n * @param el - Search query element\n * @param worker - Search worker\n *\n * @returns Search query component observable\n */\nexport function mountSearchQuery(\n el: HTMLInputElement, { tx$, rx$ }: SearchWorker\n): Observable> {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n\n /* Handle value changes */\n push$\n .pipe(\n distinctUntilKeyChanged(\"value\"),\n map(({ value }): SearchQueryMessage => ({\n type: SearchMessageType.QUERY,\n data: value\n }))\n )\n .subscribe(tx$.next.bind(tx$))\n\n /* Handle focus changes */\n push$\n .pipe(\n distinctUntilKeyChanged(\"focus\")\n )\n .subscribe(({ focus }) => {\n if (focus) {\n setToggle(\"search\", focus)\n el.placeholder = \"\"\n } else {\n el.placeholder = translation(\"search.placeholder\")\n }\n })\n\n /* Handle reset */\n fromEvent(el.form!, \"reset\")\n .pipe(\n takeUntil(done$)\n )\n .subscribe(() => el.focus())\n\n /* Create and return component */\n return watchSearchQuery(el, { tx$, rx$ })\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state })),\n share()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n filter,\n finalize,\n map,\n merge,\n of,\n skipUntil,\n switchMap,\n take,\n tap,\n withLatestFrom,\n zipWith\n} from \"rxjs\"\n\nimport { translation } from \"~/_\"\nimport {\n getElement,\n watchElementBoundary\n} from \"~/browser\"\nimport {\n SearchResult,\n SearchWorker,\n isSearchReadyMessage,\n isSearchResultMessage\n} from \"~/integrations\"\nimport { renderSearchResultItem } from \"~/templates\"\nimport { round } from \"~/utilities\"\n\nimport { Component } from \"../../_\"\nimport { SearchQuery } from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n query$: Observable /* Search query observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search result list\n *\n * This function performs a lazy rendering of the search results, depending on\n * the vertical offset of the search result container.\n *\n * @param el - Search result list element\n * @param worker - Search worker\n * @param options - Options\n *\n * @returns Search result list component observable\n */\nexport function mountSearchResult(\n el: HTMLElement, { rx$ }: SearchWorker, { query$ }: MountOptions\n): Observable> {\n const push$ = new Subject()\n const boundary$ = watchElementBoundary(el.parentElement!)\n .pipe(\n filter(Boolean)\n )\n\n /* Retrieve nested components */\n const meta = getElement(\":scope > :first-child\", el)\n const list = getElement(\":scope > :last-child\", el)\n\n /* Wait until search is ready */\n const ready$ = rx$\n .pipe(\n filter(isSearchReadyMessage),\n take(1)\n )\n\n /* Update search result metadata */\n push$\n .pipe(\n withLatestFrom(query$),\n skipUntil(ready$)\n )\n .subscribe(([{ items }, { value }]) => {\n if (value) {\n switch (items.length) {\n\n /* No results */\n case 0:\n meta.textContent = translation(\"search.result.none\")\n break\n\n /* One result */\n case 1:\n meta.textContent = translation(\"search.result.one\")\n break\n\n /* Multiple result */\n default:\n meta.textContent = translation(\n \"search.result.other\",\n round(items.length)\n )\n }\n } else {\n meta.textContent = translation(\"search.result.placeholder\")\n }\n })\n\n /* Update search result list */\n push$\n .pipe(\n tap(() => list.innerHTML = \"\"),\n switchMap(({ items }) => merge(\n of(...items.slice(0, 10)),\n of(...items.slice(10))\n .pipe(\n bufferCount(4),\n zipWith(boundary$),\n switchMap(([chunk]) => chunk)\n )\n ))\n )\n .subscribe(result => list.appendChild(\n renderSearchResultItem(result)\n ))\n\n /* Filter search result message */\n const result$ = rx$\n .pipe(\n filter(isSearchResultMessage),\n map(({ data }) => data)\n )\n\n /* Create and return component */\n return result$\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n finalize,\n fromEvent,\n map,\n tap\n} from \"rxjs\"\n\nimport { getLocation } from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { SearchQuery } from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search sharing\n */\nexport interface SearchShare {\n url: URL /* Deep link for sharing */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n query$: Observable /* Search query observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n query$: Observable /* Search query observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search sharing\n *\n * @param _el - Search sharing element\n * @param options - Options\n *\n * @returns Search sharing observable\n */\nexport function watchSearchShare(\n _el: HTMLElement, { query$ }: WatchOptions\n): Observable {\n return query$\n .pipe(\n map(({ value }) => {\n const url = getLocation()\n url.hash = \"\"\n url.searchParams.delete(\"h\")\n url.searchParams.set(\"q\", value)\n return { url }\n })\n )\n}\n\n/**\n * Mount search sharing\n *\n * @param el - Search sharing element\n * @param options - Options\n *\n * @returns Search sharing component observable\n */\nexport function mountSearchShare(\n el: HTMLAnchorElement, options: MountOptions\n): Observable> {\n const push$ = new Subject()\n push$.subscribe(({ url }) => {\n el.setAttribute(\"data-clipboard-text\", el.href)\n el.href = `${url}`\n })\n\n /* Prevent following of link */\n fromEvent(el, \"click\")\n .subscribe(ev => ev.preventDefault())\n\n /* Create and return component */\n return watchSearchShare(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n asyncScheduler,\n combineLatestWith,\n distinctUntilChanged,\n filter,\n finalize,\n fromEvent,\n map,\n merge,\n observeOn,\n tap\n} from \"rxjs\"\n\nimport { Keyboard } from \"~/browser\"\nimport {\n SearchResult,\n SearchWorker,\n isSearchResultMessage\n} from \"~/integrations\"\n\nimport { Component, getComponentElement } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search suggestions\n */\nexport interface SearchSuggest {}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n keyboard$: Observable /* Keyboard observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search suggestions\n *\n * This function will perform a lazy rendering of the search results, depending\n * on the vertical offset of the search result container.\n *\n * @param el - Search result list element\n * @param worker - Search worker\n * @param options - Options\n *\n * @returns Search result list component observable\n */\nexport function mountSearchSuggest(\n el: HTMLElement, { rx$ }: SearchWorker, { keyboard$ }: MountOptions\n): Observable> {\n const push$ = new Subject()\n\n /* Retrieve query component and track all changes */\n const query = getComponentElement(\"search-query\")\n const query$ = merge(\n fromEvent(query, \"keydown\"),\n fromEvent(query, \"focus\")\n )\n .pipe(\n observeOn(asyncScheduler),\n map(() => query.value),\n distinctUntilChanged(),\n )\n\n /* Update search suggestions */\n push$\n .pipe(\n combineLatestWith(query$),\n map(([{ suggestions }, value]) => {\n const words = value.split(/([\\s-]+)/)\n if (suggestions?.length && words[words.length - 1]) {\n const last = suggestions[suggestions.length - 1]\n if (last.startsWith(words[words.length - 1]))\n words[words.length - 1] = last\n } else {\n words.length = 0\n }\n return words\n })\n )\n .subscribe(words => el.innerHTML = words\n .join(\"\")\n .replace(/\\s/g, \" \")\n )\n\n /* Set up search keyboard handlers */\n keyboard$\n .pipe(\n filter(({ mode }) => mode === \"search\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Right arrow: accept current suggestion */\n case \"ArrowRight\":\n if (\n el.innerText.length &&\n query.selectionStart === query.value.length\n )\n query.value = el.innerText\n break\n }\n })\n\n /* Filter search result message */\n const result$ = rx$\n .pipe(\n filter(isSearchResultMessage),\n map(({ data }) => data)\n )\n\n /* Create and return component */\n return result$\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(() => ({ ref: el }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n NEVER,\n Observable,\n ObservableInput,\n filter,\n merge,\n mergeWith,\n sample,\n take\n} from \"rxjs\"\n\nimport { configuration } from \"~/_\"\nimport {\n Keyboard,\n getActiveElement,\n getElements,\n setToggle\n} from \"~/browser\"\nimport {\n SearchIndex,\n SearchResult,\n isSearchQueryMessage,\n isSearchReadyMessage,\n setupSearchWorker\n} from \"~/integrations\"\n\nimport {\n Component,\n getComponentElement,\n getComponentElements\n} from \"../../_\"\nimport {\n SearchQuery,\n mountSearchQuery\n} from \"../query\"\nimport { mountSearchResult } from \"../result\"\nimport {\n SearchShare,\n mountSearchShare\n} from \"../share\"\nimport {\n SearchSuggest,\n mountSearchSuggest\n} from \"../suggest\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search\n */\nexport type Search =\n | SearchQuery\n | SearchResult\n | SearchShare\n | SearchSuggest\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n index$: ObservableInput /* Search index observable */\n keyboard$: Observable /* Keyboard observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search\n *\n * This function sets up the search functionality, including the underlying\n * web worker and all keyboard bindings.\n *\n * @param el - Search element\n * @param options - Options\n *\n * @returns Search component observable\n */\nexport function mountSearch(\n el: HTMLElement, { index$, keyboard$ }: MountOptions\n): Observable> {\n const config = configuration()\n try {\n const url = __search?.worker || config.search\n const worker = setupSearchWorker(url, index$)\n\n /* Retrieve query and result components */\n const query = getComponentElement(\"search-query\", el)\n const result = getComponentElement(\"search-result\", el)\n\n /* Re-emit query when search is ready */\n const { tx$, rx$ } = worker\n tx$\n .pipe(\n filter(isSearchQueryMessage),\n sample(rx$.pipe(filter(isSearchReadyMessage))),\n take(1)\n )\n .subscribe(tx$.next.bind(tx$))\n\n /* Set up search keyboard handlers */\n keyboard$\n .pipe(\n filter(({ mode }) => mode === \"search\")\n )\n .subscribe(key => {\n const active = getActiveElement()\n switch (key.type) {\n\n /* Enter: go to first (best) result */\n case \"Enter\":\n if (active === query) {\n const anchors = new Map()\n for (const anchor of getElements(\n \":first-child [href]\", result\n )) {\n const article = anchor.firstElementChild!\n anchors.set(anchor, parseFloat(\n article.getAttribute(\"data-md-score\")!\n ))\n }\n\n /* Go to result with highest score, if any */\n if (anchors.size) {\n const [[best]] = [...anchors].sort(([, a], [, b]) => b - a)\n best.click()\n }\n\n /* Otherwise omit form submission */\n key.claim()\n }\n break\n\n /* Escape or Tab: close search */\n case \"Escape\":\n case \"Tab\":\n setToggle(\"search\", false)\n query.blur()\n break\n\n /* Vertical arrows: select previous or next search result */\n case \"ArrowUp\":\n case \"ArrowDown\":\n if (typeof active === \"undefined\") {\n query.focus()\n } else {\n const els = [query, ...getElements(\n \":not(details) > [href], summary, details[open] [href]\",\n result\n )]\n const i = Math.max(0, (\n Math.max(0, els.indexOf(active)) + els.length + (\n key.type === \"ArrowUp\" ? -1 : +1\n )\n ) % els.length)\n els[i].focus()\n }\n\n /* Prevent scrolling of page */\n key.claim()\n break\n\n /* All other keys: hand to search query */\n default:\n if (query !== getActiveElement())\n query.focus()\n }\n })\n\n /* Set up global keyboard handlers */\n keyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\"),\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Open search and select query */\n case \"f\":\n case \"s\":\n case \"/\":\n query.focus()\n query.select()\n\n /* Prevent scrolling of page */\n key.claim()\n break\n }\n })\n\n /* Create and return component */\n const query$ = mountSearchQuery(query, worker)\n const result$ = mountSearchResult(result, worker, { query$ })\n return merge(query$, result$)\n .pipe(\n mergeWith(\n\n /* Search sharing */\n ...getComponentElements(\"search-share\", el)\n .map(child => mountSearchShare(child, { query$ })),\n\n /* Search suggestions */\n ...getComponentElements(\"search-suggest\", el)\n .map(child => mountSearchSuggest(child, worker, { keyboard$ }))\n )\n )\n\n /* Gracefully handle broken search */\n } catch (err) {\n el.hidden = true\n return NEVER\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n ObservableInput,\n combineLatest,\n filter,\n map,\n startWith\n} from \"rxjs\"\n\nimport { getLocation } from \"~/browser\"\nimport {\n SearchIndex,\n setupSearchHighlighter\n} from \"~/integrations\"\nimport { h } from \"~/utilities\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search highlighting\n */\nexport interface SearchHighlight {\n nodes: Map /* Map of replacements */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n index$: ObservableInput /* Search index observable */\n location$: Observable /* Location observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search highlighting\n *\n * @param el - Content element\n * @param options - Options\n *\n * @returns Search highlighting component observable\n */\nexport function mountSearchHiglight(\n el: HTMLElement, { index$, location$ }: MountOptions\n): Observable> {\n return combineLatest([\n index$,\n location$\n .pipe(\n startWith(getLocation()),\n filter(url => !!url.searchParams.get(\"h\"))\n )\n ])\n .pipe(\n map(([index, url]) => setupSearchHighlighter(index.config, true)(\n url.searchParams.get(\"h\")!\n )),\n map(fn => {\n const nodes = new Map()\n\n /* Traverse text nodes and collect matches */\n const it = document.createNodeIterator(el, NodeFilter.SHOW_TEXT)\n for (let node = it.nextNode(); node; node = it.nextNode()) {\n if (node.parentElement?.offsetHeight) {\n const original = node.textContent!\n const replaced = fn(original)\n if (replaced.length > original.length)\n nodes.set(node as ChildNode, replaced)\n }\n }\n\n /* Replace original nodes with matches */\n for (const [node, text] of nodes) {\n const { childNodes } = h(\"span\", null, text)\n node.replaceWith(...Array.from(childNodes))\n }\n\n /* Return component */\n return { ref: el, nodes }\n })\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n animationFrameScheduler,\n auditTime,\n combineLatest,\n defer,\n distinctUntilChanged,\n finalize,\n map,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\nimport {\n Viewport,\n getElement,\n getElementOffset\n} from \"~/browser\"\n\nimport { Component } from \"../_\"\nimport { Header } from \"../header\"\nimport { Main } from \"../main\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Sidebar\n */\nexport interface Sidebar {\n height: number /* Sidebar height */\n locked: boolean /* Sidebar is locked */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n main$: Observable
    /* Main area observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n main$: Observable
    /* Main area observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch sidebar\n *\n * This function returns an observable that computes the visual parameters of\n * the sidebar which depends on the vertical viewport offset, as well as the\n * height of the main area. When the page is scrolled beyond the header, the\n * sidebar is locked and fills the remaining space.\n *\n * @param el - Sidebar element\n * @param options - Options\n *\n * @returns Sidebar observable\n */\nexport function watchSidebar(\n el: HTMLElement, { viewport$, main$ }: WatchOptions\n): Observable {\n const parent = el.parentElement!\n const adjust =\n parent.offsetTop -\n parent.parentElement!.offsetTop\n\n /* Compute the sidebar's available height and if it should be locked */\n return combineLatest([main$, viewport$])\n .pipe(\n map(([{ offset, height }, { offset: { y } }]) => {\n height = height\n + Math.min(adjust, Math.max(0, y - offset))\n - adjust\n return {\n height,\n locked: y >= offset + adjust\n }\n }),\n distinctUntilChanged((a, b) => (\n a.height === b.height &&\n a.locked === b.locked\n ))\n )\n}\n\n/**\n * Mount sidebar\n *\n * This function doesn't set the height of the actual sidebar, but of its first\n * child \u2013 the `.md-sidebar__scrollwrap` element in order to mitigiate jittery\n * sidebars when the footer is scrolled into view. At some point we switched\n * from `absolute` / `fixed` positioning to `sticky` positioning, significantly\n * reducing jitter in some browsers (respectively Firefox and Safari) when\n * scrolling from the top. However, top-aligned sticky positioning means that\n * the sidebar snaps to the bottom when the end of the container is reached.\n * This is what leads to the mentioned jitter, as the sidebar's height may be\n * updated too slowly.\n *\n * This behaviour can be mitigiated by setting the height of the sidebar to `0`\n * while preserving the padding, and the height on its first element.\n *\n * @param el - Sidebar element\n * @param options - Options\n *\n * @returns Sidebar component observable\n */\nexport function mountSidebar(\n el: HTMLElement, { header$, ...options }: MountOptions\n): Observable> {\n const inner = getElement(\".md-sidebar__scrollwrap\", el)\n const { y } = getElementOffset(inner)\n return defer(() => {\n const push$ = new Subject()\n push$\n .pipe(\n auditTime(0, animationFrameScheduler),\n withLatestFrom(header$)\n )\n .subscribe({\n\n /* Handle emission */\n next([{ height }, { height: offset }]) {\n inner.style.height = `${height - 2 * y}px`\n el.style.top = `${offset}px`\n },\n\n /* Handle complete */\n complete() {\n inner.style.height = \"\"\n el.style.top = \"\"\n }\n })\n\n /* Create and return component */\n return watchSidebar(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Repo, User } from \"github-types\"\nimport {\n EMPTY,\n Observable,\n catchError,\n defaultIfEmpty,\n map,\n zip\n} from \"rxjs\"\n\nimport { requestJSON } from \"~/browser\"\n\nimport { SourceFacts } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * GitHub release (partial)\n */\ninterface Release {\n tag_name: string /* Tag name */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch GitHub repository facts\n *\n * @param user - GitHub user or organization\n * @param repo - GitHub repository\n *\n * @returns Repository facts observable\n */\nexport function fetchSourceFactsFromGitHub(\n user: string, repo?: string\n): Observable {\n if (typeof repo !== \"undefined\") {\n const url = `https://api.github.com/repos/${user}/${repo}`\n return zip(\n\n /* Fetch version */\n requestJSON(`${url}/releases/latest`)\n .pipe(\n catchError(() => EMPTY), // @todo refactor instant loading\n map(release => ({\n version: release.tag_name\n })),\n defaultIfEmpty({})\n ),\n\n /* Fetch stars and forks */\n requestJSON(url)\n .pipe(\n catchError(() => EMPTY), // @todo refactor instant loading\n map(info => ({\n stars: info.stargazers_count,\n forks: info.forks_count\n })),\n defaultIfEmpty({})\n )\n )\n .pipe(\n map(([release, info]) => ({ ...release, ...info }))\n )\n\n /* User or organization */\n } else {\n const url = `https://api.github.com/users/${user}`\n return requestJSON(url)\n .pipe(\n map(info => ({\n repositories: info.public_repos\n })),\n defaultIfEmpty({})\n )\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ProjectSchema } from \"gitlab\"\nimport {\n EMPTY,\n Observable,\n catchError,\n defaultIfEmpty,\n map\n} from \"rxjs\"\n\nimport { requestJSON } from \"~/browser\"\n\nimport { SourceFacts } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch GitLab repository facts\n *\n * @param base - GitLab base\n * @param project - GitLab project\n *\n * @returns Repository facts observable\n */\nexport function fetchSourceFactsFromGitLab(\n base: string, project: string\n): Observable {\n const url = `https://${base}/api/v4/projects/${encodeURIComponent(project)}`\n return requestJSON(url)\n .pipe(\n catchError(() => EMPTY), // @todo refactor instant loading\n map(({ star_count, forks_count }) => ({\n stars: star_count,\n forks: forks_count\n })),\n defaultIfEmpty({})\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { EMPTY, Observable } from \"rxjs\"\n\nimport { fetchSourceFactsFromGitHub } from \"../github\"\nimport { fetchSourceFactsFromGitLab } from \"../gitlab\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Repository facts for repositories\n */\nexport interface RepositoryFacts {\n stars?: number /* Number of stars */\n forks?: number /* Number of forks */\n version?: string /* Latest version */\n}\n\n/**\n * Repository facts for organizations\n */\nexport interface OrganizationFacts {\n repositories?: number /* Number of repositories */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Repository facts\n */\nexport type SourceFacts =\n | RepositoryFacts\n | OrganizationFacts\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch repository facts\n *\n * @param url - Repository URL\n *\n * @returns Repository facts observable\n */\nexport function fetchSourceFacts(\n url: string\n): Observable {\n const [type] = url.match(/(git(?:hub|lab))/i) || []\n switch (type.toLowerCase()) {\n\n /* GitHub repository */\n case \"github\":\n const [, user, repo] = url.match(/^.+github\\.com\\/([^/]+)\\/?([^/]+)?/i)!\n return fetchSourceFactsFromGitHub(user, repo)\n\n /* GitLab repository */\n case \"gitlab\":\n const [, base, slug] = url.match(/^.+?([^/]*gitlab[^/]+)\\/(.+?)\\/?$/i)!\n return fetchSourceFactsFromGitLab(base, slug)\n\n /* Everything else */\n default:\n return EMPTY\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n catchError,\n defer,\n filter,\n finalize,\n map,\n of,\n shareReplay,\n tap\n} from \"rxjs\"\n\nimport { getElement } from \"~/browser\"\nimport { renderSourceFacts } from \"~/templates\"\n\nimport { Component } from \"../../_\"\nimport {\n SourceFacts,\n fetchSourceFacts\n} from \"../facts\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Repository information\n */\nexport interface Source {\n facts: SourceFacts /* Repository facts */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Repository information observable\n */\nlet fetch$: Observable\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch repository information\n *\n * This function tries to read the repository facts from session storage, and\n * if unsuccessful, fetches them from the underlying provider.\n *\n * @param el - Repository information element\n *\n * @returns Repository information observable\n */\nexport function watchSource(\n el: HTMLAnchorElement\n): Observable {\n return fetch$ ||= defer(() => {\n const cached = __md_get(\"__source\", sessionStorage)\n if (cached)\n return of(cached)\n else\n return fetchSourceFacts(el.href)\n .pipe(\n tap(facts => __md_set(\"__source\", facts, sessionStorage))\n )\n })\n .pipe(\n catchError(() => EMPTY),\n filter(facts => Object.keys(facts).length > 0),\n map(facts => ({ facts })),\n shareReplay(1)\n )\n}\n\n/**\n * Mount repository information\n *\n * @param el - Repository information element\n *\n * @returns Repository information component observable\n */\nexport function mountSource(\n el: HTMLAnchorElement\n): Observable> {\n const inner = getElement(\":scope > :last-child\", el)\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ facts }) => {\n inner.appendChild(renderSourceFacts(facts))\n inner.classList.add(\"md-source__repository--active\")\n })\n\n /* Create and return component */\n return watchSource(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n defer,\n distinctUntilKeyChanged,\n finalize,\n map,\n of,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n Viewport,\n watchElementSize,\n watchViewportAt\n} from \"~/browser\"\n\nimport { Component } from \"../_\"\nimport { Header } from \"../header\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Navigation tabs\n */\nexport interface Tabs {\n hidden: boolean /* Navigation tabs are hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch navigation tabs\n *\n * @param el - Navigation tabs element\n * @param options - Options\n *\n * @returns Navigation tabs observable\n */\nexport function watchTabs(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n return watchElementSize(document.body)\n .pipe(\n switchMap(() => watchViewportAt(el, { header$, viewport$ })),\n map(({ offset: { y } }) => {\n return {\n hidden: y >= 10\n }\n }),\n distinctUntilKeyChanged(\"hidden\")\n )\n}\n\n/**\n * Mount navigation tabs\n *\n * This function hides the navigation tabs when scrolling past the threshold\n * and makes them reappear in a nice CSS animation when scrolling back up.\n *\n * @param el - Navigation tabs element\n * @param options - Options\n *\n * @returns Navigation tabs component observable\n */\nexport function mountTabs(\n el: HTMLElement, options: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe({\n\n /* Handle emission */\n next({ hidden }) {\n el.hidden = hidden\n },\n\n /* Handle complete */\n complete() {\n el.hidden = false\n }\n })\n\n /* Create and return component */\n return (\n feature(\"navigation.tabs.sticky\")\n ? of({ hidden: false })\n : watchTabs(el, options)\n )\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n combineLatestWith,\n debounceTime,\n defer,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n finalize,\n map,\n of,\n repeat,\n scan,\n share,\n skip,\n startWith,\n switchMap,\n takeLast,\n takeUntil,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n Viewport,\n getElement,\n getElements,\n getLocation,\n getOptionalElement,\n watchElementSize\n} from \"~/browser\"\n\nimport {\n Component,\n getComponentElement\n} from \"../_\"\nimport { Header } from \"../header\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Table of contents\n */\nexport interface TableOfContents {\n prev: HTMLAnchorElement[][] /* Anchors (previous) */\n next: HTMLAnchorElement[][] /* Anchors (next) */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n target$: Observable /* Location target observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch table of contents\n *\n * This is effectively a scroll spy implementation which will account for the\n * fixed header and automatically re-calculate anchor offsets when the viewport\n * is resized. The returned observable will only emit if the table of contents\n * needs to be repainted.\n *\n * This implementation tracks an anchor element's entire path starting from its\n * level up to the top-most anchor element, e.g. `[h3, h2, h1]`. Although the\n * Material theme currently doesn't make use of this information, it enables\n * the styling of the entire hierarchy through customization.\n *\n * Note that the current anchor is the last item of the `prev` anchor list.\n *\n * @param el - Table of contents element\n * @param options - Options\n *\n * @returns Table of contents observable\n */\nexport function watchTableOfContents(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n const table = new Map()\n\n /* Compute anchor-to-target mapping */\n const anchors = getElements(\"[href^=\\\\#]\", el)\n for (const anchor of anchors) {\n const id = decodeURIComponent(anchor.hash.substring(1))\n const target = getOptionalElement(`[id=\"${id}\"]`)\n if (typeof target !== \"undefined\")\n table.set(anchor, target)\n }\n\n /* Compute necessary adjustment for header */\n const adjust$ = header$\n .pipe(\n distinctUntilKeyChanged(\"height\"),\n map(({ height }) => {\n const main = getComponentElement(\"main\")\n const grid = getElement(\":scope > :first-child\", main)\n return height + 0.8 * (\n grid.offsetTop -\n main.offsetTop\n )\n }),\n share()\n )\n\n /* Compute partition of previous and next anchors */\n const partition$ = watchElementSize(document.body)\n .pipe(\n distinctUntilKeyChanged(\"height\"),\n\n /* Build index to map anchor paths to vertical offsets */\n switchMap(body => defer(() => {\n let path: HTMLAnchorElement[] = []\n return of([...table].reduce((index, [anchor, target]) => {\n while (path.length) {\n const last = table.get(path[path.length - 1])!\n if (last.tagName >= target.tagName) {\n path.pop()\n } else {\n break\n }\n }\n\n /* If the current anchor is hidden, continue with its parent */\n let offset = target.offsetTop\n while (!offset && target.parentElement) {\n target = target.parentElement\n offset = target.offsetTop\n }\n\n /* Map reversed anchor path to vertical offset */\n return index.set(\n [...path = [...path, anchor]].reverse(),\n offset\n )\n }, new Map()))\n })\n .pipe(\n\n /* Sort index by vertical offset (see https://bit.ly/30z6QSO) */\n map(index => new Map([...index].sort(([, a], [, b]) => a - b))),\n combineLatestWith(adjust$),\n\n /* Re-compute partition when viewport offset changes */\n switchMap(([index, adjust]) => viewport$\n .pipe(\n scan(([prev, next], { offset: { y }, size }) => {\n const last = y + size.height >= Math.floor(body.height)\n\n /* Look forward */\n while (next.length) {\n const [, offset] = next[0]\n if (offset - adjust < y || last) {\n prev = [...prev, next.shift()!]\n } else {\n break\n }\n }\n\n /* Look backward */\n while (prev.length) {\n const [, offset] = prev[prev.length - 1]\n if (offset - adjust >= y && !last) {\n next = [prev.pop()!, ...next]\n } else {\n break\n }\n }\n\n /* Return partition */\n return [prev, next]\n }, [[], [...index]]),\n distinctUntilChanged((a, b) => (\n a[0] === b[0] &&\n a[1] === b[1]\n ))\n )\n )\n )\n )\n )\n\n /* Compute and return anchor list migrations */\n return partition$\n .pipe(\n map(([prev, next]) => ({\n prev: prev.map(([path]) => path),\n next: next.map(([path]) => path)\n })),\n\n /* Extract anchor list migrations */\n startWith({ prev: [], next: [] }),\n bufferCount(2, 1),\n map(([a, b]) => {\n\n /* Moving down */\n if (a.prev.length < b.prev.length) {\n return {\n prev: b.prev.slice(Math.max(0, a.prev.length - 1), b.prev.length),\n next: []\n }\n\n /* Moving up */\n } else {\n return {\n prev: b.prev.slice(-1),\n next: b.next.slice(0, b.next.length - a.next.length)\n }\n }\n })\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Mount table of contents\n *\n * @param el - Table of contents element\n * @param options - Options\n *\n * @returns Table of contents component observable\n */\nexport function mountTableOfContents(\n el: HTMLElement, { viewport$, header$, target$ }: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n push$.subscribe(({ prev, next }) => {\n\n /* Look forward */\n for (const [anchor] of next) {\n anchor.classList.remove(\"md-nav__link--passed\")\n anchor.classList.remove(\"md-nav__link--active\")\n }\n\n /* Look backward */\n for (const [index, [anchor]] of prev.entries()) {\n anchor.classList.add(\"md-nav__link--passed\")\n anchor.classList.toggle(\n \"md-nav__link--active\",\n index === prev.length - 1\n )\n }\n })\n\n /* Set up anchor tracking, if enabled */\n if (feature(\"navigation.tracking\"))\n viewport$\n .pipe(\n takeUntil(done$),\n distinctUntilKeyChanged(\"offset\"),\n debounceTime(250),\n skip(1),\n takeUntil(target$.pipe(skip(1))),\n repeat({ delay: 250 }),\n withLatestFrom(push$)\n )\n .subscribe(([, { prev }]) => {\n const url = getLocation()\n\n /* Set hash fragment to active anchor */\n const anchor = prev[prev.length - 1]\n if (anchor && anchor.length) {\n const [active] = anchor\n const { hash } = new URL(active.href)\n if (url.hash !== hash) {\n url.hash = hash\n history.replaceState({}, \"\", `${url}`)\n }\n\n /* Reset anchor when at the top */\n } else {\n url.hash = \"\"\n history.replaceState({}, \"\", `${url}`)\n }\n })\n\n /* Create and return component */\n return watchTableOfContents(el, { viewport$, header$ })\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n combineLatest,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n endWith,\n finalize,\n map,\n repeat,\n skip,\n takeLast,\n takeUntil,\n tap\n} from \"rxjs\"\n\nimport { Viewport } from \"~/browser\"\n\nimport { Component } from \"../_\"\nimport { Header } from \"../header\"\nimport { Main } from \"../main\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Back-to-top button\n */\nexport interface BackToTop {\n hidden: boolean /* Back-to-top button is hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n main$: Observable
    /* Main area observable */\n target$: Observable /* Location target observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n main$: Observable
    /* Main area observable */\n target$: Observable /* Location target observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch back-to-top\n *\n * @param _el - Back-to-top element\n * @param options - Options\n *\n * @returns Back-to-top observable\n */\nexport function watchBackToTop(\n _el: HTMLElement, { viewport$, main$, target$ }: WatchOptions\n): Observable {\n\n /* Compute direction */\n const direction$ = viewport$\n .pipe(\n map(({ offset: { y } }) => y),\n bufferCount(2, 1),\n map(([a, b]) => a > b && b > 0),\n distinctUntilChanged()\n )\n\n /* Compute whether main area is active */\n const active$ = main$\n .pipe(\n map(({ active }) => active)\n )\n\n /* Compute threshold for hiding */\n return combineLatest([active$, direction$])\n .pipe(\n map(([active, direction]) => !(active && direction)),\n distinctUntilChanged(),\n takeUntil(target$.pipe(skip(1))),\n endWith(true),\n repeat({ delay: 250 }),\n map(hidden => ({ hidden }))\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Mount back-to-top\n *\n * @param el - Back-to-top element\n * @param options - Options\n *\n * @returns Back-to-top component observable\n */\nexport function mountBackToTop(\n el: HTMLElement, { viewport$, header$, main$, target$ }: MountOptions\n): Observable> {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n push$.subscribe({\n\n /* Handle emission */\n next({ hidden }) {\n el.hidden = hidden\n if (hidden) {\n el.setAttribute(\"tabindex\", \"-1\")\n el.blur()\n } else {\n el.removeAttribute(\"tabindex\")\n }\n },\n\n /* Handle complete */\n complete() {\n el.style.top = \"\"\n el.hidden = true\n el.removeAttribute(\"tabindex\")\n }\n })\n\n /* Watch header height */\n header$\n .pipe(\n takeUntil(done$),\n distinctUntilKeyChanged(\"height\")\n )\n .subscribe(({ height }) => {\n el.style.top = `${height + 16}px`\n })\n\n /* Create and return component */\n return watchBackToTop(el, { viewport$, main$, target$ })\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n mergeMap,\n switchMap,\n takeWhile,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\nimport { getElements } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n document$: Observable /* Document observable */\n tablet$: Observable /* Media tablet observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch indeterminate checkboxes\n *\n * This function replaces the indeterminate \"pseudo state\" with the actual\n * indeterminate state, which is used to keep navigation always expanded.\n *\n * @param options - Options\n */\nexport function patchIndeterminate(\n { document$, tablet$ }: PatchOptions\n): void {\n document$\n .pipe(\n switchMap(() => getElements(\n // @todo `data-md-state` is deprecated and removed in v9\n \".md-toggle--indeterminate, [data-md-state=indeterminate]\"\n )),\n tap(el => {\n el.indeterminate = true\n el.checked = false\n }),\n mergeMap(el => fromEvent(el, \"change\")\n .pipe(\n takeWhile(() => el.classList.contains(\"md-toggle--indeterminate\")),\n map(() => el)\n )\n ),\n withLatestFrom(tablet$)\n )\n .subscribe(([el, tablet]) => {\n el.classList.remove(\"md-toggle--indeterminate\")\n if (tablet)\n el.checked = false\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n filter,\n fromEvent,\n map,\n mergeMap,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport { getElements } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n document$: Observable /* Document observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Check whether the given device is an Apple device\n *\n * @returns Test result\n */\nfunction isAppleDevice(): boolean {\n return /(iPad|iPhone|iPod)/.test(navigator.userAgent)\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch all elements with `data-md-scrollfix` attributes\n *\n * This is a year-old patch which ensures that overflow scrolling works at the\n * top and bottom of containers on iOS by ensuring a `1px` scroll offset upon\n * the start of a touch event.\n *\n * @see https://bit.ly/2SCtAOO - Original source\n *\n * @param options - Options\n */\nexport function patchScrollfix(\n { document$ }: PatchOptions\n): void {\n document$\n .pipe(\n switchMap(() => getElements(\"[data-md-scrollfix]\")),\n tap(el => el.removeAttribute(\"data-md-scrollfix\")),\n filter(isAppleDevice),\n mergeMap(el => fromEvent(el, \"touchstart\")\n .pipe(\n map(() => el)\n )\n )\n )\n .subscribe(el => {\n const top = el.scrollTop\n\n /* We're at the top of the container */\n if (top === 0) {\n el.scrollTop = 1\n\n /* We're at the bottom of the container */\n } else if (top + el.offsetHeight === el.scrollHeight) {\n el.scrollTop = top - 1\n }\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n delay,\n map,\n of,\n switchMap,\n withLatestFrom\n} from \"rxjs\"\n\nimport {\n Viewport,\n watchToggle\n} from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n viewport$: Observable /* Viewport observable */\n tablet$: Observable /* Media tablet observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch the document body to lock when search is open\n *\n * For mobile and tablet viewports, the search is rendered full screen, which\n * leads to scroll leaking when at the top or bottom of the search result. This\n * function locks the body when the search is in full screen mode, and restores\n * the scroll position when leaving.\n *\n * @param options - Options\n */\nexport function patchScrolllock(\n { viewport$, tablet$ }: PatchOptions\n): void {\n combineLatest([watchToggle(\"search\"), tablet$])\n .pipe(\n map(([active, tablet]) => active && !tablet),\n switchMap(active => of(active)\n .pipe(\n delay(active ? 400 : 100)\n )\n ),\n withLatestFrom(viewport$)\n )\n .subscribe(([active, { offset: { y }}]) => {\n if (active) {\n document.body.setAttribute(\"data-md-scrolllock\", \"\")\n document.body.style.top = `-${y}px`\n } else {\n const value = -1 * parseInt(document.body.style.top, 10)\n document.body.removeAttribute(\"data-md-scrolllock\")\n document.body.style.top = \"\"\n if (value)\n window.scrollTo(0, value)\n }\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Polyfills\n * ------------------------------------------------------------------------- */\n\n/* Polyfill `Object.entries` */\nif (!Object.entries)\n Object.entries = function (obj: object) {\n const data: [string, string][] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push([key, obj[key]])\n\n /* Return entries */\n return data\n }\n\n/* Polyfill `Object.values` */\nif (!Object.values)\n Object.values = function (obj: object) {\n const data: string[] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push(obj[key])\n\n /* Return values */\n return data\n }\n\n/* ------------------------------------------------------------------------- */\n\n/* Polyfills for `Element` */\nif (typeof Element !== \"undefined\") {\n\n /* Polyfill `Element.scrollTo` */\n if (!Element.prototype.scrollTo)\n Element.prototype.scrollTo = function (\n x?: ScrollToOptions | number, y?: number\n ): void {\n if (typeof x === \"object\") {\n this.scrollLeft = x.left!\n this.scrollTop = x.top!\n } else {\n this.scrollLeft = x!\n this.scrollTop = y!\n }\n }\n\n /* Polyfill `Element.replaceWith` */\n if (!Element.prototype.replaceWith)\n Element.prototype.replaceWith = function (\n ...nodes: Array\n ): void {\n const parent = this.parentNode\n if (parent) {\n if (nodes.length === 0)\n parent.removeChild(this)\n\n /* Replace children and create text nodes */\n for (let i = nodes.length - 1; i >= 0; i--) {\n let node = nodes[i]\n if (typeof node !== \"object\")\n node = document.createTextNode(node)\n else if (node.parentNode)\n node.parentNode.removeChild(node)\n\n /* Replace child or insert before previous sibling */\n if (!i)\n parent.replaceChild(node, this)\n else\n parent.insertBefore(this.previousSibling!, node)\n }\n }\n }\n}\n"], + "mappings": "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", + "names": ["require_focus_visible", "__commonJSMin", "exports", "module", "global", "factory", "applyFocusVisiblePolyfill", "scope", "hadKeyboardEvent", "hadFocusVisibleRecently", "hadFocusVisibleRecentlyTimeout", "inputTypesAllowlist", "isValidFocusTarget", "el", "focusTriggersKeyboardModality", "type", "tagName", "addFocusVisibleClass", "removeFocusVisibleClass", "onKeyDown", "e", "onPointerDown", "onFocus", "onBlur", "onVisibilityChange", "addInitialPointerMoveListeners", "onInitialPointerMove", "removeInitialPointerMoveListeners", "event", "error", "require_url_polyfill", "__commonJSMin", "exports", "global", "checkIfIteratorIsSupported", "error", "iteratorSupported", "createIterator", "items", "iterator", "value", "serializeParam", "deserializeParam", "polyfillURLSearchParams", "URLSearchParams", "searchString", "typeofSearchString", "_this", "name", "i", "entry", "key", "proto", "callback", "thisArg", "entries", "searchArray", "checkIfURLSearchParamsSupported", "e", "a", "b", "keys", "attributes", "attribute", "checkIfURLIsSupported", "u", "polyfillURL", "_URL", "URL", "url", "base", "doc", "baseElement", "err", "anchorElement", "inputElement", "searchParams", "enableSearchUpdate", "enableSearchParamsUpdate", "methodName", "method", "search", "linkURLWithAnchorAttribute", "attributeName", "expectedPort", "addPortToOrigin", "blob", "getOrigin", "require_tslib", "__commonJSMin", "exports", "module", "__extends", "__assign", "__rest", "__decorate", "__param", "__metadata", "__awaiter", "__generator", "__exportStar", "__values", "__read", "__spread", "__spreadArrays", "__spreadArray", "__await", "__asyncGenerator", "__asyncDelegator", "__asyncValues", "__makeTemplateObject", "__importStar", "__importDefault", "__classPrivateFieldGet", "__classPrivateFieldSet", "__createBinding", "factory", "root", "createExporter", "previous", "id", "v", "exporter", "extendStatics", "d", "b", "p", "__", "t", "s", "n", "e", "i", "decorators", "target", "key", "desc", "c", "r", "paramIndex", "decorator", "metadataKey", "metadataValue", "thisArg", "_arguments", "P", "generator", "adopt", "value", "resolve", "reject", "fulfilled", "step", "rejected", "result", "body", "_", "f", "y", "g", "verb", "op", "m", "o", "k", "k2", "ar", "error", "il", "a", "j", "jl", "to", "from", "pack", "l", "q", "resume", "settle", "fulfill", "cooked", "raw", "__setModuleDefault", "mod", "receiver", "state", "kind", "require_clipboard", "__commonJSMin", "exports", "module", "root", "factory", "__webpack_modules__", "__unused_webpack_module", "__webpack_exports__", "__webpack_require__", "clipboard", "tiny_emitter", "tiny_emitter_default", "listen", "listen_default", "src_select", "select_default", "command", "type", "err", "ClipboardActionCut", "target", "selectedText", "actions_cut", "createFakeElement", "value", "isRTL", "fakeElement", "yPosition", "fakeCopyAction", "options", "ClipboardActionCopy", "actions_copy", "_typeof", "obj", "ClipboardActionDefault", "_options$action", "action", "container", "text", "actions_default", "clipboard_typeof", "_classCallCheck", "instance", "Constructor", "_defineProperties", "props", "i", "descriptor", "_createClass", "protoProps", "staticProps", "_inherits", "subClass", "superClass", "_setPrototypeOf", "o", "p", "_createSuper", "Derived", "hasNativeReflectConstruct", "_isNativeReflectConstruct", "Super", "_getPrototypeOf", "result", "NewTarget", "_possibleConstructorReturn", "self", "call", "_assertThisInitialized", "e", "getAttributeValue", "suffix", "element", "attribute", "Clipboard", "_Emitter", "_super", "trigger", "_this", "_this2", "selector", "actions", "support", "DOCUMENT_NODE_TYPE", "proto", "closest", "__unused_webpack_exports", "_delegate", "callback", "useCapture", "listenerFn", "listener", "delegate", "elements", "is", "listenNode", "listenNodeList", "listenSelector", "node", "nodeList", "select", "isReadOnly", "selection", "range", "E", "name", "ctx", "data", "evtArr", "len", "evts", "liveEvents", "__webpack_module_cache__", "moduleId", "getter", "definition", "key", "prop", "require_escape_html", "__commonJSMin", "exports", "module", "matchHtmlRegExp", "escapeHtml", "string", "str", "match", "escape", "html", "index", "lastIndex", "r", "a", "e", "import_focus_visible", "n", "t", "s", "r", "o", "u", "i", "a", "e", "c", "import_url_polyfill", "import_tslib", "__extends", "__assign", "__rest", "__decorate", "__param", "__metadata", "__awaiter", "__generator", "__exportStar", "__createBinding", "__values", "__read", "__spread", "__spreadArrays", "__spreadArray", "__await", "__asyncGenerator", "__asyncDelegator", "__asyncValues", "__makeTemplateObject", "__importStar", "__importDefault", "__classPrivateFieldGet", "__classPrivateFieldSet", "tslib", "isFunction", "value", "createErrorClass", "createImpl", "_super", "instance", "ctorFunc", "UnsubscriptionError", "createErrorClass", "_super", "errors", "err", "i", "arrRemove", "arr", "item", "index", "Subscription", "initialTeardown", "errors", "_parentage", "_parentage_1", "__values", "_parentage_1_1", "parent_1", "initialFinalizer", "isFunction", "e", "UnsubscriptionError", "_finalizers", "_finalizers_1", "_finalizers_1_1", "finalizer", "execFinalizer", "err", "__spreadArray", "__read", "teardown", "_a", "parent", "arrRemove", "empty", "EMPTY_SUBSCRIPTION", "Subscription", "isSubscription", "value", "isFunction", "execFinalizer", "finalizer", "config", "timeoutProvider", "handler", "timeout", "args", "_i", "delegate", "__spreadArray", "__read", "handle", "reportUnhandledError", "err", "timeoutProvider", "onUnhandledError", "config", "noop", "COMPLETE_NOTIFICATION", "createNotification", "errorNotification", "error", "nextNotification", "value", "kind", "context", "errorContext", "cb", "config", "isRoot", "_a", "errorThrown", "error", "captureError", "err", "Subscriber", "_super", "__extends", "destination", "_this", "isSubscription", "EMPTY_OBSERVER", "next", "error", "complete", "SafeSubscriber", "value", "handleStoppedNotification", "nextNotification", "err", "errorNotification", "COMPLETE_NOTIFICATION", "Subscription", "_bind", "bind", "fn", "thisArg", "ConsumerObserver", "partialObserver", "value", "error", "handleUnhandledError", "err", "SafeSubscriber", "_super", "__extends", "observerOrNext", "complete", "_this", "isFunction", "context_1", "config", "Subscriber", "handleUnhandledError", "error", "config", "captureError", "reportUnhandledError", "defaultErrorHandler", "err", "handleStoppedNotification", "notification", "subscriber", "onStoppedNotification", "timeoutProvider", "EMPTY_OBSERVER", "noop", "observable", "identity", "x", "pipe", "fns", "_i", "pipeFromArray", "identity", "input", "prev", "fn", "Observable", "subscribe", "operator", "observable", "observerOrNext", "error", "complete", "_this", "subscriber", "isSubscriber", "SafeSubscriber", "errorContext", "_a", "source", "sink", "err", "next", "promiseCtor", "getPromiseCtor", "resolve", "reject", "value", "operations", "_i", "pipeFromArray", "x", "getPromiseCtor", "promiseCtor", "_a", "config", "isObserver", "value", "isFunction", "isSubscriber", "Subscriber", "isSubscription", "hasLift", "source", "isFunction", "operate", "init", "liftedSource", "err", "createOperatorSubscriber", "destination", "onNext", "onComplete", "onError", "onFinalize", "OperatorSubscriber", "_super", "__extends", "shouldUnsubscribe", "_this", "value", "err", "closed_1", "_a", "Subscriber", "animationFrameProvider", "callback", "request", "cancel", "delegate", "handle", "timestamp", "Subscription", "args", "_i", "__spreadArray", "__read", "ObjectUnsubscribedError", "createErrorClass", "_super", "Subject", "_super", "__extends", "_this", "operator", "subject", "AnonymousSubject", "ObjectUnsubscribedError", "value", "errorContext", "_b", "__values", "_c", "observer", "err", "observers", "_a", "subscriber", "hasError", "isStopped", "EMPTY_SUBSCRIPTION", "Subscription", "arrRemove", "thrownError", "observable", "Observable", "destination", "source", "AnonymousSubject", "_super", "__extends", "destination", "source", "_this", "value", "_b", "_a", "err", "subscriber", "EMPTY_SUBSCRIPTION", "Subject", "dateTimestampProvider", "ReplaySubject", "_super", "__extends", "_bufferSize", "_windowTime", "_timestampProvider", "dateTimestampProvider", "_this", "value", "_a", "isStopped", "_buffer", "_infiniteTimeWindow", "subscriber", "subscription", "copy", "i", "adjustedBufferSize", "now", "last", "Subject", "Action", "_super", "__extends", "scheduler", "work", "state", "delay", "Subscription", "intervalProvider", "handler", "timeout", "args", "_i", "delegate", "__spreadArray", "__read", "handle", "AsyncAction", "_super", "__extends", "scheduler", "work", "_this", "state", "delay", "id", "_id", "intervalProvider", "_scheduler", "error", "_delay", "errored", "errorValue", "e", "_a", "actions", "arrRemove", "Action", "Scheduler", "schedulerActionCtor", "now", "work", "delay", "state", "dateTimestampProvider", "AsyncScheduler", "_super", "__extends", "SchedulerAction", "now", "Scheduler", "_this", "action", "actions", "error", "asyncScheduler", "AsyncScheduler", "AsyncAction", "async", "AnimationFrameAction", "_super", "__extends", "scheduler", "work", "_this", "id", "delay", "animationFrameProvider", "action", "AsyncAction", "AnimationFrameScheduler", "_super", "__extends", "action", "flushId", "actions", "error", "AsyncScheduler", "animationFrameScheduler", "AnimationFrameScheduler", "AnimationFrameAction", "EMPTY", "Observable", "subscriber", "isScheduler", "value", "isFunction", "last", "arr", "popResultSelector", "args", "isFunction", "popScheduler", "isScheduler", "popNumber", "defaultValue", "isArrayLike", "x", "isPromise", "value", "isFunction", "isInteropObservable", "input", "isFunction", "observable", "isAsyncIterable", "obj", "isFunction", "createInvalidObservableTypeError", "input", "getSymbolIterator", "iterator", "isIterable", "input", "isFunction", "iterator", "readableStreamLikeToAsyncGenerator", "readableStream", "reader", "__await", "_a", "_b", "value", "done", "isReadableStreamLike", "obj", "isFunction", "innerFrom", "input", "Observable", "isInteropObservable", "fromInteropObservable", "isArrayLike", "fromArrayLike", "isPromise", "fromPromise", "isAsyncIterable", "fromAsyncIterable", "isIterable", "fromIterable", "isReadableStreamLike", "fromReadableStreamLike", "createInvalidObservableTypeError", "obj", "subscriber", "obs", "observable", "isFunction", "array", "i", "promise", "value", "err", "reportUnhandledError", "iterable", "iterable_1", "__values", "iterable_1_1", "asyncIterable", "process", "readableStream", "readableStreamLikeToAsyncGenerator", "asyncIterable_1", "__asyncValues", "asyncIterable_1_1", "executeSchedule", "parentSubscription", "scheduler", "work", "delay", "repeat", "scheduleSubscription", "observeOn", "scheduler", "delay", "operate", "source", "subscriber", "createOperatorSubscriber", "value", "executeSchedule", "err", "subscribeOn", "scheduler", "delay", "operate", "source", "subscriber", "scheduleObservable", "input", "scheduler", "innerFrom", "subscribeOn", "observeOn", "schedulePromise", "input", "scheduler", "innerFrom", "subscribeOn", "observeOn", "scheduleArray", "input", "scheduler", "Observable", "subscriber", "i", "scheduleIterable", "input", "scheduler", "Observable", "subscriber", "iterator", "executeSchedule", "value", "done", "_a", "err", "isFunction", "scheduleAsyncIterable", "input", "scheduler", "Observable", "subscriber", "executeSchedule", "iterator", "result", "scheduleReadableStreamLike", "input", "scheduler", "scheduleAsyncIterable", "readableStreamLikeToAsyncGenerator", "scheduled", "input", "scheduler", "isInteropObservable", "scheduleObservable", "isArrayLike", "scheduleArray", "isPromise", "schedulePromise", "isAsyncIterable", "scheduleAsyncIterable", "isIterable", "scheduleIterable", "isReadableStreamLike", "scheduleReadableStreamLike", "createInvalidObservableTypeError", "from", "input", "scheduler", "scheduled", "innerFrom", "of", "args", "_i", "scheduler", "popScheduler", "from", "throwError", "errorOrErrorFactory", "scheduler", "errorFactory", "isFunction", "init", "subscriber", "Observable", "isValidDate", "value", "map", "project", "thisArg", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "isArray", "callOrApply", "fn", "args", "__spreadArray", "__read", "mapOneOrManyArgs", "map", "isArray", "getPrototypeOf", "objectProto", "getKeys", "argsArgArrayOrObject", "args", "first_1", "isPOJO", "keys", "key", "obj", "createObject", "keys", "values", "result", "key", "i", "combineLatest", "args", "_i", "scheduler", "popScheduler", "resultSelector", "popResultSelector", "_a", "argsArgArrayOrObject", "observables", "keys", "from", "result", "Observable", "combineLatestInit", "values", "createObject", "identity", "mapOneOrManyArgs", "valueTransform", "subscriber", "maybeSchedule", "length", "active", "remainingFirstValues", "i", "source", "hasFirstValue", "createOperatorSubscriber", "value", "execute", "subscription", "executeSchedule", "mergeInternals", "source", "subscriber", "project", "concurrent", "onBeforeNext", "expand", "innerSubScheduler", "additionalFinalizer", "buffer", "active", "index", "isComplete", "checkComplete", "outerNext", "value", "doInnerSub", "innerComplete", "innerFrom", "createOperatorSubscriber", "innerValue", "bufferedValue", "executeSchedule", "err", "mergeMap", "project", "resultSelector", "concurrent", "isFunction", "a", "i", "map", "b", "ii", "innerFrom", "operate", "source", "subscriber", "mergeInternals", "mergeAll", "concurrent", "mergeMap", "identity", "concatAll", "mergeAll", "concat", "args", "_i", "concatAll", "from", "popScheduler", "defer", "observableFactory", "Observable", "subscriber", "innerFrom", "nodeEventEmitterMethods", "eventTargetMethods", "jqueryMethods", "fromEvent", "target", "eventName", "options", "resultSelector", "isFunction", "mapOneOrManyArgs", "_a", "__read", "isEventTarget", "methodName", "handler", "isNodeStyleEventEmitter", "toCommonHandlerRegistry", "isJQueryStyleEventEmitter", "add", "remove", "isArrayLike", "mergeMap", "subTarget", "innerFrom", "Observable", "subscriber", "args", "_i", "fromEventPattern", "addHandler", "removeHandler", "resultSelector", "mapOneOrManyArgs", "Observable", "subscriber", "handler", "e", "_i", "retValue", "isFunction", "timer", "dueTime", "intervalOrScheduler", "scheduler", "async", "intervalDuration", "isScheduler", "Observable", "subscriber", "due", "isValidDate", "n", "merge", "args", "_i", "scheduler", "popScheduler", "concurrent", "popNumber", "sources", "innerFrom", "mergeAll", "from", "EMPTY", "NEVER", "Observable", "noop", "isArray", "argsOrArgArray", "args", "filter", "predicate", "thisArg", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "zip", "args", "_i", "resultSelector", "popResultSelector", "sources", "argsOrArgArray", "Observable", "subscriber", "buffers", "completed", "sourceIndex", "innerFrom", "createOperatorSubscriber", "value", "buffer", "result", "__spreadArray", "__read", "i", "EMPTY", "audit", "durationSelector", "operate", "source", "subscriber", "hasValue", "lastValue", "durationSubscriber", "isComplete", "endDuration", "value", "cleanupDuration", "createOperatorSubscriber", "innerFrom", "auditTime", "duration", "scheduler", "asyncScheduler", "audit", "timer", "bufferCount", "bufferSize", "startBufferEvery", "operate", "source", "subscriber", "buffers", "count", "createOperatorSubscriber", "value", "toEmit", "buffers_1", "__values", "buffers_1_1", "buffer", "toEmit_1", "toEmit_1_1", "arrRemove", "buffers_2", "buffers_2_1", "catchError", "selector", "operate", "source", "subscriber", "innerSub", "syncUnsub", "handledResult", "createOperatorSubscriber", "err", "innerFrom", "scanInternals", "accumulator", "seed", "hasSeed", "emitOnNext", "emitBeforeComplete", "source", "subscriber", "hasState", "state", "index", "createOperatorSubscriber", "value", "i", "combineLatest", "args", "_i", "resultSelector", "popResultSelector", "pipe", "__spreadArray", "__read", "mapOneOrManyArgs", "operate", "source", "subscriber", "combineLatestInit", "argsOrArgArray", "combineLatestWith", "otherSources", "_i", "combineLatest", "__spreadArray", "__read", "concatMap", "project", "resultSelector", "isFunction", "mergeMap", "debounceTime", "dueTime", "scheduler", "asyncScheduler", "operate", "source", "subscriber", "activeTask", "lastValue", "lastTime", "emit", "value", "emitWhenIdle", "targetTime", "now", "createOperatorSubscriber", "defaultIfEmpty", "defaultValue", "operate", "source", "subscriber", "hasValue", "createOperatorSubscriber", "value", "take", "count", "EMPTY", "operate", "source", "subscriber", "seen", "createOperatorSubscriber", "value", "ignoreElements", "operate", "source", "subscriber", "createOperatorSubscriber", "noop", "mapTo", "value", "map", "delayWhen", "delayDurationSelector", "subscriptionDelay", "source", "concat", "take", "ignoreElements", "mergeMap", "value", "index", "mapTo", "delay", "due", "scheduler", "asyncScheduler", "duration", "timer", "delayWhen", "distinctUntilChanged", "comparator", "keySelector", "identity", "defaultCompare", "operate", "source", "subscriber", "previousKey", "first", "createOperatorSubscriber", "value", "currentKey", "a", "b", "distinctUntilKeyChanged", "key", "compare", "distinctUntilChanged", "x", "y", "endWith", "values", "_i", "source", "concat", "of", "__spreadArray", "__read", "finalize", "callback", "operate", "source", "subscriber", "takeLast", "count", "EMPTY", "operate", "source", "subscriber", "buffer", "createOperatorSubscriber", "value", "buffer_1", "__values", "buffer_1_1", "merge", "args", "_i", "scheduler", "popScheduler", "concurrent", "popNumber", "argsOrArgArray", "operate", "source", "subscriber", "mergeAll", "from", "__spreadArray", "__read", "mergeWith", "otherSources", "_i", "merge", "__spreadArray", "__read", "repeat", "countOrConfig", "count", "delay", "_a", "EMPTY", "operate", "source", "subscriber", "soFar", "sourceSub", "resubscribe", "notifier", "timer", "innerFrom", "notifierSubscriber_1", "createOperatorSubscriber", "subscribeToSource", "syncUnsub", "sample", "notifier", "operate", "source", "subscriber", "hasValue", "lastValue", "createOperatorSubscriber", "value", "noop", "scan", "accumulator", "seed", "operate", "scanInternals", "share", "options", "_a", "connector", "Subject", "_b", "resetOnError", "_c", "resetOnComplete", "_d", "resetOnRefCountZero", "wrapperSource", "connection", "resetConnection", "subject", "refCount", "hasCompleted", "hasErrored", "cancelReset", "reset", "resetAndUnsubscribe", "conn", "operate", "source", "subscriber", "dest", "handleReset", "SafeSubscriber", "value", "err", "innerFrom", "on", "args", "_i", "onSubscriber", "__spreadArray", "__read", "shareReplay", "configOrBufferSize", "windowTime", "scheduler", "bufferSize", "refCount", "_a", "_b", "_c", "share", "ReplaySubject", "skip", "count", "filter", "_", "index", "skipUntil", "notifier", "operate", "source", "subscriber", "taking", "skipSubscriber", "createOperatorSubscriber", "noop", "innerFrom", "value", "startWith", "values", "_i", "scheduler", "popScheduler", "operate", "source", "subscriber", "concat", "switchMap", "project", "resultSelector", "operate", "source", "subscriber", "innerSubscriber", "index", "isComplete", "checkComplete", "createOperatorSubscriber", "value", "innerIndex", "outerIndex", "innerFrom", "innerValue", "takeUntil", "notifier", "operate", "source", "subscriber", "innerFrom", "createOperatorSubscriber", "noop", "takeWhile", "predicate", "inclusive", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "result", "tap", "observerOrNext", "error", "complete", "tapObserver", "isFunction", "operate", "source", "subscriber", "_a", "isUnsub", "createOperatorSubscriber", "value", "err", "_b", "identity", "defaultThrottleConfig", "throttle", "durationSelector", "config", "operate", "source", "subscriber", "leading", "trailing", "hasValue", "sendValue", "throttled", "isComplete", "endThrottling", "send", "cleanupThrottling", "startThrottle", "value", "innerFrom", "createOperatorSubscriber", "throttleTime", "duration", "scheduler", "config", "asyncScheduler", "defaultThrottleConfig", "duration$", "timer", "throttle", "withLatestFrom", "inputs", "_i", "project", "popResultSelector", "operate", "source", "subscriber", "len", "otherValues", "hasValue", "ready", "i", "innerFrom", "createOperatorSubscriber", "value", "identity", "noop", "values", "__spreadArray", "__read", "zip", "sources", "_i", "operate", "source", "subscriber", "__spreadArray", "__read", "zipWith", "otherInputs", "_i", "zip", "__spreadArray", "__read", "watchDocument", "document$", "ReplaySubject", "fromEvent", "getElements", "selector", "node", "getElement", "el", "getOptionalElement", "getActiveElement", "watchElementFocus", "el", "merge", "fromEvent", "debounceTime", "map", "active", "getActiveElement", "startWith", "distinctUntilChanged", "getElementOffset", "el", "watchElementOffset", "merge", "fromEvent", "auditTime", "animationFrameScheduler", "map", "startWith", "getElementContentOffset", "el", "watchElementContentOffset", "merge", "fromEvent", "auditTime", "animationFrameScheduler", "map", "startWith", "MapShim", "getIndex", "arr", "key", "result", "entry", "index", "class_1", "value", "entries", "callback", "ctx", "_i", "_a", "isBrowser", "global$1", "requestAnimationFrame$1", "trailingTimeout", "throttle", "delay", "leadingCall", "trailingCall", "lastCallTime", "resolvePending", "proxy", "timeoutCallback", "timeStamp", "REFRESH_DELAY", "transitionKeys", "mutationObserverSupported", "ResizeObserverController", "observer", "observers", "changesDetected", "activeObservers", "_b", "propertyName", "isReflowProperty", "defineConfigurable", "target", "props", "getWindowOf", "ownerGlobal", "emptyRect", "createRectInit", "toFloat", "getBordersSize", "styles", "positions", "size", "position", "getPaddings", "paddings", "positions_1", "getSVGContentRect", "bbox", "getHTMLElementContentRect", "clientWidth", "clientHeight", "horizPad", "vertPad", "width", "height", "isDocumentElement", "vertScrollbar", "horizScrollbar", "isSVGGraphicsElement", "getContentRect", "createReadOnlyRect", "x", "y", "Constr", "rect", "ResizeObservation", "ResizeObserverEntry", "rectInit", "contentRect", "ResizeObserverSPI", "controller", "callbackCtx", "observations", "_this", "observation", "ResizeObserver", "method", "ResizeObserver_es_default", "entry$", "Subject", "observer$", "defer", "of", "ResizeObserver_es_default", "entries", "entry", "switchMap", "observer", "merge", "NEVER", "finalize", "shareReplay", "getElementSize", "el", "watchElementSize", "tap", "filter", "target", "map", "startWith", "getElementContentSize", "el", "entry$", "Subject", "observer$", "defer", "of", "entries", "entry", "switchMap", "observer", "merge", "NEVER", "finalize", "shareReplay", "watchElementVisibility", "el", "tap", "filter", "target", "map", "isIntersecting", "watchElementBoundary", "threshold", "watchElementContentOffset", "y", "visible", "getElementSize", "content", "getElementContentSize", "distinctUntilChanged", "toggles", "getElement", "getToggle", "name", "setToggle", "value", "watchToggle", "el", "fromEvent", "map", "startWith", "isSusceptibleToKeyboard", "el", "type", "watchKeyboard", "fromEvent", "filter", "ev", "map", "getToggle", "mode", "active", "getActiveElement", "share", "getLocation", "setLocation", "url", "watchLocation", "Subject", "appendChild", "el", "child", "node", "h", "tag", "attributes", "children", "attr", "truncate", "value", "n", "i", "round", "digits", "getLocationHash", "setLocationHash", "hash", "el", "h", "ev", "watchLocationHash", "fromEvent", "map", "startWith", "filter", "shareReplay", "watchLocationTarget", "id", "getOptionalElement", "watchMedia", "query", "media", "fromEventPattern", "next", "startWith", "watchPrint", "merge", "fromEvent", "map", "at", "query$", "factory", "switchMap", "active", "EMPTY", "request", "url", "options", "from", "catchError", "EMPTY", "switchMap", "res", "throwError", "of", "requestJSON", "shareReplay", "requestXML", "dom", "map", "watchScript", "src", "script", "h", "defer", "merge", "fromEvent", "switchMap", "throwError", "map", "finalize", "take", "getViewportOffset", "watchViewportOffset", "merge", "fromEvent", "map", "startWith", "getViewportSize", "watchViewportSize", "fromEvent", "map", "startWith", "watchViewport", "combineLatest", "watchViewportOffset", "watchViewportSize", "map", "offset", "size", "shareReplay", "watchViewportAt", "el", "viewport$", "header$", "size$", "distinctUntilKeyChanged", "offset$", "combineLatest", "map", "getElementOffset", "height", "offset", "size", "x", "y", "watchWorker", "worker", "tx$", "rx$", "fromEvent", "map", "data", "throttle", "tap", "message", "switchMap", "share", "script", "getElement", "config", "getLocation", "configuration", "feature", "flag", "translation", "key", "value", "getComponentElement", "type", "node", "getElement", "getComponentElements", "getElements", "watchAnnounce", "el", "button", "getElement", "fromEvent", "map", "content", "mountAnnounce", "feature", "EMPTY", "defer", "push$", "Subject", "startWith", "hash", "_a", "tap", "state", "finalize", "__spreadValues", "watchConsent", "el", "target$", "map", "target", "mountConsent", "options", "internal$", "Subject", "hidden", "tap", "state", "finalize", "__spreadValues", "import_clipboard", "renderAnnotation", "id", "h", "renderClipboardButton", "id", "h", "translation", "renderSearchDocument", "document", "flag", "parent", "teaser", "missing", "key", "list", "h", "url", "feature", "match", "highlight", "value", "truncate", "tag", "translation", "renderSearchResultItem", "result", "threshold", "docs", "doc", "article", "index", "best", "more", "children", "section", "renderSourceFacts", "facts", "h", "key", "value", "round", "renderTabbedControl", "type", "classes", "h", "renderTable", "table", "h", "renderVersion", "version", "config", "configuration", "url", "h", "renderVersionSelector", "versions", "active", "translation", "watchAnnotation", "el", "container", "offset$", "defer", "combineLatest", "watchElementOffset", "watchElementContentOffset", "map", "x", "y", "scroll", "width", "getElementSize", "watchElementFocus", "switchMap", "active", "offset", "take", "mountAnnotation", "push$", "Subject", "done$", "takeLast", "watchElementVisibility", "takeUntil", "visible", "throttleTime", "animationFrameScheduler", "origin", "index", "getElement", "blur$", "fromEvent", "EMPTY", "tap", "ev", "state", "finalize", "__spreadValues", "findAnnotationMarkers", "container", "markers", "comment", "getElements", "match", "text", "marker", "swap", "source", "target", "mountAnnotationList", "el", "print$", "annotations", "id", "getOptionalElement", "renderAnnotation", "EMPTY", "defer", "done$", "Subject", "takeUntil", "takeLast", "active", "annotation", "inner", "getElement", "child", "merge", "mountAnnotation", "finalize", "share", "sequence", "findCandidateList", "el", "sibling", "watchCodeBlock", "watchElementSize", "map", "width", "getElementContentSize", "distinctUntilKeyChanged", "mountCodeBlock", "options", "hover", "factory$", "defer", "push$", "Subject", "scrollable", "ClipboardJS", "parent", "renderClipboardButton", "container", "list", "feature", "annotations$", "mountAnnotationList", "tap", "state", "finalize", "__spreadValues", "mergeWith", "takeUntil", "takeLast", "height", "distinctUntilChanged", "switchMap", "active", "EMPTY", "watchElementVisibility", "filter", "visible", "take", "mermaid$", "sequence", "fetchScripts", "watchScript", "of", "mountMermaid", "el", "tap", "mermaid_default", "map", "shareReplay", "id", "host", "h", "svg", "shadow", "watchDetails", "el", "target$", "print$", "open", "merge", "map", "target", "filter", "details", "active", "tap", "mountDetails", "options", "defer", "push$", "Subject", "action", "reveal", "state", "finalize", "__spreadValues", "sentinel", "h", "mountDataTable", "el", "renderTable", "of", "watchContentTabs", "el", "inputs", "getElements", "initial", "input", "merge", "fromEvent", "map", "getElement", "startWith", "active", "mountContentTabs", "prev", "renderTabbedControl", "next", "container", "defer", "push$", "Subject", "done$", "takeLast", "combineLatest", "watchElementSize", "auditTime", "animationFrameScheduler", "takeUntil", "size", "offset", "getElementOffset", "width", "getElementSize", "content", "getElementContentOffset", "watchElementContentOffset", "getElementContentSize", "direction", "feature", "skip", "tab", "set", "tabs", "tap", "state", "finalize", "__spreadValues", "subscribeOn", "asyncScheduler", "mountContent", "el", "target$", "print$", "merge", "getElements", "child", "mountCodeBlock", "mountMermaid", "mountDataTable", "mountDetails", "mountContentTabs", "watchDialog", "_el", "alert$", "switchMap", "message", "merge", "of", "delay", "map", "active", "mountDialog", "el", "options", "inner", "getElement", "defer", "push$", "Subject", "tap", "state", "finalize", "__spreadValues", "isHidden", "viewport$", "feature", "of", "direction$", "map", "y", "bufferCount", "a", "b", "distinctUntilKeyChanged", "hidden$", "combineLatest", "filter", "offset", "direction", "distinctUntilChanged", "search$", "watchToggle", "search", "switchMap", "active", "startWith", "watchHeader", "el", "options", "defer", "watchElementSize", "height", "hidden", "shareReplay", "mountHeader", "header$", "main$", "push$", "Subject", "done$", "takeLast", "combineLatestWith", "takeUntil", "state", "__spreadValues", "watchHeaderTitle", "el", "viewport$", "header$", "watchViewportAt", "map", "y", "height", "getElementSize", "distinctUntilKeyChanged", "mountHeaderTitle", "options", "defer", "push$", "Subject", "active", "heading", "getOptionalElement", "EMPTY", "tap", "state", "finalize", "__spreadValues", "watchMain", "el", "viewport$", "header$", "adjust$", "map", "height", "distinctUntilChanged", "border$", "switchMap", "watchElementSize", "distinctUntilKeyChanged", "combineLatest", "header", "top", "bottom", "y", "a", "b", "watchPalette", "inputs", "current", "input", "of", "mergeMap", "fromEvent", "map", "startWith", "shareReplay", "mountPalette", "el", "defer", "push$", "Subject", "palette", "key", "value", "index", "label", "observeOn", "asyncScheduler", "getElements", "tap", "state", "finalize", "__spreadValues", "import_clipboard", "extract", "el", "text", "setupClipboardJS", "alert$", "ClipboardJS", "Observable", "subscriber", "getElement", "ev", "tap", "map", "translation", "preprocess", "urls", "root", "next", "a", "b", "url", "index", "fetchSitemap", "base", "cached", "of", "config", "configuration", "requestXML", "map", "sitemap", "getElements", "node", "catchError", "EMPTY", "defaultIfEmpty", "tap", "setupInstantLoading", "document$", "location$", "viewport$", "config", "configuration", "fromEvent", "favicon", "getOptionalElement", "push$", "fetchSitemap", "map", "paths", "path", "switchMap", "urls", "filter", "ev", "el", "url", "of", "NEVER", "share", "pop$", "merge", "distinctUntilChanged", "a", "b", "response$", "distinctUntilKeyChanged", "request", "catchError", "setLocation", "sample", "dom", "res", "skip", "replacement", "selector", "feature", "source", "target", "getComponentElement", "getElements", "concatMap", "script", "h", "name", "Observable", "observer", "EMPTY", "offset", "setLocationHash", "skipUntil", "debounceTime", "bufferCount", "state", "import_escape_html", "import_escape_html", "setupSearchHighlighter", "config", "escape", "separator", "highlight", "_", "data", "term", "query", "match", "value", "escapeHTML", "defaultTransform", "query", "terms", "index", "isSearchReadyMessage", "message", "isSearchQueryMessage", "isSearchResultMessage", "setupSearchIndex", "config", "docs", "translation", "options", "feature", "setupSearchWorker", "url", "index", "configuration", "worker", "tx$", "Subject", "rx$", "watchWorker", "map", "message", "isSearchResultMessage", "result", "document", "share", "from", "data", "setupVersionSelector", "document$", "config", "configuration", "versions$", "requestJSON", "catchError", "EMPTY", "current$", "map", "versions", "current", "version", "aliases", "switchMap", "urls", "fromEvent", "filter", "ev", "withLatestFrom", "el", "url", "of", "fetchSitemap", "sitemap", "path", "getLocation", "setLocation", "combineLatest", "getElement", "renderVersionSelector", "_a", "outdated", "latest", "warning", "getComponentElements", "watchSearchQuery", "el", "rx$", "fn", "defaultTransform", "searchParams", "getLocation", "setToggle", "param$", "filter", "isSearchReadyMessage", "take", "map", "watchToggle", "active", "url", "value", "focus$", "watchElementFocus", "value$", "merge", "fromEvent", "delay", "startWith", "distinctUntilChanged", "combineLatest", "focus", "shareReplay", "mountSearchQuery", "tx$", "push$", "Subject", "done$", "takeLast", "distinctUntilKeyChanged", "translation", "takeUntil", "tap", "state", "finalize", "__spreadValues", "share", "mountSearchResult", "el", "rx$", "query$", "push$", "Subject", "boundary$", "watchElementBoundary", "filter", "meta", "getElement", "list", "ready$", "isSearchReadyMessage", "take", "withLatestFrom", "skipUntil", "items", "value", "translation", "round", "tap", "switchMap", "merge", "of", "bufferCount", "zipWith", "chunk", "result", "renderSearchResultItem", "isSearchResultMessage", "map", "data", "state", "finalize", "__spreadValues", "watchSearchShare", "_el", "query$", "map", "value", "url", "getLocation", "mountSearchShare", "el", "options", "push$", "Subject", "fromEvent", "ev", "tap", "state", "finalize", "__spreadValues", "mountSearchSuggest", "el", "rx$", "keyboard$", "push$", "Subject", "query", "getComponentElement", "query$", "merge", "fromEvent", "observeOn", "asyncScheduler", "map", "distinctUntilChanged", "combineLatestWith", "suggestions", "value", "words", "last", "filter", "mode", "key", "isSearchResultMessage", "data", "tap", "state", "finalize", "mountSearch", "el", "index$", "keyboard$", "config", "configuration", "url", "worker", "setupSearchWorker", "query", "getComponentElement", "result", "tx$", "rx$", "filter", "isSearchQueryMessage", "sample", "isSearchReadyMessage", "take", "mode", "key", "active", "getActiveElement", "anchors", "anchor", "getElements", "article", "best", "a", "b", "setToggle", "els", "i", "query$", "mountSearchQuery", "result$", "mountSearchResult", "merge", "mergeWith", "getComponentElements", "child", "mountSearchShare", "mountSearchSuggest", "err", "NEVER", "mountSearchHiglight", "el", "index$", "location$", "combineLatest", "startWith", "getLocation", "filter", "url", "map", "index", "setupSearchHighlighter", "fn", "_a", "nodes", "it", "node", "original", "replaced", "text", "childNodes", "h", "watchSidebar", "el", "viewport$", "main$", "parent", "adjust", "combineLatest", "map", "offset", "height", "y", "distinctUntilChanged", "a", "b", "mountSidebar", "_a", "_b", "header$", "options", "__objRest", "inner", "getElement", "getElementOffset", "defer", "push$", "Subject", "auditTime", "animationFrameScheduler", "withLatestFrom", "tap", "state", "finalize", "__spreadValues", "fetchSourceFactsFromGitHub", "user", "repo", "url", "zip", "requestJSON", "catchError", "EMPTY", "map", "release", "defaultIfEmpty", "info", "__spreadValues", "fetchSourceFactsFromGitLab", "base", "project", "url", "requestJSON", "catchError", "EMPTY", "map", "star_count", "forks_count", "defaultIfEmpty", "fetchSourceFacts", "url", "type", "user", "repo", "fetchSourceFactsFromGitHub", "base", "slug", "fetchSourceFactsFromGitLab", "EMPTY", "fetch$", "watchSource", "el", "defer", "cached", "of", "fetchSourceFacts", "tap", "facts", "catchError", "EMPTY", "filter", "map", "shareReplay", "mountSource", "inner", "getElement", "push$", "Subject", "renderSourceFacts", "state", "finalize", "__spreadValues", "watchTabs", "el", "viewport$", "header$", "watchElementSize", "switchMap", "watchViewportAt", "map", "y", "distinctUntilKeyChanged", "mountTabs", "options", "defer", "push$", "Subject", "hidden", "feature", "of", "tap", "state", "finalize", "__spreadValues", "watchTableOfContents", "el", "viewport$", "header$", "table", "anchors", "getElements", "anchor", "id", "target", "getOptionalElement", "adjust$", "distinctUntilKeyChanged", "map", "height", "main", "getComponentElement", "grid", "getElement", "share", "watchElementSize", "switchMap", "body", "defer", "path", "of", "index", "offset", "a", "b", "combineLatestWith", "adjust", "scan", "prev", "next", "y", "size", "last", "distinctUntilChanged", "startWith", "bufferCount", "mountTableOfContents", "target$", "push$", "Subject", "done$", "takeLast", "feature", "takeUntil", "debounceTime", "skip", "repeat", "withLatestFrom", "url", "getLocation", "active", "hash", "tap", "state", "finalize", "__spreadValues", "watchBackToTop", "_el", "viewport$", "main$", "target$", "direction$", "map", "y", "bufferCount", "b", "distinctUntilChanged", "active$", "active", "combineLatest", "direction", "takeUntil", "skip", "endWith", "repeat", "hidden", "mountBackToTop", "el", "header$", "push$", "Subject", "done$", "takeLast", "distinctUntilKeyChanged", "height", "tap", "state", "finalize", "__spreadValues", "patchIndeterminate", "document$", "tablet$", "switchMap", "getElements", "tap", "el", "mergeMap", "fromEvent", "takeWhile", "map", "withLatestFrom", "tablet", "isAppleDevice", "patchScrollfix", "document$", "switchMap", "getElements", "tap", "el", "filter", "mergeMap", "fromEvent", "map", "top", "patchScrolllock", "viewport$", "tablet$", "combineLatest", "watchToggle", "map", "active", "tablet", "switchMap", "of", "delay", "withLatestFrom", "y", "value", "obj", "data", "key", "x", "y", "nodes", "parent", "i", "node", "document$", "watchDocument", "location$", "watchLocation", "target$", "watchLocationTarget", "keyboard$", "watchKeyboard", "viewport$", "watchViewport", "tablet$", "watchMedia", "screen$", "print$", "watchPrint", "config", "configuration", "index$", "requestJSON", "NEVER", "alert$", "Subject", "setupClipboardJS", "feature", "setupInstantLoading", "_a", "setupVersionSelector", "merge", "delay", "setToggle", "filter", "mode", "key", "prev", "getOptionalElement", "next", "patchIndeterminate", "patchScrollfix", "patchScrolllock", "header$", "watchHeader", "getComponentElement", "main$", "map", "switchMap", "el", "watchMain", "shareReplay", "control$", "getComponentElements", "mountConsent", "mountDialog", "mountHeader", "mountPalette", "mountSearch", "mountSource", "content$", "defer", "mountAnnounce", "mountContent", "mountSearchHiglight", "EMPTY", "mountHeaderTitle", "at", "mountSidebar", "mountTabs", "mountTableOfContents", "mountBackToTop", "component$", "mergeWith"] +} diff --git a/assets/javascripts/lunr/min/lunr.ar.min.js b/assets/javascripts/lunr/min/lunr.ar.min.js new file mode 100644 index 00000000..248ddc5d --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ar.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ar=function(){this.pipeline.reset(),this.pipeline.add(e.ar.trimmer,e.ar.stopWordFilter,e.ar.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ar.stemmer))},e.ar.wordCharacters="ء-ٛٱـ",e.ar.trimmer=e.trimmerSupport.generateTrimmer(e.ar.wordCharacters),e.Pipeline.registerFunction(e.ar.trimmer,"trimmer-ar"),e.ar.stemmer=function(){var e=this;return e.result=!1,e.preRemoved=!1,e.sufRemoved=!1,e.pre={pre1:"ف ك ب و س ل ن ا ي ت",pre2:"ال لل",pre3:"بال وال فال تال كال ولل",pre4:"فبال كبال وبال وكال"},e.suf={suf1:"ه ك ت ن ا ي",suf2:"نك نه ها وك يا اه ون ين تن تم نا وا ان كم كن ني نن ما هم هن تك ته ات يه",suf3:"تين كهم نيه نهم ونه وها يهم ونا ونك وني وهم تكم تنا تها تني تهم كما كها ناه نكم هنا تان يها",suf4:"كموه ناها ونني ونهم تكما تموه تكاه كماه ناكم ناهم نيها وننا"},e.patterns=JSON.parse('{"pt43":[{"pt":[{"c":"ا","l":1}]},{"pt":[{"c":"ا,ت,ن,ي","l":0}],"mPt":[{"c":"ف","l":0,"m":1},{"c":"ع","l":1,"m":2},{"c":"ل","l":2,"m":3}]},{"pt":[{"c":"و","l":2}],"mPt":[{"c":"ف","l":0,"m":0},{"c":"ع","l":1,"m":1},{"c":"ل","l":2,"m":3}]},{"pt":[{"c":"ا","l":2}]},{"pt":[{"c":"ي","l":2}],"mPt":[{"c":"ف","l":0,"m":0},{"c":"ع","l":1,"m":1},{"c":"ا","l":2},{"c":"ل","l":3,"m":3}]},{"pt":[{"c":"م","l":0}]}],"pt53":[{"pt":[{"c":"ت","l":0},{"c":"ا","l":2}]},{"pt":[{"c":"ا,ن,ت,ي","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":0},{"c":"ا","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":3},{"c":"ل","l":3,"m":4},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":0},{"c":"ا","l":3}],"mPt":[{"c":"ف","l":0,"m":1},{"c":"ع","l":1,"m":2},{"c":"ل","l":2,"m":4}]},{"pt":[{"c":"ا","l":3},{"c":"ن","l":4}]},{"pt":[{"c":"ت","l":0},{"c":"ي","l":3}]},{"pt":[{"c":"م","l":0},{"c":"و","l":3}]},{"pt":[{"c":"ا","l":1},{"c":"و","l":3}]},{"pt":[{"c":"و","l":1},{"c":"ا","l":2}]},{"pt":[{"c":"م","l":0},{"c":"ا","l":3}]},{"pt":[{"c":"م","l":0},{"c":"ي","l":3}]},{"pt":[{"c":"ا","l":2},{"c":"ن","l":3}]},{"pt":[{"c":"م","l":0},{"c":"ن","l":1}],"mPt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ف","l":2,"m":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"م","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"م","l":0},{"c":"ا","l":2}]},{"pt":[{"c":"م","l":1},{"c":"ا","l":3}]},{"pt":[{"c":"ي,ت,ا,ن","l":0},{"c":"ت","l":1}],"mPt":[{"c":"ف","l":0,"m":2},{"c":"ع","l":1,"m":3},{"c":"ا","l":2},{"c":"ل","l":3,"m":4}]},{"pt":[{"c":"ت,ي,ا,ن","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":2},{"c":"ي","l":3}]},{"pt":[{"c":"ا,ي,ت,ن","l":0},{"c":"ن","l":1}],"mPt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ف","l":2,"m":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":3},{"c":"ء","l":4}]}],"pt63":[{"pt":[{"c":"ا","l":0},{"c":"ت","l":2},{"c":"ا","l":4}]},{"pt":[{"c":"ا,ت,ن,ي","l":0},{"c":"س","l":1},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ف","l":3,"m":3},{"c":"ع","l":4,"m":4},{"c":"ا","l":5},{"c":"ل","l":6,"m":5}]},{"pt":[{"c":"ا,ن,ت,ي","l":0},{"c":"و","l":3}]},{"pt":[{"c":"م","l":0},{"c":"س","l":1},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ف","l":3,"m":3},{"c":"ع","l":4,"m":4},{"c":"ا","l":5},{"c":"ل","l":6,"m":5}]},{"pt":[{"c":"ي","l":1},{"c":"ي","l":3},{"c":"ا","l":4},{"c":"ء","l":5}]},{"pt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ا","l":4}]}],"pt54":[{"pt":[{"c":"ت","l":0}]},{"pt":[{"c":"ا,ي,ت,ن","l":0}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":2},{"c":"ل","l":3,"m":3},{"c":"ر","l":4,"m":4},{"c":"ا","l":5},{"c":"ر","l":6,"m":4}]},{"pt":[{"c":"م","l":0}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":2},{"c":"ل","l":3,"m":3},{"c":"ر","l":4,"m":4},{"c":"ا","l":5},{"c":"ر","l":6,"m":4}]},{"pt":[{"c":"ا","l":2}]},{"pt":[{"c":"ا","l":0},{"c":"ن","l":2}]}],"pt64":[{"pt":[{"c":"ا","l":0},{"c":"ا","l":4}]},{"pt":[{"c":"م","l":0},{"c":"ت","l":1}]}],"pt73":[{"pt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ا","l":5}]}],"pt75":[{"pt":[{"c":"ا","l":0},{"c":"ا","l":5}]}]}'),e.execArray=["cleanWord","removeDiacritics","cleanAlef","removeStopWords","normalizeHamzaAndAlef","removeStartWaw","removePre432","removeEndTaa","wordCheck"],e.stem=function(){var r=0;for(e.result=!1,e.preRemoved=!1,e.sufRemoved=!1;r=0)return!0},e.normalizeHamzaAndAlef=function(){return e.word=e.word.replace("ؤ","ء"),e.word=e.word.replace("ئ","ء"),e.word=e.word.replace(/([\u0627])\1+/gi,"ا"),!1},e.removeEndTaa=function(){return!(e.word.length>2)||(e.word=e.word.replace(/[\u0627]$/,""),e.word=e.word.replace("ة",""),!1)},e.removeStartWaw=function(){return e.word.length>3&&"و"==e.word[0]&&"و"==e.word[1]&&(e.word=e.word.slice(1)),!1},e.removePre432=function(){var r=e.word;if(e.word.length>=7){var t=new RegExp("^("+e.pre.pre4.split(" ").join("|")+")");e.word=e.word.replace(t,"")}if(e.word==r&&e.word.length>=6){var c=new RegExp("^("+e.pre.pre3.split(" ").join("|")+")");e.word=e.word.replace(c,"")}if(e.word==r&&e.word.length>=5){var l=new RegExp("^("+e.pre.pre2.split(" ").join("|")+")");e.word=e.word.replace(l,"")}return r!=e.word&&(e.preRemoved=!0),!1},e.patternCheck=function(r){for(var t=0;t3){var t=new RegExp("^("+e.pre.pre1.split(" ").join("|")+")");e.word=e.word.replace(t,"")}return r!=e.word&&(e.preRemoved=!0),!1},e.removeSuf1=function(){var r=e.word;if(0==e.sufRemoved&&e.word.length>3){var t=new RegExp("("+e.suf.suf1.split(" ").join("|")+")$");e.word=e.word.replace(t,"")}return r!=e.word&&(e.sufRemoved=!0),!1},e.removeSuf432=function(){var r=e.word;if(e.word.length>=6){var t=new RegExp("("+e.suf.suf4.split(" ").join("|")+")$");e.word=e.word.replace(t,"")}if(e.word==r&&e.word.length>=5){var c=new RegExp("("+e.suf.suf3.split(" ").join("|")+")$");e.word=e.word.replace(c,"")}if(e.word==r&&e.word.length>=4){var l=new RegExp("("+e.suf.suf2.split(" ").join("|")+")$");e.word=e.word.replace(l,"")}return r!=e.word&&(e.sufRemoved=!0),!1},e.wordCheck=function(){for(var r=(e.word,[e.removeSuf432,e.removeSuf1,e.removePre1]),t=0,c=!1;e.word.length>=7&&!e.result&&t=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.de.min.js b/assets/javascripts/lunr/min/lunr.de.min.js new file mode 100644 index 00000000..f3b5c108 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.de.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `German` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!v.eq_s(1,e)||(v.ket=v.cursor,!v.in_grouping(p,97,252)))&&(v.slice_from(r),v.cursor=n,!0)}function i(){for(var r,n,i,s,t=v.cursor;;)if(r=v.cursor,v.bra=r,v.eq_s(1,"ß"))v.ket=v.cursor,v.slice_from("ss");else{if(r>=v.limit)break;v.cursor=r+1}for(v.cursor=t;;)for(n=v.cursor;;){if(i=v.cursor,v.in_grouping(p,97,252)){if(s=v.cursor,v.bra=s,e("u","U",i))break;if(v.cursor=s,e("y","Y",i))break}if(i>=v.limit)return void(v.cursor=n);v.cursor=i+1}}function s(){for(;!v.in_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}for(;!v.out_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}return!1}function t(){m=v.limit,l=m;var e=v.cursor+3;0<=e&&e<=v.limit&&(d=e,s()||(m=v.cursor,m=v.limit)return;v.cursor++}}}function c(){return m<=v.cursor}function u(){return l<=v.cursor}function a(){var e,r,n,i,s=v.limit-v.cursor;if(v.ket=v.cursor,(e=v.find_among_b(w,7))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:v.slice_del(),v.ket=v.cursor,v.eq_s_b(1,"s")&&(v.bra=v.cursor,v.eq_s_b(3,"nis")&&v.slice_del());break;case 3:v.in_grouping_b(g,98,116)&&v.slice_del()}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(f,4))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:if(v.in_grouping_b(k,98,116)){var t=v.cursor-3;v.limit_backward<=t&&t<=v.limit&&(v.cursor=t,v.slice_del())}}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(_,8))&&(v.bra=v.cursor,u()))switch(e){case 1:v.slice_del(),v.ket=v.cursor,v.eq_s_b(2,"ig")&&(v.bra=v.cursor,r=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-r,u()&&v.slice_del()));break;case 2:n=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-n,v.slice_del());break;case 3:if(v.slice_del(),v.ket=v.cursor,i=v.limit-v.cursor,!v.eq_s_b(2,"er")&&(v.cursor=v.limit-i,!v.eq_s_b(2,"en")))break;v.bra=v.cursor,c()&&v.slice_del();break;case 4:v.slice_del(),v.ket=v.cursor,e=v.find_among_b(b,2),e&&(v.bra=v.cursor,u()&&1==e&&v.slice_del())}}var d,l,m,h=[new r("",-1,6),new r("U",0,2),new r("Y",0,1),new r("ä",0,3),new r("ö",0,4),new r("ü",0,5)],w=[new r("e",-1,2),new r("em",-1,1),new r("en",-1,2),new r("ern",-1,1),new r("er",-1,1),new r("s",-1,3),new r("es",5,2)],f=[new r("en",-1,1),new r("er",-1,1),new r("st",-1,2),new r("est",2,1)],b=[new r("ig",-1,1),new r("lich",-1,1)],_=[new r("end",-1,1),new r("ig",-1,2),new r("ung",-1,1),new r("lich",-1,3),new r("isch",-1,2),new r("ik",-1,2),new r("heit",-1,3),new r("keit",-1,4)],p=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],g=[117,30,5],k=[117,30,4],v=new n;this.setCurrent=function(e){v.setCurrent(e)},this.getCurrent=function(){return v.getCurrent()},this.stem=function(){var e=v.cursor;return i(),v.cursor=e,t(),v.limit_backward=e,v.cursor=v.limit,a(),v.cursor=v.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.du.min.js b/assets/javascripts/lunr/min/lunr.du.min.js new file mode 100644 index 00000000..49a0f3f0 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.du.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Dutch` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){for(var e,r,i,o=C.cursor;;){if(C.bra=C.cursor,e=C.find_among(b,11))switch(C.ket=C.cursor,e){case 1:C.slice_from("a");continue;case 2:C.slice_from("e");continue;case 3:C.slice_from("i");continue;case 4:C.slice_from("o");continue;case 5:C.slice_from("u");continue;case 6:if(C.cursor>=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(r=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=r);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=r;else if(n(r))break}else if(n(r))break}function n(e){return C.cursor=e,e>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,f=_,t()||(_=C.cursor,_<3&&(_=3),t()||(f=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var e;;)if(C.bra=C.cursor,e=C.find_among(p,3))switch(C.ket=C.cursor,e){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return f<=C.cursor}function a(){var e=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-e,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var e;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.slice_del(),w=!0,a())))}function m(){var e;u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.eq_s_b(3,"gem")||(C.cursor=C.limit-e,C.slice_del(),a())))}function d(){var e,r,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,e=C.find_among_b(h,5))switch(C.bra=C.cursor,e){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(z,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(r=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-r,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,e=C.find_among_b(k,6))switch(C.bra=C.cursor,e){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(j,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var f,_,w,b=[new r("",-1,6),new r("á",0,1),new r("ä",0,1),new r("é",0,2),new r("ë",0,2),new r("í",0,3),new r("ï",0,3),new r("ó",0,4),new r("ö",0,4),new r("ú",0,5),new r("ü",0,5)],p=[new r("",-1,3),new r("I",0,2),new r("Y",0,1)],g=[new r("dd",-1,-1),new r("kk",-1,-1),new r("tt",-1,-1)],h=[new r("ene",-1,2),new r("se",-1,3),new r("en",-1,2),new r("heden",2,1),new r("s",-1,3)],k=[new r("end",-1,1),new r("ig",-1,2),new r("ing",-1,1),new r("lijk",-1,3),new r("baar",-1,4),new r("bar",-1,5)],v=[new r("aa",-1,-1),new r("ee",-1,-1),new r("oo",-1,-1),new r("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(e){C.setCurrent(e)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var r=C.cursor;return e(),C.cursor=r,o(),C.limit_backward=r,C.cursor=C.limit,d(),C.cursor=C.limit_backward,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.es.min.js b/assets/javascripts/lunr/min/lunr.es.min.js new file mode 100644 index 00000000..2989d342 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.es.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Spanish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=function(){var s=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){function e(){if(A.out_grouping(x,97,252)){for(;!A.in_grouping(x,97,252);){if(A.cursor>=A.limit)return!0;A.cursor++}return!1}return!0}function n(){if(A.in_grouping(x,97,252)){var s=A.cursor;if(e()){if(A.cursor=s,!A.in_grouping(x,97,252))return!0;for(;!A.out_grouping(x,97,252);){if(A.cursor>=A.limit)return!0;A.cursor++}}return!1}return!0}function i(){var s,r=A.cursor;if(n()){if(A.cursor=r,!A.out_grouping(x,97,252))return;if(s=A.cursor,e()){if(A.cursor=s,!A.in_grouping(x,97,252)||A.cursor>=A.limit)return;A.cursor++}}g=A.cursor}function a(){for(;!A.in_grouping(x,97,252);){if(A.cursor>=A.limit)return!1;A.cursor++}for(;!A.out_grouping(x,97,252);){if(A.cursor>=A.limit)return!1;A.cursor++}return!0}function t(){var e=A.cursor;g=A.limit,p=g,v=g,i(),A.cursor=e,a()&&(p=A.cursor,a()&&(v=A.cursor))}function o(){for(var e;;){if(A.bra=A.cursor,e=A.find_among(k,6))switch(A.ket=A.cursor,e){case 1:A.slice_from("a");continue;case 2:A.slice_from("e");continue;case 3:A.slice_from("i");continue;case 4:A.slice_from("o");continue;case 5:A.slice_from("u");continue;case 6:if(A.cursor>=A.limit)break;A.cursor++;continue}break}}function u(){return g<=A.cursor}function w(){return p<=A.cursor}function c(){return v<=A.cursor}function m(){var e;if(A.ket=A.cursor,A.find_among_b(y,13)&&(A.bra=A.cursor,(e=A.find_among_b(q,11))&&u()))switch(e){case 1:A.bra=A.cursor,A.slice_from("iendo");break;case 2:A.bra=A.cursor,A.slice_from("ando");break;case 3:A.bra=A.cursor,A.slice_from("ar");break;case 4:A.bra=A.cursor,A.slice_from("er");break;case 5:A.bra=A.cursor,A.slice_from("ir");break;case 6:A.slice_del();break;case 7:A.eq_s_b(1,"u")&&A.slice_del()}}function l(e,s){if(!c())return!0;A.slice_del(),A.ket=A.cursor;var r=A.find_among_b(e,s);return r&&(A.bra=A.cursor,1==r&&c()&&A.slice_del()),!1}function d(e){return!c()||(A.slice_del(),A.ket=A.cursor,A.eq_s_b(2,e)&&(A.bra=A.cursor,c()&&A.slice_del()),!1)}function b(){var e;if(A.ket=A.cursor,e=A.find_among_b(S,46)){switch(A.bra=A.cursor,e){case 1:if(!c())return!1;A.slice_del();break;case 2:if(d("ic"))return!1;break;case 3:if(!c())return!1;A.slice_from("log");break;case 4:if(!c())return!1;A.slice_from("u");break;case 5:if(!c())return!1;A.slice_from("ente");break;case 6:if(!w())return!1;A.slice_del(),A.ket=A.cursor,e=A.find_among_b(C,4),e&&(A.bra=A.cursor,c()&&(A.slice_del(),1==e&&(A.ket=A.cursor,A.eq_s_b(2,"at")&&(A.bra=A.cursor,c()&&A.slice_del()))));break;case 7:if(l(P,3))return!1;break;case 8:if(l(F,3))return!1;break;case 9:if(d("at"))return!1}return!0}return!1}function f(){var e,s;if(A.cursor>=g&&(s=A.limit_backward,A.limit_backward=g,A.ket=A.cursor,e=A.find_among_b(W,12),A.limit_backward=s,e)){if(A.bra=A.cursor,1==e){if(!A.eq_s_b(1,"u"))return!1;A.slice_del()}return!0}return!1}function _(){var e,s,r,n;if(A.cursor>=g&&(s=A.limit_backward,A.limit_backward=g,A.ket=A.cursor,e=A.find_among_b(L,96),A.limit_backward=s,e))switch(A.bra=A.cursor,e){case 1:r=A.limit-A.cursor,A.eq_s_b(1,"u")?(n=A.limit-A.cursor,A.eq_s_b(1,"g")?A.cursor=A.limit-n:A.cursor=A.limit-r):A.cursor=A.limit-r,A.bra=A.cursor;case 2:A.slice_del()}}function h(){var e,s;if(A.ket=A.cursor,e=A.find_among_b(z,8))switch(A.bra=A.cursor,e){case 1:u()&&A.slice_del();break;case 2:u()&&(A.slice_del(),A.ket=A.cursor,A.eq_s_b(1,"u")&&(A.bra=A.cursor,s=A.limit-A.cursor,A.eq_s_b(1,"g")&&(A.cursor=A.limit-s,u()&&A.slice_del())))}}var v,p,g,k=[new s("",-1,6),new s("á",0,1),new s("é",0,2),new s("í",0,3),new s("ó",0,4),new s("ú",0,5)],y=[new s("la",-1,-1),new s("sela",0,-1),new s("le",-1,-1),new s("me",-1,-1),new s("se",-1,-1),new s("lo",-1,-1),new s("selo",5,-1),new s("las",-1,-1),new s("selas",7,-1),new s("les",-1,-1),new s("los",-1,-1),new s("selos",10,-1),new s("nos",-1,-1)],q=[new s("ando",-1,6),new s("iendo",-1,6),new s("yendo",-1,7),new s("ándo",-1,2),new s("iéndo",-1,1),new s("ar",-1,6),new s("er",-1,6),new s("ir",-1,6),new s("ár",-1,3),new s("ér",-1,4),new s("ír",-1,5)],C=[new s("ic",-1,-1),new s("ad",-1,-1),new s("os",-1,-1),new s("iv",-1,1)],P=[new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,1)],F=[new s("ic",-1,1),new s("abil",-1,1),new s("iv",-1,1)],S=[new s("ica",-1,1),new s("ancia",-1,2),new s("encia",-1,5),new s("adora",-1,2),new s("osa",-1,1),new s("ista",-1,1),new s("iva",-1,9),new s("anza",-1,1),new s("logía",-1,3),new s("idad",-1,8),new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,2),new s("mente",-1,7),new s("amente",13,6),new s("ación",-1,2),new s("ución",-1,4),new s("ico",-1,1),new s("ismo",-1,1),new s("oso",-1,1),new s("amiento",-1,1),new s("imiento",-1,1),new s("ivo",-1,9),new s("ador",-1,2),new s("icas",-1,1),new s("ancias",-1,2),new s("encias",-1,5),new s("adoras",-1,2),new s("osas",-1,1),new s("istas",-1,1),new s("ivas",-1,9),new s("anzas",-1,1),new s("logías",-1,3),new s("idades",-1,8),new s("ables",-1,1),new s("ibles",-1,1),new s("aciones",-1,2),new s("uciones",-1,4),new s("adores",-1,2),new s("antes",-1,2),new s("icos",-1,1),new s("ismos",-1,1),new s("osos",-1,1),new s("amientos",-1,1),new s("imientos",-1,1),new s("ivos",-1,9)],W=[new s("ya",-1,1),new s("ye",-1,1),new s("yan",-1,1),new s("yen",-1,1),new s("yeron",-1,1),new s("yendo",-1,1),new s("yo",-1,1),new s("yas",-1,1),new s("yes",-1,1),new s("yais",-1,1),new s("yamos",-1,1),new s("yó",-1,1)],L=[new s("aba",-1,2),new s("ada",-1,2),new s("ida",-1,2),new s("ara",-1,2),new s("iera",-1,2),new s("ía",-1,2),new s("aría",5,2),new s("ería",5,2),new s("iría",5,2),new s("ad",-1,2),new s("ed",-1,2),new s("id",-1,2),new s("ase",-1,2),new s("iese",-1,2),new s("aste",-1,2),new s("iste",-1,2),new s("an",-1,2),new s("aban",16,2),new s("aran",16,2),new s("ieran",16,2),new s("ían",16,2),new s("arían",20,2),new s("erían",20,2),new s("irían",20,2),new s("en",-1,1),new s("asen",24,2),new s("iesen",24,2),new s("aron",-1,2),new s("ieron",-1,2),new s("arán",-1,2),new s("erán",-1,2),new s("irán",-1,2),new s("ado",-1,2),new s("ido",-1,2),new s("ando",-1,2),new s("iendo",-1,2),new s("ar",-1,2),new s("er",-1,2),new s("ir",-1,2),new s("as",-1,2),new s("abas",39,2),new s("adas",39,2),new s("idas",39,2),new s("aras",39,2),new s("ieras",39,2),new s("ías",39,2),new s("arías",45,2),new s("erías",45,2),new s("irías",45,2),new s("es",-1,1),new s("ases",49,2),new s("ieses",49,2),new s("abais",-1,2),new s("arais",-1,2),new s("ierais",-1,2),new s("íais",-1,2),new s("aríais",55,2),new s("eríais",55,2),new s("iríais",55,2),new s("aseis",-1,2),new s("ieseis",-1,2),new s("asteis",-1,2),new s("isteis",-1,2),new s("áis",-1,2),new s("éis",-1,1),new s("aréis",64,2),new s("eréis",64,2),new s("iréis",64,2),new s("ados",-1,2),new s("idos",-1,2),new s("amos",-1,2),new s("ábamos",70,2),new s("áramos",70,2),new s("iéramos",70,2),new s("íamos",70,2),new s("aríamos",74,2),new s("eríamos",74,2),new s("iríamos",74,2),new s("emos",-1,1),new s("aremos",78,2),new s("eremos",78,2),new s("iremos",78,2),new s("ásemos",78,2),new s("iésemos",78,2),new s("imos",-1,2),new s("arás",-1,2),new s("erás",-1,2),new s("irás",-1,2),new s("ís",-1,2),new s("ará",-1,2),new s("erá",-1,2),new s("irá",-1,2),new s("aré",-1,2),new s("eré",-1,2),new s("iré",-1,2),new s("ió",-1,2)],z=[new s("a",-1,1),new s("e",-1,2),new s("o",-1,1),new s("os",-1,1),new s("á",-1,1),new s("é",-1,2),new s("í",-1,1),new s("ó",-1,1)],x=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],A=new r;this.setCurrent=function(e){A.setCurrent(e)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){var e=A.cursor;return t(),A.limit_backward=e,A.cursor=A.limit,m(),A.cursor=A.limit,b()||(A.cursor=A.limit,f()||(A.cursor=A.limit,_())),A.cursor=A.limit,h(),A.cursor=A.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.fi.min.js b/assets/javascripts/lunr/min/lunr.fi.min.js new file mode 100644 index 00000000..29f5dfce --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.fi.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Finnish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=function(){var e=i.stemmerSupport.Among,r=i.stemmerSupport.SnowballProgram,n=new function(){function i(){f=A.limit,d=f,n()||(f=A.cursor,n()||(d=A.cursor))}function n(){for(var i;;){if(i=A.cursor,A.in_grouping(W,97,246))break;if(A.cursor=i,i>=A.limit)return!0;A.cursor++}for(A.cursor=i;!A.out_grouping(W,97,246);){if(A.cursor>=A.limit)return!0;A.cursor++}return!1}function t(){return d<=A.cursor}function s(){var i,e;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(h,10)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.in_grouping_b(x,97,246))return;break;case 2:if(!t())return}A.slice_del()}else A.limit_backward=e}function o(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(v,9))switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:r=A.limit-A.cursor,A.eq_s_b(1,"k")||(A.cursor=A.limit-r,A.slice_del());break;case 2:A.slice_del(),A.ket=A.cursor,A.eq_s_b(3,"kse")&&(A.bra=A.cursor,A.slice_from("ksi"));break;case 3:A.slice_del();break;case 4:A.find_among_b(p,6)&&A.slice_del();break;case 5:A.find_among_b(g,6)&&A.slice_del();break;case 6:A.find_among_b(j,2)&&A.slice_del()}else A.limit_backward=e}function l(){return A.find_among_b(q,7)}function a(){return A.eq_s_b(1,"i")&&A.in_grouping_b(L,97,246)}function u(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(C,30)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.eq_s_b(1,"a"))return;break;case 2:case 9:if(!A.eq_s_b(1,"e"))return;break;case 3:if(!A.eq_s_b(1,"i"))return;break;case 4:if(!A.eq_s_b(1,"o"))return;break;case 5:if(!A.eq_s_b(1,"ä"))return;break;case 6:if(!A.eq_s_b(1,"ö"))return;break;case 7:if(r=A.limit-A.cursor,!l()&&(A.cursor=A.limit-r,!A.eq_s_b(2,"ie"))){A.cursor=A.limit-r;break}if(A.cursor=A.limit-r,A.cursor<=A.limit_backward){A.cursor=A.limit-r;break}A.cursor--,A.bra=A.cursor;break;case 8:if(!A.in_grouping_b(W,97,246)||!A.out_grouping_b(W,97,246))return}A.slice_del(),k=!0}else A.limit_backward=e}function c(){var i,e,r;if(A.cursor>=d)if(e=A.limit_backward,A.limit_backward=d,A.ket=A.cursor,i=A.find_among_b(P,14)){if(A.bra=A.cursor,A.limit_backward=e,1==i){if(r=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-r}A.slice_del()}else A.limit_backward=e}function m(){var i;A.cursor>=f&&(i=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.find_among_b(F,2)?(A.bra=A.cursor,A.limit_backward=i,A.slice_del()):A.limit_backward=i)}function w(){var i,e,r,n,t,s;if(A.cursor>=f){if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.eq_s_b(1,"t")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.in_grouping_b(W,97,246)&&(A.cursor=A.limit-r,A.slice_del(),A.limit_backward=e,n=A.limit-A.cursor,A.cursor>=d&&(A.cursor=d,t=A.limit_backward,A.limit_backward=A.cursor,A.cursor=A.limit-n,A.ket=A.cursor,i=A.find_among_b(S,2))))){if(A.bra=A.cursor,A.limit_backward=t,1==i){if(s=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-s}return void A.slice_del()}A.limit_backward=e}}function _(){var i,e,r,n;if(A.cursor>=f){for(i=A.limit_backward,A.limit_backward=f,e=A.limit-A.cursor,l()&&(A.cursor=A.limit-e,A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.in_grouping_b(y,97,228)&&(A.bra=A.cursor,A.out_grouping_b(W,97,246)&&A.slice_del()),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"j")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.eq_s_b(1,"o")?A.slice_del():(A.cursor=A.limit-r,A.eq_s_b(1,"u")&&A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"o")&&(A.bra=A.cursor,A.eq_s_b(1,"j")&&A.slice_del()),A.cursor=A.limit-e,A.limit_backward=i;;){if(n=A.limit-A.cursor,A.out_grouping_b(W,97,246)){A.cursor=A.limit-n;break}if(A.cursor=A.limit-n,A.cursor<=A.limit_backward)return;A.cursor--}A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,b=A.slice_to(),A.eq_v_b(b)&&A.slice_del())}}var k,b,d,f,h=[new e("pa",-1,1),new e("sti",-1,2),new e("kaan",-1,1),new e("han",-1,1),new e("kin",-1,1),new e("hän",-1,1),new e("kään",-1,1),new e("ko",-1,1),new e("pä",-1,1),new e("kö",-1,1)],p=[new e("lla",-1,-1),new e("na",-1,-1),new e("ssa",-1,-1),new e("ta",-1,-1),new e("lta",3,-1),new e("sta",3,-1)],g=[new e("llä",-1,-1),new e("nä",-1,-1),new e("ssä",-1,-1),new e("tä",-1,-1),new e("ltä",3,-1),new e("stä",3,-1)],j=[new e("lle",-1,-1),new e("ine",-1,-1)],v=[new e("nsa",-1,3),new e("mme",-1,3),new e("nne",-1,3),new e("ni",-1,2),new e("si",-1,1),new e("an",-1,4),new e("en",-1,6),new e("än",-1,5),new e("nsä",-1,3)],q=[new e("aa",-1,-1),new e("ee",-1,-1),new e("ii",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1),new e("ää",-1,-1),new e("öö",-1,-1)],C=[new e("a",-1,8),new e("lla",0,-1),new e("na",0,-1),new e("ssa",0,-1),new e("ta",0,-1),new e("lta",4,-1),new e("sta",4,-1),new e("tta",4,9),new e("lle",-1,-1),new e("ine",-1,-1),new e("ksi",-1,-1),new e("n",-1,7),new e("han",11,1),new e("den",11,-1,a),new e("seen",11,-1,l),new e("hen",11,2),new e("tten",11,-1,a),new e("hin",11,3),new e("siin",11,-1,a),new e("hon",11,4),new e("hän",11,5),new e("hön",11,6),new e("ä",-1,8),new e("llä",22,-1),new e("nä",22,-1),new e("ssä",22,-1),new e("tä",22,-1),new e("ltä",26,-1),new e("stä",26,-1),new e("ttä",26,9)],P=[new e("eja",-1,-1),new e("mma",-1,1),new e("imma",1,-1),new e("mpa",-1,1),new e("impa",3,-1),new e("mmi",-1,1),new e("immi",5,-1),new e("mpi",-1,1),new e("impi",7,-1),new e("ejä",-1,-1),new e("mmä",-1,1),new e("immä",10,-1),new e("mpä",-1,1),new e("impä",12,-1)],F=[new e("i",-1,-1),new e("j",-1,-1)],S=[new e("mma",-1,1),new e("imma",0,-1)],y=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],W=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],L=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],x=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],A=new r;this.setCurrent=function(i){A.setCurrent(i)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){var e=A.cursor;return i(),k=!1,A.limit_backward=e,A.cursor=A.limit,s(),A.cursor=A.limit,o(),A.cursor=A.limit,u(),A.cursor=A.limit,c(),A.cursor=A.limit,k?(m(),A.cursor=A.limit):(A.cursor=A.limit,w(),A.cursor=A.limit),_(),!0}};return function(i){return"function"==typeof i.update?i.update(function(i){return n.setCurrent(i),n.stem(),n.getCurrent()}):(n.setCurrent(i),n.stem(),n.getCurrent())}}(),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.fr.min.js b/assets/javascripts/lunr/min/lunr.fr.min.js new file mode 100644 index 00000000..68cd0094 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.fr.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `French` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,s){return!(!W.eq_s(1,e)||(W.ket=W.cursor,!W.in_grouping(F,97,251)))&&(W.slice_from(r),W.cursor=s,!0)}function i(e,r,s){return!!W.eq_s(1,e)&&(W.ket=W.cursor,W.slice_from(r),W.cursor=s,!0)}function n(){for(var r,s;;){if(r=W.cursor,W.in_grouping(F,97,251)){if(W.bra=W.cursor,s=W.cursor,e("u","U",r))continue;if(W.cursor=s,e("i","I",r))continue;if(W.cursor=s,i("y","Y",r))continue}if(W.cursor=r,W.bra=r,!e("y","Y",r)){if(W.cursor=r,W.eq_s(1,"q")&&(W.bra=W.cursor,i("u","U",r)))continue;if(W.cursor=r,r>=W.limit)return;W.cursor++}}}function t(){for(;!W.in_grouping(F,97,251);){if(W.cursor>=W.limit)return!0;W.cursor++}for(;!W.out_grouping(F,97,251);){if(W.cursor>=W.limit)return!0;W.cursor++}return!1}function u(){var e=W.cursor;if(q=W.limit,g=q,p=q,W.in_grouping(F,97,251)&&W.in_grouping(F,97,251)&&W.cursor=W.limit){W.cursor=q;break}W.cursor++}while(!W.in_grouping(F,97,251))}q=W.cursor,W.cursor=e,t()||(g=W.cursor,t()||(p=W.cursor))}function o(){for(var e,r;;){if(r=W.cursor,W.bra=r,!(e=W.find_among(h,4)))break;switch(W.ket=W.cursor,e){case 1:W.slice_from("i");break;case 2:W.slice_from("u");break;case 3:W.slice_from("y");break;case 4:if(W.cursor>=W.limit)return;W.cursor++}}}function c(){return q<=W.cursor}function a(){return g<=W.cursor}function l(){return p<=W.cursor}function w(){var e,r;if(W.ket=W.cursor,e=W.find_among_b(C,43)){switch(W.bra=W.cursor,e){case 1:if(!l())return!1;W.slice_del();break;case 2:if(!l())return!1;W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"ic")&&(W.bra=W.cursor,l()?W.slice_del():W.slice_from("iqU"));break;case 3:if(!l())return!1;W.slice_from("log");break;case 4:if(!l())return!1;W.slice_from("u");break;case 5:if(!l())return!1;W.slice_from("ent");break;case 6:if(!c())return!1;if(W.slice_del(),W.ket=W.cursor,e=W.find_among_b(z,6))switch(W.bra=W.cursor,e){case 1:l()&&(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"at")&&(W.bra=W.cursor,l()&&W.slice_del()));break;case 2:l()?W.slice_del():a()&&W.slice_from("eux");break;case 3:l()&&W.slice_del();break;case 4:c()&&W.slice_from("i")}break;case 7:if(!l())return!1;if(W.slice_del(),W.ket=W.cursor,e=W.find_among_b(y,3))switch(W.bra=W.cursor,e){case 1:l()?W.slice_del():W.slice_from("abl");break;case 2:l()?W.slice_del():W.slice_from("iqU");break;case 3:l()&&W.slice_del()}break;case 8:if(!l())return!1;if(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"at")&&(W.bra=W.cursor,l()&&(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"ic")))){W.bra=W.cursor,l()?W.slice_del():W.slice_from("iqU");break}break;case 9:W.slice_from("eau");break;case 10:if(!a())return!1;W.slice_from("al");break;case 11:if(l())W.slice_del();else{if(!a())return!1;W.slice_from("eux")}break;case 12:if(!a()||!W.out_grouping_b(F,97,251))return!1;W.slice_del();break;case 13:return c()&&W.slice_from("ant"),!1;case 14:return c()&&W.slice_from("ent"),!1;case 15:return r=W.limit-W.cursor,W.in_grouping_b(F,97,251)&&c()&&(W.cursor=W.limit-r,W.slice_del()),!1}return!0}return!1}function f(){var e,r;if(W.cursor=q){if(s=W.limit_backward,W.limit_backward=q,W.ket=W.cursor,e=W.find_among_b(P,7))switch(W.bra=W.cursor,e){case 1:if(l()){if(i=W.limit-W.cursor,!W.eq_s_b(1,"s")&&(W.cursor=W.limit-i,!W.eq_s_b(1,"t")))break;W.slice_del()}break;case 2:W.slice_from("i");break;case 3:W.slice_del();break;case 4:W.eq_s_b(2,"gu")&&W.slice_del()}W.limit_backward=s}}function b(){var e=W.limit-W.cursor;W.find_among_b(U,5)&&(W.cursor=W.limit-e,W.ket=W.cursor,W.cursor>W.limit_backward&&(W.cursor--,W.bra=W.cursor,W.slice_del()))}function d(){for(var e,r=1;W.out_grouping_b(F,97,251);)r--;if(r<=0){if(W.ket=W.cursor,e=W.limit-W.cursor,!W.eq_s_b(1,"é")&&(W.cursor=W.limit-e,!W.eq_s_b(1,"è")))return;W.bra=W.cursor,W.slice_from("e")}}function k(){if(!w()&&(W.cursor=W.limit,!f()&&(W.cursor=W.limit,!m())))return W.cursor=W.limit,void _();W.cursor=W.limit,W.ket=W.cursor,W.eq_s_b(1,"Y")?(W.bra=W.cursor,W.slice_from("i")):(W.cursor=W.limit,W.eq_s_b(1,"ç")&&(W.bra=W.cursor,W.slice_from("c")))}var p,g,q,v=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],h=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],z=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],y=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],C=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],x=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],I=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],P=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],U=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],F=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],S=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],W=new s;this.setCurrent=function(e){W.setCurrent(e)},this.getCurrent=function(){return W.getCurrent()},this.stem=function(){var e=W.cursor;return n(),W.cursor=e,u(),W.limit_backward=e,W.cursor=W.limit,k(),W.cursor=W.limit,b(),W.cursor=W.limit,d(),W.cursor=W.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.hi.min.js b/assets/javascripts/lunr/min/lunr.hi.min.js new file mode 100644 index 00000000..7dbc4140 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.hi.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿa-zA-Za-zA-Z0-90-9",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("अत अपना अपनी अपने अभी अंदर आदि आप इत्यादि इन इनका इन्हीं इन्हें इन्हों इस इसका इसकी इसके इसमें इसी इसे उन उनका उनकी उनके उनको उन्हीं उन्हें उन्हों उस उसके उसी उसे एक एवं एस ऐसे और कई कर करता करते करना करने करें कहते कहा का काफ़ी कि कितना किन्हें किन्हों किया किर किस किसी किसे की कुछ कुल के को कोई कौन कौनसा गया घर जब जहाँ जा जितना जिन जिन्हें जिन्हों जिस जिसे जीधर जैसा जैसे जो तक तब तरह तिन तिन्हें तिन्हों तिस तिसे तो था थी थे दबारा दिया दुसरा दूसरे दो द्वारा न नके नहीं ना निहायत नीचे ने पर पहले पूरा पे फिर बनी बही बहुत बाद बाला बिलकुल भी भीतर मगर मानो मे में यदि यह यहाँ यही या यिह ये रखें रहा रहे ऱ्वासा लिए लिये लेकिन व वग़ैरह वर्ग वह वहाँ वहीं वाले वुह वे वो सकता सकते सबसे सभी साथ साबुत साभ सारा से सो संग ही हुआ हुई हुए है हैं हो होता होती होते होना होने".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.hu.min.js b/assets/javascripts/lunr/min/lunr.hu.min.js new file mode 100644 index 00000000..ed9d909f --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.hu.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Hungarian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,n=L.cursor;if(d=L.limit,L.in_grouping(W,97,252))for(;;){if(e=L.cursor,L.out_grouping(W,97,252))return L.cursor=e,L.find_among(g,8)||(L.cursor=e,e=L.limit)return void(d=e);L.cursor++}if(L.cursor=n,L.out_grouping(W,97,252)){for(;!L.in_grouping(W,97,252);){if(L.cursor>=L.limit)return;L.cursor++}d=L.cursor}}function i(){return d<=L.cursor}function a(){var e;if(L.ket=L.cursor,(e=L.find_among_b(h,2))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("a");break;case 2:L.slice_from("e")}}function t(){var e=L.limit-L.cursor;return!!L.find_among_b(p,23)&&(L.cursor=L.limit-e,!0)}function s(){if(L.cursor>L.limit_backward){L.cursor--,L.ket=L.cursor;var e=L.cursor-1;L.limit_backward<=e&&e<=L.limit&&(L.cursor=e,L.bra=e,L.slice_del())}}function c(){var e;if(L.ket=L.cursor,(e=L.find_among_b(_,2))&&(L.bra=L.cursor,i())){if((1==e||2==e)&&!t())return;L.slice_del(),s()}}function o(){L.ket=L.cursor,L.find_among_b(v,44)&&(L.bra=L.cursor,i()&&(L.slice_del(),a()))}function w(){var e;if(L.ket=L.cursor,(e=L.find_among_b(z,3))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("e");break;case 2:case 3:L.slice_from("a")}}function l(){var e;if(L.ket=L.cursor,(e=L.find_among_b(y,6))&&(L.bra=L.cursor,i()))switch(e){case 1:case 2:L.slice_del();break;case 3:L.slice_from("a");break;case 4:L.slice_from("e")}}function u(){var e;if(L.ket=L.cursor,(e=L.find_among_b(j,2))&&(L.bra=L.cursor,i())){if((1==e||2==e)&&!t())return;L.slice_del(),s()}}function m(){var e;if(L.ket=L.cursor,(e=L.find_among_b(C,7))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("a");break;case 2:L.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:L.slice_del()}}function k(){var e;if(L.ket=L.cursor,(e=L.find_among_b(P,12))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 7:case 9:L.slice_del();break;case 2:case 5:case 8:L.slice_from("e");break;case 3:case 6:L.slice_from("a")}}function f(){var e;if(L.ket=L.cursor,(e=L.find_among_b(F,31))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:L.slice_del();break;case 2:case 5:case 10:case 14:case 19:L.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:L.slice_from("e")}}function b(){var e;if(L.ket=L.cursor,(e=L.find_among_b(S,42))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:L.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:L.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:L.slice_from("e")}}var d,g=[new n("cs",-1,-1),new n("dzs",-1,-1),new n("gy",-1,-1),new n("ly",-1,-1),new n("ny",-1,-1),new n("sz",-1,-1),new n("ty",-1,-1),new n("zs",-1,-1)],h=[new n("á",-1,1),new n("é",-1,2)],p=[new n("bb",-1,-1),new n("cc",-1,-1),new n("dd",-1,-1),new n("ff",-1,-1),new n("gg",-1,-1),new n("jj",-1,-1),new n("kk",-1,-1),new n("ll",-1,-1),new n("mm",-1,-1),new n("nn",-1,-1),new n("pp",-1,-1),new n("rr",-1,-1),new n("ccs",-1,-1),new n("ss",-1,-1),new n("zzs",-1,-1),new n("tt",-1,-1),new n("vv",-1,-1),new n("ggy",-1,-1),new n("lly",-1,-1),new n("nny",-1,-1),new n("tty",-1,-1),new n("ssz",-1,-1),new n("zz",-1,-1)],_=[new n("al",-1,1),new n("el",-1,2)],v=[new n("ba",-1,-1),new n("ra",-1,-1),new n("be",-1,-1),new n("re",-1,-1),new n("ig",-1,-1),new n("nak",-1,-1),new n("nek",-1,-1),new n("val",-1,-1),new n("vel",-1,-1),new n("ul",-1,-1),new n("nál",-1,-1),new n("nél",-1,-1),new n("ból",-1,-1),new n("ról",-1,-1),new n("tól",-1,-1),new n("bõl",-1,-1),new n("rõl",-1,-1),new n("tõl",-1,-1),new n("ül",-1,-1),new n("n",-1,-1),new n("an",19,-1),new n("ban",20,-1),new n("en",19,-1),new n("ben",22,-1),new n("képpen",22,-1),new n("on",19,-1),new n("ön",19,-1),new n("képp",-1,-1),new n("kor",-1,-1),new n("t",-1,-1),new n("at",29,-1),new n("et",29,-1),new n("ként",29,-1),new n("anként",32,-1),new n("enként",32,-1),new n("onként",32,-1),new n("ot",29,-1),new n("ért",29,-1),new n("öt",29,-1),new n("hez",-1,-1),new n("hoz",-1,-1),new n("höz",-1,-1),new n("vá",-1,-1),new n("vé",-1,-1)],z=[new n("án",-1,2),new n("én",-1,1),new n("ánként",-1,3)],y=[new n("stul",-1,2),new n("astul",0,1),new n("ástul",0,3),new n("stül",-1,2),new n("estül",3,1),new n("éstül",3,4)],j=[new n("á",-1,1),new n("é",-1,2)],C=[new n("k",-1,7),new n("ak",0,4),new n("ek",0,6),new n("ok",0,5),new n("ák",0,1),new n("ék",0,2),new n("ök",0,3)],P=[new n("éi",-1,7),new n("áéi",0,6),new n("ééi",0,5),new n("é",-1,9),new n("ké",3,4),new n("aké",4,1),new n("eké",4,1),new n("oké",4,1),new n("áké",4,3),new n("éké",4,2),new n("öké",4,1),new n("éé",3,8)],F=[new n("a",-1,18),new n("ja",0,17),new n("d",-1,16),new n("ad",2,13),new n("ed",2,13),new n("od",2,13),new n("ád",2,14),new n("éd",2,15),new n("öd",2,13),new n("e",-1,18),new n("je",9,17),new n("nk",-1,4),new n("unk",11,1),new n("ánk",11,2),new n("énk",11,3),new n("ünk",11,1),new n("uk",-1,8),new n("juk",16,7),new n("ájuk",17,5),new n("ük",-1,8),new n("jük",19,7),new n("éjük",20,6),new n("m",-1,12),new n("am",22,9),new n("em",22,9),new n("om",22,9),new n("ám",22,10),new n("ém",22,11),new n("o",-1,18),new n("á",-1,19),new n("é",-1,20)],S=[new n("id",-1,10),new n("aid",0,9),new n("jaid",1,6),new n("eid",0,9),new n("jeid",3,6),new n("áid",0,7),new n("éid",0,8),new n("i",-1,15),new n("ai",7,14),new n("jai",8,11),new n("ei",7,14),new n("jei",10,11),new n("ái",7,12),new n("éi",7,13),new n("itek",-1,24),new n("eitek",14,21),new n("jeitek",15,20),new n("éitek",14,23),new n("ik",-1,29),new n("aik",18,26),new n("jaik",19,25),new n("eik",18,26),new n("jeik",21,25),new n("áik",18,27),new n("éik",18,28),new n("ink",-1,20),new n("aink",25,17),new n("jaink",26,16),new n("eink",25,17),new n("jeink",28,16),new n("áink",25,18),new n("éink",25,19),new n("aitok",-1,21),new n("jaitok",32,20),new n("áitok",-1,22),new n("im",-1,5),new n("aim",35,4),new n("jaim",36,1),new n("eim",35,4),new n("jeim",38,1),new n("áim",35,2),new n("éim",35,3)],W=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],L=new r;this.setCurrent=function(e){L.setCurrent(e)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){var n=L.cursor;return e(),L.limit_backward=n,L.cursor=L.limit,c(),L.cursor=L.limit,o(),L.cursor=L.limit,w(),L.cursor=L.limit,l(),L.cursor=L.limit,u(),L.cursor=L.limit,k(),L.cursor=L.limit,f(),L.cursor=L.limit,b(),L.cursor=L.limit,m(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.it.min.js b/assets/javascripts/lunr/min/lunr.it.min.js new file mode 100644 index 00000000..344b6a3c --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.it.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Italian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!x.eq_s(1,e)||(x.ket=x.cursor,!x.in_grouping(L,97,249)))&&(x.slice_from(r),x.cursor=n,!0)}function i(){for(var r,n,i,o,t=x.cursor;;){if(x.bra=x.cursor,r=x.find_among(h,7))switch(x.ket=x.cursor,r){case 1:x.slice_from("à");continue;case 2:x.slice_from("è");continue;case 3:x.slice_from("ì");continue;case 4:x.slice_from("ò");continue;case 5:x.slice_from("ù");continue;case 6:x.slice_from("qU");continue;case 7:if(x.cursor>=x.limit)break;x.cursor++;continue}break}for(x.cursor=t;;)for(n=x.cursor;;){if(i=x.cursor,x.in_grouping(L,97,249)){if(x.bra=x.cursor,o=x.cursor,e("u","U",i))break;if(x.cursor=o,e("i","I",i))break}if(x.cursor=i,x.cursor>=x.limit)return void(x.cursor=n);x.cursor++}}function o(e){if(x.cursor=e,!x.in_grouping(L,97,249))return!1;for(;!x.out_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}return!0}function t(){if(x.in_grouping(L,97,249)){var e=x.cursor;if(x.out_grouping(L,97,249)){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return o(e);x.cursor++}return!0}return o(e)}return!1}function s(){var e,r=x.cursor;if(!t()){if(x.cursor=r,!x.out_grouping(L,97,249))return;if(e=x.cursor,x.out_grouping(L,97,249)){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return x.cursor=e,void(x.in_grouping(L,97,249)&&x.cursor=x.limit)return;x.cursor++}k=x.cursor}function a(){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}for(;!x.out_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}return!0}function u(){var e=x.cursor;k=x.limit,p=k,g=k,s(),x.cursor=e,a()&&(p=x.cursor,a()&&(g=x.cursor))}function c(){for(var e;;){if(x.bra=x.cursor,!(e=x.find_among(q,3)))break;switch(x.ket=x.cursor,e){case 1:x.slice_from("i");break;case 2:x.slice_from("u");break;case 3:if(x.cursor>=x.limit)return;x.cursor++}}}function w(){return k<=x.cursor}function l(){return p<=x.cursor}function m(){return g<=x.cursor}function f(){var e;if(x.ket=x.cursor,x.find_among_b(C,37)&&(x.bra=x.cursor,(e=x.find_among_b(z,5))&&w()))switch(e){case 1:x.slice_del();break;case 2:x.slice_from("e")}}function v(){var e;if(x.ket=x.cursor,!(e=x.find_among_b(S,51)))return!1;switch(x.bra=x.cursor,e){case 1:if(!m())return!1;x.slice_del();break;case 2:if(!m())return!1;x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"ic")&&(x.bra=x.cursor,m()&&x.slice_del());break;case 3:if(!m())return!1;x.slice_from("log");break;case 4:if(!m())return!1;x.slice_from("u");break;case 5:if(!m())return!1;x.slice_from("ente");break;case 6:if(!w())return!1;x.slice_del();break;case 7:if(!l())return!1;x.slice_del(),x.ket=x.cursor,e=x.find_among_b(P,4),e&&(x.bra=x.cursor,m()&&(x.slice_del(),1==e&&(x.ket=x.cursor,x.eq_s_b(2,"at")&&(x.bra=x.cursor,m()&&x.slice_del()))));break;case 8:if(!m())return!1;x.slice_del(),x.ket=x.cursor,e=x.find_among_b(F,3),e&&(x.bra=x.cursor,1==e&&m()&&x.slice_del());break;case 9:if(!m())return!1;x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"at")&&(x.bra=x.cursor,m()&&(x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"ic")&&(x.bra=x.cursor,m()&&x.slice_del())))}return!0}function b(){var e,r;x.cursor>=k&&(r=x.limit_backward,x.limit_backward=k,x.ket=x.cursor,e=x.find_among_b(W,87),e&&(x.bra=x.cursor,1==e&&x.slice_del()),x.limit_backward=r)}function d(){var e=x.limit-x.cursor;if(x.ket=x.cursor,x.in_grouping_b(y,97,242)&&(x.bra=x.cursor,w()&&(x.slice_del(),x.ket=x.cursor,x.eq_s_b(1,"i")&&(x.bra=x.cursor,w()))))return void x.slice_del();x.cursor=x.limit-e}function _(){d(),x.ket=x.cursor,x.eq_s_b(1,"h")&&(x.bra=x.cursor,x.in_grouping_b(U,99,103)&&w()&&x.slice_del())}var g,p,k,h=[new r("",-1,7),new r("qu",0,6),new r("á",0,1),new r("é",0,2),new r("í",0,3),new r("ó",0,4),new r("ú",0,5)],q=[new r("",-1,3),new r("I",0,1),new r("U",0,2)],C=[new r("la",-1,-1),new r("cela",0,-1),new r("gliela",0,-1),new r("mela",0,-1),new r("tela",0,-1),new r("vela",0,-1),new r("le",-1,-1),new r("cele",6,-1),new r("gliele",6,-1),new r("mele",6,-1),new r("tele",6,-1),new r("vele",6,-1),new r("ne",-1,-1),new r("cene",12,-1),new r("gliene",12,-1),new r("mene",12,-1),new r("sene",12,-1),new r("tene",12,-1),new r("vene",12,-1),new r("ci",-1,-1),new r("li",-1,-1),new r("celi",20,-1),new r("glieli",20,-1),new r("meli",20,-1),new r("teli",20,-1),new r("veli",20,-1),new r("gli",20,-1),new r("mi",-1,-1),new r("si",-1,-1),new r("ti",-1,-1),new r("vi",-1,-1),new r("lo",-1,-1),new r("celo",31,-1),new r("glielo",31,-1),new r("melo",31,-1),new r("telo",31,-1),new r("velo",31,-1)],z=[new r("ando",-1,1),new r("endo",-1,1),new r("ar",-1,2),new r("er",-1,2),new r("ir",-1,2)],P=[new r("ic",-1,-1),new r("abil",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],F=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],S=[new r("ica",-1,1),new r("logia",-1,3),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,9),new r("anza",-1,1),new r("enza",-1,5),new r("ice",-1,1),new r("atrice",7,1),new r("iche",-1,1),new r("logie",-1,3),new r("abile",-1,1),new r("ibile",-1,1),new r("usione",-1,4),new r("azione",-1,2),new r("uzione",-1,4),new r("atore",-1,2),new r("ose",-1,1),new r("ante",-1,1),new r("mente",-1,1),new r("amente",19,7),new r("iste",-1,1),new r("ive",-1,9),new r("anze",-1,1),new r("enze",-1,5),new r("ici",-1,1),new r("atrici",25,1),new r("ichi",-1,1),new r("abili",-1,1),new r("ibili",-1,1),new r("ismi",-1,1),new r("usioni",-1,4),new r("azioni",-1,2),new r("uzioni",-1,4),new r("atori",-1,2),new r("osi",-1,1),new r("anti",-1,1),new r("amenti",-1,6),new r("imenti",-1,6),new r("isti",-1,1),new r("ivi",-1,9),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,6),new r("imento",-1,6),new r("ivo",-1,9),new r("ità",-1,8),new r("istà",-1,1),new r("istè",-1,1),new r("istì",-1,1)],W=[new r("isca",-1,1),new r("enda",-1,1),new r("ata",-1,1),new r("ita",-1,1),new r("uta",-1,1),new r("ava",-1,1),new r("eva",-1,1),new r("iva",-1,1),new r("erebbe",-1,1),new r("irebbe",-1,1),new r("isce",-1,1),new r("ende",-1,1),new r("are",-1,1),new r("ere",-1,1),new r("ire",-1,1),new r("asse",-1,1),new r("ate",-1,1),new r("avate",16,1),new r("evate",16,1),new r("ivate",16,1),new r("ete",-1,1),new r("erete",20,1),new r("irete",20,1),new r("ite",-1,1),new r("ereste",-1,1),new r("ireste",-1,1),new r("ute",-1,1),new r("erai",-1,1),new r("irai",-1,1),new r("isci",-1,1),new r("endi",-1,1),new r("erei",-1,1),new r("irei",-1,1),new r("assi",-1,1),new r("ati",-1,1),new r("iti",-1,1),new r("eresti",-1,1),new r("iresti",-1,1),new r("uti",-1,1),new r("avi",-1,1),new r("evi",-1,1),new r("ivi",-1,1),new r("isco",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("Yamo",-1,1),new r("iamo",-1,1),new r("avamo",-1,1),new r("evamo",-1,1),new r("ivamo",-1,1),new r("eremo",-1,1),new r("iremo",-1,1),new r("assimo",-1,1),new r("ammo",-1,1),new r("emmo",-1,1),new r("eremmo",54,1),new r("iremmo",54,1),new r("immo",-1,1),new r("ano",-1,1),new r("iscano",58,1),new r("avano",58,1),new r("evano",58,1),new r("ivano",58,1),new r("eranno",-1,1),new r("iranno",-1,1),new r("ono",-1,1),new r("iscono",65,1),new r("arono",65,1),new r("erono",65,1),new r("irono",65,1),new r("erebbero",-1,1),new r("irebbero",-1,1),new r("assero",-1,1),new r("essero",-1,1),new r("issero",-1,1),new r("ato",-1,1),new r("ito",-1,1),new r("uto",-1,1),new r("avo",-1,1),new r("evo",-1,1),new r("ivo",-1,1),new r("ar",-1,1),new r("ir",-1,1),new r("erà",-1,1),new r("irà",-1,1),new r("erò",-1,1),new r("irò",-1,1)],L=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],y=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],U=[17],x=new n;this.setCurrent=function(e){x.setCurrent(e)},this.getCurrent=function(){return x.getCurrent()},this.stem=function(){var e=x.cursor;return i(),x.cursor=e,u(),x.limit_backward=e,x.cursor=x.limit,f(),x.cursor=x.limit,v()||(x.cursor=x.limit,b()),x.cursor=x.limit,_(),x.cursor=x.limit_backward,c(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ja.min.js b/assets/javascripts/lunr/min/lunr.ja.min.js new file mode 100644 index 00000000..5f254ebe --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ja.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(e=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=e);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=e;else if(n(e))break}else if(n(e))break}function n(r){return C.cursor=r,r>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,d=_,t()||(_=C.cursor,_<3&&(_=3),t()||(d=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var r;;)if(C.bra=C.cursor,r=C.find_among(p,3))switch(C.ket=C.cursor,r){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return d<=C.cursor}function a(){var r=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-r,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var r;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.slice_del(),w=!0,a())))}function m(){var r;u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.eq_s_b(3,"gem")||(C.cursor=C.limit-r,C.slice_del(),a())))}function f(){var r,e,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,r=C.find_among_b(h,5))switch(C.bra=C.cursor,r){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(j,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(e=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-e,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,r=C.find_among_b(k,6))switch(C.bra=C.cursor,r){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(z,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var d,_,w,b=[new e("",-1,6),new e("á",0,1),new e("ä",0,1),new e("é",0,2),new e("ë",0,2),new e("í",0,3),new e("ï",0,3),new e("ó",0,4),new e("ö",0,4),new e("ú",0,5),new e("ü",0,5)],p=[new e("",-1,3),new e("I",0,2),new e("Y",0,1)],g=[new e("dd",-1,-1),new e("kk",-1,-1),new e("tt",-1,-1)],h=[new e("ene",-1,2),new e("se",-1,3),new e("en",-1,2),new e("heden",2,1),new e("s",-1,3)],k=[new e("end",-1,1),new e("ig",-1,2),new e("ing",-1,1),new e("lijk",-1,3),new e("baar",-1,4),new e("bar",-1,5)],v=[new e("aa",-1,-1),new e("ee",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(r){C.setCurrent(r)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var e=C.cursor;return r(),C.cursor=e,o(),C.limit_backward=e,C.cursor=C.limit,f(),C.cursor=C.limit_backward,s(),!0}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.no.min.js b/assets/javascripts/lunr/min/lunr.no.min.js new file mode 100644 index 00000000..92bc7e4e --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.no.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Norwegian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,r=w.cursor+3;if(a=w.limit,0<=r||r<=w.limit){for(s=r;;){if(e=w.cursor,w.in_grouping(d,97,248)){w.cursor=e;break}if(e>=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.pt.min.js b/assets/javascripts/lunr/min/lunr.pt.min.js new file mode 100644 index 00000000..6c16996d --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.pt.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Portuguese` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,n=new function(){function e(){for(var e;;){if(z.bra=z.cursor,e=z.find_among(k,3))switch(z.ket=z.cursor,e){case 1:z.slice_from("a~");continue;case 2:z.slice_from("o~");continue;case 3:if(z.cursor>=z.limit)break;z.cursor++;continue}break}}function n(){if(z.out_grouping(y,97,250)){for(;!z.in_grouping(y,97,250);){if(z.cursor>=z.limit)return!0;z.cursor++}return!1}return!0}function i(){if(z.in_grouping(y,97,250))for(;!z.out_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}return g=z.cursor,!0}function o(){var e,r,s=z.cursor;if(z.in_grouping(y,97,250))if(e=z.cursor,n()){if(z.cursor=e,i())return}else g=z.cursor;if(z.cursor=s,z.out_grouping(y,97,250)){if(r=z.cursor,n()){if(z.cursor=r,!z.in_grouping(y,97,250)||z.cursor>=z.limit)return;z.cursor++}g=z.cursor}}function t(){for(;!z.in_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}for(;!z.out_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}return!0}function a(){var e=z.cursor;g=z.limit,b=g,h=g,o(),z.cursor=e,t()&&(b=z.cursor,t()&&(h=z.cursor))}function u(){for(var e;;){if(z.bra=z.cursor,e=z.find_among(q,3))switch(z.ket=z.cursor,e){case 1:z.slice_from("ã");continue;case 2:z.slice_from("õ");continue;case 3:if(z.cursor>=z.limit)break;z.cursor++;continue}break}}function w(){return g<=z.cursor}function m(){return b<=z.cursor}function c(){return h<=z.cursor}function l(){var e;if(z.ket=z.cursor,!(e=z.find_among_b(F,45)))return!1;switch(z.bra=z.cursor,e){case 1:if(!c())return!1;z.slice_del();break;case 2:if(!c())return!1;z.slice_from("log");break;case 3:if(!c())return!1;z.slice_from("u");break;case 4:if(!c())return!1;z.slice_from("ente");break;case 5:if(!m())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(j,4),e&&(z.bra=z.cursor,c()&&(z.slice_del(),1==e&&(z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,c()&&z.slice_del()))));break;case 6:if(!c())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(C,3),e&&(z.bra=z.cursor,1==e&&c()&&z.slice_del());break;case 7:if(!c())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(P,3),e&&(z.bra=z.cursor,1==e&&c()&&z.slice_del());break;case 8:if(!c())return!1;z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,c()&&z.slice_del());break;case 9:if(!w()||!z.eq_s_b(1,"e"))return!1;z.slice_from("ir")}return!0}function f(){var e,r;if(z.cursor>=g){if(r=z.limit_backward,z.limit_backward=g,z.ket=z.cursor,e=z.find_among_b(S,120))return z.bra=z.cursor,1==e&&z.slice_del(),z.limit_backward=r,!0;z.limit_backward=r}return!1}function d(){var e;z.ket=z.cursor,(e=z.find_among_b(W,7))&&(z.bra=z.cursor,1==e&&w()&&z.slice_del())}function v(e,r){if(z.eq_s_b(1,e)){z.bra=z.cursor;var s=z.limit-z.cursor;if(z.eq_s_b(1,r))return z.cursor=z.limit-s,w()&&z.slice_del(),!1}return!0}function p(){var e;if(z.ket=z.cursor,e=z.find_among_b(L,4))switch(z.bra=z.cursor,e){case 1:w()&&(z.slice_del(),z.ket=z.cursor,z.limit-z.cursor,v("u","g")&&v("i","c"));break;case 2:z.slice_from("c")}}function _(){if(!l()&&(z.cursor=z.limit,!f()))return z.cursor=z.limit,void d();z.cursor=z.limit,z.ket=z.cursor,z.eq_s_b(1,"i")&&(z.bra=z.cursor,z.eq_s_b(1,"c")&&(z.cursor=z.limit,w()&&z.slice_del()))}var h,b,g,k=[new r("",-1,3),new r("ã",0,1),new r("õ",0,2)],q=[new r("",-1,3),new r("a~",0,1),new r("o~",0,2)],j=[new r("ic",-1,-1),new r("ad",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],C=[new r("ante",-1,1),new r("avel",-1,1),new r("ível",-1,1)],P=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],F=[new r("ica",-1,1),new r("ância",-1,1),new r("ência",-1,4),new r("ira",-1,9),new r("adora",-1,1),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,8),new r("eza",-1,1),new r("logía",-1,2),new r("idade",-1,7),new r("ante",-1,1),new r("mente",-1,6),new r("amente",12,5),new r("ável",-1,1),new r("ível",-1,1),new r("ución",-1,3),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,1),new r("imento",-1,1),new r("ivo",-1,8),new r("aça~o",-1,1),new r("ador",-1,1),new r("icas",-1,1),new r("ências",-1,4),new r("iras",-1,9),new r("adoras",-1,1),new r("osas",-1,1),new r("istas",-1,1),new r("ivas",-1,8),new r("ezas",-1,1),new r("logías",-1,2),new r("idades",-1,7),new r("uciones",-1,3),new r("adores",-1,1),new r("antes",-1,1),new r("aço~es",-1,1),new r("icos",-1,1),new r("ismos",-1,1),new r("osos",-1,1),new r("amentos",-1,1),new r("imentos",-1,1),new r("ivos",-1,8)],S=[new r("ada",-1,1),new r("ida",-1,1),new r("ia",-1,1),new r("aria",2,1),new r("eria",2,1),new r("iria",2,1),new r("ara",-1,1),new r("era",-1,1),new r("ira",-1,1),new r("ava",-1,1),new r("asse",-1,1),new r("esse",-1,1),new r("isse",-1,1),new r("aste",-1,1),new r("este",-1,1),new r("iste",-1,1),new r("ei",-1,1),new r("arei",16,1),new r("erei",16,1),new r("irei",16,1),new r("am",-1,1),new r("iam",20,1),new r("ariam",21,1),new r("eriam",21,1),new r("iriam",21,1),new r("aram",20,1),new r("eram",20,1),new r("iram",20,1),new r("avam",20,1),new r("em",-1,1),new r("arem",29,1),new r("erem",29,1),new r("irem",29,1),new r("assem",29,1),new r("essem",29,1),new r("issem",29,1),new r("ado",-1,1),new r("ido",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("indo",-1,1),new r("ara~o",-1,1),new r("era~o",-1,1),new r("ira~o",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("ir",-1,1),new r("as",-1,1),new r("adas",47,1),new r("idas",47,1),new r("ias",47,1),new r("arias",50,1),new r("erias",50,1),new r("irias",50,1),new r("aras",47,1),new r("eras",47,1),new r("iras",47,1),new r("avas",47,1),new r("es",-1,1),new r("ardes",58,1),new r("erdes",58,1),new r("irdes",58,1),new r("ares",58,1),new r("eres",58,1),new r("ires",58,1),new r("asses",58,1),new r("esses",58,1),new r("isses",58,1),new r("astes",58,1),new r("estes",58,1),new r("istes",58,1),new r("is",-1,1),new r("ais",71,1),new r("eis",71,1),new r("areis",73,1),new r("ereis",73,1),new r("ireis",73,1),new r("áreis",73,1),new r("éreis",73,1),new r("íreis",73,1),new r("ásseis",73,1),new r("ésseis",73,1),new r("ísseis",73,1),new r("áveis",73,1),new r("íeis",73,1),new r("aríeis",84,1),new r("eríeis",84,1),new r("iríeis",84,1),new r("ados",-1,1),new r("idos",-1,1),new r("amos",-1,1),new r("áramos",90,1),new r("éramos",90,1),new r("íramos",90,1),new r("ávamos",90,1),new r("íamos",90,1),new r("aríamos",95,1),new r("eríamos",95,1),new r("iríamos",95,1),new r("emos",-1,1),new r("aremos",99,1),new r("eremos",99,1),new r("iremos",99,1),new r("ássemos",99,1),new r("êssemos",99,1),new r("íssemos",99,1),new r("imos",-1,1),new r("armos",-1,1),new r("ermos",-1,1),new r("irmos",-1,1),new r("ámos",-1,1),new r("arás",-1,1),new r("erás",-1,1),new r("irás",-1,1),new r("eu",-1,1),new r("iu",-1,1),new r("ou",-1,1),new r("ará",-1,1),new r("erá",-1,1),new r("irá",-1,1)],W=[new r("a",-1,1),new r("i",-1,1),new r("o",-1,1),new r("os",-1,1),new r("á",-1,1),new r("í",-1,1),new r("ó",-1,1)],L=[new r("e",-1,1),new r("ç",-1,2),new r("é",-1,1),new r("ê",-1,1)],y=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],z=new s;this.setCurrent=function(e){z.setCurrent(e)},this.getCurrent=function(){return z.getCurrent()},this.stem=function(){var r=z.cursor;return e(),z.cursor=r,a(),z.limit_backward=r,z.cursor=z.limit,_(),z.cursor=z.limit,p(),z.cursor=z.limit_backward,u(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ro.min.js b/assets/javascripts/lunr/min/lunr.ro.min.js new file mode 100644 index 00000000..72771401 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ro.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Romanian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=function(){var i=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){function e(e,i){L.eq_s(1,e)&&(L.ket=L.cursor,L.in_grouping(W,97,259)&&L.slice_from(i))}function n(){for(var i,r;;){if(i=L.cursor,L.in_grouping(W,97,259)&&(r=L.cursor,L.bra=r,e("u","U"),L.cursor=r,e("i","I")),L.cursor=i,L.cursor>=L.limit)break;L.cursor++}}function t(){if(L.out_grouping(W,97,259)){for(;!L.in_grouping(W,97,259);){if(L.cursor>=L.limit)return!0;L.cursor++}return!1}return!0}function a(){if(L.in_grouping(W,97,259))for(;!L.out_grouping(W,97,259);){if(L.cursor>=L.limit)return!0;L.cursor++}return!1}function o(){var e,i,r=L.cursor;if(L.in_grouping(W,97,259)){if(e=L.cursor,!t())return void(h=L.cursor);if(L.cursor=e,!a())return void(h=L.cursor)}L.cursor=r,L.out_grouping(W,97,259)&&(i=L.cursor,t()&&(L.cursor=i,L.in_grouping(W,97,259)&&L.cursor=L.limit)return!1;L.cursor++}for(;!L.out_grouping(W,97,259);){if(L.cursor>=L.limit)return!1;L.cursor++}return!0}function c(){var e=L.cursor;h=L.limit,k=h,g=h,o(),L.cursor=e,u()&&(k=L.cursor,u()&&(g=L.cursor))}function s(){for(var e;;){if(L.bra=L.cursor,e=L.find_among(z,3))switch(L.ket=L.cursor,e){case 1:L.slice_from("i");continue;case 2:L.slice_from("u");continue;case 3:if(L.cursor>=L.limit)break;L.cursor++;continue}break}}function w(){return h<=L.cursor}function m(){return k<=L.cursor}function l(){return g<=L.cursor}function f(){var e,i;if(L.ket=L.cursor,(e=L.find_among_b(C,16))&&(L.bra=L.cursor,m()))switch(e){case 1:L.slice_del();break;case 2:L.slice_from("a");break;case 3:L.slice_from("e");break;case 4:L.slice_from("i");break;case 5:i=L.limit-L.cursor,L.eq_s_b(2,"ab")||(L.cursor=L.limit-i,L.slice_from("i"));break;case 6:L.slice_from("at");break;case 7:L.slice_from("aţi")}}function p(){var e,i=L.limit-L.cursor;if(L.ket=L.cursor,(e=L.find_among_b(P,46))&&(L.bra=L.cursor,m())){switch(e){case 1:L.slice_from("abil");break;case 2:L.slice_from("ibil");break;case 3:L.slice_from("iv");break;case 4:L.slice_from("ic");break;case 5:L.slice_from("at");break;case 6:L.slice_from("it")}return _=!0,L.cursor=L.limit-i,!0}return!1}function d(){var e,i;for(_=!1;;)if(i=L.limit-L.cursor,!p()){L.cursor=L.limit-i;break}if(L.ket=L.cursor,(e=L.find_among_b(F,62))&&(L.bra=L.cursor,l())){switch(e){case 1:L.slice_del();break;case 2:L.eq_s_b(1,"ţ")&&(L.bra=L.cursor,L.slice_from("t"));break;case 3:L.slice_from("ist")}_=!0}}function b(){var e,i,r;if(L.cursor>=h){if(i=L.limit_backward,L.limit_backward=h,L.ket=L.cursor,e=L.find_among_b(q,94))switch(L.bra=L.cursor,e){case 1:if(r=L.limit-L.cursor,!L.out_grouping_b(W,97,259)&&(L.cursor=L.limit-r,!L.eq_s_b(1,"u")))break;case 2:L.slice_del()}L.limit_backward=i}}function v(){var e;L.ket=L.cursor,(e=L.find_among_b(S,5))&&(L.bra=L.cursor,w()&&1==e&&L.slice_del())}var _,g,k,h,z=[new i("",-1,3),new i("I",0,1),new i("U",0,2)],C=[new i("ea",-1,3),new i("aţia",-1,7),new i("aua",-1,2),new i("iua",-1,4),new i("aţie",-1,7),new i("ele",-1,3),new i("ile",-1,5),new i("iile",6,4),new i("iei",-1,4),new i("atei",-1,6),new i("ii",-1,4),new i("ului",-1,1),new i("ul",-1,1),new i("elor",-1,3),new i("ilor",-1,4),new i("iilor",14,4)],P=[new i("icala",-1,4),new i("iciva",-1,4),new i("ativa",-1,5),new i("itiva",-1,6),new i("icale",-1,4),new i("aţiune",-1,5),new i("iţiune",-1,6),new i("atoare",-1,5),new i("itoare",-1,6),new i("ătoare",-1,5),new i("icitate",-1,4),new i("abilitate",-1,1),new i("ibilitate",-1,2),new i("ivitate",-1,3),new i("icive",-1,4),new i("ative",-1,5),new i("itive",-1,6),new i("icali",-1,4),new i("atori",-1,5),new i("icatori",18,4),new i("itori",-1,6),new i("ători",-1,5),new i("icitati",-1,4),new i("abilitati",-1,1),new i("ivitati",-1,3),new i("icivi",-1,4),new i("ativi",-1,5),new i("itivi",-1,6),new i("icităi",-1,4),new i("abilităi",-1,1),new i("ivităi",-1,3),new i("icităţi",-1,4),new i("abilităţi",-1,1),new i("ivităţi",-1,3),new i("ical",-1,4),new i("ator",-1,5),new i("icator",35,4),new i("itor",-1,6),new i("ător",-1,5),new i("iciv",-1,4),new i("ativ",-1,5),new i("itiv",-1,6),new i("icală",-1,4),new i("icivă",-1,4),new i("ativă",-1,5),new i("itivă",-1,6)],F=[new i("ica",-1,1),new i("abila",-1,1),new i("ibila",-1,1),new i("oasa",-1,1),new i("ata",-1,1),new i("ita",-1,1),new i("anta",-1,1),new i("ista",-1,3),new i("uta",-1,1),new i("iva",-1,1),new i("ic",-1,1),new i("ice",-1,1),new i("abile",-1,1),new i("ibile",-1,1),new i("isme",-1,3),new i("iune",-1,2),new i("oase",-1,1),new i("ate",-1,1),new i("itate",17,1),new i("ite",-1,1),new i("ante",-1,1),new i("iste",-1,3),new i("ute",-1,1),new i("ive",-1,1),new i("ici",-1,1),new i("abili",-1,1),new i("ibili",-1,1),new i("iuni",-1,2),new i("atori",-1,1),new i("osi",-1,1),new i("ati",-1,1),new i("itati",30,1),new i("iti",-1,1),new i("anti",-1,1),new i("isti",-1,3),new i("uti",-1,1),new i("işti",-1,3),new i("ivi",-1,1),new i("ităi",-1,1),new i("oşi",-1,1),new i("ităţi",-1,1),new i("abil",-1,1),new i("ibil",-1,1),new i("ism",-1,3),new i("ator",-1,1),new i("os",-1,1),new i("at",-1,1),new i("it",-1,1),new i("ant",-1,1),new i("ist",-1,3),new i("ut",-1,1),new i("iv",-1,1),new i("ică",-1,1),new i("abilă",-1,1),new i("ibilă",-1,1),new i("oasă",-1,1),new i("ată",-1,1),new i("ită",-1,1),new i("antă",-1,1),new i("istă",-1,3),new i("ută",-1,1),new i("ivă",-1,1)],q=[new i("ea",-1,1),new i("ia",-1,1),new i("esc",-1,1),new i("ăsc",-1,1),new i("ind",-1,1),new i("ând",-1,1),new i("are",-1,1),new i("ere",-1,1),new i("ire",-1,1),new i("âre",-1,1),new i("se",-1,2),new i("ase",10,1),new i("sese",10,2),new i("ise",10,1),new i("use",10,1),new i("âse",10,1),new i("eşte",-1,1),new i("ăşte",-1,1),new i("eze",-1,1),new i("ai",-1,1),new i("eai",19,1),new i("iai",19,1),new i("sei",-1,2),new i("eşti",-1,1),new i("ăşti",-1,1),new i("ui",-1,1),new i("ezi",-1,1),new i("âi",-1,1),new i("aşi",-1,1),new i("seşi",-1,2),new i("aseşi",29,1),new i("seseşi",29,2),new i("iseşi",29,1),new i("useşi",29,1),new i("âseşi",29,1),new i("işi",-1,1),new i("uşi",-1,1),new i("âşi",-1,1),new i("aţi",-1,2),new i("eaţi",38,1),new i("iaţi",38,1),new i("eţi",-1,2),new i("iţi",-1,2),new i("âţi",-1,2),new i("arăţi",-1,1),new i("serăţi",-1,2),new i("aserăţi",45,1),new i("seserăţi",45,2),new i("iserăţi",45,1),new i("userăţi",45,1),new i("âserăţi",45,1),new i("irăţi",-1,1),new i("urăţi",-1,1),new i("ârăţi",-1,1),new i("am",-1,1),new i("eam",54,1),new i("iam",54,1),new i("em",-1,2),new i("asem",57,1),new i("sesem",57,2),new i("isem",57,1),new i("usem",57,1),new i("âsem",57,1),new i("im",-1,2),new i("âm",-1,2),new i("ăm",-1,2),new i("arăm",65,1),new i("serăm",65,2),new i("aserăm",67,1),new i("seserăm",67,2),new i("iserăm",67,1),new i("userăm",67,1),new i("âserăm",67,1),new i("irăm",65,1),new i("urăm",65,1),new i("ârăm",65,1),new i("au",-1,1),new i("eau",76,1),new i("iau",76,1),new i("indu",-1,1),new i("ându",-1,1),new i("ez",-1,1),new i("ească",-1,1),new i("ară",-1,1),new i("seră",-1,2),new i("aseră",84,1),new i("seseră",84,2),new i("iseră",84,1),new i("useră",84,1),new i("âseră",84,1),new i("iră",-1,1),new i("ură",-1,1),new i("âră",-1,1),new i("ează",-1,1)],S=[new i("a",-1,1),new i("e",-1,1),new i("ie",1,1),new i("i",-1,1),new i("ă",-1,1)],W=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],L=new r;this.setCurrent=function(e){L.setCurrent(e)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){var e=L.cursor;return n(),L.cursor=e,c(),L.limit_backward=e,L.cursor=L.limit,f(),L.cursor=L.limit,d(),L.cursor=L.limit,_||(L.cursor=L.limit,b(),L.cursor=L.limit),v(),L.cursor=L.limit_backward,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ru.min.js b/assets/javascripts/lunr/min/lunr.ru.min.js new file mode 100644 index 00000000..186cc485 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ru.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Russian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,t=new function(){function e(){for(;!W.in_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function t(){for(;!W.out_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function w(){b=W.limit,_=b,e()&&(b=W.cursor,t()&&e()&&t()&&(_=W.cursor))}function i(){return _<=W.cursor}function u(e,n){var r,t;if(W.ket=W.cursor,r=W.find_among_b(e,n)){switch(W.bra=W.cursor,r){case 1:if(t=W.limit-W.cursor,!W.eq_s_b(1,"а")&&(W.cursor=W.limit-t,!W.eq_s_b(1,"я")))return!1;case 2:W.slice_del()}return!0}return!1}function o(){return u(h,9)}function s(e,n){var r;return W.ket=W.cursor,!!(r=W.find_among_b(e,n))&&(W.bra=W.cursor,1==r&&W.slice_del(),!0)}function c(){return s(g,26)}function m(){return!!c()&&(u(C,8),!0)}function f(){return s(k,2)}function l(){return u(P,46)}function a(){s(v,36)}function p(){var e;W.ket=W.cursor,(e=W.find_among_b(F,2))&&(W.bra=W.cursor,i()&&1==e&&W.slice_del())}function d(){var e;if(W.ket=W.cursor,e=W.find_among_b(q,4))switch(W.bra=W.cursor,e){case 1:if(W.slice_del(),W.ket=W.cursor,!W.eq_s_b(1,"н"))break;W.bra=W.cursor;case 2:if(!W.eq_s_b(1,"н"))break;case 3:W.slice_del()}}var _,b,h=[new n("в",-1,1),new n("ив",0,2),new n("ыв",0,2),new n("вши",-1,1),new n("ивши",3,2),new n("ывши",3,2),new n("вшись",-1,1),new n("ившись",6,2),new n("ывшись",6,2)],g=[new n("ее",-1,1),new n("ие",-1,1),new n("ое",-1,1),new n("ые",-1,1),new n("ими",-1,1),new n("ыми",-1,1),new n("ей",-1,1),new n("ий",-1,1),new n("ой",-1,1),new n("ый",-1,1),new n("ем",-1,1),new n("им",-1,1),new n("ом",-1,1),new n("ым",-1,1),new n("его",-1,1),new n("ого",-1,1),new n("ему",-1,1),new n("ому",-1,1),new n("их",-1,1),new n("ых",-1,1),new n("ею",-1,1),new n("ою",-1,1),new n("ую",-1,1),new n("юю",-1,1),new n("ая",-1,1),new n("яя",-1,1)],C=[new n("ем",-1,1),new n("нн",-1,1),new n("вш",-1,1),new n("ивш",2,2),new n("ывш",2,2),new n("щ",-1,1),new n("ющ",5,1),new n("ующ",6,2)],k=[new n("сь",-1,1),new n("ся",-1,1)],P=[new n("ла",-1,1),new n("ила",0,2),new n("ыла",0,2),new n("на",-1,1),new n("ена",3,2),new n("ете",-1,1),new n("ите",-1,2),new n("йте",-1,1),new n("ейте",7,2),new n("уйте",7,2),new n("ли",-1,1),new n("или",10,2),new n("ыли",10,2),new n("й",-1,1),new n("ей",13,2),new n("уй",13,2),new n("л",-1,1),new n("ил",16,2),new n("ыл",16,2),new n("ем",-1,1),new n("им",-1,2),new n("ым",-1,2),new n("н",-1,1),new n("ен",22,2),new n("ло",-1,1),new n("ило",24,2),new n("ыло",24,2),new n("но",-1,1),new n("ено",27,2),new n("нно",27,1),new n("ет",-1,1),new n("ует",30,2),new n("ит",-1,2),new n("ыт",-1,2),new n("ют",-1,1),new n("уют",34,2),new n("ят",-1,2),new n("ны",-1,1),new n("ены",37,2),new n("ть",-1,1),new n("ить",39,2),new n("ыть",39,2),new n("ешь",-1,1),new n("ишь",-1,2),new n("ю",-1,2),new n("ую",44,2)],v=[new n("а",-1,1),new n("ев",-1,1),new n("ов",-1,1),new n("е",-1,1),new n("ие",3,1),new n("ье",3,1),new n("и",-1,1),new n("еи",6,1),new n("ии",6,1),new n("ами",6,1),new n("ями",6,1),new n("иями",10,1),new n("й",-1,1),new n("ей",12,1),new n("ией",13,1),new n("ий",12,1),new n("ой",12,1),new n("ам",-1,1),new n("ем",-1,1),new n("ием",18,1),new n("ом",-1,1),new n("ям",-1,1),new n("иям",21,1),new n("о",-1,1),new n("у",-1,1),new n("ах",-1,1),new n("ях",-1,1),new n("иях",26,1),new n("ы",-1,1),new n("ь",-1,1),new n("ю",-1,1),new n("ию",30,1),new n("ью",30,1),new n("я",-1,1),new n("ия",33,1),new n("ья",33,1)],F=[new n("ост",-1,1),new n("ость",-1,1)],q=[new n("ейше",-1,1),new n("н",-1,2),new n("ейш",-1,1),new n("ь",-1,3)],S=[33,65,8,232],W=new r;this.setCurrent=function(e){W.setCurrent(e)},this.getCurrent=function(){return W.getCurrent()},this.stem=function(){return w(),W.cursor=W.limit,!(W.cursor=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursors||e>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor>1),f=0,l=o0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.sv.min.js b/assets/javascripts/lunr/min/lunr.sv.min.js new file mode 100644 index 00000000..3e5eb640 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.sv.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Swedish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.th.min.js b/assets/javascripts/lunr/min/lunr.th.min.js new file mode 100644 index 00000000..dee3aac6 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.th.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[฀-๿]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.tr.min.js b/assets/javascripts/lunr/min/lunr.tr.min.js new file mode 100644 index 00000000..563f6ec1 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.tr.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Turkish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=function(){var i=r.stemmerSupport.Among,e=r.stemmerSupport.SnowballProgram,n=new function(){function r(r,i,e){for(;;){var n=Dr.limit-Dr.cursor;if(Dr.in_grouping_b(r,i,e)){Dr.cursor=Dr.limit-n;break}if(Dr.cursor=Dr.limit-n,Dr.cursor<=Dr.limit_backward)return!1;Dr.cursor--}return!0}function n(){var i,e;i=Dr.limit-Dr.cursor,r(Wr,97,305);for(var n=0;nDr.limit_backward&&(Dr.cursor--,e=Dr.limit-Dr.cursor,i()))?(Dr.cursor=Dr.limit-e,!0):(Dr.cursor=Dr.limit-n,r()?(Dr.cursor=Dr.limit-n,!1):(Dr.cursor=Dr.limit-n,!(Dr.cursor<=Dr.limit_backward)&&(Dr.cursor--,!!i()&&(Dr.cursor=Dr.limit-n,!0))))}function u(r){return t(r,function(){return Dr.in_grouping_b(Wr,97,305)})}function o(){return u(function(){return Dr.eq_s_b(1,"n")})}function s(){return u(function(){return Dr.eq_s_b(1,"s")})}function c(){return u(function(){return Dr.eq_s_b(1,"y")})}function l(){return t(function(){return Dr.in_grouping_b(Lr,105,305)},function(){return Dr.out_grouping_b(Wr,97,305)})}function a(){return Dr.find_among_b(ur,10)&&l()}function m(){return n()&&Dr.in_grouping_b(Lr,105,305)&&s()}function d(){return Dr.find_among_b(or,2)}function f(){return n()&&Dr.in_grouping_b(Lr,105,305)&&c()}function b(){return n()&&Dr.find_among_b(sr,4)}function w(){return n()&&Dr.find_among_b(cr,4)&&o()}function _(){return n()&&Dr.find_among_b(lr,2)&&c()}function k(){return n()&&Dr.find_among_b(ar,2)}function p(){return n()&&Dr.find_among_b(mr,4)}function g(){return n()&&Dr.find_among_b(dr,2)}function y(){return n()&&Dr.find_among_b(fr,4)}function z(){return n()&&Dr.find_among_b(br,2)}function v(){return n()&&Dr.find_among_b(wr,2)&&c()}function h(){return Dr.eq_s_b(2,"ki")}function q(){return n()&&Dr.find_among_b(_r,2)&&o()}function C(){return n()&&Dr.find_among_b(kr,4)&&c()}function P(){return n()&&Dr.find_among_b(pr,4)}function F(){return n()&&Dr.find_among_b(gr,4)&&c()}function S(){return Dr.find_among_b(yr,4)}function W(){return n()&&Dr.find_among_b(zr,2)}function L(){return n()&&Dr.find_among_b(vr,4)}function x(){return n()&&Dr.find_among_b(hr,8)}function A(){return Dr.find_among_b(qr,2)}function E(){return n()&&Dr.find_among_b(Cr,32)&&c()}function j(){return Dr.find_among_b(Pr,8)&&c()}function T(){return n()&&Dr.find_among_b(Fr,4)&&c()}function Z(){return Dr.eq_s_b(3,"ken")&&c()}function B(){var r=Dr.limit-Dr.cursor;return!(T()||(Dr.cursor=Dr.limit-r,E()||(Dr.cursor=Dr.limit-r,j()||(Dr.cursor=Dr.limit-r,Z()))))}function D(){if(A()){var r=Dr.limit-Dr.cursor;if(S()||(Dr.cursor=Dr.limit-r,W()||(Dr.cursor=Dr.limit-r,C()||(Dr.cursor=Dr.limit-r,P()||(Dr.cursor=Dr.limit-r,F()||(Dr.cursor=Dr.limit-r))))),T())return!1}return!0}function G(){if(W()){Dr.bra=Dr.cursor,Dr.slice_del();var r=Dr.limit-Dr.cursor;return Dr.ket=Dr.cursor,x()||(Dr.cursor=Dr.limit-r,E()||(Dr.cursor=Dr.limit-r,j()||(Dr.cursor=Dr.limit-r,T()||(Dr.cursor=Dr.limit-r)))),nr=!1,!1}return!0}function H(){if(!L())return!0;var r=Dr.limit-Dr.cursor;return!E()&&(Dr.cursor=Dr.limit-r,!j())}function I(){var r,i=Dr.limit-Dr.cursor;return!(S()||(Dr.cursor=Dr.limit-i,F()||(Dr.cursor=Dr.limit-i,P()||(Dr.cursor=Dr.limit-i,C()))))||(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,T()||(Dr.cursor=Dr.limit-r),!1)}function J(){var r,i=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,nr=!0,B()&&(Dr.cursor=Dr.limit-i,D()&&(Dr.cursor=Dr.limit-i,G()&&(Dr.cursor=Dr.limit-i,H()&&(Dr.cursor=Dr.limit-i,I()))))){if(Dr.cursor=Dr.limit-i,!x())return;Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,r=Dr.limit-Dr.cursor,S()||(Dr.cursor=Dr.limit-r,W()||(Dr.cursor=Dr.limit-r,C()||(Dr.cursor=Dr.limit-r,P()||(Dr.cursor=Dr.limit-r,F()||(Dr.cursor=Dr.limit-r))))),T()||(Dr.cursor=Dr.limit-r)}Dr.bra=Dr.cursor,Dr.slice_del()}function K(){var r,i,e,n;if(Dr.ket=Dr.cursor,h()){if(r=Dr.limit-Dr.cursor,p())return Dr.bra=Dr.cursor,Dr.slice_del(),i=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,W()?(Dr.bra=Dr.cursor,Dr.slice_del(),K()):(Dr.cursor=Dr.limit-i,a()&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()))),!0;if(Dr.cursor=Dr.limit-r,w()){if(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,e=Dr.limit-Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else{if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,!a()&&(Dr.cursor=Dr.limit-e,!m()&&(Dr.cursor=Dr.limit-e,!K())))return!0;Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())}return!0}if(Dr.cursor=Dr.limit-r,g()){if(n=Dr.limit-Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else if(Dr.cursor=Dr.limit-n,m())Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K());else if(Dr.cursor=Dr.limit-n,!K())return!1;return!0}}return!1}function M(r){if(Dr.ket=Dr.cursor,!g()&&(Dr.cursor=Dr.limit-r,!k()))return!1;var i=Dr.limit-Dr.cursor;if(d())Dr.bra=Dr.cursor,Dr.slice_del();else if(Dr.cursor=Dr.limit-i,m())Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K());else if(Dr.cursor=Dr.limit-i,!K())return!1;return!0}function N(r){if(Dr.ket=Dr.cursor,!z()&&(Dr.cursor=Dr.limit-r,!b()))return!1;var i=Dr.limit-Dr.cursor;return!(!m()&&(Dr.cursor=Dr.limit-i,!d()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()),!0)}function O(){var r,i=Dr.limit-Dr.cursor;return Dr.ket=Dr.cursor,!(!w()&&(Dr.cursor=Dr.limit-i,!v()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,!(!W()||(Dr.bra=Dr.cursor,Dr.slice_del(),!K()))||(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!(a()||(Dr.cursor=Dr.limit-r,m()||(Dr.cursor=Dr.limit-r,K())))||(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()),!0)))}function Q(){var r,i,e=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,!p()&&(Dr.cursor=Dr.limit-e,!f()&&(Dr.cursor=Dr.limit-e,!_())))return!1;if(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,r=Dr.limit-Dr.cursor,a())Dr.bra=Dr.cursor,Dr.slice_del(),i=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,W()||(Dr.cursor=Dr.limit-i);else if(Dr.cursor=Dr.limit-r,!W())return!0;return Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,K(),!0}function R(){var r,i,e=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,W())return Dr.bra=Dr.cursor,Dr.slice_del(),void K();if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,q())if(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else{if(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!a()&&(Dr.cursor=Dr.limit-r,!m())){if(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!W())return;if(Dr.bra=Dr.cursor,Dr.slice_del(),!K())return}Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())}else if(Dr.cursor=Dr.limit-e,!M(e)&&(Dr.cursor=Dr.limit-e,!N(e))){if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,y())return Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,i=Dr.limit-Dr.cursor,void(a()?(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())):(Dr.cursor=Dr.limit-i,W()?(Dr.bra=Dr.cursor,Dr.slice_del(),K()):(Dr.cursor=Dr.limit-i,K())));if(Dr.cursor=Dr.limit-e,!O()){if(Dr.cursor=Dr.limit-e,d())return Dr.bra=Dr.cursor,void Dr.slice_del();Dr.cursor=Dr.limit-e,K()||(Dr.cursor=Dr.limit-e,Q()||(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,(a()||(Dr.cursor=Dr.limit-e,m()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()))))}}}function U(){var r;if(Dr.ket=Dr.cursor,r=Dr.find_among_b(Sr,4))switch(Dr.bra=Dr.cursor,r){case 1:Dr.slice_from("p");break;case 2:Dr.slice_from("ç");break;case 3:Dr.slice_from("t");break;case 4:Dr.slice_from("k")}}function V(){for(;;){var r=Dr.limit-Dr.cursor;if(Dr.in_grouping_b(Wr,97,305)){Dr.cursor=Dr.limit-r;break}if(Dr.cursor=Dr.limit-r,Dr.cursor<=Dr.limit_backward)return!1;Dr.cursor--}return!0}function X(r,i,e){if(Dr.cursor=Dr.limit-r,V()){var n=Dr.limit-Dr.cursor;if(!Dr.eq_s_b(1,i)&&(Dr.cursor=Dr.limit-n,!Dr.eq_s_b(1,e)))return!0;Dr.cursor=Dr.limit-r;var t=Dr.cursor;return Dr.insert(Dr.cursor,Dr.cursor,e),Dr.cursor=t,!1}return!0}function Y(){var r=Dr.limit-Dr.cursor;(Dr.eq_s_b(1,"d")||(Dr.cursor=Dr.limit-r,Dr.eq_s_b(1,"g")))&&X(r,"a","ı")&&X(r,"e","i")&&X(r,"o","u")&&X(r,"ö","ü")}function $(){for(var r,i=Dr.cursor,e=2;;){for(r=Dr.cursor;!Dr.in_grouping(Wr,97,305);){if(Dr.cursor>=Dr.limit)return Dr.cursor=r,!(e>0)&&(Dr.cursor=i,!0);Dr.cursor++}e--}}function rr(r,i,e){for(;!Dr.eq_s(i,e);){if(Dr.cursor>=Dr.limit)return!0;Dr.cursor++}return(tr=i)!=Dr.limit||(Dr.cursor=r,!1)}function ir(){var r=Dr.cursor;return!rr(r,2,"ad")||(Dr.cursor=r,!rr(r,5,"soyad"))}function er(){var r=Dr.cursor;return!ir()&&(Dr.limit_backward=r,Dr.cursor=Dr.limit,Y(),Dr.cursor=Dr.limit,U(),!0)}var nr,tr,ur=[new i("m",-1,-1),new i("n",-1,-1),new i("miz",-1,-1),new i("niz",-1,-1),new i("muz",-1,-1),new i("nuz",-1,-1),new i("müz",-1,-1),new i("nüz",-1,-1),new i("mız",-1,-1),new i("nız",-1,-1)],or=[new i("leri",-1,-1),new i("ları",-1,-1)],sr=[new i("ni",-1,-1),new i("nu",-1,-1),new i("nü",-1,-1),new i("nı",-1,-1)],cr=[new i("in",-1,-1),new i("un",-1,-1),new i("ün",-1,-1),new i("ın",-1,-1)],lr=[new i("a",-1,-1),new i("e",-1,-1)],ar=[new i("na",-1,-1),new i("ne",-1,-1)],mr=[new i("da",-1,-1),new i("ta",-1,-1),new i("de",-1,-1),new i("te",-1,-1)],dr=[new i("nda",-1,-1),new i("nde",-1,-1)],fr=[new i("dan",-1,-1),new i("tan",-1,-1),new i("den",-1,-1),new i("ten",-1,-1)],br=[new i("ndan",-1,-1),new i("nden",-1,-1)],wr=[new i("la",-1,-1),new i("le",-1,-1)],_r=[new i("ca",-1,-1),new i("ce",-1,-1)],kr=[new i("im",-1,-1),new i("um",-1,-1),new i("üm",-1,-1),new i("ım",-1,-1)],pr=[new i("sin",-1,-1),new i("sun",-1,-1),new i("sün",-1,-1),new i("sın",-1,-1)],gr=[new i("iz",-1,-1),new i("uz",-1,-1),new i("üz",-1,-1),new i("ız",-1,-1)],yr=[new i("siniz",-1,-1),new i("sunuz",-1,-1),new i("sünüz",-1,-1),new i("sınız",-1,-1)],zr=[new i("lar",-1,-1),new i("ler",-1,-1)],vr=[new i("niz",-1,-1),new i("nuz",-1,-1),new i("nüz",-1,-1),new i("nız",-1,-1)],hr=[new i("dir",-1,-1),new i("tir",-1,-1),new i("dur",-1,-1),new i("tur",-1,-1),new i("dür",-1,-1),new i("tür",-1,-1),new i("dır",-1,-1),new i("tır",-1,-1)],qr=[new i("casına",-1,-1),new i("cesine",-1,-1)],Cr=[new i("di",-1,-1),new i("ti",-1,-1),new i("dik",-1,-1),new i("tik",-1,-1),new i("duk",-1,-1),new i("tuk",-1,-1),new i("dük",-1,-1),new i("tük",-1,-1),new i("dık",-1,-1),new i("tık",-1,-1),new i("dim",-1,-1),new i("tim",-1,-1),new i("dum",-1,-1),new i("tum",-1,-1),new i("düm",-1,-1),new i("tüm",-1,-1),new i("dım",-1,-1),new i("tım",-1,-1),new i("din",-1,-1),new i("tin",-1,-1),new i("dun",-1,-1),new i("tun",-1,-1),new i("dün",-1,-1),new i("tün",-1,-1),new i("dın",-1,-1),new i("tın",-1,-1),new i("du",-1,-1),new i("tu",-1,-1),new i("dü",-1,-1),new i("tü",-1,-1),new i("dı",-1,-1),new i("tı",-1,-1)],Pr=[new i("sa",-1,-1),new i("se",-1,-1),new i("sak",-1,-1),new i("sek",-1,-1),new i("sam",-1,-1),new i("sem",-1,-1),new i("san",-1,-1),new i("sen",-1,-1)],Fr=[new i("miş",-1,-1),new i("muş",-1,-1),new i("müş",-1,-1),new i("mış",-1,-1)],Sr=[new i("b",-1,1),new i("c",-1,2),new i("d",-1,3),new i("ğ",-1,4)],Wr=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],Lr=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],xr=[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],Ar=[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],Er=[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],jr=[17],Tr=[65],Zr=[65],Br=[["a",xr,97,305],["e",Ar,101,252],["ı",Er,97,305],["i",jr,101,105],["o",Tr,111,117],["ö",Zr,246,252],["u",Tr,111,117]],Dr=new e;this.setCurrent=function(r){Dr.setCurrent(r)},this.getCurrent=function(){return Dr.getCurrent()},this.stem=function(){return!!($()&&(Dr.limit_backward=Dr.cursor,Dr.cursor=Dr.limit,J(),Dr.cursor=Dr.limit,nr&&(R(),Dr.cursor=Dr.limit_backward,er())))}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.tr.stemmer,"stemmer-tr"),r.tr.stopWordFilter=r.generateStopWordFilter("acaba altmış altı ama ancak arada aslında ayrıca bana bazı belki ben benden beni benim beri beş bile bin bir biri birkaç birkez birçok birşey birşeyi biz bizden bize bizi bizim bu buna bunda bundan bunlar bunları bunların bunu bunun burada böyle böylece da daha dahi de defa değil diye diğer doksan dokuz dolayı dolayısıyla dört edecek eden ederek edilecek ediliyor edilmesi ediyor elli en etmesi etti ettiği ettiğini eğer gibi göre halen hangi hatta hem henüz hep hepsi her herhangi herkesin hiç hiçbir iki ile ilgili ise itibaren itibariyle için işte kadar karşın katrilyon kendi kendilerine kendini kendisi kendisine kendisini kez ki kim kimden kime kimi kimse kırk milyar milyon mu mü mı nasıl ne neden nedenle nerde nerede nereye niye niçin o olan olarak oldu olduklarını olduğu olduğunu olmadı olmadığı olmak olması olmayan olmaz olsa olsun olup olur olursa oluyor on ona ondan onlar onlardan onları onların onu onun otuz oysa pek rağmen sadece sanki sekiz seksen sen senden seni senin siz sizden sizi sizin tarafından trilyon tüm var vardı ve veya ya yani yapacak yapmak yaptı yaptıkları yaptığı yaptığını yapılan yapılması yapıyor yedi yerine yetmiş yine yirmi yoksa yüz zaten çok çünkü öyle üzere üç şey şeyden şeyi şeyler şu şuna şunda şundan şunları şunu şöyle".split(" ")),r.Pipeline.registerFunction(r.tr.stopWordFilter,"stopWordFilter-tr")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.vi.min.js b/assets/javascripts/lunr/min/lunr.vi.min.js new file mode 100644 index 00000000..22aed28c --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.vi.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.zh.min.js b/assets/javascripts/lunr/min/lunr.zh.min.js new file mode 100644 index 00000000..7727bbe2 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.zh.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("nodejieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\w一-龥",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("的 一 不 在 人 有 是 为 以 于 上 他 而 后 之 来 及 了 因 下 可 到 由 这 与 也 此 但 并 个 其 已 无 小 我 们 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 从 到 得 打 凡 儿 尔 该 各 给 跟 和 何 还 即 几 既 看 据 距 靠 啦 了 另 么 每 们 嘛 拿 哪 那 您 凭 且 却 让 仍 啥 如 若 使 谁 虽 随 同 所 她 哇 嗡 往 哪 些 向 沿 哟 用 于 咱 则 怎 曾 至 致 着 诸 自".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/tinyseg.js b/assets/javascripts/lunr/tinyseg.js new file mode 100644 index 00000000..167fa6dd --- /dev/null +++ b/assets/javascripts/lunr/tinyseg.js @@ -0,0 +1,206 @@ +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + + return function(lunr) { + // TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript + // (c) 2008 Taku Kudo + // TinySegmenter is freely distributable under the terms of a new BSD licence. + // For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt + + function TinySegmenter() { + var patterns = { + "[一二三四五六七八九十百千万億兆]":"M", + "[一-龠々〆ヵヶ]":"H", + "[ぁ-ん]":"I", + "[ァ-ヴーア-ン゙ー]":"K", + "[a-zA-Za-zA-Z]":"A", + "[0-90-9]":"N" + } + this.chartype_ = []; + for (var i in patterns) { + var regexp = new RegExp(i); + this.chartype_.push([regexp, patterns[i]]); + } + + this.BIAS__ = -332 + this.BC1__ = {"HH":6,"II":2461,"KH":406,"OH":-1378}; + this.BC2__ = {"AA":-3267,"AI":2744,"AN":-878,"HH":-4070,"HM":-1711,"HN":4012,"HO":3761,"IA":1327,"IH":-1184,"II":-1332,"IK":1721,"IO":5492,"KI":3831,"KK":-8741,"MH":-3132,"MK":3334,"OO":-2920}; + this.BC3__ = {"HH":996,"HI":626,"HK":-721,"HN":-1307,"HO":-836,"IH":-301,"KK":2762,"MK":1079,"MM":4034,"OA":-1652,"OH":266}; + this.BP1__ = {"BB":295,"OB":304,"OO":-125,"UB":352}; + this.BP2__ = {"BO":60,"OO":-1762}; + this.BQ1__ = {"BHH":1150,"BHM":1521,"BII":-1158,"BIM":886,"BMH":1208,"BNH":449,"BOH":-91,"BOO":-2597,"OHI":451,"OIH":-296,"OKA":1851,"OKH":-1020,"OKK":904,"OOO":2965}; + this.BQ2__ = {"BHH":118,"BHI":-1159,"BHM":466,"BIH":-919,"BKK":-1720,"BKO":864,"OHH":-1139,"OHM":-181,"OIH":153,"UHI":-1146}; + this.BQ3__ = {"BHH":-792,"BHI":2664,"BII":-299,"BKI":419,"BMH":937,"BMM":8335,"BNN":998,"BOH":775,"OHH":2174,"OHM":439,"OII":280,"OKH":1798,"OKI":-793,"OKO":-2242,"OMH":-2402,"OOO":11699}; + this.BQ4__ = {"BHH":-3895,"BIH":3761,"BII":-4654,"BIK":1348,"BKK":-1806,"BMI":-3385,"BOO":-12396,"OAH":926,"OHH":266,"OHK":-2036,"ONN":-973}; + this.BW1__ = {",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741,"ませ":2448,"まで":1711,"まま":2600,"まる":-2155,"やむ":-1947,"よっ":-2565,"れた":2369,"れで":-913,"をし":1860,"を見":731,"亡く":-1886,"京都":2558,"取り":-2784,"大き":-2604,"大阪":1497,"平方":-2314,"引き":-1336,"日本":-195,"本当":-2423,"毎日":-2113,"目指":-724,"B1あ":1404,"B1同":542,"」と":1682}; + this.BW2__ = {"..":-11822,"11":-669,"――":-5730,"−−":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1890,"とこ":-1746,"とと":-2279,"との":720,"とみ":5168,"とも":-3941,"ない":-2488,"なが":-1313,"など":-6509,"なの":2614,"なん":3099,"にお":-1615,"にし":2748,"にな":2454,"によ":-7236,"に対":-14943,"に従":-4688,"に関":-11388,"のか":2093,"ので":-7059,"のに":-6041,"のの":-6125,"はい":1073,"はが":-1033,"はず":-2532,"ばれ":1813,"まし":-1316,"まで":-6621,"まれ":5409,"めて":-3153,"もい":2230,"もの":-10713,"らか":-944,"らし":-1611,"らに":-1897,"りし":651,"りま":1620,"れた":4270,"れて":849,"れば":4114,"ろう":6067,"われ":7901,"を通":-11877,"んだ":728,"んな":-4115,"一人":602,"一方":-1375,"一日":970,"一部":-1051,"上が":-4479,"会社":-1116,"出て":2163,"分の":-7758,"同党":970,"同日":-913,"大阪":-2471,"委員":-1250,"少な":-1050,"年度":-8669,"年間":-1626,"府県":-2363,"手権":-1982,"新聞":-4066,"日新":-722,"日本":-7068,"日米":3372,"曜日":-601,"朝鮮":-2355,"本人":-2697,"東京":-1543,"然と":-1384,"社会":-1276,"立て":-990,"第に":-1612,"米国":-4268,"11":-669}; + this.BW3__ = {"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":6521,"ず,":3426,"ず、":3426,"ずに":841,"そう":428,"た.":8875,"た。":8875,"たい":-594,"たの":812,"たり":-1183,"たる":-853,"だ.":4098,"だ。":4098,"だっ":1004,"った":-4748,"って":300,"てい":6240,"てお":855,"ても":302,"です":1437,"でに":-1482,"では":2295,"とう":-1387,"とし":2266,"との":541,"とも":-3543,"どう":4664,"ない":1796,"なく":-903,"など":2135,"に,":-1021,"に、":-1021,"にし":1771,"にな":1906,"には":2644,"の,":-724,"の、":-724,"の子":-1000,"は,":1337,"は、":1337,"べき":2181,"まし":1113,"ます":6943,"まっ":-1549,"まで":6154,"まれ":-793,"らし":1479,"られ":6820,"るる":3818,"れ,":854,"れ、":854,"れた":1850,"れて":1375,"れば":-3246,"れる":1091,"われ":-605,"んだ":606,"んで":798,"カ月":990,"会議":860,"入り":1232,"大会":2217,"始め":1681,"市":965,"新聞":-5055,"日,":974,"日、":974,"社会":2024,"カ月":990}; + this.TC1__ = {"AAA":1093,"HHH":1029,"HHM":580,"HII":998,"HOH":-390,"HOM":-331,"IHI":1169,"IOH":-142,"IOI":-1015,"IOM":467,"MMH":187,"OOI":-1832}; + this.TC2__ = {"HHO":2088,"HII":-1023,"HMM":-1154,"IHI":-1965,"KKH":703,"OII":-2649}; + this.TC3__ = {"AAA":-294,"HHH":346,"HHI":-341,"HII":-1088,"HIK":731,"HOH":-1486,"IHH":128,"IHI":-3041,"IHO":-1935,"IIH":-825,"IIM":-1035,"IOI":-542,"KHH":-1216,"KKA":491,"KKH":-1217,"KOK":-1009,"MHH":-2694,"MHM":-457,"MHO":123,"MMH":-471,"NNH":-1689,"NNO":662,"OHO":-3393}; + this.TC4__ = {"HHH":-203,"HHI":1344,"HHK":365,"HHM":-122,"HHN":182,"HHO":669,"HIH":804,"HII":679,"HOH":446,"IHH":695,"IHO":-2324,"IIH":321,"III":1497,"IIO":656,"IOO":54,"KAK":4845,"KKA":3386,"KKK":3065,"MHH":-405,"MHI":201,"MMH":-241,"MMM":661,"MOM":841}; + this.TQ1__ = {"BHHH":-227,"BHHI":316,"BHIH":-132,"BIHH":60,"BIII":1595,"BNHH":-744,"BOHH":225,"BOOO":-908,"OAKK":482,"OHHH":281,"OHIH":249,"OIHI":200,"OIIH":-68}; + this.TQ2__ = {"BIHH":-1401,"BIII":-1033,"BKAK":-543,"BOOO":-5591}; + this.TQ3__ = {"BHHH":478,"BHHM":-1073,"BHIH":222,"BHII":-504,"BIIH":-116,"BIII":-105,"BMHI":-863,"BMHM":-464,"BOMH":620,"OHHH":346,"OHHI":1729,"OHII":997,"OHMH":481,"OIHH":623,"OIIH":1344,"OKAK":2792,"OKHH":587,"OKKA":679,"OOHH":110,"OOII":-685}; + this.TQ4__ = {"BHHH":-721,"BHHM":-3604,"BHII":-966,"BIIH":-607,"BIII":-2181,"OAAA":-2763,"OAKK":180,"OHHH":-294,"OHHI":2446,"OHHO":480,"OHIH":-1573,"OIHH":1935,"OIHI":-493,"OIIH":626,"OIII":-4007,"OKAK":-8156}; + this.TW1__ = {"につい":-4681,"東京都":2026}; + this.TW2__ = {"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216}; + this.TW3__ = {"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287}; + this.TW4__ = {"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865}; + this.UC1__ = {"A":484,"K":93,"M":645,"O":-505}; + this.UC2__ = {"A":819,"H":1059,"I":409,"M":3987,"N":5775,"O":646}; + this.UC3__ = {"A":-1370,"I":2311}; + this.UC4__ = {"A":-2643,"H":1809,"I":-1032,"K":-3450,"M":3565,"N":3876,"O":6646}; + this.UC5__ = {"H":313,"I":-1238,"K":-799,"M":539,"O":-831}; + this.UC6__ = {"H":-506,"I":-253,"K":87,"M":247,"O":-387}; + this.UP1__ = {"O":-214}; + this.UP2__ = {"B":69,"O":935}; + this.UP3__ = {"B":189}; + this.UQ1__ = {"BH":21,"BI":-12,"BK":-99,"BN":142,"BO":-56,"OH":-95,"OI":477,"OK":410,"OO":-2422}; + this.UQ2__ = {"BH":216,"BI":113,"OK":1759}; + this.UQ3__ = {"BA":-479,"BH":42,"BI":1913,"BK":-7198,"BM":3160,"BN":6427,"BO":14761,"OI":-827,"ON":-3212}; + this.UW1__ = {",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135}; + this.UW2__ = {",":-829,"、":-829,"〇":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978,"保":362,"入":548,"初":-3025,"副":-1566,"北":-3414,"区":-422,"大":-1769,"天":-865,"太":-483,"子":-1519,"学":760,"実":1023,"小":-2009,"市":-813,"年":-1060,"強":1067,"手":-1519,"揺":-1033,"政":1522,"文":-1355,"新":-1682,"日":-1815,"明":-1462,"最":-630,"朝":-1843,"本":-1650,"東":-931,"果":-665,"次":-2378,"民":-180,"気":-1740,"理":752,"発":529,"目":-1584,"相":-242,"県":-1165,"立":-763,"第":810,"米":509,"自":-1353,"行":838,"西":-744,"見":-3874,"調":1010,"議":1198,"込":3041,"開":1758,"間":-1257,"「":-645,"」":3145,"ッ":831,"ア":-587,"カ":306,"キ":568}; + this.UW3__ = {",":4889,"1":-800,"−":-1723,"、":4889,"々":-2311,"〇":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":2773,"わ":-1207,"を":6620,"ん":-518,"ア":551,"グ":1319,"ス":874,"ッ":-1350,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278,"・":-3794,"一":-1619,"下":-1759,"世":-2087,"両":3815,"中":653,"主":-758,"予":-1193,"二":974,"人":2742,"今":792,"他":1889,"以":-1368,"低":811,"何":4265,"作":-361,"保":-2439,"元":4858,"党":3593,"全":1574,"公":-3030,"六":755,"共":-1880,"円":5807,"再":3095,"分":457,"初":2475,"別":1129,"前":2286,"副":4437,"力":365,"動":-949,"務":-1872,"化":1327,"北":-1038,"区":4646,"千":-2309,"午":-783,"協":-1006,"口":483,"右":1233,"各":3588,"合":-241,"同":3906,"和":-837,"員":4513,"国":642,"型":1389,"場":1219,"外":-241,"妻":2016,"学":-1356,"安":-423,"実":-1008,"家":1078,"小":-513,"少":-3102,"州":1155,"市":3197,"平":-1804,"年":2416,"広":-1030,"府":1605,"度":1452,"建":-2352,"当":-3885,"得":1905,"思":-1291,"性":1822,"戸":-488,"指":-3973,"政":-2013,"教":-1479,"数":3222,"文":-1489,"新":1764,"日":2099,"旧":5792,"昨":-661,"時":-1248,"曜":-951,"最":-937,"月":4125,"期":360,"李":3094,"村":364,"東":-805,"核":5156,"森":2438,"業":484,"氏":2613,"民":-1694,"決":-1073,"法":1868,"海":-495,"無":979,"物":461,"特":-3850,"生":-273,"用":914,"町":1215,"的":7313,"直":-1835,"省":792,"県":6293,"知":-1528,"私":4231,"税":401,"立":-960,"第":1201,"米":7767,"系":3066,"約":3663,"級":1384,"統":-4229,"総":1163,"線":1255,"者":6457,"能":725,"自":-2869,"英":785,"見":1044,"調":-562,"財":-733,"費":1777,"車":1835,"軍":1375,"込":-1504,"通":-1136,"選":-681,"郎":1026,"郡":4404,"部":1200,"金":2163,"長":421,"開":-1432,"間":1302,"関":-1282,"雨":2009,"電":-1045,"非":2066,"駅":1620,"1":-800,"」":2670,"・":-3794,"ッ":-1350,"ア":551,"グ":1319,"ス":874,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278}; + this.UW4__ = {",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"〇":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":1464,"ま":1051,"み":-2082,"む":-882,"め":-5046,"も":4169,"ゃ":-2666,"や":2795,"ょ":-1544,"よ":3351,"ら":-2922,"り":-9726,"る":-14896,"れ":-2613,"ろ":-4570,"わ":-1783,"を":13150,"ん":-2352,"カ":2145,"コ":1789,"セ":1287,"ッ":-724,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637,"・":-4371,"ー":-11870,"一":-2069,"中":2210,"予":782,"事":-190,"井":-1768,"人":1036,"以":544,"会":950,"体":-1286,"作":530,"側":4292,"先":601,"党":-2006,"共":-1212,"内":584,"円":788,"初":1347,"前":1623,"副":3879,"力":-302,"動":-740,"務":-2715,"化":776,"区":4517,"協":1013,"参":1555,"合":-1834,"和":-681,"員":-910,"器":-851,"回":1500,"国":-619,"園":-1200,"地":866,"場":-1410,"塁":-2094,"士":-1413,"多":1067,"大":571,"子":-4802,"学":-1397,"定":-1057,"寺":-809,"小":1910,"屋":-1328,"山":-1500,"島":-2056,"川":-2667,"市":2771,"年":374,"庁":-4556,"後":456,"性":553,"感":916,"所":-1566,"支":856,"改":787,"政":2182,"教":704,"文":522,"方":-856,"日":1798,"時":1829,"最":845,"月":-9066,"木":-485,"来":-442,"校":-360,"業":-1043,"氏":5388,"民":-2716,"気":-910,"沢":-939,"済":-543,"物":-735,"率":672,"球":-1267,"生":-1286,"産":-1101,"田":-2900,"町":1826,"的":2586,"目":922,"省":-3485,"県":2997,"空":-867,"立":-2112,"第":788,"米":2937,"系":786,"約":2171,"経":1146,"統":-1169,"総":940,"線":-994,"署":749,"者":2145,"能":-730,"般":-852,"行":-792,"規":792,"警":-1184,"議":-244,"谷":-1000,"賞":730,"車":-1481,"軍":1158,"輪":-1433,"込":-3370,"近":929,"道":-1291,"選":2596,"郎":-4866,"都":1192,"野":-1100,"銀":-2213,"長":357,"間":-2344,"院":-2297,"際":-2604,"電":-878,"領":-1659,"題":-792,"館":-1984,"首":1749,"高":2120,"「":1895,"」":3798,"・":-4371,"ッ":-724,"ー":-11870,"カ":2145,"コ":1789,"セ":1287,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637}; + this.UW5__ = {",":465,".":-299,"1":-514,"E2":-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区":-901,"告":848,"員":2104,"大":-1296,"学":-548,"定":1785,"嵐":-1304,"市":-2991,"席":921,"年":1763,"思":872,"所":-814,"挙":1618,"新":-1682,"日":218,"月":-4353,"査":932,"格":1356,"機":-1508,"氏":-1347,"田":240,"町":-3912,"的":-3149,"相":1319,"省":-1052,"県":-4003,"研":-997,"社":-278,"空":-813,"統":1955,"者":-2233,"表":663,"語":-1073,"議":1219,"選":-1018,"郎":-368,"長":786,"間":1191,"題":2368,"館":-689,"1":-514,"E2":-32768,"「":363,"イ":241,"ル":451,"ン":-343}; + this.UW6__ = {",":227,".":808,"1":-270,"E1":306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"1":-270,"E1":306,"ル":-673,"ン":-496}; + + return this; + } + TinySegmenter.prototype.ctype_ = function(str) { + for (var i in this.chartype_) { + if (str.match(this.chartype_[i][0])) { + return this.chartype_[i][1]; + } + } + return "O"; + } + + TinySegmenter.prototype.ts_ = function(v) { + if (v) { return v; } + return 0; + } + + TinySegmenter.prototype.segment = function(input) { + if (input == null || input == undefined || input == "") { + return []; + } + var result = []; + var seg = ["B3","B2","B1"]; + var ctype = ["O","O","O"]; + var o = input.split(""); + for (i = 0; i < o.length; ++i) { + seg.push(o[i]); + ctype.push(this.ctype_(o[i])) + } + seg.push("E1"); + seg.push("E2"); + seg.push("E3"); + ctype.push("O"); + ctype.push("O"); + ctype.push("O"); + var word = seg[3]; + var p1 = "U"; + var p2 = "U"; + var p3 = "U"; + for (var i = 4; i < seg.length - 3; ++i) { + var score = this.BIAS__; + var w1 = seg[i-3]; + var w2 = seg[i-2]; + var w3 = seg[i-1]; + var w4 = seg[i]; + var w5 = seg[i+1]; + var w6 = seg[i+2]; + var c1 = ctype[i-3]; + var c2 = ctype[i-2]; + var c3 = ctype[i-1]; + var c4 = ctype[i]; + var c5 = ctype[i+1]; + var c6 = ctype[i+2]; + score += this.ts_(this.UP1__[p1]); + score += this.ts_(this.UP2__[p2]); + score += this.ts_(this.UP3__[p3]); + score += this.ts_(this.BP1__[p1 + p2]); + score += this.ts_(this.BP2__[p2 + p3]); + score += this.ts_(this.UW1__[w1]); + score += this.ts_(this.UW2__[w2]); + score += this.ts_(this.UW3__[w3]); + score += this.ts_(this.UW4__[w4]); + score += this.ts_(this.UW5__[w5]); + score += this.ts_(this.UW6__[w6]); + score += this.ts_(this.BW1__[w2 + w3]); + score += this.ts_(this.BW2__[w3 + w4]); + score += this.ts_(this.BW3__[w4 + w5]); + score += this.ts_(this.TW1__[w1 + w2 + w3]); + score += this.ts_(this.TW2__[w2 + w3 + w4]); + score += this.ts_(this.TW3__[w3 + w4 + w5]); + score += this.ts_(this.TW4__[w4 + w5 + w6]); + score += this.ts_(this.UC1__[c1]); + score += this.ts_(this.UC2__[c2]); + score += this.ts_(this.UC3__[c3]); + score += this.ts_(this.UC4__[c4]); + score += this.ts_(this.UC5__[c5]); + score += this.ts_(this.UC6__[c6]); + score += this.ts_(this.BC1__[c2 + c3]); + score += this.ts_(this.BC2__[c3 + c4]); + score += this.ts_(this.BC3__[c4 + c5]); + score += this.ts_(this.TC1__[c1 + c2 + c3]); + score += this.ts_(this.TC2__[c2 + c3 + c4]); + score += this.ts_(this.TC3__[c3 + c4 + c5]); + score += this.ts_(this.TC4__[c4 + c5 + c6]); + // score += this.ts_(this.TC5__[c4 + c5 + c6]); + score += this.ts_(this.UQ1__[p1 + c1]); + score += this.ts_(this.UQ2__[p2 + c2]); + score += this.ts_(this.UQ3__[p3 + c3]); + score += this.ts_(this.BQ1__[p2 + c2 + c3]); + score += this.ts_(this.BQ2__[p2 + c3 + c4]); + score += this.ts_(this.BQ3__[p3 + c2 + c3]); + score += this.ts_(this.BQ4__[p3 + c3 + c4]); + score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]); + score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]); + score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]); + score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]); + var p = "O"; + if (score > 0) { + result.push(word); + word = ""; + p = "B"; + } + p1 = p2; + p2 = p3; + p3 = p; + word += seg[i]; + } + result.push(word); + + return result; + } + + lunr.TinySegmenter = TinySegmenter; + }; + +})); \ No newline at end of file diff --git a/assets/javascripts/lunr/wordcut.js b/assets/javascripts/lunr/wordcut.js new file mode 100644 index 00000000..146f4b44 --- /dev/null +++ b/assets/javascripts/lunr/wordcut.js @@ -0,0 +1,6708 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}(g.lunr || (g.lunr = {})).wordcut = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1; + }) + this.addWords(words, false) + } + if(finalize){ + this.finalizeDict(); + } + }, + + dictSeek: function (l, r, ch, strOffset, pos) { + var ans = null; + while (l <= r) { + var m = Math.floor((l + r) / 2), + dict_item = this.dict[m], + len = dict_item.length; + if (len <= strOffset) { + l = m + 1; + } else { + var ch_ = dict_item[strOffset]; + if (ch_ < ch) { + l = m + 1; + } else if (ch_ > ch) { + r = m - 1; + } else { + ans = m; + if (pos == LEFT) { + r = m - 1; + } else { + l = m + 1; + } + } + } + } + return ans; + }, + + isFinal: function (acceptor) { + return this.dict[acceptor.l].length == acceptor.strOffset; + }, + + createAcceptor: function () { + return { + l: 0, + r: this.dict.length - 1, + strOffset: 0, + isFinal: false, + dict: this, + transit: function (ch) { + return this.dict.transit(this, ch); + }, + isError: false, + tag: "DICT", + w: 1, + type: "DICT" + }; + }, + + transit: function (acceptor, ch) { + var l = this.dictSeek(acceptor.l, + acceptor.r, + ch, + acceptor.strOffset, + LEFT); + if (l !== null) { + var r = this.dictSeek(l, + acceptor.r, + ch, + acceptor.strOffset, + RIGHT); + acceptor.l = l; + acceptor.r = r; + acceptor.strOffset++; + acceptor.isFinal = this.isFinal(acceptor); + } else { + acceptor.isError = true; + } + return acceptor; + }, + + sortuniq: function(a){ + return a.sort().filter(function(item, pos, arr){ + return !pos || item != arr[pos - 1]; + }) + }, + + flatten: function(a){ + //[[1,2],[3]] -> [1,2,3] + return [].concat.apply([], a); + } +}; +module.exports = WordcutDict; + +}).call(this,"/dist/tmp") +},{"glob":16,"path":22}],3:[function(require,module,exports){ +var WordRule = { + createAcceptor: function(tag) { + if (tag["WORD_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + var lch = ch.toLowerCase(); + if (lch >= "a" && lch <= "z") { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "WORD_RULE", + type: "WORD_RULE", + w: 1}; + } +}; + +var NumberRule = { + createAcceptor: function(tag) { + if (tag["NUMBER_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (ch >= "0" && ch <= "9") { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "NUMBER_RULE", + type: "NUMBER_RULE", + w: 1}; + } +}; + +var SpaceRule = { + tag: "SPACE_RULE", + createAcceptor: function(tag) { + + if (tag["SPACE_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (ch == " " || ch == "\t" || ch == "\r" || ch == "\n" || + ch == "\u00A0" || ch=="\u2003"//nbsp and emsp + ) { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: SpaceRule.tag, + w: 1, + type: "SPACE_RULE"}; + } +} + +var SingleSymbolRule = { + tag: "SINSYM", + createAcceptor: function(tag) { + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (this.strOffset == 0 && ch.match(/^[\@\(\)\/\,\-\."`]$/)) { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "SINSYM", + w: 1, + type: "SINSYM"}; + } +} + + +var LatinRules = [WordRule, SpaceRule, SingleSymbolRule, NumberRule]; + +module.exports = LatinRules; + +},{}],4:[function(require,module,exports){ +var _ = require("underscore") + , WordcutCore = require("./wordcut_core"); +var PathInfoBuilder = { + + /* + buildByPartAcceptors: function(path, acceptors, i) { + var + var genInfos = partAcceptors.reduce(function(genInfos, acceptor) { + + }, []); + + return genInfos; + } + */ + + buildByAcceptors: function(path, finalAcceptors, i) { + var self = this; + var infos = finalAcceptors.map(function(acceptor) { + var p = i - acceptor.strOffset + 1 + , _info = path[p]; + + var info = {p: p, + mw: _info.mw + (acceptor.mw === undefined ? 0 : acceptor.mw), + w: acceptor.w + _info.w, + unk: (acceptor.unk ? acceptor.unk : 0) + _info.unk, + type: acceptor.type}; + + if (acceptor.type == "PART") { + for(var j = p + 1; j <= i; j++) { + path[j].merge = p; + } + info.merge = p; + } + + return info; + }); + return infos.filter(function(info) { return info; }); + }, + + fallback: function(path, leftBoundary, text, i) { + var _info = path[leftBoundary]; + if (text[i].match(/[\u0E48-\u0E4E]/)) { + if (leftBoundary != 0) + leftBoundary = path[leftBoundary].p; + return {p: leftBoundary, + mw: 0, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; +/* } else if(leftBoundary > 0 && path[leftBoundary].type !== "UNK") { + leftBoundary = path[leftBoundary].p; + return {p: leftBoundary, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; */ + } else { + return {p: leftBoundary, + mw: _info.mw, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; + } + }, + + build: function(path, finalAcceptors, i, leftBoundary, text) { + var basicPathInfos = this.buildByAcceptors(path, finalAcceptors, i); + if (basicPathInfos.length > 0) { + return basicPathInfos; + } else { + return [this.fallback(path, leftBoundary, text, i)]; + } + } +}; + +module.exports = function() { + return _.clone(PathInfoBuilder); +} + +},{"./wordcut_core":8,"underscore":25}],5:[function(require,module,exports){ +var _ = require("underscore"); + + +var PathSelector = { + selectPath: function(paths) { + var path = paths.reduce(function(selectedPath, path) { + if (selectedPath == null) { + return path; + } else { + if (path.unk < selectedPath.unk) + return path; + if (path.unk == selectedPath.unk) { + if (path.mw < selectedPath.mw) + return path + if (path.mw == selectedPath.mw) { + if (path.w < selectedPath.w) + return path; + } + } + return selectedPath; + } + }, null); + return path; + }, + + createPath: function() { + return [{p:null, w:0, unk:0, type: "INIT", mw:0}]; + } +}; + +module.exports = function() { + return _.clone(PathSelector); +}; + +},{"underscore":25}],6:[function(require,module,exports){ +function isMatch(pat, offset, ch) { + if (pat.length <= offset) + return false; + var _ch = pat[offset]; + return _ch == ch || + (_ch.match(/[กข]/) && ch.match(/[ก-ฮ]/)) || + (_ch.match(/[มบ]/) && ch.match(/[ก-ฮ]/)) || + (_ch.match(/\u0E49/) && ch.match(/[\u0E48-\u0E4B]/)); +} + +var Rule0 = { + pat: "เหก็ม", + createAcceptor: function(tag) { + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (isMatch(Rule0.pat, this.strOffset,ch)) { + this.isFinal = (this.strOffset + 1 == Rule0.pat.length); + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "THAI_RULE", + type: "THAI_RULE", + w: 1}; + } +}; + +var PartRule = { + createAcceptor: function(tag) { + return {strOffset: 0, + patterns: [ + "แก", "เก", "ก้", "กก์", "กา", "กี", "กิ", "กืก" + ], + isFinal: false, + transit: function(ch) { + var offset = this.strOffset; + this.patterns = this.patterns.filter(function(pat) { + return isMatch(pat, offset, ch); + }); + + if (this.patterns.length > 0) { + var len = 1 + offset; + this.isFinal = this.patterns.some(function(pat) { + return pat.length == len; + }); + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "PART", + type: "PART", + unk: 1, + w: 1}; + } +}; + +var ThaiRules = [Rule0, PartRule]; + +module.exports = ThaiRules; + +},{}],7:[function(require,module,exports){ +var sys = require("sys") + , WordcutDict = require("./dict") + , WordcutCore = require("./wordcut_core") + , PathInfoBuilder = require("./path_info_builder") + , PathSelector = require("./path_selector") + , Acceptors = require("./acceptors") + , latinRules = require("./latin_rules") + , thaiRules = require("./thai_rules") + , _ = require("underscore"); + + +var Wordcut = Object.create(WordcutCore); +Wordcut.defaultPathInfoBuilder = PathInfoBuilder; +Wordcut.defaultPathSelector = PathSelector; +Wordcut.defaultAcceptors = Acceptors; +Wordcut.defaultLatinRules = latinRules; +Wordcut.defaultThaiRules = thaiRules; +Wordcut.defaultDict = WordcutDict; + + +Wordcut.initNoDict = function(dict_path) { + var self = this; + self.pathInfoBuilder = new self.defaultPathInfoBuilder; + self.pathSelector = new self.defaultPathSelector; + self.acceptors = new self.defaultAcceptors; + self.defaultLatinRules.forEach(function(rule) { + self.acceptors.creators.push(rule); + }); + self.defaultThaiRules.forEach(function(rule) { + self.acceptors.creators.push(rule); + }); +}; + +Wordcut.init = function(dict_path, withDefault, additionalWords) { + withDefault = withDefault || false; + this.initNoDict(); + var dict = _.clone(this.defaultDict); + dict.init(dict_path, withDefault, additionalWords); + this.acceptors.creators.push(dict); +}; + +module.exports = Wordcut; + +},{"./acceptors":1,"./dict":2,"./latin_rules":3,"./path_info_builder":4,"./path_selector":5,"./thai_rules":6,"./wordcut_core":8,"sys":28,"underscore":25}],8:[function(require,module,exports){ +var WordcutCore = { + + buildPath: function(text) { + var self = this + , path = self.pathSelector.createPath() + , leftBoundary = 0; + self.acceptors.reset(); + for (var i = 0; i < text.length; i++) { + var ch = text[i]; + self.acceptors.transit(ch); + + var possiblePathInfos = self + .pathInfoBuilder + .build(path, + self.acceptors.getFinalAcceptors(), + i, + leftBoundary, + text); + var selectedPath = self.pathSelector.selectPath(possiblePathInfos) + + path.push(selectedPath); + if (selectedPath.type !== "UNK") { + leftBoundary = i; + } + } + return path; + }, + + pathToRanges: function(path) { + var e = path.length - 1 + , ranges = []; + + while (e > 0) { + var info = path[e] + , s = info.p; + + if (info.merge !== undefined && ranges.length > 0) { + var r = ranges[ranges.length - 1]; + r.s = info.merge; + s = r.s; + } else { + ranges.push({s:s, e:e}); + } + e = s; + } + return ranges.reverse(); + }, + + rangesToText: function(text, ranges, delimiter) { + return ranges.map(function(r) { + return text.substring(r.s, r.e); + }).join(delimiter); + }, + + cut: function(text, delimiter) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + return this + .rangesToText(text, ranges, + (delimiter === undefined ? "|" : delimiter)); + }, + + cutIntoRanges: function(text, noText) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + + if (!noText) { + ranges.forEach(function(r) { + r.text = text.substring(r.s, r.e); + }); + } + return ranges; + }, + + cutIntoArray: function(text) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + + return ranges.map(function(r) { + return text.substring(r.s, r.e) + }); + } +}; + +module.exports = WordcutCore; + +},{}],9:[function(require,module,exports){ +// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 +// +// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! +// +// Originally from narwhal.js (http://narwhaljs.org) +// Copyright (c) 2009 Thomas Robinson <280north.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the 'Software'), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// when used in node, this will actually load the util module we depend on +// versus loading the builtin util module as happens otherwise +// this is a bug in node module loading as far as I am concerned +var util = require('util/'); + +var pSlice = Array.prototype.slice; +var hasOwn = Object.prototype.hasOwnProperty; + +// 1. The assert module provides functions that throw +// AssertionError's when particular conditions are not met. The +// assert module must conform to the following interface. + +var assert = module.exports = ok; + +// 2. The AssertionError is defined in assert. +// new assert.AssertionError({ message: message, +// actual: actual, +// expected: expected }) + +assert.AssertionError = function AssertionError(options) { + this.name = 'AssertionError'; + this.actual = options.actual; + this.expected = options.expected; + this.operator = options.operator; + if (options.message) { + this.message = options.message; + this.generatedMessage = false; + } else { + this.message = getMessage(this); + this.generatedMessage = true; + } + var stackStartFunction = options.stackStartFunction || fail; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, stackStartFunction); + } + else { + // non v8 browsers so we can have a stacktrace + var err = new Error(); + if (err.stack) { + var out = err.stack; + + // try to strip useless frames + var fn_name = stackStartFunction.name; + var idx = out.indexOf('\n' + fn_name); + if (idx >= 0) { + // once we have located the function frame + // we need to strip out everything before it (and its line) + var next_line = out.indexOf('\n', idx + 1); + out = out.substring(next_line + 1); + } + + this.stack = out; + } + } +}; + +// assert.AssertionError instanceof Error +util.inherits(assert.AssertionError, Error); + +function replacer(key, value) { + if (util.isUndefined(value)) { + return '' + value; + } + if (util.isNumber(value) && !isFinite(value)) { + return value.toString(); + } + if (util.isFunction(value) || util.isRegExp(value)) { + return value.toString(); + } + return value; +} + +function truncate(s, n) { + if (util.isString(s)) { + return s.length < n ? s : s.slice(0, n); + } else { + return s; + } +} + +function getMessage(self) { + return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + + self.operator + ' ' + + truncate(JSON.stringify(self.expected, replacer), 128); +} + +// At present only the three keys mentioned above are used and +// understood by the spec. Implementations or sub modules can pass +// other keys to the AssertionError's constructor - they will be +// ignored. + +// 3. All of the following functions must throw an AssertionError +// when a corresponding condition is not met, with a message that +// may be undefined if not provided. All assertion methods provide +// both the actual and expected values to the assertion error for +// display purposes. + +function fail(actual, expected, message, operator, stackStartFunction) { + throw new assert.AssertionError({ + message: message, + actual: actual, + expected: expected, + operator: operator, + stackStartFunction: stackStartFunction + }); +} + +// EXTENSION! allows for well behaved errors defined elsewhere. +assert.fail = fail; + +// 4. Pure assertion tests whether a value is truthy, as determined +// by !!guard. +// assert.ok(guard, message_opt); +// This statement is equivalent to assert.equal(true, !!guard, +// message_opt);. To test strictly for the value true, use +// assert.strictEqual(true, guard, message_opt);. + +function ok(value, message) { + if (!value) fail(value, true, message, '==', assert.ok); +} +assert.ok = ok; + +// 5. The equality assertion tests shallow, coercive equality with +// ==. +// assert.equal(actual, expected, message_opt); + +assert.equal = function equal(actual, expected, message) { + if (actual != expected) fail(actual, expected, message, '==', assert.equal); +}; + +// 6. The non-equality assertion tests for whether two objects are not equal +// with != assert.notEqual(actual, expected, message_opt); + +assert.notEqual = function notEqual(actual, expected, message) { + if (actual == expected) { + fail(actual, expected, message, '!=', assert.notEqual); + } +}; + +// 7. The equivalence assertion tests a deep equality relation. +// assert.deepEqual(actual, expected, message_opt); + +assert.deepEqual = function deepEqual(actual, expected, message) { + if (!_deepEqual(actual, expected)) { + fail(actual, expected, message, 'deepEqual', assert.deepEqual); + } +}; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (util.isBuffer(actual) && util.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + + return true; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!util.isObject(actual) && !util.isObject(expected)) { + return actual == expected; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + +function isArguments(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +} + +function objEquiv(a, b) { + if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + // if one is a primitive, the other must be same + if (util.isPrimitive(a) || util.isPrimitive(b)) { + return a === b; + } + var aIsArgs = isArguments(a), + bIsArgs = isArguments(b); + if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) + return false; + if (aIsArgs) { + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + var ka = objectKeys(a), + kb = objectKeys(b), + key, i; + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key])) return false; + } + return true; +} + +// 8. The non-equivalence assertion tests for any deep inequality. +// assert.notDeepEqual(actual, expected, message_opt); + +assert.notDeepEqual = function notDeepEqual(actual, expected, message) { + if (_deepEqual(actual, expected)) { + fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); + } +}; + +// 9. The strict equality assertion tests strict equality, as determined by ===. +// assert.strictEqual(actual, expected, message_opt); + +assert.strictEqual = function strictEqual(actual, expected, message) { + if (actual !== expected) { + fail(actual, expected, message, '===', assert.strictEqual); + } +}; + +// 10. The strict non-equality assertion tests for strict inequality, as +// determined by !==. assert.notStrictEqual(actual, expected, message_opt); + +assert.notStrictEqual = function notStrictEqual(actual, expected, message) { + if (actual === expected) { + fail(actual, expected, message, '!==', assert.notStrictEqual); + } +}; + +function expectedException(actual, expected) { + if (!actual || !expected) { + return false; + } + + if (Object.prototype.toString.call(expected) == '[object RegExp]') { + return expected.test(actual); + } else if (actual instanceof expected) { + return true; + } else if (expected.call({}, actual) === true) { + return true; + } + + return false; +} + +function _throws(shouldThrow, block, expected, message) { + var actual; + + if (util.isString(expected)) { + message = expected; + expected = null; + } + + try { + block(); + } catch (e) { + actual = e; + } + + message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + + (message ? ' ' + message : '.'); + + if (shouldThrow && !actual) { + fail(actual, expected, 'Missing expected exception' + message); + } + + if (!shouldThrow && expectedException(actual, expected)) { + fail(actual, expected, 'Got unwanted exception' + message); + } + + if ((shouldThrow && actual && expected && + !expectedException(actual, expected)) || (!shouldThrow && actual)) { + throw actual; + } +} + +// 11. Expected to throw an error: +// assert.throws(block, Error_opt, message_opt); + +assert.throws = function(block, /*optional*/error, /*optional*/message) { + _throws.apply(this, [true].concat(pSlice.call(arguments))); +}; + +// EXTENSION! This is annoying to write outside this module. +assert.doesNotThrow = function(block, /*optional*/message) { + _throws.apply(this, [false].concat(pSlice.call(arguments))); +}; + +assert.ifError = function(err) { if (err) {throw err;}}; + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + if (hasOwn.call(obj, key)) keys.push(key); + } + return keys; +}; + +},{"util/":28}],10:[function(require,module,exports){ +'use strict'; +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} + +},{}],11:[function(require,module,exports){ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + + +},{"balanced-match":10,"concat-map":13}],12:[function(require,module,exports){ + +},{}],13:[function(require,module,exports){ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +},{}],14:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } + throw TypeError('Uncaught, unspecified "error" event.'); + } + } + + handler = this._events[type]; + + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + handler.apply(this, args); + } + } else if (isObject(handler)) { + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } + + return true; +}; + +EventEmitter.prototype.addListener = function(type, listener) { + var m; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events) + this._events = {}; + + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + var m; + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; + +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.listenerCount = function(emitter, type) { + var ret; + if (!emitter._events || !emitter._events[type]) + ret = 0; + else if (isFunction(emitter._events[type])) + ret = 1; + else + ret = emitter._events[type].length; + return ret; +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} + +},{}],15:[function(require,module,exports){ +(function (process){ +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} + +var path = require("path") +var minimatch = require("minimatch") +var isAbsolute = require("path-is-absolute") +var Minimatch = minimatch.Minimatch + +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} + +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern) + } + + return { + matcher: new Minimatch(pattern), + gmatcher: gmatcher + } +} + +function setopts (self, pattern, options) { + if (!options) + options = {} + + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } + + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) + + setupIgnores(self, options) + + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = options.cwd + self.changedCwd = path.resolve(options.cwd) !== cwd + } + + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") + + self.nomount = !!options.nomount + + // disable comments and negation unless the user explicitly + // passes in false as the option. + options.nonegate = options.nonegate === false ? false : true + options.nocomment = options.nocomment === false ? false : true + deprecationWarning(options) + + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} + +// TODO(isaacs): remove entirely in v6 +// exported to reset in tests +exports.deprecationWarned +function deprecationWarning(options) { + if (!options.nonegate || !options.nocomment) { + if (process.noDeprecation !== true && !exports.deprecationWarned) { + var msg = 'glob WARNING: comments and negation will be disabled in v6' + if (process.throwDeprecation) + throw new Error(msg) + else if (process.traceDeprecation) + console.trace(msg) + else + console.error(msg) + + exports.deprecationWarned = true + } + } +} + +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } + + if (!nou) + all = Object.keys(all) + + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + return !(/\/$/.test(e)) + }) + } + } + + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) + + self.found = all +} + +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' + + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } + + return m +} + +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) + } + return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +}).call(this,require('_process')) +},{"_process":24,"minimatch":20,"path":22,"path-is-absolute":23}],16:[function(require,module,exports){ +(function (process){ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. + +module.exports = glob + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var inherits = require('inherits') +var EE = require('events').EventEmitter +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var globSync = require('./sync.js') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = require('inflight') +var util = require('util') +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +var once = require('once') + +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} + + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) + } + + return new Glob(pattern, options, cb) +} + +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync + +// old api surface +glob.glob = glob + +glob.hasMagic = function (pattern, options_) { + var options = util._extend({}, options_) + options.noprocess = true + + var g = new Glob(pattern, options) + var set = g.minimatch.set + if (set.length > 1) + return true + + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } + + return false +} + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } + + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) + + setopts(this, pattern, options) + this._didRealPath = false + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) + + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } + + var self = this + var n = this.minimatch.set.length + this._processing = 0 + this.matches = new Array(n) + + this._emitQueue = [] + this._processQueue = [] + this.paused = false + + if (this.noprocess) + return this + + if (n === 0) + return done() + + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + + function done () { + --self._processing + if (self._processing <= 0) + self._finish() + } +} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return + + if (this.realpath && !this._didRealpath) + return this._realpath() + + common.finish(this) + this.emit('end', this.found) +} + +Glob.prototype._realpath = function () { + if (this._didRealpath) + return + + this._didRealpath = true + + var n = this.matches.length + if (n === 0) + return this._finish() + + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) + + function next () { + if (--n === 0) + self._finish() + } +} + +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() + + var found = Object.keys(matchset) + var self = this + var n = found.length + + if (n === 0) + return cb() + + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + fs.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here + + if (--n === 0) { + self.matches[index] = set + cb() + } + }) + }) +} + +Glob.prototype._mark = function (p) { + return common.mark(this, p) +} + +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} + +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} + +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) + } + } + } +} + +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return + } + + //console.error('PROCESS %d', this._processing, pattern) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return cb() + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + this._process([e].concat(remain), index, inGlobStar, cb) + } + cb() +} + +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return + + if (this.matches[index][e]) + return + + if (isIgnored(this, e)) + return + + if (this.paused) { + this._emitQueue.push([index, e]) + return + } + + var abs = this._makeAbs(e) + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + if (this.mark) + e = this._mark(e) + + this.matches[index][e] = true + + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) + + this.emit('match', e) +} + +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return + + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) + + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) + + if (lstatcb) + fs.lstat(abs, lstatcb) + + function lstatcb_ (er, lstat) { + if (er) + return cb() + + var isSym = lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) + } +} + +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return + + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return + + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() + + if (Array.isArray(c)) + return cb(null, c) + } + + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) +} + +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } +} + +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return + + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + return cb(null, entries) +} + +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return + + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break + } + + return cb() +} + +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + + +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) + + var isSym = this.symlinks[abs] + var len = entries.length + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) + } + + cb() +} + +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { + + //console.error('ps2', prefix, exists) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} + +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return cb() + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) + + if (needDir && c === 'FILE') + return cb() + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } + + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) + + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) + } + } +} + +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er) { + this.statCache[abs] = false + return cb() + } + + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat + + if (abs.slice(-1) === '/' && !stat.isDirectory()) + return cb(null, false, stat) + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return cb() + + return cb(null, c, stat) +} + +}).call(this,require('_process')) +},{"./common.js":15,"./sync.js":17,"_process":24,"assert":9,"events":14,"fs":12,"inflight":18,"inherits":19,"minimatch":20,"once":21,"path":22,"path-is-absolute":23,"util":28}],17:[function(require,module,exports){ +(function (process){ +module.exports = globSync +globSync.GlobSync = GlobSync + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var Glob = require('./glob.js').Glob +var util = require('util') +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored + +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') + + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + + setopts(this, pattern, options) + + if (this.noprocess) + return this + + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} + +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = fs.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er + } + } + }) + } + common.finish(this) +} + + +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip processing + if (childrenIgnored(this, read)) + return + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this.matches[index][e] = true + } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) + } +} + + +GlobSync.prototype._emitMatch = function (index, e) { + var abs = this._makeAbs(e) + if (this.mark) + e = this._mark(e) + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[this._makeAbs(e)] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + if (this.stat) + this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) + + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + // lstat failed, doesn't exist + return null + } + + var isSym = lstat.isSymbolicLink() + this.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) + + return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries + + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null + + if (Array.isArray(c)) + return c + } + + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + + // mark and cache dir-ness + return entries +} + +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break + } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + + var entries = this._readdir(abs, inGlobStar) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) + + var len = entries.length + var isSym = this.symlinks[abs] + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} + +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this.matches[index][prefix] = true +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return false + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c + + if (needDir && c === 'FILE') + return false + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + return false + } + + if (lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } + + this.statCache[abs] = stat + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return false + + return c +} + +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +}).call(this,require('_process')) +},{"./common.js":15,"./glob.js":16,"_process":24,"assert":9,"fs":12,"minimatch":20,"path":22,"path-is-absolute":23,"util":28}],18:[function(require,module,exports){ +(function (process){ +var wrappy = require('wrappy') +var reqs = Object.create(null) +var once = require('once') + +module.exports = wrappy(inflight) + +function inflight (key, cb) { + if (reqs[key]) { + reqs[key].push(cb) + return null + } else { + reqs[key] = [cb] + return makeres(key) + } +} + +function makeres (key) { + return once(function RES () { + var cbs = reqs[key] + var len = cbs.length + var args = slice(arguments) + + // XXX It's somewhat ambiguous whether a new callback added in this + // pass should be queued for later execution if something in the + // list of callbacks throws, or if it should just be discarded. + // However, it's such an edge case that it hardly matters, and either + // choice is likely as surprising as the other. + // As it happens, we do go ahead and schedule it for later execution. + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args) + } + } finally { + if (cbs.length > len) { + // added more in the interim. + // de-zalgo, just in case, but don't call again. + cbs.splice(0, len) + process.nextTick(function () { + RES.apply(null, args) + }) + } else { + delete reqs[key] + } + } + }) +} + +function slice (args) { + var length = args.length + var array = [] + + for (var i = 0; i < length; i++) array[i] = args[i] + return array +} + +}).call(this,require('_process')) +},{"_process":24,"once":21,"wrappy":29}],19:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],20:[function(require,module,exports){ +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var path = { sep: '/' } +try { + path = require('path') +} catch (er) {} + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = require('brace-expansion') + +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } +} + +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' + +// * => any number of characters +var star = qmark + '*?' + +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' + +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' + +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + +function minimatch (p, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false + } + + // "" only matches "" + if (pattern.trim() === '') return p === '' + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') + } + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function () {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 + + if (options.nonegate) return + + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options + } else { + options = {} + } + } + + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern + + if (typeof pattern === 'undefined') { + throw new TypeError('undefined pattern') + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError('pattern is too long') + } + + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === '**') return GLOBSTAR + if (pattern === '') return '' + + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue + } + + switch (c) { + case '/': + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case '\\': + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case '(': + if (inClass) { + re += '(' + continue + } + + if (!stateChar) { + re += '\\(' + continue + } + + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } + + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue + + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } + + clearStateChar() + re += '|' + continue + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += '\\' + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } + + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + if (inClass) { + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } + + re += c + + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' + }) + + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '.': + case '[': + case '(': addPatternStart = true + } + + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] + + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + + if (addPatternStart) { + re = patternStart + re + } + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) { + this.regexp = false + return this.regexp + } + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' + + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) { + this.regexp = false + } + return this.regexp +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' + + if (f === '/' && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, 'set', set) + + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) + + this.debug('matchOne', file.length, pattern.length) + + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ + } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') + return emptyFileEnd + } + + // should be unreachable. + throw new Error('wtf?') +} + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} + +},{"brace-expansion":11,"path":22}],21:[function(require,module,exports){ +var wrappy = require('wrappy') +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} + +},{"wrappy":29}],22:[function(require,module,exports){ +(function (process){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var splitPath = function(filename) { + return splitPathRe.exec(filename).slice(1); +}; + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); +}; + + +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function(path) { + var result = splitPath(path), + root = result[0], + dir = result[1]; + + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + + return root + dir; +}; + + +exports.basename = function(path, ext) { + var f = splitPath(path)[2]; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + + +exports.extname = function(path) { + return splitPath(path)[3]; +}; + +function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// String.prototype.substr - negative index don't work in IE8 +var substr = 'ab'.substr(-1) === 'b' + ? function (str, start, len) { return str.substr(start, len) } + : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } +; + +}).call(this,require('_process')) +},{"_process":24}],23:[function(require,module,exports){ +(function (process){ +'use strict'; + +function posix(path) { + return path.charAt(0) === '/'; +} + +function win32(path) { + // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ''; + var isUnc = Boolean(device && device.charAt(1) !== ':'); + + // UNC paths are always absolute + return Boolean(result[2] || isUnc); +} + +module.exports = process.platform === 'win32' ? win32 : posix; +module.exports.posix = posix; +module.exports.win32 = win32; + +}).call(this,require('_process')) +},{"_process":24}],24:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],25:[function(require,module,exports){ +// Underscore.js 1.8.3 +// http://underscorejs.org +// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `exports` on the server. + var root = this; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + + // Create quick reference variables for speed access to core prototypes. + var + push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var + nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeBind = FuncProto.bind, + nativeCreate = Object.create; + + // Naked function reference for surrogate-prototype-swapping. + var Ctor = function(){}; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for the old `require()` API. If we're in + // the browser, add `_` as a global object. + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.8.3'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + case 2: return function(value, other) { + return func.call(context, value, other); + }; + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + // A mostly-internal function to generate callbacks that can be applied + // to each element in a collection, returning the desired result — either + // identity, an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (value == null) return _.identity; + if (_.isFunction(value)) return optimizeCb(value, context, argCount); + if (_.isObject(value)) return _.matcher(value); + return _.property(value); + }; + _.iteratee = function(value, context) { + return cb(value, context, Infinity); + }; + + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, undefinedOnly) { + return function(obj) { + var length = arguments.length; + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + }; + + // An internal function for creating a new object that inherits from another. + var baseCreate = function(prototype) { + if (!_.isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + }; + + var property = function(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + }; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + var getLength = property('length'); + var isArrayLike = function(collection) { + var length = getLength(collection); + return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; + }; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var keys = _.keys(obj); + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); + } + } + return obj; + }; + + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Create a reducing function iterating left or right. + function createReduce(dir) { + // Optimized iterator function as using arguments.length + // in the main function will deoptimize the, see #1991. + function iterator(obj, iteratee, memo, keys, index, length) { + for (; index >= 0 && index < length; index += dir) { + var currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + } + + return function(obj, iteratee, memo, context) { + iteratee = optimizeCb(iteratee, context, 4); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + // Determine the initial value if none is provided. + if (arguments.length < 3) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } + return iterator(obj, iteratee, memo, keys, index, length); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + _.reduce = _.foldl = _.inject = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + _.reduceRight = _.foldr = createReduce(-1); + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, predicate, context) { + var key; + if (isArrayLike(obj)) { + key = _.findIndex(obj, predicate, context); + } else { + key = _.findKey(obj, predicate, context); + } + if (key !== void 0 && key !== -1) return obj[key]; + }; + + // Return all the elements that pass a truth test. + // Aliased as `select`. + _.filter = _.select = function(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(cb(predicate)), context); + }; + + // Determine whether all of the elements match a truth test. + // Aliased as `all`. + _.every = _.all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + }; + + // Determine if at least one element in the object matches a truth test. + // Aliased as `any`. + _.some = _.any = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + }; + + // Determine if the array or object contains a given item (using `===`). + // Aliased as `includes` and `include`. + _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return _.indexOf(obj, item, fromIndex) >= 0; + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = function(obj, method) { + var args = slice.call(arguments, 2); + var isFunc = _.isFunction(method); + return _.map(obj, function(value) { + var func = isFunc ? method : value[method]; + return func == null ? func : func.apply(value, args); + }); + }; + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, _.property(key)); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs) { + return _.filter(obj, _.matcher(attrs)); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.find(obj, _.matcher(attrs)); + }; + + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Shuffle a collection, using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + _.shuffle = function(obj) { + var set = isArrayLike(obj) ? obj : _.values(obj); + var length = set.length; + var shuffled = Array(length); + for (var index = 0, rand; index < length; index++) { + rand = _.random(0, index); + if (rand !== index) shuffled[index] = shuffled[rand]; + shuffled[rand] = set[index]; + } + return shuffled; + }; + + // Sample **n** random values from a collection. + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + return obj[_.random(obj.length - 1)]; + } + return _.shuffle(obj).slice(0, Math.max(0, n)); + }; + + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + return _.pluck(_.map(obj, function(value, index, list) { + return { + value: value, + index: index, + criteria: iteratee(value, index, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior) { + return function(obj, iteratee, context) { + var result = {}; + iteratee = cb(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, value, key) { + if (_.has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, value, key) { + if (_.has(result, key)) result[key]++; else result[key] = 1; + }); + + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (isArrayLike(obj)) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : _.keys(obj).length; + }; + + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = function(obj, predicate, context) { + predicate = cb(predicate, context); + var pass = [], fail = []; + _.each(obj, function(value, key, obj) { + (predicate(value, key, obj) ? pass : fail).push(value); + }); + return [pass, fail]; + }; + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[0]; + return _.initial(array, array.length - n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + _.initial = function(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + _.last = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[array.length - 1]; + return _.rest(array, Math.max(0, array.length - n)); + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, _.identity); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, strict, startIndex) { + var output = [], idx = 0; + for (var i = startIndex || 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { + //flatten current level of array or arguments object + if (!shallow) value = flatten(value, shallow, strict); + var j = 0, len = value.length; + output.length += len; + while (j < len) { + output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, false); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = function(array) { + return _.difference(array, slice.call(arguments, 1)); + }; + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!_.contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!_.contains(result, value)) { + result.push(value); + } + } + return result; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = function() { + return _.uniq(flatten(arguments, true, true)); + }; + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + for (var j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = function(array) { + var rest = flatten(arguments, true, true, 1); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = function() { + return _.unzip(arguments); + }; + + // Complement of _.zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices + _.unzip = function(array) { + var length = array && _.max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = _.pluck(array, index); + } + return result; + }; + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. + _.object = function(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // Generator function to create the findIndex and findLastIndex functions + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a predicate test + _.findIndex = createPredicateIndexFinder(1); + _.findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + }; + + // Generator function to create the indexOf and lastIndexOf functions + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), _.isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + step = step || 1; + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + }; + + // Function (ahem) Functions + // ------------------ + + // Determines whether to execute a function as a constructor + // or a normal function with the provided arguments + var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (_.isObject(result)) return result; + return self; + }; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = function(func, context) { + if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + var args = slice.call(arguments, 2); + var bound = function() { + return executeBound(func, bound, context, this, args.concat(slice.call(arguments))); + }; + return bound; + }; + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder, allowing any combination of arguments to be pre-filled. + _.partial = function(func) { + var boundArgs = slice.call(arguments, 1); + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = function(obj) { + var i, length = arguments.length, key; + if (length <= 1) throw new Error('bindAll must be passed function names'); + for (i = 1; i < length; i++) { + key = arguments[i]; + obj[key] = _.bind(obj[key], obj); + } + return obj; + }; + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = function(func, wait) { + var args = slice.call(arguments, 2); + return setTimeout(function(){ + return func.apply(null, args); + }, wait); + }; + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = _.partial(_.delay, _, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + if (!options) options = {}; + var later = function() { + previous = options.leading === false ? 0 : _.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + return function() { + var now = _.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, args, context, timestamp, result; + + var later = function() { + var last = _.now() - timestamp; + + if (last < wait && last >= 0) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + if (!timeout) context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = _.now(); + var callNow = immediate && !timeout; + if (!timeout) timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + context = args = null; + } + + return result; + }; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + }; + + // Returns a function that will only be executed on and after the Nth call. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Returns a function that will only be executed up to (but not including) the Nth call. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + + // Object Functions + // ---------------- + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + function collectNonEnumProps(obj, keys) { + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys` + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (_.has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve all the property names of an object. + _.allKeys = function(obj) { + if (!_.isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Returns the results of applying the iteratee to each element of the object + // In contrast to _.map it returns an object + _.mapObject = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = _.keys(obj), + length = keys.length, + results = {}, + currentKey; + for (var index = 0; index < length; index++) { + currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Convert an object into a list of `[key, value]` pairs. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods` + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = createAssigner(_.allKeys); + + // Assigns a given object with all the own properties in the passed-in object(s) + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + _.extendOwn = _.assign = createAssigner(_.keys); + + // Returns the first key on an object that passes a predicate test + _.findKey = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = _.keys(obj), key; + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = function(object, oiteratee, context) { + var result = {}, obj = object, iteratee, keys; + if (obj == null) return result; + if (_.isFunction(oiteratee)) { + keys = _.allKeys(obj); + iteratee = optimizeCb(oiteratee, context); + } else { + keys = flatten(arguments, false, false, 1); + iteratee = function(value, key, obj) { return key in obj; }; + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }; + + // Return a copy of the object without the blacklisted properties. + _.omit = function(obj, iteratee, context) { + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + } else { + var keys = _.map(flatten(arguments, false, false, 1), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; + } + return _.pick(obj, iteratee, context); + }; + + // Fill in a given object with default properties. + _.defaults = createAssigner(_.allKeys, true); + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + _.create = function(prototype, props) { + var result = baseCreate(prototype); + if (props) _.extendOwn(result, props); + return result; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Returns whether an object has a given set of `key:value` pairs. + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + + + // Internal recursive comparison function for `isEqual`. + var eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // A strict comparison is necessary because `null == undefined`. + if (a == null || b == null) return a === b; + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + switch (className) { + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + } + + var areArrays = className === '[object Array]'; + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var keys = _.keys(a), key; + length = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (_.keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; + return _.keys(obj).length === 0; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) === '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) === '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return _.has(obj, 'callee'); + }; + } + + // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, + // IE 11 (#1621), and in Safari 8 (#1929). + if (typeof /./ != 'function' && typeof Int8Array != 'object') { + _.isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? (NaN is the only number which does not equal itself). + _.isNaN = function(obj) { + return _.isNumber(obj) && obj !== +obj; + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iteratees. + _.identity = function(value) { + return value; + }; + + // Predicate-generating functions. Often useful outside of Underscore. + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + _.property = property; + + // Generates a function for a given object that returns a given property. + _.propertyOf = function(obj) { + return obj == null ? function(){} : function(key) { + return obj[key]; + }; + }; + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + _.matcher = _.matches = function(attrs) { + attrs = _.extendOwn({}, attrs); + return function(obj) { + return _.isMatch(obj, attrs); + }; + }; + + // Run a function **n** times. + _.times = function(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); + }; + + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + var unescapeMap = _.invert(escapeMap); + + // Functions for escaping and unescaping strings to/from HTML interpolation. + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); + + // If the value of the named `property` is a function then invoke it with the + // `object` as context; otherwise, return it. + _.result = function(object, property, fallback) { + var value = object == null ? void 0 : object[property]; + if (value === void 0) { + value = fallback; + } + return _.isFunction(value) ? value.call(object) : value; + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g, + escape : /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escaper = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escaper, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offest. + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + try { + var render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function. Start chaining a wrapped Underscore object. + _.chain = function(obj) { + var instance = _(obj); + instance._chain = true; + return instance; + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var result = function(instance, obj) { + return instance._chain ? _(obj).chain() : obj; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return result(this, func.apply(_, args)); + }; + }); + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; + return result(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + _.each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return result(this, method.apply(this._wrapped, arguments)); + }; + }); + + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxy for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + + _.prototype.toString = function() { + return '' + this._wrapped; + }; + + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (typeof define === 'function' && define.amd) { + define('underscore', [], function() { + return _; + }); + } +}.call(this)); + +},{}],26:[function(require,module,exports){ +arguments[4][19][0].apply(exports,arguments) +},{"dup":19}],27:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],28:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./support/isBuffer":27,"_process":24,"inherits":26}],29:[function(require,module,exports){ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} + +},{}]},{},[7])(7) +}); \ No newline at end of file diff --git a/assets/javascripts/workers/search.ecf98df9.min.js b/assets/javascripts/workers/search.ecf98df9.min.js new file mode 100644 index 00000000..f8c73991 --- /dev/null +++ b/assets/javascripts/workers/search.ecf98df9.min.js @@ -0,0 +1,48 @@ +"use strict";(()=>{var ge=Object.create;var W=Object.defineProperty,ye=Object.defineProperties,me=Object.getOwnPropertyDescriptor,ve=Object.getOwnPropertyDescriptors,xe=Object.getOwnPropertyNames,G=Object.getOwnPropertySymbols,Se=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty,Qe=Object.prototype.propertyIsEnumerable;var J=(t,e,r)=>e in t?W(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,M=(t,e)=>{for(var r in e||(e={}))X.call(e,r)&&J(t,r,e[r]);if(G)for(var r of G(e))Qe.call(e,r)&&J(t,r,e[r]);return t},Z=(t,e)=>ye(t,ve(e));var K=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var be=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of xe(e))!X.call(t,i)&&i!==r&&W(t,i,{get:()=>e[i],enumerable:!(n=me(e,i))||n.enumerable});return t};var H=(t,e,r)=>(r=t!=null?ge(Se(t)):{},be(e||!t||!t.__esModule?W(r,"default",{value:t,enumerable:!0}):r,t));var z=(t,e,r)=>new Promise((n,i)=>{var s=u=>{try{a(r.next(u))}catch(c){i(c)}},o=u=>{try{a(r.throw(u))}catch(c){i(c)}},a=u=>u.done?n(u.value):Promise.resolve(u.value).then(s,o);a((r=r.apply(t,e)).next())});var re=K((ee,te)=>{/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */(function(){var t=function(e){var r=new t.Builder;return r.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),r.searchPipeline.add(t.stemmer),e.call(r,r),r.build()};t.version="2.3.9";/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */t.utils={},t.utils.warn=function(e){return function(r){e.console&&console.warn&&console.warn(r)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var r=Object.create(null),n=Object.keys(e),i=0;i0){var h=t.utils.clone(r)||{};h.position=[a,c],h.index=s.length,s.push(new t.Token(n.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,r){r in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+r),e.label=r,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var r=e.label&&e.label in this.registeredFunctions;r||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var r=new t.Pipeline;return e.forEach(function(n){var i=t.Pipeline.registeredFunctions[n];if(i)r.add(i);else throw new Error("Cannot load unregistered function: "+n)}),r},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(r){t.Pipeline.warnIfFunctionNotRegistered(r),this._stack.push(r)},this)},t.Pipeline.prototype.after=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");n=n+1,this._stack.splice(n,0,r)},t.Pipeline.prototype.before=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");this._stack.splice(n,0,r)},t.Pipeline.prototype.remove=function(e){var r=this._stack.indexOf(e);r!=-1&&this._stack.splice(r,1)},t.Pipeline.prototype.run=function(e){for(var r=this._stack.length,n=0;n1&&(oe&&(n=s),o!=e);)i=n-r,s=r+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ou?h+=2:a==u&&(r+=n[c+1]*i[h+1],c+=2,h+=2);return r},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),r=1,n=0;r0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}if(s.str.length==0&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}s.str.length==1&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),y=s.str.charAt(1),g;y in s.node.edges?g=s.node.edges[y]:(g=new t.TokenSet,s.node.edges[y]=g),s.str.length==1&&(g.final=!0),i.push({node:g,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return n},t.TokenSet.fromString=function(e){for(var r=new t.TokenSet,n=r,i=0,s=e.length;i=e;r--){var n=this.uncheckedNodes[r],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}};/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(r){var n=new t.QueryParser(e,r);n.parse()})},t.Index.prototype.query=function(e){for(var r=new t.Query(this.fields),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,r){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,r;do e=this.next(),r=e.charCodeAt(0);while(r>47&&r<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var r=e.next();if(r==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(r.charCodeAt(0)==92){e.escapeCharacter();continue}if(r==":")return t.QueryLexer.lexField;if(r=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(r=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(r=="+"&&e.width()===1||r=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(r.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,r){this.lexer=new t.QueryLexer(e),this.query=r,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var r=e.peekLexeme();if(r!=null)switch(r.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(n+=" with value '"+r.str+"'"),new t.QueryParseError(n,r.start,r.end)}},t.QueryParser.parsePresence=function(e){var r=e.consumeLexeme();if(r!=null){switch(r.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+r.str+"'";throw new t.QueryParseError(n,r.start,r.end)}var i=e.peekLexeme();if(i==null){var n="expecting term or field, found nothing";throw new t.QueryParseError(n,r.start,r.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(n,i.start,i.end)}}},t.QueryParser.parseField=function(e){var r=e.consumeLexeme();if(r!=null){if(e.query.allFields.indexOf(r.str)==-1){var n=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+r.str+"', possible fields: "+n;throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.fields=[r.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,r.start,r.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var r=e.consumeLexeme();if(r!=null){e.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(n==null){e.nextClause();return}switch(n.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new t.QueryParseError(i,n.start,n.end)}}},t.QueryParser.parseEditDistance=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.editDistance=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="boost must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.boost=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,r){typeof define=="function"&&define.amd?define(r):typeof ee=="object"?te.exports=r():e.lunr=r()}(this,function(){return t})})()});var q=K((Re,ne)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var Le=/["'&<>]/;ne.exports=we;function we(t){var e=""+t,r=Le.exec(e);if(!r)return e;var n,i="",s=0,o=0;for(s=r.index;s=0;r--){let n=t[r];typeof n!="object"?n=document.createTextNode(n):n.parentNode&&n.parentNode.removeChild(n),r?e.insertBefore(this.previousSibling,n):e.replaceChild(n,this)}}}));var ie=H(q());function se(t){let e=new Map,r=new Set;for(let n of t){let[i,s]=n.location.split("#"),o=n.location,a=n.title,u=n.tags,c=(0,ie.default)(n.text).replace(/\s+(?=[,.:;!?])/g,"").replace(/\s+/g," ");if(s){let h=e.get(i);r.has(h)?e.set(o,{location:o,title:a,text:c,parent:h}):(h.title=n.title,h.text=c,r.add(h))}else e.set(o,M({location:o,title:a,text:c},u&&{tags:u}))}return e}var oe=H(q());function ae(t,e){let r=new RegExp(t.separator,"img"),n=(i,s,o)=>`${s}${o}`;return i=>{i=i.replace(/[\s*+\-:~^]+/g," ").trim();let s=new RegExp(`(^|${t.separator})(${i.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return o=>(e?(0,oe.default)(o):o).replace(s,n).replace(/<\/mark>(\s+)]*>/img,"$1")}}function ue(t){let e=new lunr.Query(["title","text"]);return new lunr.QueryParser(t,e).parse(),e.clauses}function ce(t,e){var i;let r=new Set(t),n={};for(let s=0;s!n.has(i)))]}var U=class{constructor({config:e,docs:r,options:n}){this.options=n,this.documents=se(r),this.highlight=ae(e,!1),lunr.tokenizer.separator=new RegExp(e.separator),this.index=lunr(function(){e.lang.length===1&&e.lang[0]!=="en"?this.use(lunr[e.lang[0]]):e.lang.length>1&&this.use(lunr.multiLanguage(...e.lang));let i=Ee(["trimmer","stopWordFilter","stemmer"],n.pipeline);for(let s of e.lang.map(o=>o==="en"?lunr:lunr[o]))for(let o of i)this.pipeline.remove(s[o]),this.searchPipeline.remove(s[o]);this.ref("location"),this.field("title",{boost:1e3}),this.field("text"),this.field("tags",{boost:1e6,extractor:s=>{let{tags:o=[]}=s;return o.reduce((a,u)=>[...a,...lunr.tokenizer(u)],[])}});for(let s of r)this.add(s,{boost:s.boost})})}search(e){if(e)try{let r=this.highlight(e),n=ue(e).filter(o=>o.presence!==lunr.Query.presence.PROHIBITED),i=this.index.search(`${e}*`).reduce((o,{ref:a,score:u,matchData:c})=>{let h=this.documents.get(a);if(typeof h!="undefined"){let{location:y,title:g,text:b,tags:m,parent:Q}=h,p=ce(n,Object.keys(c.metadata)),d=+!Q+ +Object.values(p).every(w=>w);o.push(Z(M({location:y,title:r(g),text:r(b)},m&&{tags:m.map(r)}),{score:u*(1+d),terms:p}))}return o},[]).sort((o,a)=>a.score-o.score).reduce((o,a)=>{let u=this.documents.get(a.location);if(typeof u!="undefined"){let c="parent"in u?u.parent.location:u.location;o.set(c,[...o.get(c)||[],a])}return o},new Map),s;if(this.options.suggestions){let o=this.index.query(a=>{for(let u of n)a.term(u.term,{fields:["title"],presence:lunr.Query.presence.REQUIRED,wildcard:lunr.Query.wildcard.TRAILING})});s=o.length?Object.keys(o[0].matchData.metadata):[]}return M({items:[...i.values()]},typeof s!="undefined"&&{suggestions:s})}catch(r){console.warn(`Invalid query: ${e} \u2013 see https://bit.ly/2s3ChXG`)}return{items:[]}}};var Y;function ke(t){return z(this,null,function*(){let e="../lunr";if(typeof parent!="undefined"&&"IFrameWorker"in parent){let n=document.querySelector("script[src]"),[i]=n.src.split("/worker");e=e.replace("..",i)}let r=[];for(let n of t.lang){switch(n){case"ja":r.push(`${e}/tinyseg.js`);break;case"hi":case"th":r.push(`${e}/wordcut.js`);break}n!=="en"&&r.push(`${e}/min/lunr.${n}.min.js`)}t.lang.length>1&&r.push(`${e}/min/lunr.multi.min.js`),r.length&&(yield importScripts(`${e}/min/lunr.stemmer.support.min.js`,...r))})}function Te(t){return z(this,null,function*(){switch(t.type){case 0:return yield ke(t.data.config),Y=new U(t.data),{type:1};case 2:return{type:3,data:Y?Y.search(t.data):{items:[]}};default:throw new TypeError("Invalid message type")}})}self.lunr=le.default;addEventListener("message",t=>z(void 0,null,function*(){postMessage(yield Te(t.data))}));})(); +//# sourceMappingURL=search.ecf98df9.min.js.map + diff --git a/assets/javascripts/workers/search.ecf98df9.min.js.map b/assets/javascripts/workers/search.ecf98df9.min.js.map new file mode 100644 index 00000000..eada3e64 --- /dev/null +++ b/assets/javascripts/workers/search.ecf98df9.min.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["node_modules/lunr/lunr.js", "node_modules/escape-html/index.js", "src/assets/javascripts/integrations/search/worker/main/index.ts", "src/assets/javascripts/polyfills/index.ts", "src/assets/javascripts/integrations/search/document/index.ts", "src/assets/javascripts/integrations/search/highlighter/index.ts", "src/assets/javascripts/integrations/search/query/_/index.ts", "src/assets/javascripts/integrations/search/_/index.ts"], + "sourceRoot": "../../../..", + "sourcesContent": ["/**\n * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9\n * Copyright (C) 2020 Oliver Nightingale\n * @license MIT\n */\n\n;(function(){\n\n/**\n * A convenience function for configuring and constructing\n * a new lunr Index.\n *\n * A lunr.Builder instance is created and the pipeline setup\n * with a trimmer, stop word filter and stemmer.\n *\n * This builder object is yielded to the configuration function\n * that is passed as a parameter, allowing the list of fields\n * and other builder parameters to be customised.\n *\n * All documents _must_ be added within the passed config function.\n *\n * @example\n * var idx = lunr(function () {\n * this.field('title')\n * this.field('body')\n * this.ref('id')\n *\n * documents.forEach(function (doc) {\n * this.add(doc)\n * }, this)\n * })\n *\n * @see {@link lunr.Builder}\n * @see {@link lunr.Pipeline}\n * @see {@link lunr.trimmer}\n * @see {@link lunr.stopWordFilter}\n * @see {@link lunr.stemmer}\n * @namespace {function} lunr\n */\nvar lunr = function (config) {\n var builder = new lunr.Builder\n\n builder.pipeline.add(\n lunr.trimmer,\n lunr.stopWordFilter,\n lunr.stemmer\n )\n\n builder.searchPipeline.add(\n lunr.stemmer\n )\n\n config.call(builder, builder)\n return builder.build()\n}\n\nlunr.version = \"2.3.9\"\n/*!\n * lunr.utils\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A namespace containing utils for the rest of the lunr library\n * @namespace lunr.utils\n */\nlunr.utils = {}\n\n/**\n * Print a warning message to the console.\n *\n * @param {String} message The message to be printed.\n * @memberOf lunr.utils\n * @function\n */\nlunr.utils.warn = (function (global) {\n /* eslint-disable no-console */\n return function (message) {\n if (global.console && console.warn) {\n console.warn(message)\n }\n }\n /* eslint-enable no-console */\n})(this)\n\n/**\n * Convert an object to a string.\n *\n * In the case of `null` and `undefined` the function returns\n * the empty string, in all other cases the result of calling\n * `toString` on the passed object is returned.\n *\n * @param {Any} obj The object to convert to a string.\n * @return {String} string representation of the passed object.\n * @memberOf lunr.utils\n */\nlunr.utils.asString = function (obj) {\n if (obj === void 0 || obj === null) {\n return \"\"\n } else {\n return obj.toString()\n }\n}\n\n/**\n * Clones an object.\n *\n * Will create a copy of an existing object such that any mutations\n * on the copy cannot affect the original.\n *\n * Only shallow objects are supported, passing a nested object to this\n * function will cause a TypeError.\n *\n * Objects with primitives, and arrays of primitives are supported.\n *\n * @param {Object} obj The object to clone.\n * @return {Object} a clone of the passed object.\n * @throws {TypeError} when a nested object is passed.\n * @memberOf Utils\n */\nlunr.utils.clone = function (obj) {\n if (obj === null || obj === undefined) {\n return obj\n }\n\n var clone = Object.create(null),\n keys = Object.keys(obj)\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i],\n val = obj[key]\n\n if (Array.isArray(val)) {\n clone[key] = val.slice()\n continue\n }\n\n if (typeof val === 'string' ||\n typeof val === 'number' ||\n typeof val === 'boolean') {\n clone[key] = val\n continue\n }\n\n throw new TypeError(\"clone is not deep and does not support nested objects\")\n }\n\n return clone\n}\nlunr.FieldRef = function (docRef, fieldName, stringValue) {\n this.docRef = docRef\n this.fieldName = fieldName\n this._stringValue = stringValue\n}\n\nlunr.FieldRef.joiner = \"/\"\n\nlunr.FieldRef.fromString = function (s) {\n var n = s.indexOf(lunr.FieldRef.joiner)\n\n if (n === -1) {\n throw \"malformed field ref string\"\n }\n\n var fieldRef = s.slice(0, n),\n docRef = s.slice(n + 1)\n\n return new lunr.FieldRef (docRef, fieldRef, s)\n}\n\nlunr.FieldRef.prototype.toString = function () {\n if (this._stringValue == undefined) {\n this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef\n }\n\n return this._stringValue\n}\n/*!\n * lunr.Set\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A lunr set.\n *\n * @constructor\n */\nlunr.Set = function (elements) {\n this.elements = Object.create(null)\n\n if (elements) {\n this.length = elements.length\n\n for (var i = 0; i < this.length; i++) {\n this.elements[elements[i]] = true\n }\n } else {\n this.length = 0\n }\n}\n\n/**\n * A complete set that contains all elements.\n *\n * @static\n * @readonly\n * @type {lunr.Set}\n */\nlunr.Set.complete = {\n intersect: function (other) {\n return other\n },\n\n union: function () {\n return this\n },\n\n contains: function () {\n return true\n }\n}\n\n/**\n * An empty set that contains no elements.\n *\n * @static\n * @readonly\n * @type {lunr.Set}\n */\nlunr.Set.empty = {\n intersect: function () {\n return this\n },\n\n union: function (other) {\n return other\n },\n\n contains: function () {\n return false\n }\n}\n\n/**\n * Returns true if this set contains the specified object.\n *\n * @param {object} object - Object whose presence in this set is to be tested.\n * @returns {boolean} - True if this set contains the specified object.\n */\nlunr.Set.prototype.contains = function (object) {\n return !!this.elements[object]\n}\n\n/**\n * Returns a new set containing only the elements that are present in both\n * this set and the specified set.\n *\n * @param {lunr.Set} other - set to intersect with this set.\n * @returns {lunr.Set} a new set that is the intersection of this and the specified set.\n */\n\nlunr.Set.prototype.intersect = function (other) {\n var a, b, elements, intersection = []\n\n if (other === lunr.Set.complete) {\n return this\n }\n\n if (other === lunr.Set.empty) {\n return other\n }\n\n if (this.length < other.length) {\n a = this\n b = other\n } else {\n a = other\n b = this\n }\n\n elements = Object.keys(a.elements)\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i]\n if (element in b.elements) {\n intersection.push(element)\n }\n }\n\n return new lunr.Set (intersection)\n}\n\n/**\n * Returns a new set combining the elements of this and the specified set.\n *\n * @param {lunr.Set} other - set to union with this set.\n * @return {lunr.Set} a new set that is the union of this and the specified set.\n */\n\nlunr.Set.prototype.union = function (other) {\n if (other === lunr.Set.complete) {\n return lunr.Set.complete\n }\n\n if (other === lunr.Set.empty) {\n return this\n }\n\n return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements)))\n}\n/**\n * A function to calculate the inverse document frequency for\n * a posting. This is shared between the builder and the index\n *\n * @private\n * @param {object} posting - The posting for a given term\n * @param {number} documentCount - The total number of documents.\n */\nlunr.idf = function (posting, documentCount) {\n var documentsWithTerm = 0\n\n for (var fieldName in posting) {\n if (fieldName == '_index') continue // Ignore the term index, its not a field\n documentsWithTerm += Object.keys(posting[fieldName]).length\n }\n\n var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5)\n\n return Math.log(1 + Math.abs(x))\n}\n\n/**\n * A token wraps a string representation of a token\n * as it is passed through the text processing pipeline.\n *\n * @constructor\n * @param {string} [str=''] - The string token being wrapped.\n * @param {object} [metadata={}] - Metadata associated with this token.\n */\nlunr.Token = function (str, metadata) {\n this.str = str || \"\"\n this.metadata = metadata || {}\n}\n\n/**\n * Returns the token string that is being wrapped by this object.\n *\n * @returns {string}\n */\nlunr.Token.prototype.toString = function () {\n return this.str\n}\n\n/**\n * A token update function is used when updating or optionally\n * when cloning a token.\n *\n * @callback lunr.Token~updateFunction\n * @param {string} str - The string representation of the token.\n * @param {Object} metadata - All metadata associated with this token.\n */\n\n/**\n * Applies the given function to the wrapped string token.\n *\n * @example\n * token.update(function (str, metadata) {\n * return str.toUpperCase()\n * })\n *\n * @param {lunr.Token~updateFunction} fn - A function to apply to the token string.\n * @returns {lunr.Token}\n */\nlunr.Token.prototype.update = function (fn) {\n this.str = fn(this.str, this.metadata)\n return this\n}\n\n/**\n * Creates a clone of this token. Optionally a function can be\n * applied to the cloned token.\n *\n * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token.\n * @returns {lunr.Token}\n */\nlunr.Token.prototype.clone = function (fn) {\n fn = fn || function (s) { return s }\n return new lunr.Token (fn(this.str, this.metadata), this.metadata)\n}\n/*!\n * lunr.tokenizer\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A function for splitting a string into tokens ready to be inserted into\n * the search index. Uses `lunr.tokenizer.separator` to split strings, change\n * the value of this property to change how strings are split into tokens.\n *\n * This tokenizer will convert its parameter to a string by calling `toString` and\n * then will split this string on the character in `lunr.tokenizer.separator`.\n * Arrays will have their elements converted to strings and wrapped in a lunr.Token.\n *\n * Optional metadata can be passed to the tokenizer, this metadata will be cloned and\n * added as metadata to every token that is created from the object to be tokenized.\n *\n * @static\n * @param {?(string|object|object[])} obj - The object to convert into tokens\n * @param {?object} metadata - Optional metadata to associate with every token\n * @returns {lunr.Token[]}\n * @see {@link lunr.Pipeline}\n */\nlunr.tokenizer = function (obj, metadata) {\n if (obj == null || obj == undefined) {\n return []\n }\n\n if (Array.isArray(obj)) {\n return obj.map(function (t) {\n return new lunr.Token(\n lunr.utils.asString(t).toLowerCase(),\n lunr.utils.clone(metadata)\n )\n })\n }\n\n var str = obj.toString().toLowerCase(),\n len = str.length,\n tokens = []\n\n for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) {\n var char = str.charAt(sliceEnd),\n sliceLength = sliceEnd - sliceStart\n\n if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) {\n\n if (sliceLength > 0) {\n var tokenMetadata = lunr.utils.clone(metadata) || {}\n tokenMetadata[\"position\"] = [sliceStart, sliceLength]\n tokenMetadata[\"index\"] = tokens.length\n\n tokens.push(\n new lunr.Token (\n str.slice(sliceStart, sliceEnd),\n tokenMetadata\n )\n )\n }\n\n sliceStart = sliceEnd + 1\n }\n\n }\n\n return tokens\n}\n\n/**\n * The separator used to split a string into tokens. Override this property to change the behaviour of\n * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens.\n *\n * @static\n * @see lunr.tokenizer\n */\nlunr.tokenizer.separator = /[\\s\\-]+/\n/*!\n * lunr.Pipeline\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.Pipelines maintain an ordered list of functions to be applied to all\n * tokens in documents entering the search index and queries being ran against\n * the index.\n *\n * An instance of lunr.Index created with the lunr shortcut will contain a\n * pipeline with a stop word filter and an English language stemmer. Extra\n * functions can be added before or after either of these functions or these\n * default functions can be removed.\n *\n * When run the pipeline will call each function in turn, passing a token, the\n * index of that token in the original list of all tokens and finally a list of\n * all the original tokens.\n *\n * The output of functions in the pipeline will be passed to the next function\n * in the pipeline. To exclude a token from entering the index the function\n * should return undefined, the rest of the pipeline will not be called with\n * this token.\n *\n * For serialisation of pipelines to work, all functions used in an instance of\n * a pipeline should be registered with lunr.Pipeline. Registered functions can\n * then be loaded. If trying to load a serialised pipeline that uses functions\n * that are not registered an error will be thrown.\n *\n * If not planning on serialising the pipeline then registering pipeline functions\n * is not necessary.\n *\n * @constructor\n */\nlunr.Pipeline = function () {\n this._stack = []\n}\n\nlunr.Pipeline.registeredFunctions = Object.create(null)\n\n/**\n * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token\n * string as well as all known metadata. A pipeline function can mutate the token string\n * or mutate (or add) metadata for a given token.\n *\n * A pipeline function can indicate that the passed token should be discarded by returning\n * null, undefined or an empty string. This token will not be passed to any downstream pipeline\n * functions and will not be added to the index.\n *\n * Multiple tokens can be returned by returning an array of tokens. Each token will be passed\n * to any downstream pipeline functions and all will returned tokens will be added to the index.\n *\n * Any number of pipeline functions may be chained together using a lunr.Pipeline.\n *\n * @interface lunr.PipelineFunction\n * @param {lunr.Token} token - A token from the document being processed.\n * @param {number} i - The index of this token in the complete list of tokens for this document/field.\n * @param {lunr.Token[]} tokens - All tokens for this document/field.\n * @returns {(?lunr.Token|lunr.Token[])}\n */\n\n/**\n * Register a function with the pipeline.\n *\n * Functions that are used in the pipeline should be registered if the pipeline\n * needs to be serialised, or a serialised pipeline needs to be loaded.\n *\n * Registering a function does not add it to a pipeline, functions must still be\n * added to instances of the pipeline for them to be used when running a pipeline.\n *\n * @param {lunr.PipelineFunction} fn - The function to check for.\n * @param {String} label - The label to register this function with\n */\nlunr.Pipeline.registerFunction = function (fn, label) {\n if (label in this.registeredFunctions) {\n lunr.utils.warn('Overwriting existing registered function: ' + label)\n }\n\n fn.label = label\n lunr.Pipeline.registeredFunctions[fn.label] = fn\n}\n\n/**\n * Warns if the function is not registered as a Pipeline function.\n *\n * @param {lunr.PipelineFunction} fn - The function to check for.\n * @private\n */\nlunr.Pipeline.warnIfFunctionNotRegistered = function (fn) {\n var isRegistered = fn.label && (fn.label in this.registeredFunctions)\n\n if (!isRegistered) {\n lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\\n', fn)\n }\n}\n\n/**\n * Loads a previously serialised pipeline.\n *\n * All functions to be loaded must already be registered with lunr.Pipeline.\n * If any function from the serialised data has not been registered then an\n * error will be thrown.\n *\n * @param {Object} serialised - The serialised pipeline to load.\n * @returns {lunr.Pipeline}\n */\nlunr.Pipeline.load = function (serialised) {\n var pipeline = new lunr.Pipeline\n\n serialised.forEach(function (fnName) {\n var fn = lunr.Pipeline.registeredFunctions[fnName]\n\n if (fn) {\n pipeline.add(fn)\n } else {\n throw new Error('Cannot load unregistered function: ' + fnName)\n }\n })\n\n return pipeline\n}\n\n/**\n * Adds new functions to the end of the pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline.\n */\nlunr.Pipeline.prototype.add = function () {\n var fns = Array.prototype.slice.call(arguments)\n\n fns.forEach(function (fn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(fn)\n this._stack.push(fn)\n }, this)\n}\n\n/**\n * Adds a single function after a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.\n * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.\n */\nlunr.Pipeline.prototype.after = function (existingFn, newFn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(newFn)\n\n var pos = this._stack.indexOf(existingFn)\n if (pos == -1) {\n throw new Error('Cannot find existingFn')\n }\n\n pos = pos + 1\n this._stack.splice(pos, 0, newFn)\n}\n\n/**\n * Adds a single function before a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.\n * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.\n */\nlunr.Pipeline.prototype.before = function (existingFn, newFn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(newFn)\n\n var pos = this._stack.indexOf(existingFn)\n if (pos == -1) {\n throw new Error('Cannot find existingFn')\n }\n\n this._stack.splice(pos, 0, newFn)\n}\n\n/**\n * Removes a function from the pipeline.\n *\n * @param {lunr.PipelineFunction} fn The function to remove from the pipeline.\n */\nlunr.Pipeline.prototype.remove = function (fn) {\n var pos = this._stack.indexOf(fn)\n if (pos == -1) {\n return\n }\n\n this._stack.splice(pos, 1)\n}\n\n/**\n * Runs the current list of functions that make up the pipeline against the\n * passed tokens.\n *\n * @param {Array} tokens The tokens to run through the pipeline.\n * @returns {Array}\n */\nlunr.Pipeline.prototype.run = function (tokens) {\n var stackLength = this._stack.length\n\n for (var i = 0; i < stackLength; i++) {\n var fn = this._stack[i]\n var memo = []\n\n for (var j = 0; j < tokens.length; j++) {\n var result = fn(tokens[j], j, tokens)\n\n if (result === null || result === void 0 || result === '') continue\n\n if (Array.isArray(result)) {\n for (var k = 0; k < result.length; k++) {\n memo.push(result[k])\n }\n } else {\n memo.push(result)\n }\n }\n\n tokens = memo\n }\n\n return tokens\n}\n\n/**\n * Convenience method for passing a string through a pipeline and getting\n * strings out. This method takes care of wrapping the passed string in a\n * token and mapping the resulting tokens back to strings.\n *\n * @param {string} str - The string to pass through the pipeline.\n * @param {?object} metadata - Optional metadata to associate with the token\n * passed to the pipeline.\n * @returns {string[]}\n */\nlunr.Pipeline.prototype.runString = function (str, metadata) {\n var token = new lunr.Token (str, metadata)\n\n return this.run([token]).map(function (t) {\n return t.toString()\n })\n}\n\n/**\n * Resets the pipeline by removing any existing processors.\n *\n */\nlunr.Pipeline.prototype.reset = function () {\n this._stack = []\n}\n\n/**\n * Returns a representation of the pipeline ready for serialisation.\n *\n * Logs a warning if the function has not been registered.\n *\n * @returns {Array}\n */\nlunr.Pipeline.prototype.toJSON = function () {\n return this._stack.map(function (fn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(fn)\n\n return fn.label\n })\n}\n/*!\n * lunr.Vector\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A vector is used to construct the vector space of documents and queries. These\n * vectors support operations to determine the similarity between two documents or\n * a document and a query.\n *\n * Normally no parameters are required for initializing a vector, but in the case of\n * loading a previously dumped vector the raw elements can be provided to the constructor.\n *\n * For performance reasons vectors are implemented with a flat array, where an elements\n * index is immediately followed by its value. E.g. [index, value, index, value]. This\n * allows the underlying array to be as sparse as possible and still offer decent\n * performance when being used for vector calculations.\n *\n * @constructor\n * @param {Number[]} [elements] - The flat list of element index and element value pairs.\n */\nlunr.Vector = function (elements) {\n this._magnitude = 0\n this.elements = elements || []\n}\n\n\n/**\n * Calculates the position within the vector to insert a given index.\n *\n * This is used internally by insert and upsert. If there are duplicate indexes then\n * the position is returned as if the value for that index were to be updated, but it\n * is the callers responsibility to check whether there is a duplicate at that index\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @returns {Number}\n */\nlunr.Vector.prototype.positionForIndex = function (index) {\n // For an empty vector the tuple can be inserted at the beginning\n if (this.elements.length == 0) {\n return 0\n }\n\n var start = 0,\n end = this.elements.length / 2,\n sliceLength = end - start,\n pivotPoint = Math.floor(sliceLength / 2),\n pivotIndex = this.elements[pivotPoint * 2]\n\n while (sliceLength > 1) {\n if (pivotIndex < index) {\n start = pivotPoint\n }\n\n if (pivotIndex > index) {\n end = pivotPoint\n }\n\n if (pivotIndex == index) {\n break\n }\n\n sliceLength = end - start\n pivotPoint = start + Math.floor(sliceLength / 2)\n pivotIndex = this.elements[pivotPoint * 2]\n }\n\n if (pivotIndex == index) {\n return pivotPoint * 2\n }\n\n if (pivotIndex > index) {\n return pivotPoint * 2\n }\n\n if (pivotIndex < index) {\n return (pivotPoint + 1) * 2\n }\n}\n\n/**\n * Inserts an element at an index within the vector.\n *\n * Does not allow duplicates, will throw an error if there is already an entry\n * for this index.\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @param {Number} val - The value to be inserted into the vector.\n */\nlunr.Vector.prototype.insert = function (insertIdx, val) {\n this.upsert(insertIdx, val, function () {\n throw \"duplicate index\"\n })\n}\n\n/**\n * Inserts or updates an existing index within the vector.\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @param {Number} val - The value to be inserted into the vector.\n * @param {function} fn - A function that is called for updates, the existing value and the\n * requested value are passed as arguments\n */\nlunr.Vector.prototype.upsert = function (insertIdx, val, fn) {\n this._magnitude = 0\n var position = this.positionForIndex(insertIdx)\n\n if (this.elements[position] == insertIdx) {\n this.elements[position + 1] = fn(this.elements[position + 1], val)\n } else {\n this.elements.splice(position, 0, insertIdx, val)\n }\n}\n\n/**\n * Calculates the magnitude of this vector.\n *\n * @returns {Number}\n */\nlunr.Vector.prototype.magnitude = function () {\n if (this._magnitude) return this._magnitude\n\n var sumOfSquares = 0,\n elementsLength = this.elements.length\n\n for (var i = 1; i < elementsLength; i += 2) {\n var val = this.elements[i]\n sumOfSquares += val * val\n }\n\n return this._magnitude = Math.sqrt(sumOfSquares)\n}\n\n/**\n * Calculates the dot product of this vector and another vector.\n *\n * @param {lunr.Vector} otherVector - The vector to compute the dot product with.\n * @returns {Number}\n */\nlunr.Vector.prototype.dot = function (otherVector) {\n var dotProduct = 0,\n a = this.elements, b = otherVector.elements,\n aLen = a.length, bLen = b.length,\n aVal = 0, bVal = 0,\n i = 0, j = 0\n\n while (i < aLen && j < bLen) {\n aVal = a[i], bVal = b[j]\n if (aVal < bVal) {\n i += 2\n } else if (aVal > bVal) {\n j += 2\n } else if (aVal == bVal) {\n dotProduct += a[i + 1] * b[j + 1]\n i += 2\n j += 2\n }\n }\n\n return dotProduct\n}\n\n/**\n * Calculates the similarity between this vector and another vector.\n *\n * @param {lunr.Vector} otherVector - The other vector to calculate the\n * similarity with.\n * @returns {Number}\n */\nlunr.Vector.prototype.similarity = function (otherVector) {\n return this.dot(otherVector) / this.magnitude() || 0\n}\n\n/**\n * Converts the vector to an array of the elements within the vector.\n *\n * @returns {Number[]}\n */\nlunr.Vector.prototype.toArray = function () {\n var output = new Array (this.elements.length / 2)\n\n for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) {\n output[j] = this.elements[i]\n }\n\n return output\n}\n\n/**\n * A JSON serializable representation of the vector.\n *\n * @returns {Number[]}\n */\nlunr.Vector.prototype.toJSON = function () {\n return this.elements\n}\n/* eslint-disable */\n/*!\n * lunr.stemmer\n * Copyright (C) 2020 Oliver Nightingale\n * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt\n */\n\n/**\n * lunr.stemmer is an english language stemmer, this is a JavaScript\n * implementation of the PorterStemmer taken from http://tartarus.org/~martin\n *\n * @static\n * @implements {lunr.PipelineFunction}\n * @param {lunr.Token} token - The string to stem\n * @returns {lunr.Token}\n * @see {@link lunr.Pipeline}\n * @function\n */\nlunr.stemmer = (function(){\n var step2list = {\n \"ational\" : \"ate\",\n \"tional\" : \"tion\",\n \"enci\" : \"ence\",\n \"anci\" : \"ance\",\n \"izer\" : \"ize\",\n \"bli\" : \"ble\",\n \"alli\" : \"al\",\n \"entli\" : \"ent\",\n \"eli\" : \"e\",\n \"ousli\" : \"ous\",\n \"ization\" : \"ize\",\n \"ation\" : \"ate\",\n \"ator\" : \"ate\",\n \"alism\" : \"al\",\n \"iveness\" : \"ive\",\n \"fulness\" : \"ful\",\n \"ousness\" : \"ous\",\n \"aliti\" : \"al\",\n \"iviti\" : \"ive\",\n \"biliti\" : \"ble\",\n \"logi\" : \"log\"\n },\n\n step3list = {\n \"icate\" : \"ic\",\n \"ative\" : \"\",\n \"alize\" : \"al\",\n \"iciti\" : \"ic\",\n \"ical\" : \"ic\",\n \"ful\" : \"\",\n \"ness\" : \"\"\n },\n\n c = \"[^aeiou]\", // consonant\n v = \"[aeiouy]\", // vowel\n C = c + \"[^aeiouy]*\", // consonant sequence\n V = v + \"[aeiou]*\", // vowel sequence\n\n mgr0 = \"^(\" + C + \")?\" + V + C, // [C]VC... is m>0\n meq1 = \"^(\" + C + \")?\" + V + C + \"(\" + V + \")?$\", // [C]VC[V] is m=1\n mgr1 = \"^(\" + C + \")?\" + V + C + V + C, // [C]VCVC... is m>1\n s_v = \"^(\" + C + \")?\" + v; // vowel in stem\n\n var re_mgr0 = new RegExp(mgr0);\n var re_mgr1 = new RegExp(mgr1);\n var re_meq1 = new RegExp(meq1);\n var re_s_v = new RegExp(s_v);\n\n var re_1a = /^(.+?)(ss|i)es$/;\n var re2_1a = /^(.+?)([^s])s$/;\n var re_1b = /^(.+?)eed$/;\n var re2_1b = /^(.+?)(ed|ing)$/;\n var re_1b_2 = /.$/;\n var re2_1b_2 = /(at|bl|iz)$/;\n var re3_1b_2 = new RegExp(\"([^aeiouylsz])\\\\1$\");\n var re4_1b_2 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n\n var re_1c = /^(.+?[^aeiou])y$/;\n var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;\n\n var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;\n\n var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;\n var re2_4 = /^(.+?)(s|t)(ion)$/;\n\n var re_5 = /^(.+?)e$/;\n var re_5_1 = /ll$/;\n var re3_5 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n\n var porterStemmer = function porterStemmer(w) {\n var stem,\n suffix,\n firstch,\n re,\n re2,\n re3,\n re4;\n\n if (w.length < 3) { return w; }\n\n firstch = w.substr(0,1);\n if (firstch == \"y\") {\n w = firstch.toUpperCase() + w.substr(1);\n }\n\n // Step 1a\n re = re_1a\n re2 = re2_1a;\n\n if (re.test(w)) { w = w.replace(re,\"$1$2\"); }\n else if (re2.test(w)) { w = w.replace(re2,\"$1$2\"); }\n\n // Step 1b\n re = re_1b;\n re2 = re2_1b;\n if (re.test(w)) {\n var fp = re.exec(w);\n re = re_mgr0;\n if (re.test(fp[1])) {\n re = re_1b_2;\n w = w.replace(re,\"\");\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1];\n re2 = re_s_v;\n if (re2.test(stem)) {\n w = stem;\n re2 = re2_1b_2;\n re3 = re3_1b_2;\n re4 = re4_1b_2;\n if (re2.test(w)) { w = w + \"e\"; }\n else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,\"\"); }\n else if (re4.test(w)) { w = w + \"e\"; }\n }\n }\n\n // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say)\n re = re_1c;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n w = stem + \"i\";\n }\n\n // Step 2\n re = re_2;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step2list[suffix];\n }\n }\n\n // Step 3\n re = re_3;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step3list[suffix];\n }\n }\n\n // Step 4\n re = re_4;\n re2 = re2_4;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n if (re.test(stem)) {\n w = stem;\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1] + fp[2];\n re2 = re_mgr1;\n if (re2.test(stem)) {\n w = stem;\n }\n }\n\n // Step 5\n re = re_5;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n re2 = re_meq1;\n re3 = re3_5;\n if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) {\n w = stem;\n }\n }\n\n re = re_5_1;\n re2 = re_mgr1;\n if (re.test(w) && re2.test(w)) {\n re = re_1b_2;\n w = w.replace(re,\"\");\n }\n\n // and turn initial Y back to y\n\n if (firstch == \"y\") {\n w = firstch.toLowerCase() + w.substr(1);\n }\n\n return w;\n };\n\n return function (token) {\n return token.update(porterStemmer);\n }\n})();\n\nlunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer')\n/*!\n * lunr.stopWordFilter\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.generateStopWordFilter builds a stopWordFilter function from the provided\n * list of stop words.\n *\n * The built in lunr.stopWordFilter is built using this generator and can be used\n * to generate custom stopWordFilters for applications or non English languages.\n *\n * @function\n * @param {Array} token The token to pass through the filter\n * @returns {lunr.PipelineFunction}\n * @see lunr.Pipeline\n * @see lunr.stopWordFilter\n */\nlunr.generateStopWordFilter = function (stopWords) {\n var words = stopWords.reduce(function (memo, stopWord) {\n memo[stopWord] = stopWord\n return memo\n }, {})\n\n return function (token) {\n if (token && words[token.toString()] !== token.toString()) return token\n }\n}\n\n/**\n * lunr.stopWordFilter is an English language stop word list filter, any words\n * contained in the list will not be passed through the filter.\n *\n * This is intended to be used in the Pipeline. If the token does not pass the\n * filter then undefined will be returned.\n *\n * @function\n * @implements {lunr.PipelineFunction}\n * @params {lunr.Token} token - A token to check for being a stop word.\n * @returns {lunr.Token}\n * @see {@link lunr.Pipeline}\n */\nlunr.stopWordFilter = lunr.generateStopWordFilter([\n 'a',\n 'able',\n 'about',\n 'across',\n 'after',\n 'all',\n 'almost',\n 'also',\n 'am',\n 'among',\n 'an',\n 'and',\n 'any',\n 'are',\n 'as',\n 'at',\n 'be',\n 'because',\n 'been',\n 'but',\n 'by',\n 'can',\n 'cannot',\n 'could',\n 'dear',\n 'did',\n 'do',\n 'does',\n 'either',\n 'else',\n 'ever',\n 'every',\n 'for',\n 'from',\n 'get',\n 'got',\n 'had',\n 'has',\n 'have',\n 'he',\n 'her',\n 'hers',\n 'him',\n 'his',\n 'how',\n 'however',\n 'i',\n 'if',\n 'in',\n 'into',\n 'is',\n 'it',\n 'its',\n 'just',\n 'least',\n 'let',\n 'like',\n 'likely',\n 'may',\n 'me',\n 'might',\n 'most',\n 'must',\n 'my',\n 'neither',\n 'no',\n 'nor',\n 'not',\n 'of',\n 'off',\n 'often',\n 'on',\n 'only',\n 'or',\n 'other',\n 'our',\n 'own',\n 'rather',\n 'said',\n 'say',\n 'says',\n 'she',\n 'should',\n 'since',\n 'so',\n 'some',\n 'than',\n 'that',\n 'the',\n 'their',\n 'them',\n 'then',\n 'there',\n 'these',\n 'they',\n 'this',\n 'tis',\n 'to',\n 'too',\n 'twas',\n 'us',\n 'wants',\n 'was',\n 'we',\n 'were',\n 'what',\n 'when',\n 'where',\n 'which',\n 'while',\n 'who',\n 'whom',\n 'why',\n 'will',\n 'with',\n 'would',\n 'yet',\n 'you',\n 'your'\n])\n\nlunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter')\n/*!\n * lunr.trimmer\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.trimmer is a pipeline function for trimming non word\n * characters from the beginning and end of tokens before they\n * enter the index.\n *\n * This implementation may not work correctly for non latin\n * characters and should either be removed or adapted for use\n * with languages with non-latin characters.\n *\n * @static\n * @implements {lunr.PipelineFunction}\n * @param {lunr.Token} token The token to pass through the filter\n * @returns {lunr.Token}\n * @see lunr.Pipeline\n */\nlunr.trimmer = function (token) {\n return token.update(function (s) {\n return s.replace(/^\\W+/, '').replace(/\\W+$/, '')\n })\n}\n\nlunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer')\n/*!\n * lunr.TokenSet\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A token set is used to store the unique list of all tokens\n * within an index. Token sets are also used to represent an\n * incoming query to the index, this query token set and index\n * token set are then intersected to find which tokens to look\n * up in the inverted index.\n *\n * A token set can hold multiple tokens, as in the case of the\n * index token set, or it can hold a single token as in the\n * case of a simple query token set.\n *\n * Additionally token sets are used to perform wildcard matching.\n * Leading, contained and trailing wildcards are supported, and\n * from this edit distance matching can also be provided.\n *\n * Token sets are implemented as a minimal finite state automata,\n * where both common prefixes and suffixes are shared between tokens.\n * This helps to reduce the space used for storing the token set.\n *\n * @constructor\n */\nlunr.TokenSet = function () {\n this.final = false\n this.edges = {}\n this.id = lunr.TokenSet._nextId\n lunr.TokenSet._nextId += 1\n}\n\n/**\n * Keeps track of the next, auto increment, identifier to assign\n * to a new tokenSet.\n *\n * TokenSets require a unique identifier to be correctly minimised.\n *\n * @private\n */\nlunr.TokenSet._nextId = 1\n\n/**\n * Creates a TokenSet instance from the given sorted array of words.\n *\n * @param {String[]} arr - A sorted array of strings to create the set from.\n * @returns {lunr.TokenSet}\n * @throws Will throw an error if the input array is not sorted.\n */\nlunr.TokenSet.fromArray = function (arr) {\n var builder = new lunr.TokenSet.Builder\n\n for (var i = 0, len = arr.length; i < len; i++) {\n builder.insert(arr[i])\n }\n\n builder.finish()\n return builder.root\n}\n\n/**\n * Creates a token set from a query clause.\n *\n * @private\n * @param {Object} clause - A single clause from lunr.Query.\n * @param {string} clause.term - The query clause term.\n * @param {number} [clause.editDistance] - The optional edit distance for the term.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.fromClause = function (clause) {\n if ('editDistance' in clause) {\n return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance)\n } else {\n return lunr.TokenSet.fromString(clause.term)\n }\n}\n\n/**\n * Creates a token set representing a single string with a specified\n * edit distance.\n *\n * Insertions, deletions, substitutions and transpositions are each\n * treated as an edit distance of 1.\n *\n * Increasing the allowed edit distance will have a dramatic impact\n * on the performance of both creating and intersecting these TokenSets.\n * It is advised to keep the edit distance less than 3.\n *\n * @param {string} str - The string to create the token set from.\n * @param {number} editDistance - The allowed edit distance to match.\n * @returns {lunr.Vector}\n */\nlunr.TokenSet.fromFuzzyString = function (str, editDistance) {\n var root = new lunr.TokenSet\n\n var stack = [{\n node: root,\n editsRemaining: editDistance,\n str: str\n }]\n\n while (stack.length) {\n var frame = stack.pop()\n\n // no edit\n if (frame.str.length > 0) {\n var char = frame.str.charAt(0),\n noEditNode\n\n if (char in frame.node.edges) {\n noEditNode = frame.node.edges[char]\n } else {\n noEditNode = new lunr.TokenSet\n frame.node.edges[char] = noEditNode\n }\n\n if (frame.str.length == 1) {\n noEditNode.final = true\n }\n\n stack.push({\n node: noEditNode,\n editsRemaining: frame.editsRemaining,\n str: frame.str.slice(1)\n })\n }\n\n if (frame.editsRemaining == 0) {\n continue\n }\n\n // insertion\n if (\"*\" in frame.node.edges) {\n var insertionNode = frame.node.edges[\"*\"]\n } else {\n var insertionNode = new lunr.TokenSet\n frame.node.edges[\"*\"] = insertionNode\n }\n\n if (frame.str.length == 0) {\n insertionNode.final = true\n }\n\n stack.push({\n node: insertionNode,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str\n })\n\n // deletion\n // can only do a deletion if we have enough edits remaining\n // and if there are characters left to delete in the string\n if (frame.str.length > 1) {\n stack.push({\n node: frame.node,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str.slice(1)\n })\n }\n\n // deletion\n // just removing the last character from the str\n if (frame.str.length == 1) {\n frame.node.final = true\n }\n\n // substitution\n // can only do a substitution if we have enough edits remaining\n // and if there are characters left to substitute\n if (frame.str.length >= 1) {\n if (\"*\" in frame.node.edges) {\n var substitutionNode = frame.node.edges[\"*\"]\n } else {\n var substitutionNode = new lunr.TokenSet\n frame.node.edges[\"*\"] = substitutionNode\n }\n\n if (frame.str.length == 1) {\n substitutionNode.final = true\n }\n\n stack.push({\n node: substitutionNode,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str.slice(1)\n })\n }\n\n // transposition\n // can only do a transposition if there are edits remaining\n // and there are enough characters to transpose\n if (frame.str.length > 1) {\n var charA = frame.str.charAt(0),\n charB = frame.str.charAt(1),\n transposeNode\n\n if (charB in frame.node.edges) {\n transposeNode = frame.node.edges[charB]\n } else {\n transposeNode = new lunr.TokenSet\n frame.node.edges[charB] = transposeNode\n }\n\n if (frame.str.length == 1) {\n transposeNode.final = true\n }\n\n stack.push({\n node: transposeNode,\n editsRemaining: frame.editsRemaining - 1,\n str: charA + frame.str.slice(2)\n })\n }\n }\n\n return root\n}\n\n/**\n * Creates a TokenSet from a string.\n *\n * The string may contain one or more wildcard characters (*)\n * that will allow wildcard matching when intersecting with\n * another TokenSet.\n *\n * @param {string} str - The string to create a TokenSet from.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.fromString = function (str) {\n var node = new lunr.TokenSet,\n root = node\n\n /*\n * Iterates through all characters within the passed string\n * appending a node for each character.\n *\n * When a wildcard character is found then a self\n * referencing edge is introduced to continually match\n * any number of any characters.\n */\n for (var i = 0, len = str.length; i < len; i++) {\n var char = str[i],\n final = (i == len - 1)\n\n if (char == \"*\") {\n node.edges[char] = node\n node.final = final\n\n } else {\n var next = new lunr.TokenSet\n next.final = final\n\n node.edges[char] = next\n node = next\n }\n }\n\n return root\n}\n\n/**\n * Converts this TokenSet into an array of strings\n * contained within the TokenSet.\n *\n * This is not intended to be used on a TokenSet that\n * contains wildcards, in these cases the results are\n * undefined and are likely to cause an infinite loop.\n *\n * @returns {string[]}\n */\nlunr.TokenSet.prototype.toArray = function () {\n var words = []\n\n var stack = [{\n prefix: \"\",\n node: this\n }]\n\n while (stack.length) {\n var frame = stack.pop(),\n edges = Object.keys(frame.node.edges),\n len = edges.length\n\n if (frame.node.final) {\n /* In Safari, at this point the prefix is sometimes corrupted, see:\n * https://github.com/olivernn/lunr.js/issues/279 Calling any\n * String.prototype method forces Safari to \"cast\" this string to what\n * it's supposed to be, fixing the bug. */\n frame.prefix.charAt(0)\n words.push(frame.prefix)\n }\n\n for (var i = 0; i < len; i++) {\n var edge = edges[i]\n\n stack.push({\n prefix: frame.prefix.concat(edge),\n node: frame.node.edges[edge]\n })\n }\n }\n\n return words\n}\n\n/**\n * Generates a string representation of a TokenSet.\n *\n * This is intended to allow TokenSets to be used as keys\n * in objects, largely to aid the construction and minimisation\n * of a TokenSet. As such it is not designed to be a human\n * friendly representation of the TokenSet.\n *\n * @returns {string}\n */\nlunr.TokenSet.prototype.toString = function () {\n // NOTE: Using Object.keys here as this.edges is very likely\n // to enter 'hash-mode' with many keys being added\n //\n // avoiding a for-in loop here as it leads to the function\n // being de-optimised (at least in V8). From some simple\n // benchmarks the performance is comparable, but allowing\n // V8 to optimize may mean easy performance wins in the future.\n\n if (this._str) {\n return this._str\n }\n\n var str = this.final ? '1' : '0',\n labels = Object.keys(this.edges).sort(),\n len = labels.length\n\n for (var i = 0; i < len; i++) {\n var label = labels[i],\n node = this.edges[label]\n\n str = str + label + node.id\n }\n\n return str\n}\n\n/**\n * Returns a new TokenSet that is the intersection of\n * this TokenSet and the passed TokenSet.\n *\n * This intersection will take into account any wildcards\n * contained within the TokenSet.\n *\n * @param {lunr.TokenSet} b - An other TokenSet to intersect with.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.prototype.intersect = function (b) {\n var output = new lunr.TokenSet,\n frame = undefined\n\n var stack = [{\n qNode: b,\n output: output,\n node: this\n }]\n\n while (stack.length) {\n frame = stack.pop()\n\n // NOTE: As with the #toString method, we are using\n // Object.keys and a for loop instead of a for-in loop\n // as both of these objects enter 'hash' mode, causing\n // the function to be de-optimised in V8\n var qEdges = Object.keys(frame.qNode.edges),\n qLen = qEdges.length,\n nEdges = Object.keys(frame.node.edges),\n nLen = nEdges.length\n\n for (var q = 0; q < qLen; q++) {\n var qEdge = qEdges[q]\n\n for (var n = 0; n < nLen; n++) {\n var nEdge = nEdges[n]\n\n if (nEdge == qEdge || qEdge == '*') {\n var node = frame.node.edges[nEdge],\n qNode = frame.qNode.edges[qEdge],\n final = node.final && qNode.final,\n next = undefined\n\n if (nEdge in frame.output.edges) {\n // an edge already exists for this character\n // no need to create a new node, just set the finality\n // bit unless this node is already final\n next = frame.output.edges[nEdge]\n next.final = next.final || final\n\n } else {\n // no edge exists yet, must create one\n // set the finality bit and insert it\n // into the output\n next = new lunr.TokenSet\n next.final = final\n frame.output.edges[nEdge] = next\n }\n\n stack.push({\n qNode: qNode,\n output: next,\n node: node\n })\n }\n }\n }\n }\n\n return output\n}\nlunr.TokenSet.Builder = function () {\n this.previousWord = \"\"\n this.root = new lunr.TokenSet\n this.uncheckedNodes = []\n this.minimizedNodes = {}\n}\n\nlunr.TokenSet.Builder.prototype.insert = function (word) {\n var node,\n commonPrefix = 0\n\n if (word < this.previousWord) {\n throw new Error (\"Out of order word insertion\")\n }\n\n for (var i = 0; i < word.length && i < this.previousWord.length; i++) {\n if (word[i] != this.previousWord[i]) break\n commonPrefix++\n }\n\n this.minimize(commonPrefix)\n\n if (this.uncheckedNodes.length == 0) {\n node = this.root\n } else {\n node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child\n }\n\n for (var i = commonPrefix; i < word.length; i++) {\n var nextNode = new lunr.TokenSet,\n char = word[i]\n\n node.edges[char] = nextNode\n\n this.uncheckedNodes.push({\n parent: node,\n char: char,\n child: nextNode\n })\n\n node = nextNode\n }\n\n node.final = true\n this.previousWord = word\n}\n\nlunr.TokenSet.Builder.prototype.finish = function () {\n this.minimize(0)\n}\n\nlunr.TokenSet.Builder.prototype.minimize = function (downTo) {\n for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) {\n var node = this.uncheckedNodes[i],\n childKey = node.child.toString()\n\n if (childKey in this.minimizedNodes) {\n node.parent.edges[node.char] = this.minimizedNodes[childKey]\n } else {\n // Cache the key for this node since\n // we know it can't change anymore\n node.child._str = childKey\n\n this.minimizedNodes[childKey] = node.child\n }\n\n this.uncheckedNodes.pop()\n }\n}\n/*!\n * lunr.Index\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * An index contains the built index of all documents and provides a query interface\n * to the index.\n *\n * Usually instances of lunr.Index will not be created using this constructor, instead\n * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be\n * used to load previously built and serialized indexes.\n *\n * @constructor\n * @param {Object} attrs - The attributes of the built search index.\n * @param {Object} attrs.invertedIndex - An index of term/field to document reference.\n * @param {Object} attrs.fieldVectors - Field vectors\n * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens.\n * @param {string[]} attrs.fields - The names of indexed document fields.\n * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms.\n */\nlunr.Index = function (attrs) {\n this.invertedIndex = attrs.invertedIndex\n this.fieldVectors = attrs.fieldVectors\n this.tokenSet = attrs.tokenSet\n this.fields = attrs.fields\n this.pipeline = attrs.pipeline\n}\n\n/**\n * A result contains details of a document matching a search query.\n * @typedef {Object} lunr.Index~Result\n * @property {string} ref - The reference of the document this result represents.\n * @property {number} score - A number between 0 and 1 representing how similar this document is to the query.\n * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match.\n */\n\n/**\n * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple\n * query language which itself is parsed into an instance of lunr.Query.\n *\n * For programmatically building queries it is advised to directly use lunr.Query, the query language\n * is best used for human entered text rather than program generated text.\n *\n * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported\n * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello'\n * or 'world', though those that contain both will rank higher in the results.\n *\n * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can\n * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding\n * wildcards will increase the number of documents that will be found but can also have a negative\n * impact on query performance, especially with wildcards at the beginning of a term.\n *\n * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term\n * hello in the title field will match this query. Using a field not present in the index will lead\n * to an error being thrown.\n *\n * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term\n * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported\n * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2.\n * Avoid large values for edit distance to improve query performance.\n *\n * Each term also supports a presence modifier. By default a term's presence in document is optional, however\n * this can be changed to either required or prohibited. For a term's presence to be required in a document the\n * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and\n * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not\n * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'.\n *\n * To escape special characters the backslash character '\\' can be used, this allows searches to include\n * characters that would normally be considered modifiers, e.g. `foo\\~2` will search for a term \"foo~2\" instead\n * of attempting to apply a boost of 2 to the search term \"foo\".\n *\n * @typedef {string} lunr.Index~QueryString\n * @example Simple single term query\n * hello\n * @example Multiple term query\n * hello world\n * @example term scoped to a field\n * title:hello\n * @example term with a boost of 10\n * hello^10\n * @example term with an edit distance of 2\n * hello~2\n * @example terms with presence modifiers\n * -foo +bar baz\n */\n\n/**\n * Performs a search against the index using lunr query syntax.\n *\n * Results will be returned sorted by their score, the most relevant results\n * will be returned first. For details on how the score is calculated, please see\n * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}.\n *\n * For more programmatic querying use lunr.Index#query.\n *\n * @param {lunr.Index~QueryString} queryString - A string containing a lunr query.\n * @throws {lunr.QueryParseError} If the passed query string cannot be parsed.\n * @returns {lunr.Index~Result[]}\n */\nlunr.Index.prototype.search = function (queryString) {\n return this.query(function (query) {\n var parser = new lunr.QueryParser(queryString, query)\n parser.parse()\n })\n}\n\n/**\n * A query builder callback provides a query object to be used to express\n * the query to perform on the index.\n *\n * @callback lunr.Index~queryBuilder\n * @param {lunr.Query} query - The query object to build up.\n * @this lunr.Query\n */\n\n/**\n * Performs a query against the index using the yielded lunr.Query object.\n *\n * If performing programmatic queries against the index, this method is preferred\n * over lunr.Index#search so as to avoid the additional query parsing overhead.\n *\n * A query object is yielded to the supplied function which should be used to\n * express the query to be run against the index.\n *\n * Note that although this function takes a callback parameter it is _not_ an\n * asynchronous operation, the callback is just yielded a query object to be\n * customized.\n *\n * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query.\n * @returns {lunr.Index~Result[]}\n */\nlunr.Index.prototype.query = function (fn) {\n // for each query clause\n // * process terms\n // * expand terms from token set\n // * find matching documents and metadata\n // * get document vectors\n // * score documents\n\n var query = new lunr.Query(this.fields),\n matchingFields = Object.create(null),\n queryVectors = Object.create(null),\n termFieldCache = Object.create(null),\n requiredMatches = Object.create(null),\n prohibitedMatches = Object.create(null)\n\n /*\n * To support field level boosts a query vector is created per\n * field. An empty vector is eagerly created to support negated\n * queries.\n */\n for (var i = 0; i < this.fields.length; i++) {\n queryVectors[this.fields[i]] = new lunr.Vector\n }\n\n fn.call(query, query)\n\n for (var i = 0; i < query.clauses.length; i++) {\n /*\n * Unless the pipeline has been disabled for this term, which is\n * the case for terms with wildcards, we need to pass the clause\n * term through the search pipeline. A pipeline returns an array\n * of processed terms. Pipeline functions may expand the passed\n * term, which means we may end up performing multiple index lookups\n * for a single query term.\n */\n var clause = query.clauses[i],\n terms = null,\n clauseMatches = lunr.Set.empty\n\n if (clause.usePipeline) {\n terms = this.pipeline.runString(clause.term, {\n fields: clause.fields\n })\n } else {\n terms = [clause.term]\n }\n\n for (var m = 0; m < terms.length; m++) {\n var term = terms[m]\n\n /*\n * Each term returned from the pipeline needs to use the same query\n * clause object, e.g. the same boost and or edit distance. The\n * simplest way to do this is to re-use the clause object but mutate\n * its term property.\n */\n clause.term = term\n\n /*\n * From the term in the clause we create a token set which will then\n * be used to intersect the indexes token set to get a list of terms\n * to lookup in the inverted index\n */\n var termTokenSet = lunr.TokenSet.fromClause(clause),\n expandedTerms = this.tokenSet.intersect(termTokenSet).toArray()\n\n /*\n * If a term marked as required does not exist in the tokenSet it is\n * impossible for the search to return any matches. We set all the field\n * scoped required matches set to empty and stop examining any further\n * clauses.\n */\n if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) {\n for (var k = 0; k < clause.fields.length; k++) {\n var field = clause.fields[k]\n requiredMatches[field] = lunr.Set.empty\n }\n\n break\n }\n\n for (var j = 0; j < expandedTerms.length; j++) {\n /*\n * For each term get the posting and termIndex, this is required for\n * building the query vector.\n */\n var expandedTerm = expandedTerms[j],\n posting = this.invertedIndex[expandedTerm],\n termIndex = posting._index\n\n for (var k = 0; k < clause.fields.length; k++) {\n /*\n * For each field that this query term is scoped by (by default\n * all fields are in scope) we need to get all the document refs\n * that have this term in that field.\n *\n * The posting is the entry in the invertedIndex for the matching\n * term from above.\n */\n var field = clause.fields[k],\n fieldPosting = posting[field],\n matchingDocumentRefs = Object.keys(fieldPosting),\n termField = expandedTerm + \"/\" + field,\n matchingDocumentsSet = new lunr.Set(matchingDocumentRefs)\n\n /*\n * if the presence of this term is required ensure that the matching\n * documents are added to the set of required matches for this clause.\n *\n */\n if (clause.presence == lunr.Query.presence.REQUIRED) {\n clauseMatches = clauseMatches.union(matchingDocumentsSet)\n\n if (requiredMatches[field] === undefined) {\n requiredMatches[field] = lunr.Set.complete\n }\n }\n\n /*\n * if the presence of this term is prohibited ensure that the matching\n * documents are added to the set of prohibited matches for this field,\n * creating that set if it does not yet exist.\n */\n if (clause.presence == lunr.Query.presence.PROHIBITED) {\n if (prohibitedMatches[field] === undefined) {\n prohibitedMatches[field] = lunr.Set.empty\n }\n\n prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet)\n\n /*\n * Prohibited matches should not be part of the query vector used for\n * similarity scoring and no metadata should be extracted so we continue\n * to the next field\n */\n continue\n }\n\n /*\n * The query field vector is populated using the termIndex found for\n * the term and a unit value with the appropriate boost applied.\n * Using upsert because there could already be an entry in the vector\n * for the term we are working with. In that case we just add the scores\n * together.\n */\n queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b })\n\n /**\n * If we've already seen this term, field combo then we've already collected\n * the matching documents and metadata, no need to go through all that again\n */\n if (termFieldCache[termField]) {\n continue\n }\n\n for (var l = 0; l < matchingDocumentRefs.length; l++) {\n /*\n * All metadata for this term/field/document triple\n * are then extracted and collected into an instance\n * of lunr.MatchData ready to be returned in the query\n * results\n */\n var matchingDocumentRef = matchingDocumentRefs[l],\n matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field),\n metadata = fieldPosting[matchingDocumentRef],\n fieldMatch\n\n if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) {\n matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata)\n } else {\n fieldMatch.add(expandedTerm, field, metadata)\n }\n\n }\n\n termFieldCache[termField] = true\n }\n }\n }\n\n /**\n * If the presence was required we need to update the requiredMatches field sets.\n * We do this after all fields for the term have collected their matches because\n * the clause terms presence is required in _any_ of the fields not _all_ of the\n * fields.\n */\n if (clause.presence === lunr.Query.presence.REQUIRED) {\n for (var k = 0; k < clause.fields.length; k++) {\n var field = clause.fields[k]\n requiredMatches[field] = requiredMatches[field].intersect(clauseMatches)\n }\n }\n }\n\n /**\n * Need to combine the field scoped required and prohibited\n * matching documents into a global set of required and prohibited\n * matches\n */\n var allRequiredMatches = lunr.Set.complete,\n allProhibitedMatches = lunr.Set.empty\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i]\n\n if (requiredMatches[field]) {\n allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field])\n }\n\n if (prohibitedMatches[field]) {\n allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field])\n }\n }\n\n var matchingFieldRefs = Object.keys(matchingFields),\n results = [],\n matches = Object.create(null)\n\n /*\n * If the query is negated (contains only prohibited terms)\n * we need to get _all_ fieldRefs currently existing in the\n * index. This is only done when we know that the query is\n * entirely prohibited terms to avoid any cost of getting all\n * fieldRefs unnecessarily.\n *\n * Additionally, blank MatchData must be created to correctly\n * populate the results.\n */\n if (query.isNegated()) {\n matchingFieldRefs = Object.keys(this.fieldVectors)\n\n for (var i = 0; i < matchingFieldRefs.length; i++) {\n var matchingFieldRef = matchingFieldRefs[i]\n var fieldRef = lunr.FieldRef.fromString(matchingFieldRef)\n matchingFields[matchingFieldRef] = new lunr.MatchData\n }\n }\n\n for (var i = 0; i < matchingFieldRefs.length; i++) {\n /*\n * Currently we have document fields that match the query, but we\n * need to return documents. The matchData and scores are combined\n * from multiple fields belonging to the same document.\n *\n * Scores are calculated by field, using the query vectors created\n * above, and combined into a final document score using addition.\n */\n var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]),\n docRef = fieldRef.docRef\n\n if (!allRequiredMatches.contains(docRef)) {\n continue\n }\n\n if (allProhibitedMatches.contains(docRef)) {\n continue\n }\n\n var fieldVector = this.fieldVectors[fieldRef],\n score = queryVectors[fieldRef.fieldName].similarity(fieldVector),\n docMatch\n\n if ((docMatch = matches[docRef]) !== undefined) {\n docMatch.score += score\n docMatch.matchData.combine(matchingFields[fieldRef])\n } else {\n var match = {\n ref: docRef,\n score: score,\n matchData: matchingFields[fieldRef]\n }\n matches[docRef] = match\n results.push(match)\n }\n }\n\n /*\n * Sort the results objects by score, highest first.\n */\n return results.sort(function (a, b) {\n return b.score - a.score\n })\n}\n\n/**\n * Prepares the index for JSON serialization.\n *\n * The schema for this JSON blob will be described in a\n * separate JSON schema file.\n *\n * @returns {Object}\n */\nlunr.Index.prototype.toJSON = function () {\n var invertedIndex = Object.keys(this.invertedIndex)\n .sort()\n .map(function (term) {\n return [term, this.invertedIndex[term]]\n }, this)\n\n var fieldVectors = Object.keys(this.fieldVectors)\n .map(function (ref) {\n return [ref, this.fieldVectors[ref].toJSON()]\n }, this)\n\n return {\n version: lunr.version,\n fields: this.fields,\n fieldVectors: fieldVectors,\n invertedIndex: invertedIndex,\n pipeline: this.pipeline.toJSON()\n }\n}\n\n/**\n * Loads a previously serialized lunr.Index\n *\n * @param {Object} serializedIndex - A previously serialized lunr.Index\n * @returns {lunr.Index}\n */\nlunr.Index.load = function (serializedIndex) {\n var attrs = {},\n fieldVectors = {},\n serializedVectors = serializedIndex.fieldVectors,\n invertedIndex = Object.create(null),\n serializedInvertedIndex = serializedIndex.invertedIndex,\n tokenSetBuilder = new lunr.TokenSet.Builder,\n pipeline = lunr.Pipeline.load(serializedIndex.pipeline)\n\n if (serializedIndex.version != lunr.version) {\n lunr.utils.warn(\"Version mismatch when loading serialised index. Current version of lunr '\" + lunr.version + \"' does not match serialized index '\" + serializedIndex.version + \"'\")\n }\n\n for (var i = 0; i < serializedVectors.length; i++) {\n var tuple = serializedVectors[i],\n ref = tuple[0],\n elements = tuple[1]\n\n fieldVectors[ref] = new lunr.Vector(elements)\n }\n\n for (var i = 0; i < serializedInvertedIndex.length; i++) {\n var tuple = serializedInvertedIndex[i],\n term = tuple[0],\n posting = tuple[1]\n\n tokenSetBuilder.insert(term)\n invertedIndex[term] = posting\n }\n\n tokenSetBuilder.finish()\n\n attrs.fields = serializedIndex.fields\n\n attrs.fieldVectors = fieldVectors\n attrs.invertedIndex = invertedIndex\n attrs.tokenSet = tokenSetBuilder.root\n attrs.pipeline = pipeline\n\n return new lunr.Index(attrs)\n}\n/*!\n * lunr.Builder\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.Builder performs indexing on a set of documents and\n * returns instances of lunr.Index ready for querying.\n *\n * All configuration of the index is done via the builder, the\n * fields to index, the document reference, the text processing\n * pipeline and document scoring parameters are all set on the\n * builder before indexing.\n *\n * @constructor\n * @property {string} _ref - Internal reference to the document reference field.\n * @property {string[]} _fields - Internal reference to the document fields to index.\n * @property {object} invertedIndex - The inverted index maps terms to document fields.\n * @property {object} documentTermFrequencies - Keeps track of document term frequencies.\n * @property {object} documentLengths - Keeps track of the length of documents added to the index.\n * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing.\n * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing.\n * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index.\n * @property {number} documentCount - Keeps track of the total number of documents indexed.\n * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75.\n * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2.\n * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space.\n * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index.\n */\nlunr.Builder = function () {\n this._ref = \"id\"\n this._fields = Object.create(null)\n this._documents = Object.create(null)\n this.invertedIndex = Object.create(null)\n this.fieldTermFrequencies = {}\n this.fieldLengths = {}\n this.tokenizer = lunr.tokenizer\n this.pipeline = new lunr.Pipeline\n this.searchPipeline = new lunr.Pipeline\n this.documentCount = 0\n this._b = 0.75\n this._k1 = 1.2\n this.termIndex = 0\n this.metadataWhitelist = []\n}\n\n/**\n * Sets the document field used as the document reference. Every document must have this field.\n * The type of this field in the document should be a string, if it is not a string it will be\n * coerced into a string by calling toString.\n *\n * The default ref is 'id'.\n *\n * The ref should _not_ be changed during indexing, it should be set before any documents are\n * added to the index. Changing it during indexing can lead to inconsistent results.\n *\n * @param {string} ref - The name of the reference field in the document.\n */\nlunr.Builder.prototype.ref = function (ref) {\n this._ref = ref\n}\n\n/**\n * A function that is used to extract a field from a document.\n *\n * Lunr expects a field to be at the top level of a document, if however the field\n * is deeply nested within a document an extractor function can be used to extract\n * the right field for indexing.\n *\n * @callback fieldExtractor\n * @param {object} doc - The document being added to the index.\n * @returns {?(string|object|object[])} obj - The object that will be indexed for this field.\n * @example Extracting a nested field\n * function (doc) { return doc.nested.field }\n */\n\n/**\n * Adds a field to the list of document fields that will be indexed. Every document being\n * indexed should have this field. Null values for this field in indexed documents will\n * not cause errors but will limit the chance of that document being retrieved by searches.\n *\n * All fields should be added before adding documents to the index. Adding fields after\n * a document has been indexed will have no effect on already indexed documents.\n *\n * Fields can be boosted at build time. This allows terms within that field to have more\n * importance when ranking search results. Use a field boost to specify that matches within\n * one field are more important than other fields.\n *\n * @param {string} fieldName - The name of a field to index in all documents.\n * @param {object} attributes - Optional attributes associated with this field.\n * @param {number} [attributes.boost=1] - Boost applied to all terms within this field.\n * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document.\n * @throws {RangeError} fieldName cannot contain unsupported characters '/'\n */\nlunr.Builder.prototype.field = function (fieldName, attributes) {\n if (/\\//.test(fieldName)) {\n throw new RangeError (\"Field '\" + fieldName + \"' contains illegal character '/'\")\n }\n\n this._fields[fieldName] = attributes || {}\n}\n\n/**\n * A parameter to tune the amount of field length normalisation that is applied when\n * calculating relevance scores. A value of 0 will completely disable any normalisation\n * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b\n * will be clamped to the range 0 - 1.\n *\n * @param {number} number - The value to set for this tuning parameter.\n */\nlunr.Builder.prototype.b = function (number) {\n if (number < 0) {\n this._b = 0\n } else if (number > 1) {\n this._b = 1\n } else {\n this._b = number\n }\n}\n\n/**\n * A parameter that controls the speed at which a rise in term frequency results in term\n * frequency saturation. The default value is 1.2. Setting this to a higher value will give\n * slower saturation levels, a lower value will result in quicker saturation.\n *\n * @param {number} number - The value to set for this tuning parameter.\n */\nlunr.Builder.prototype.k1 = function (number) {\n this._k1 = number\n}\n\n/**\n * Adds a document to the index.\n *\n * Before adding fields to the index the index should have been fully setup, with the document\n * ref and all fields to index already having been specified.\n *\n * The document must have a field name as specified by the ref (by default this is 'id') and\n * it should have all fields defined for indexing, though null or undefined values will not\n * cause errors.\n *\n * Entire documents can be boosted at build time. Applying a boost to a document indicates that\n * this document should rank higher in search results than other documents.\n *\n * @param {object} doc - The document to add to the index.\n * @param {object} attributes - Optional attributes associated with this document.\n * @param {number} [attributes.boost=1] - Boost applied to all terms within this document.\n */\nlunr.Builder.prototype.add = function (doc, attributes) {\n var docRef = doc[this._ref],\n fields = Object.keys(this._fields)\n\n this._documents[docRef] = attributes || {}\n this.documentCount += 1\n\n for (var i = 0; i < fields.length; i++) {\n var fieldName = fields[i],\n extractor = this._fields[fieldName].extractor,\n field = extractor ? extractor(doc) : doc[fieldName],\n tokens = this.tokenizer(field, {\n fields: [fieldName]\n }),\n terms = this.pipeline.run(tokens),\n fieldRef = new lunr.FieldRef (docRef, fieldName),\n fieldTerms = Object.create(null)\n\n this.fieldTermFrequencies[fieldRef] = fieldTerms\n this.fieldLengths[fieldRef] = 0\n\n // store the length of this field for this document\n this.fieldLengths[fieldRef] += terms.length\n\n // calculate term frequencies for this field\n for (var j = 0; j < terms.length; j++) {\n var term = terms[j]\n\n if (fieldTerms[term] == undefined) {\n fieldTerms[term] = 0\n }\n\n fieldTerms[term] += 1\n\n // add to inverted index\n // create an initial posting if one doesn't exist\n if (this.invertedIndex[term] == undefined) {\n var posting = Object.create(null)\n posting[\"_index\"] = this.termIndex\n this.termIndex += 1\n\n for (var k = 0; k < fields.length; k++) {\n posting[fields[k]] = Object.create(null)\n }\n\n this.invertedIndex[term] = posting\n }\n\n // add an entry for this term/fieldName/docRef to the invertedIndex\n if (this.invertedIndex[term][fieldName][docRef] == undefined) {\n this.invertedIndex[term][fieldName][docRef] = Object.create(null)\n }\n\n // store all whitelisted metadata about this token in the\n // inverted index\n for (var l = 0; l < this.metadataWhitelist.length; l++) {\n var metadataKey = this.metadataWhitelist[l],\n metadata = term.metadata[metadataKey]\n\n if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) {\n this.invertedIndex[term][fieldName][docRef][metadataKey] = []\n }\n\n this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata)\n }\n }\n\n }\n}\n\n/**\n * Calculates the average document length for this index\n *\n * @private\n */\nlunr.Builder.prototype.calculateAverageFieldLengths = function () {\n\n var fieldRefs = Object.keys(this.fieldLengths),\n numberOfFields = fieldRefs.length,\n accumulator = {},\n documentsWithField = {}\n\n for (var i = 0; i < numberOfFields; i++) {\n var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),\n field = fieldRef.fieldName\n\n documentsWithField[field] || (documentsWithField[field] = 0)\n documentsWithField[field] += 1\n\n accumulator[field] || (accumulator[field] = 0)\n accumulator[field] += this.fieldLengths[fieldRef]\n }\n\n var fields = Object.keys(this._fields)\n\n for (var i = 0; i < fields.length; i++) {\n var fieldName = fields[i]\n accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName]\n }\n\n this.averageFieldLength = accumulator\n}\n\n/**\n * Builds a vector space model of every document using lunr.Vector\n *\n * @private\n */\nlunr.Builder.prototype.createFieldVectors = function () {\n var fieldVectors = {},\n fieldRefs = Object.keys(this.fieldTermFrequencies),\n fieldRefsLength = fieldRefs.length,\n termIdfCache = Object.create(null)\n\n for (var i = 0; i < fieldRefsLength; i++) {\n var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),\n fieldName = fieldRef.fieldName,\n fieldLength = this.fieldLengths[fieldRef],\n fieldVector = new lunr.Vector,\n termFrequencies = this.fieldTermFrequencies[fieldRef],\n terms = Object.keys(termFrequencies),\n termsLength = terms.length\n\n\n var fieldBoost = this._fields[fieldName].boost || 1,\n docBoost = this._documents[fieldRef.docRef].boost || 1\n\n for (var j = 0; j < termsLength; j++) {\n var term = terms[j],\n tf = termFrequencies[term],\n termIndex = this.invertedIndex[term]._index,\n idf, score, scoreWithPrecision\n\n if (termIdfCache[term] === undefined) {\n idf = lunr.idf(this.invertedIndex[term], this.documentCount)\n termIdfCache[term] = idf\n } else {\n idf = termIdfCache[term]\n }\n\n score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf)\n score *= fieldBoost\n score *= docBoost\n scoreWithPrecision = Math.round(score * 1000) / 1000\n // Converts 1.23456789 to 1.234.\n // Reducing the precision so that the vectors take up less\n // space when serialised. Doing it now so that they behave\n // the same before and after serialisation. Also, this is\n // the fastest approach to reducing a number's precision in\n // JavaScript.\n\n fieldVector.insert(termIndex, scoreWithPrecision)\n }\n\n fieldVectors[fieldRef] = fieldVector\n }\n\n this.fieldVectors = fieldVectors\n}\n\n/**\n * Creates a token set of all tokens in the index using lunr.TokenSet\n *\n * @private\n */\nlunr.Builder.prototype.createTokenSet = function () {\n this.tokenSet = lunr.TokenSet.fromArray(\n Object.keys(this.invertedIndex).sort()\n )\n}\n\n/**\n * Builds the index, creating an instance of lunr.Index.\n *\n * This completes the indexing process and should only be called\n * once all documents have been added to the index.\n *\n * @returns {lunr.Index}\n */\nlunr.Builder.prototype.build = function () {\n this.calculateAverageFieldLengths()\n this.createFieldVectors()\n this.createTokenSet()\n\n return new lunr.Index({\n invertedIndex: this.invertedIndex,\n fieldVectors: this.fieldVectors,\n tokenSet: this.tokenSet,\n fields: Object.keys(this._fields),\n pipeline: this.searchPipeline\n })\n}\n\n/**\n * Applies a plugin to the index builder.\n *\n * A plugin is a function that is called with the index builder as its context.\n * Plugins can be used to customise or extend the behaviour of the index\n * in some way. A plugin is just a function, that encapsulated the custom\n * behaviour that should be applied when building the index.\n *\n * The plugin function will be called with the index builder as its argument, additional\n * arguments can also be passed when calling use. The function will be called\n * with the index builder as its context.\n *\n * @param {Function} plugin The plugin to apply.\n */\nlunr.Builder.prototype.use = function (fn) {\n var args = Array.prototype.slice.call(arguments, 1)\n args.unshift(this)\n fn.apply(this, args)\n}\n/**\n * Contains and collects metadata about a matching document.\n * A single instance of lunr.MatchData is returned as part of every\n * lunr.Index~Result.\n *\n * @constructor\n * @param {string} term - The term this match data is associated with\n * @param {string} field - The field in which the term was found\n * @param {object} metadata - The metadata recorded about this term in this field\n * @property {object} metadata - A cloned collection of metadata associated with this document.\n * @see {@link lunr.Index~Result}\n */\nlunr.MatchData = function (term, field, metadata) {\n var clonedMetadata = Object.create(null),\n metadataKeys = Object.keys(metadata || {})\n\n // Cloning the metadata to prevent the original\n // being mutated during match data combination.\n // Metadata is kept in an array within the inverted\n // index so cloning the data can be done with\n // Array#slice\n for (var i = 0; i < metadataKeys.length; i++) {\n var key = metadataKeys[i]\n clonedMetadata[key] = metadata[key].slice()\n }\n\n this.metadata = Object.create(null)\n\n if (term !== undefined) {\n this.metadata[term] = Object.create(null)\n this.metadata[term][field] = clonedMetadata\n }\n}\n\n/**\n * An instance of lunr.MatchData will be created for every term that matches a\n * document. However only one instance is required in a lunr.Index~Result. This\n * method combines metadata from another instance of lunr.MatchData with this\n * objects metadata.\n *\n * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one.\n * @see {@link lunr.Index~Result}\n */\nlunr.MatchData.prototype.combine = function (otherMatchData) {\n var terms = Object.keys(otherMatchData.metadata)\n\n for (var i = 0; i < terms.length; i++) {\n var term = terms[i],\n fields = Object.keys(otherMatchData.metadata[term])\n\n if (this.metadata[term] == undefined) {\n this.metadata[term] = Object.create(null)\n }\n\n for (var j = 0; j < fields.length; j++) {\n var field = fields[j],\n keys = Object.keys(otherMatchData.metadata[term][field])\n\n if (this.metadata[term][field] == undefined) {\n this.metadata[term][field] = Object.create(null)\n }\n\n for (var k = 0; k < keys.length; k++) {\n var key = keys[k]\n\n if (this.metadata[term][field][key] == undefined) {\n this.metadata[term][field][key] = otherMatchData.metadata[term][field][key]\n } else {\n this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key])\n }\n\n }\n }\n }\n}\n\n/**\n * Add metadata for a term/field pair to this instance of match data.\n *\n * @param {string} term - The term this match data is associated with\n * @param {string} field - The field in which the term was found\n * @param {object} metadata - The metadata recorded about this term in this field\n */\nlunr.MatchData.prototype.add = function (term, field, metadata) {\n if (!(term in this.metadata)) {\n this.metadata[term] = Object.create(null)\n this.metadata[term][field] = metadata\n return\n }\n\n if (!(field in this.metadata[term])) {\n this.metadata[term][field] = metadata\n return\n }\n\n var metadataKeys = Object.keys(metadata)\n\n for (var i = 0; i < metadataKeys.length; i++) {\n var key = metadataKeys[i]\n\n if (key in this.metadata[term][field]) {\n this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key])\n } else {\n this.metadata[term][field][key] = metadata[key]\n }\n }\n}\n/**\n * A lunr.Query provides a programmatic way of defining queries to be performed\n * against a {@link lunr.Index}.\n *\n * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method\n * so the query object is pre-initialized with the right index fields.\n *\n * @constructor\n * @property {lunr.Query~Clause[]} clauses - An array of query clauses.\n * @property {string[]} allFields - An array of all available fields in a lunr.Index.\n */\nlunr.Query = function (allFields) {\n this.clauses = []\n this.allFields = allFields\n}\n\n/**\n * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause.\n *\n * This allows wildcards to be added to the beginning and end of a term without having to manually do any string\n * concatenation.\n *\n * The wildcard constants can be bitwise combined to select both leading and trailing wildcards.\n *\n * @constant\n * @default\n * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour\n * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists\n * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists\n * @see lunr.Query~Clause\n * @see lunr.Query#clause\n * @see lunr.Query#term\n * @example query term with trailing wildcard\n * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING })\n * @example query term with leading and trailing wildcard\n * query.term('foo', {\n * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING\n * })\n */\n\nlunr.Query.wildcard = new String (\"*\")\nlunr.Query.wildcard.NONE = 0\nlunr.Query.wildcard.LEADING = 1\nlunr.Query.wildcard.TRAILING = 2\n\n/**\n * Constants for indicating what kind of presence a term must have in matching documents.\n *\n * @constant\n * @enum {number}\n * @see lunr.Query~Clause\n * @see lunr.Query#clause\n * @see lunr.Query#term\n * @example query term with required presence\n * query.term('foo', { presence: lunr.Query.presence.REQUIRED })\n */\nlunr.Query.presence = {\n /**\n * Term's presence in a document is optional, this is the default value.\n */\n OPTIONAL: 1,\n\n /**\n * Term's presence in a document is required, documents that do not contain\n * this term will not be returned.\n */\n REQUIRED: 2,\n\n /**\n * Term's presence in a document is prohibited, documents that do contain\n * this term will not be returned.\n */\n PROHIBITED: 3\n}\n\n/**\n * A single clause in a {@link lunr.Query} contains a term and details on how to\n * match that term against a {@link lunr.Index}.\n *\n * @typedef {Object} lunr.Query~Clause\n * @property {string[]} fields - The fields in an index this clause should be matched against.\n * @property {number} [boost=1] - Any boost that should be applied when matching this clause.\n * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be.\n * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline.\n * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended.\n * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents.\n */\n\n/**\n * Adds a {@link lunr.Query~Clause} to this query.\n *\n * Unless the clause contains the fields to be matched all fields will be matched. In addition\n * a default boost of 1 is applied to the clause.\n *\n * @param {lunr.Query~Clause} clause - The clause to add to this query.\n * @see lunr.Query~Clause\n * @returns {lunr.Query}\n */\nlunr.Query.prototype.clause = function (clause) {\n if (!('fields' in clause)) {\n clause.fields = this.allFields\n }\n\n if (!('boost' in clause)) {\n clause.boost = 1\n }\n\n if (!('usePipeline' in clause)) {\n clause.usePipeline = true\n }\n\n if (!('wildcard' in clause)) {\n clause.wildcard = lunr.Query.wildcard.NONE\n }\n\n if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) {\n clause.term = \"*\" + clause.term\n }\n\n if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) {\n clause.term = \"\" + clause.term + \"*\"\n }\n\n if (!('presence' in clause)) {\n clause.presence = lunr.Query.presence.OPTIONAL\n }\n\n this.clauses.push(clause)\n\n return this\n}\n\n/**\n * A negated query is one in which every clause has a presence of\n * prohibited. These queries require some special processing to return\n * the expected results.\n *\n * @returns boolean\n */\nlunr.Query.prototype.isNegated = function () {\n for (var i = 0; i < this.clauses.length; i++) {\n if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause}\n * to the list of clauses that make up this query.\n *\n * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion\n * to a token or token-like string should be done before calling this method.\n *\n * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an\n * array, each term in the array will share the same options.\n *\n * @param {object|object[]} term - The term(s) to add to the query.\n * @param {object} [options] - Any additional properties to add to the query clause.\n * @returns {lunr.Query}\n * @see lunr.Query#clause\n * @see lunr.Query~Clause\n * @example adding a single term to a query\n * query.term(\"foo\")\n * @example adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard\n * query.term(\"foo\", {\n * fields: [\"title\"],\n * boost: 10,\n * wildcard: lunr.Query.wildcard.TRAILING\n * })\n * @example using lunr.tokenizer to convert a string to tokens before using them as terms\n * query.term(lunr.tokenizer(\"foo bar\"))\n */\nlunr.Query.prototype.term = function (term, options) {\n if (Array.isArray(term)) {\n term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this)\n return this\n }\n\n var clause = options || {}\n clause.term = term.toString()\n\n this.clause(clause)\n\n return this\n}\nlunr.QueryParseError = function (message, start, end) {\n this.name = \"QueryParseError\"\n this.message = message\n this.start = start\n this.end = end\n}\n\nlunr.QueryParseError.prototype = new Error\nlunr.QueryLexer = function (str) {\n this.lexemes = []\n this.str = str\n this.length = str.length\n this.pos = 0\n this.start = 0\n this.escapeCharPositions = []\n}\n\nlunr.QueryLexer.prototype.run = function () {\n var state = lunr.QueryLexer.lexText\n\n while (state) {\n state = state(this)\n }\n}\n\nlunr.QueryLexer.prototype.sliceString = function () {\n var subSlices = [],\n sliceStart = this.start,\n sliceEnd = this.pos\n\n for (var i = 0; i < this.escapeCharPositions.length; i++) {\n sliceEnd = this.escapeCharPositions[i]\n subSlices.push(this.str.slice(sliceStart, sliceEnd))\n sliceStart = sliceEnd + 1\n }\n\n subSlices.push(this.str.slice(sliceStart, this.pos))\n this.escapeCharPositions.length = 0\n\n return subSlices.join('')\n}\n\nlunr.QueryLexer.prototype.emit = function (type) {\n this.lexemes.push({\n type: type,\n str: this.sliceString(),\n start: this.start,\n end: this.pos\n })\n\n this.start = this.pos\n}\n\nlunr.QueryLexer.prototype.escapeCharacter = function () {\n this.escapeCharPositions.push(this.pos - 1)\n this.pos += 1\n}\n\nlunr.QueryLexer.prototype.next = function () {\n if (this.pos >= this.length) {\n return lunr.QueryLexer.EOS\n }\n\n var char = this.str.charAt(this.pos)\n this.pos += 1\n return char\n}\n\nlunr.QueryLexer.prototype.width = function () {\n return this.pos - this.start\n}\n\nlunr.QueryLexer.prototype.ignore = function () {\n if (this.start == this.pos) {\n this.pos += 1\n }\n\n this.start = this.pos\n}\n\nlunr.QueryLexer.prototype.backup = function () {\n this.pos -= 1\n}\n\nlunr.QueryLexer.prototype.acceptDigitRun = function () {\n var char, charCode\n\n do {\n char = this.next()\n charCode = char.charCodeAt(0)\n } while (charCode > 47 && charCode < 58)\n\n if (char != lunr.QueryLexer.EOS) {\n this.backup()\n }\n}\n\nlunr.QueryLexer.prototype.more = function () {\n return this.pos < this.length\n}\n\nlunr.QueryLexer.EOS = 'EOS'\nlunr.QueryLexer.FIELD = 'FIELD'\nlunr.QueryLexer.TERM = 'TERM'\nlunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE'\nlunr.QueryLexer.BOOST = 'BOOST'\nlunr.QueryLexer.PRESENCE = 'PRESENCE'\n\nlunr.QueryLexer.lexField = function (lexer) {\n lexer.backup()\n lexer.emit(lunr.QueryLexer.FIELD)\n lexer.ignore()\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexTerm = function (lexer) {\n if (lexer.width() > 1) {\n lexer.backup()\n lexer.emit(lunr.QueryLexer.TERM)\n }\n\n lexer.ignore()\n\n if (lexer.more()) {\n return lunr.QueryLexer.lexText\n }\n}\n\nlunr.QueryLexer.lexEditDistance = function (lexer) {\n lexer.ignore()\n lexer.acceptDigitRun()\n lexer.emit(lunr.QueryLexer.EDIT_DISTANCE)\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexBoost = function (lexer) {\n lexer.ignore()\n lexer.acceptDigitRun()\n lexer.emit(lunr.QueryLexer.BOOST)\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexEOS = function (lexer) {\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n}\n\n// This matches the separator used when tokenising fields\n// within a document. These should match otherwise it is\n// not possible to search for some tokens within a document.\n//\n// It is possible for the user to change the separator on the\n// tokenizer so it _might_ clash with any other of the special\n// characters already used within the search string, e.g. :.\n//\n// This means that it is possible to change the separator in\n// such a way that makes some words unsearchable using a search\n// string.\nlunr.QueryLexer.termSeparator = lunr.tokenizer.separator\n\nlunr.QueryLexer.lexText = function (lexer) {\n while (true) {\n var char = lexer.next()\n\n if (char == lunr.QueryLexer.EOS) {\n return lunr.QueryLexer.lexEOS\n }\n\n // Escape character is '\\'\n if (char.charCodeAt(0) == 92) {\n lexer.escapeCharacter()\n continue\n }\n\n if (char == \":\") {\n return lunr.QueryLexer.lexField\n }\n\n if (char == \"~\") {\n lexer.backup()\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n return lunr.QueryLexer.lexEditDistance\n }\n\n if (char == \"^\") {\n lexer.backup()\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n return lunr.QueryLexer.lexBoost\n }\n\n // \"+\" indicates term presence is required\n // checking for length to ensure that only\n // leading \"+\" are considered\n if (char == \"+\" && lexer.width() === 1) {\n lexer.emit(lunr.QueryLexer.PRESENCE)\n return lunr.QueryLexer.lexText\n }\n\n // \"-\" indicates term presence is prohibited\n // checking for length to ensure that only\n // leading \"-\" are considered\n if (char == \"-\" && lexer.width() === 1) {\n lexer.emit(lunr.QueryLexer.PRESENCE)\n return lunr.QueryLexer.lexText\n }\n\n if (char.match(lunr.QueryLexer.termSeparator)) {\n return lunr.QueryLexer.lexTerm\n }\n }\n}\n\nlunr.QueryParser = function (str, query) {\n this.lexer = new lunr.QueryLexer (str)\n this.query = query\n this.currentClause = {}\n this.lexemeIdx = 0\n}\n\nlunr.QueryParser.prototype.parse = function () {\n this.lexer.run()\n this.lexemes = this.lexer.lexemes\n\n var state = lunr.QueryParser.parseClause\n\n while (state) {\n state = state(this)\n }\n\n return this.query\n}\n\nlunr.QueryParser.prototype.peekLexeme = function () {\n return this.lexemes[this.lexemeIdx]\n}\n\nlunr.QueryParser.prototype.consumeLexeme = function () {\n var lexeme = this.peekLexeme()\n this.lexemeIdx += 1\n return lexeme\n}\n\nlunr.QueryParser.prototype.nextClause = function () {\n var completedClause = this.currentClause\n this.query.clause(completedClause)\n this.currentClause = {}\n}\n\nlunr.QueryParser.parseClause = function (parser) {\n var lexeme = parser.peekLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n switch (lexeme.type) {\n case lunr.QueryLexer.PRESENCE:\n return lunr.QueryParser.parsePresence\n case lunr.QueryLexer.FIELD:\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expected either a field or a term, found \" + lexeme.type\n\n if (lexeme.str.length >= 1) {\n errorMessage += \" with value '\" + lexeme.str + \"'\"\n }\n\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n}\n\nlunr.QueryParser.parsePresence = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n switch (lexeme.str) {\n case \"-\":\n parser.currentClause.presence = lunr.Query.presence.PROHIBITED\n break\n case \"+\":\n parser.currentClause.presence = lunr.Query.presence.REQUIRED\n break\n default:\n var errorMessage = \"unrecognised presence operator'\" + lexeme.str + \"'\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n var errorMessage = \"expecting term or field, found nothing\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.FIELD:\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expecting term or field, found '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseField = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n if (parser.query.allFields.indexOf(lexeme.str) == -1) {\n var possibleFields = parser.query.allFields.map(function (f) { return \"'\" + f + \"'\" }).join(', '),\n errorMessage = \"unrecognised field '\" + lexeme.str + \"', possible fields: \" + possibleFields\n\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.fields = [lexeme.str]\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n var errorMessage = \"expecting term, found nothing\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expecting term, found '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseTerm = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n parser.currentClause.term = lexeme.str.toLowerCase()\n\n if (lexeme.str.indexOf(\"*\") != -1) {\n parser.currentClause.usePipeline = false\n }\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseEditDistance = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n var editDistance = parseInt(lexeme.str, 10)\n\n if (isNaN(editDistance)) {\n var errorMessage = \"edit distance must be numeric\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.editDistance = editDistance\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseBoost = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n var boost = parseInt(lexeme.str, 10)\n\n if (isNaN(boost)) {\n var errorMessage = \"boost must be numeric\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.boost = boost\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\n /**\n * export the module via AMD, CommonJS or as a browser global\n * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js\n */\n ;(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory)\n } else if (typeof exports === 'object') {\n /**\n * Node. Does not work with strict CommonJS, but\n * only CommonJS-like enviroments that support module.exports,\n * like Node.\n */\n module.exports = factory()\n } else {\n // Browser globals (root is window)\n root.lunr = factory()\n }\n }(this, function () {\n /**\n * Just return a value to define the module export.\n * This example returns an object, but the module\n * can return a function as the exported value.\n */\n return lunr\n }))\n})();\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A RTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport lunr from \"lunr\"\n\nimport \"~/polyfills\"\n\nimport { Search, SearchIndexConfig } from \"../../_\"\nimport {\n SearchMessage,\n SearchMessageType\n} from \"../message\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Add support for usage with `iframe-worker` polyfill\n *\n * While `importScripts` is synchronous when executed inside of a web worker,\n * it's not possible to provide a synchronous polyfilled implementation. The\n * cool thing is that awaiting a non-Promise is a noop, so extending the type\n * definition to return a `Promise` shouldn't break anything.\n *\n * @see https://bit.ly/2PjDnXi - GitHub comment\n */\ndeclare global {\n function importScripts(...urls: string[]): Promise | void\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Search index\n */\nlet index: Search\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch (= import) multi-language support through `lunr-languages`\n *\n * This function automatically imports the stemmers necessary to process the\n * languages, which are defined through the search index configuration.\n *\n * If the worker runs inside of an `iframe` (when using `iframe-worker` as\n * a shim), the base URL for the stemmers to be loaded must be determined by\n * searching for the first `script` element with a `src` attribute, which will\n * contain the contents of this script.\n *\n * @param config - Search index configuration\n *\n * @returns Promise resolving with no result\n */\nasync function setupSearchLanguages(\n config: SearchIndexConfig\n): Promise {\n let base = \"../lunr\"\n\n /* Detect `iframe-worker` and fix base URL */\n if (typeof parent !== \"undefined\" && \"IFrameWorker\" in parent) {\n const worker = document.querySelector(\"script[src]\")!\n const [path] = worker.src.split(\"/worker\")\n\n /* Prefix base with path */\n base = base.replace(\"..\", path)\n }\n\n /* Add scripts for languages */\n const scripts = []\n for (const lang of config.lang) {\n switch (lang) {\n\n /* Add segmenter for Japanese */\n case \"ja\":\n scripts.push(`${base}/tinyseg.js`)\n break\n\n /* Add segmenter for Hindi and Thai */\n case \"hi\":\n case \"th\":\n scripts.push(`${base}/wordcut.js`)\n break\n }\n\n /* Add language support */\n if (lang !== \"en\")\n scripts.push(`${base}/min/lunr.${lang}.min.js`)\n }\n\n /* Add multi-language support */\n if (config.lang.length > 1)\n scripts.push(`${base}/min/lunr.multi.min.js`)\n\n /* Load scripts synchronously */\n if (scripts.length)\n await importScripts(\n `${base}/min/lunr.stemmer.support.min.js`,\n ...scripts\n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Message handler\n *\n * @param message - Source message\n *\n * @returns Target message\n */\nexport async function handler(\n message: SearchMessage\n): Promise {\n switch (message.type) {\n\n /* Search setup message */\n case SearchMessageType.SETUP:\n await setupSearchLanguages(message.data.config)\n index = new Search(message.data)\n return {\n type: SearchMessageType.READY\n }\n\n /* Search query message */\n case SearchMessageType.QUERY:\n return {\n type: SearchMessageType.RESULT,\n data: index ? index.search(message.data) : { items: [] }\n }\n\n /* All other messages */\n default:\n throw new TypeError(\"Invalid message type\")\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Worker\n * ------------------------------------------------------------------------- */\n\n/* @ts-expect-error - expose Lunr.js in global scope, or stemmers won't work */\nself.lunr = lunr\n\n/* Handle messages */\naddEventListener(\"message\", async ev => {\n postMessage(await handler(ev.data))\n})\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Polyfills\n * ------------------------------------------------------------------------- */\n\n/* Polyfill `Object.entries` */\nif (!Object.entries)\n Object.entries = function (obj: object) {\n const data: [string, string][] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push([key, obj[key]])\n\n /* Return entries */\n return data\n }\n\n/* Polyfill `Object.values` */\nif (!Object.values)\n Object.values = function (obj: object) {\n const data: string[] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push(obj[key])\n\n /* Return values */\n return data\n }\n\n/* ------------------------------------------------------------------------- */\n\n/* Polyfills for `Element` */\nif (typeof Element !== \"undefined\") {\n\n /* Polyfill `Element.scrollTo` */\n if (!Element.prototype.scrollTo)\n Element.prototype.scrollTo = function (\n x?: ScrollToOptions | number, y?: number\n ): void {\n if (typeof x === \"object\") {\n this.scrollLeft = x.left!\n this.scrollTop = x.top!\n } else {\n this.scrollLeft = x!\n this.scrollTop = y!\n }\n }\n\n /* Polyfill `Element.replaceWith` */\n if (!Element.prototype.replaceWith)\n Element.prototype.replaceWith = function (\n ...nodes: Array\n ): void {\n const parent = this.parentNode\n if (parent) {\n if (nodes.length === 0)\n parent.removeChild(this)\n\n /* Replace children and create text nodes */\n for (let i = nodes.length - 1; i >= 0; i--) {\n let node = nodes[i]\n if (typeof node !== \"object\")\n node = document.createTextNode(node)\n else if (node.parentNode)\n node.parentNode.removeChild(node)\n\n /* Replace child or insert before previous sibling */\n if (!i)\n parent.replaceChild(node, this)\n else\n parent.insertBefore(this.previousSibling!, node)\n }\n }\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexDocument } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search document\n */\nexport interface SearchDocument extends SearchIndexDocument {\n parent?: SearchIndexDocument /* Parent article */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search document mapping\n */\nexport type SearchDocumentMap = Map\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search document mapping\n *\n * @param docs - Search index documents\n *\n * @returns Search document map\n */\nexport function setupSearchDocumentMap(\n docs: SearchIndexDocument[]\n): SearchDocumentMap {\n const documents = new Map()\n const parents = new Set()\n for (const doc of docs) {\n const [path, hash] = doc.location.split(\"#\")\n\n /* Extract location, title and tags */\n const location = doc.location\n const title = doc.title\n const tags = doc.tags\n\n /* Escape and cleanup text */\n const text = escapeHTML(doc.text)\n .replace(/\\s+(?=[,.:;!?])/g, \"\")\n .replace(/\\s+/g, \" \")\n\n /* Handle section */\n if (hash) {\n const parent = documents.get(path)!\n\n /* Ignore first section, override article */\n if (!parents.has(parent)) {\n parent.title = doc.title\n parent.text = text\n\n /* Remember that we processed the article */\n parents.add(parent)\n\n /* Add subsequent section */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n parent\n })\n }\n\n /* Add article */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n ...tags && { tags }\n })\n }\n }\n return documents\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexConfig } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search highlight function\n *\n * @param value - Value\n *\n * @returns Highlighted value\n */\nexport type SearchHighlightFn = (value: string) => string\n\n/**\n * Search highlight factory function\n *\n * @param query - Query value\n *\n * @returns Search highlight function\n */\nexport type SearchHighlightFactoryFn = (query: string) => SearchHighlightFn\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search highlighter\n *\n * @param config - Search index configuration\n * @param escape - Whether to escape HTML\n *\n * @returns Search highlight factory function\n */\nexport function setupSearchHighlighter(\n config: SearchIndexConfig, escape: boolean\n): SearchHighlightFactoryFn {\n const separator = new RegExp(config.separator, \"img\")\n const highlight = (_: unknown, data: string, term: string) => {\n return `${data}${term}`\n }\n\n /* Return factory function */\n return (query: string) => {\n query = query\n .replace(/[\\s*+\\-:~^]+/g, \" \")\n .trim()\n\n /* Create search term match expression */\n const match = new RegExp(`(^|${config.separator})(${\n query\n .replace(/[|\\\\{}()[\\]^$+*?.-]/g, \"\\\\$&\")\n .replace(separator, \"|\")\n })`, \"img\")\n\n /* Highlight string value */\n return value => (\n escape\n ? escapeHTML(value)\n : value\n )\n .replace(match, highlight)\n .replace(/<\\/mark>(\\s+)]*>/img, \"$1\")\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search query clause\n */\nexport interface SearchQueryClause {\n presence: lunr.Query.presence /* Clause presence */\n term: string /* Clause term */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search query terms\n */\nexport type SearchQueryTerms = Record\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Parse a search query for analysis\n *\n * @param value - Query value\n *\n * @returns Search query clauses\n */\nexport function parseSearchQuery(\n value: string\n): SearchQueryClause[] {\n const query = new (lunr as any).Query([\"title\", \"text\"])\n const parser = new (lunr as any).QueryParser(value, query)\n\n /* Parse and return query clauses */\n parser.parse()\n return query.clauses\n}\n\n/**\n * Analyze the search query clauses in regard to the search terms found\n *\n * @param query - Search query clauses\n * @param terms - Search terms\n *\n * @returns Search query terms\n */\nexport function getSearchQueryTerms(\n query: SearchQueryClause[], terms: string[]\n): SearchQueryTerms {\n const clauses = new Set(query)\n\n /* Match query clauses against terms */\n const result: SearchQueryTerms = {}\n for (let t = 0; t < terms.length; t++)\n for (const clause of clauses)\n if (terms[t].startsWith(clause.term)) {\n result[clause.term] = true\n clauses.delete(clause)\n }\n\n /* Annotate unmatched non-stopword query clauses */\n for (const clause of clauses)\n if (lunr.stopWordFilter?.(clause.term as any))\n result[clause.term] = false\n\n /* Return query terms */\n return result\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n SearchDocument,\n SearchDocumentMap,\n setupSearchDocumentMap\n} from \"../document\"\nimport {\n SearchHighlightFactoryFn,\n setupSearchHighlighter\n} from \"../highlighter\"\nimport { SearchOptions } from \"../options\"\nimport {\n SearchQueryTerms,\n getSearchQueryTerms,\n parseSearchQuery\n} from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search index configuration\n */\nexport interface SearchIndexConfig {\n lang: string[] /* Search languages */\n separator: string /* Search separator */\n}\n\n/**\n * Search index document\n */\nexport interface SearchIndexDocument {\n location: string /* Document location */\n title: string /* Document title */\n text: string /* Document text */\n tags?: string[] /* Document tags */\n boost?: number /* Document boost */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search index\n *\n * This interfaces describes the format of the `search_index.json` file which\n * is automatically built by the MkDocs search plugin.\n */\nexport interface SearchIndex {\n config: SearchIndexConfig /* Search index configuration */\n docs: SearchIndexDocument[] /* Search index documents */\n options: SearchOptions /* Search options */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search metadata\n */\nexport interface SearchMetadata {\n score: number /* Score (relevance) */\n terms: SearchQueryTerms /* Search query terms */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search result document\n */\nexport type SearchResultDocument = SearchDocument & SearchMetadata\n\n/**\n * Search result item\n */\nexport type SearchResultItem = SearchResultDocument[]\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search result\n */\nexport interface SearchResult {\n items: SearchResultItem[] /* Search result items */\n suggestions?: string[] /* Search suggestions */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Compute the difference of two lists of strings\n *\n * @param a - 1st list of strings\n * @param b - 2nd list of strings\n *\n * @returns Difference\n */\nfunction difference(a: string[], b: string[]): string[] {\n const [x, y] = [new Set(a), new Set(b)]\n return [\n ...new Set([...x].filter(value => !y.has(value)))\n ]\n}\n\n/* ----------------------------------------------------------------------------\n * Class\n * ------------------------------------------------------------------------- */\n\n/**\n * Search index\n */\nexport class Search {\n\n /**\n * Search document mapping\n *\n * A mapping of URLs (including hash fragments) to the actual articles and\n * sections of the documentation. The search document mapping must be created\n * regardless of whether the index was prebuilt or not, as Lunr.js itself\n * only stores the actual index.\n */\n protected documents: SearchDocumentMap\n\n /**\n * Search highlight factory function\n */\n protected highlight: SearchHighlightFactoryFn\n\n /**\n * The underlying Lunr.js search index\n */\n protected index: lunr.Index\n\n /**\n * Search options\n */\n protected options: SearchOptions\n\n /**\n * Create the search integration\n *\n * @param data - Search index\n */\n public constructor({ config, docs, options }: SearchIndex) {\n this.options = options\n\n /* Set up document map and highlighter factory */\n this.documents = setupSearchDocumentMap(docs)\n this.highlight = setupSearchHighlighter(config, false)\n\n /* Set separator for tokenizer */\n lunr.tokenizer.separator = new RegExp(config.separator)\n\n /* Create search index */\n this.index = lunr(function () {\n\n /* Set up multi-language support */\n if (config.lang.length === 1 && config.lang[0] !== \"en\") {\n this.use((lunr as any)[config.lang[0]])\n } else if (config.lang.length > 1) {\n this.use((lunr as any).multiLanguage(...config.lang))\n }\n\n /* Compute functions to be removed from the pipeline */\n const fns = difference([\n \"trimmer\", \"stopWordFilter\", \"stemmer\"\n ], options.pipeline)\n\n /* Remove functions from the pipeline for registered languages */\n for (const lang of config.lang.map(language => (\n language === \"en\" ? lunr : (lunr as any)[language]\n ))) {\n for (const fn of fns) {\n this.pipeline.remove(lang[fn])\n this.searchPipeline.remove(lang[fn])\n }\n }\n\n /* Set up reference */\n this.ref(\"location\")\n\n /* Set up fields */\n this.field(\"title\", { boost: 1e3 })\n this.field(\"text\")\n this.field(\"tags\", { boost: 1e6, extractor: doc => {\n const { tags = [] } = doc as SearchDocument\n return tags.reduce((list, tag) => [\n ...list,\n ...lunr.tokenizer(tag)\n ], [] as lunr.Token[])\n } })\n\n /* Index documents */\n for (const doc of docs)\n this.add(doc, { boost: doc.boost })\n })\n }\n\n /**\n * Search for matching documents\n *\n * The search index which MkDocs provides is divided up into articles, which\n * contain the whole content of the individual pages, and sections, which only\n * contain the contents of the subsections obtained by breaking the individual\n * pages up at `h1` ... `h6`. As there may be many sections on different pages\n * with identical titles (for example within this very project, e.g. \"Usage\"\n * or \"Installation\"), they need to be put into the context of the containing\n * page. For this reason, section results are grouped within their respective\n * articles which are the top-level results that are returned.\n *\n * @param query - Query value\n *\n * @returns Search results\n */\n public search(query: string): SearchResult {\n if (query) {\n try {\n const highlight = this.highlight(query)\n\n /* Parse query to extract clauses for analysis */\n const clauses = parseSearchQuery(query)\n .filter(clause => (\n clause.presence !== lunr.Query.presence.PROHIBITED\n ))\n\n /* Perform search and post-process results */\n const groups = this.index.search(`${query}*`)\n\n /* Apply post-query boosts based on title and search query terms */\n .reduce((item, { ref, score, matchData }) => {\n const document = this.documents.get(ref)\n if (typeof document !== \"undefined\") {\n const { location, title, text, tags, parent } = document\n\n /* Compute and analyze search query terms */\n const terms = getSearchQueryTerms(\n clauses,\n Object.keys(matchData.metadata)\n )\n\n /* Highlight title and text and apply post-query boosts */\n const boost = +!parent + +Object.values(terms).every(t => t)\n item.push({\n location,\n title: highlight(title),\n text: highlight(text),\n ...tags && { tags: tags.map(highlight) },\n score: score * (1 + boost),\n terms\n })\n }\n return item\n }, [])\n\n /* Sort search results again after applying boosts */\n .sort((a, b) => b.score - a.score)\n\n /* Group search results by page */\n .reduce((items, result) => {\n const document = this.documents.get(result.location)\n if (typeof document !== \"undefined\") {\n const ref = \"parent\" in document\n ? document.parent!.location\n : document.location\n items.set(ref, [...items.get(ref) || [], result])\n }\n return items\n }, new Map())\n\n /* Generate search suggestions, if desired */\n let suggestions: string[] | undefined\n if (this.options.suggestions) {\n const titles = this.index.query(builder => {\n for (const clause of clauses)\n builder.term(clause.term, {\n fields: [\"title\"],\n presence: lunr.Query.presence.REQUIRED,\n wildcard: lunr.Query.wildcard.TRAILING\n })\n })\n\n /* Retrieve suggestions for best match */\n suggestions = titles.length\n ? Object.keys(titles[0].matchData.metadata)\n : []\n }\n\n /* Return items and suggestions */\n return {\n items: [...groups.values()],\n ...typeof suggestions !== \"undefined\" && { suggestions }\n }\n\n /* Log errors to console (for now) */\n } catch {\n console.warn(`Invalid query: ${query} \u2013 see https://bit.ly/2s3ChXG`)\n }\n }\n\n /* Return nothing in case of error or empty query */\n return { items: [] }\n }\n}\n"], + "mappings": "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L,CAAI,KACrDD,EAAIC,EAER,CAEA,OAAAG,EAAKP,EACLQ,EAAMzB,EACFwB,EAAG,KAAKJ,CAAC,GAAKK,EAAI,KAAKL,CAAC,IAC1BI,EAAKjB,EACLa,EAAIA,EAAE,QAAQI,EAAG,EAAE,GAKjBD,GAAW,MACbH,EAAIG,EAAQ,YAAY,EAAIH,EAAE,OAAO,CAAC,GAGjCA,CACT,EAEA,OAAO,SAAUhD,EAAO,CACtB,OAAOA,EAAM,OAAO+C,CAAa,CACnC,CACF,EAAG,EAEHpG,EAAK,SAAS,iBAAiBA,EAAK,QAAS,SAAS,EACtD;AAAA;AAAA;AAAA,GAkBAA,EAAK,uBAAyB,SAAU8G,EAAW,CACjD,IAAIC,EAAQD,EAAU,OAAO,SAAU7D,EAAM+D,EAAU,CACrD,OAAA/D,EAAK+D,GAAYA,EACV/D,CACT,EAAG,CAAC,CAAC,EAEL,OAAO,SAAUI,EAAO,CACtB,GAAIA,GAAS0D,EAAM1D,EAAM,SAAS,KAAOA,EAAM,SAAS,EAAG,OAAOA,CACpE,CACF,EAeArD,EAAK,eAAiBA,EAAK,uBAAuB,CAChD,IACA,OACA,QACA,SACA,QACA,MACA,SACA,OACA,KACA,QACA,KACA,MACA,MACA,MACA,KACA,KACA,KACA,UACA,OACA,MACA,KACA,MACA,SACA,QACA,OACA,MACA,KACA,OACA,SACA,OACA,OACA,QACA,MACA,OACA,MACA,MACA,MACA,MACA,OACA,KACA,MACA,OACA,MACA,MACA,MACA,UACA,IACA,KACA,KACA,OACA,KACA,KACA,MACA,OACA,QACA,MACA,OACA,SACA,MACA,KACA,QACA,OACA,OACA,KACA,UACA,KACA,MACA,MACA,KACA,MACA,QACA,KACA,OACA,KACA,QACA,MACA,MACA,SACA,OACA,MACA,OACA,MACA,SACA,QACA,KACA,OACA,OACA,OACA,MACA,QACA,OACA,OACA,QACA,QACA,OACA,OACA,MACA,KACA,MACA,OACA,KACA,QACA,MACA,KACA,OACA,OACA,OACA,QACA,QACA,QACA,MACA,OACA,MACA,OACA,OACA,QACA,MACA,MACA,MACF,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", + "names": ["require_lunr", "__commonJSMin", "exports", "module", "lunr", "config", "builder", "global", "message", "obj", "clone", "keys", "key", "val", "docRef", "fieldName", "stringValue", "s", "n", "fieldRef", "elements", "i", "other", "object", "a", "b", "intersection", "element", "posting", "documentCount", "documentsWithTerm", "x", "str", "metadata", "fn", "t", "len", "tokens", "sliceEnd", "sliceStart", "char", "sliceLength", "tokenMetadata", "label", "isRegistered", "serialised", "pipeline", "fnName", "fns", "existingFn", "newFn", "pos", "stackLength", "memo", "j", "result", "k", "token", "index", "start", "end", "pivotPoint", "pivotIndex", "insertIdx", "position", "sumOfSquares", "elementsLength", "otherVector", "dotProduct", "aLen", "bLen", "aVal", "bVal", "output", "step2list", "step3list", "c", "v", "C", "V", "mgr0", "meq1", "mgr1", "s_v", "re_mgr0", "re_mgr1", "re_meq1", "re_s_v", "re_1a", "re2_1a", "re_1b", "re2_1b", "re_1b_2", "re2_1b_2", "re3_1b_2", "re4_1b_2", "re_1c", "re_2", "re_3", "re_4", "re2_4", "re_5", "re_5_1", "re3_5", "porterStemmer", "w", "stem", "suffix", "firstch", "re", "re2", "re3", "re4", "fp", "stopWords", "words", "stopWord", "arr", "clause", "editDistance", "root", "stack", "frame", "noEditNode", "insertionNode", "substitutionNode", "charA", "charB", "transposeNode", "node", "final", "next", "edges", "edge", "labels", "qEdges", "qLen", "nEdges", "nLen", "q", "qEdge", "nEdge", "qNode", "word", "commonPrefix", "nextNode", "downTo", "childKey", "attrs", "queryString", "query", "parser", "matchingFields", "queryVectors", "termFieldCache", "requiredMatches", "prohibitedMatches", "terms", "clauseMatches", "m", "term", "termTokenSet", "expandedTerms", "field", "expandedTerm", "termIndex", "fieldPosting", "matchingDocumentRefs", "termField", "matchingDocumentsSet", "l", "matchingDocumentRef", "matchingFieldRef", "fieldMatch", "allRequiredMatches", "allProhibitedMatches", "matchingFieldRefs", "results", "matches", "fieldVector", "score", "docMatch", "match", "invertedIndex", "fieldVectors", "ref", "serializedIndex", "serializedVectors", "serializedInvertedIndex", "tokenSetBuilder", "tuple", "attributes", "number", "doc", "fields", "extractor", "fieldTerms", "metadataKey", "fieldRefs", "numberOfFields", "accumulator", "documentsWithField", "fieldRefsLength", "termIdfCache", "fieldLength", "termFrequencies", "termsLength", "fieldBoost", "docBoost", "tf", "idf", "scoreWithPrecision", "args", "clonedMetadata", "metadataKeys", "otherMatchData", "allFields", "options", "state", "subSlices", "type", "charCode", "lexer", "lexeme", "completedClause", "errorMessage", "nextLexeme", "possibleFields", "f", "boost", "factory", "require_escape_html", "__commonJSMin", "exports", "module", "matchHtmlRegExp", "escapeHtml", "string", "str", "match", "escape", "html", "index", "lastIndex", "import_lunr", "obj", "data", "key", "x", "y", "nodes", "parent", "i", "node", "import_escape_html", "setupSearchDocumentMap", "docs", "documents", "parents", "doc", "path", "hash", "location", "title", "tags", "text", "escapeHTML", "parent", "__spreadValues", "import_escape_html", "setupSearchHighlighter", "config", "escape", "separator", "highlight", "_", "data", "term", "query", "match", "value", "escapeHTML", "parseSearchQuery", "value", "query", "getSearchQueryTerms", "terms", "_a", "clauses", "result", "t", "clause", "difference", "a", "b", "x", "y", "value", "Search", "config", "docs", "options", "setupSearchDocumentMap", "setupSearchHighlighter", "fns", "lang", "language", "fn", "doc", "tags", "list", "tag", "query", "highlight", "clauses", "parseSearchQuery", "clause", "groups", "item", "ref", "score", "matchData", "document", "location", "title", "text", "parent", "terms", "getSearchQueryTerms", "boost", "t", "__spreadProps", "__spreadValues", "items", "result", "suggestions", "titles", "builder", "e", "index", "setupSearchLanguages", "config", "__async", "base", "worker", "path", "scripts", "lang", "handler", "message", "Search", "lunr", "ev"] +} diff --git a/assets/screenshots/annotations.png b/assets/screenshots/annotations.png new file mode 100644 index 00000000..a4422bc0 Binary files /dev/null and b/assets/screenshots/annotations.png differ diff --git a/assets/screenshots/back-to-top.png b/assets/screenshots/back-to-top.png new file mode 100644 index 00000000..6771badd Binary files /dev/null and b/assets/screenshots/back-to-top.png differ diff --git a/assets/screenshots/consent.png b/assets/screenshots/consent.png new file mode 100644 index 00000000..2ab700af Binary files /dev/null and b/assets/screenshots/consent.png differ diff --git a/assets/screenshots/content-tabs-link.png b/assets/screenshots/content-tabs-link.png new file mode 100644 index 00000000..c0edb59f Binary files /dev/null and b/assets/screenshots/content-tabs-link.png differ diff --git a/assets/screenshots/content-tabs.png b/assets/screenshots/content-tabs.png new file mode 100644 index 00000000..1c68d5b2 Binary files /dev/null and b/assets/screenshots/content-tabs.png differ diff --git a/assets/screenshots/creating-your-site.png b/assets/screenshots/creating-your-site.png new file mode 100644 index 00000000..0243b619 Binary files /dev/null and b/assets/screenshots/creating-your-site.png differ diff --git a/assets/screenshots/feedback-report.png b/assets/screenshots/feedback-report.png new file mode 100644 index 00000000..eb7e3be4 Binary files /dev/null and b/assets/screenshots/feedback-report.png differ diff --git a/assets/screenshots/hide-navigation-toc.png b/assets/screenshots/hide-navigation-toc.png new file mode 100644 index 00000000..12fd440f Binary files /dev/null and b/assets/screenshots/hide-navigation-toc.png differ diff --git a/assets/screenshots/hide-navigation.png b/assets/screenshots/hide-navigation.png new file mode 100644 index 00000000..e6c8b346 Binary files /dev/null and b/assets/screenshots/hide-navigation.png differ diff --git a/assets/screenshots/hide-toc.png b/assets/screenshots/hide-toc.png new file mode 100644 index 00000000..ab947786 Binary files /dev/null and b/assets/screenshots/hide-toc.png differ diff --git a/assets/screenshots/language-selection.png b/assets/screenshots/language-selection.png new file mode 100644 index 00000000..964c6719 Binary files /dev/null and b/assets/screenshots/language-selection.png differ diff --git a/assets/screenshots/navigation-expand.png b/assets/screenshots/navigation-expand.png new file mode 100644 index 00000000..a37c66a0 Binary files /dev/null and b/assets/screenshots/navigation-expand.png differ diff --git a/assets/screenshots/navigation-index-off.png b/assets/screenshots/navigation-index-off.png new file mode 100644 index 00000000..ab3751c4 Binary files /dev/null and b/assets/screenshots/navigation-index-off.png differ diff --git a/assets/screenshots/navigation-index-on.png b/assets/screenshots/navigation-index-on.png new file mode 100644 index 00000000..819069c8 Binary files /dev/null and b/assets/screenshots/navigation-index-on.png differ diff --git a/assets/screenshots/navigation-sections.png b/assets/screenshots/navigation-sections.png new file mode 100644 index 00000000..b0edf574 Binary files /dev/null and b/assets/screenshots/navigation-sections.png differ diff --git a/assets/screenshots/navigation-tabs-collapsed.png b/assets/screenshots/navigation-tabs-collapsed.png new file mode 100644 index 00000000..1c5d64e2 Binary files /dev/null and b/assets/screenshots/navigation-tabs-collapsed.png differ diff --git a/assets/screenshots/navigation-tabs-sticky.png b/assets/screenshots/navigation-tabs-sticky.png new file mode 100644 index 00000000..b8bd5956 Binary files /dev/null and b/assets/screenshots/navigation-tabs-sticky.png differ diff --git a/assets/screenshots/navigation-tabs.png b/assets/screenshots/navigation-tabs.png new file mode 100644 index 00000000..96af83d5 Binary files /dev/null and b/assets/screenshots/navigation-tabs.png differ diff --git a/assets/screenshots/navigation.png b/assets/screenshots/navigation.png new file mode 100644 index 00000000..82864b52 Binary files /dev/null and b/assets/screenshots/navigation.png differ diff --git a/assets/screenshots/search-highlighting.png b/assets/screenshots/search-highlighting.png new file mode 100644 index 00000000..69556e7c Binary files /dev/null and b/assets/screenshots/search-highlighting.png differ diff --git a/assets/screenshots/search-share.png b/assets/screenshots/search-share.png new file mode 100644 index 00000000..0271ba1b Binary files /dev/null and b/assets/screenshots/search-share.png differ diff --git a/assets/screenshots/search-suggestions.png b/assets/screenshots/search-suggestions.png new file mode 100644 index 00000000..20ccde90 Binary files /dev/null and b/assets/screenshots/search-suggestions.png differ diff --git a/assets/screenshots/social-cards.png b/assets/screenshots/social-cards.png new file mode 100644 index 00000000..3b348db3 Binary files /dev/null and b/assets/screenshots/social-cards.png differ diff --git a/assets/screenshots/tags-index.png b/assets/screenshots/tags-index.png new file mode 100644 index 00000000..35de4407 Binary files /dev/null and b/assets/screenshots/tags-index.png differ diff --git a/assets/screenshots/tags-search.png b/assets/screenshots/tags-search.png new file mode 100644 index 00000000..4bea8026 Binary files /dev/null and b/assets/screenshots/tags-search.png differ diff --git a/assets/screenshots/tags.png b/assets/screenshots/tags.png new file mode 100644 index 00000000..9e93a9cd Binary files /dev/null and b/assets/screenshots/tags.png differ diff --git a/assets/screenshots/toc-integrate.png b/assets/screenshots/toc-integrate.png new file mode 100644 index 00000000..04fe87d5 Binary files /dev/null and b/assets/screenshots/toc-integrate.png differ diff --git a/assets/screenshots/version-warning.png b/assets/screenshots/version-warning.png new file mode 100644 index 00000000..d7262c4d Binary files /dev/null and b/assets/screenshots/version-warning.png differ diff --git a/assets/screenshots/versioning.png b/assets/screenshots/versioning.png new file mode 100644 index 00000000..114334c3 Binary files /dev/null and b/assets/screenshots/versioning.png differ diff --git a/assets/stylesheets/main.69437709.min.css b/assets/stylesheets/main.69437709.min.css new file mode 100644 index 00000000..702d0138 --- /dev/null +++ b/assets/stylesheets/main.69437709.min.css @@ -0,0 +1 @@ +@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:transparent;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root,[data-md-color-scheme=default]{--md-default-fg-color:rgba(0,0,0,.87);--md-default-fg-color--light:rgba(0,0,0,.54);--md-default-fg-color--lighter:rgba(0,0,0,.32);--md-default-fg-color--lightest:rgba(0,0,0,.07);--md-default-bg-color:#fff;--md-default-bg-color--light:hsla(0,0%,100%,.7);--md-default-bg-color--lighter:hsla(0,0%,100%,.3);--md-default-bg-color--lightest:hsla(0,0%,100%,.12);--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:rgba(82,108,254,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7);--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-hl-color:rgba(255,255,0,.5);--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-mark-color:rgba(255,255,0,.5);--md-typeset-del-color:rgba(245,80,61,.15);--md-typeset-ins-color:rgba(11,213,112,.15);--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-table-color:rgba(0,0,0,.12);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-footer-fg-color:#fff;--md-footer-fg-color--light:hsla(0,0%,100%,.7);--md-footer-fg-color--lighter:hsla(0,0%,100%,.3);--md-footer-bg-color:rgba(0,0,0,.87);--md-footer-bg-color--dark:rgba(0,0,0,.32);--md-shadow-z1:0 0.2rem 0.5rem rgba(0,0,0,.05),0 0 0.05rem rgba(0,0,0,.1);--md-shadow-z2:0 0.2rem 0.5rem rgba(0,0,0,.1),0 0 0.05rem rgba(0,0,0,.25);--md-shadow-z3:0 0.2rem 0.5rem rgba(0,0,0,.2),0 0 0.05rem rgba(0,0,0,.35)}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}body,input{font-feature-settings:"kern","liga";font-family:var(--md-text-font-family)}body,code,input,kbd,pre{color:var(--md-typeset-color)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent)}.md-typeset a code{color:currentcolor;transition:background-color 125ms}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) transparent;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}@media (hover:none){.md-typeset abbr{position:relative}.md-typeset abbr[title]:-webkit-any(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:-webkit-max-content;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}.md-typeset abbr[title]:-moz-any(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:-moz-max-content;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}[dir=ltr] .md-typeset abbr[title]:-webkit-any(:focus,:hover):after{left:0}[dir=ltr] .md-typeset abbr[title]:-moz-any(:focus,:hover):after{left:0}[dir=ltr] .md-typeset abbr[title]:is(:focus,:hover):after{left:0}[dir=rtl] .md-typeset abbr[title]:-webkit-any(:focus,:hover):after{right:0}[dir=rtl] .md-typeset abbr[title]:-moz-any(:focus,:hover):after{right:0}[dir=rtl] .md-typeset abbr[title]:is(:focus,:hover):after{right:0}.md-typeset abbr[title]:is(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li :-webkit-any(ul,ol),.md-typeset ul li :-webkit-any(ul,ol){margin-bottom:.5em;margin-top:.5em}.md-typeset ol li :-moz-any(ul,ol),.md-typeset ul li :-moz-any(ul,ol){margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset ol li :-webkit-any(ul,ol),[dir=ltr] .md-typeset ul li :-webkit-any(ul,ol){margin-left:.625em}[dir=ltr] .md-typeset ol li :-moz-any(ul,ol),[dir=ltr] .md-typeset ul li :-moz-any(ul,ol){margin-left:.625em}[dir=ltr] .md-typeset ol li :is(ul,ol),[dir=ltr] .md-typeset ul li :is(ul,ol){margin-left:.625em}[dir=rtl] .md-typeset ol li :-webkit-any(ul,ol),[dir=rtl] .md-typeset ul li :-webkit-any(ul,ol){margin-right:.625em}[dir=rtl] .md-typeset ol li :-moz-any(ul,ol),[dir=rtl] .md-typeset ul li :-moz-any(ul,ol){margin-right:.625em}[dir=rtl] .md-typeset ol li :is(ul,ol),[dir=rtl] .md-typeset ul li :is(ul,ol){margin-right:.625em}.md-typeset ol li :is(ul,ol),.md-typeset ul li :is(ul,ol){margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset img[src$="#gh-dark-mode-only"],.md-typeset img[src$="#only-dark"]{display:none}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) :-webkit-any(th,td)>:first-child{margin-top:0}.md-typeset table:not([class]) :-moz-any(th,td)>:first-child{margin-top:0}.md-typeset table:not([class]) :is(th,td)>:first-child{margin-top:0}.md-typeset table:not([class]) :-webkit-any(th,td)>:last-child{margin-bottom:0}.md-typeset table:not([class]) :-moz-any(th,td)>:last-child{margin-bottom:0}.md-typeset table:not([class]) :is(th,td)>:last-child{margin-bottom:0}.md-typeset table:not([class]) :-webkit-any(th,td):not([align]){text-align:left}.md-typeset table:not([class]) :-moz-any(th,td):not([align]){text-align:left}.md-typeset table:not([class]) :is(th,td):not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) :-webkit-any(th,td):not([align]){text-align:right}[dir=rtl] .md-typeset table:not([class]) :-moz-any(th,td):not([align]){text-align:right}[dir=rtl] .md-typeset table:not([class]) :is(th,td):not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) th a{color:inherit}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:rgba(0,0,0,.035);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.9375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background:var(--md-typeset-mark-color);color:var(--md-default-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}.md-banner__button{color:inherit;cursor:pointer;float:right;transition:opacity .25s}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.9375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;position:absolute;right:.5em;top:.5em;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:-webkit-any(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-clipboard--inline:-moz-any(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-clipboard--inline:is(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}@-webkit-keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@-webkit-keyframes overlay{0%{opacity:0}to{opacity:1}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{-webkit-animation:overlay .25s both;animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:rgba(0,0,0,.54);height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{-webkit-animation:consent .5s cubic-bezier(.1,.7,.1,1) both;animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2);max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.9375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{float:right;margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}[dir=rtl] .md-content__button{float:left}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{align-content:baseline;display:flex;flex-wrap:wrap;justify-content:center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{display:flex;flex-grow:0.01;outline-color:var(--md-accent-fg-color);overflow:hidden;padding-bottom:.4rem;padding-top:1.4rem;transition:opacity .25s}.md-footer__link:-webkit-any(:focus,:hover){opacity:.7}.md-footer__link:-moz-any(:focus,:hover){opacity:.7}.md-footer__link:is(:focus,:hover){opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.9375em){.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;line-height:2.4rem;max-width:calc(100% - 2.4rem);padding:0 1rem;position:relative;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;left:0;margin-top:-1rem;opacity:.7;padding:0 1rem;position:absolute;right:0}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:-webkit-any(:focus,:hover){color:var(--md-footer-fg-color)}html .md-footer-meta.md-typeset a:-moz-any(:focus,:hover){color:var(--md-footer-fg-color)}html .md-footer-meta.md-typeset a:is(:focus,:hover){color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-typeset .md-button:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-typeset .md-button:is(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:-webkit-any(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input:-moz-any(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input:is(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem transparent,0 .2rem .4rem transparent;color:var(--md-primary-bg-color);display:block;left:0;position:-webkit-sticky;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2);transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.1875em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo :-webkit-any(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}.md-header__button.md-logo :-moz-any(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}.md-header__button.md-logo :is(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem}[dir=ltr] .md-header__title{margin-left:1rem}[dir=rtl] .md-header__title{margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo :-webkit-any(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__title .md-nav__button.md-logo :-moz-any(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__title .md-nav__button.md-logo :is(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__item{padding:0 .6rem}[dir=ltr] .md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-left:0}.md-nav__link{align-items:center;cursor:pointer;display:flex;justify-content:space-between;margin-top:.625em;overflow:hidden;scroll-snap-align:start;text-overflow:ellipsis;transition:color 125ms}.md-nav__link--passed{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active{color:var(--md-typeset-a-color)}.md-nav__item .md-nav__link--index [href]{width:100%}.md-nav__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__link>*{cursor:pointer;display:flex}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.1875em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary :-webkit-any(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary :-moz-any(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary :is(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest);padding:0}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.9375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}}@media screen and (min-width:76.25em){.md-nav{transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon,.md-nav__toggle~.md-nav{display:none}.md-nav__toggle:-webkit-any(:checked,:indeterminate)~.md-nav{display:block}.md-nav__toggle:-moz-any(:checked,:indeterminate)~.md-nav{display:block}.md-nav__toggle:is(:checked,:indeterminate)~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700;pointer-events:none}.md-nav__item--section>.md-nav__link--index [href]{pointer-events:auto}.md-nav__item--section>.md-nav__link .md-nav__icon{display:none}.md-nav__item--section>.md-nav{display:block}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;float:right;height:.9rem;transition:background-color .25s,transform .25s;width:.9rem}[dir=rtl] .md-nav__icon{float:left;transform:rotate(180deg)}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:-.1rem;width:100%}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__list>.md-nav__item--nested,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block;padding:0}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{font-weight:700;margin-top:0;padding:0 .6rem;pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link--index [href]{pointer-events:auto}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link .md-nav__icon{display:none}.md-nav--lifted .md-nav[data-md-level="1"]{display:block}[dir=ltr] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-right:.6rem}[dir=rtl] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-left:.6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:rgba(0,0,0,.54);cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){.md-search__inner{float:right;padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}[dir=rtl] .md-search__inner{float:left}}@media screen and (min-width:60em) and (max-width:76.1875em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem transparent;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:rgba(0,0,0,.26);border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:hsla(0,0%,100%,.12)}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem rgba(0,0,0,.07);color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:transparent;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::-ms-input-placeholder{-ms-transition:color .25s;transition:color .25s}.md-search__input::placeholder{transition:color .25s}.md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.9375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::-ms-input-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:var(--md-default-fg-color--light)}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>*{margin-left:.2rem}[dir=rtl] .md-search__options>*{margin-right:.2rem}.md-search__options>*{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>*{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.9375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) transparent;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:is(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more summary{color:var(--md-typeset-a-color);cursor:pointer;display:block;font-size:.64rem;outline:none;padding:.75em .8rem;scroll-snap-align:start;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more summary{padding-left:2.2rem}[dir=rtl] .md-search-result__more summary{padding-right:2.2rem}}.md-search-result__more summary:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary:is(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary::marker{display:none}.md-search-result__more summary::-webkit-details-marker{display:none}.md-search-result__more summary~*>*{opacity:.65}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}.md-search-result__article--document .md-search-result__title{font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.9375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result__title{font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result__teaser{-webkit-box-orient:vertical;-webkit-line-clamp:2;color:var(--md-default-fg-color--light);display:-webkit-box;font-size:.64rem;line-height:1.6;margin:.5em 0;max-height:2rem;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width:44.9375em){.md-search-result__teaser{-webkit-line-clamp:3;max-height:3rem}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-search-result__teaser{-webkit-line-clamp:3;max-height:3rem}}.md-search-result__teaser mark{background-color:initial;text-decoration:underline}.md-search-result__terms{font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color)}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:-webkit-any(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);-webkit-transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms;transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select:-moz-any(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);-moz-transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms;transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select:is(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid transparent;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid transparent;border-right:.2rem solid transparent;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:-webkit-sticky;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.1875em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;-ms-scroll-snap-type:none;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) transparent;scrollbar-width:thin}.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@media screen and (max-width:76.1875em){.md-overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@-webkit-keyframes facts{0%{height:0}to{height:.65rem}}@keyframes facts{0%{height:0}to{height:.65rem}}@-webkit-keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{-webkit-animation:facts .25s ease-in;animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{-webkit-animation:fact .4s ease-out;animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.1875em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;list-style:none;margin:0;padding:0;white-space:nowrap}.md-tabs__item{display:inline-block;height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link--active,.md-tabs__link:-webkit-any(:focus,:hover){color:inherit;opacity:1}.md-tabs__link--active,.md-tabs__link:-moz-any(:focus,:hover){color:inherit;opacity:1}.md-tabs__link--active,.md-tabs__link:is(:focus,:hover){color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}.md-tags{margin-bottom:.75em}[dir=ltr] .md-tag{margin-right:.5em}[dir=rtl] .md-tag{margin-left:.5em}.md-tag{background:var(--md-default-fg-color--lightest);border-radius:.4rem;display:inline-block;font-size:.64rem;font-weight:700;line-height:1.6;margin-bottom:.5em;padding:.3125em .9375em}.md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-tag[href]:focus,.md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-tag{vertical-align:text-top}@-webkit-keyframes pulse{0%{box-shadow:0 0 0 0 var(--md-default-fg-color--lightest);transform:scale(.95)}75%{box-shadow:0 0 0 .625em transparent;transform:scale(1)}to{box-shadow:0 0 0 0 transparent;transform:scale(.95)}}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--md-default-fg-color--lightest);transform:scale(.95)}75%{box-shadow:0 0 0 .625em transparent;transform:scale(1)}to{box-shadow:0 0 0 0 transparent;transform:scale(.95)}}:root{--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-height:0;max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,max-height 0ms .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}:focus-within>.md-tooltip{max-height:1000%;opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height .25s,z-index 0ms}.focus-visible>.md-tooltip{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{outline:none;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}.md-annotation:not([hidden]){display:inline-block;line-height:1.325}.md-annotation:focus-within>*{z-index:2}.md-annotation__inner{font-family:var(--md-text-font-family);top:calc(var(--md-tooltip-y) + 1.2ch)}:not(:focus-within)>.md-annotation__inner{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-annotation__index{color:#fff;cursor:pointer;margin:0 1ch;position:relative;transition:z-index .25s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:0}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);border-radius:2ch;content:"";height:2.2ch;left:-.126em;margin:0 -.4ch;padding:0 .4ch;position:absolute;transition:color .25s,background-color .25s;width:calc(100% + 1.2ch);width:max(2.2ch,100% + 1.2ch);z-index:-1}@media not all and (prefers-reduced-motion){[data-md-visible]>.md-annotation__index:after{-webkit-animation:pulse 2s infinite;animation:pulse 2s infinite}}:-webkit-any(:focus-within,:hover)>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}:-moz-any(:focus-within,:hover)>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}:is(:focus-within,:hover)>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}:focus-within>.md-annotation__index:after{-webkit-animation:none;animation:none;transition:color .25s,background-color .25s}.md-annotation__index [data-md-annotation-id]{display:inline-block;line-height:90%}.md-annotation__index [data-md-annotation-id]:before{content:attr(data-md-annotation-id);display:inline-block;padding-bottom:.1em;transform:scale(1.15);transition:transform .4s cubic-bezier(.1,.7,.1,1);vertical-align:.065em}@media not print{.md-annotation__index [data-md-annotation-id]:before{content:"+"}:focus-within>.md-annotation__index [data-md-annotation-id]:before{transform:scale(1.25) rotate(45deg)}}:-webkit-any(:focus-within,:hover)>.md-annotation__index{color:var(--md-accent-bg-color)}:-moz-any(:focus-within,:hover)>.md-annotation__index{color:var(--md-accent-bg-color)}:is(:focus-within,:hover)>.md-annotation__index{color:var(--md-accent-bg-color)}:focus-within>.md-annotation__index{-webkit-animation:none;animation:none;transition:none}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top:is(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@-webkit-keyframes hoverfix{0%{pointer-events:none}}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:-webkit-any(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;-webkit-transition:max-height 0ms,opacity .25s;transition:max-height 0ms,opacity .25s}.md-version:-moz-any(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;-moz-transition:max-height 0ms,opacity .25s;transition:max-height 0ms,opacity .25s}.md-version:is(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (pointer:coarse){.md-version:hover .md-version__list{-webkit-animation:hoverfix .25s forwards;animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{-webkit-animation:none;animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset :-webkit-any(.admonition,details){background-color:var(--md-admonition-bg-color);border:0 solid #448aff;border-radius:.1rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid}.md-typeset :-moz-any(.admonition,details){background-color:var(--md-admonition-bg-color);border:0 solid #448aff;border-radius:.1rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid}[dir=ltr] .md-typeset :-webkit-any(.admonition,details){border-left-width:.2rem}[dir=ltr] .md-typeset :-moz-any(.admonition,details){border-left-width:.2rem}[dir=ltr] .md-typeset :is(.admonition,details){border-left-width:.2rem}[dir=rtl] .md-typeset :-webkit-any(.admonition,details){border-right-width:.2rem}[dir=rtl] .md-typeset :-moz-any(.admonition,details){border-right-width:.2rem}[dir=rtl] .md-typeset :is(.admonition,details){border-right-width:.2rem}.md-typeset :is(.admonition,details){background-color:var(--md-admonition-bg-color);border:0 solid #448aff;border-radius:.1rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid}@media print{.md-typeset :-webkit-any(.admonition,details){box-shadow:none}.md-typeset :-moz-any(.admonition,details){box-shadow:none}.md-typeset :is(.admonition,details){box-shadow:none}}.md-typeset :-webkit-any(.admonition,details)>*{box-sizing:border-box}.md-typeset :-moz-any(.admonition,details)>*{box-sizing:border-box}.md-typeset :is(.admonition,details)>*{box-sizing:border-box}.md-typeset :-webkit-any(.admonition,details) :-webkit-any(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset :-moz-any(.admonition,details) :-moz-any(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset :is(.admonition,details) :is(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset :-webkit-any(.admonition,details) .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset :-moz-any(.admonition,details) .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset :is(.admonition,details) .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset :-webkit-any(.admonition,details) .md-typeset__table{padding:0 .6rem}.md-typeset :-moz-any(.admonition,details) .md-typeset__table{padding:0 .6rem}.md-typeset :is(.admonition,details) .md-typeset__table{padding:0 .6rem}.md-typeset :-webkit-any(.admonition,details)>.tabbed-set:only-child{margin-top:0}.md-typeset :-moz-any(.admonition,details)>.tabbed-set:only-child{margin-top:0}.md-typeset :is(.admonition,details)>.tabbed-set:only-child{margin-top:0}html .md-typeset :-webkit-any(.admonition,details)>:last-child{margin-bottom:.6rem}html .md-typeset :-moz-any(.admonition,details)>:last-child{margin-bottom:.6rem}html .md-typeset :is(.admonition,details)>:last-child{margin-bottom:.6rem}.md-typeset :-webkit-any(.admonition-title,summary){background-color:rgba(68,138,255,.1);border:none;font-weight:700;margin-bottom:0;margin-top:0;padding-bottom:.4rem;padding-top:.4rem;position:relative}.md-typeset :-moz-any(.admonition-title,summary){background-color:rgba(68,138,255,.1);border:none;font-weight:700;margin-bottom:0;margin-top:0;padding-bottom:.4rem;padding-top:.4rem;position:relative}[dir=ltr] .md-typeset :-webkit-any(.admonition-title,summary){margin-left:-.8rem;margin-right:-.6rem}[dir=ltr] .md-typeset :-moz-any(.admonition-title,summary){margin-left:-.8rem;margin-right:-.6rem}[dir=ltr] .md-typeset :is(.admonition-title,summary){margin-left:-.8rem;margin-right:-.6rem}[dir=rtl] .md-typeset :-webkit-any(.admonition-title,summary){margin-left:-.6rem;margin-right:-.8rem}[dir=rtl] .md-typeset :-moz-any(.admonition-title,summary){margin-left:-.6rem;margin-right:-.8rem}[dir=rtl] .md-typeset :is(.admonition-title,summary){margin-left:-.6rem;margin-right:-.8rem}[dir=ltr] .md-typeset :-webkit-any(.admonition-title,summary){padding-left:2.2rem;padding-right:.6rem}[dir=ltr] .md-typeset :-moz-any(.admonition-title,summary){padding-left:2.2rem;padding-right:.6rem}[dir=ltr] .md-typeset :is(.admonition-title,summary){padding-left:2.2rem;padding-right:.6rem}[dir=rtl] .md-typeset :-webkit-any(.admonition-title,summary){padding-left:.6rem;padding-right:2.2rem}[dir=rtl] .md-typeset :-moz-any(.admonition-title,summary){padding-left:.6rem;padding-right:2.2rem}[dir=rtl] .md-typeset :is(.admonition-title,summary){padding-left:.6rem;padding-right:2.2rem}[dir=ltr] .md-typeset :-webkit-any(.admonition-title,summary){border-left-width:.2rem}[dir=ltr] .md-typeset :-moz-any(.admonition-title,summary){border-left-width:.2rem}[dir=ltr] .md-typeset :is(.admonition-title,summary){border-left-width:.2rem}[dir=rtl] .md-typeset :-webkit-any(.admonition-title,summary){border-right-width:.2rem}[dir=rtl] .md-typeset :-moz-any(.admonition-title,summary){border-right-width:.2rem}[dir=rtl] .md-typeset :is(.admonition-title,summary){border-right-width:.2rem}[dir=ltr] .md-typeset :-webkit-any(.admonition-title,summary){border-top-left-radius:.1rem}[dir=ltr] .md-typeset :-moz-any(.admonition-title,summary){border-top-left-radius:.1rem}[dir=ltr] .md-typeset :is(.admonition-title,summary){border-top-left-radius:.1rem}[dir=rtl] .md-typeset :-webkit-any(.admonition-title,summary){border-top-right-radius:.1rem}[dir=rtl] .md-typeset :-moz-any(.admonition-title,summary){border-top-right-radius:.1rem}[dir=rtl] .md-typeset :is(.admonition-title,summary){border-top-right-radius:.1rem}[dir=ltr] .md-typeset :-webkit-any(.admonition-title,summary){border-top-right-radius:.1rem}[dir=ltr] .md-typeset :-moz-any(.admonition-title,summary){border-top-right-radius:.1rem}[dir=ltr] .md-typeset :is(.admonition-title,summary){border-top-right-radius:.1rem}[dir=rtl] .md-typeset :-webkit-any(.admonition-title,summary){border-top-left-radius:.1rem}[dir=rtl] .md-typeset :-moz-any(.admonition-title,summary){border-top-left-radius:.1rem}[dir=rtl] .md-typeset :is(.admonition-title,summary){border-top-left-radius:.1rem}.md-typeset :is(.admonition-title,summary){background-color:rgba(68,138,255,.1);border:none;font-weight:700;margin-bottom:0;margin-top:0;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset :-webkit-any(.admonition-title,summary):last-child{margin-bottom:0}html .md-typeset :-moz-any(.admonition-title,summary):last-child{margin-bottom:0}html .md-typeset :is(.admonition-title,summary):last-child{margin-bottom:0}.md-typeset :-webkit-any(.admonition-title,summary):before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset :-moz-any(.admonition-title,summary):before{background-color:#448aff;content:"";height:1rem;mask-image:var(--md-admonition-icon--note);mask-repeat:no-repeat;mask-size:contain;position:absolute;top:.625em;width:1rem}[dir=ltr] .md-typeset :-webkit-any(.admonition-title,summary):before{left:.8rem}[dir=ltr] .md-typeset :-moz-any(.admonition-title,summary):before{left:.8rem}[dir=ltr] .md-typeset :is(.admonition-title,summary):before{left:.8rem}[dir=rtl] .md-typeset :-webkit-any(.admonition-title,summary):before{right:.8rem}[dir=rtl] .md-typeset :-moz-any(.admonition-title,summary):before{right:.8rem}[dir=rtl] .md-typeset :is(.admonition-title,summary):before{right:.8rem}.md-typeset :is(.admonition-title,summary):before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.note){border-color:#448aff}.md-typeset :-moz-any(.admonition,details):-moz-any(.note){border-color:#448aff}.md-typeset :is(.admonition,details):is(.note){border-color:#448aff}.md-typeset :-webkit-any(.note)>:-webkit-any(.admonition-title,summary){background-color:rgba(68,138,255,.1)}.md-typeset :-moz-any(.note)>:-moz-any(.admonition-title,summary){background-color:rgba(68,138,255,.1)}.md-typeset :is(.note)>:is(.admonition-title,summary){background-color:rgba(68,138,255,.1)}.md-typeset :-webkit-any(.note)>:-webkit-any(.admonition-title,summary):before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.note)>:-moz-any(.admonition-title,summary):before{background-color:#448aff;mask-image:var(--md-admonition-icon--note);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.note)>:is(.admonition-title,summary):before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :-moz-any(.admonition,details):-moz-any(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :is(.admonition,details):is(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :-webkit-any(.abstract,.summary,.tldr)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,176,255,.1)}.md-typeset :-moz-any(.abstract,.summary,.tldr)>:-moz-any(.admonition-title,summary){background-color:rgba(0,176,255,.1)}.md-typeset :is(.abstract,.summary,.tldr)>:is(.admonition-title,summary){background-color:rgba(0,176,255,.1)}.md-typeset :-webkit-any(.abstract,.summary,.tldr)>:-webkit-any(.admonition-title,summary):before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.abstract,.summary,.tldr)>:-moz-any(.admonition-title,summary):before{background-color:#00b0ff;mask-image:var(--md-admonition-icon--abstract);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.abstract,.summary,.tldr)>:is(.admonition-title,summary):before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.info,.todo){border-color:#00b8d4}.md-typeset :-moz-any(.admonition,details):-moz-any(.info,.todo){border-color:#00b8d4}.md-typeset :is(.admonition,details):is(.info,.todo){border-color:#00b8d4}.md-typeset :-webkit-any(.info,.todo)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,184,212,.1)}.md-typeset :-moz-any(.info,.todo)>:-moz-any(.admonition-title,summary){background-color:rgba(0,184,212,.1)}.md-typeset :is(.info,.todo)>:is(.admonition-title,summary){background-color:rgba(0,184,212,.1)}.md-typeset :-webkit-any(.info,.todo)>:-webkit-any(.admonition-title,summary):before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.info,.todo)>:-moz-any(.admonition-title,summary):before{background-color:#00b8d4;mask-image:var(--md-admonition-icon--info);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.info,.todo)>:is(.admonition-title,summary):before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :-moz-any(.admonition,details):-moz-any(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :is(.admonition,details):is(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :-webkit-any(.tip,.hint,.important)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,191,165,.1)}.md-typeset :-moz-any(.tip,.hint,.important)>:-moz-any(.admonition-title,summary){background-color:rgba(0,191,165,.1)}.md-typeset :is(.tip,.hint,.important)>:is(.admonition-title,summary){background-color:rgba(0,191,165,.1)}.md-typeset :-webkit-any(.tip,.hint,.important)>:-webkit-any(.admonition-title,summary):before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.tip,.hint,.important)>:-moz-any(.admonition-title,summary):before{background-color:#00bfa5;mask-image:var(--md-admonition-icon--tip);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.tip,.hint,.important)>:is(.admonition-title,summary):before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.success,.check,.done){border-color:#00c853}.md-typeset :-moz-any(.admonition,details):-moz-any(.success,.check,.done){border-color:#00c853}.md-typeset :is(.admonition,details):is(.success,.check,.done){border-color:#00c853}.md-typeset :-webkit-any(.success,.check,.done)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,200,83,.1)}.md-typeset :-moz-any(.success,.check,.done)>:-moz-any(.admonition-title,summary){background-color:rgba(0,200,83,.1)}.md-typeset :is(.success,.check,.done)>:is(.admonition-title,summary){background-color:rgba(0,200,83,.1)}.md-typeset :-webkit-any(.success,.check,.done)>:-webkit-any(.admonition-title,summary):before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.success,.check,.done)>:-moz-any(.admonition-title,summary):before{background-color:#00c853;mask-image:var(--md-admonition-icon--success);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.success,.check,.done)>:is(.admonition-title,summary):before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.question,.help,.faq){border-color:#64dd17}.md-typeset :-moz-any(.admonition,details):-moz-any(.question,.help,.faq){border-color:#64dd17}.md-typeset :is(.admonition,details):is(.question,.help,.faq){border-color:#64dd17}.md-typeset :-webkit-any(.question,.help,.faq)>:-webkit-any(.admonition-title,summary){background-color:rgba(100,221,23,.1)}.md-typeset :-moz-any(.question,.help,.faq)>:-moz-any(.admonition-title,summary){background-color:rgba(100,221,23,.1)}.md-typeset :is(.question,.help,.faq)>:is(.admonition-title,summary){background-color:rgba(100,221,23,.1)}.md-typeset :-webkit-any(.question,.help,.faq)>:-webkit-any(.admonition-title,summary):before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.question,.help,.faq)>:-moz-any(.admonition-title,summary):before{background-color:#64dd17;mask-image:var(--md-admonition-icon--question);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.question,.help,.faq)>:is(.admonition-title,summary):before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :-moz-any(.admonition,details):-moz-any(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :is(.admonition,details):is(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :-webkit-any(.warning,.caution,.attention)>:-webkit-any(.admonition-title,summary){background-color:rgba(255,145,0,.1)}.md-typeset :-moz-any(.warning,.caution,.attention)>:-moz-any(.admonition-title,summary){background-color:rgba(255,145,0,.1)}.md-typeset :is(.warning,.caution,.attention)>:is(.admonition-title,summary){background-color:rgba(255,145,0,.1)}.md-typeset :-webkit-any(.warning,.caution,.attention)>:-webkit-any(.admonition-title,summary):before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.warning,.caution,.attention)>:-moz-any(.admonition-title,summary):before{background-color:#ff9100;mask-image:var(--md-admonition-icon--warning);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.warning,.caution,.attention)>:is(.admonition-title,summary):before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :-moz-any(.admonition,details):-moz-any(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :is(.admonition,details):is(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :-webkit-any(.failure,.fail,.missing)>:-webkit-any(.admonition-title,summary){background-color:rgba(255,82,82,.1)}.md-typeset :-moz-any(.failure,.fail,.missing)>:-moz-any(.admonition-title,summary){background-color:rgba(255,82,82,.1)}.md-typeset :is(.failure,.fail,.missing)>:is(.admonition-title,summary){background-color:rgba(255,82,82,.1)}.md-typeset :-webkit-any(.failure,.fail,.missing)>:-webkit-any(.admonition-title,summary):before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.failure,.fail,.missing)>:-moz-any(.admonition-title,summary):before{background-color:#ff5252;mask-image:var(--md-admonition-icon--failure);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.failure,.fail,.missing)>:is(.admonition-title,summary):before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.danger,.error){border-color:#ff1744}.md-typeset :-moz-any(.admonition,details):-moz-any(.danger,.error){border-color:#ff1744}.md-typeset :is(.admonition,details):is(.danger,.error){border-color:#ff1744}.md-typeset :-webkit-any(.danger,.error)>:-webkit-any(.admonition-title,summary){background-color:rgba(255,23,68,.1)}.md-typeset :-moz-any(.danger,.error)>:-moz-any(.admonition-title,summary){background-color:rgba(255,23,68,.1)}.md-typeset :is(.danger,.error)>:is(.admonition-title,summary){background-color:rgba(255,23,68,.1)}.md-typeset :-webkit-any(.danger,.error)>:-webkit-any(.admonition-title,summary):before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.danger,.error)>:-moz-any(.admonition-title,summary):before{background-color:#ff1744;mask-image:var(--md-admonition-icon--danger);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.danger,.error)>:is(.admonition-title,summary):before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.bug){border-color:#f50057}.md-typeset :-moz-any(.admonition,details):-moz-any(.bug){border-color:#f50057}.md-typeset :is(.admonition,details):is(.bug){border-color:#f50057}.md-typeset :-webkit-any(.bug)>:-webkit-any(.admonition-title,summary){background-color:rgba(245,0,87,.1)}.md-typeset :-moz-any(.bug)>:-moz-any(.admonition-title,summary){background-color:rgba(245,0,87,.1)}.md-typeset :is(.bug)>:is(.admonition-title,summary){background-color:rgba(245,0,87,.1)}.md-typeset :-webkit-any(.bug)>:-webkit-any(.admonition-title,summary):before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.bug)>:-moz-any(.admonition-title,summary):before{background-color:#f50057;mask-image:var(--md-admonition-icon--bug);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.bug)>:is(.admonition-title,summary):before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.example){border-color:#7c4dff}.md-typeset :-moz-any(.admonition,details):-moz-any(.example){border-color:#7c4dff}.md-typeset :is(.admonition,details):is(.example){border-color:#7c4dff}.md-typeset :-webkit-any(.example)>:-webkit-any(.admonition-title,summary){background-color:rgba(124,77,255,.1)}.md-typeset :-moz-any(.example)>:-moz-any(.admonition-title,summary){background-color:rgba(124,77,255,.1)}.md-typeset :is(.example)>:is(.admonition-title,summary){background-color:rgba(124,77,255,.1)}.md-typeset :-webkit-any(.example)>:-webkit-any(.admonition-title,summary):before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.example)>:-moz-any(.admonition-title,summary):before{background-color:#7c4dff;mask-image:var(--md-admonition-icon--example);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.example)>:is(.admonition-title,summary):before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.quote,.cite){border-color:#9e9e9e}.md-typeset :-moz-any(.admonition,details):-moz-any(.quote,.cite){border-color:#9e9e9e}.md-typeset :is(.admonition,details):is(.quote,.cite){border-color:#9e9e9e}.md-typeset :-webkit-any(.quote,.cite)>:-webkit-any(.admonition-title,summary){background-color:hsla(0,0%,62%,.1)}.md-typeset :-moz-any(.quote,.cite)>:-moz-any(.admonition-title,summary){background-color:hsla(0,0%,62%,.1)}.md-typeset :is(.quote,.cite)>:is(.admonition-title,summary){background-color:hsla(0,0%,62%,.1)}.md-typeset :-webkit-any(.quote,.cite)>:-webkit-any(.admonition-title,summary):before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset :-moz-any(.quote,.cite)>:-moz-any(.admonition-title,summary):before{background-color:#9e9e9e;mask-image:var(--md-admonition-icon--quote);mask-repeat:no-repeat;mask-size:contain}.md-typeset :is(.quote,.cite)>:is(.admonition-title,summary):before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:-webkit-any(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li:-moz-any(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li:is(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :-webkit-any(:hover,:target)>.headerlink{opacity:1;-webkit-transition:color .25s,opacity 125ms;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset :-moz-any(:hover,:target)>.headerlink{opacity:1;-moz-transition:color .25s,opacity 125ms;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset :is(:hover,:target)>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:-webkit-any(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset .headerlink:-moz-any(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset .headerlink:is(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset :-webkit-any(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset :-moz-any(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset :is(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.9375em){.md-typeset div.arithmatex{margin:0 -.8rem}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto;width:-webkit-min-content;width:-moz-min-content;width:min-content}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset :-webkit-any(del,ins,.comment).critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset :-moz-any(del,ins,.comment).critic{box-decoration-break:clone}.md-typeset :is(del,ins,.comment).critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset :-webkit-any(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :-moz-any(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :is(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :-webkit-any(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.md-typeset :-moz-any(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.md-typeset :is(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.highlight :-webkit-any(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight :-moz-any(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight :is(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight :-webkit-any(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :-moz-any(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :is(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :-webkit-any(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :-moz-any(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :is(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :-webkit-any(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :-moz-any(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :is(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :-webkit-any(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :-moz-any(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :is(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :-webkit-any(.kc,.n){color:var(--md-code-hl-name-color)}.highlight :-moz-any(.kc,.n){color:var(--md-code-hl-name-color)}.highlight :is(.kc,.n){color:var(--md-code-hl-name-color)}.highlight :-webkit-any(.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :-moz-any(.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :is(.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :-webkit-any(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :-moz-any(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :is(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :-webkit-any(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :-moz-any(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :is(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :-webkit-any(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :-moz-any(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :is(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :-webkit-any(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :-moz-any(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :is(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :-webkit-any(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :-moz-any(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :is(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :-webkit-any(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight :-moz-any(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight :is(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color);display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:-webkit-sticky;position:sticky;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable :-webkit-any(tbody,td){display:block;padding:0}.highlighttable :-moz-any(tbody,td){display:block;padding:0}.highlighttable :is(tbody,td){display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;padding-right:.5882352941em}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.9375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:-webkit-any(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys kbd:-moz-any(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys kbd:is(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-accent-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid transparent;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-accent-fg-color)}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,transparent);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,transparent);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.9375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-accent-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){background-color:var(--md-accent-fg-color--transparent)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color)}.mermaid{line-height:normal;margin:1em 0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{float:left;margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}.md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}} \ No newline at end of file diff --git a/assets/stylesheets/main.69437709.min.css.map b/assets/stylesheets/main.69437709.min.css.map new file mode 100644 index 00000000..4c560661 --- /dev/null +++ b/assets/stylesheets/main.69437709.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/assets/stylesheets/main/extensions/pymdownx/_keys.scss","../../../src/assets/stylesheets/main.scss","src/assets/stylesheets/main/_resets.scss","src/assets/stylesheets/main/_colors.scss","src/assets/stylesheets/main/_icons.scss","src/assets/stylesheets/main/_typeset.scss","src/assets/stylesheets/utilities/_break.scss","src/assets/stylesheets/main/layout/_banner.scss","src/assets/stylesheets/main/layout/_base.scss","src/assets/stylesheets/main/layout/_clipboard.scss","src/assets/stylesheets/main/layout/_consent.scss","src/assets/stylesheets/main/layout/_content.scss","src/assets/stylesheets/main/layout/_dialog.scss","src/assets/stylesheets/main/layout/_feedback.scss","src/assets/stylesheets/main/layout/_footer.scss","src/assets/stylesheets/main/layout/_form.scss","src/assets/stylesheets/main/layout/_header.scss","src/assets/stylesheets/main/layout/_nav.scss","src/assets/stylesheets/main/layout/_search.scss","src/assets/stylesheets/main/layout/_select.scss","src/assets/stylesheets/main/layout/_sidebar.scss","src/assets/stylesheets/main/layout/_source.scss","src/assets/stylesheets/main/layout/_tabs.scss","src/assets/stylesheets/main/layout/_tag.scss","src/assets/stylesheets/main/layout/_tooltip.scss","src/assets/stylesheets/main/layout/_top.scss","src/assets/stylesheets/main/layout/_version.scss","src/assets/stylesheets/main/extensions/markdown/_admonition.scss","node_modules/material-design-color/material-color.scss","src/assets/stylesheets/main/extensions/markdown/_footnotes.scss","src/assets/stylesheets/main/extensions/markdown/_toc.scss","src/assets/stylesheets/main/extensions/pymdownx/_arithmatex.scss","src/assets/stylesheets/main/extensions/pymdownx/_critic.scss","src/assets/stylesheets/main/extensions/pymdownx/_details.scss","src/assets/stylesheets/main/extensions/pymdownx/_emoji.scss","src/assets/stylesheets/main/extensions/pymdownx/_highlight.scss","src/assets/stylesheets/main/extensions/pymdownx/_tabbed.scss","src/assets/stylesheets/main/extensions/pymdownx/_tasklist.scss","src/assets/stylesheets/main/integrations/_mermaid.scss","src/assets/stylesheets/main/_modifiers.scss"],"names":[],"mappings":"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CALA,UnC4lHN,CmC7kHM,aAII,6CACE,OnC4kHV,CmC7kHQ,8CACE,OnC+kHV,CmChlHQ,8CACE,OnCklHV,CmCnlHQ,8CACE,OnCqlHV,CmCtlHQ,8CACE,OnCwlHV,CmCzlHQ,8CACE,OnC2lHV,CmC5lHQ,8CACE,OnC8lHV,CmC/lHQ,8CACE,OnCimHV,CmClmHQ,8CACE,OnComHV,CmCrmHQ,+CACE,QnCumHV,CmCxmHQ,+CACE,QnC0mHV,CmC3mHQ,+CACE,QnC6mHV,CmC9mHQ,+CACE,QnCgnHV,CmCjnHQ,+CACE,QnCmnHV,CmCpnHQ,+CACE,QnCsnHV,CmCvnHQ,+CACE,QnCynHV,CmC1nHQ,+CACE,QnC4nHV,CmC7nHQ,+CACE,QnC+nHV,CmChoHQ,+CACE,QnCkoHV,CmCnoHQ,+CACE,QnCqoHV,CACF,CmChoHM,uCACE,+BnCkoHR,CmC5nHE,4BACE,UnC8nHJ,CmC3nHI,aAJF,4BAKI,gBnC8nHJ,CACF,CmC1nHE,0BACE,YnC4nHJ,CmCznHI,aAJF,0BAKI,anC4nHJ,CmCxnHM,sCACE,OnC0nHR,CmC3nHM,uCACE,OnC6nHR,CmC9nHM,uCACE,OnCgoHR,CmCjoHM,uCACE,OnCmoHR,CmCpoHM,uCACE,OnCsoHR,CmCvoHM,uCACE,OnCyoHR,CmC1oHM,uCACE,OnC4oHR,CmC7oHM,uCACE,OnC+oHR,CmChpHM,uCACE,OnCkpHR,CmCnpHM,wCACE,QnCqpHR,CmCtpHM,wCACE,QnCwpHR,CmCzpHM,wCACE,QnC2pHR,CmC5pHM,wCACE,QnC8pHR,CmC/pHM,wCACE,QnCiqHR,CmClqHM,wCACE,QnCoqHR,CmCrqHM,wCACE,QnCuqHR,CmCxqHM,wCACE,QnC0qHR,CmC3qHM,wCACE,QnC6qHR,CmC9qHM,wCACE,QnCgrHR,CmCjrHM,wCACE,QnCmrHR,CACF,CmC7qHI,+FAEE,QnC+qHN,CmC5qHM,yGACE,wBAAA,CACA,yBnC+qHR,CmCtqHM,2DAEE,wBAAA,CACA,yBAAA,CAFA,QnC0qHR,CmCnqHM,iEACE,QnCqqHR,CmClqHQ,qLAGE,wBAAA,CACA,yBAAA,CAFA,QnCsqHV,CmChqHQ,6FACE,wBAAA,CACA,yBnCkqHV,CmC7pHM,yDACE,kBnC+pHR,CmC1pHI,sCACE,QnC4pHN,CmCvpHE,2BAEE,iBAAA,CAKA,kBAAA,CADA,uCAAA,CAEA,cAAA,CAPA,aAAA,CAGA,YAAA,CACA,gBAAA,CAKA,mBAAA,CADA,gCAAA,CANA,WnCgqHJ,CmCtpHI,iCAEE,uDAAA,CADA,+BnCypHN,CmCppHI,iCAIE,6BAAA,CAOA,UAAA,CAVA,aAAA,CAEA,WAAA,CAKA,8CAAA,CAAA,sCAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CALA,+CACE,CAJF,UnC6pHN,CmC/oHE,4BAME,+EACE,CALF,YAAA,CAGA,aAAA,CAFA,qBAAA,CAUA,mBAAA,CAZA,iBAAA,CAWA,wBAAA,CARA,YnCqpHJ,CmCzoHI,sCACE,wBnC2oHN,CmCvoHI,oCACE,SnCyoHN,CmCroHI,kCAGE,8EACE,CAFF,mBAAA,CADA,OnCyoHN,CmC/nHM,uDACE,8CAAA,CAAA,sCnCioHR,CKhvHI,wC8B6HF,wDAGE,kBnCwnHF,CmC3nHA,wDAGE,mBnCwnHF,CmC3nHA,8CAEE,eAAA,CADA,eAAA,CAGA,iCnCunHF,CmCnnHE,8DACE,mBnCsnHJ,CmCvnHE,8DACE,kBnCsnHJ,CmCvnHE,oDAEE,UnCqnHJ,CmCjnHE,8EAEE,kBnConHJ,CmCtnHE,8EAEE,mBnConHJ,CmCtnHE,8EAGE,kBnCmnHJ,CmCtnHE,8EAGE,mBnCmnHJ,CmCtnHE,oEACE,UnCqnHJ,CmC/mHE,8EAEE,mBnCknHJ,CmCpnHE,8EAEE,kBnCknHJ,CmCpnHE,8EAGE,mBnCinHJ,CmCpnHE,8EAGE,kBnCinHJ,CmCpnHE,oEACE,UnCmnHJ,CACF,CmCrmHE,cAHF,olDAII,+BnCwmHF,CmCrmHE,g8GACE,sCnCumHJ,CACF,CmClmHA,4sDACE,uDnCqmHF,CmCjmHA,wmDACE,anComHF,CoCh9HA,MACE,mVAAA,CAEA,4VpCo9HF,CoC18HE,4BAEE,oBAAA,CADA,iBpC88HJ,CoCz8HI,sDAGE,SpC28HN,CoC98HI,sDAGE,UpC28HN,CoC98HI,4CACE,iBAAA,CACA,SpC48HN,CoCt8HE,+CAEE,SAAA,CADA,UpCy8HJ,CoCp8HE,kDAGE,WpC68HJ,CoCh9HE,kDAGE,YpC68HJ,CoCh9HE,wCAME,qDAAA,CAIA,UAAA,CALA,aAAA,CAEA,0CAAA,CAAA,kCAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CARA,iBAAA,CACA,SAAA,CAEA,YpC48HJ,CoCl8HE,gEACE,wBT0Wa,CSzWb,mDAAA,CAAA,2CpCo8HJ,CqCr/HA,QACE,8DAAA,CAGA,+CAAA,CACA,iEAAA,CACA,oDAAA,CACA,sDAAA,CACA,mDrCs/HF,CqCl/HA,SAEE,kBAAA,CADA,YrCs/HF,CK71HI,mCiChKA,8BAIE,kBtCkgIJ,CsCtgIE,8BAIE,iBtCkgIJ,CsCtgIE,oBACE,UAAA,CAIA,mBAAA,CAFA,YAAA,CADA,atCogIJ,CsC9/HI,8BACE,WtCggIN,CsC5/HI,kCAEE,iBAAA,CAAA,ctC8/HN,CsChgII,kCAEE,aAAA,CAAA,kBtC8/HN,CsChgII,wBACE,WtC+/HN,CsC3/HM,kCACE,UtC6/HR,CACF","file":"main.css"} \ No newline at end of file diff --git a/assets/stylesheets/palette.cbb835fc.min.css b/assets/stylesheets/palette.cbb835fc.min.css new file mode 100644 index 00000000..30f9264c --- /dev/null +++ b/assets/stylesheets/palette.cbb835fc.min.css @@ -0,0 +1 @@ +@media screen{[data-md-color-scheme=slate]{--md-hue:232;--md-default-fg-color:hsla(var(--md-hue),75%,95%,1);--md-default-fg-color--light:hsla(var(--md-hue),75%,90%,0.62);--md-default-fg-color--lighter:hsla(var(--md-hue),75%,90%,0.32);--md-default-fg-color--lightest:hsla(var(--md-hue),75%,90%,0.12);--md-default-bg-color:hsla(var(--md-hue),15%,21%,1);--md-default-bg-color--light:hsla(var(--md-hue),15%,21%,0.54);--md-default-bg-color--lighter:hsla(var(--md-hue),15%,21%,0.26);--md-default-bg-color--lightest:hsla(var(--md-hue),15%,21%,0.07);--md-code-fg-color:hsla(var(--md-hue),18%,86%,1);--md-code-bg-color:hsla(var(--md-hue),15%,15%,1);--md-code-hl-color:rgba(66,135,255,.15);--md-code-hl-number-color:#e6695b;--md-code-hl-special-color:#f06090;--md-code-hl-function-color:#c973d9;--md-code-hl-constant-color:#9383e2;--md-code-hl-keyword-color:#6791e0;--md-code-hl-string-color:#2fb170;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-mark-color:rgba(66,135,255,.3);--md-typeset-kbd-color:hsla(var(--md-hue),15%,94%,0.12);--md-typeset-kbd-accent-color:hsla(var(--md-hue),15%,94%,0.2);--md-typeset-kbd-border-color:hsla(var(--md-hue),15%,14%,1);--md-typeset-table-color:hsla(var(--md-hue),75%,95%,0.12);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-footer-bg-color:hsla(var(--md-hue),15%,12%,0.87);--md-footer-bg-color--dark:hsla(var(--md-hue),15%,10%,1);--md-shadow-z1:0 0.2rem 0.5rem rgba(0,0,0,.2),0 0 0.05rem rgba(0,0,0,.1);--md-shadow-z2:0 0.2rem 0.5rem rgba(0,0,0,.3),0 0 0.05rem rgba(0,0,0,.25);--md-shadow-z3:0 0.2rem 0.5rem rgba(0,0,0,.4),0 0 0.05rem rgba(0,0,0,.35)}[data-md-color-scheme=slate] img[src$="#gh-light-mode-only"],[data-md-color-scheme=slate] img[src$="#only-light"]{display:none}[data-md-color-scheme=slate] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=slate] img[src$="#only-dark"]{display:initial}[data-md-color-scheme=slate][data-md-color-primary=pink]{--md-typeset-a-color:#ed5487}[data-md-color-scheme=slate][data-md-color-primary=purple]{--md-typeset-a-color:#bd78c9}[data-md-color-scheme=slate][data-md-color-primary=deep-purple]{--md-typeset-a-color:#a682e3}[data-md-color-scheme=slate][data-md-color-primary=indigo]{--md-typeset-a-color:#6c91d5}[data-md-color-scheme=slate][data-md-color-primary=teal]{--md-typeset-a-color:#00ccb8}[data-md-color-scheme=slate][data-md-color-primary=green]{--md-typeset-a-color:#71c174}[data-md-color-scheme=slate][data-md-color-primary=deep-orange]{--md-typeset-a-color:#ff9575}[data-md-color-scheme=slate][data-md-color-primary=brown]{--md-typeset-a-color:#c7846b}[data-md-color-scheme=slate][data-md-color-primary=black],[data-md-color-scheme=slate][data-md-color-primary=blue-grey],[data-md-color-scheme=slate][data-md-color-primary=grey],[data-md-color-scheme=slate][data-md-color-primary=white]{--md-typeset-a-color:#6c91d5}[data-md-color-switching] *,[data-md-color-switching] :after,[data-md-color-switching] :before{transition-duration:0ms!important}}[data-md-color-accent=red]{--md-accent-fg-color:#ff1947;--md-accent-fg-color--transparent:rgba(255,25,71,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=pink]{--md-accent-fg-color:#f50056;--md-accent-fg-color--transparent:rgba(245,0,86,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=purple]{--md-accent-fg-color:#df41fb;--md-accent-fg-color--transparent:rgba(223,65,251,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=deep-purple]{--md-accent-fg-color:#7c4dff;--md-accent-fg-color--transparent:rgba(124,77,255,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=indigo]{--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:rgba(82,108,254,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=blue]{--md-accent-fg-color:#4287ff;--md-accent-fg-color--transparent:rgba(66,135,255,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=light-blue]{--md-accent-fg-color:#0091eb;--md-accent-fg-color--transparent:rgba(0,145,235,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=cyan]{--md-accent-fg-color:#00bad6;--md-accent-fg-color--transparent:rgba(0,186,214,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=teal]{--md-accent-fg-color:#00bda4;--md-accent-fg-color--transparent:rgba(0,189,164,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=green]{--md-accent-fg-color:#00c753;--md-accent-fg-color--transparent:rgba(0,199,83,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=light-green]{--md-accent-fg-color:#63de17;--md-accent-fg-color--transparent:rgba(99,222,23,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=lime]{--md-accent-fg-color:#b0eb00;--md-accent-fg-color--transparent:rgba(176,235,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=yellow]{--md-accent-fg-color:#ffd500;--md-accent-fg-color--transparent:rgba(255,213,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=amber]{--md-accent-fg-color:#fa0;--md-accent-fg-color--transparent:rgba(255,170,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=orange]{--md-accent-fg-color:#ff9100;--md-accent-fg-color--transparent:rgba(255,145,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=deep-orange]{--md-accent-fg-color:#ff6e42;--md-accent-fg-color--transparent:rgba(255,110,66,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=red]{--md-primary-fg-color:#ef5552;--md-primary-fg-color--light:#e57171;--md-primary-fg-color--dark:#e53734;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=pink]{--md-primary-fg-color:#e92063;--md-primary-fg-color--light:#ec417a;--md-primary-fg-color--dark:#c3185d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=purple]{--md-primary-fg-color:#ab47bd;--md-primary-fg-color--light:#bb69c9;--md-primary-fg-color--dark:#8c24a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=deep-purple]{--md-primary-fg-color:#7e56c2;--md-primary-fg-color--light:#9574cd;--md-primary-fg-color--dark:#673ab6;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=indigo]{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=blue]{--md-primary-fg-color:#2094f3;--md-primary-fg-color--light:#42a5f5;--md-primary-fg-color--dark:#1975d2;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=light-blue]{--md-primary-fg-color:#02a6f2;--md-primary-fg-color--light:#28b5f6;--md-primary-fg-color--dark:#0287cf;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=cyan]{--md-primary-fg-color:#00bdd6;--md-primary-fg-color--light:#25c5da;--md-primary-fg-color--dark:#0097a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=teal]{--md-primary-fg-color:#009485;--md-primary-fg-color--light:#26a699;--md-primary-fg-color--dark:#007a6c;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=green]{--md-primary-fg-color:#4cae4f;--md-primary-fg-color--light:#68bb6c;--md-primary-fg-color--dark:#398e3d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=light-green]{--md-primary-fg-color:#8bc34b;--md-primary-fg-color--light:#9ccc66;--md-primary-fg-color--dark:#689f38;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=lime]{--md-primary-fg-color:#cbdc38;--md-primary-fg-color--light:#d3e156;--md-primary-fg-color--dark:#b0b52c;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=yellow]{--md-primary-fg-color:#ffec3d;--md-primary-fg-color--light:#ffee57;--md-primary-fg-color--dark:#fbc02d;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=amber]{--md-primary-fg-color:#ffc105;--md-primary-fg-color--light:#ffc929;--md-primary-fg-color--dark:#ffa200;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=orange]{--md-primary-fg-color:#ffa724;--md-primary-fg-color--light:#ffa724;--md-primary-fg-color--dark:#fa8900;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=deep-orange]{--md-primary-fg-color:#ff6e42;--md-primary-fg-color--light:#ff8a66;--md-primary-fg-color--dark:#f4511f;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=brown]{--md-primary-fg-color:#795649;--md-primary-fg-color--light:#8d6e62;--md-primary-fg-color--dark:#5d4037;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=grey]{--md-primary-fg-color:#757575;--md-primary-fg-color--light:#9e9e9e;--md-primary-fg-color--dark:#616161;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=blue-grey]{--md-primary-fg-color:#546d78;--md-primary-fg-color--light:#607c8a;--md-primary-fg-color--dark:#455a63;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=light-green]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#72ad2e}[data-md-color-primary=lime]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#8b990a}[data-md-color-primary=yellow]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#b8a500}[data-md-color-primary=amber]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#d19d00}[data-md-color-primary=orange]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#e68a00}[data-md-color-primary=white]{--md-primary-fg-color:#fff;--md-primary-fg-color--light:hsla(0,0%,100%,.7);--md-primary-fg-color--dark:rgba(0,0,0,.07);--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54);--md-typeset-a-color:#4051b5}@media screen and (min-width:60em){[data-md-color-primary=white] .md-search__form{background-color:rgba(0,0,0,.07)}[data-md-color-primary=white] .md-search__form:hover{background-color:rgba(0,0,0,.32)}[data-md-color-primary=white] .md-search__input+.md-search__icon{color:rgba(0,0,0,.87)}}@media screen and (min-width:76.25em){[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid rgba(0,0,0,.07)}}[data-md-color-primary=black]{--md-primary-fg-color:#000;--md-primary-fg-color--light:rgba(0,0,0,.54);--md-primary-fg-color--dark:#000;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=black] .md-header{background-color:#000}@media screen and (max-width:59.9375em){[data-md-color-primary=black] .md-nav__source{background-color:rgba(0,0,0,.87)}}@media screen and (min-width:60em){[data-md-color-primary=black] .md-search__form{background-color:hsla(0,0%,100%,.12)}[data-md-color-primary=black] .md-search__form:hover{background-color:hsla(0,0%,100%,.3)}}@media screen and (max-width:76.1875em){html [data-md-color-primary=black] .md-nav--primary .md-nav__title[for=__drawer]{background-color:#000}}@media screen and (min-width:76.25em){[data-md-color-primary=black] .md-tabs{background-color:#000}} \ No newline at end of file diff --git a/assets/stylesheets/palette.cbb835fc.min.css.map b/assets/stylesheets/palette.cbb835fc.min.css.map new file mode 100644 index 00000000..96e380c8 --- /dev/null +++ b/assets/stylesheets/palette.cbb835fc.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/assets/stylesheets/palette/_scheme.scss","../../../src/assets/stylesheets/palette.scss","src/assets/stylesheets/palette/_accent.scss","src/assets/stylesheets/palette/_primary.scss","src/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"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","file":"palette.css"} \ No newline at end of file diff --git a/bundle.yaml b/bundle.yaml new file mode 100644 index 00000000..8237e946 --- /dev/null +++ b/bundle.yaml @@ -0,0 +1,95 @@ +description: A minimal two-machine Kubernetes cluster, appropriate for development. +issues: https://bugs.launchpad.net/charmed-kubernetes-bundles +series: focal +source: https://github.com/charmed-kubernetes/bundle +website: https://ubuntu.com/kubernetes/charmed-k8s +name: kubernetes-core +machines: + '0': + constraints: cores=2 mem=8G root-disk=16G + '1': + constraints: cores=2 mem=8G root-disk=16G + '2': + constraints: cores=2 mem=8G root-disk=16G +applications: + calico: + annotations: + gui-x: '475' + gui-y: '605' + channel: stable + charm: calico + options: + vxlan: Always + containerd: + annotations: + gui-x: '475' + gui-y: '800' + channel: stable + charm: containerd + easyrsa: + annotations: + gui-x: '90' + gui-y: '420' + channel: stable + charm: easyrsa + num_units: 1 + to: + - '2' + etcd: + annotations: + gui-x: '800' + gui-y: '420' + channel: stable + charm: etcd + num_units: 1 + options: + channel: 3.4/stable + to: + - '0' + kubernetes-control-plane: + annotations: + gui-x: '800' + gui-y: '850' + channel: stable + charm: kubernetes-control-plane + constraints: cores=2 mem=8G root-disk=16G + expose: true + num_units: 1 + options: + channel: 1.25/stable + to: + - '0' + kubernetes-worker: + annotations: + gui-x: '90' + gui-y: '850' + channel: stable + charm: kubernetes-worker + constraints: cores=2 mem=8G root-disk=16G + expose: true + num_units: 1 + options: + channel: 1.25/stable + to: + - '1' +relations: +- - kubernetes-control-plane:kube-control + - kubernetes-worker:kube-control +- - kubernetes-control-plane:certificates + - easyrsa:client +- - kubernetes-control-plane:etcd + - etcd:db +- - kubernetes-worker:certificates + - easyrsa:client +- - etcd:certificates + - easyrsa:client +- - calico:etcd + - etcd:db +- - calico:cni + - kubernetes-control-plane:cni +- - calico:cni + - kubernetes-worker:cni +- - containerd:containerd + - kubernetes-worker:container-runtime +- - containerd:containerd + - kubernetes-control-plane:container-runtime \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..78fd0423 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ + Nuvem - Computação em Nuvem - 2024/1

    Bem vindo a disciplina Computacao em Nuvem

    Aqui vamos manter os roteiros de aula para facilitar o acesso ao conteudo.

    Roteiros Projetos
    \ No newline at end of file diff --git a/license/index.html b/license/index.html new file mode 100644 index 00000000..ae2f0941 --- /dev/null +++ b/license/index.html @@ -0,0 +1 @@ + License - Computação em Nuvem - 2024/1

    License

    MIT License

    Copyright © 2016-2022 Martin Donath

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    \ No newline at end of file diff --git a/overrides/assets/javascripts/bundle.a163e2c4.min.js b/overrides/assets/javascripts/bundle.a163e2c4.min.js new file mode 100644 index 00000000..12c20a71 --- /dev/null +++ b/overrides/assets/javascripts/bundle.a163e2c4.min.js @@ -0,0 +1,18 @@ +"use strict";(()=>{var Zn=Object.create;var Fr=Object.defineProperty;var eo=Object.getOwnPropertyDescriptor;var ro=Object.getOwnPropertyNames,ot=Object.getOwnPropertySymbols,to=Object.getPrototypeOf,at=Object.prototype.hasOwnProperty,no=Object.prototype.propertyIsEnumerable;var it=(e,r,t)=>r in e?Fr(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,Qe=(e,r)=>{for(var t in r||(r={}))at.call(r,t)&&it(e,t,r[t]);if(ot)for(var t of ot(r))no.call(r,t)&&it(e,t,r[t]);return e};var ve=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports);var oo=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of ro(r))!at.call(e,o)&&o!==t&&Fr(e,o,{get:()=>r[o],enumerable:!(n=eo(r,o))||n.enumerable});return e};var kr=(e,r,t)=>(t=e!=null?Zn(to(e)):{},oo(r||!e||!e.__esModule?Fr(t,"default",{value:e,enumerable:!0}):t,e));var At=ve((ui,Je)=>{/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */var st,ut,ft,ct,lt,pt,mt,ht,dt,Ke,Hr,vt,bt,yt,Oe,xt,gt,wt,_t,St,Et,Ot,Tt,Ye;(function(e){var r=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(n){e(t(r,t(n)))}):typeof Je=="object"&&typeof Je.exports=="object"?e(t(r,t(Je.exports))):e(t(r));function t(n,o){return n!==r&&(typeof Object.create=="function"?Object.defineProperty(n,"__esModule",{value:!0}):n.__esModule=!0),function(i,s){return n[i]=o?o(i,s):s}}})(function(e){var r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])};st=function(n,o){if(typeof o!="function"&&o!==null)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");r(n,o);function i(){this.constructor=n}n.prototype=o===null?Object.create(o):(i.prototype=o.prototype,new i)},ut=Object.assign||function(n){for(var o,i=1,s=arguments.length;i=0;c--)(f=n[c])&&(a=(u<3?f(a):u>3?f(o,i,a):f(o,i))||a);return u>3&&a&&Object.defineProperty(o,i,a),a},lt=function(n,o){return function(i,s){o(i,s,n)}},pt=function(n,o){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,o)},mt=function(n,o,i,s){function u(a){return a instanceof i?a:new i(function(f){f(a)})}return new(i||(i=Promise))(function(a,f){function c(h){try{l(s.next(h))}catch(d){f(d)}}function p(h){try{l(s.throw(h))}catch(d){f(d)}}function l(h){h.done?a(h.value):u(h.value).then(c,p)}l((s=s.apply(n,o||[])).next())})},ht=function(n,o){var i={label:0,sent:function(){if(a[0]&1)throw a[1];return a[1]},trys:[],ops:[]},s,u,a,f;return f={next:c(0),throw:c(1),return:c(2)},typeof Symbol=="function"&&(f[Symbol.iterator]=function(){return this}),f;function c(l){return function(h){return p([l,h])}}function p(l){if(s)throw new TypeError("Generator is already executing.");for(;i;)try{if(s=1,u&&(a=l[0]&2?u.return:l[0]?u.throw||((a=u.return)&&a.call(u),0):u.next)&&!(a=a.call(u,l[1])).done)return a;switch(u=0,a&&(l=[l[0]&2,a.value]),l[0]){case 0:case 1:a=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,u=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(a=i.trys,!(a=a.length>0&&a[a.length-1])&&(l[0]===6||l[0]===2)){i=0;continue}if(l[0]===3&&(!a||l[1]>a[0]&&l[1]=n.length&&(n=void 0),{value:n&&n[s++],done:!n}}};throw new TypeError(o?"Object is not iterable.":"Symbol.iterator is not defined.")},Hr=function(n,o){var i=typeof Symbol=="function"&&n[Symbol.iterator];if(!i)return n;var s=i.call(n),u,a=[],f;try{for(;(o===void 0||o-- >0)&&!(u=s.next()).done;)a.push(u.value)}catch(c){f={error:c}}finally{try{u&&!u.done&&(i=s.return)&&i.call(s)}finally{if(f)throw f.error}}return a},vt=function(){for(var n=[],o=0;o1||c(m,b)})})}function c(m,b){try{p(s[m](b))}catch(w){d(a[0][3],w)}}function p(m){m.value instanceof Oe?Promise.resolve(m.value.v).then(l,h):d(a[0][2],m)}function l(m){c("next",m)}function h(m){c("throw",m)}function d(m,b){m(b),a.shift(),a.length&&c(a[0][0],a[0][1])}},gt=function(n){var o,i;return o={},s("next"),s("throw",function(u){throw u}),s("return"),o[Symbol.iterator]=function(){return this},o;function s(u,a){o[u]=n[u]?function(f){return(i=!i)?{value:Oe(n[u](f)),done:u==="return"}:a?a(f):f}:a}},wt=function(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var o=n[Symbol.asyncIterator],i;return o?o.call(n):(n=typeof Ke=="function"?Ke(n):n[Symbol.iterator](),i={},s("next"),s("throw"),s("return"),i[Symbol.asyncIterator]=function(){return this},i);function s(a){i[a]=n[a]&&function(f){return new Promise(function(c,p){f=n[a](f),u(c,p,f.done,f.value)})}}function u(a,f,c,p){Promise.resolve(p).then(function(l){a({value:l,done:c})},f)}},_t=function(n,o){return Object.defineProperty?Object.defineProperty(n,"raw",{value:o}):n.raw=o,n};var t=Object.create?function(n,o){Object.defineProperty(n,"default",{enumerable:!0,value:o})}:function(n,o){n.default=o};St=function(n){if(n&&n.__esModule)return n;var o={};if(n!=null)for(var i in n)i!=="default"&&Object.prototype.hasOwnProperty.call(n,i)&&Ye(o,n,i);return t(o,n),o},Et=function(n){return n&&n.__esModule?n:{default:n}},Ot=function(n,o,i,s){if(i==="a"&&!s)throw new TypeError("Private accessor was defined without a getter");if(typeof o=="function"?n!==o||!s:!o.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?s:i==="a"?s.call(n):s?s.value:o.get(n)},Tt=function(n,o,i,s,u){if(s==="m")throw new TypeError("Private method is not writable");if(s==="a"&&!u)throw new TypeError("Private accessor was defined without a setter");if(typeof o=="function"?n!==o||!u:!o.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return s==="a"?u.call(n,i):u?u.value=i:o.set(n,i),i},e("__extends",st),e("__assign",ut),e("__rest",ft),e("__decorate",ct),e("__param",lt),e("__metadata",pt),e("__awaiter",mt),e("__generator",ht),e("__exportStar",dt),e("__createBinding",Ye),e("__values",Ke),e("__read",Hr),e("__spread",vt),e("__spreadArrays",bt),e("__spreadArray",yt),e("__await",Oe),e("__asyncGenerator",xt),e("__asyncDelegator",gt),e("__asyncValues",wt),e("__makeTemplateObject",_t),e("__importStar",St),e("__importDefault",Et),e("__classPrivateFieldGet",Ot),e("__classPrivateFieldSet",Tt)})});var $e=ve(Y=>{(function(){var e,r,t,n,o,i,s,u,a,f,c,p,l,h,d,m,b,w,S,P;P=150,f=20,S=150,a=.75,Y.score=function(v,y,_){var O,x,g,T;return x=_.preparedQuery,O=_.allowErrors,O||o(v,x.core_lw,x.core_up)?(T=v.toLowerCase(),g=r(v,T,x),Math.ceil(g)):0},Y.isMatch=o=function(v,y,_){var O,x,g,T,R,z,C;if(g=v.length,T=y.length,!g||T>g)return!1;for(O=-1,x=-1;++x-1)return d(v,y,me,oe,se,D,q);for(Ee=new Array(D),R=new Array(D),Rr=w(D,q),j=Math.ceil(a*D)+5,ne=j,C=!0,I=-1;++Iue&&(ue=Ge),z=0,oe[I]===Lr)if(Pr=u(H,v,y),z=T>0?T:l(v,y,me,oe,H,I,Pr),g=Cr+p(H,I,Pr,x,z),g>ue)ue=g,ne=j;else{if(de&&--ne<=0)return Math.max(ue,Ee[D-1])*Rr;de=!1}Cr=Ge,T=R[I],R[I]=z,Ee[I]=ue}}return ue=Ee[D-1],ue*Rr},Y.isWordStart=u=function(v,y,_){var O,x;return v===0?!0:(O=y[v],x=y[v-1],i(x)||O!==_[v]&&x===_[v-1])},Y.isWordEnd=s=function(v,y,_,O){var x,g;return v===O-1?!0:(x=y[v],g=y[v+1],i(g)||x===_[v]&&g!==_[v+1])},i=function(v){return v===" "||v==="."||v==="-"||v==="_"||v==="/"||v==="\\"},b=function(v){var y;return vx?O:x)+10):g+P*x},Y.scoreConsecutives=l=function(v,y,_,O,x,g,T){var R,z,C,H,I,q,j;for(z=v.length,H=_.length,C=z-x,I=H-g,R=C-1&&(I=u(C,v,y),I&&(x=C))),z=-1,H=0;++z1&&C>1))return t;for(x=0,j=0,ne=0,I=0,T=-1,R=-1;++R-1){j++;continue}else break;for(;++T12*R)return!1;for(g=-1;++gO)return!1;return!0}}).call(Y)});var Mr=ve(Ne=>{(function(){var e,r,t,n,o,i,s,u,a,f;f=$e(),i=f.isMatch,e=f.computeScore,u=f.scoreSize,a=20,t=2.5,Ne.score=function(c,p,l){var h,d,m,b;return d=l.preparedQuery,h=l.allowErrors,h||i(c,d.core_lw,d.core_up)?(b=c.toLowerCase(),m=e(c,b,d),m=s(c,b,m,l),Math.ceil(m)):0},s=function(c,p,l,h){var d,m,b,w,S,P,v,y,_,O;if(l===0)return 0;for(_=h.preparedQuery,O=h.useExtensionBonus,y=h.pathSeparator,S=c.length-1;c[S]===y;)S--;if(b=c.lastIndexOf(y,S),v=S-b,P=1,O&&(P+=o(p,_.ext,b,S,2),l*=P),b===-1)return l;for(w=_.depth;b>-1&&w-- >0;)b=c.lastIndexOf(y,b-1);return m=b===-1?l:P*e(c.slice(b+1,S+1),p.slice(b+1,S+1),_),d=.5*a/(a+r(c,S+1,y)),d*m+(1-d)*l*u(0,t*v)},Ne.countDir=r=function(c,p,l){var h,d;if(p<1)return 0;for(h=0,d=-1;++dl)))return 0;for(w=p.length,m=h-S,m0?.9*o(c,p,l,S-2,d-1):b/m}}).call(Ne)});var rt=ve((Hn,Wn)=>{(function(){var e,r,t,n,o,i,s,u;u=Mr(),t=u.countDir,o=u.getExtension,Wn.exports=e=function(){function a(f,c){var p,l,h;if(h=c!=null?c:{},p=h.optCharRegEx,l=h.pathSeparator,!(f&&f.length))return null;this.query=f,this.query_lw=f.toLowerCase(),this.core=r(f,p),this.core_lw=this.core.toLowerCase(),this.core_up=s(this.core),this.depth=t(f,f.length,l),this.ext=o(this.query_lw),this.charCodes=n(this.query_lw)}return a}(),i=/[ _\-:\/\\]/g,r=function(a,f){return f==null&&(f=i),a.replace(f,"")},s=function(a){var f,c,p,l;for(c="",p=0,l=a.length;p{(function(){var e,r,t,n,o;n=$e(),r=Mr(),e=rt(),t=function(i){return i.candidate},o=function(i,s){return s.score-i.score},Un.exports=function(i,s,u){var a,f,c,p,l,h,d,m,b,w,S,P,v;for(m=[],c=u.key,l=u.maxResults,p=u.maxInners,S=u.usePathScoring,b=p!=null&&p>0?p:i.length+1,a=c!=null,d=S?r:n,P=0,v=i.length;P0&&(m.push({candidate:f,score:h}),!--b))));P++);return m.sort(o),i=m.map(t),l!=null&&(i=i.slice(0,l)),i}}).call(zn)});var Vn=ve(Ir=>{(function(){var e,r,t,n,o,i,s,u,a,f;f=$e(),t=f.isMatch,n=f.isWordStart,a=f.scoreConsecutives,u=f.scoreCharacter,s=f.scoreAcronyms,Ir.match=o=function(c,p,l){var h,d,m,b,w,S;return h=l.allowErrors,w=l.preparedQuery,b=l.pathSeparator,h||t(c,w.core_lw,w.core_up)?(S=c.toLowerCase(),m=r(c,S,w),m.length===0||c.indexOf(b)>-1&&(d=e(c,S,w,b),m=i(m,d)),m):[]},Ir.wrap=function(c,p,l){var h,d,m,b,w,S,P,v,y;if(l.wrap!=null&&(y=l.wrap,S=y.tagClass,v=y.tagOpen,P=y.tagClose),S==null&&(S="highlight"),v==null&&(v=''),P==null&&(P=""),c===p)return v+c+P;if(m=o(c,p,l),m.length===0)return c;for(b="",h=-1,w=0;++hw&&(b+=c.substring(w,d),w=d);++hw&&(b+=v,b+=c.substring(w,d),b+=P,w=d)}return w<=c.length-1&&(b+=c.substring(w)),b},e=function(c,p,l,h){var d,m,b;for(b=c.length-1;c[b]===h;)b--;if(d=c.lastIndexOf(h,b),d===-1)return[];for(m=l.depth;m-- >0;)if(d=c.lastIndexOf(h,d-1),d===-1)return[];return d++,b++,r(c.slice(d,b),p.slice(d,b),l,d)},i=function(c,p){var l,h,d,m,b,w,S;if(b=c.length,w=p.length,w===0)return c.slice();if(b===0)return p.slice();for(d=-1,m=0,h=p[m],S=[];++d0?y:a(c,p,I,q,x,g,oe),P=ne+u(x,g,oe,S,O)),se=D[g],y=_[g],j>se?z=m:(j=se,z=w),P>j?(j=P,z=d):O=0,D[g]=j,_[g]=O,de[++H]=j>0?z:b;for(x=T-1,g=C-1,H=x*C+g,v=!0,R=[];v&&x>=0&&g>=0;)switch(de[H]){case w:x--,H-=C;break;case m:g--,H--;break;case d:R.push(x+h),g--,x--,H-=C+1;break;default:v=!1}return R.reverse(),R}}).call(Ir)});var tt=ve((qn,Dn)=>{(function(){var e,r,t,n,o,i,s,u;t=jn(),n=Vn(),u=$e(),i=Mr(),e=rt(),s=null,r=(typeof process!="undefined"&&process!==null?process.platform:void 0)==="win32"?"\\":"/",Dn.exports={filter:function(a,f,c){return c==null&&(c={}),(f!=null?f.length:void 0)&&(a!=null?a.length:void 0)?(c=o(c,f),t(a,f,c)):[]},score:function(a,f,c){return c==null&&(c={}),(a!=null?a.length:void 0)&&(f!=null?f.length:void 0)?(c=o(c,f),c.usePathScoring?i.score(a,f,c):u.score(a,f,c)):0},match:function(a,f,c){var p,l,h;return c==null&&(c={}),a?f?a===f?function(){h=[];for(var d=0,m=a.length;0<=m?dm;0<=m?d++:d--)h.push(d);return h}.apply(this):(c=o(c,f),n.match(a,f,c)):[]:[]},wrap:function(a,f,c){return c==null&&(c={}),a?f?(c=o(c,f),n.wrap(a,f,c)):[]:[]},prepareQuery:function(a,f){return f==null&&(f={}),f=o(f,a),f.preparedQuery}},o=function(a,f){return a.allowErrors==null&&(a.allowErrors=!1),a.usePathScoring==null&&(a.usePathScoring=!0),a.useExtensionBonus==null&&(a.useExtensionBonus=!1),a.pathSeparator==null&&(a.pathSeparator=r),a.optCharRegEx==null&&(a.optCharRegEx=null),a.wrap==null&&(a.wrap=null),a.preparedQuery==null&&(a.preparedQuery=s&&s.query===f?s:s=new e(f,a)),a}}).call(qn)});var Mt=kr(At(),1),{__extends:V,__assign:fi,__rest:ci,__decorate:li,__param:pi,__metadata:mi,__awaiter:It,__generator:Be,__exportStar:hi,__createBinding:di,__values:re,__read:W,__spread:vi,__spreadArrays:bi,__spreadArray:U,__await:Xe,__asyncGenerator:Ct,__asyncDelegator:yi,__asyncValues:Lt,__makeTemplateObject:xi,__importStar:gi,__importDefault:wi,__classPrivateFieldGet:_i,__classPrivateFieldSet:Si}=Mt.default;function E(e){return typeof e=="function"}function Ze(e){var r=function(n){Error.call(n),n.stack=new Error().stack},t=e(r);return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}var er=Ze(function(e){return function(t){e(this),this.message=t?t.length+` errors occurred during unsubscription: +`+t.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=t}});function fe(e,r){if(e){var t=e.indexOf(r);0<=t&&e.splice(t,1)}}var ie=function(){function e(r){this.initialTeardown=r,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var r,t,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var u=re(s),a=u.next();!a.done;a=u.next()){var f=a.value;f.remove(this)}}catch(m){r={error:m}}finally{try{a&&!a.done&&(t=u.return)&&t.call(u)}finally{if(r)throw r.error}}else s.remove(this);var c=this.initialTeardown;if(E(c))try{c()}catch(m){i=m instanceof er?m.errors:[m]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var l=re(p),h=l.next();!h.done;h=l.next()){var d=h.value;try{Pt(d)}catch(m){i=i!=null?i:[],m instanceof er?i=U(U([],W(i)),W(m.errors)):i.push(m)}}}catch(m){n={error:m}}finally{try{h&&!h.done&&(o=l.return)&&o.call(l)}finally{if(n)throw n.error}}}if(i)throw new er(i)}},e.prototype.add=function(r){var t;if(r&&r!==this)if(this.closed)Pt(r);else{if(r instanceof e){if(r.closed||r._hasParent(this))return;r._addParent(this)}(this._finalizers=(t=this._finalizers)!==null&&t!==void 0?t:[]).push(r)}},e.prototype._hasParent=function(r){var t=this._parentage;return t===r||Array.isArray(t)&&t.includes(r)},e.prototype._addParent=function(r){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(r),t):t?[t,r]:r},e.prototype._removeParent=function(r){var t=this._parentage;t===r?this._parentage=null:Array.isArray(t)&&fe(t,r)},e.prototype.remove=function(r){var t=this._finalizers;t&&fe(t,r),r instanceof e&&r._removeParent(this)},e.EMPTY=function(){var r=new e;return r.closed=!0,r}(),e}();var Wr=ie.EMPTY;function rr(e){return e instanceof ie||e&&"closed"in e&&E(e.remove)&&E(e.add)&&E(e.unsubscribe)}function Pt(e){E(e)?e():e.unsubscribe()}var te={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var Te={setTimeout:function(e,r){for(var t=[],n=2;n0},enumerable:!1,configurable:!0}),r.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},r.prototype._subscribe=function(t){return this._throwIfClosed(),this._checkFinalizedStatuses(t),this._innerSubscribe(t)},r.prototype._innerSubscribe=function(t){var n=this,o=this,i=o.hasError,s=o.isStopped,u=o.observers;return i||s?Wr:(this.currentObservers=null,u.push(t),new ie(function(){n.currentObservers=null,fe(u,t)}))},r.prototype._checkFinalizedStatuses=function(t){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?t.error(i):s&&t.complete()},r.prototype.asObservable=function(){var t=new L;return t.source=this,t},r.create=function(t,n){return new jt(t,n)},r}(L);var jt=function(e){V(r,e);function r(t,n){var o=e.call(this)||this;return o.destination=t,o.source=n,o}return r.prototype.next=function(t){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,t)},r.prototype.error=function(t){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,t)},r.prototype.complete=function(){var t,n;(n=(t=this.destination)===null||t===void 0?void 0:t.complete)===null||n===void 0||n.call(t)},r.prototype._subscribe=function(t){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(t))!==null&&o!==void 0?o:Wr},r}(J);var ze={now:function(){return(ze.delegate||Date).now()},delegate:void 0};var Vt=function(e){V(r,e);function r(t,n,o){t===void 0&&(t=1/0),n===void 0&&(n=1/0),o===void 0&&(o=ze);var i=e.call(this)||this;return i._bufferSize=t,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,t),i._windowTime=Math.max(1,n),i}return r.prototype.next=function(t){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,u=n._timestampProvider,a=n._windowTime;o||(i.push(t),!s&&i.push(u.now()+a)),this._trimBuffer(),e.prototype.next.call(this,t)},r.prototype._subscribe=function(t){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(t),o=this,i=o._infiniteTimeWindow,s=o._buffer,u=s.slice(),a=0;a0?e.prototype.requestAsyncId.call(this,t,n,o):(t.actions.push(this),t._scheduled||(t._scheduled=Ie.requestAnimationFrame(function(){return t.flush(void 0)})))},r.prototype.recycleAsyncId=function(t,n,o){if(o===void 0&&(o=0),o!=null&&o>0||o==null&&this.delay>0)return e.prototype.recycleAsyncId.call(this,t,n,o);t.actions.some(function(i){return i.id===n})||(Ie.cancelAnimationFrame(n),t._scheduled=void 0)},r}(or);var Nt=function(e){V(r,e);function r(){return e!==null&&e.apply(this,arguments)||this}return r.prototype.flush=function(t){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;t=t||o.shift();do if(i=t.execute(t.state,t.delay))break;while((t=o[0])&&t.id===n&&o.shift());if(this._active=!1,i){for(;(t=o[0])&&t.id===n&&o.shift();)t.unsubscribe();throw i}},r}(ir);var qr=new Nt($t);var le=new L(function(e){return e.complete()});function ar(e){return e&&E(e.schedule)}function Dr(e){return e[e.length-1]}function Ce(e){return E(Dr(e))?e.pop():void 0}function ae(e){return ar(Dr(e))?e.pop():void 0}function Gt(e,r){return typeof Dr(e)=="number"?e.pop():r}var Le=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function sr(e){return E(e==null?void 0:e.then)}function ur(e){return E(e[Me])}function fr(e){return Symbol.asyncIterator&&E(e==null?void 0:e[Symbol.asyncIterator])}function cr(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function mo(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var lr=mo();function pr(e){return E(e==null?void 0:e[lr])}function mr(e){return Ct(this,arguments,function(){var t,n,o,i;return Be(this,function(s){switch(s.label){case 0:t=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,Xe(t.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,Xe(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,Xe(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}})})}function hr(e){return E(e==null?void 0:e.getReader)}function F(e){if(e instanceof L)return e;if(e!=null){if(ur(e))return ho(e);if(Le(e))return vo(e);if(sr(e))return bo(e);if(fr(e))return Qt(e);if(pr(e))return yo(e);if(hr(e))return xo(e)}throw cr(e)}function ho(e){return new L(function(r){var t=e[Me]();if(E(t.subscribe))return t.subscribe(r);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function vo(e){return new L(function(r){for(var t=0;t0&&(c=new ye({next:function(_){return y.next(_)},error:function(_){m=!0,b(),p=Br(w,o,_),y.error(_)},complete:function(){d=!0,b(),p=Br(w,s),y.complete()}}),F(P).subscribe(c))})(f)}}function Br(e,r){for(var t=[],n=2;n{let r=Sr();return typeof r!="undefined"?e.contains(r):!1}),he(e===Sr()),pe())}function yn(e){return{x:e.scrollLeft,y:e.scrollTop}}function xn(e){return $(Q(e,"scroll"),Q(window,"resize")).pipe(Nr(0,qr),k(()=>yn(e)),he(yn(e)))}var wn=function(){if(typeof Map!="undefined")return Map;function e(r,t){var n=-1;return r.some(function(o,i){return o[0]===t?(n=i,!0):!1}),n}return function(){function r(){this.__entries__=[]}return Object.defineProperty(r.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),r.prototype.get=function(t){var n=e(this.__entries__,t),o=this.__entries__[n];return o&&o[1]},r.prototype.set=function(t,n){var o=e(this.__entries__,t);~o?this.__entries__[o][1]=n:this.__entries__.push([t,n])},r.prototype.delete=function(t){var n=this.__entries__,o=e(n,t);~o&&n.splice(o,1)},r.prototype.has=function(t){return!!~e(this.__entries__,t)},r.prototype.clear=function(){this.__entries__.splice(0)},r.prototype.forEach=function(t,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Zr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),qo?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Zr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(r){var t=r.propertyName,n=t===void 0?"":t,o=Vo.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),_n=function(e,r){for(var t=0,n=Object.keys(r);t0},e}(),En=typeof WeakMap!="undefined"?new WeakMap:new wn,On=function(){function e(r){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var t=Do.getInstance(),n=new Zo(r,t,this);En.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){On.prototype[e]=function(){var r;return(r=En.get(this))[e].apply(r,arguments)}});var ei=function(){return typeof Er.ResizeObserver!="undefined"?Er.ResizeObserver:On}(),Tn=ei;var ri=new J,Hp=Ve(()=>X(new Tn(e=>{for(let r of e)ri.next(r)}))).pipe(N(e=>$(qe,X(e)).pipe(_e(()=>e.disconnect()))),Se(1));function An(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Mn(e){return{width:e.scrollWidth,height:e.scrollHeight}}var ti=new J,Np=Ve(()=>X(new IntersectionObserver(e=>{for(let r of e)ti.next(r)},{threshold:0}))).pipe(N(e=>$(qe,X(e)).pipe(_e(()=>e.disconnect()))),Se(1));function In(e,r=16){return xn(e).pipe(k(({y:t})=>{let n=An(e),o=Mn(e);return t>=o.height-n.height-r}),pe())}var em={drawer:Z("[data-md-toggle=drawer]"),search:Z("[data-md-toggle=search]")};function Cn(){return new URL(location.href)}function Ln(e,r){if(typeof r=="string"||typeof r=="number")e.innerHTML+=r.toString();else if(r instanceof Node)e.appendChild(r);else if(Array.isArray(r))for(let t of r)Ln(e,t)}function ee(e,r,...t){let n=document.createElement(e);if(r)for(let o of Object.keys(r))typeof r[o]!="undefined"&&(typeof r[o]!="boolean"?n.setAttribute(o,r[o]):n.setAttribute(o,""));for(let o of t)Ln(n,o);return n}function Pn(e){if(e>999){let r=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(r)}k`}else return e.toString()}function ni(e,r={credentials:"same-origin"}){return B(fetch(`${e}`,r)).pipe(wr(()=>le),N(t=>t.status!==200?$r(()=>new Error(t.statusText)):X(t)))}function Ar(e,r){return ni(e,r).pipe(N(t=>t.json()),Se(1))}function He(e,r=document){return Z(`[data-mdx-component=${e}]`,r)}function et(e,r=document){return dn(`[data-mdx-component=${e}]`,r)}var oi=Z("#__config"),De=JSON.parse(oi.textContent);De.base=`${new URL(De.base,Cn())}`;function Rn(){return De}function Fn(e,r){return typeof r!="undefined"?De.translations[e].replace("#",r.toString()):De.translations[e]}function kn(e){let r=bn(e),t=$(Q(e,"keyup"),Q(e,"focus").pipe(Jr(1))).pipe(k(()=>e.value),he(e.value),pe());return r.pipe(we(n=>!n),Fe(t)).subscribe(([,n])=>{let o=document.location.pathname;typeof ga=="function"&&n.length&&ga("send","pageview",`${o}?q=[icon]+${n}`)}),Pe([t,r]).pipe(k(([n,o])=>({ref:e,value:n,focus:o})))}var nt=kr(tt());var Nn=kr(tt());function $n(e,r){return(0,Nn.wrap)(e.shortcode,r,{wrap:{tagOpen:"",tagClose:""}})}function Gn(e,r,t){return ee("li",{class:"mdx-iconsearch-result__item"},ee("span",{class:"twemoji"},ee("img",{src:e.url})),ee("button",{class:"md-clipboard--inline",title:Fn("clipboard.copy"),"data-clipboard-text":t?e.shortcode:`:${e.shortcode}:`},ee("code",null,t?$n(e,r):`:${$n(e,r)}:`)))}function Qn(e){let r=`@${e.name}`;return ee("a",{href:e.url,title:r,class:"mdx-sponsorship__item"},ee("img",{src:e.image}))}function Kn(e){return ee("a",{href:"https://github.com/sponsors/squidfunk",class:"mdx-sponsorship__item mdx-sponsorship__item--private"},"+",e)}function ii(e,{index$:r,query$:t}){switch(e.getAttribute("data-mdx-mode")){case"file":return Pe([t.pipe(_r("value")),r.pipe(k(({icons:n})=>Object.values(n.data).map(o=>o.replace(/\.svg$/,""))))]).pipe(k(([{value:n},o])=>(0,nt.filter)(o,n)),N(n=>r.pipe(k(({icons:o})=>({data:n.map(i=>({shortcode:i,url:[o.base,i,".svg"].join("")}))})))));default:return Pe([t.pipe(_r("value")),r.pipe(k(({icons:n,emojis:o})=>[...Object.keys(n.data),...Object.keys(o.data)]))]).pipe(k(([{value:n},o])=>(0,nt.filter)(o,n)),N(n=>r.pipe(k(({icons:o,emojis:i})=>({data:n.map(s=>{let u=s in o.data?o:i;return{shortcode:s,url:[u.base,u.data[s]].join("")}})})))))}}function Yn(e,{index$:r,query$:t}){let n=new J,o=In(e).pipe(we(Boolean)),i=Z(":scope > :first-child",e);n.pipe(Fe(t)).subscribe(([{data:a},{value:f}])=>{if(f)switch(a.length){case 0:i.textContent="No matches";break;case 1:i.textContent="1 match";break;default:i.textContent=`${Pn(a.length)} matches`}else i.textContent="Type to start searching"});let s=e.getAttribute("data-mdx-mode")==="file",u=Z(":scope > :last-child",e);return n.pipe(Re(()=>u.innerHTML=""),N(({data:a})=>$(X(...a.slice(0,10)),X(...a.slice(10)).pipe(Gr(10),Xr(o),N(([f])=>f)))),Fe(t)).subscribe(([a,{value:f}])=>u.appendChild(Gn(a,f,s))),ii(e,{query$:t,index$:r}).pipe(Re(a=>n.next(a)),_e(()=>n.complete()),k(a=>Qe({ref:e},a)))}function Jn(e){let r=Rn(),t=Ar(new URL("overrides/assets/javascripts/iconsearch_index.json",r.base)),n=He("iconsearch-query",e),o=He("iconsearch-result",e),i=kn(n),s=Yn(o,{index$:t,query$:i});return $(i,s)}function Bn(e){let r=Ar("https://3if8u9o552.execute-api.us-east-1.amazonaws.com/_/"),t=He("sponsorship-count"),n=He("sponsorship-total");return r.subscribe(o=>{e.removeAttribute("hidden");let i=Z(":scope > :first-child",e);for(let s of o.sponsors)s.type==="public"&&i.appendChild(Qn(s.user));i.appendChild(Kn(o.sponsors.filter(({type:s})=>s==="private").length)),t.innerText=`${o.sponsors.length}`,n.innerText=`$ ${o.total.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")} a month`}),r.pipe(k(o=>Qe({ref:e},o)))}function Xn(){let{origin:e}=new URL(location.href);Q(document.body,"click").subscribe(r=>{if(r.target instanceof HTMLElement){let t=r.target.closest("a");t&&t.origin!==e&&ga("send","event","outbound","click",t.href)}})}Xn();var ai=document$.pipe(N(()=>$(...et("iconsearch").map(e=>Jn(e)),...et("sponsorship").map(e=>Bn(e)))));ai.subscribe();})(); +//# sourceMappingURL=bundle.a163e2c4.min.js.map + diff --git a/overrides/assets/javascripts/bundle.a163e2c4.min.js.map b/overrides/assets/javascripts/bundle.a163e2c4.min.js.map new file mode 100644 index 00000000..e84bbb90 --- /dev/null +++ b/overrides/assets/javascripts/bundle.a163e2c4.min.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["node_modules/rxjs/node_modules/tslib/tslib.js", "node_modules/fuzzaldrin-plus/lib/scorer.js", "node_modules/fuzzaldrin-plus/lib/pathScorer.js", "node_modules/fuzzaldrin-plus/lib/query.js", "node_modules/fuzzaldrin-plus/lib/filter.js", "node_modules/fuzzaldrin-plus/lib/matcher.js", "node_modules/fuzzaldrin-plus/lib/fuzzaldrin.js", "node_modules/rxjs/node_modules/tslib/modules/index.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/assets/javascripts/browser/element/_/index.ts", "src/assets/javascripts/browser/element/focus/index.ts", "src/assets/javascripts/browser/element/offset/content/index.ts", "node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js", "src/assets/javascripts/browser/element/size/_/index.ts", "src/assets/javascripts/browser/element/size/content/index.ts", "src/assets/javascripts/browser/element/visibility/index.ts", "src/assets/javascripts/browser/toggle/index.ts", "src/assets/javascripts/browser/location/_/index.ts", "src/assets/javascripts/utilities/h/index.ts", "src/assets/javascripts/utilities/string/index.ts", "src/assets/javascripts/browser/request/index.ts", "src/overrides/assets/javascripts/components/_/index.ts", "src/assets/javascripts/_/index.ts", "src/overrides/assets/javascripts/components/iconsearch/query/index.ts", "src/overrides/assets/javascripts/components/iconsearch/result/index.ts", "src/overrides/assets/javascripts/templates/iconsearch/index.tsx", "src/overrides/assets/javascripts/templates/sponsorship/index.tsx", "src/overrides/assets/javascripts/components/iconsearch/_/index.ts", "src/overrides/assets/javascripts/components/sponsorship/index.ts", "src/overrides/assets/javascripts/integrations/analytics/index.ts", "src/overrides/assets/javascripts/bundle.ts"], + "sourceRoot": "../../../..", + "sourcesContent": ["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n});\r\n", "(function() {\n var AcronymResult, computeScore, emptyAcronymResult, isAcronymFullWord, isMatch, isSeparator, isWordEnd, isWordStart, miss_coeff, pos_bonus, scoreAcronyms, scoreCharacter, scoreConsecutives, scoreExact, scoreExactMatch, scorePattern, scorePosition, scoreSize, tau_size, wm;\n\n wm = 150;\n\n pos_bonus = 20;\n\n tau_size = 150;\n\n miss_coeff = 0.75;\n\n exports.score = function(string, query, options) {\n var allowErrors, preparedQuery, score, string_lw;\n preparedQuery = options.preparedQuery, allowErrors = options.allowErrors;\n if (!(allowErrors || isMatch(string, preparedQuery.core_lw, preparedQuery.core_up))) {\n return 0;\n }\n string_lw = string.toLowerCase();\n score = computeScore(string, string_lw, preparedQuery);\n return Math.ceil(score);\n };\n\n exports.isMatch = isMatch = function(subject, query_lw, query_up) {\n var i, j, m, n, qj_lw, qj_up, si;\n m = subject.length;\n n = query_lw.length;\n if (!m || n > m) {\n return false;\n }\n i = -1;\n j = -1;\n while (++j < n) {\n qj_lw = query_lw.charCodeAt(j);\n qj_up = query_up.charCodeAt(j);\n while (++i < m) {\n si = subject.charCodeAt(i);\n if (si === qj_lw || si === qj_up) {\n break;\n }\n }\n if (i === m) {\n return false;\n }\n }\n return true;\n };\n\n exports.computeScore = computeScore = function(subject, subject_lw, preparedQuery) {\n var acro, acro_score, align, csc_diag, csc_row, csc_score, csc_should_rebuild, i, j, m, miss_budget, miss_left, n, pos, query, query_lw, record_miss, score, score_diag, score_row, score_up, si_lw, start, sz;\n query = preparedQuery.query;\n query_lw = preparedQuery.query_lw;\n m = subject.length;\n n = query.length;\n acro = scoreAcronyms(subject, subject_lw, query, query_lw);\n acro_score = acro.score;\n if (acro.count === n) {\n return scoreExact(n, m, acro_score, acro.pos);\n }\n pos = subject_lw.indexOf(query_lw);\n if (pos > -1) {\n return scoreExactMatch(subject, subject_lw, query, query_lw, pos, n, m);\n }\n score_row = new Array(n);\n csc_row = new Array(n);\n sz = scoreSize(n, m);\n miss_budget = Math.ceil(miss_coeff * n) + 5;\n miss_left = miss_budget;\n csc_should_rebuild = true;\n j = -1;\n while (++j < n) {\n score_row[j] = 0;\n csc_row[j] = 0;\n }\n i = -1;\n while (++i < m) {\n si_lw = subject_lw[i];\n if (!si_lw.charCodeAt(0) in preparedQuery.charCodes) {\n if (csc_should_rebuild) {\n j = -1;\n while (++j < n) {\n csc_row[j] = 0;\n }\n csc_should_rebuild = false;\n }\n continue;\n }\n score = 0;\n score_diag = 0;\n csc_diag = 0;\n record_miss = true;\n csc_should_rebuild = true;\n j = -1;\n while (++j < n) {\n score_up = score_row[j];\n if (score_up > score) {\n score = score_up;\n }\n csc_score = 0;\n if (query_lw[j] === si_lw) {\n start = isWordStart(i, subject, subject_lw);\n csc_score = csc_diag > 0 ? csc_diag : scoreConsecutives(subject, subject_lw, query, query_lw, i, j, start);\n align = score_diag + scoreCharacter(i, j, start, acro_score, csc_score);\n if (align > score) {\n score = align;\n miss_left = miss_budget;\n } else {\n if (record_miss && --miss_left <= 0) {\n return Math.max(score, score_row[n - 1]) * sz;\n }\n record_miss = false;\n }\n }\n score_diag = score_up;\n csc_diag = csc_row[j];\n csc_row[j] = csc_score;\n score_row[j] = score;\n }\n }\n score = score_row[n - 1];\n return score * sz;\n };\n\n exports.isWordStart = isWordStart = function(pos, subject, subject_lw) {\n var curr_s, prev_s;\n if (pos === 0) {\n return true;\n }\n curr_s = subject[pos];\n prev_s = subject[pos - 1];\n return isSeparator(prev_s) || (curr_s !== subject_lw[pos] && prev_s === subject_lw[pos - 1]);\n };\n\n exports.isWordEnd = isWordEnd = function(pos, subject, subject_lw, len) {\n var curr_s, next_s;\n if (pos === len - 1) {\n return true;\n }\n curr_s = subject[pos];\n next_s = subject[pos + 1];\n return isSeparator(next_s) || (curr_s === subject_lw[pos] && next_s !== subject_lw[pos + 1]);\n };\n\n isSeparator = function(c) {\n return c === ' ' || c === '.' || c === '-' || c === '_' || c === '/' || c === '\\\\';\n };\n\n scorePosition = function(pos) {\n var sc;\n if (pos < pos_bonus) {\n sc = pos_bonus - pos;\n return 100 + sc * sc;\n } else {\n return Math.max(100 + pos_bonus - pos, 0);\n }\n };\n\n exports.scoreSize = scoreSize = function(n, m) {\n return tau_size / (tau_size + Math.abs(m - n));\n };\n\n scoreExact = function(n, m, quality, pos) {\n return 2 * n * (wm * quality + scorePosition(pos)) * scoreSize(n, m);\n };\n\n exports.scorePattern = scorePattern = function(count, len, sameCase, start, end) {\n var bonus, sz;\n sz = count;\n bonus = 6;\n if (sameCase === count) {\n bonus += 2;\n }\n if (start) {\n bonus += 3;\n }\n if (end) {\n bonus += 1;\n }\n if (count === len) {\n if (start) {\n if (sameCase === len) {\n sz += 2;\n } else {\n sz += 1;\n }\n }\n if (end) {\n bonus += 1;\n }\n }\n return sameCase + sz * (sz + bonus);\n };\n\n exports.scoreCharacter = scoreCharacter = function(i, j, start, acro_score, csc_score) {\n var posBonus;\n posBonus = scorePosition(i);\n if (start) {\n return posBonus + wm * ((acro_score > csc_score ? acro_score : csc_score) + 10);\n }\n return posBonus + wm * csc_score;\n };\n\n exports.scoreConsecutives = scoreConsecutives = function(subject, subject_lw, query, query_lw, i, j, startOfWord) {\n var k, m, mi, n, nj, sameCase, sz;\n m = subject.length;\n n = query.length;\n mi = m - i;\n nj = n - j;\n k = mi < nj ? mi : nj;\n sameCase = 0;\n sz = 0;\n if (query[j] === subject[i]) {\n sameCase++;\n }\n while (++sz < k && query_lw[++j] === subject_lw[++i]) {\n if (query[j] === subject[i]) {\n sameCase++;\n }\n }\n if (sz < k) {\n i--;\n }\n if (sz === 1) {\n return 1 + 2 * sameCase;\n }\n return scorePattern(sz, n, sameCase, startOfWord, isWordEnd(i, subject, subject_lw, m));\n };\n\n exports.scoreExactMatch = scoreExactMatch = function(subject, subject_lw, query, query_lw, pos, n, m) {\n var end, i, pos2, sameCase, start;\n start = isWordStart(pos, subject, subject_lw);\n if (!start) {\n pos2 = subject_lw.indexOf(query_lw, pos + 1);\n if (pos2 > -1) {\n start = isWordStart(pos2, subject, subject_lw);\n if (start) {\n pos = pos2;\n }\n }\n }\n i = -1;\n sameCase = 0;\n while (++i < n) {\n if (query[pos + i] === subject[i]) {\n sameCase++;\n }\n }\n end = isWordEnd(pos + n - 1, subject, subject_lw, m);\n return scoreExact(n, m, scorePattern(n, n, sameCase, start, end), pos);\n };\n\n AcronymResult = (function() {\n function AcronymResult(score, pos, count) {\n this.score = score;\n this.pos = pos;\n this.count = count;\n }\n\n return AcronymResult;\n\n })();\n\n emptyAcronymResult = new AcronymResult(0, 0.1, 0);\n\n exports.scoreAcronyms = scoreAcronyms = function(subject, subject_lw, query, query_lw) {\n var count, fullWord, i, j, m, n, qj_lw, sameCase, score, sepCount, sumPos;\n m = subject.length;\n n = query.length;\n if (!(m > 1 && n > 1)) {\n return emptyAcronymResult;\n }\n count = 0;\n sepCount = 0;\n sumPos = 0;\n sameCase = 0;\n i = -1;\n j = -1;\n while (++j < n) {\n qj_lw = query_lw[j];\n if (isSeparator(qj_lw)) {\n i = subject_lw.indexOf(qj_lw, i + 1);\n if (i > -1) {\n sepCount++;\n continue;\n } else {\n break;\n }\n }\n while (++i < m) {\n if (qj_lw === subject_lw[i] && isWordStart(i, subject, subject_lw)) {\n if (query[j] === subject[i]) {\n sameCase++;\n }\n sumPos += i;\n count++;\n break;\n }\n }\n if (i === m) {\n break;\n }\n }\n if (count < 2) {\n return emptyAcronymResult;\n }\n fullWord = count === n ? isAcronymFullWord(subject, subject_lw, query, count) : false;\n score = scorePattern(count, n, sameCase, true, fullWord);\n return new AcronymResult(score, sumPos / count, count + sepCount);\n };\n\n isAcronymFullWord = function(subject, subject_lw, query, nbAcronymInQuery) {\n var count, i, m, n;\n m = subject.length;\n n = query.length;\n count = 0;\n if (m > 12 * n) {\n return false;\n }\n i = -1;\n while (++i < m) {\n if (isWordStart(i, subject, subject_lw) && ++count > nbAcronymInQuery) {\n return false;\n }\n }\n return true;\n };\n\n}).call(this);\n", "(function() {\n var computeScore, countDir, file_coeff, getExtension, getExtensionScore, isMatch, scorePath, scoreSize, tau_depth, _ref;\n\n _ref = require('./scorer'), isMatch = _ref.isMatch, computeScore = _ref.computeScore, scoreSize = _ref.scoreSize;\n\n tau_depth = 20;\n\n file_coeff = 2.5;\n\n exports.score = function(string, query, options) {\n var allowErrors, preparedQuery, score, string_lw;\n preparedQuery = options.preparedQuery, allowErrors = options.allowErrors;\n if (!(allowErrors || isMatch(string, preparedQuery.core_lw, preparedQuery.core_up))) {\n return 0;\n }\n string_lw = string.toLowerCase();\n score = computeScore(string, string_lw, preparedQuery);\n score = scorePath(string, string_lw, score, options);\n return Math.ceil(score);\n };\n\n scorePath = function(subject, subject_lw, fullPathScore, options) {\n var alpha, basePathScore, basePos, depth, end, extAdjust, fileLength, pathSeparator, preparedQuery, useExtensionBonus;\n if (fullPathScore === 0) {\n return 0;\n }\n preparedQuery = options.preparedQuery, useExtensionBonus = options.useExtensionBonus, pathSeparator = options.pathSeparator;\n end = subject.length - 1;\n while (subject[end] === pathSeparator) {\n end--;\n }\n basePos = subject.lastIndexOf(pathSeparator, end);\n fileLength = end - basePos;\n extAdjust = 1.0;\n if (useExtensionBonus) {\n extAdjust += getExtensionScore(subject_lw, preparedQuery.ext, basePos, end, 2);\n fullPathScore *= extAdjust;\n }\n if (basePos === -1) {\n return fullPathScore;\n }\n depth = preparedQuery.depth;\n while (basePos > -1 && depth-- > 0) {\n basePos = subject.lastIndexOf(pathSeparator, basePos - 1);\n }\n basePathScore = basePos === -1 ? fullPathScore : extAdjust * computeScore(subject.slice(basePos + 1, end + 1), subject_lw.slice(basePos + 1, end + 1), preparedQuery);\n alpha = 0.5 * tau_depth / (tau_depth + countDir(subject, end + 1, pathSeparator));\n return alpha * basePathScore + (1 - alpha) * fullPathScore * scoreSize(0, file_coeff * fileLength);\n };\n\n exports.countDir = countDir = function(path, end, pathSeparator) {\n var count, i;\n if (end < 1) {\n return 0;\n }\n count = 0;\n i = -1;\n while (++i < end && path[i] === pathSeparator) {\n continue;\n }\n while (++i < end) {\n if (path[i] === pathSeparator) {\n count++;\n while (++i < end && path[i] === pathSeparator) {\n continue;\n }\n }\n }\n return count;\n };\n\n exports.getExtension = getExtension = function(str) {\n var pos;\n pos = str.lastIndexOf(\".\");\n if (pos < 0) {\n return \"\";\n } else {\n return str.substr(pos + 1);\n }\n };\n\n getExtensionScore = function(candidate, ext, startPos, endPos, maxDepth) {\n var m, matched, n, pos;\n if (!ext.length) {\n return 0;\n }\n pos = candidate.lastIndexOf(\".\", endPos);\n if (!(pos > startPos)) {\n return 0;\n }\n n = ext.length;\n m = endPos - pos;\n if (m < n) {\n n = m;\n m = ext.length;\n }\n pos++;\n matched = -1;\n while (++matched < n) {\n if (candidate[pos + matched] !== ext[matched]) {\n break;\n }\n }\n if (matched === 0 && maxDepth > 0) {\n return 0.9 * getExtensionScore(candidate, ext, startPos, pos - 2, maxDepth - 1);\n }\n return matched / m;\n };\n\n}).call(this);\n", "(function() {\n var Query, coreChars, countDir, getCharCodes, getExtension, opt_char_re, truncatedUpperCase, _ref;\n\n _ref = require(\"./pathScorer\"), countDir = _ref.countDir, getExtension = _ref.getExtension;\n\n module.exports = Query = (function() {\n function Query(query, _arg) {\n var optCharRegEx, pathSeparator, _ref1;\n _ref1 = _arg != null ? _arg : {}, optCharRegEx = _ref1.optCharRegEx, pathSeparator = _ref1.pathSeparator;\n if (!(query && query.length)) {\n return null;\n }\n this.query = query;\n this.query_lw = query.toLowerCase();\n this.core = coreChars(query, optCharRegEx);\n this.core_lw = this.core.toLowerCase();\n this.core_up = truncatedUpperCase(this.core);\n this.depth = countDir(query, query.length, pathSeparator);\n this.ext = getExtension(this.query_lw);\n this.charCodes = getCharCodes(this.query_lw);\n }\n\n return Query;\n\n })();\n\n opt_char_re = /[ _\\-:\\/\\\\]/g;\n\n coreChars = function(query, optCharRegEx) {\n if (optCharRegEx == null) {\n optCharRegEx = opt_char_re;\n }\n return query.replace(optCharRegEx, '');\n };\n\n truncatedUpperCase = function(str) {\n var char, upper, _i, _len;\n upper = \"\";\n for (_i = 0, _len = str.length; _i < _len; _i++) {\n char = str[_i];\n upper += char.toUpperCase()[0];\n }\n return upper;\n };\n\n getCharCodes = function(str) {\n var charCodes, i, len;\n len = str.length;\n i = -1;\n charCodes = [];\n while (++i < len) {\n charCodes[str.charCodeAt(i)] = true;\n }\n return charCodes;\n };\n\n}).call(this);\n", "(function() {\n var Query, pathScorer, pluckCandidates, scorer, sortCandidates;\n\n scorer = require('./scorer');\n\n pathScorer = require('./pathScorer');\n\n Query = require('./query');\n\n pluckCandidates = function(a) {\n return a.candidate;\n };\n\n sortCandidates = function(a, b) {\n return b.score - a.score;\n };\n\n module.exports = function(candidates, query, options) {\n var bKey, candidate, key, maxInners, maxResults, score, scoreProvider, scoredCandidates, spotLeft, string, usePathScoring, _i, _len;\n scoredCandidates = [];\n key = options.key, maxResults = options.maxResults, maxInners = options.maxInners, usePathScoring = options.usePathScoring;\n spotLeft = (maxInners != null) && maxInners > 0 ? maxInners : candidates.length + 1;\n bKey = key != null;\n scoreProvider = usePathScoring ? pathScorer : scorer;\n for (_i = 0, _len = candidates.length; _i < _len; _i++) {\n candidate = candidates[_i];\n string = bKey ? candidate[key] : candidate;\n if (!string) {\n continue;\n }\n score = scoreProvider.score(string, query, options);\n if (score > 0) {\n scoredCandidates.push({\n candidate: candidate,\n score: score\n });\n if (!--spotLeft) {\n break;\n }\n }\n }\n scoredCandidates.sort(sortCandidates);\n candidates = scoredCandidates.map(pluckCandidates);\n if (maxResults != null) {\n candidates = candidates.slice(0, maxResults);\n }\n return candidates;\n };\n\n}).call(this);\n", "(function() {\n var basenameMatch, computeMatch, isMatch, isWordStart, match, mergeMatches, scoreAcronyms, scoreCharacter, scoreConsecutives, _ref;\n\n _ref = require('./scorer'), isMatch = _ref.isMatch, isWordStart = _ref.isWordStart, scoreConsecutives = _ref.scoreConsecutives, scoreCharacter = _ref.scoreCharacter, scoreAcronyms = _ref.scoreAcronyms;\n\n exports.match = match = function(string, query, options) {\n var allowErrors, baseMatches, matches, pathSeparator, preparedQuery, string_lw;\n allowErrors = options.allowErrors, preparedQuery = options.preparedQuery, pathSeparator = options.pathSeparator;\n if (!(allowErrors || isMatch(string, preparedQuery.core_lw, preparedQuery.core_up))) {\n return [];\n }\n string_lw = string.toLowerCase();\n matches = computeMatch(string, string_lw, preparedQuery);\n if (matches.length === 0) {\n return matches;\n }\n if (string.indexOf(pathSeparator) > -1) {\n baseMatches = basenameMatch(string, string_lw, preparedQuery, pathSeparator);\n matches = mergeMatches(matches, baseMatches);\n }\n return matches;\n };\n\n exports.wrap = function(string, query, options) {\n var matchIndex, matchPos, matchPositions, output, strPos, tagClass, tagClose, tagOpen, _ref1;\n if ((options.wrap != null)) {\n _ref1 = options.wrap, tagClass = _ref1.tagClass, tagOpen = _ref1.tagOpen, tagClose = _ref1.tagClose;\n }\n if (tagClass == null) {\n tagClass = 'highlight';\n }\n if (tagOpen == null) {\n tagOpen = '';\n }\n if (tagClose == null) {\n tagClose = '';\n }\n if (string === query) {\n return tagOpen + string + tagClose;\n }\n matchPositions = match(string, query, options);\n if (matchPositions.length === 0) {\n return string;\n }\n output = '';\n matchIndex = -1;\n strPos = 0;\n while (++matchIndex < matchPositions.length) {\n matchPos = matchPositions[matchIndex];\n if (matchPos > strPos) {\n output += string.substring(strPos, matchPos);\n strPos = matchPos;\n }\n while (++matchIndex < matchPositions.length) {\n if (matchPositions[matchIndex] === matchPos + 1) {\n matchPos++;\n } else {\n matchIndex--;\n break;\n }\n }\n matchPos++;\n if (matchPos > strPos) {\n output += tagOpen;\n output += string.substring(strPos, matchPos);\n output += tagClose;\n strPos = matchPos;\n }\n }\n if (strPos <= string.length - 1) {\n output += string.substring(strPos);\n }\n return output;\n };\n\n basenameMatch = function(subject, subject_lw, preparedQuery, pathSeparator) {\n var basePos, depth, end;\n end = subject.length - 1;\n while (subject[end] === pathSeparator) {\n end--;\n }\n basePos = subject.lastIndexOf(pathSeparator, end);\n if (basePos === -1) {\n return [];\n }\n depth = preparedQuery.depth;\n while (depth-- > 0) {\n basePos = subject.lastIndexOf(pathSeparator, basePos - 1);\n if (basePos === -1) {\n return [];\n }\n }\n basePos++;\n end++;\n return computeMatch(subject.slice(basePos, end), subject_lw.slice(basePos, end), preparedQuery, basePos);\n };\n\n mergeMatches = function(a, b) {\n var ai, bj, i, j, m, n, out;\n m = a.length;\n n = b.length;\n if (n === 0) {\n return a.slice();\n }\n if (m === 0) {\n return b.slice();\n }\n i = -1;\n j = 0;\n bj = b[j];\n out = [];\n while (++i < m) {\n ai = a[i];\n while (bj <= ai && ++j < n) {\n if (bj < ai) {\n out.push(bj);\n }\n bj = b[j];\n }\n out.push(ai);\n }\n while (j < n) {\n out.push(b[j++]);\n }\n return out;\n };\n\n computeMatch = function(subject, subject_lw, preparedQuery, offset) {\n var DIAGONAL, LEFT, STOP, UP, acro_score, align, backtrack, csc_diag, csc_row, csc_score, i, j, m, matches, move, n, pos, query, query_lw, score, score_diag, score_row, score_up, si_lw, start, trace;\n if (offset == null) {\n offset = 0;\n }\n query = preparedQuery.query;\n query_lw = preparedQuery.query_lw;\n m = subject.length;\n n = query.length;\n acro_score = scoreAcronyms(subject, subject_lw, query, query_lw).score;\n score_row = new Array(n);\n csc_row = new Array(n);\n STOP = 0;\n UP = 1;\n LEFT = 2;\n DIAGONAL = 3;\n trace = new Array(m * n);\n pos = -1;\n j = -1;\n while (++j < n) {\n score_row[j] = 0;\n csc_row[j] = 0;\n }\n i = -1;\n while (++i < m) {\n score = 0;\n score_up = 0;\n csc_diag = 0;\n si_lw = subject_lw[i];\n j = -1;\n while (++j < n) {\n csc_score = 0;\n align = 0;\n score_diag = score_up;\n if (query_lw[j] === si_lw) {\n start = isWordStart(i, subject, subject_lw);\n csc_score = csc_diag > 0 ? csc_diag : scoreConsecutives(subject, subject_lw, query, query_lw, i, j, start);\n align = score_diag + scoreCharacter(i, j, start, acro_score, csc_score);\n }\n score_up = score_row[j];\n csc_diag = csc_row[j];\n if (score > score_up) {\n move = LEFT;\n } else {\n score = score_up;\n move = UP;\n }\n if (align > score) {\n score = align;\n move = DIAGONAL;\n } else {\n csc_score = 0;\n }\n score_row[j] = score;\n csc_row[j] = csc_score;\n trace[++pos] = score > 0 ? move : STOP;\n }\n }\n i = m - 1;\n j = n - 1;\n pos = i * n + j;\n backtrack = true;\n matches = [];\n while (backtrack && i >= 0 && j >= 0) {\n switch (trace[pos]) {\n case UP:\n i--;\n pos -= n;\n break;\n case LEFT:\n j--;\n pos--;\n break;\n case DIAGONAL:\n matches.push(i + offset);\n j--;\n i--;\n pos -= n + 1;\n break;\n default:\n backtrack = false;\n }\n }\n matches.reverse();\n return matches;\n };\n\n}).call(this);\n", "(function() {\n var Query, defaultPathSeparator, filter, matcher, parseOptions, pathScorer, preparedQueryCache, scorer;\n\n filter = require('./filter');\n\n matcher = require('./matcher');\n\n scorer = require('./scorer');\n\n pathScorer = require('./pathScorer');\n\n Query = require('./query');\n\n preparedQueryCache = null;\n\n defaultPathSeparator = (typeof process !== \"undefined\" && process !== null ? process.platform : void 0) === \"win32\" ? '\\\\' : '/';\n\n module.exports = {\n filter: function(candidates, query, options) {\n if (options == null) {\n options = {};\n }\n if (!((query != null ? query.length : void 0) && (candidates != null ? candidates.length : void 0))) {\n return [];\n }\n options = parseOptions(options, query);\n return filter(candidates, query, options);\n },\n score: function(string, query, options) {\n if (options == null) {\n options = {};\n }\n if (!((string != null ? string.length : void 0) && (query != null ? query.length : void 0))) {\n return 0;\n }\n options = parseOptions(options, query);\n if (options.usePathScoring) {\n return pathScorer.score(string, query, options);\n } else {\n return scorer.score(string, query, options);\n }\n },\n match: function(string, query, options) {\n var _i, _ref, _results;\n if (options == null) {\n options = {};\n }\n if (!string) {\n return [];\n }\n if (!query) {\n return [];\n }\n if (string === query) {\n return (function() {\n _results = [];\n for (var _i = 0, _ref = string.length; 0 <= _ref ? _i < _ref : _i > _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }\n return _results;\n }).apply(this);\n }\n options = parseOptions(options, query);\n return matcher.match(string, query, options);\n },\n wrap: function(string, query, options) {\n if (options == null) {\n options = {};\n }\n if (!string) {\n return [];\n }\n if (!query) {\n return [];\n }\n options = parseOptions(options, query);\n return matcher.wrap(string, query, options);\n },\n prepareQuery: function(query, options) {\n if (options == null) {\n options = {};\n }\n options = parseOptions(options, query);\n return options.preparedQuery;\n }\n };\n\n parseOptions = function(options, query) {\n if (options.allowErrors == null) {\n options.allowErrors = false;\n }\n if (options.usePathScoring == null) {\n options.usePathScoring = true;\n }\n if (options.useExtensionBonus == null) {\n options.useExtensionBonus = false;\n }\n if (options.pathSeparator == null) {\n options.pathSeparator = defaultPathSeparator;\n }\n if (options.optCharRegEx == null) {\n options.optCharRegEx = null;\n }\n if (options.wrap == null) {\n options.wrap = null;\n }\n if (options.preparedQuery == null) {\n options.preparedQuery = preparedQueryCache && preparedQueryCache.query === query ? preparedQueryCache : (preparedQueryCache = new Query(query, options));\n }\n return options;\n };\n\n}).call(this);\n", "import tslib from '../tslib.js';\r\nconst {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n} = tslib;\r\nexport {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n};\r\n", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve all elements matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Elements\n */\nexport function getElements(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T][]\n\nexport function getElements(\n selector: string, node?: ParentNode\n): T[]\n\nexport function getElements(\n selector: string, node: ParentNode = document\n): T[] {\n return Array.from(node.querySelectorAll(selector))\n}\n\n/**\n * Retrieve an element matching a query selector or throw a reference error\n *\n * Note that this function assumes that the element is present. If unsure if an\n * element is existent, use the `getOptionalElement` function instead.\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Element\n */\nexport function getElement(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T]\n\nexport function getElement(\n selector: string, node?: ParentNode\n): T\n\nexport function getElement(\n selector: string, node: ParentNode = document\n): T {\n const el = getOptionalElement(selector, node)\n if (typeof el === \"undefined\")\n throw new ReferenceError(\n `Missing element: expected \"${selector}\" to be present`\n )\n\n /* Return element */\n return el\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Retrieve an optional element matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Element or nothing\n */\nexport function getOptionalElement(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T] | undefined\n\nexport function getOptionalElement(\n selector: string, node?: ParentNode\n): T | undefined\n\nexport function getOptionalElement(\n selector: string, node: ParentNode = document\n): T | undefined {\n return node.querySelector(selector) || undefined\n}\n\n/**\n * Retrieve the currently active element\n *\n * @returns Element or nothing\n */\nexport function getActiveElement(): HTMLElement | undefined {\n return document.activeElement instanceof HTMLElement\n ? document.activeElement || undefined\n : undefined\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n debounceTime,\n distinctUntilChanged,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\nimport { getActiveElement } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch element focus\n *\n * Previously, this function used `focus` and `blur` events to determine whether\n * an element is focused, but this doesn't work if there are focusable elements\n * within the elements itself. A better solutions are `focusin` and `focusout`\n * events, which bubble up the tree and allow for more fine-grained control.\n *\n * `debounceTime` is necessary, because when a focus change happens inside an\n * element, the observable would first emit `false` and then `true` again.\n *\n * @param el - Element\n *\n * @returns Element focus observable\n */\nexport function watchElementFocus(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(document.body, \"focusin\"),\n fromEvent(document.body, \"focusout\")\n )\n .pipe(\n debounceTime(1),\n map(() => {\n const active = getActiveElement()\n return typeof active !== \"undefined\"\n ? el.contains(active)\n : false\n }),\n startWith(el === getActiveElement()),\n distinctUntilChanged()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n animationFrameScheduler,\n auditTime,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\nimport { ElementOffset } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element content offset (= scroll offset)\n *\n * @param el - Element\n *\n * @returns Element content offset\n */\nexport function getElementContentOffset(\n el: HTMLElement\n): ElementOffset {\n return {\n x: el.scrollLeft,\n y: el.scrollTop\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element content offset\n *\n * @param el - Element\n *\n * @returns Element content offset observable\n */\nexport function watchElementContentOffset(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(el, \"scroll\"),\n fromEvent(window, \"resize\")\n )\n .pipe(\n auditTime(0, animationFrameScheduler),\n map(() => getElementContentOffset(el)),\n startWith(getElementContentOffset(el))\n )\n}\n", "/**\r\n * A collection of shims that provide minimal functionality of the ES6 collections.\r\n *\r\n * These implementations are not meant to be used outside of the ResizeObserver\r\n * modules as they cover only a limited range of use cases.\r\n */\r\n/* eslint-disable require-jsdoc, valid-jsdoc */\r\nvar MapShim = (function () {\r\n if (typeof Map !== 'undefined') {\r\n return Map;\r\n }\r\n /**\r\n * Returns index in provided array that matches the specified key.\r\n *\r\n * @param {Array} arr\r\n * @param {*} key\r\n * @returns {number}\r\n */\r\n function getIndex(arr, key) {\r\n var result = -1;\r\n arr.some(function (entry, index) {\r\n if (entry[0] === key) {\r\n result = index;\r\n return true;\r\n }\r\n return false;\r\n });\r\n return result;\r\n }\r\n return /** @class */ (function () {\r\n function class_1() {\r\n this.__entries__ = [];\r\n }\r\n Object.defineProperty(class_1.prototype, \"size\", {\r\n /**\r\n * @returns {boolean}\r\n */\r\n get: function () {\r\n return this.__entries__.length;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @param {*} key\r\n * @returns {*}\r\n */\r\n class_1.prototype.get = function (key) {\r\n var index = getIndex(this.__entries__, key);\r\n var entry = this.__entries__[index];\r\n return entry && entry[1];\r\n };\r\n /**\r\n * @param {*} key\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\n class_1.prototype.set = function (key, value) {\r\n var index = getIndex(this.__entries__, key);\r\n if (~index) {\r\n this.__entries__[index][1] = value;\r\n }\r\n else {\r\n this.__entries__.push([key, value]);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.delete = function (key) {\r\n var entries = this.__entries__;\r\n var index = getIndex(entries, key);\r\n if (~index) {\r\n entries.splice(index, 1);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.has = function (key) {\r\n return !!~getIndex(this.__entries__, key);\r\n };\r\n /**\r\n * @returns {void}\r\n */\r\n class_1.prototype.clear = function () {\r\n this.__entries__.splice(0);\r\n };\r\n /**\r\n * @param {Function} callback\r\n * @param {*} [ctx=null]\r\n * @returns {void}\r\n */\r\n class_1.prototype.forEach = function (callback, ctx) {\r\n if (ctx === void 0) { ctx = null; }\r\n for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {\r\n var entry = _a[_i];\r\n callback.call(ctx, entry[1], entry[0]);\r\n }\r\n };\r\n return class_1;\r\n }());\r\n})();\n\n/**\r\n * Detects whether window and document objects are available in current environment.\r\n */\r\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;\n\n// Returns global object of a current environment.\r\nvar global$1 = (function () {\r\n if (typeof global !== 'undefined' && global.Math === Math) {\r\n return global;\r\n }\r\n if (typeof self !== 'undefined' && self.Math === Math) {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined' && window.Math === Math) {\r\n return window;\r\n }\r\n // eslint-disable-next-line no-new-func\r\n return Function('return this')();\r\n})();\n\n/**\r\n * A shim for the requestAnimationFrame which falls back to the setTimeout if\r\n * first one is not supported.\r\n *\r\n * @returns {number} Requests' identifier.\r\n */\r\nvar requestAnimationFrame$1 = (function () {\r\n if (typeof requestAnimationFrame === 'function') {\r\n // It's required to use a bounded function because IE sometimes throws\r\n // an \"Invalid calling object\" error if rAF is invoked without the global\r\n // object on the left hand side.\r\n return requestAnimationFrame.bind(global$1);\r\n }\r\n return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };\r\n})();\n\n// Defines minimum timeout before adding a trailing call.\r\nvar trailingTimeout = 2;\r\n/**\r\n * Creates a wrapper function which ensures that provided callback will be\r\n * invoked only once during the specified delay period.\r\n *\r\n * @param {Function} callback - Function to be invoked after the delay period.\r\n * @param {number} delay - Delay after which to invoke callback.\r\n * @returns {Function}\r\n */\r\nfunction throttle (callback, delay) {\r\n var leadingCall = false, trailingCall = false, lastCallTime = 0;\r\n /**\r\n * Invokes the original callback function and schedules new invocation if\r\n * the \"proxy\" was called during current request.\r\n *\r\n * @returns {void}\r\n */\r\n function resolvePending() {\r\n if (leadingCall) {\r\n leadingCall = false;\r\n callback();\r\n }\r\n if (trailingCall) {\r\n proxy();\r\n }\r\n }\r\n /**\r\n * Callback invoked after the specified delay. It will further postpone\r\n * invocation of the original function delegating it to the\r\n * requestAnimationFrame.\r\n *\r\n * @returns {void}\r\n */\r\n function timeoutCallback() {\r\n requestAnimationFrame$1(resolvePending);\r\n }\r\n /**\r\n * Schedules invocation of the original function.\r\n *\r\n * @returns {void}\r\n */\r\n function proxy() {\r\n var timeStamp = Date.now();\r\n if (leadingCall) {\r\n // Reject immediately following calls.\r\n if (timeStamp - lastCallTime < trailingTimeout) {\r\n return;\r\n }\r\n // Schedule new call to be in invoked when the pending one is resolved.\r\n // This is important for \"transitions\" which never actually start\r\n // immediately so there is a chance that we might miss one if change\r\n // happens amids the pending invocation.\r\n trailingCall = true;\r\n }\r\n else {\r\n leadingCall = true;\r\n trailingCall = false;\r\n setTimeout(timeoutCallback, delay);\r\n }\r\n lastCallTime = timeStamp;\r\n }\r\n return proxy;\r\n}\n\n// Minimum delay before invoking the update of observers.\r\nvar REFRESH_DELAY = 20;\r\n// A list of substrings of CSS properties used to find transition events that\r\n// might affect dimensions of observed elements.\r\nvar transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];\r\n// Check if MutationObserver is available.\r\nvar mutationObserverSupported = typeof MutationObserver !== 'undefined';\r\n/**\r\n * Singleton controller class which handles updates of ResizeObserver instances.\r\n */\r\nvar ResizeObserverController = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserverController.\r\n *\r\n * @private\r\n */\r\n function ResizeObserverController() {\r\n /**\r\n * Indicates whether DOM listeners have been added.\r\n *\r\n * @private {boolean}\r\n */\r\n this.connected_ = false;\r\n /**\r\n * Tells that controller has subscribed for Mutation Events.\r\n *\r\n * @private {boolean}\r\n */\r\n this.mutationEventsAdded_ = false;\r\n /**\r\n * Keeps reference to the instance of MutationObserver.\r\n *\r\n * @private {MutationObserver}\r\n */\r\n this.mutationsObserver_ = null;\r\n /**\r\n * A list of connected observers.\r\n *\r\n * @private {Array}\r\n */\r\n this.observers_ = [];\r\n this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);\r\n this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);\r\n }\r\n /**\r\n * Adds observer to observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be added.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.addObserver = function (observer) {\r\n if (!~this.observers_.indexOf(observer)) {\r\n this.observers_.push(observer);\r\n }\r\n // Add listeners if they haven't been added yet.\r\n if (!this.connected_) {\r\n this.connect_();\r\n }\r\n };\r\n /**\r\n * Removes observer from observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be removed.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.removeObserver = function (observer) {\r\n var observers = this.observers_;\r\n var index = observers.indexOf(observer);\r\n // Remove observer if it's present in registry.\r\n if (~index) {\r\n observers.splice(index, 1);\r\n }\r\n // Remove listeners if controller has no connected observers.\r\n if (!observers.length && this.connected_) {\r\n this.disconnect_();\r\n }\r\n };\r\n /**\r\n * Invokes the update of observers. It will continue running updates insofar\r\n * it detects changes.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.refresh = function () {\r\n var changesDetected = this.updateObservers_();\r\n // Continue running updates if changes have been detected as there might\r\n // be future ones caused by CSS transitions.\r\n if (changesDetected) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Updates every observer from observers list and notifies them of queued\r\n * entries.\r\n *\r\n * @private\r\n * @returns {boolean} Returns \"true\" if any observer has detected changes in\r\n * dimensions of it's elements.\r\n */\r\n ResizeObserverController.prototype.updateObservers_ = function () {\r\n // Collect observers that have active observations.\r\n var activeObservers = this.observers_.filter(function (observer) {\r\n return observer.gatherActive(), observer.hasActive();\r\n });\r\n // Deliver notifications in a separate cycle in order to avoid any\r\n // collisions between observers, e.g. when multiple instances of\r\n // ResizeObserver are tracking the same element and the callback of one\r\n // of them changes content dimensions of the observed target. Sometimes\r\n // this may result in notifications being blocked for the rest of observers.\r\n activeObservers.forEach(function (observer) { return observer.broadcastActive(); });\r\n return activeObservers.length > 0;\r\n };\r\n /**\r\n * Initializes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.connect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already added.\r\n if (!isBrowser || this.connected_) {\r\n return;\r\n }\r\n // Subscription to the \"Transitionend\" event is used as a workaround for\r\n // delayed transitions. This way it's possible to capture at least the\r\n // final state of an element.\r\n document.addEventListener('transitionend', this.onTransitionEnd_);\r\n window.addEventListener('resize', this.refresh);\r\n if (mutationObserverSupported) {\r\n this.mutationsObserver_ = new MutationObserver(this.refresh);\r\n this.mutationsObserver_.observe(document, {\r\n attributes: true,\r\n childList: true,\r\n characterData: true,\r\n subtree: true\r\n });\r\n }\r\n else {\r\n document.addEventListener('DOMSubtreeModified', this.refresh);\r\n this.mutationEventsAdded_ = true;\r\n }\r\n this.connected_ = true;\r\n };\r\n /**\r\n * Removes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.disconnect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already removed.\r\n if (!isBrowser || !this.connected_) {\r\n return;\r\n }\r\n document.removeEventListener('transitionend', this.onTransitionEnd_);\r\n window.removeEventListener('resize', this.refresh);\r\n if (this.mutationsObserver_) {\r\n this.mutationsObserver_.disconnect();\r\n }\r\n if (this.mutationEventsAdded_) {\r\n document.removeEventListener('DOMSubtreeModified', this.refresh);\r\n }\r\n this.mutationsObserver_ = null;\r\n this.mutationEventsAdded_ = false;\r\n this.connected_ = false;\r\n };\r\n /**\r\n * \"Transitionend\" event handler.\r\n *\r\n * @private\r\n * @param {TransitionEvent} event\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {\r\n var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b;\r\n // Detect whether transition may affect dimensions of an element.\r\n var isReflowProperty = transitionKeys.some(function (key) {\r\n return !!~propertyName.indexOf(key);\r\n });\r\n if (isReflowProperty) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Returns instance of the ResizeObserverController.\r\n *\r\n * @returns {ResizeObserverController}\r\n */\r\n ResizeObserverController.getInstance = function () {\r\n if (!this.instance_) {\r\n this.instance_ = new ResizeObserverController();\r\n }\r\n return this.instance_;\r\n };\r\n /**\r\n * Holds reference to the controller's instance.\r\n *\r\n * @private {ResizeObserverController}\r\n */\r\n ResizeObserverController.instance_ = null;\r\n return ResizeObserverController;\r\n}());\n\n/**\r\n * Defines non-writable/enumerable properties of the provided target object.\r\n *\r\n * @param {Object} target - Object for which to define properties.\r\n * @param {Object} props - Properties to be defined.\r\n * @returns {Object} Target object.\r\n */\r\nvar defineConfigurable = (function (target, props) {\r\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\r\n var key = _a[_i];\r\n Object.defineProperty(target, key, {\r\n value: props[key],\r\n enumerable: false,\r\n writable: false,\r\n configurable: true\r\n });\r\n }\r\n return target;\r\n});\n\n/**\r\n * Returns the global object associated with provided element.\r\n *\r\n * @param {Object} target\r\n * @returns {Object}\r\n */\r\nvar getWindowOf = (function (target) {\r\n // Assume that the element is an instance of Node, which means that it\r\n // has the \"ownerDocument\" property from which we can retrieve a\r\n // corresponding global object.\r\n var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;\r\n // Return the local global object if it's not possible extract one from\r\n // provided element.\r\n return ownerGlobal || global$1;\r\n});\n\n// Placeholder of an empty content rectangle.\r\nvar emptyRect = createRectInit(0, 0, 0, 0);\r\n/**\r\n * Converts provided string to a number.\r\n *\r\n * @param {number|string} value\r\n * @returns {number}\r\n */\r\nfunction toFloat(value) {\r\n return parseFloat(value) || 0;\r\n}\r\n/**\r\n * Extracts borders size from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @param {...string} positions - Borders positions (top, right, ...)\r\n * @returns {number}\r\n */\r\nfunction getBordersSize(styles) {\r\n var positions = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n positions[_i - 1] = arguments[_i];\r\n }\r\n return positions.reduce(function (size, position) {\r\n var value = styles['border-' + position + '-width'];\r\n return size + toFloat(value);\r\n }, 0);\r\n}\r\n/**\r\n * Extracts paddings sizes from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @returns {Object} Paddings box.\r\n */\r\nfunction getPaddings(styles) {\r\n var positions = ['top', 'right', 'bottom', 'left'];\r\n var paddings = {};\r\n for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {\r\n var position = positions_1[_i];\r\n var value = styles['padding-' + position];\r\n paddings[position] = toFloat(value);\r\n }\r\n return paddings;\r\n}\r\n/**\r\n * Calculates content rectangle of provided SVG element.\r\n *\r\n * @param {SVGGraphicsElement} target - Element content rectangle of which needs\r\n * to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getSVGContentRect(target) {\r\n var bbox = target.getBBox();\r\n return createRectInit(0, 0, bbox.width, bbox.height);\r\n}\r\n/**\r\n * Calculates content rectangle of provided HTMLElement.\r\n *\r\n * @param {HTMLElement} target - Element for which to calculate the content rectangle.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getHTMLElementContentRect(target) {\r\n // Client width & height properties can't be\r\n // used exclusively as they provide rounded values.\r\n var clientWidth = target.clientWidth, clientHeight = target.clientHeight;\r\n // By this condition we can catch all non-replaced inline, hidden and\r\n // detached elements. Though elements with width & height properties less\r\n // than 0.5 will be discarded as well.\r\n //\r\n // Without it we would need to implement separate methods for each of\r\n // those cases and it's not possible to perform a precise and performance\r\n // effective test for hidden elements. E.g. even jQuery's ':visible' filter\r\n // gives wrong results for elements with width & height less than 0.5.\r\n if (!clientWidth && !clientHeight) {\r\n return emptyRect;\r\n }\r\n var styles = getWindowOf(target).getComputedStyle(target);\r\n var paddings = getPaddings(styles);\r\n var horizPad = paddings.left + paddings.right;\r\n var vertPad = paddings.top + paddings.bottom;\r\n // Computed styles of width & height are being used because they are the\r\n // only dimensions available to JS that contain non-rounded values. It could\r\n // be possible to utilize the getBoundingClientRect if only it's data wasn't\r\n // affected by CSS transformations let alone paddings, borders and scroll bars.\r\n var width = toFloat(styles.width), height = toFloat(styles.height);\r\n // Width & height include paddings and borders when the 'border-box' box\r\n // model is applied (except for IE).\r\n if (styles.boxSizing === 'border-box') {\r\n // Following conditions are required to handle Internet Explorer which\r\n // doesn't include paddings and borders to computed CSS dimensions.\r\n //\r\n // We can say that if CSS dimensions + paddings are equal to the \"client\"\r\n // properties then it's either IE, and thus we don't need to subtract\r\n // anything, or an element merely doesn't have paddings/borders styles.\r\n if (Math.round(width + horizPad) !== clientWidth) {\r\n width -= getBordersSize(styles, 'left', 'right') + horizPad;\r\n }\r\n if (Math.round(height + vertPad) !== clientHeight) {\r\n height -= getBordersSize(styles, 'top', 'bottom') + vertPad;\r\n }\r\n }\r\n // Following steps can't be applied to the document's root element as its\r\n // client[Width/Height] properties represent viewport area of the window.\r\n // Besides, it's as well not necessary as the itself neither has\r\n // rendered scroll bars nor it can be clipped.\r\n if (!isDocumentElement(target)) {\r\n // In some browsers (only in Firefox, actually) CSS width & height\r\n // include scroll bars size which can be removed at this step as scroll\r\n // bars are the only difference between rounded dimensions + paddings\r\n // and \"client\" properties, though that is not always true in Chrome.\r\n var vertScrollbar = Math.round(width + horizPad) - clientWidth;\r\n var horizScrollbar = Math.round(height + vertPad) - clientHeight;\r\n // Chrome has a rather weird rounding of \"client\" properties.\r\n // E.g. for an element with content width of 314.2px it sometimes gives\r\n // the client width of 315px and for the width of 314.7px it may give\r\n // 314px. And it doesn't happen all the time. So just ignore this delta\r\n // as a non-relevant.\r\n if (Math.abs(vertScrollbar) !== 1) {\r\n width -= vertScrollbar;\r\n }\r\n if (Math.abs(horizScrollbar) !== 1) {\r\n height -= horizScrollbar;\r\n }\r\n }\r\n return createRectInit(paddings.left, paddings.top, width, height);\r\n}\r\n/**\r\n * Checks whether provided element is an instance of the SVGGraphicsElement.\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nvar isSVGGraphicsElement = (function () {\r\n // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement\r\n // interface.\r\n if (typeof SVGGraphicsElement !== 'undefined') {\r\n return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };\r\n }\r\n // If it's so, then check that element is at least an instance of the\r\n // SVGElement and that it has the \"getBBox\" method.\r\n // eslint-disable-next-line no-extra-parens\r\n return function (target) { return (target instanceof getWindowOf(target).SVGElement &&\r\n typeof target.getBBox === 'function'); };\r\n})();\r\n/**\r\n * Checks whether provided element is a document element ().\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nfunction isDocumentElement(target) {\r\n return target === getWindowOf(target).document.documentElement;\r\n}\r\n/**\r\n * Calculates an appropriate content rectangle for provided html or svg element.\r\n *\r\n * @param {Element} target - Element content rectangle of which needs to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getContentRect(target) {\r\n if (!isBrowser) {\r\n return emptyRect;\r\n }\r\n if (isSVGGraphicsElement(target)) {\r\n return getSVGContentRect(target);\r\n }\r\n return getHTMLElementContentRect(target);\r\n}\r\n/**\r\n * Creates rectangle with an interface of the DOMRectReadOnly.\r\n * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly\r\n *\r\n * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.\r\n * @returns {DOMRectReadOnly}\r\n */\r\nfunction createReadOnlyRect(_a) {\r\n var x = _a.x, y = _a.y, width = _a.width, height = _a.height;\r\n // If DOMRectReadOnly is available use it as a prototype for the rectangle.\r\n var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;\r\n var rect = Object.create(Constr.prototype);\r\n // Rectangle's properties are not writable and non-enumerable.\r\n defineConfigurable(rect, {\r\n x: x, y: y, width: width, height: height,\r\n top: y,\r\n right: x + width,\r\n bottom: height + y,\r\n left: x\r\n });\r\n return rect;\r\n}\r\n/**\r\n * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.\r\n * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit\r\n *\r\n * @param {number} x - X coordinate.\r\n * @param {number} y - Y coordinate.\r\n * @param {number} width - Rectangle's width.\r\n * @param {number} height - Rectangle's height.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction createRectInit(x, y, width, height) {\r\n return { x: x, y: y, width: width, height: height };\r\n}\n\n/**\r\n * Class that is responsible for computations of the content rectangle of\r\n * provided DOM element and for keeping track of it's changes.\r\n */\r\nvar ResizeObservation = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObservation.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n */\r\n function ResizeObservation(target) {\r\n /**\r\n * Broadcasted width of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastWidth = 0;\r\n /**\r\n * Broadcasted height of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastHeight = 0;\r\n /**\r\n * Reference to the last observed content rectangle.\r\n *\r\n * @private {DOMRectInit}\r\n */\r\n this.contentRect_ = createRectInit(0, 0, 0, 0);\r\n this.target = target;\r\n }\r\n /**\r\n * Updates content rectangle and tells whether it's width or height properties\r\n * have changed since the last broadcast.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObservation.prototype.isActive = function () {\r\n var rect = getContentRect(this.target);\r\n this.contentRect_ = rect;\r\n return (rect.width !== this.broadcastWidth ||\r\n rect.height !== this.broadcastHeight);\r\n };\r\n /**\r\n * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data\r\n * from the corresponding properties of the last observed content rectangle.\r\n *\r\n * @returns {DOMRectInit} Last observed content rectangle.\r\n */\r\n ResizeObservation.prototype.broadcastRect = function () {\r\n var rect = this.contentRect_;\r\n this.broadcastWidth = rect.width;\r\n this.broadcastHeight = rect.height;\r\n return rect;\r\n };\r\n return ResizeObservation;\r\n}());\n\nvar ResizeObserverEntry = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObserverEntry.\r\n *\r\n * @param {Element} target - Element that is being observed.\r\n * @param {DOMRectInit} rectInit - Data of the element's content rectangle.\r\n */\r\n function ResizeObserverEntry(target, rectInit) {\r\n var contentRect = createReadOnlyRect(rectInit);\r\n // According to the specification following properties are not writable\r\n // and are also not enumerable in the native implementation.\r\n //\r\n // Property accessors are not being used as they'd require to define a\r\n // private WeakMap storage which may cause memory leaks in browsers that\r\n // don't support this type of collections.\r\n defineConfigurable(this, { target: target, contentRect: contentRect });\r\n }\r\n return ResizeObserverEntry;\r\n}());\n\nvar ResizeObserverSPI = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback function that is invoked\r\n * when one of the observed elements changes it's content dimensions.\r\n * @param {ResizeObserverController} controller - Controller instance which\r\n * is responsible for the updates of observer.\r\n * @param {ResizeObserver} callbackCtx - Reference to the public\r\n * ResizeObserver instance which will be passed to callback function.\r\n */\r\n function ResizeObserverSPI(callback, controller, callbackCtx) {\r\n /**\r\n * Collection of resize observations that have detected changes in dimensions\r\n * of elements.\r\n *\r\n * @private {Array}\r\n */\r\n this.activeObservations_ = [];\r\n /**\r\n * Registry of the ResizeObservation instances.\r\n *\r\n * @private {Map}\r\n */\r\n this.observations_ = new MapShim();\r\n if (typeof callback !== 'function') {\r\n throw new TypeError('The callback provided as parameter 1 is not a function.');\r\n }\r\n this.callback_ = callback;\r\n this.controller_ = controller;\r\n this.callbackCtx_ = callbackCtx;\r\n }\r\n /**\r\n * Starts observing provided element.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.observe = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is already being observed.\r\n if (observations.has(target)) {\r\n return;\r\n }\r\n observations.set(target, new ResizeObservation(target));\r\n this.controller_.addObserver(this);\r\n // Force the update of observations.\r\n this.controller_.refresh();\r\n };\r\n /**\r\n * Stops observing provided element.\r\n *\r\n * @param {Element} target - Element to stop observing.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.unobserve = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is not being observed.\r\n if (!observations.has(target)) {\r\n return;\r\n }\r\n observations.delete(target);\r\n if (!observations.size) {\r\n this.controller_.removeObserver(this);\r\n }\r\n };\r\n /**\r\n * Stops observing all elements.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.disconnect = function () {\r\n this.clearActive();\r\n this.observations_.clear();\r\n this.controller_.removeObserver(this);\r\n };\r\n /**\r\n * Collects observation instances the associated element of which has changed\r\n * it's content rectangle.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.gatherActive = function () {\r\n var _this = this;\r\n this.clearActive();\r\n this.observations_.forEach(function (observation) {\r\n if (observation.isActive()) {\r\n _this.activeObservations_.push(observation);\r\n }\r\n });\r\n };\r\n /**\r\n * Invokes initial callback function with a list of ResizeObserverEntry\r\n * instances collected from active resize observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.broadcastActive = function () {\r\n // Do nothing if observer doesn't have active observations.\r\n if (!this.hasActive()) {\r\n return;\r\n }\r\n var ctx = this.callbackCtx_;\r\n // Create ResizeObserverEntry instance for every active observation.\r\n var entries = this.activeObservations_.map(function (observation) {\r\n return new ResizeObserverEntry(observation.target, observation.broadcastRect());\r\n });\r\n this.callback_.call(ctx, entries, ctx);\r\n this.clearActive();\r\n };\r\n /**\r\n * Clears the collection of active observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.clearActive = function () {\r\n this.activeObservations_.splice(0);\r\n };\r\n /**\r\n * Tells whether observer has active observations.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObserverSPI.prototype.hasActive = function () {\r\n return this.activeObservations_.length > 0;\r\n };\r\n return ResizeObserverSPI;\r\n}());\n\n// Registry of internal observers. If WeakMap is not available use current shim\r\n// for the Map collection as it has all required methods and because WeakMap\r\n// can't be fully polyfilled anyway.\r\nvar observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();\r\n/**\r\n * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation\r\n * exposing only those methods and properties that are defined in the spec.\r\n */\r\nvar ResizeObserver = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback that is invoked when\r\n * dimensions of the observed elements change.\r\n */\r\n function ResizeObserver(callback) {\r\n if (!(this instanceof ResizeObserver)) {\r\n throw new TypeError('Cannot call a class as a function.');\r\n }\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n var controller = ResizeObserverController.getInstance();\r\n var observer = new ResizeObserverSPI(callback, controller, this);\r\n observers.set(this, observer);\r\n }\r\n return ResizeObserver;\r\n}());\r\n// Expose public methods of ResizeObserver.\r\n[\r\n 'observe',\r\n 'unobserve',\r\n 'disconnect'\r\n].forEach(function (method) {\r\n ResizeObserver.prototype[method] = function () {\r\n var _a;\r\n return (_a = observers.get(this))[method].apply(_a, arguments);\r\n };\r\n});\n\nvar index = (function () {\r\n // Export existing implementation if available.\r\n if (typeof global$1.ResizeObserver !== 'undefined') {\r\n return global$1.ResizeObserver;\r\n }\r\n return ResizeObserver;\r\n})();\n\nexport default index;\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport ResizeObserver from \"resize-observer-polyfill\"\nimport {\n NEVER,\n Observable,\n Subject,\n defer,\n filter,\n finalize,\n map,\n merge,\n of,\n shareReplay,\n startWith,\n switchMap,\n tap\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Element offset\n */\nexport interface ElementSize {\n width: number /* Element width */\n height: number /* Element height */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Resize observer entry subject\n */\nconst entry$ = new Subject()\n\n/**\n * Resize observer observable\n *\n * This observable will create a `ResizeObserver` on the first subscription\n * and will automatically terminate it when there are no more subscribers.\n * It's quite important to centralize observation in a single `ResizeObserver`,\n * as the performance difference can be quite dramatic, as the link shows.\n *\n * @see https://bit.ly/3iIYfEm - Google Groups on performance\n */\nconst observer$ = defer(() => of(\n new ResizeObserver(entries => {\n for (const entry of entries)\n entry$.next(entry)\n })\n))\n .pipe(\n switchMap(observer => merge(NEVER, of(observer))\n .pipe(\n finalize(() => observer.disconnect())\n )\n ),\n shareReplay(1)\n )\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element size\n *\n * @param el - Element\n *\n * @returns Element size\n */\nexport function getElementSize(\n el: HTMLElement\n): ElementSize {\n return {\n width: el.offsetWidth,\n height: el.offsetHeight\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element size\n *\n * This function returns an observable that subscribes to a single internal\n * instance of `ResizeObserver` upon subscription, and emit resize events until\n * termination. Note that this function should not be called with the same\n * element twice, as the first unsubscription will terminate observation.\n *\n * Sadly, we can't use the `DOMRect` objects returned by the observer, because\n * we need the emitted values to be consistent with `getElementSize`, which will\n * return the used values (rounded) and not actual values (unrounded). Thus, we\n * use the `offset*` properties. See the linked GitHub issue.\n *\n * @see https://bit.ly/3m0k3he - GitHub issue\n *\n * @param el - Element\n *\n * @returns Element size observable\n */\nexport function watchElementSize(\n el: HTMLElement\n): Observable {\n return observer$\n .pipe(\n tap(observer => observer.observe(el)),\n switchMap(observer => entry$\n .pipe(\n filter(({ target }) => target === el),\n finalize(() => observer.unobserve(el)),\n map(() => getElementSize(el))\n )\n ),\n startWith(getElementSize(el))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ElementSize } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element content size (= scroll width and height)\n *\n * @param el - Element\n *\n * @returns Element content size\n */\nexport function getElementContentSize(\n el: HTMLElement\n): ElementSize {\n return {\n width: el.scrollWidth,\n height: el.scrollHeight\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n NEVER,\n Observable,\n Subject,\n defer,\n distinctUntilChanged,\n filter,\n finalize,\n map,\n merge,\n of,\n shareReplay,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport {\n getElementContentSize,\n getElementSize,\n watchElementContentOffset\n} from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Intersection observer entry subject\n */\nconst entry$ = new Subject()\n\n/**\n * Intersection observer observable\n *\n * This observable will create an `IntersectionObserver` on first subscription\n * and will automatically terminate it when there are no more subscribers.\n *\n * @see https://bit.ly/3iIYfEm - Google Groups on performance\n */\nconst observer$ = defer(() => of(\n new IntersectionObserver(entries => {\n for (const entry of entries)\n entry$.next(entry)\n }, {\n threshold: 0\n })\n))\n .pipe(\n switchMap(observer => merge(NEVER, of(observer))\n .pipe(\n finalize(() => observer.disconnect())\n )\n ),\n shareReplay(1)\n )\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch element visibility\n *\n * @param el - Element\n *\n * @returns Element visibility observable\n */\nexport function watchElementVisibility(\n el: HTMLElement\n): Observable {\n return observer$\n .pipe(\n tap(observer => observer.observe(el)),\n switchMap(observer => entry$\n .pipe(\n filter(({ target }) => target === el),\n finalize(() => observer.unobserve(el)),\n map(({ isIntersecting }) => isIntersecting)\n )\n )\n )\n}\n\n/**\n * Watch element boundary\n *\n * This function returns an observable which emits whether the bottom content\n * boundary (= scroll offset) of an element is within a certain threshold.\n *\n * @param el - Element\n * @param threshold - Threshold\n *\n * @returns Element boundary observable\n */\nexport function watchElementBoundary(\n el: HTMLElement, threshold = 16\n): Observable {\n return watchElementContentOffset(el)\n .pipe(\n map(({ y }) => {\n const visible = getElementSize(el)\n const content = getElementContentSize(el)\n return y >= (\n content.height - visible.height - threshold\n )\n }),\n distinctUntilChanged()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n startWith\n} from \"rxjs\"\n\nimport { getElement } from \"../element\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle\n */\nexport type Toggle =\n | \"drawer\" /* Toggle for drawer */\n | \"search\" /* Toggle for search */\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle map\n */\nconst toggles: Record = {\n drawer: getElement(\"[data-md-toggle=drawer]\"),\n search: getElement(\"[data-md-toggle=search]\")\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve the value of a toggle\n *\n * @param name - Toggle\n *\n * @returns Toggle value\n */\nexport function getToggle(name: Toggle): boolean {\n return toggles[name].checked\n}\n\n/**\n * Set toggle\n *\n * Simulating a click event seems to be the most cross-browser compatible way\n * of changing the value while also emitting a `change` event. Before, Material\n * used `CustomEvent` to programmatically change the value of a toggle, but this\n * is a much simpler and cleaner solution which doesn't require a polyfill.\n *\n * @param name - Toggle\n * @param value - Toggle value\n */\nexport function setToggle(name: Toggle, value: boolean): void {\n if (toggles[name].checked !== value)\n toggles[name].click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch toggle\n *\n * @param name - Toggle\n *\n * @returns Toggle value observable\n */\nexport function watchToggle(name: Toggle): Observable {\n const el = toggles[name]\n return fromEvent(el, \"change\")\n .pipe(\n map(() => el.checked),\n startWith(el.checked)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Subject } from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location\n *\n * This function returns a `URL` object (and not `Location`) to normalize the\n * typings across the application. Furthermore, locations need to be tracked\n * without setting them and `Location` is a singleton which represents the\n * current location.\n *\n * @returns URL\n */\nexport function getLocation(): URL {\n return new URL(location.href)\n}\n\n/**\n * Set location\n *\n * @param url - URL to change to\n */\nexport function setLocation(url: URL): void {\n location.href = url.href\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location\n *\n * @returns Location subject\n */\nexport function watchLocation(): Subject {\n return new Subject()\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { JSX as JSXInternal } from \"preact\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * HTML attributes\n */\ntype Attributes =\n & JSXInternal.HTMLAttributes\n & JSXInternal.SVGAttributes\n & Record\n\n/**\n * Child element\n */\ntype Child =\n | HTMLElement\n | Text\n | string\n | number\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Append a child node to an element\n *\n * @param el - Element\n * @param child - Child node(s)\n */\nfunction appendChild(el: HTMLElement, child: Child | Child[]): void {\n\n /* Handle primitive types (including raw HTML) */\n if (typeof child === \"string\" || typeof child === \"number\") {\n el.innerHTML += child.toString()\n\n /* Handle nodes */\n } else if (child instanceof Node) {\n el.appendChild(child)\n\n /* Handle nested children */\n } else if (Array.isArray(child)) {\n for (const node of child)\n appendChild(el, node)\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * JSX factory\n *\n * @template T - Element type\n *\n * @param tag - HTML tag\n * @param attributes - HTML attributes\n * @param children - Child elements\n *\n * @returns Element\n */\nexport function h(\n tag: T, attributes?: Attributes | null, ...children: Child[]\n): HTMLElementTagNameMap[T]\n\nexport function h(\n tag: string, attributes?: Attributes | null, ...children: Child[]\n): T\n\nexport function h(\n tag: string, attributes?: Attributes | null, ...children: Child[]\n): T {\n const el = document.createElement(tag)\n\n /* Set attributes, if any */\n if (attributes)\n for (const attr of Object.keys(attributes)) {\n if (typeof attributes[attr] === \"undefined\")\n continue\n\n /* Set default attribute or boolean */\n if (typeof attributes[attr] !== \"boolean\")\n el.setAttribute(attr, attributes[attr])\n else\n el.setAttribute(attr, \"\")\n }\n\n /* Append child nodes */\n for (const child of children)\n appendChild(el, child)\n\n /* Return element */\n return el as T\n}\n\n/* ----------------------------------------------------------------------------\n * Namespace\n * ------------------------------------------------------------------------- */\n\nexport declare namespace h {\n namespace JSX {\n type Element = HTMLElement\n type IntrinsicElements = JSXInternal.IntrinsicElements\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Truncate a string after the given number of characters\n *\n * This is not a very reasonable approach, since the summaries kind of suck.\n * It would be better to create something more intelligent, highlighting the\n * search occurrences and making a better summary out of it, but this note was\n * written three years ago, so who knows if we'll ever fix it.\n *\n * @param value - Value to be truncated\n * @param n - Number of characters\n *\n * @returns Truncated value\n */\nexport function truncate(value: string, n: number): string {\n let i = n\n if (value.length > i) {\n while (value[i] !== \" \" && --i > 0) { /* keep eating */ }\n return `${value.substring(0, i)}...`\n }\n return value\n}\n\n/**\n * Round a number for display with repository facts\n *\n * This is a reverse-engineered version of GitHub's weird rounding algorithm\n * for stars, forks and all other numbers. While all numbers below `1,000` are\n * returned as-is, bigger numbers are converted to fixed numbers:\n *\n * - `1,049` => `1k`\n * - `1,050` => `1.1k`\n * - `1,949` => `1.9k`\n * - `1,950` => `2k`\n *\n * @param value - Original value\n *\n * @returns Rounded value\n */\nexport function round(value: number): string {\n if (value > 999) {\n const digits = +((value - 950) % 1000 > 99)\n return `${((value + 0.000001) / 1000).toFixed(digits)}k`\n } else {\n return value.toString()\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n catchError,\n from,\n map,\n of,\n shareReplay,\n switchMap,\n throwError\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch the given URL\n *\n * If the request fails (e.g. when dispatched from `file://` locations), the\n * observable will complete without emitting a value.\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Response observable\n */\nexport function request(\n url: URL | string, options: RequestInit = { credentials: \"same-origin\" }\n): Observable {\n return from(fetch(`${url}`, options))\n .pipe(\n catchError(() => EMPTY),\n switchMap(res => res.status !== 200\n ? throwError(() => new Error(res.statusText))\n : of(res)\n )\n )\n}\n\n/**\n * Fetch JSON from the given URL\n *\n * @template T - Data type\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Data observable\n */\nexport function requestJSON(\n url: URL | string, options?: RequestInit\n): Observable {\n return request(url, options)\n .pipe(\n switchMap(res => res.json()),\n shareReplay(1)\n )\n}\n\n/**\n * Fetch XML from the given URL\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Data observable\n */\nexport function requestXML(\n url: URL | string, options?: RequestInit\n): Observable {\n const dom = new DOMParser()\n return request(url, options)\n .pipe(\n switchMap(res => res.text()),\n map(res => dom.parseFromString(res, \"text/xml\")),\n shareReplay(1)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getElement, getElements } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Component type\n */\nexport type ComponentType =\n | \"iconsearch\" /* Icon search */\n | \"iconsearch-query\" /* Icon search input */\n | \"iconsearch-result\" /* Icon search results */\n | \"sponsorship\" /* Sponsorship */\n | \"sponsorship-count\" /* Sponsorship count */\n | \"sponsorship-total\" /* Sponsorship total */\n\n/**\n * Component\n *\n * @template T - Component type\n * @template U - Reference type\n */\nexport type Component<\n T extends {} = {},\n U extends HTMLElement = HTMLElement\n> =\n T & {\n ref: U /* Component reference */\n }\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Component type map\n */\ninterface ComponentTypeMap {\n \"iconsearch\": HTMLElement /* Icon search */\n \"iconsearch-query\": HTMLInputElement /* Icon search input */\n \"iconsearch-result\": HTMLElement /* Icon search results */\n \"sponsorship\": HTMLElement /* Sponsorship */\n \"sponsorship-count\": HTMLElement /* Sponsorship count */\n \"sponsorship-total\": HTMLElement /* Sponsorship total */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve the element for a given component or throw a reference error\n *\n * @template T - Component type\n *\n * @param type - Component type\n * @param node - Node of reference\n *\n * @returns Element\n */\nexport function getComponentElement(\n type: T, node: ParentNode = document\n): ComponentTypeMap[T] {\n return getElement(`[data-mdx-component=${type}]`, node)\n}\n\n/**\n * Retrieve all elements for a given component\n *\n * @template T - Component type\n *\n * @param type - Component type\n * @param node - Node of reference\n *\n * @returns Elements\n */\nexport function getComponentElements(\n type: T, node: ParentNode = document\n): ComponentTypeMap[T][] {\n return getElements(`[data-mdx-component=${type}]`, node)\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getElement, getLocation } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Feature flag\n */\nexport type Flag =\n | \"announce.dismiss\" /* Dismissable announcement bar */\n | \"content.code.annotate\" /* Code annotations */\n | \"content.tabs.link\" /* Link content tabs */\n | \"header.autohide\" /* Hide header */\n | \"navigation.expand\" /* Automatic expansion */\n | \"navigation.indexes\" /* Section pages */\n | \"navigation.instant\" /* Instant loading */\n | \"navigation.sections\" /* Section navigation */\n | \"navigation.tabs\" /* Tabs navigation */\n | \"navigation.tabs.sticky\" /* Tabs navigation (sticky) */\n | \"navigation.top\" /* Back-to-top button */\n | \"navigation.tracking\" /* Anchor tracking */\n | \"search.highlight\" /* Search highlighting */\n | \"search.share\" /* Search sharing */\n | \"search.suggest\" /* Search suggestions */\n | \"toc.integrate\" /* Integrated table of contents */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Translation\n */\nexport type Translation =\n | \"clipboard.copy\" /* Copy to clipboard */\n | \"clipboard.copied\" /* Copied to clipboard */\n | \"search.config.lang\" /* Search language */\n | \"search.config.pipeline\" /* Search pipeline */\n | \"search.config.separator\" /* Search separator */\n | \"search.placeholder\" /* Search */\n | \"search.result.placeholder\" /* Type to start searching */\n | \"search.result.none\" /* No matching documents */\n | \"search.result.one\" /* 1 matching document */\n | \"search.result.other\" /* # matching documents */\n | \"search.result.more.one\" /* 1 more on this page */\n | \"search.result.more.other\" /* # more on this page */\n | \"search.result.term.missing\" /* Missing */\n | \"select.version.title\" /* Version selector */\n\n/**\n * Translations\n */\nexport type Translations = Record\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Versioning\n */\nexport interface Versioning {\n provider: \"mike\" /* Version provider */\n default?: string /* Default version */\n}\n\n/**\n * Configuration\n */\nexport interface Config {\n base: string /* Base URL */\n features: Flag[] /* Feature flags */\n translations: Translations /* Translations */\n search: string /* Search worker URL */\n version?: Versioning /* Versioning */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve global configuration and make base URL absolute\n */\nconst script = getElement(\"#__config\")\nconst config: Config = JSON.parse(script.textContent!)\nconfig.base = `${new URL(config.base, getLocation())}`\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve global configuration\n *\n * @returns Global configuration\n */\nexport function configuration(): Config {\n return config\n}\n\n/**\n * Check whether a feature flag is enabled\n *\n * @param flag - Feature flag\n *\n * @returns Test result\n */\nexport function feature(flag: Flag): boolean {\n return config.features.includes(flag)\n}\n\n/**\n * Retrieve the translation for the given key\n *\n * @param key - Key to be translated\n * @param value - Positional value, if any\n *\n * @returns Translation\n */\nexport function translation(\n key: Translation, value?: string | number\n): string {\n return typeof value !== \"undefined\"\n ? config.translations[key].replace(\"#\", value.toString())\n : config.translations[key]\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n delay,\n distinctUntilChanged,\n filter,\n fromEvent,\n map,\n merge,\n startWith,\n withLatestFrom\n} from \"rxjs\"\n\nimport { watchElementFocus } from \"~/browser\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Icon search query\n */\nexport interface IconSearchQuery {\n value: string /* Query value */\n focus: boolean /* Query focus */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount icon search query\n *\n * @param el - Icon search query element\n *\n * @returns Icon search query component observable\n */\nexport function mountIconSearchQuery(\n el: HTMLInputElement\n): Observable> {\n\n /* Intercept focus and input events */\n const focus$ = watchElementFocus(el)\n const value$ = merge(\n fromEvent(el, \"keyup\"),\n fromEvent(el, \"focus\").pipe(delay(1))\n )\n .pipe(\n map(() => el.value),\n startWith(el.value),\n distinctUntilChanged(),\n )\n\n /* Log search on blur */\n focus$\n .pipe(\n filter(active => !active),\n withLatestFrom(value$)\n )\n .subscribe(([, value]) => {\n const path = document.location.pathname\n if (typeof ga === \"function\" && value.length)\n ga(\"send\", \"pageview\", `${path}?q=[icon]+${value}`)\n })\n\n /* Combine into single observable */\n return combineLatest([value$, focus$])\n .pipe(\n map(([value, focus]) => ({ ref: el, value, focus })),\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { filter as search } from \"fuzzaldrin-plus\"\nimport {\n Observable,\n Subject,\n bufferCount,\n combineLatest,\n distinctUntilKeyChanged,\n filter,\n finalize,\n map,\n merge,\n of,\n switchMap,\n tap,\n withLatestFrom,\n zipWith\n} from \"rxjs\"\n\nimport {\n getElement,\n watchElementBoundary\n} from \"~/browser\"\nimport { round } from \"~/utilities\"\n\nimport { Icon, renderIconSearchResult } from \"_/templates\"\n\nimport { Component } from \"../../_\"\nimport { IconSearchIndex } from \"../_\"\nimport { IconSearchQuery } from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Icon search result\n */\nexport interface IconSearchResult {\n data: Icon[] /* Search result data */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n index$: Observable /* Search index observable */\n query$: Observable /* Search query observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n index$: Observable /* Search index observable */\n query$: Observable /* Search query observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch icon search result\n *\n * @param el - Icon search result element\n * @param options - Options\n *\n * @returns Icon search result observable\n */\nexport function watchIconSearchResult(\n el: HTMLElement, { index$, query$ }: WatchOptions\n): Observable {\n switch (el.getAttribute(\"data-mdx-mode\")) {\n\n case \"file\":\n return combineLatest([\n query$.pipe(distinctUntilKeyChanged(\"value\")),\n index$\n .pipe(\n map(({ icons }) => Object.values(icons.data)\n .map(icon => icon.replace(/\\.svg$/, \"\"))\n )\n )\n ])\n .pipe(\n map(([{ value }, data]) => search(data, value)),\n switchMap(files => index$.pipe(\n map(({ icons }) => ({\n data: files.map(shortcode => {\n return {\n shortcode,\n url: [\n icons.base,\n shortcode,\n \".svg\"\n ].join(\"\")\n }\n })\n }))\n ))\n )\n\n default:\n return combineLatest([\n query$.pipe(distinctUntilKeyChanged(\"value\")),\n index$\n .pipe(\n map(({ icons, emojis }) => [\n ...Object.keys(icons.data),\n ...Object.keys(emojis.data)\n ])\n )\n ])\n .pipe(\n map(([{ value }, data]) => search(data, value)),\n switchMap(shortcodes => index$.pipe(\n map(({ icons, emojis }) => ({\n data: shortcodes.map(shortcode => {\n const category =\n shortcode in icons.data\n ? icons\n : emojis\n return {\n shortcode,\n url: [\n category.base,\n category.data[shortcode]\n ].join(\"\")\n }\n })\n }))\n ))\n )\n }\n}\n\n/**\n * Mount icon search result\n *\n * @param el - Icon search result element\n * @param options - Options\n *\n * @returns Icon search result component observable\n */\nexport function mountIconSearchResult(\n el: HTMLElement, { index$, query$ }: MountOptions\n): Observable> {\n const push$ = new Subject()\n const boundary$ = watchElementBoundary(el)\n .pipe(\n filter(Boolean)\n )\n\n /* Update search result metadata */\n const meta = getElement(\":scope > :first-child\", el)\n push$\n .pipe(\n withLatestFrom(query$)\n )\n .subscribe(([{ data }, { value }]) => {\n if (value) {\n switch (data.length) {\n\n /* No results */\n case 0:\n meta.textContent = \"No matches\"\n break\n\n /* One result */\n case 1:\n meta.textContent = \"1 match\"\n break\n\n /* Multiple result */\n default:\n meta.textContent = `${round(data.length)} matches`\n }\n } else {\n meta.textContent = \"Type to start searching\"\n }\n })\n\n /* Update icon search result list */\n const file = el.getAttribute(\"data-mdx-mode\") === \"file\"\n const list = getElement(\":scope > :last-child\", el)\n push$\n .pipe(\n tap(() => list.innerHTML = \"\"),\n switchMap(({ data }) => merge(\n of(...data.slice(0, 10)),\n of(...data.slice(10))\n .pipe(\n bufferCount(10),\n zipWith(boundary$),\n switchMap(([chunk]) => chunk)\n )\n )),\n withLatestFrom(query$)\n )\n .subscribe(([result, { value }]) => list.appendChild(\n renderIconSearchResult(result, value, file)\n ))\n\n /* Create and return component */\n return watchIconSearchResult(el, { query$, index$ })\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { wrap } from \"fuzzaldrin-plus\"\n\nimport { translation } from \"~/_\"\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Icon\n */\nexport interface Icon {\n shortcode: string /* Icon shortcode */\n url: string /* Icon URL */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Highlight an icon search result\n *\n * @param icon - Icon\n * @param query - Search query\n *\n * @returns Highlighted result\n */\nfunction highlight(icon: Icon, query: string): string {\n return wrap(icon.shortcode, query, {\n wrap: {\n tagOpen: \"\",\n tagClose: \"\"\n }\n })\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render an icon search result\n *\n * @param icon - Icon\n * @param query - Search query\n * @param file - Render as file\n *\n * @returns Element\n */\nexport function renderIconSearchResult(\n icon: Icon, query: string, file?: boolean\n): HTMLElement {\n return (\n
  • \n \n \n \n \n {\n file\n ? highlight(icon, query)\n : `:${highlight(icon, query)}:`\n }\n \n
  • \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\nimport { SponsorUser } from \"_/components\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render public sponsor\n *\n * @param user - Sponsor user\n *\n * @returns Element\n */\nexport function renderPublicSponsor(\n user: SponsorUser\n): HTMLElement {\n const title = `@${user.name}`\n return (\n \n \n \n )\n}\n\n/**\n * Render private sponsor\n *\n * @param count - Number of private sponsors\n *\n * @returns Element\n */\nexport function renderPrivateSponsor(\n count: number\n): HTMLElement {\n return (\n \n +{count}\n \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, merge } from \"rxjs\"\n\nimport { configuration } from \"~/_\"\nimport { requestJSON } from \"~/browser\"\n\nimport { Component, getComponentElement } from \"../../_\"\nimport {\n IconSearchQuery,\n mountIconSearchQuery\n} from \"../query\"\nimport {\n IconSearchResult,\n mountIconSearchResult\n} from \"../result\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Icon category\n */\nexport interface IconCategory {\n base: string /* Category base URL */\n data: Record /* Category data */\n}\n\n/**\n * Icon search index\n */\nexport interface IconSearchIndex {\n icons: IconCategory /* Icons */\n emojis: IconCategory /* Emojis */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Icon search\n */\nexport type IconSearch =\n | IconSearchQuery\n | IconSearchResult\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount icon search\n *\n * @param el - Icon search element\n *\n * @returns Icon search component observable\n */\nexport function mountIconSearch(\n el: HTMLElement\n): Observable> {\n const config = configuration()\n const index$ = requestJSON(\n new URL(\"overrides/assets/javascripts/iconsearch_index.json\", config.base)\n )\n\n /* Retrieve query and result components */\n const query = getComponentElement(\"iconsearch-query\", el)\n const result = getComponentElement(\"iconsearch-result\", el)\n\n /* Create and return component */\n const query$ = mountIconSearchQuery(query)\n const result$ = mountIconSearchResult(result, { index$, query$ })\n return merge(query$, result$)\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, map } from \"rxjs\"\n\nimport { getElement, requestJSON } from \"~/browser\"\n\nimport { renderPrivateSponsor, renderPublicSponsor } from \"_/templates\"\n\nimport { Component, getComponentElement } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Sponsor type\n */\nexport type SponsorType =\n | \"user\" /* Sponsor is a user */\n | \"organization\" /* Sponsor is an organization */\n\n/**\n * Sponsor visibility\n */\nexport type SponsorVisibility =\n | \"public\" /* Sponsor is a user */\n | \"private\" /* Sponsor is an organization */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Sponsor user\n */\nexport interface SponsorUser {\n type: SponsorType /* Sponsor type */\n name: string /* Sponsor login name */\n image: string /* Sponsor image URL */\n url: string /* Sponsor URL */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Public sponsor\n */\nexport interface PublicSponsor {\n type: \"public\" /* Sponsor visibility */\n user: SponsorUser /* Sponsor user */\n}\n\n/**\n * Private sponsor\n */\nexport interface PrivateSponsor {\n type: \"private\" /* Sponsor visibility */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Sponsor\n */\nexport type Sponsor =\n | PublicSponsor\n | PrivateSponsor\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Sponsorship\n */\nexport interface Sponsorship {\n sponsors: Sponsor[] /* Sponsors */\n total: number /* Total amount */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount sponsorship\n *\n * @param el - Sponsorship element\n *\n * @returns Sponsorship component observable\n */\nexport function mountSponsorship(\n el: HTMLElement\n): Observable> {\n const sponsorship$ = requestJSON(\n \"https://3if8u9o552.execute-api.us-east-1.amazonaws.com/_/\"\n )\n\n /* Retrieve adjacent components */\n const count = getComponentElement(\"sponsorship-count\")\n const total = getComponentElement(\"sponsorship-total\")\n\n /* Render sponsorship */\n sponsorship$.subscribe(sponsorship => {\n el.removeAttribute(\"hidden\")\n\n /* Render public sponsors with avatar and links */\n const list = getElement(\":scope > :first-child\", el)\n for (const sponsor of sponsorship.sponsors)\n if (sponsor.type === \"public\")\n list.appendChild(renderPublicSponsor(sponsor.user))\n\n /* Render combined private sponsors */\n list.appendChild(renderPrivateSponsor(\n sponsorship.sponsors.filter(({ type }) => (\n type === \"private\"\n )).length\n ))\n\n /* Render sponsorship count and total */\n count.innerText = `${sponsorship.sponsors.length}`\n total.innerText = `$ ${sponsorship.total\n .toString()\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\")\n } a month`\n })\n\n // /* Create and return component */\n return sponsorship$\n .pipe(\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { fromEvent } from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up extra analytics events\n */\nexport function setupAnalytics(): void {\n const { origin } = new URL(location.href)\n fromEvent(document.body, \"click\")\n .subscribe(ev => {\n if (ev.target instanceof HTMLElement) {\n const el = ev.target.closest(\"a\")\n if (el && el.origin !== origin)\n ga(\"send\", \"event\", \"outbound\", \"click\", el.href)\n }\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { merge, switchMap } from \"rxjs\"\n\nimport {\n getComponentElements,\n mountIconSearch,\n mountSponsorship\n} from \"./components\"\nimport { setupAnalytics } from \"./integrations\"\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Set up extra analytics events */\nsetupAnalytics()\n\n/* Set up extra component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => merge(\n\n /* Icon search */\n ...getComponentElements(\"iconsearch\")\n .map(el => mountIconSearch(el)),\n\n /* Sponsorship */\n ...getComponentElements(\"sponsorship\")\n .map(el => mountSponsorship(el))\n ))\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n"], + "mappings": "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", + "names": ["require_tslib", "__commonJSMin", "exports", "module", "__extends", "__assign", "__rest", "__decorate", "__param", "__metadata", "__awaiter", "__generator", "__exportStar", "__values", "__read", "__spread", "__spreadArrays", "__spreadArray", "__await", "__asyncGenerator", "__asyncDelegator", "__asyncValues", "__makeTemplateObject", "__importStar", "__importDefault", "__classPrivateFieldGet", "__classPrivateFieldSet", "__createBinding", "factory", "root", "createExporter", "previous", "id", "v", "exporter", "extendStatics", "d", "b", "p", "__", "t", "s", "n", "e", "i", "decorators", "target", "key", "desc", "c", "r", "paramIndex", "decorator", "metadataKey", "metadataValue", "thisArg", "_arguments", "P", "generator", "adopt", "value", "resolve", "reject", "fulfilled", "step", "rejected", "result", "body", "_", "f", "y", "g", "verb", "op", "m", "o", "k", "k2", "ar", "error", "il", "j", "jl", "to", "from", "pack", "l", "q", "a", "resume", "settle", "fulfill", "cooked", "raw", "__setModuleDefault", "mod", "receiver", "state", "kind", "require_scorer", "__commonJSMin", "exports", "AcronymResult", "computeScore", "emptyAcronymResult", "isAcronymFullWord", "isMatch", "isSeparator", "isWordEnd", "isWordStart", "miss_coeff", "pos_bonus", "scoreAcronyms", "scoreCharacter", "scoreConsecutives", "scoreExact", "scoreExactMatch", "scorePattern", "scorePosition", "scoreSize", "tau_size", "wm", "string", "query", "options", "allowErrors", "preparedQuery", "score", "string_lw", "subject", "query_lw", "query_up", "i", "j", "m", "n", "qj_lw", "qj_up", "si", "subject_lw", "acro", "acro_score", "align", "csc_diag", "csc_row", "csc_score", "csc_should_rebuild", "miss_budget", "miss_left", "pos", "record_miss", "score_diag", "score_row", "score_up", "si_lw", "start", "sz", "curr_s", "prev_s", "len", "next_s", "c", "sc", "quality", "count", "sameCase", "end", "bonus", "posBonus", "startOfWord", "k", "mi", "nj", "pos2", "fullWord", "sepCount", "sumPos", "nbAcronymInQuery", "require_pathScorer", "__commonJSMin", "exports", "computeScore", "countDir", "file_coeff", "getExtension", "getExtensionScore", "isMatch", "scorePath", "scoreSize", "tau_depth", "_ref", "string", "query", "options", "allowErrors", "preparedQuery", "score", "string_lw", "subject", "subject_lw", "fullPathScore", "alpha", "basePathScore", "basePos", "depth", "end", "extAdjust", "fileLength", "pathSeparator", "useExtensionBonus", "path", "count", "i", "str", "pos", "candidate", "ext", "startPos", "endPos", "maxDepth", "matched", "n", "require_query", "__commonJSMin", "exports", "module", "Query", "coreChars", "countDir", "getCharCodes", "getExtension", "opt_char_re", "truncatedUpperCase", "_ref", "query", "_arg", "optCharRegEx", "pathSeparator", "_ref1", "str", "char", "upper", "_i", "_len", "charCodes", "i", "len", "require_filter", "__commonJSMin", "exports", "module", "Query", "pathScorer", "pluckCandidates", "scorer", "sortCandidates", "a", "b", "candidates", "query", "options", "bKey", "candidate", "key", "maxInners", "maxResults", "score", "scoreProvider", "scoredCandidates", "spotLeft", "string", "usePathScoring", "_i", "_len", "require_matcher", "__commonJSMin", "exports", "basenameMatch", "computeMatch", "isMatch", "isWordStart", "match", "mergeMatches", "scoreAcronyms", "scoreCharacter", "scoreConsecutives", "_ref", "string", "query", "options", "allowErrors", "baseMatches", "matches", "pathSeparator", "preparedQuery", "string_lw", "matchIndex", "matchPos", "matchPositions", "output", "strPos", "tagClass", "tagClose", "tagOpen", "_ref1", "subject", "subject_lw", "basePos", "depth", "end", "a", "b", "ai", "bj", "i", "j", "m", "n", "out", "offset", "DIAGONAL", "LEFT", "STOP", "UP", "acro_score", "align", "backtrack", "csc_diag", "csc_row", "csc_score", "move", "pos", "query_lw", "score", "score_diag", "score_row", "score_up", "si_lw", "start", "trace", "require_fuzzaldrin", "__commonJSMin", "exports", "module", "Query", "defaultPathSeparator", "filter", "matcher", "parseOptions", "pathScorer", "preparedQueryCache", "scorer", "candidates", "query", "options", "string", "_i", "_ref", "_results", "import_tslib", "__extends", "__assign", "__rest", "__decorate", "__param", "__metadata", "__awaiter", "__generator", "__exportStar", "__createBinding", "__values", "__read", "__spread", "__spreadArrays", "__spreadArray", "__await", "__asyncGenerator", "__asyncDelegator", "__asyncValues", "__makeTemplateObject", "__importStar", "__importDefault", "__classPrivateFieldGet", "__classPrivateFieldSet", "tslib", "isFunction", "value", "createErrorClass", "createImpl", "_super", "instance", "ctorFunc", "UnsubscriptionError", "createErrorClass", "_super", "errors", "err", "i", "arrRemove", "arr", "item", "index", "Subscription", "initialTeardown", "errors", "_parentage", "_parentage_1", "__values", "_parentage_1_1", "parent_1", "initialFinalizer", "isFunction", "e", "UnsubscriptionError", "_finalizers", "_finalizers_1", "_finalizers_1_1", "finalizer", "execFinalizer", "err", "__spreadArray", "__read", "teardown", "_a", "parent", "arrRemove", "empty", "EMPTY_SUBSCRIPTION", "Subscription", "isSubscription", "value", "isFunction", "execFinalizer", "finalizer", "config", "timeoutProvider", "handler", "timeout", "args", "_i", "delegate", "__spreadArray", "__read", "handle", "reportUnhandledError", "err", "timeoutProvider", "onUnhandledError", "config", "noop", "COMPLETE_NOTIFICATION", "createNotification", "errorNotification", "error", "nextNotification", "value", "kind", "context", "errorContext", "cb", "config", "isRoot", "_a", "errorThrown", "error", "captureError", "err", "Subscriber", "_super", "__extends", "destination", "_this", "isSubscription", "EMPTY_OBSERVER", "next", "error", "complete", "SafeSubscriber", "value", "handleStoppedNotification", "nextNotification", "err", "errorNotification", "COMPLETE_NOTIFICATION", "Subscription", "_bind", "bind", "fn", "thisArg", "ConsumerObserver", "partialObserver", "value", "error", "handleUnhandledError", "err", "SafeSubscriber", "_super", "__extends", "observerOrNext", "complete", "_this", "isFunction", "context_1", "config", "Subscriber", "handleUnhandledError", "error", "config", "captureError", "reportUnhandledError", "defaultErrorHandler", "err", "handleStoppedNotification", "notification", "subscriber", "onStoppedNotification", "timeoutProvider", "EMPTY_OBSERVER", "noop", "observable", "identity", "x", "pipeFromArray", "fns", "identity", "input", "prev", "fn", "Observable", "subscribe", "operator", "observable", "observerOrNext", "error", "complete", "_this", "subscriber", "isSubscriber", "SafeSubscriber", "errorContext", "_a", "source", "sink", "err", "next", "promiseCtor", "getPromiseCtor", "resolve", "reject", "value", "operations", "_i", "pipeFromArray", "x", "getPromiseCtor", "promiseCtor", "_a", "config", "isObserver", "value", "isFunction", "isSubscriber", "Subscriber", "isSubscription", "hasLift", "source", "isFunction", "operate", "init", "liftedSource", "err", "createOperatorSubscriber", "destination", "onNext", "onComplete", "onError", "onFinalize", "OperatorSubscriber", "_super", "__extends", "shouldUnsubscribe", "_this", "value", "err", "closed_1", "_a", "Subscriber", "animationFrameProvider", "callback", "request", "cancel", "delegate", "handle", "timestamp", "Subscription", "args", "_i", "__spreadArray", "__read", "ObjectUnsubscribedError", "createErrorClass", "_super", "Subject", "_super", "__extends", "_this", "operator", "subject", "AnonymousSubject", "ObjectUnsubscribedError", "value", "errorContext", "_b", "__values", "_c", "observer", "err", "observers", "_a", "subscriber", "hasError", "isStopped", "EMPTY_SUBSCRIPTION", "Subscription", "arrRemove", "thrownError", "observable", "Observable", "destination", "source", "AnonymousSubject", "_super", "__extends", "destination", "source", "_this", "value", "_b", "_a", "err", "subscriber", "EMPTY_SUBSCRIPTION", "Subject", "dateTimestampProvider", "ReplaySubject", "_super", "__extends", "_bufferSize", "_windowTime", "_timestampProvider", "dateTimestampProvider", "_this", "value", "_a", "isStopped", "_buffer", "_infiniteTimeWindow", "subscriber", "subscription", "copy", "i", "adjustedBufferSize", "now", "last", "Subject", "Action", "_super", "__extends", "scheduler", "work", "state", "delay", "Subscription", "intervalProvider", "handler", "timeout", "args", "_i", "delegate", "__spreadArray", "__read", "handle", "AsyncAction", "_super", "__extends", "scheduler", "work", "_this", "state", "delay", "id", "_id", "intervalProvider", "_scheduler", "error", "_delay", "errored", "errorValue", "e", "_a", "actions", "arrRemove", "Action", "Scheduler", "schedulerActionCtor", "now", "work", "delay", "state", "dateTimestampProvider", "AsyncScheduler", "_super", "__extends", "SchedulerAction", "now", "Scheduler", "_this", "action", "actions", "error", "asyncScheduler", "AsyncScheduler", "AsyncAction", "async", "AnimationFrameAction", "_super", "__extends", "scheduler", "work", "_this", "id", "delay", "animationFrameProvider", "action", "AsyncAction", "AnimationFrameScheduler", "_super", "__extends", "action", "flushId", "actions", "error", "AsyncScheduler", "animationFrameScheduler", "AnimationFrameScheduler", "AnimationFrameAction", "EMPTY", "Observable", "subscriber", "isScheduler", "value", "isFunction", "last", "arr", "popResultSelector", "args", "isFunction", "popScheduler", "isScheduler", "popNumber", "defaultValue", "isArrayLike", "x", "isPromise", "value", "isFunction", "isInteropObservable", "input", "isFunction", "observable", "isAsyncIterable", "obj", "isFunction", "createInvalidObservableTypeError", "input", "getSymbolIterator", "iterator", "isIterable", "input", "isFunction", "iterator", "readableStreamLikeToAsyncGenerator", "readableStream", "reader", "__await", "_a", "_b", "value", "done", "isReadableStreamLike", "obj", "isFunction", "innerFrom", "input", "Observable", "isInteropObservable", "fromInteropObservable", "isArrayLike", "fromArrayLike", "isPromise", "fromPromise", "isAsyncIterable", "fromAsyncIterable", "isIterable", "fromIterable", "isReadableStreamLike", "fromReadableStreamLike", "createInvalidObservableTypeError", "obj", "subscriber", "obs", "observable", "isFunction", "array", "i", "promise", "value", "err", "reportUnhandledError", "iterable", "iterable_1", "__values", "iterable_1_1", "asyncIterable", "process", "readableStream", "readableStreamLikeToAsyncGenerator", "asyncIterable_1", "__asyncValues", "asyncIterable_1_1", "executeSchedule", "parentSubscription", "scheduler", "work", "delay", "repeat", "scheduleSubscription", "observeOn", "scheduler", "delay", "operate", "source", "subscriber", "createOperatorSubscriber", "value", "executeSchedule", "err", "subscribeOn", "scheduler", "delay", "operate", "source", "subscriber", "scheduleObservable", "input", "scheduler", "innerFrom", "subscribeOn", "observeOn", "schedulePromise", "input", "scheduler", "innerFrom", "subscribeOn", "observeOn", "scheduleArray", "input", "scheduler", "Observable", "subscriber", "i", "scheduleIterable", "input", "scheduler", "Observable", "subscriber", "iterator", "executeSchedule", "value", "done", "_a", "err", "isFunction", "scheduleAsyncIterable", "input", "scheduler", "Observable", "subscriber", "executeSchedule", "iterator", "result", "scheduleReadableStreamLike", "input", "scheduler", "scheduleAsyncIterable", "readableStreamLikeToAsyncGenerator", "scheduled", "input", "scheduler", "isInteropObservable", "scheduleObservable", "isArrayLike", "scheduleArray", "isPromise", "schedulePromise", "isAsyncIterable", "scheduleAsyncIterable", "isIterable", "scheduleIterable", "isReadableStreamLike", "scheduleReadableStreamLike", "createInvalidObservableTypeError", "from", "input", "scheduler", "scheduled", "innerFrom", "of", "args", "_i", "scheduler", "popScheduler", "from", "throwError", "errorOrErrorFactory", "scheduler", "errorFactory", "isFunction", "init", "subscriber", "Observable", "isValidDate", "value", "map", "project", "thisArg", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "isArray", "callOrApply", "fn", "args", "__spreadArray", "__read", "mapOneOrManyArgs", "map", "isArray", "getPrototypeOf", "objectProto", "getKeys", "argsArgArrayOrObject", "args", "first_1", "isPOJO", "keys", "key", "obj", "createObject", "keys", "values", "result", "key", "i", "combineLatest", "args", "_i", "scheduler", "popScheduler", "resultSelector", "popResultSelector", "_a", "argsArgArrayOrObject", "observables", "keys", "from", "result", "Observable", "combineLatestInit", "values", "createObject", "identity", "mapOneOrManyArgs", "valueTransform", "subscriber", "maybeSchedule", "length", "active", "remainingFirstValues", "i", "source", "hasFirstValue", "createOperatorSubscriber", "value", "execute", "subscription", "executeSchedule", "mergeInternals", "source", "subscriber", "project", "concurrent", "onBeforeNext", "expand", "innerSubScheduler", "additionalFinalizer", "buffer", "active", "index", "isComplete", "checkComplete", "outerNext", "value", "doInnerSub", "innerComplete", "innerFrom", "createOperatorSubscriber", "innerValue", "bufferedValue", "executeSchedule", "err", "mergeMap", "project", "resultSelector", "concurrent", "isFunction", "a", "i", "map", "b", "ii", "innerFrom", "operate", "source", "subscriber", "mergeInternals", "mergeAll", "concurrent", "mergeMap", "identity", "concatAll", "mergeAll", "concat", "args", "_i", "concatAll", "from", "popScheduler", "defer", "observableFactory", "Observable", "subscriber", "innerFrom", "nodeEventEmitterMethods", "eventTargetMethods", "jqueryMethods", "fromEvent", "target", "eventName", "options", "resultSelector", "isFunction", "mapOneOrManyArgs", "_a", "__read", "isEventTarget", "methodName", "handler", "isNodeStyleEventEmitter", "toCommonHandlerRegistry", "isJQueryStyleEventEmitter", "add", "remove", "isArrayLike", "mergeMap", "subTarget", "innerFrom", "Observable", "subscriber", "args", "_i", "timer", "dueTime", "intervalOrScheduler", "scheduler", "async", "intervalDuration", "isScheduler", "Observable", "subscriber", "due", "isValidDate", "n", "merge", "args", "_i", "scheduler", "popScheduler", "concurrent", "popNumber", "sources", "innerFrom", "mergeAll", "from", "EMPTY", "NEVER", "Observable", "noop", "isArray", "argsOrArgArray", "args", "filter", "predicate", "thisArg", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "zip", "args", "_i", "resultSelector", "popResultSelector", "sources", "argsOrArgArray", "Observable", "subscriber", "buffers", "completed", "sourceIndex", "innerFrom", "createOperatorSubscriber", "value", "buffer", "result", "__spreadArray", "__read", "i", "EMPTY", "audit", "durationSelector", "operate", "source", "subscriber", "hasValue", "lastValue", "durationSubscriber", "isComplete", "endDuration", "value", "cleanupDuration", "createOperatorSubscriber", "innerFrom", "auditTime", "duration", "scheduler", "asyncScheduler", "audit", "timer", "bufferCount", "bufferSize", "startBufferEvery", "operate", "source", "subscriber", "buffers", "count", "createOperatorSubscriber", "value", "toEmit", "buffers_1", "__values", "buffers_1_1", "buffer", "toEmit_1", "toEmit_1_1", "arrRemove", "buffers_2", "buffers_2_1", "catchError", "selector", "operate", "source", "subscriber", "innerSub", "syncUnsub", "handledResult", "createOperatorSubscriber", "err", "innerFrom", "debounceTime", "dueTime", "scheduler", "asyncScheduler", "operate", "source", "subscriber", "activeTask", "lastValue", "lastTime", "emit", "value", "emitWhenIdle", "targetTime", "now", "createOperatorSubscriber", "take", "count", "EMPTY", "operate", "source", "subscriber", "seen", "createOperatorSubscriber", "value", "ignoreElements", "operate", "source", "subscriber", "createOperatorSubscriber", "noop", "mapTo", "value", "map", "delayWhen", "delayDurationSelector", "subscriptionDelay", "source", "concat", "take", "ignoreElements", "mergeMap", "value", "index", "mapTo", "delay", "due", "scheduler", "asyncScheduler", "duration", "timer", "delayWhen", "distinctUntilChanged", "comparator", "keySelector", "identity", "defaultCompare", "operate", "source", "subscriber", "previousKey", "first", "createOperatorSubscriber", "value", "currentKey", "a", "b", "distinctUntilKeyChanged", "key", "compare", "distinctUntilChanged", "x", "y", "finalize", "callback", "operate", "source", "subscriber", "share", "options", "_a", "connector", "Subject", "_b", "resetOnError", "_c", "resetOnComplete", "_d", "resetOnRefCountZero", "wrapperSource", "connection", "resetConnection", "subject", "refCount", "hasCompleted", "hasErrored", "cancelReset", "reset", "resetAndUnsubscribe", "conn", "operate", "source", "subscriber", "dest", "handleReset", "SafeSubscriber", "value", "err", "innerFrom", "on", "args", "_i", "onSubscriber", "__spreadArray", "__read", "shareReplay", "configOrBufferSize", "windowTime", "scheduler", "bufferSize", "refCount", "_a", "_b", "_c", "share", "ReplaySubject", "startWith", "values", "_i", "scheduler", "popScheduler", "operate", "source", "subscriber", "concat", "switchMap", "project", "resultSelector", "operate", "source", "subscriber", "innerSubscriber", "index", "isComplete", "checkComplete", "createOperatorSubscriber", "value", "innerIndex", "outerIndex", "innerFrom", "innerValue", "tap", "observerOrNext", "error", "complete", "tapObserver", "isFunction", "operate", "source", "subscriber", "_a", "isUnsub", "createOperatorSubscriber", "value", "err", "_b", "identity", "withLatestFrom", "inputs", "_i", "project", "popResultSelector", "operate", "source", "subscriber", "len", "otherValues", "hasValue", "ready", "i", "innerFrom", "createOperatorSubscriber", "value", "identity", "noop", "values", "__spreadArray", "__read", "zip", "sources", "_i", "operate", "source", "subscriber", "__spreadArray", "__read", "zipWith", "otherInputs", "_i", "zip", "__spreadArray", "__read", "getElements", "selector", "node", "getElement", "el", "getOptionalElement", "getActiveElement", "watchElementFocus", "el", "merge", "fromEvent", "debounceTime", "map", "active", "getActiveElement", "startWith", "distinctUntilChanged", "getElementContentOffset", "el", "watchElementContentOffset", "merge", "fromEvent", "auditTime", "animationFrameScheduler", "map", "startWith", "MapShim", "getIndex", "arr", "key", "result", "entry", "index", "class_1", "value", "entries", "callback", "ctx", "_i", "_a", "isBrowser", "global$1", "requestAnimationFrame$1", "trailingTimeout", "throttle", "delay", "leadingCall", "trailingCall", "lastCallTime", "resolvePending", "proxy", "timeoutCallback", "timeStamp", "REFRESH_DELAY", "transitionKeys", "mutationObserverSupported", "ResizeObserverController", "observer", "observers", "changesDetected", "activeObservers", "_b", "propertyName", "isReflowProperty", "defineConfigurable", "target", "props", "getWindowOf", "ownerGlobal", "emptyRect", "createRectInit", "toFloat", "getBordersSize", "styles", "positions", "size", "position", "getPaddings", "paddings", "positions_1", "getSVGContentRect", "bbox", "getHTMLElementContentRect", "clientWidth", "clientHeight", "horizPad", "vertPad", "width", "height", "isDocumentElement", "vertScrollbar", "horizScrollbar", "isSVGGraphicsElement", "getContentRect", "createReadOnlyRect", "x", "y", "Constr", "rect", "ResizeObservation", "ResizeObserverEntry", "rectInit", "contentRect", "ResizeObserverSPI", "controller", "callbackCtx", "observations", "_this", "observation", "ResizeObserver", "method", "ResizeObserver_es_default", "entry$", "Subject", "observer$", "defer", "of", "ResizeObserver_es_default", "entries", "entry", "switchMap", "observer", "merge", "NEVER", "finalize", "shareReplay", "getElementSize", "el", "getElementContentSize", "el", "entry$", "Subject", "observer$", "defer", "of", "entries", "entry", "switchMap", "observer", "merge", "NEVER", "finalize", "shareReplay", "watchElementBoundary", "el", "threshold", "watchElementContentOffset", "map", "y", "visible", "getElementSize", "content", "getElementContentSize", "distinctUntilChanged", "toggles", "getElement", "getLocation", "appendChild", "el", "child", "node", "h", "tag", "attributes", "children", "attr", "round", "value", "digits", "request", "url", "options", "from", "catchError", "EMPTY", "switchMap", "res", "throwError", "of", "requestJSON", "shareReplay", "getComponentElement", "type", "node", "getElement", "getComponentElements", "getElements", "script", "getElement", "config", "getLocation", "configuration", "translation", "key", "value", "config", "mountIconSearchQuery", "el", "focus$", "watchElementFocus", "value$", "merge", "fromEvent", "delay", "map", "startWith", "distinctUntilChanged", "filter", "active", "withLatestFrom", "value", "path", "combineLatest", "focus", "import_fuzzaldrin_plus", "import_fuzzaldrin_plus", "highlight", "icon", "query", "renderIconSearchResult", "file", "h", "translation", "renderPublicSponsor", "user", "title", "h", "renderPrivateSponsor", "count", "watchIconSearchResult", "el", "index$", "query$", "combineLatest", "distinctUntilKeyChanged", "map", "icons", "icon", "value", "data", "search", "switchMap", "files", "shortcode", "emojis", "shortcodes", "category", "mountIconSearchResult", "push$", "Subject", "boundary$", "watchElementBoundary", "filter", "meta", "getElement", "withLatestFrom", "round", "file", "list", "tap", "merge", "of", "bufferCount", "zipWith", "chunk", "result", "renderIconSearchResult", "state", "finalize", "__spreadValues", "mountIconSearch", "el", "config", "configuration", "index$", "requestJSON", "query", "getComponentElement", "result", "query$", "mountIconSearchQuery", "result$", "mountIconSearchResult", "merge", "mountSponsorship", "el", "sponsorship$", "requestJSON", "count", "getComponentElement", "total", "sponsorship", "list", "getElement", "sponsor", "renderPublicSponsor", "renderPrivateSponsor", "type", "map", "state", "__spreadValues", "setupAnalytics", "origin", "fromEvent", "ev", "el", "setupAnalytics", "component$", "switchMap", "merge", "getComponentElements", "el", "mountIconSearch", "mountSponsorship"] +} diff --git a/overrides/assets/javascripts/iconsearch_index.json b/overrides/assets/javascripts/iconsearch_index.json new file mode 100644 index 00000000..e8a6e3de --- /dev/null +++ b/overrides/assets/javascripts/iconsearch_index.json @@ -0,0 +1 @@ +{"icons":{"base":"https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/material/.icons/","data":{"fontawesome-brands-42-group":"fontawesome/brands/42-group.svg","fontawesome-brands-500px":"fontawesome/brands/500px.svg","fontawesome-brands-accessible-icon":"fontawesome/brands/accessible-icon.svg","fontawesome-brands-accusoft":"fontawesome/brands/accusoft.svg","fontawesome-brands-adn":"fontawesome/brands/adn.svg","fontawesome-brands-adversal":"fontawesome/brands/adversal.svg","fontawesome-brands-affiliatetheme":"fontawesome/brands/affiliatetheme.svg","fontawesome-brands-airbnb":"fontawesome/brands/airbnb.svg","fontawesome-brands-algolia":"fontawesome/brands/algolia.svg","fontawesome-brands-alipay":"fontawesome/brands/alipay.svg","fontawesome-brands-amazon-pay":"fontawesome/brands/amazon-pay.svg","fontawesome-brands-amazon":"fontawesome/brands/amazon.svg","fontawesome-brands-amilia":"fontawesome/brands/amilia.svg","fontawesome-brands-android":"fontawesome/brands/android.svg","fontawesome-brands-angellist":"fontawesome/brands/angellist.svg","fontawesome-brands-angrycreative":"fontawesome/brands/angrycreative.svg","fontawesome-brands-angular":"fontawesome/brands/angular.svg","fontawesome-brands-app-store-ios":"fontawesome/brands/app-store-ios.svg","fontawesome-brands-app-store":"fontawesome/brands/app-store.svg","fontawesome-brands-apper":"fontawesome/brands/apper.svg","fontawesome-brands-apple-pay":"fontawesome/brands/apple-pay.svg","fontawesome-brands-apple":"fontawesome/brands/apple.svg","fontawesome-brands-artstation":"fontawesome/brands/artstation.svg","fontawesome-brands-asymmetrik":"fontawesome/brands/asymmetrik.svg","fontawesome-brands-atlassian":"fontawesome/brands/atlassian.svg","fontawesome-brands-audible":"fontawesome/brands/audible.svg","fontawesome-brands-autoprefixer":"fontawesome/brands/autoprefixer.svg","fontawesome-brands-avianex":"fontawesome/brands/avianex.svg","fontawesome-brands-aviato":"fontawesome/brands/aviato.svg","fontawesome-brands-aws":"fontawesome/brands/aws.svg","fontawesome-brands-bandcamp":"fontawesome/brands/bandcamp.svg","fontawesome-brands-battle-net":"fontawesome/brands/battle-net.svg","fontawesome-brands-behance":"fontawesome/brands/behance.svg","fontawesome-brands-bilibili":"fontawesome/brands/bilibili.svg","fontawesome-brands-bimobject":"fontawesome/brands/bimobject.svg","fontawesome-brands-bitbucket":"fontawesome/brands/bitbucket.svg","fontawesome-brands-bitcoin":"fontawesome/brands/bitcoin.svg","fontawesome-brands-bity":"fontawesome/brands/bity.svg","fontawesome-brands-black-tie":"fontawesome/brands/black-tie.svg","fontawesome-brands-blackberry":"fontawesome/brands/blackberry.svg","fontawesome-brands-blogger-b":"fontawesome/brands/blogger-b.svg","fontawesome-brands-blogger":"fontawesome/brands/blogger.svg","fontawesome-brands-bluetooth-b":"fontawesome/brands/bluetooth-b.svg","fontawesome-brands-bluetooth":"fontawesome/brands/bluetooth.svg","fontawesome-brands-bootstrap":"fontawesome/brands/bootstrap.svg","fontawesome-brands-bots":"fontawesome/brands/bots.svg","fontawesome-brands-btc":"fontawesome/brands/btc.svg","fontawesome-brands-buffer":"fontawesome/brands/buffer.svg","fontawesome-brands-buromobelexperte":"fontawesome/brands/buromobelexperte.svg","fontawesome-brands-buy-n-large":"fontawesome/brands/buy-n-large.svg","fontawesome-brands-buysellads":"fontawesome/brands/buysellads.svg","fontawesome-brands-canadian-maple-leaf":"fontawesome/brands/canadian-maple-leaf.svg","fontawesome-brands-cc-amazon-pay":"fontawesome/brands/cc-amazon-pay.svg","fontawesome-brands-cc-amex":"fontawesome/brands/cc-amex.svg","fontawesome-brands-cc-apple-pay":"fontawesome/brands/cc-apple-pay.svg","fontawesome-brands-cc-diners-club":"fontawesome/brands/cc-diners-club.svg","fontawesome-brands-cc-discover":"fontawesome/brands/cc-discover.svg","fontawesome-brands-cc-jcb":"fontawesome/brands/cc-jcb.svg","fontawesome-brands-cc-mastercard":"fontawesome/brands/cc-mastercard.svg","fontawesome-brands-cc-paypal":"fontawesome/brands/cc-paypal.svg","fontawesome-brands-cc-stripe":"fontawesome/brands/cc-stripe.svg","fontawesome-brands-cc-visa":"fontawesome/brands/cc-visa.svg","fontawesome-brands-centercode":"fontawesome/brands/centercode.svg","fontawesome-brands-centos":"fontawesome/brands/centos.svg","fontawesome-brands-chrome":"fontawesome/brands/chrome.svg","fontawesome-brands-chromecast":"fontawesome/brands/chromecast.svg","fontawesome-brands-cloudflare":"fontawesome/brands/cloudflare.svg","fontawesome-brands-cloudscale":"fontawesome/brands/cloudscale.svg","fontawesome-brands-cloudsmith":"fontawesome/brands/cloudsmith.svg","fontawesome-brands-cloudversify":"fontawesome/brands/cloudversify.svg","fontawesome-brands-cmplid":"fontawesome/brands/cmplid.svg","fontawesome-brands-codepen":"fontawesome/brands/codepen.svg","fontawesome-brands-codiepie":"fontawesome/brands/codiepie.svg","fontawesome-brands-confluence":"fontawesome/brands/confluence.svg","fontawesome-brands-connectdevelop":"fontawesome/brands/connectdevelop.svg","fontawesome-brands-contao":"fontawesome/brands/contao.svg","fontawesome-brands-cotton-bureau":"fontawesome/brands/cotton-bureau.svg","fontawesome-brands-cpanel":"fontawesome/brands/cpanel.svg","fontawesome-brands-creative-commons-by":"fontawesome/brands/creative-commons-by.svg","fontawesome-brands-creative-commons-nc-eu":"fontawesome/brands/creative-commons-nc-eu.svg","fontawesome-brands-creative-commons-nc-jp":"fontawesome/brands/creative-commons-nc-jp.svg","fontawesome-brands-creative-commons-nc":"fontawesome/brands/creative-commons-nc.svg","fontawesome-brands-creative-commons-nd":"fontawesome/brands/creative-commons-nd.svg","fontawesome-brands-creative-commons-pd-alt":"fontawesome/brands/creative-commons-pd-alt.svg","fontawesome-brands-creative-commons-pd":"fontawesome/brands/creative-commons-pd.svg","fontawesome-brands-creative-commons-remix":"fontawesome/brands/creative-commons-remix.svg","fontawesome-brands-creative-commons-sa":"fontawesome/brands/creative-commons-sa.svg","fontawesome-brands-creative-commons-sampling-plus":"fontawesome/brands/creative-commons-sampling-plus.svg","fontawesome-brands-creative-commons-sampling":"fontawesome/brands/creative-commons-sampling.svg","fontawesome-brands-creative-commons-share":"fontawesome/brands/creative-commons-share.svg","fontawesome-brands-creative-commons-zero":"fontawesome/brands/creative-commons-zero.svg","fontawesome-brands-creative-commons":"fontawesome/brands/creative-commons.svg","fontawesome-brands-critical-role":"fontawesome/brands/critical-role.svg","fontawesome-brands-css3-alt":"fontawesome/brands/css3-alt.svg","fontawesome-brands-css3":"fontawesome/brands/css3.svg","fontawesome-brands-cuttlefish":"fontawesome/brands/cuttlefish.svg","fontawesome-brands-d-and-d-beyond":"fontawesome/brands/d-and-d-beyond.svg","fontawesome-brands-d-and-d":"fontawesome/brands/d-and-d.svg","fontawesome-brands-dailymotion":"fontawesome/brands/dailymotion.svg","fontawesome-brands-dashcube":"fontawesome/brands/dashcube.svg","fontawesome-brands-deezer":"fontawesome/brands/deezer.svg","fontawesome-brands-delicious":"fontawesome/brands/delicious.svg","fontawesome-brands-deploydog":"fontawesome/brands/deploydog.svg","fontawesome-brands-deskpro":"fontawesome/brands/deskpro.svg","fontawesome-brands-dev":"fontawesome/brands/dev.svg","fontawesome-brands-deviantart":"fontawesome/brands/deviantart.svg","fontawesome-brands-dhl":"fontawesome/brands/dhl.svg","fontawesome-brands-diaspora":"fontawesome/brands/diaspora.svg","fontawesome-brands-digg":"fontawesome/brands/digg.svg","fontawesome-brands-digital-ocean":"fontawesome/brands/digital-ocean.svg","fontawesome-brands-discord":"fontawesome/brands/discord.svg","fontawesome-brands-discourse":"fontawesome/brands/discourse.svg","fontawesome-brands-dochub":"fontawesome/brands/dochub.svg","fontawesome-brands-docker":"fontawesome/brands/docker.svg","fontawesome-brands-draft2digital":"fontawesome/brands/draft2digital.svg","fontawesome-brands-dribbble":"fontawesome/brands/dribbble.svg","fontawesome-brands-dropbox":"fontawesome/brands/dropbox.svg","fontawesome-brands-drupal":"fontawesome/brands/drupal.svg","fontawesome-brands-dyalog":"fontawesome/brands/dyalog.svg","fontawesome-brands-earlybirds":"fontawesome/brands/earlybirds.svg","fontawesome-brands-ebay":"fontawesome/brands/ebay.svg","fontawesome-brands-edge-legacy":"fontawesome/brands/edge-legacy.svg","fontawesome-brands-edge":"fontawesome/brands/edge.svg","fontawesome-brands-elementor":"fontawesome/brands/elementor.svg","fontawesome-brands-ello":"fontawesome/brands/ello.svg","fontawesome-brands-ember":"fontawesome/brands/ember.svg","fontawesome-brands-empire":"fontawesome/brands/empire.svg","fontawesome-brands-envira":"fontawesome/brands/envira.svg","fontawesome-brands-erlang":"fontawesome/brands/erlang.svg","fontawesome-brands-ethereum":"fontawesome/brands/ethereum.svg","fontawesome-brands-etsy":"fontawesome/brands/etsy.svg","fontawesome-brands-evernote":"fontawesome/brands/evernote.svg","fontawesome-brands-expeditedssl":"fontawesome/brands/expeditedssl.svg","fontawesome-brands-facebook-f":"fontawesome/brands/facebook-f.svg","fontawesome-brands-facebook-messenger":"fontawesome/brands/facebook-messenger.svg","fontawesome-brands-facebook":"fontawesome/brands/facebook.svg","fontawesome-brands-fantasy-flight-games":"fontawesome/brands/fantasy-flight-games.svg","fontawesome-brands-fedex":"fontawesome/brands/fedex.svg","fontawesome-brands-fedora":"fontawesome/brands/fedora.svg","fontawesome-brands-figma":"fontawesome/brands/figma.svg","fontawesome-brands-firefox-browser":"fontawesome/brands/firefox-browser.svg","fontawesome-brands-firefox":"fontawesome/brands/firefox.svg","fontawesome-brands-first-order-alt":"fontawesome/brands/first-order-alt.svg","fontawesome-brands-first-order":"fontawesome/brands/first-order.svg","fontawesome-brands-firstdraft":"fontawesome/brands/firstdraft.svg","fontawesome-brands-flickr":"fontawesome/brands/flickr.svg","fontawesome-brands-flipboard":"fontawesome/brands/flipboard.svg","fontawesome-brands-fly":"fontawesome/brands/fly.svg","fontawesome-brands-font-awesome":"fontawesome/brands/font-awesome.svg","fontawesome-brands-fonticons-fi":"fontawesome/brands/fonticons-fi.svg","fontawesome-brands-fonticons":"fontawesome/brands/fonticons.svg","fontawesome-brands-fort-awesome-alt":"fontawesome/brands/fort-awesome-alt.svg","fontawesome-brands-fort-awesome":"fontawesome/brands/fort-awesome.svg","fontawesome-brands-forumbee":"fontawesome/brands/forumbee.svg","fontawesome-brands-foursquare":"fontawesome/brands/foursquare.svg","fontawesome-brands-free-code-camp":"fontawesome/brands/free-code-camp.svg","fontawesome-brands-freebsd":"fontawesome/brands/freebsd.svg","fontawesome-brands-fulcrum":"fontawesome/brands/fulcrum.svg","fontawesome-brands-galactic-republic":"fontawesome/brands/galactic-republic.svg","fontawesome-brands-galactic-senate":"fontawesome/brands/galactic-senate.svg","fontawesome-brands-get-pocket":"fontawesome/brands/get-pocket.svg","fontawesome-brands-gg-circle":"fontawesome/brands/gg-circle.svg","fontawesome-brands-gg":"fontawesome/brands/gg.svg","fontawesome-brands-git-alt":"fontawesome/brands/git-alt.svg","fontawesome-brands-git":"fontawesome/brands/git.svg","fontawesome-brands-github-alt":"fontawesome/brands/github-alt.svg","fontawesome-brands-github":"fontawesome/brands/github.svg","fontawesome-brands-gitkraken":"fontawesome/brands/gitkraken.svg","fontawesome-brands-gitlab":"fontawesome/brands/gitlab.svg","fontawesome-brands-gitter":"fontawesome/brands/gitter.svg","fontawesome-brands-glide-g":"fontawesome/brands/glide-g.svg","fontawesome-brands-glide":"fontawesome/brands/glide.svg","fontawesome-brands-gofore":"fontawesome/brands/gofore.svg","fontawesome-brands-golang":"fontawesome/brands/golang.svg","fontawesome-brands-goodreads-g":"fontawesome/brands/goodreads-g.svg","fontawesome-brands-goodreads":"fontawesome/brands/goodreads.svg","fontawesome-brands-google-drive":"fontawesome/brands/google-drive.svg","fontawesome-brands-google-pay":"fontawesome/brands/google-pay.svg","fontawesome-brands-google-play":"fontawesome/brands/google-play.svg","fontawesome-brands-google-plus-g":"fontawesome/brands/google-plus-g.svg","fontawesome-brands-google-plus":"fontawesome/brands/google-plus.svg","fontawesome-brands-google-wallet":"fontawesome/brands/google-wallet.svg","fontawesome-brands-google":"fontawesome/brands/google.svg","fontawesome-brands-gratipay":"fontawesome/brands/gratipay.svg","fontawesome-brands-grav":"fontawesome/brands/grav.svg","fontawesome-brands-gripfire":"fontawesome/brands/gripfire.svg","fontawesome-brands-grunt":"fontawesome/brands/grunt.svg","fontawesome-brands-guilded":"fontawesome/brands/guilded.svg","fontawesome-brands-gulp":"fontawesome/brands/gulp.svg","fontawesome-brands-hacker-news":"fontawesome/brands/hacker-news.svg","fontawesome-brands-hackerrank":"fontawesome/brands/hackerrank.svg","fontawesome-brands-hashnode":"fontawesome/brands/hashnode.svg","fontawesome-brands-hips":"fontawesome/brands/hips.svg","fontawesome-brands-hire-a-helper":"fontawesome/brands/hire-a-helper.svg","fontawesome-brands-hive":"fontawesome/brands/hive.svg","fontawesome-brands-hooli":"fontawesome/brands/hooli.svg","fontawesome-brands-hornbill":"fontawesome/brands/hornbill.svg","fontawesome-brands-hotjar":"fontawesome/brands/hotjar.svg","fontawesome-brands-houzz":"fontawesome/brands/houzz.svg","fontawesome-brands-html5":"fontawesome/brands/html5.svg","fontawesome-brands-hubspot":"fontawesome/brands/hubspot.svg","fontawesome-brands-ideal":"fontawesome/brands/ideal.svg","fontawesome-brands-imdb":"fontawesome/brands/imdb.svg","fontawesome-brands-instagram":"fontawesome/brands/instagram.svg","fontawesome-brands-instalod":"fontawesome/brands/instalod.svg","fontawesome-brands-intercom":"fontawesome/brands/intercom.svg","fontawesome-brands-internet-explorer":"fontawesome/brands/internet-explorer.svg","fontawesome-brands-invision":"fontawesome/brands/invision.svg","fontawesome-brands-ioxhost":"fontawesome/brands/ioxhost.svg","fontawesome-brands-itch-io":"fontawesome/brands/itch-io.svg","fontawesome-brands-itunes-note":"fontawesome/brands/itunes-note.svg","fontawesome-brands-itunes":"fontawesome/brands/itunes.svg","fontawesome-brands-java":"fontawesome/brands/java.svg","fontawesome-brands-jedi-order":"fontawesome/brands/jedi-order.svg","fontawesome-brands-jenkins":"fontawesome/brands/jenkins.svg","fontawesome-brands-jira":"fontawesome/brands/jira.svg","fontawesome-brands-joget":"fontawesome/brands/joget.svg","fontawesome-brands-joomla":"fontawesome/brands/joomla.svg","fontawesome-brands-js":"fontawesome/brands/js.svg","fontawesome-brands-jsfiddle":"fontawesome/brands/jsfiddle.svg","fontawesome-brands-kaggle":"fontawesome/brands/kaggle.svg","fontawesome-brands-keybase":"fontawesome/brands/keybase.svg","fontawesome-brands-keycdn":"fontawesome/brands/keycdn.svg","fontawesome-brands-kickstarter-k":"fontawesome/brands/kickstarter-k.svg","fontawesome-brands-kickstarter":"fontawesome/brands/kickstarter.svg","fontawesome-brands-korvue":"fontawesome/brands/korvue.svg","fontawesome-brands-laravel":"fontawesome/brands/laravel.svg","fontawesome-brands-lastfm":"fontawesome/brands/lastfm.svg","fontawesome-brands-leanpub":"fontawesome/brands/leanpub.svg","fontawesome-brands-less":"fontawesome/brands/less.svg","fontawesome-brands-line":"fontawesome/brands/line.svg","fontawesome-brands-linkedin-in":"fontawesome/brands/linkedin-in.svg","fontawesome-brands-linkedin":"fontawesome/brands/linkedin.svg","fontawesome-brands-linode":"fontawesome/brands/linode.svg","fontawesome-brands-linux":"fontawesome/brands/linux.svg","fontawesome-brands-lyft":"fontawesome/brands/lyft.svg","fontawesome-brands-magento":"fontawesome/brands/magento.svg","fontawesome-brands-mailchimp":"fontawesome/brands/mailchimp.svg","fontawesome-brands-mandalorian":"fontawesome/brands/mandalorian.svg","fontawesome-brands-markdown":"fontawesome/brands/markdown.svg","fontawesome-brands-mastodon":"fontawesome/brands/mastodon.svg","fontawesome-brands-maxcdn":"fontawesome/brands/maxcdn.svg","fontawesome-brands-mdb":"fontawesome/brands/mdb.svg","fontawesome-brands-medapps":"fontawesome/brands/medapps.svg","fontawesome-brands-medium":"fontawesome/brands/medium.svg","fontawesome-brands-medrt":"fontawesome/brands/medrt.svg","fontawesome-brands-meetup":"fontawesome/brands/meetup.svg","fontawesome-brands-megaport":"fontawesome/brands/megaport.svg","fontawesome-brands-mendeley":"fontawesome/brands/mendeley.svg","fontawesome-brands-meta":"fontawesome/brands/meta.svg","fontawesome-brands-microblog":"fontawesome/brands/microblog.svg","fontawesome-brands-microsoft":"fontawesome/brands/microsoft.svg","fontawesome-brands-mix":"fontawesome/brands/mix.svg","fontawesome-brands-mixcloud":"fontawesome/brands/mixcloud.svg","fontawesome-brands-mixer":"fontawesome/brands/mixer.svg","fontawesome-brands-mizuni":"fontawesome/brands/mizuni.svg","fontawesome-brands-modx":"fontawesome/brands/modx.svg","fontawesome-brands-monero":"fontawesome/brands/monero.svg","fontawesome-brands-napster":"fontawesome/brands/napster.svg","fontawesome-brands-neos":"fontawesome/brands/neos.svg","fontawesome-brands-nfc-directional":"fontawesome/brands/nfc-directional.svg","fontawesome-brands-nfc-symbol":"fontawesome/brands/nfc-symbol.svg","fontawesome-brands-nimblr":"fontawesome/brands/nimblr.svg","fontawesome-brands-node-js":"fontawesome/brands/node-js.svg","fontawesome-brands-node":"fontawesome/brands/node.svg","fontawesome-brands-npm":"fontawesome/brands/npm.svg","fontawesome-brands-ns8":"fontawesome/brands/ns8.svg","fontawesome-brands-nutritionix":"fontawesome/brands/nutritionix.svg","fontawesome-brands-octopus-deploy":"fontawesome/brands/octopus-deploy.svg","fontawesome-brands-odnoklassniki":"fontawesome/brands/odnoklassniki.svg","fontawesome-brands-old-republic":"fontawesome/brands/old-republic.svg","fontawesome-brands-opencart":"fontawesome/brands/opencart.svg","fontawesome-brands-openid":"fontawesome/brands/openid.svg","fontawesome-brands-opera":"fontawesome/brands/opera.svg","fontawesome-brands-optin-monster":"fontawesome/brands/optin-monster.svg","fontawesome-brands-orcid":"fontawesome/brands/orcid.svg","fontawesome-brands-osi":"fontawesome/brands/osi.svg","fontawesome-brands-padlet":"fontawesome/brands/padlet.svg","fontawesome-brands-page4":"fontawesome/brands/page4.svg","fontawesome-brands-pagelines":"fontawesome/brands/pagelines.svg","fontawesome-brands-palfed":"fontawesome/brands/palfed.svg","fontawesome-brands-patreon":"fontawesome/brands/patreon.svg","fontawesome-brands-paypal":"fontawesome/brands/paypal.svg","fontawesome-brands-perbyte":"fontawesome/brands/perbyte.svg","fontawesome-brands-periscope":"fontawesome/brands/periscope.svg","fontawesome-brands-phabricator":"fontawesome/brands/phabricator.svg","fontawesome-brands-phoenix-framework":"fontawesome/brands/phoenix-framework.svg","fontawesome-brands-phoenix-squadron":"fontawesome/brands/phoenix-squadron.svg","fontawesome-brands-php":"fontawesome/brands/php.svg","fontawesome-brands-pied-piper-alt":"fontawesome/brands/pied-piper-alt.svg","fontawesome-brands-pied-piper-hat":"fontawesome/brands/pied-piper-hat.svg","fontawesome-brands-pied-piper-pp":"fontawesome/brands/pied-piper-pp.svg","fontawesome-brands-pied-piper":"fontawesome/brands/pied-piper.svg","fontawesome-brands-pinterest-p":"fontawesome/brands/pinterest-p.svg","fontawesome-brands-pinterest":"fontawesome/brands/pinterest.svg","fontawesome-brands-pix":"fontawesome/brands/pix.svg","fontawesome-brands-playstation":"fontawesome/brands/playstation.svg","fontawesome-brands-product-hunt":"fontawesome/brands/product-hunt.svg","fontawesome-brands-pushed":"fontawesome/brands/pushed.svg","fontawesome-brands-python":"fontawesome/brands/python.svg","fontawesome-brands-qq":"fontawesome/brands/qq.svg","fontawesome-brands-quinscape":"fontawesome/brands/quinscape.svg","fontawesome-brands-quora":"fontawesome/brands/quora.svg","fontawesome-brands-r-project":"fontawesome/brands/r-project.svg","fontawesome-brands-raspberry-pi":"fontawesome/brands/raspberry-pi.svg","fontawesome-brands-ravelry":"fontawesome/brands/ravelry.svg","fontawesome-brands-react":"fontawesome/brands/react.svg","fontawesome-brands-reacteurope":"fontawesome/brands/reacteurope.svg","fontawesome-brands-readme":"fontawesome/brands/readme.svg","fontawesome-brands-rebel":"fontawesome/brands/rebel.svg","fontawesome-brands-red-river":"fontawesome/brands/red-river.svg","fontawesome-brands-reddit-alien":"fontawesome/brands/reddit-alien.svg","fontawesome-brands-reddit":"fontawesome/brands/reddit.svg","fontawesome-brands-redhat":"fontawesome/brands/redhat.svg","fontawesome-brands-renren":"fontawesome/brands/renren.svg","fontawesome-brands-replyd":"fontawesome/brands/replyd.svg","fontawesome-brands-researchgate":"fontawesome/brands/researchgate.svg","fontawesome-brands-resolving":"fontawesome/brands/resolving.svg","fontawesome-brands-rev":"fontawesome/brands/rev.svg","fontawesome-brands-rocketchat":"fontawesome/brands/rocketchat.svg","fontawesome-brands-rockrms":"fontawesome/brands/rockrms.svg","fontawesome-brands-rust":"fontawesome/brands/rust.svg","fontawesome-brands-safari":"fontawesome/brands/safari.svg","fontawesome-brands-salesforce":"fontawesome/brands/salesforce.svg","fontawesome-brands-sass":"fontawesome/brands/sass.svg","fontawesome-brands-schlix":"fontawesome/brands/schlix.svg","fontawesome-brands-screenpal":"fontawesome/brands/screenpal.svg","fontawesome-brands-scribd":"fontawesome/brands/scribd.svg","fontawesome-brands-searchengin":"fontawesome/brands/searchengin.svg","fontawesome-brands-sellcast":"fontawesome/brands/sellcast.svg","fontawesome-brands-sellsy":"fontawesome/brands/sellsy.svg","fontawesome-brands-servicestack":"fontawesome/brands/servicestack.svg","fontawesome-brands-shirtsinbulk":"fontawesome/brands/shirtsinbulk.svg","fontawesome-brands-shopify":"fontawesome/brands/shopify.svg","fontawesome-brands-shopware":"fontawesome/brands/shopware.svg","fontawesome-brands-simplybuilt":"fontawesome/brands/simplybuilt.svg","fontawesome-brands-sistrix":"fontawesome/brands/sistrix.svg","fontawesome-brands-sith":"fontawesome/brands/sith.svg","fontawesome-brands-sitrox":"fontawesome/brands/sitrox.svg","fontawesome-brands-sketch":"fontawesome/brands/sketch.svg","fontawesome-brands-skyatlas":"fontawesome/brands/skyatlas.svg","fontawesome-brands-skype":"fontawesome/brands/skype.svg","fontawesome-brands-slack":"fontawesome/brands/slack.svg","fontawesome-brands-slideshare":"fontawesome/brands/slideshare.svg","fontawesome-brands-snapchat":"fontawesome/brands/snapchat.svg","fontawesome-brands-soundcloud":"fontawesome/brands/soundcloud.svg","fontawesome-brands-sourcetree":"fontawesome/brands/sourcetree.svg","fontawesome-brands-space-awesome":"fontawesome/brands/space-awesome.svg","fontawesome-brands-speakap":"fontawesome/brands/speakap.svg","fontawesome-brands-speaker-deck":"fontawesome/brands/speaker-deck.svg","fontawesome-brands-spotify":"fontawesome/brands/spotify.svg","fontawesome-brands-square-behance":"fontawesome/brands/square-behance.svg","fontawesome-brands-square-dribbble":"fontawesome/brands/square-dribbble.svg","fontawesome-brands-square-facebook":"fontawesome/brands/square-facebook.svg","fontawesome-brands-square-font-awesome-stroke":"fontawesome/brands/square-font-awesome-stroke.svg","fontawesome-brands-square-font-awesome":"fontawesome/brands/square-font-awesome.svg","fontawesome-brands-square-git":"fontawesome/brands/square-git.svg","fontawesome-brands-square-github":"fontawesome/brands/square-github.svg","fontawesome-brands-square-gitlab":"fontawesome/brands/square-gitlab.svg","fontawesome-brands-square-google-plus":"fontawesome/brands/square-google-plus.svg","fontawesome-brands-square-hacker-news":"fontawesome/brands/square-hacker-news.svg","fontawesome-brands-square-instagram":"fontawesome/brands/square-instagram.svg","fontawesome-brands-square-js":"fontawesome/brands/square-js.svg","fontawesome-brands-square-lastfm":"fontawesome/brands/square-lastfm.svg","fontawesome-brands-square-odnoklassniki":"fontawesome/brands/square-odnoklassniki.svg","fontawesome-brands-square-pied-piper":"fontawesome/brands/square-pied-piper.svg","fontawesome-brands-square-pinterest":"fontawesome/brands/square-pinterest.svg","fontawesome-brands-square-reddit":"fontawesome/brands/square-reddit.svg","fontawesome-brands-square-snapchat":"fontawesome/brands/square-snapchat.svg","fontawesome-brands-square-steam":"fontawesome/brands/square-steam.svg","fontawesome-brands-square-tumblr":"fontawesome/brands/square-tumblr.svg","fontawesome-brands-square-twitter":"fontawesome/brands/square-twitter.svg","fontawesome-brands-square-viadeo":"fontawesome/brands/square-viadeo.svg","fontawesome-brands-square-vimeo":"fontawesome/brands/square-vimeo.svg","fontawesome-brands-square-whatsapp":"fontawesome/brands/square-whatsapp.svg","fontawesome-brands-square-xing":"fontawesome/brands/square-xing.svg","fontawesome-brands-square-youtube":"fontawesome/brands/square-youtube.svg","fontawesome-brands-squarespace":"fontawesome/brands/squarespace.svg","fontawesome-brands-stack-exchange":"fontawesome/brands/stack-exchange.svg","fontawesome-brands-stack-overflow":"fontawesome/brands/stack-overflow.svg","fontawesome-brands-stackpath":"fontawesome/brands/stackpath.svg","fontawesome-brands-staylinked":"fontawesome/brands/staylinked.svg","fontawesome-brands-steam-symbol":"fontawesome/brands/steam-symbol.svg","fontawesome-brands-steam":"fontawesome/brands/steam.svg","fontawesome-brands-sticker-mule":"fontawesome/brands/sticker-mule.svg","fontawesome-brands-strava":"fontawesome/brands/strava.svg","fontawesome-brands-stripe-s":"fontawesome/brands/stripe-s.svg","fontawesome-brands-stripe":"fontawesome/brands/stripe.svg","fontawesome-brands-studiovinari":"fontawesome/brands/studiovinari.svg","fontawesome-brands-stumbleupon-circle":"fontawesome/brands/stumbleupon-circle.svg","fontawesome-brands-stumbleupon":"fontawesome/brands/stumbleupon.svg","fontawesome-brands-superpowers":"fontawesome/brands/superpowers.svg","fontawesome-brands-supple":"fontawesome/brands/supple.svg","fontawesome-brands-suse":"fontawesome/brands/suse.svg","fontawesome-brands-swift":"fontawesome/brands/swift.svg","fontawesome-brands-symfony":"fontawesome/brands/symfony.svg","fontawesome-brands-teamspeak":"fontawesome/brands/teamspeak.svg","fontawesome-brands-telegram":"fontawesome/brands/telegram.svg","fontawesome-brands-tencent-weibo":"fontawesome/brands/tencent-weibo.svg","fontawesome-brands-the-red-yeti":"fontawesome/brands/the-red-yeti.svg","fontawesome-brands-themeco":"fontawesome/brands/themeco.svg","fontawesome-brands-themeisle":"fontawesome/brands/themeisle.svg","fontawesome-brands-think-peaks":"fontawesome/brands/think-peaks.svg","fontawesome-brands-tiktok":"fontawesome/brands/tiktok.svg","fontawesome-brands-trade-federation":"fontawesome/brands/trade-federation.svg","fontawesome-brands-trello":"fontawesome/brands/trello.svg","fontawesome-brands-tumblr":"fontawesome/brands/tumblr.svg","fontawesome-brands-twitch":"fontawesome/brands/twitch.svg","fontawesome-brands-twitter":"fontawesome/brands/twitter.svg","fontawesome-brands-typo3":"fontawesome/brands/typo3.svg","fontawesome-brands-uber":"fontawesome/brands/uber.svg","fontawesome-brands-ubuntu":"fontawesome/brands/ubuntu.svg","fontawesome-brands-uikit":"fontawesome/brands/uikit.svg","fontawesome-brands-umbraco":"fontawesome/brands/umbraco.svg","fontawesome-brands-uncharted":"fontawesome/brands/uncharted.svg","fontawesome-brands-uniregistry":"fontawesome/brands/uniregistry.svg","fontawesome-brands-unity":"fontawesome/brands/unity.svg","fontawesome-brands-unsplash":"fontawesome/brands/unsplash.svg","fontawesome-brands-untappd":"fontawesome/brands/untappd.svg","fontawesome-brands-ups":"fontawesome/brands/ups.svg","fontawesome-brands-usb":"fontawesome/brands/usb.svg","fontawesome-brands-usps":"fontawesome/brands/usps.svg","fontawesome-brands-ussunnah":"fontawesome/brands/ussunnah.svg","fontawesome-brands-vaadin":"fontawesome/brands/vaadin.svg","fontawesome-brands-viacoin":"fontawesome/brands/viacoin.svg","fontawesome-brands-viadeo":"fontawesome/brands/viadeo.svg","fontawesome-brands-viber":"fontawesome/brands/viber.svg","fontawesome-brands-vimeo-v":"fontawesome/brands/vimeo-v.svg","fontawesome-brands-vimeo":"fontawesome/brands/vimeo.svg","fontawesome-brands-vine":"fontawesome/brands/vine.svg","fontawesome-brands-vk":"fontawesome/brands/vk.svg","fontawesome-brands-vnv":"fontawesome/brands/vnv.svg","fontawesome-brands-vuejs":"fontawesome/brands/vuejs.svg","fontawesome-brands-watchman-monitoring":"fontawesome/brands/watchman-monitoring.svg","fontawesome-brands-waze":"fontawesome/brands/waze.svg","fontawesome-brands-weebly":"fontawesome/brands/weebly.svg","fontawesome-brands-weibo":"fontawesome/brands/weibo.svg","fontawesome-brands-weixin":"fontawesome/brands/weixin.svg","fontawesome-brands-whatsapp":"fontawesome/brands/whatsapp.svg","fontawesome-brands-whmcs":"fontawesome/brands/whmcs.svg","fontawesome-brands-wikipedia-w":"fontawesome/brands/wikipedia-w.svg","fontawesome-brands-windows":"fontawesome/brands/windows.svg","fontawesome-brands-wirsindhandwerk":"fontawesome/brands/wirsindhandwerk.svg","fontawesome-brands-wix":"fontawesome/brands/wix.svg","fontawesome-brands-wizards-of-the-coast":"fontawesome/brands/wizards-of-the-coast.svg","fontawesome-brands-wodu":"fontawesome/brands/wodu.svg","fontawesome-brands-wolf-pack-battalion":"fontawesome/brands/wolf-pack-battalion.svg","fontawesome-brands-wordpress-simple":"fontawesome/brands/wordpress-simple.svg","fontawesome-brands-wordpress":"fontawesome/brands/wordpress.svg","fontawesome-brands-wpbeginner":"fontawesome/brands/wpbeginner.svg","fontawesome-brands-wpexplorer":"fontawesome/brands/wpexplorer.svg","fontawesome-brands-wpforms":"fontawesome/brands/wpforms.svg","fontawesome-brands-wpressr":"fontawesome/brands/wpressr.svg","fontawesome-brands-xbox":"fontawesome/brands/xbox.svg","fontawesome-brands-xing":"fontawesome/brands/xing.svg","fontawesome-brands-y-combinator":"fontawesome/brands/y-combinator.svg","fontawesome-brands-yahoo":"fontawesome/brands/yahoo.svg","fontawesome-brands-yammer":"fontawesome/brands/yammer.svg","fontawesome-brands-yandex-international":"fontawesome/brands/yandex-international.svg","fontawesome-brands-yandex":"fontawesome/brands/yandex.svg","fontawesome-brands-yarn":"fontawesome/brands/yarn.svg","fontawesome-brands-yelp":"fontawesome/brands/yelp.svg","fontawesome-brands-yoast":"fontawesome/brands/yoast.svg","fontawesome-brands-youtube":"fontawesome/brands/youtube.svg","fontawesome-brands-zhihu":"fontawesome/brands/zhihu.svg","fontawesome-regular-address-book":"fontawesome/regular/address-book.svg","fontawesome-regular-address-card":"fontawesome/regular/address-card.svg","fontawesome-regular-bell-slash":"fontawesome/regular/bell-slash.svg","fontawesome-regular-bell":"fontawesome/regular/bell.svg","fontawesome-regular-bookmark":"fontawesome/regular/bookmark.svg","fontawesome-regular-building":"fontawesome/regular/building.svg","fontawesome-regular-calendar-check":"fontawesome/regular/calendar-check.svg","fontawesome-regular-calendar-days":"fontawesome/regular/calendar-days.svg","fontawesome-regular-calendar-minus":"fontawesome/regular/calendar-minus.svg","fontawesome-regular-calendar-plus":"fontawesome/regular/calendar-plus.svg","fontawesome-regular-calendar-xmark":"fontawesome/regular/calendar-xmark.svg","fontawesome-regular-calendar":"fontawesome/regular/calendar.svg","fontawesome-regular-chart-bar":"fontawesome/regular/chart-bar.svg","fontawesome-regular-chess-bishop":"fontawesome/regular/chess-bishop.svg","fontawesome-regular-chess-king":"fontawesome/regular/chess-king.svg","fontawesome-regular-chess-knight":"fontawesome/regular/chess-knight.svg","fontawesome-regular-chess-pawn":"fontawesome/regular/chess-pawn.svg","fontawesome-regular-chess-queen":"fontawesome/regular/chess-queen.svg","fontawesome-regular-chess-rook":"fontawesome/regular/chess-rook.svg","fontawesome-regular-circle-check":"fontawesome/regular/circle-check.svg","fontawesome-regular-circle-dot":"fontawesome/regular/circle-dot.svg","fontawesome-regular-circle-down":"fontawesome/regular/circle-down.svg","fontawesome-regular-circle-left":"fontawesome/regular/circle-left.svg","fontawesome-regular-circle-pause":"fontawesome/regular/circle-pause.svg","fontawesome-regular-circle-play":"fontawesome/regular/circle-play.svg","fontawesome-regular-circle-question":"fontawesome/regular/circle-question.svg","fontawesome-regular-circle-right":"fontawesome/regular/circle-right.svg","fontawesome-regular-circle-stop":"fontawesome/regular/circle-stop.svg","fontawesome-regular-circle-up":"fontawesome/regular/circle-up.svg","fontawesome-regular-circle-user":"fontawesome/regular/circle-user.svg","fontawesome-regular-circle-xmark":"fontawesome/regular/circle-xmark.svg","fontawesome-regular-circle":"fontawesome/regular/circle.svg","fontawesome-regular-clipboard":"fontawesome/regular/clipboard.svg","fontawesome-regular-clock":"fontawesome/regular/clock.svg","fontawesome-regular-clone":"fontawesome/regular/clone.svg","fontawesome-regular-closed-captioning":"fontawesome/regular/closed-captioning.svg","fontawesome-regular-comment-dots":"fontawesome/regular/comment-dots.svg","fontawesome-regular-comment":"fontawesome/regular/comment.svg","fontawesome-regular-comments":"fontawesome/regular/comments.svg","fontawesome-regular-compass":"fontawesome/regular/compass.svg","fontawesome-regular-copy":"fontawesome/regular/copy.svg","fontawesome-regular-copyright":"fontawesome/regular/copyright.svg","fontawesome-regular-credit-card":"fontawesome/regular/credit-card.svg","fontawesome-regular-envelope-open":"fontawesome/regular/envelope-open.svg","fontawesome-regular-envelope":"fontawesome/regular/envelope.svg","fontawesome-regular-eye-slash":"fontawesome/regular/eye-slash.svg","fontawesome-regular-eye":"fontawesome/regular/eye.svg","fontawesome-regular-face-angry":"fontawesome/regular/face-angry.svg","fontawesome-regular-face-dizzy":"fontawesome/regular/face-dizzy.svg","fontawesome-regular-face-flushed":"fontawesome/regular/face-flushed.svg","fontawesome-regular-face-frown-open":"fontawesome/regular/face-frown-open.svg","fontawesome-regular-face-frown":"fontawesome/regular/face-frown.svg","fontawesome-regular-face-grimace":"fontawesome/regular/face-grimace.svg","fontawesome-regular-face-grin-beam-sweat":"fontawesome/regular/face-grin-beam-sweat.svg","fontawesome-regular-face-grin-beam":"fontawesome/regular/face-grin-beam.svg","fontawesome-regular-face-grin-hearts":"fontawesome/regular/face-grin-hearts.svg","fontawesome-regular-face-grin-squint-tears":"fontawesome/regular/face-grin-squint-tears.svg","fontawesome-regular-face-grin-squint":"fontawesome/regular/face-grin-squint.svg","fontawesome-regular-face-grin-stars":"fontawesome/regular/face-grin-stars.svg","fontawesome-regular-face-grin-tears":"fontawesome/regular/face-grin-tears.svg","fontawesome-regular-face-grin-tongue-squint":"fontawesome/regular/face-grin-tongue-squint.svg","fontawesome-regular-face-grin-tongue-wink":"fontawesome/regular/face-grin-tongue-wink.svg","fontawesome-regular-face-grin-tongue":"fontawesome/regular/face-grin-tongue.svg","fontawesome-regular-face-grin-wide":"fontawesome/regular/face-grin-wide.svg","fontawesome-regular-face-grin-wink":"fontawesome/regular/face-grin-wink.svg","fontawesome-regular-face-grin":"fontawesome/regular/face-grin.svg","fontawesome-regular-face-kiss-beam":"fontawesome/regular/face-kiss-beam.svg","fontawesome-regular-face-kiss-wink-heart":"fontawesome/regular/face-kiss-wink-heart.svg","fontawesome-regular-face-kiss":"fontawesome/regular/face-kiss.svg","fontawesome-regular-face-laugh-beam":"fontawesome/regular/face-laugh-beam.svg","fontawesome-regular-face-laugh-squint":"fontawesome/regular/face-laugh-squint.svg","fontawesome-regular-face-laugh-wink":"fontawesome/regular/face-laugh-wink.svg","fontawesome-regular-face-laugh":"fontawesome/regular/face-laugh.svg","fontawesome-regular-face-meh-blank":"fontawesome/regular/face-meh-blank.svg","fontawesome-regular-face-meh":"fontawesome/regular/face-meh.svg","fontawesome-regular-face-rolling-eyes":"fontawesome/regular/face-rolling-eyes.svg","fontawesome-regular-face-sad-cry":"fontawesome/regular/face-sad-cry.svg","fontawesome-regular-face-sad-tear":"fontawesome/regular/face-sad-tear.svg","fontawesome-regular-face-smile-beam":"fontawesome/regular/face-smile-beam.svg","fontawesome-regular-face-smile-wink":"fontawesome/regular/face-smile-wink.svg","fontawesome-regular-face-smile":"fontawesome/regular/face-smile.svg","fontawesome-regular-face-surprise":"fontawesome/regular/face-surprise.svg","fontawesome-regular-face-tired":"fontawesome/regular/face-tired.svg","fontawesome-regular-file-audio":"fontawesome/regular/file-audio.svg","fontawesome-regular-file-code":"fontawesome/regular/file-code.svg","fontawesome-regular-file-excel":"fontawesome/regular/file-excel.svg","fontawesome-regular-file-image":"fontawesome/regular/file-image.svg","fontawesome-regular-file-lines":"fontawesome/regular/file-lines.svg","fontawesome-regular-file-pdf":"fontawesome/regular/file-pdf.svg","fontawesome-regular-file-powerpoint":"fontawesome/regular/file-powerpoint.svg","fontawesome-regular-file-video":"fontawesome/regular/file-video.svg","fontawesome-regular-file-word":"fontawesome/regular/file-word.svg","fontawesome-regular-file-zipper":"fontawesome/regular/file-zipper.svg","fontawesome-regular-file":"fontawesome/regular/file.svg","fontawesome-regular-flag":"fontawesome/regular/flag.svg","fontawesome-regular-floppy-disk":"fontawesome/regular/floppy-disk.svg","fontawesome-regular-folder-closed":"fontawesome/regular/folder-closed.svg","fontawesome-regular-folder-open":"fontawesome/regular/folder-open.svg","fontawesome-regular-folder":"fontawesome/regular/folder.svg","fontawesome-regular-font-awesome":"fontawesome/regular/font-awesome.svg","fontawesome-regular-futbol":"fontawesome/regular/futbol.svg","fontawesome-regular-gem":"fontawesome/regular/gem.svg","fontawesome-regular-hand-back-fist":"fontawesome/regular/hand-back-fist.svg","fontawesome-regular-hand-lizard":"fontawesome/regular/hand-lizard.svg","fontawesome-regular-hand-peace":"fontawesome/regular/hand-peace.svg","fontawesome-regular-hand-point-down":"fontawesome/regular/hand-point-down.svg","fontawesome-regular-hand-point-left":"fontawesome/regular/hand-point-left.svg","fontawesome-regular-hand-point-right":"fontawesome/regular/hand-point-right.svg","fontawesome-regular-hand-point-up":"fontawesome/regular/hand-point-up.svg","fontawesome-regular-hand-pointer":"fontawesome/regular/hand-pointer.svg","fontawesome-regular-hand-scissors":"fontawesome/regular/hand-scissors.svg","fontawesome-regular-hand-spock":"fontawesome/regular/hand-spock.svg","fontawesome-regular-hand":"fontawesome/regular/hand.svg","fontawesome-regular-handshake":"fontawesome/regular/handshake.svg","fontawesome-regular-hard-drive":"fontawesome/regular/hard-drive.svg","fontawesome-regular-heart":"fontawesome/regular/heart.svg","fontawesome-regular-hospital":"fontawesome/regular/hospital.svg","fontawesome-regular-hourglass-half":"fontawesome/regular/hourglass-half.svg","fontawesome-regular-hourglass":"fontawesome/regular/hourglass.svg","fontawesome-regular-id-badge":"fontawesome/regular/id-badge.svg","fontawesome-regular-id-card":"fontawesome/regular/id-card.svg","fontawesome-regular-image":"fontawesome/regular/image.svg","fontawesome-regular-images":"fontawesome/regular/images.svg","fontawesome-regular-keyboard":"fontawesome/regular/keyboard.svg","fontawesome-regular-lemon":"fontawesome/regular/lemon.svg","fontawesome-regular-life-ring":"fontawesome/regular/life-ring.svg","fontawesome-regular-lightbulb":"fontawesome/regular/lightbulb.svg","fontawesome-regular-map":"fontawesome/regular/map.svg","fontawesome-regular-message":"fontawesome/regular/message.svg","fontawesome-regular-money-bill-1":"fontawesome/regular/money-bill-1.svg","fontawesome-regular-moon":"fontawesome/regular/moon.svg","fontawesome-regular-newspaper":"fontawesome/regular/newspaper.svg","fontawesome-regular-notdef":"fontawesome/regular/notdef.svg","fontawesome-regular-note-sticky":"fontawesome/regular/note-sticky.svg","fontawesome-regular-object-group":"fontawesome/regular/object-group.svg","fontawesome-regular-object-ungroup":"fontawesome/regular/object-ungroup.svg","fontawesome-regular-paper-plane":"fontawesome/regular/paper-plane.svg","fontawesome-regular-paste":"fontawesome/regular/paste.svg","fontawesome-regular-pen-to-square":"fontawesome/regular/pen-to-square.svg","fontawesome-regular-rectangle-list":"fontawesome/regular/rectangle-list.svg","fontawesome-regular-rectangle-xmark":"fontawesome/regular/rectangle-xmark.svg","fontawesome-regular-registered":"fontawesome/regular/registered.svg","fontawesome-regular-share-from-square":"fontawesome/regular/share-from-square.svg","fontawesome-regular-snowflake":"fontawesome/regular/snowflake.svg","fontawesome-regular-square-caret-down":"fontawesome/regular/square-caret-down.svg","fontawesome-regular-square-caret-left":"fontawesome/regular/square-caret-left.svg","fontawesome-regular-square-caret-right":"fontawesome/regular/square-caret-right.svg","fontawesome-regular-square-caret-up":"fontawesome/regular/square-caret-up.svg","fontawesome-regular-square-check":"fontawesome/regular/square-check.svg","fontawesome-regular-square-full":"fontawesome/regular/square-full.svg","fontawesome-regular-square-minus":"fontawesome/regular/square-minus.svg","fontawesome-regular-square-plus":"fontawesome/regular/square-plus.svg","fontawesome-regular-square":"fontawesome/regular/square.svg","fontawesome-regular-star-half-stroke":"fontawesome/regular/star-half-stroke.svg","fontawesome-regular-star-half":"fontawesome/regular/star-half.svg","fontawesome-regular-star":"fontawesome/regular/star.svg","fontawesome-regular-sun":"fontawesome/regular/sun.svg","fontawesome-regular-thumbs-down":"fontawesome/regular/thumbs-down.svg","fontawesome-regular-thumbs-up":"fontawesome/regular/thumbs-up.svg","fontawesome-regular-trash-can":"fontawesome/regular/trash-can.svg","fontawesome-regular-user":"fontawesome/regular/user.svg","fontawesome-regular-window-maximize":"fontawesome/regular/window-maximize.svg","fontawesome-regular-window-minimize":"fontawesome/regular/window-minimize.svg","fontawesome-regular-window-restore":"fontawesome/regular/window-restore.svg","fontawesome-solid-0":"fontawesome/solid/0.svg","fontawesome-solid-1":"fontawesome/solid/1.svg","fontawesome-solid-2":"fontawesome/solid/2.svg","fontawesome-solid-3":"fontawesome/solid/3.svg","fontawesome-solid-4":"fontawesome/solid/4.svg","fontawesome-solid-5":"fontawesome/solid/5.svg","fontawesome-solid-6":"fontawesome/solid/6.svg","fontawesome-solid-7":"fontawesome/solid/7.svg","fontawesome-solid-8":"fontawesome/solid/8.svg","fontawesome-solid-9":"fontawesome/solid/9.svg","fontawesome-solid-a":"fontawesome/solid/a.svg","fontawesome-solid-address-book":"fontawesome/solid/address-book.svg","fontawesome-solid-address-card":"fontawesome/solid/address-card.svg","fontawesome-solid-align-center":"fontawesome/solid/align-center.svg","fontawesome-solid-align-justify":"fontawesome/solid/align-justify.svg","fontawesome-solid-align-left":"fontawesome/solid/align-left.svg","fontawesome-solid-align-right":"fontawesome/solid/align-right.svg","fontawesome-solid-anchor-circle-check":"fontawesome/solid/anchor-circle-check.svg","fontawesome-solid-anchor-circle-exclamation":"fontawesome/solid/anchor-circle-exclamation.svg","fontawesome-solid-anchor-circle-xmark":"fontawesome/solid/anchor-circle-xmark.svg","fontawesome-solid-anchor-lock":"fontawesome/solid/anchor-lock.svg","fontawesome-solid-anchor":"fontawesome/solid/anchor.svg","fontawesome-solid-angle-down":"fontawesome/solid/angle-down.svg","fontawesome-solid-angle-left":"fontawesome/solid/angle-left.svg","fontawesome-solid-angle-right":"fontawesome/solid/angle-right.svg","fontawesome-solid-angle-up":"fontawesome/solid/angle-up.svg","fontawesome-solid-angles-down":"fontawesome/solid/angles-down.svg","fontawesome-solid-angles-left":"fontawesome/solid/angles-left.svg","fontawesome-solid-angles-right":"fontawesome/solid/angles-right.svg","fontawesome-solid-angles-up":"fontawesome/solid/angles-up.svg","fontawesome-solid-ankh":"fontawesome/solid/ankh.svg","fontawesome-solid-apple-whole":"fontawesome/solid/apple-whole.svg","fontawesome-solid-archway":"fontawesome/solid/archway.svg","fontawesome-solid-arrow-down-1-9":"fontawesome/solid/arrow-down-1-9.svg","fontawesome-solid-arrow-down-9-1":"fontawesome/solid/arrow-down-9-1.svg","fontawesome-solid-arrow-down-a-z":"fontawesome/solid/arrow-down-a-z.svg","fontawesome-solid-arrow-down-long":"fontawesome/solid/arrow-down-long.svg","fontawesome-solid-arrow-down-short-wide":"fontawesome/solid/arrow-down-short-wide.svg","fontawesome-solid-arrow-down-up-across-line":"fontawesome/solid/arrow-down-up-across-line.svg","fontawesome-solid-arrow-down-up-lock":"fontawesome/solid/arrow-down-up-lock.svg","fontawesome-solid-arrow-down-wide-short":"fontawesome/solid/arrow-down-wide-short.svg","fontawesome-solid-arrow-down-z-a":"fontawesome/solid/arrow-down-z-a.svg","fontawesome-solid-arrow-down":"fontawesome/solid/arrow-down.svg","fontawesome-solid-arrow-left-long":"fontawesome/solid/arrow-left-long.svg","fontawesome-solid-arrow-left":"fontawesome/solid/arrow-left.svg","fontawesome-solid-arrow-pointer":"fontawesome/solid/arrow-pointer.svg","fontawesome-solid-arrow-right-arrow-left":"fontawesome/solid/arrow-right-arrow-left.svg","fontawesome-solid-arrow-right-from-bracket":"fontawesome/solid/arrow-right-from-bracket.svg","fontawesome-solid-arrow-right-long":"fontawesome/solid/arrow-right-long.svg","fontawesome-solid-arrow-right-to-bracket":"fontawesome/solid/arrow-right-to-bracket.svg","fontawesome-solid-arrow-right-to-city":"fontawesome/solid/arrow-right-to-city.svg","fontawesome-solid-arrow-right":"fontawesome/solid/arrow-right.svg","fontawesome-solid-arrow-rotate-left":"fontawesome/solid/arrow-rotate-left.svg","fontawesome-solid-arrow-rotate-right":"fontawesome/solid/arrow-rotate-right.svg","fontawesome-solid-arrow-trend-down":"fontawesome/solid/arrow-trend-down.svg","fontawesome-solid-arrow-trend-up":"fontawesome/solid/arrow-trend-up.svg","fontawesome-solid-arrow-turn-down":"fontawesome/solid/arrow-turn-down.svg","fontawesome-solid-arrow-turn-up":"fontawesome/solid/arrow-turn-up.svg","fontawesome-solid-arrow-up-1-9":"fontawesome/solid/arrow-up-1-9.svg","fontawesome-solid-arrow-up-9-1":"fontawesome/solid/arrow-up-9-1.svg","fontawesome-solid-arrow-up-a-z":"fontawesome/solid/arrow-up-a-z.svg","fontawesome-solid-arrow-up-from-bracket":"fontawesome/solid/arrow-up-from-bracket.svg","fontawesome-solid-arrow-up-from-ground-water":"fontawesome/solid/arrow-up-from-ground-water.svg","fontawesome-solid-arrow-up-from-water-pump":"fontawesome/solid/arrow-up-from-water-pump.svg","fontawesome-solid-arrow-up-long":"fontawesome/solid/arrow-up-long.svg","fontawesome-solid-arrow-up-right-dots":"fontawesome/solid/arrow-up-right-dots.svg","fontawesome-solid-arrow-up-right-from-square":"fontawesome/solid/arrow-up-right-from-square.svg","fontawesome-solid-arrow-up-short-wide":"fontawesome/solid/arrow-up-short-wide.svg","fontawesome-solid-arrow-up-wide-short":"fontawesome/solid/arrow-up-wide-short.svg","fontawesome-solid-arrow-up-z-a":"fontawesome/solid/arrow-up-z-a.svg","fontawesome-solid-arrow-up":"fontawesome/solid/arrow-up.svg","fontawesome-solid-arrows-down-to-line":"fontawesome/solid/arrows-down-to-line.svg","fontawesome-solid-arrows-down-to-people":"fontawesome/solid/arrows-down-to-people.svg","fontawesome-solid-arrows-left-right-to-line":"fontawesome/solid/arrows-left-right-to-line.svg","fontawesome-solid-arrows-left-right":"fontawesome/solid/arrows-left-right.svg","fontawesome-solid-arrows-rotate":"fontawesome/solid/arrows-rotate.svg","fontawesome-solid-arrows-spin":"fontawesome/solid/arrows-spin.svg","fontawesome-solid-arrows-split-up-and-left":"fontawesome/solid/arrows-split-up-and-left.svg","fontawesome-solid-arrows-to-circle":"fontawesome/solid/arrows-to-circle.svg","fontawesome-solid-arrows-to-dot":"fontawesome/solid/arrows-to-dot.svg","fontawesome-solid-arrows-to-eye":"fontawesome/solid/arrows-to-eye.svg","fontawesome-solid-arrows-turn-right":"fontawesome/solid/arrows-turn-right.svg","fontawesome-solid-arrows-turn-to-dots":"fontawesome/solid/arrows-turn-to-dots.svg","fontawesome-solid-arrows-up-down-left-right":"fontawesome/solid/arrows-up-down-left-right.svg","fontawesome-solid-arrows-up-down":"fontawesome/solid/arrows-up-down.svg","fontawesome-solid-arrows-up-to-line":"fontawesome/solid/arrows-up-to-line.svg","fontawesome-solid-asterisk":"fontawesome/solid/asterisk.svg","fontawesome-solid-at":"fontawesome/solid/at.svg","fontawesome-solid-atom":"fontawesome/solid/atom.svg","fontawesome-solid-audio-description":"fontawesome/solid/audio-description.svg","fontawesome-solid-austral-sign":"fontawesome/solid/austral-sign.svg","fontawesome-solid-award":"fontawesome/solid/award.svg","fontawesome-solid-b":"fontawesome/solid/b.svg","fontawesome-solid-baby-carriage":"fontawesome/solid/baby-carriage.svg","fontawesome-solid-baby":"fontawesome/solid/baby.svg","fontawesome-solid-backward-fast":"fontawesome/solid/backward-fast.svg","fontawesome-solid-backward-step":"fontawesome/solid/backward-step.svg","fontawesome-solid-backward":"fontawesome/solid/backward.svg","fontawesome-solid-bacon":"fontawesome/solid/bacon.svg","fontawesome-solid-bacteria":"fontawesome/solid/bacteria.svg","fontawesome-solid-bacterium":"fontawesome/solid/bacterium.svg","fontawesome-solid-bag-shopping":"fontawesome/solid/bag-shopping.svg","fontawesome-solid-bahai":"fontawesome/solid/bahai.svg","fontawesome-solid-baht-sign":"fontawesome/solid/baht-sign.svg","fontawesome-solid-ban-smoking":"fontawesome/solid/ban-smoking.svg","fontawesome-solid-ban":"fontawesome/solid/ban.svg","fontawesome-solid-bandage":"fontawesome/solid/bandage.svg","fontawesome-solid-barcode":"fontawesome/solid/barcode.svg","fontawesome-solid-bars-progress":"fontawesome/solid/bars-progress.svg","fontawesome-solid-bars-staggered":"fontawesome/solid/bars-staggered.svg","fontawesome-solid-bars":"fontawesome/solid/bars.svg","fontawesome-solid-baseball-bat-ball":"fontawesome/solid/baseball-bat-ball.svg","fontawesome-solid-baseball":"fontawesome/solid/baseball.svg","fontawesome-solid-basket-shopping":"fontawesome/solid/basket-shopping.svg","fontawesome-solid-basketball":"fontawesome/solid/basketball.svg","fontawesome-solid-bath":"fontawesome/solid/bath.svg","fontawesome-solid-battery-empty":"fontawesome/solid/battery-empty.svg","fontawesome-solid-battery-full":"fontawesome/solid/battery-full.svg","fontawesome-solid-battery-half":"fontawesome/solid/battery-half.svg","fontawesome-solid-battery-quarter":"fontawesome/solid/battery-quarter.svg","fontawesome-solid-battery-three-quarters":"fontawesome/solid/battery-three-quarters.svg","fontawesome-solid-bed-pulse":"fontawesome/solid/bed-pulse.svg","fontawesome-solid-bed":"fontawesome/solid/bed.svg","fontawesome-solid-beer-mug-empty":"fontawesome/solid/beer-mug-empty.svg","fontawesome-solid-bell-concierge":"fontawesome/solid/bell-concierge.svg","fontawesome-solid-bell-slash":"fontawesome/solid/bell-slash.svg","fontawesome-solid-bell":"fontawesome/solid/bell.svg","fontawesome-solid-bezier-curve":"fontawesome/solid/bezier-curve.svg","fontawesome-solid-bicycle":"fontawesome/solid/bicycle.svg","fontawesome-solid-binoculars":"fontawesome/solid/binoculars.svg","fontawesome-solid-biohazard":"fontawesome/solid/biohazard.svg","fontawesome-solid-bitcoin-sign":"fontawesome/solid/bitcoin-sign.svg","fontawesome-solid-blender-phone":"fontawesome/solid/blender-phone.svg","fontawesome-solid-blender":"fontawesome/solid/blender.svg","fontawesome-solid-blog":"fontawesome/solid/blog.svg","fontawesome-solid-bold":"fontawesome/solid/bold.svg","fontawesome-solid-bolt-lightning":"fontawesome/solid/bolt-lightning.svg","fontawesome-solid-bolt":"fontawesome/solid/bolt.svg","fontawesome-solid-bomb":"fontawesome/solid/bomb.svg","fontawesome-solid-bone":"fontawesome/solid/bone.svg","fontawesome-solid-bong":"fontawesome/solid/bong.svg","fontawesome-solid-book-atlas":"fontawesome/solid/book-atlas.svg","fontawesome-solid-book-bible":"fontawesome/solid/book-bible.svg","fontawesome-solid-book-bookmark":"fontawesome/solid/book-bookmark.svg","fontawesome-solid-book-journal-whills":"fontawesome/solid/book-journal-whills.svg","fontawesome-solid-book-medical":"fontawesome/solid/book-medical.svg","fontawesome-solid-book-open-reader":"fontawesome/solid/book-open-reader.svg","fontawesome-solid-book-open":"fontawesome/solid/book-open.svg","fontawesome-solid-book-quran":"fontawesome/solid/book-quran.svg","fontawesome-solid-book-skull":"fontawesome/solid/book-skull.svg","fontawesome-solid-book-tanakh":"fontawesome/solid/book-tanakh.svg","fontawesome-solid-book":"fontawesome/solid/book.svg","fontawesome-solid-bookmark":"fontawesome/solid/bookmark.svg","fontawesome-solid-border-all":"fontawesome/solid/border-all.svg","fontawesome-solid-border-none":"fontawesome/solid/border-none.svg","fontawesome-solid-border-top-left":"fontawesome/solid/border-top-left.svg","fontawesome-solid-bore-hole":"fontawesome/solid/bore-hole.svg","fontawesome-solid-bottle-droplet":"fontawesome/solid/bottle-droplet.svg","fontawesome-solid-bottle-water":"fontawesome/solid/bottle-water.svg","fontawesome-solid-bowl-food":"fontawesome/solid/bowl-food.svg","fontawesome-solid-bowl-rice":"fontawesome/solid/bowl-rice.svg","fontawesome-solid-bowling-ball":"fontawesome/solid/bowling-ball.svg","fontawesome-solid-box-archive":"fontawesome/solid/box-archive.svg","fontawesome-solid-box-open":"fontawesome/solid/box-open.svg","fontawesome-solid-box-tissue":"fontawesome/solid/box-tissue.svg","fontawesome-solid-box":"fontawesome/solid/box.svg","fontawesome-solid-boxes-packing":"fontawesome/solid/boxes-packing.svg","fontawesome-solid-boxes-stacked":"fontawesome/solid/boxes-stacked.svg","fontawesome-solid-braille":"fontawesome/solid/braille.svg","fontawesome-solid-brain":"fontawesome/solid/brain.svg","fontawesome-solid-brazilian-real-sign":"fontawesome/solid/brazilian-real-sign.svg","fontawesome-solid-bread-slice":"fontawesome/solid/bread-slice.svg","fontawesome-solid-bridge-circle-check":"fontawesome/solid/bridge-circle-check.svg","fontawesome-solid-bridge-circle-exclamation":"fontawesome/solid/bridge-circle-exclamation.svg","fontawesome-solid-bridge-circle-xmark":"fontawesome/solid/bridge-circle-xmark.svg","fontawesome-solid-bridge-lock":"fontawesome/solid/bridge-lock.svg","fontawesome-solid-bridge-water":"fontawesome/solid/bridge-water.svg","fontawesome-solid-bridge":"fontawesome/solid/bridge.svg","fontawesome-solid-briefcase-medical":"fontawesome/solid/briefcase-medical.svg","fontawesome-solid-briefcase":"fontawesome/solid/briefcase.svg","fontawesome-solid-broom-ball":"fontawesome/solid/broom-ball.svg","fontawesome-solid-broom":"fontawesome/solid/broom.svg","fontawesome-solid-brush":"fontawesome/solid/brush.svg","fontawesome-solid-bucket":"fontawesome/solid/bucket.svg","fontawesome-solid-bug-slash":"fontawesome/solid/bug-slash.svg","fontawesome-solid-bug":"fontawesome/solid/bug.svg","fontawesome-solid-bugs":"fontawesome/solid/bugs.svg","fontawesome-solid-building-circle-arrow-right":"fontawesome/solid/building-circle-arrow-right.svg","fontawesome-solid-building-circle-check":"fontawesome/solid/building-circle-check.svg","fontawesome-solid-building-circle-exclamation":"fontawesome/solid/building-circle-exclamation.svg","fontawesome-solid-building-circle-xmark":"fontawesome/solid/building-circle-xmark.svg","fontawesome-solid-building-columns":"fontawesome/solid/building-columns.svg","fontawesome-solid-building-flag":"fontawesome/solid/building-flag.svg","fontawesome-solid-building-lock":"fontawesome/solid/building-lock.svg","fontawesome-solid-building-ngo":"fontawesome/solid/building-ngo.svg","fontawesome-solid-building-shield":"fontawesome/solid/building-shield.svg","fontawesome-solid-building-un":"fontawesome/solid/building-un.svg","fontawesome-solid-building-user":"fontawesome/solid/building-user.svg","fontawesome-solid-building-wheat":"fontawesome/solid/building-wheat.svg","fontawesome-solid-building":"fontawesome/solid/building.svg","fontawesome-solid-bullhorn":"fontawesome/solid/bullhorn.svg","fontawesome-solid-bullseye":"fontawesome/solid/bullseye.svg","fontawesome-solid-burger":"fontawesome/solid/burger.svg","fontawesome-solid-burst":"fontawesome/solid/burst.svg","fontawesome-solid-bus-simple":"fontawesome/solid/bus-simple.svg","fontawesome-solid-bus":"fontawesome/solid/bus.svg","fontawesome-solid-business-time":"fontawesome/solid/business-time.svg","fontawesome-solid-c":"fontawesome/solid/c.svg","fontawesome-solid-cable-car":"fontawesome/solid/cable-car.svg","fontawesome-solid-cake-candles":"fontawesome/solid/cake-candles.svg","fontawesome-solid-calculator":"fontawesome/solid/calculator.svg","fontawesome-solid-calendar-check":"fontawesome/solid/calendar-check.svg","fontawesome-solid-calendar-day":"fontawesome/solid/calendar-day.svg","fontawesome-solid-calendar-days":"fontawesome/solid/calendar-days.svg","fontawesome-solid-calendar-minus":"fontawesome/solid/calendar-minus.svg","fontawesome-solid-calendar-plus":"fontawesome/solid/calendar-plus.svg","fontawesome-solid-calendar-week":"fontawesome/solid/calendar-week.svg","fontawesome-solid-calendar-xmark":"fontawesome/solid/calendar-xmark.svg","fontawesome-solid-calendar":"fontawesome/solid/calendar.svg","fontawesome-solid-camera-retro":"fontawesome/solid/camera-retro.svg","fontawesome-solid-camera-rotate":"fontawesome/solid/camera-rotate.svg","fontawesome-solid-camera":"fontawesome/solid/camera.svg","fontawesome-solid-campground":"fontawesome/solid/campground.svg","fontawesome-solid-candy-cane":"fontawesome/solid/candy-cane.svg","fontawesome-solid-cannabis":"fontawesome/solid/cannabis.svg","fontawesome-solid-capsules":"fontawesome/solid/capsules.svg","fontawesome-solid-car-battery":"fontawesome/solid/car-battery.svg","fontawesome-solid-car-burst":"fontawesome/solid/car-burst.svg","fontawesome-solid-car-on":"fontawesome/solid/car-on.svg","fontawesome-solid-car-rear":"fontawesome/solid/car-rear.svg","fontawesome-solid-car-side":"fontawesome/solid/car-side.svg","fontawesome-solid-car-tunnel":"fontawesome/solid/car-tunnel.svg","fontawesome-solid-car":"fontawesome/solid/car.svg","fontawesome-solid-caravan":"fontawesome/solid/caravan.svg","fontawesome-solid-caret-down":"fontawesome/solid/caret-down.svg","fontawesome-solid-caret-left":"fontawesome/solid/caret-left.svg","fontawesome-solid-caret-right":"fontawesome/solid/caret-right.svg","fontawesome-solid-caret-up":"fontawesome/solid/caret-up.svg","fontawesome-solid-carrot":"fontawesome/solid/carrot.svg","fontawesome-solid-cart-arrow-down":"fontawesome/solid/cart-arrow-down.svg","fontawesome-solid-cart-flatbed-suitcase":"fontawesome/solid/cart-flatbed-suitcase.svg","fontawesome-solid-cart-flatbed":"fontawesome/solid/cart-flatbed.svg","fontawesome-solid-cart-plus":"fontawesome/solid/cart-plus.svg","fontawesome-solid-cart-shopping":"fontawesome/solid/cart-shopping.svg","fontawesome-solid-cash-register":"fontawesome/solid/cash-register.svg","fontawesome-solid-cat":"fontawesome/solid/cat.svg","fontawesome-solid-cedi-sign":"fontawesome/solid/cedi-sign.svg","fontawesome-solid-cent-sign":"fontawesome/solid/cent-sign.svg","fontawesome-solid-certificate":"fontawesome/solid/certificate.svg","fontawesome-solid-chair":"fontawesome/solid/chair.svg","fontawesome-solid-chalkboard-user":"fontawesome/solid/chalkboard-user.svg","fontawesome-solid-chalkboard":"fontawesome/solid/chalkboard.svg","fontawesome-solid-champagne-glasses":"fontawesome/solid/champagne-glasses.svg","fontawesome-solid-charging-station":"fontawesome/solid/charging-station.svg","fontawesome-solid-chart-area":"fontawesome/solid/chart-area.svg","fontawesome-solid-chart-bar":"fontawesome/solid/chart-bar.svg","fontawesome-solid-chart-column":"fontawesome/solid/chart-column.svg","fontawesome-solid-chart-gantt":"fontawesome/solid/chart-gantt.svg","fontawesome-solid-chart-line":"fontawesome/solid/chart-line.svg","fontawesome-solid-chart-pie":"fontawesome/solid/chart-pie.svg","fontawesome-solid-chart-simple":"fontawesome/solid/chart-simple.svg","fontawesome-solid-check-double":"fontawesome/solid/check-double.svg","fontawesome-solid-check-to-slot":"fontawesome/solid/check-to-slot.svg","fontawesome-solid-check":"fontawesome/solid/check.svg","fontawesome-solid-cheese":"fontawesome/solid/cheese.svg","fontawesome-solid-chess-bishop":"fontawesome/solid/chess-bishop.svg","fontawesome-solid-chess-board":"fontawesome/solid/chess-board.svg","fontawesome-solid-chess-king":"fontawesome/solid/chess-king.svg","fontawesome-solid-chess-knight":"fontawesome/solid/chess-knight.svg","fontawesome-solid-chess-pawn":"fontawesome/solid/chess-pawn.svg","fontawesome-solid-chess-queen":"fontawesome/solid/chess-queen.svg","fontawesome-solid-chess-rook":"fontawesome/solid/chess-rook.svg","fontawesome-solid-chess":"fontawesome/solid/chess.svg","fontawesome-solid-chevron-down":"fontawesome/solid/chevron-down.svg","fontawesome-solid-chevron-left":"fontawesome/solid/chevron-left.svg","fontawesome-solid-chevron-right":"fontawesome/solid/chevron-right.svg","fontawesome-solid-chevron-up":"fontawesome/solid/chevron-up.svg","fontawesome-solid-child-dress":"fontawesome/solid/child-dress.svg","fontawesome-solid-child-reaching":"fontawesome/solid/child-reaching.svg","fontawesome-solid-child-rifle":"fontawesome/solid/child-rifle.svg","fontawesome-solid-child":"fontawesome/solid/child.svg","fontawesome-solid-children":"fontawesome/solid/children.svg","fontawesome-solid-church":"fontawesome/solid/church.svg","fontawesome-solid-circle-arrow-down":"fontawesome/solid/circle-arrow-down.svg","fontawesome-solid-circle-arrow-left":"fontawesome/solid/circle-arrow-left.svg","fontawesome-solid-circle-arrow-right":"fontawesome/solid/circle-arrow-right.svg","fontawesome-solid-circle-arrow-up":"fontawesome/solid/circle-arrow-up.svg","fontawesome-solid-circle-check":"fontawesome/solid/circle-check.svg","fontawesome-solid-circle-chevron-down":"fontawesome/solid/circle-chevron-down.svg","fontawesome-solid-circle-chevron-left":"fontawesome/solid/circle-chevron-left.svg","fontawesome-solid-circle-chevron-right":"fontawesome/solid/circle-chevron-right.svg","fontawesome-solid-circle-chevron-up":"fontawesome/solid/circle-chevron-up.svg","fontawesome-solid-circle-dollar-to-slot":"fontawesome/solid/circle-dollar-to-slot.svg","fontawesome-solid-circle-dot":"fontawesome/solid/circle-dot.svg","fontawesome-solid-circle-down":"fontawesome/solid/circle-down.svg","fontawesome-solid-circle-exclamation":"fontawesome/solid/circle-exclamation.svg","fontawesome-solid-circle-h":"fontawesome/solid/circle-h.svg","fontawesome-solid-circle-half-stroke":"fontawesome/solid/circle-half-stroke.svg","fontawesome-solid-circle-info":"fontawesome/solid/circle-info.svg","fontawesome-solid-circle-left":"fontawesome/solid/circle-left.svg","fontawesome-solid-circle-minus":"fontawesome/solid/circle-minus.svg","fontawesome-solid-circle-nodes":"fontawesome/solid/circle-nodes.svg","fontawesome-solid-circle-notch":"fontawesome/solid/circle-notch.svg","fontawesome-solid-circle-pause":"fontawesome/solid/circle-pause.svg","fontawesome-solid-circle-play":"fontawesome/solid/circle-play.svg","fontawesome-solid-circle-plus":"fontawesome/solid/circle-plus.svg","fontawesome-solid-circle-question":"fontawesome/solid/circle-question.svg","fontawesome-solid-circle-radiation":"fontawesome/solid/circle-radiation.svg","fontawesome-solid-circle-right":"fontawesome/solid/circle-right.svg","fontawesome-solid-circle-stop":"fontawesome/solid/circle-stop.svg","fontawesome-solid-circle-up":"fontawesome/solid/circle-up.svg","fontawesome-solid-circle-user":"fontawesome/solid/circle-user.svg","fontawesome-solid-circle-xmark":"fontawesome/solid/circle-xmark.svg","fontawesome-solid-circle":"fontawesome/solid/circle.svg","fontawesome-solid-city":"fontawesome/solid/city.svg","fontawesome-solid-clapperboard":"fontawesome/solid/clapperboard.svg","fontawesome-solid-clipboard-check":"fontawesome/solid/clipboard-check.svg","fontawesome-solid-clipboard-list":"fontawesome/solid/clipboard-list.svg","fontawesome-solid-clipboard-question":"fontawesome/solid/clipboard-question.svg","fontawesome-solid-clipboard-user":"fontawesome/solid/clipboard-user.svg","fontawesome-solid-clipboard":"fontawesome/solid/clipboard.svg","fontawesome-solid-clock-rotate-left":"fontawesome/solid/clock-rotate-left.svg","fontawesome-solid-clock":"fontawesome/solid/clock.svg","fontawesome-solid-clone":"fontawesome/solid/clone.svg","fontawesome-solid-closed-captioning":"fontawesome/solid/closed-captioning.svg","fontawesome-solid-cloud-arrow-down":"fontawesome/solid/cloud-arrow-down.svg","fontawesome-solid-cloud-arrow-up":"fontawesome/solid/cloud-arrow-up.svg","fontawesome-solid-cloud-bolt":"fontawesome/solid/cloud-bolt.svg","fontawesome-solid-cloud-meatball":"fontawesome/solid/cloud-meatball.svg","fontawesome-solid-cloud-moon-rain":"fontawesome/solid/cloud-moon-rain.svg","fontawesome-solid-cloud-moon":"fontawesome/solid/cloud-moon.svg","fontawesome-solid-cloud-rain":"fontawesome/solid/cloud-rain.svg","fontawesome-solid-cloud-showers-heavy":"fontawesome/solid/cloud-showers-heavy.svg","fontawesome-solid-cloud-showers-water":"fontawesome/solid/cloud-showers-water.svg","fontawesome-solid-cloud-sun-rain":"fontawesome/solid/cloud-sun-rain.svg","fontawesome-solid-cloud-sun":"fontawesome/solid/cloud-sun.svg","fontawesome-solid-cloud":"fontawesome/solid/cloud.svg","fontawesome-solid-clover":"fontawesome/solid/clover.svg","fontawesome-solid-code-branch":"fontawesome/solid/code-branch.svg","fontawesome-solid-code-commit":"fontawesome/solid/code-commit.svg","fontawesome-solid-code-compare":"fontawesome/solid/code-compare.svg","fontawesome-solid-code-fork":"fontawesome/solid/code-fork.svg","fontawesome-solid-code-merge":"fontawesome/solid/code-merge.svg","fontawesome-solid-code-pull-request":"fontawesome/solid/code-pull-request.svg","fontawesome-solid-code":"fontawesome/solid/code.svg","fontawesome-solid-coins":"fontawesome/solid/coins.svg","fontawesome-solid-colon-sign":"fontawesome/solid/colon-sign.svg","fontawesome-solid-comment-dollar":"fontawesome/solid/comment-dollar.svg","fontawesome-solid-comment-dots":"fontawesome/solid/comment-dots.svg","fontawesome-solid-comment-medical":"fontawesome/solid/comment-medical.svg","fontawesome-solid-comment-slash":"fontawesome/solid/comment-slash.svg","fontawesome-solid-comment-sms":"fontawesome/solid/comment-sms.svg","fontawesome-solid-comment":"fontawesome/solid/comment.svg","fontawesome-solid-comments-dollar":"fontawesome/solid/comments-dollar.svg","fontawesome-solid-comments":"fontawesome/solid/comments.svg","fontawesome-solid-compact-disc":"fontawesome/solid/compact-disc.svg","fontawesome-solid-compass-drafting":"fontawesome/solid/compass-drafting.svg","fontawesome-solid-compass":"fontawesome/solid/compass.svg","fontawesome-solid-compress":"fontawesome/solid/compress.svg","fontawesome-solid-computer-mouse":"fontawesome/solid/computer-mouse.svg","fontawesome-solid-computer":"fontawesome/solid/computer.svg","fontawesome-solid-cookie-bite":"fontawesome/solid/cookie-bite.svg","fontawesome-solid-cookie":"fontawesome/solid/cookie.svg","fontawesome-solid-copy":"fontawesome/solid/copy.svg","fontawesome-solid-copyright":"fontawesome/solid/copyright.svg","fontawesome-solid-couch":"fontawesome/solid/couch.svg","fontawesome-solid-cow":"fontawesome/solid/cow.svg","fontawesome-solid-credit-card":"fontawesome/solid/credit-card.svg","fontawesome-solid-crop-simple":"fontawesome/solid/crop-simple.svg","fontawesome-solid-crop":"fontawesome/solid/crop.svg","fontawesome-solid-cross":"fontawesome/solid/cross.svg","fontawesome-solid-crosshairs":"fontawesome/solid/crosshairs.svg","fontawesome-solid-crow":"fontawesome/solid/crow.svg","fontawesome-solid-crown":"fontawesome/solid/crown.svg","fontawesome-solid-crutch":"fontawesome/solid/crutch.svg","fontawesome-solid-cruzeiro-sign":"fontawesome/solid/cruzeiro-sign.svg","fontawesome-solid-cube":"fontawesome/solid/cube.svg","fontawesome-solid-cubes-stacked":"fontawesome/solid/cubes-stacked.svg","fontawesome-solid-cubes":"fontawesome/solid/cubes.svg","fontawesome-solid-d":"fontawesome/solid/d.svg","fontawesome-solid-database":"fontawesome/solid/database.svg","fontawesome-solid-delete-left":"fontawesome/solid/delete-left.svg","fontawesome-solid-democrat":"fontawesome/solid/democrat.svg","fontawesome-solid-desktop":"fontawesome/solid/desktop.svg","fontawesome-solid-dharmachakra":"fontawesome/solid/dharmachakra.svg","fontawesome-solid-diagram-next":"fontawesome/solid/diagram-next.svg","fontawesome-solid-diagram-predecessor":"fontawesome/solid/diagram-predecessor.svg","fontawesome-solid-diagram-project":"fontawesome/solid/diagram-project.svg","fontawesome-solid-diagram-successor":"fontawesome/solid/diagram-successor.svg","fontawesome-solid-diamond-turn-right":"fontawesome/solid/diamond-turn-right.svg","fontawesome-solid-diamond":"fontawesome/solid/diamond.svg","fontawesome-solid-dice-d20":"fontawesome/solid/dice-d20.svg","fontawesome-solid-dice-d6":"fontawesome/solid/dice-d6.svg","fontawesome-solid-dice-five":"fontawesome/solid/dice-five.svg","fontawesome-solid-dice-four":"fontawesome/solid/dice-four.svg","fontawesome-solid-dice-one":"fontawesome/solid/dice-one.svg","fontawesome-solid-dice-six":"fontawesome/solid/dice-six.svg","fontawesome-solid-dice-three":"fontawesome/solid/dice-three.svg","fontawesome-solid-dice-two":"fontawesome/solid/dice-two.svg","fontawesome-solid-dice":"fontawesome/solid/dice.svg","fontawesome-solid-disease":"fontawesome/solid/disease.svg","fontawesome-solid-display":"fontawesome/solid/display.svg","fontawesome-solid-divide":"fontawesome/solid/divide.svg","fontawesome-solid-dna":"fontawesome/solid/dna.svg","fontawesome-solid-dog":"fontawesome/solid/dog.svg","fontawesome-solid-dollar-sign":"fontawesome/solid/dollar-sign.svg","fontawesome-solid-dolly":"fontawesome/solid/dolly.svg","fontawesome-solid-dong-sign":"fontawesome/solid/dong-sign.svg","fontawesome-solid-door-closed":"fontawesome/solid/door-closed.svg","fontawesome-solid-door-open":"fontawesome/solid/door-open.svg","fontawesome-solid-dove":"fontawesome/solid/dove.svg","fontawesome-solid-down-left-and-up-right-to-center":"fontawesome/solid/down-left-and-up-right-to-center.svg","fontawesome-solid-down-long":"fontawesome/solid/down-long.svg","fontawesome-solid-download":"fontawesome/solid/download.svg","fontawesome-solid-dragon":"fontawesome/solid/dragon.svg","fontawesome-solid-draw-polygon":"fontawesome/solid/draw-polygon.svg","fontawesome-solid-droplet-slash":"fontawesome/solid/droplet-slash.svg","fontawesome-solid-droplet":"fontawesome/solid/droplet.svg","fontawesome-solid-drum-steelpan":"fontawesome/solid/drum-steelpan.svg","fontawesome-solid-drum":"fontawesome/solid/drum.svg","fontawesome-solid-drumstick-bite":"fontawesome/solid/drumstick-bite.svg","fontawesome-solid-dumbbell":"fontawesome/solid/dumbbell.svg","fontawesome-solid-dumpster-fire":"fontawesome/solid/dumpster-fire.svg","fontawesome-solid-dumpster":"fontawesome/solid/dumpster.svg","fontawesome-solid-dungeon":"fontawesome/solid/dungeon.svg","fontawesome-solid-e":"fontawesome/solid/e.svg","fontawesome-solid-ear-deaf":"fontawesome/solid/ear-deaf.svg","fontawesome-solid-ear-listen":"fontawesome/solid/ear-listen.svg","fontawesome-solid-earth-africa":"fontawesome/solid/earth-africa.svg","fontawesome-solid-earth-americas":"fontawesome/solid/earth-americas.svg","fontawesome-solid-earth-asia":"fontawesome/solid/earth-asia.svg","fontawesome-solid-earth-europe":"fontawesome/solid/earth-europe.svg","fontawesome-solid-earth-oceania":"fontawesome/solid/earth-oceania.svg","fontawesome-solid-egg":"fontawesome/solid/egg.svg","fontawesome-solid-eject":"fontawesome/solid/eject.svg","fontawesome-solid-elevator":"fontawesome/solid/elevator.svg","fontawesome-solid-ellipsis-vertical":"fontawesome/solid/ellipsis-vertical.svg","fontawesome-solid-ellipsis":"fontawesome/solid/ellipsis.svg","fontawesome-solid-envelope-circle-check":"fontawesome/solid/envelope-circle-check.svg","fontawesome-solid-envelope-open-text":"fontawesome/solid/envelope-open-text.svg","fontawesome-solid-envelope-open":"fontawesome/solid/envelope-open.svg","fontawesome-solid-envelope":"fontawesome/solid/envelope.svg","fontawesome-solid-envelopes-bulk":"fontawesome/solid/envelopes-bulk.svg","fontawesome-solid-equals":"fontawesome/solid/equals.svg","fontawesome-solid-eraser":"fontawesome/solid/eraser.svg","fontawesome-solid-ethernet":"fontawesome/solid/ethernet.svg","fontawesome-solid-euro-sign":"fontawesome/solid/euro-sign.svg","fontawesome-solid-exclamation":"fontawesome/solid/exclamation.svg","fontawesome-solid-expand":"fontawesome/solid/expand.svg","fontawesome-solid-explosion":"fontawesome/solid/explosion.svg","fontawesome-solid-eye-dropper":"fontawesome/solid/eye-dropper.svg","fontawesome-solid-eye-low-vision":"fontawesome/solid/eye-low-vision.svg","fontawesome-solid-eye-slash":"fontawesome/solid/eye-slash.svg","fontawesome-solid-eye":"fontawesome/solid/eye.svg","fontawesome-solid-f":"fontawesome/solid/f.svg","fontawesome-solid-face-angry":"fontawesome/solid/face-angry.svg","fontawesome-solid-face-dizzy":"fontawesome/solid/face-dizzy.svg","fontawesome-solid-face-flushed":"fontawesome/solid/face-flushed.svg","fontawesome-solid-face-frown-open":"fontawesome/solid/face-frown-open.svg","fontawesome-solid-face-frown":"fontawesome/solid/face-frown.svg","fontawesome-solid-face-grimace":"fontawesome/solid/face-grimace.svg","fontawesome-solid-face-grin-beam-sweat":"fontawesome/solid/face-grin-beam-sweat.svg","fontawesome-solid-face-grin-beam":"fontawesome/solid/face-grin-beam.svg","fontawesome-solid-face-grin-hearts":"fontawesome/solid/face-grin-hearts.svg","fontawesome-solid-face-grin-squint-tears":"fontawesome/solid/face-grin-squint-tears.svg","fontawesome-solid-face-grin-squint":"fontawesome/solid/face-grin-squint.svg","fontawesome-solid-face-grin-stars":"fontawesome/solid/face-grin-stars.svg","fontawesome-solid-face-grin-tears":"fontawesome/solid/face-grin-tears.svg","fontawesome-solid-face-grin-tongue-squint":"fontawesome/solid/face-grin-tongue-squint.svg","fontawesome-solid-face-grin-tongue-wink":"fontawesome/solid/face-grin-tongue-wink.svg","fontawesome-solid-face-grin-tongue":"fontawesome/solid/face-grin-tongue.svg","fontawesome-solid-face-grin-wide":"fontawesome/solid/face-grin-wide.svg","fontawesome-solid-face-grin-wink":"fontawesome/solid/face-grin-wink.svg","fontawesome-solid-face-grin":"fontawesome/solid/face-grin.svg","fontawesome-solid-face-kiss-beam":"fontawesome/solid/face-kiss-beam.svg","fontawesome-solid-face-kiss-wink-heart":"fontawesome/solid/face-kiss-wink-heart.svg","fontawesome-solid-face-kiss":"fontawesome/solid/face-kiss.svg","fontawesome-solid-face-laugh-beam":"fontawesome/solid/face-laugh-beam.svg","fontawesome-solid-face-laugh-squint":"fontawesome/solid/face-laugh-squint.svg","fontawesome-solid-face-laugh-wink":"fontawesome/solid/face-laugh-wink.svg","fontawesome-solid-face-laugh":"fontawesome/solid/face-laugh.svg","fontawesome-solid-face-meh-blank":"fontawesome/solid/face-meh-blank.svg","fontawesome-solid-face-meh":"fontawesome/solid/face-meh.svg","fontawesome-solid-face-rolling-eyes":"fontawesome/solid/face-rolling-eyes.svg","fontawesome-solid-face-sad-cry":"fontawesome/solid/face-sad-cry.svg","fontawesome-solid-face-sad-tear":"fontawesome/solid/face-sad-tear.svg","fontawesome-solid-face-smile-beam":"fontawesome/solid/face-smile-beam.svg","fontawesome-solid-face-smile-wink":"fontawesome/solid/face-smile-wink.svg","fontawesome-solid-face-smile":"fontawesome/solid/face-smile.svg","fontawesome-solid-face-surprise":"fontawesome/solid/face-surprise.svg","fontawesome-solid-face-tired":"fontawesome/solid/face-tired.svg","fontawesome-solid-fan":"fontawesome/solid/fan.svg","fontawesome-solid-faucet-drip":"fontawesome/solid/faucet-drip.svg","fontawesome-solid-faucet":"fontawesome/solid/faucet.svg","fontawesome-solid-fax":"fontawesome/solid/fax.svg","fontawesome-solid-feather-pointed":"fontawesome/solid/feather-pointed.svg","fontawesome-solid-feather":"fontawesome/solid/feather.svg","fontawesome-solid-ferry":"fontawesome/solid/ferry.svg","fontawesome-solid-file-arrow-down":"fontawesome/solid/file-arrow-down.svg","fontawesome-solid-file-arrow-up":"fontawesome/solid/file-arrow-up.svg","fontawesome-solid-file-audio":"fontawesome/solid/file-audio.svg","fontawesome-solid-file-circle-check":"fontawesome/solid/file-circle-check.svg","fontawesome-solid-file-circle-exclamation":"fontawesome/solid/file-circle-exclamation.svg","fontawesome-solid-file-circle-minus":"fontawesome/solid/file-circle-minus.svg","fontawesome-solid-file-circle-plus":"fontawesome/solid/file-circle-plus.svg","fontawesome-solid-file-circle-question":"fontawesome/solid/file-circle-question.svg","fontawesome-solid-file-circle-xmark":"fontawesome/solid/file-circle-xmark.svg","fontawesome-solid-file-code":"fontawesome/solid/file-code.svg","fontawesome-solid-file-contract":"fontawesome/solid/file-contract.svg","fontawesome-solid-file-csv":"fontawesome/solid/file-csv.svg","fontawesome-solid-file-excel":"fontawesome/solid/file-excel.svg","fontawesome-solid-file-export":"fontawesome/solid/file-export.svg","fontawesome-solid-file-image":"fontawesome/solid/file-image.svg","fontawesome-solid-file-import":"fontawesome/solid/file-import.svg","fontawesome-solid-file-invoice-dollar":"fontawesome/solid/file-invoice-dollar.svg","fontawesome-solid-file-invoice":"fontawesome/solid/file-invoice.svg","fontawesome-solid-file-lines":"fontawesome/solid/file-lines.svg","fontawesome-solid-file-medical":"fontawesome/solid/file-medical.svg","fontawesome-solid-file-pdf":"fontawesome/solid/file-pdf.svg","fontawesome-solid-file-pen":"fontawesome/solid/file-pen.svg","fontawesome-solid-file-powerpoint":"fontawesome/solid/file-powerpoint.svg","fontawesome-solid-file-prescription":"fontawesome/solid/file-prescription.svg","fontawesome-solid-file-shield":"fontawesome/solid/file-shield.svg","fontawesome-solid-file-signature":"fontawesome/solid/file-signature.svg","fontawesome-solid-file-video":"fontawesome/solid/file-video.svg","fontawesome-solid-file-waveform":"fontawesome/solid/file-waveform.svg","fontawesome-solid-file-word":"fontawesome/solid/file-word.svg","fontawesome-solid-file-zipper":"fontawesome/solid/file-zipper.svg","fontawesome-solid-file":"fontawesome/solid/file.svg","fontawesome-solid-fill-drip":"fontawesome/solid/fill-drip.svg","fontawesome-solid-fill":"fontawesome/solid/fill.svg","fontawesome-solid-film":"fontawesome/solid/film.svg","fontawesome-solid-filter-circle-dollar":"fontawesome/solid/filter-circle-dollar.svg","fontawesome-solid-filter-circle-xmark":"fontawesome/solid/filter-circle-xmark.svg","fontawesome-solid-filter":"fontawesome/solid/filter.svg","fontawesome-solid-fingerprint":"fontawesome/solid/fingerprint.svg","fontawesome-solid-fire-burner":"fontawesome/solid/fire-burner.svg","fontawesome-solid-fire-extinguisher":"fontawesome/solid/fire-extinguisher.svg","fontawesome-solid-fire-flame-curved":"fontawesome/solid/fire-flame-curved.svg","fontawesome-solid-fire-flame-simple":"fontawesome/solid/fire-flame-simple.svg","fontawesome-solid-fire":"fontawesome/solid/fire.svg","fontawesome-solid-fish-fins":"fontawesome/solid/fish-fins.svg","fontawesome-solid-fish":"fontawesome/solid/fish.svg","fontawesome-solid-flag-checkered":"fontawesome/solid/flag-checkered.svg","fontawesome-solid-flag-usa":"fontawesome/solid/flag-usa.svg","fontawesome-solid-flag":"fontawesome/solid/flag.svg","fontawesome-solid-flask-vial":"fontawesome/solid/flask-vial.svg","fontawesome-solid-flask":"fontawesome/solid/flask.svg","fontawesome-solid-floppy-disk":"fontawesome/solid/floppy-disk.svg","fontawesome-solid-florin-sign":"fontawesome/solid/florin-sign.svg","fontawesome-solid-folder-closed":"fontawesome/solid/folder-closed.svg","fontawesome-solid-folder-minus":"fontawesome/solid/folder-minus.svg","fontawesome-solid-folder-open":"fontawesome/solid/folder-open.svg","fontawesome-solid-folder-plus":"fontawesome/solid/folder-plus.svg","fontawesome-solid-folder-tree":"fontawesome/solid/folder-tree.svg","fontawesome-solid-folder":"fontawesome/solid/folder.svg","fontawesome-solid-font-awesome":"fontawesome/solid/font-awesome.svg","fontawesome-solid-font":"fontawesome/solid/font.svg","fontawesome-solid-football":"fontawesome/solid/football.svg","fontawesome-solid-forward-fast":"fontawesome/solid/forward-fast.svg","fontawesome-solid-forward-step":"fontawesome/solid/forward-step.svg","fontawesome-solid-forward":"fontawesome/solid/forward.svg","fontawesome-solid-franc-sign":"fontawesome/solid/franc-sign.svg","fontawesome-solid-frog":"fontawesome/solid/frog.svg","fontawesome-solid-futbol":"fontawesome/solid/futbol.svg","fontawesome-solid-g":"fontawesome/solid/g.svg","fontawesome-solid-gamepad":"fontawesome/solid/gamepad.svg","fontawesome-solid-gas-pump":"fontawesome/solid/gas-pump.svg","fontawesome-solid-gauge-high":"fontawesome/solid/gauge-high.svg","fontawesome-solid-gauge-simple-high":"fontawesome/solid/gauge-simple-high.svg","fontawesome-solid-gauge-simple":"fontawesome/solid/gauge-simple.svg","fontawesome-solid-gauge":"fontawesome/solid/gauge.svg","fontawesome-solid-gavel":"fontawesome/solid/gavel.svg","fontawesome-solid-gear":"fontawesome/solid/gear.svg","fontawesome-solid-gears":"fontawesome/solid/gears.svg","fontawesome-solid-gem":"fontawesome/solid/gem.svg","fontawesome-solid-genderless":"fontawesome/solid/genderless.svg","fontawesome-solid-ghost":"fontawesome/solid/ghost.svg","fontawesome-solid-gift":"fontawesome/solid/gift.svg","fontawesome-solid-gifts":"fontawesome/solid/gifts.svg","fontawesome-solid-glass-water-droplet":"fontawesome/solid/glass-water-droplet.svg","fontawesome-solid-glass-water":"fontawesome/solid/glass-water.svg","fontawesome-solid-glasses":"fontawesome/solid/glasses.svg","fontawesome-solid-globe":"fontawesome/solid/globe.svg","fontawesome-solid-golf-ball-tee":"fontawesome/solid/golf-ball-tee.svg","fontawesome-solid-gopuram":"fontawesome/solid/gopuram.svg","fontawesome-solid-graduation-cap":"fontawesome/solid/graduation-cap.svg","fontawesome-solid-greater-than-equal":"fontawesome/solid/greater-than-equal.svg","fontawesome-solid-greater-than":"fontawesome/solid/greater-than.svg","fontawesome-solid-grip-lines-vertical":"fontawesome/solid/grip-lines-vertical.svg","fontawesome-solid-grip-lines":"fontawesome/solid/grip-lines.svg","fontawesome-solid-grip-vertical":"fontawesome/solid/grip-vertical.svg","fontawesome-solid-grip":"fontawesome/solid/grip.svg","fontawesome-solid-group-arrows-rotate":"fontawesome/solid/group-arrows-rotate.svg","fontawesome-solid-guarani-sign":"fontawesome/solid/guarani-sign.svg","fontawesome-solid-guitar":"fontawesome/solid/guitar.svg","fontawesome-solid-gun":"fontawesome/solid/gun.svg","fontawesome-solid-h":"fontawesome/solid/h.svg","fontawesome-solid-hammer":"fontawesome/solid/hammer.svg","fontawesome-solid-hamsa":"fontawesome/solid/hamsa.svg","fontawesome-solid-hand-back-fist":"fontawesome/solid/hand-back-fist.svg","fontawesome-solid-hand-dots":"fontawesome/solid/hand-dots.svg","fontawesome-solid-hand-fist":"fontawesome/solid/hand-fist.svg","fontawesome-solid-hand-holding-dollar":"fontawesome/solid/hand-holding-dollar.svg","fontawesome-solid-hand-holding-droplet":"fontawesome/solid/hand-holding-droplet.svg","fontawesome-solid-hand-holding-hand":"fontawesome/solid/hand-holding-hand.svg","fontawesome-solid-hand-holding-heart":"fontawesome/solid/hand-holding-heart.svg","fontawesome-solid-hand-holding-medical":"fontawesome/solid/hand-holding-medical.svg","fontawesome-solid-hand-holding":"fontawesome/solid/hand-holding.svg","fontawesome-solid-hand-lizard":"fontawesome/solid/hand-lizard.svg","fontawesome-solid-hand-middle-finger":"fontawesome/solid/hand-middle-finger.svg","fontawesome-solid-hand-peace":"fontawesome/solid/hand-peace.svg","fontawesome-solid-hand-point-down":"fontawesome/solid/hand-point-down.svg","fontawesome-solid-hand-point-left":"fontawesome/solid/hand-point-left.svg","fontawesome-solid-hand-point-right":"fontawesome/solid/hand-point-right.svg","fontawesome-solid-hand-point-up":"fontawesome/solid/hand-point-up.svg","fontawesome-solid-hand-pointer":"fontawesome/solid/hand-pointer.svg","fontawesome-solid-hand-scissors":"fontawesome/solid/hand-scissors.svg","fontawesome-solid-hand-sparkles":"fontawesome/solid/hand-sparkles.svg","fontawesome-solid-hand-spock":"fontawesome/solid/hand-spock.svg","fontawesome-solid-hand":"fontawesome/solid/hand.svg","fontawesome-solid-handcuffs":"fontawesome/solid/handcuffs.svg","fontawesome-solid-hands-asl-interpreting":"fontawesome/solid/hands-asl-interpreting.svg","fontawesome-solid-hands-bound":"fontawesome/solid/hands-bound.svg","fontawesome-solid-hands-bubbles":"fontawesome/solid/hands-bubbles.svg","fontawesome-solid-hands-clapping":"fontawesome/solid/hands-clapping.svg","fontawesome-solid-hands-holding-child":"fontawesome/solid/hands-holding-child.svg","fontawesome-solid-hands-holding-circle":"fontawesome/solid/hands-holding-circle.svg","fontawesome-solid-hands-holding":"fontawesome/solid/hands-holding.svg","fontawesome-solid-hands-praying":"fontawesome/solid/hands-praying.svg","fontawesome-solid-hands":"fontawesome/solid/hands.svg","fontawesome-solid-handshake-angle":"fontawesome/solid/handshake-angle.svg","fontawesome-solid-handshake-simple-slash":"fontawesome/solid/handshake-simple-slash.svg","fontawesome-solid-handshake-simple":"fontawesome/solid/handshake-simple.svg","fontawesome-solid-handshake-slash":"fontawesome/solid/handshake-slash.svg","fontawesome-solid-handshake":"fontawesome/solid/handshake.svg","fontawesome-solid-hanukiah":"fontawesome/solid/hanukiah.svg","fontawesome-solid-hard-drive":"fontawesome/solid/hard-drive.svg","fontawesome-solid-hashtag":"fontawesome/solid/hashtag.svg","fontawesome-solid-hat-cowboy-side":"fontawesome/solid/hat-cowboy-side.svg","fontawesome-solid-hat-cowboy":"fontawesome/solid/hat-cowboy.svg","fontawesome-solid-hat-wizard":"fontawesome/solid/hat-wizard.svg","fontawesome-solid-head-side-cough-slash":"fontawesome/solid/head-side-cough-slash.svg","fontawesome-solid-head-side-cough":"fontawesome/solid/head-side-cough.svg","fontawesome-solid-head-side-mask":"fontawesome/solid/head-side-mask.svg","fontawesome-solid-head-side-virus":"fontawesome/solid/head-side-virus.svg","fontawesome-solid-heading":"fontawesome/solid/heading.svg","fontawesome-solid-headphones-simple":"fontawesome/solid/headphones-simple.svg","fontawesome-solid-headphones":"fontawesome/solid/headphones.svg","fontawesome-solid-headset":"fontawesome/solid/headset.svg","fontawesome-solid-heart-circle-bolt":"fontawesome/solid/heart-circle-bolt.svg","fontawesome-solid-heart-circle-check":"fontawesome/solid/heart-circle-check.svg","fontawesome-solid-heart-circle-exclamation":"fontawesome/solid/heart-circle-exclamation.svg","fontawesome-solid-heart-circle-minus":"fontawesome/solid/heart-circle-minus.svg","fontawesome-solid-heart-circle-plus":"fontawesome/solid/heart-circle-plus.svg","fontawesome-solid-heart-circle-xmark":"fontawesome/solid/heart-circle-xmark.svg","fontawesome-solid-heart-crack":"fontawesome/solid/heart-crack.svg","fontawesome-solid-heart-pulse":"fontawesome/solid/heart-pulse.svg","fontawesome-solid-heart":"fontawesome/solid/heart.svg","fontawesome-solid-helicopter-symbol":"fontawesome/solid/helicopter-symbol.svg","fontawesome-solid-helicopter":"fontawesome/solid/helicopter.svg","fontawesome-solid-helmet-safety":"fontawesome/solid/helmet-safety.svg","fontawesome-solid-helmet-un":"fontawesome/solid/helmet-un.svg","fontawesome-solid-highlighter":"fontawesome/solid/highlighter.svg","fontawesome-solid-hill-avalanche":"fontawesome/solid/hill-avalanche.svg","fontawesome-solid-hill-rockslide":"fontawesome/solid/hill-rockslide.svg","fontawesome-solid-hippo":"fontawesome/solid/hippo.svg","fontawesome-solid-hockey-puck":"fontawesome/solid/hockey-puck.svg","fontawesome-solid-holly-berry":"fontawesome/solid/holly-berry.svg","fontawesome-solid-horse-head":"fontawesome/solid/horse-head.svg","fontawesome-solid-horse":"fontawesome/solid/horse.svg","fontawesome-solid-hospital-user":"fontawesome/solid/hospital-user.svg","fontawesome-solid-hospital":"fontawesome/solid/hospital.svg","fontawesome-solid-hot-tub-person":"fontawesome/solid/hot-tub-person.svg","fontawesome-solid-hotdog":"fontawesome/solid/hotdog.svg","fontawesome-solid-hotel":"fontawesome/solid/hotel.svg","fontawesome-solid-hourglass-end":"fontawesome/solid/hourglass-end.svg","fontawesome-solid-hourglass-half":"fontawesome/solid/hourglass-half.svg","fontawesome-solid-hourglass-start":"fontawesome/solid/hourglass-start.svg","fontawesome-solid-hourglass":"fontawesome/solid/hourglass.svg","fontawesome-solid-house-chimney-crack":"fontawesome/solid/house-chimney-crack.svg","fontawesome-solid-house-chimney-medical":"fontawesome/solid/house-chimney-medical.svg","fontawesome-solid-house-chimney-user":"fontawesome/solid/house-chimney-user.svg","fontawesome-solid-house-chimney-window":"fontawesome/solid/house-chimney-window.svg","fontawesome-solid-house-chimney":"fontawesome/solid/house-chimney.svg","fontawesome-solid-house-circle-check":"fontawesome/solid/house-circle-check.svg","fontawesome-solid-house-circle-exclamation":"fontawesome/solid/house-circle-exclamation.svg","fontawesome-solid-house-circle-xmark":"fontawesome/solid/house-circle-xmark.svg","fontawesome-solid-house-crack":"fontawesome/solid/house-crack.svg","fontawesome-solid-house-fire":"fontawesome/solid/house-fire.svg","fontawesome-solid-house-flag":"fontawesome/solid/house-flag.svg","fontawesome-solid-house-flood-water-circle-arrow-right":"fontawesome/solid/house-flood-water-circle-arrow-right.svg","fontawesome-solid-house-flood-water":"fontawesome/solid/house-flood-water.svg","fontawesome-solid-house-laptop":"fontawesome/solid/house-laptop.svg","fontawesome-solid-house-lock":"fontawesome/solid/house-lock.svg","fontawesome-solid-house-medical-circle-check":"fontawesome/solid/house-medical-circle-check.svg","fontawesome-solid-house-medical-circle-exclamation":"fontawesome/solid/house-medical-circle-exclamation.svg","fontawesome-solid-house-medical-circle-xmark":"fontawesome/solid/house-medical-circle-xmark.svg","fontawesome-solid-house-medical-flag":"fontawesome/solid/house-medical-flag.svg","fontawesome-solid-house-medical":"fontawesome/solid/house-medical.svg","fontawesome-solid-house-signal":"fontawesome/solid/house-signal.svg","fontawesome-solid-house-tsunami":"fontawesome/solid/house-tsunami.svg","fontawesome-solid-house-user":"fontawesome/solid/house-user.svg","fontawesome-solid-house":"fontawesome/solid/house.svg","fontawesome-solid-hryvnia-sign":"fontawesome/solid/hryvnia-sign.svg","fontawesome-solid-hurricane":"fontawesome/solid/hurricane.svg","fontawesome-solid-i-cursor":"fontawesome/solid/i-cursor.svg","fontawesome-solid-i":"fontawesome/solid/i.svg","fontawesome-solid-ice-cream":"fontawesome/solid/ice-cream.svg","fontawesome-solid-icicles":"fontawesome/solid/icicles.svg","fontawesome-solid-icons":"fontawesome/solid/icons.svg","fontawesome-solid-id-badge":"fontawesome/solid/id-badge.svg","fontawesome-solid-id-card-clip":"fontawesome/solid/id-card-clip.svg","fontawesome-solid-id-card":"fontawesome/solid/id-card.svg","fontawesome-solid-igloo":"fontawesome/solid/igloo.svg","fontawesome-solid-image-portrait":"fontawesome/solid/image-portrait.svg","fontawesome-solid-image":"fontawesome/solid/image.svg","fontawesome-solid-images":"fontawesome/solid/images.svg","fontawesome-solid-inbox":"fontawesome/solid/inbox.svg","fontawesome-solid-indent":"fontawesome/solid/indent.svg","fontawesome-solid-indian-rupee-sign":"fontawesome/solid/indian-rupee-sign.svg","fontawesome-solid-industry":"fontawesome/solid/industry.svg","fontawesome-solid-infinity":"fontawesome/solid/infinity.svg","fontawesome-solid-info":"fontawesome/solid/info.svg","fontawesome-solid-italic":"fontawesome/solid/italic.svg","fontawesome-solid-j":"fontawesome/solid/j.svg","fontawesome-solid-jar-wheat":"fontawesome/solid/jar-wheat.svg","fontawesome-solid-jar":"fontawesome/solid/jar.svg","fontawesome-solid-jedi":"fontawesome/solid/jedi.svg","fontawesome-solid-jet-fighter-up":"fontawesome/solid/jet-fighter-up.svg","fontawesome-solid-jet-fighter":"fontawesome/solid/jet-fighter.svg","fontawesome-solid-joint":"fontawesome/solid/joint.svg","fontawesome-solid-jug-detergent":"fontawesome/solid/jug-detergent.svg","fontawesome-solid-k":"fontawesome/solid/k.svg","fontawesome-solid-kaaba":"fontawesome/solid/kaaba.svg","fontawesome-solid-key":"fontawesome/solid/key.svg","fontawesome-solid-keyboard":"fontawesome/solid/keyboard.svg","fontawesome-solid-khanda":"fontawesome/solid/khanda.svg","fontawesome-solid-kip-sign":"fontawesome/solid/kip-sign.svg","fontawesome-solid-kit-medical":"fontawesome/solid/kit-medical.svg","fontawesome-solid-kitchen-set":"fontawesome/solid/kitchen-set.svg","fontawesome-solid-kiwi-bird":"fontawesome/solid/kiwi-bird.svg","fontawesome-solid-l":"fontawesome/solid/l.svg","fontawesome-solid-land-mine-on":"fontawesome/solid/land-mine-on.svg","fontawesome-solid-landmark-dome":"fontawesome/solid/landmark-dome.svg","fontawesome-solid-landmark-flag":"fontawesome/solid/landmark-flag.svg","fontawesome-solid-landmark":"fontawesome/solid/landmark.svg","fontawesome-solid-language":"fontawesome/solid/language.svg","fontawesome-solid-laptop-code":"fontawesome/solid/laptop-code.svg","fontawesome-solid-laptop-file":"fontawesome/solid/laptop-file.svg","fontawesome-solid-laptop-medical":"fontawesome/solid/laptop-medical.svg","fontawesome-solid-laptop":"fontawesome/solid/laptop.svg","fontawesome-solid-lari-sign":"fontawesome/solid/lari-sign.svg","fontawesome-solid-layer-group":"fontawesome/solid/layer-group.svg","fontawesome-solid-leaf":"fontawesome/solid/leaf.svg","fontawesome-solid-left-long":"fontawesome/solid/left-long.svg","fontawesome-solid-left-right":"fontawesome/solid/left-right.svg","fontawesome-solid-lemon":"fontawesome/solid/lemon.svg","fontawesome-solid-less-than-equal":"fontawesome/solid/less-than-equal.svg","fontawesome-solid-less-than":"fontawesome/solid/less-than.svg","fontawesome-solid-life-ring":"fontawesome/solid/life-ring.svg","fontawesome-solid-lightbulb":"fontawesome/solid/lightbulb.svg","fontawesome-solid-lines-leaning":"fontawesome/solid/lines-leaning.svg","fontawesome-solid-link-slash":"fontawesome/solid/link-slash.svg","fontawesome-solid-link":"fontawesome/solid/link.svg","fontawesome-solid-lira-sign":"fontawesome/solid/lira-sign.svg","fontawesome-solid-list-check":"fontawesome/solid/list-check.svg","fontawesome-solid-list-ol":"fontawesome/solid/list-ol.svg","fontawesome-solid-list-ul":"fontawesome/solid/list-ul.svg","fontawesome-solid-list":"fontawesome/solid/list.svg","fontawesome-solid-litecoin-sign":"fontawesome/solid/litecoin-sign.svg","fontawesome-solid-location-arrow":"fontawesome/solid/location-arrow.svg","fontawesome-solid-location-crosshairs":"fontawesome/solid/location-crosshairs.svg","fontawesome-solid-location-dot":"fontawesome/solid/location-dot.svg","fontawesome-solid-location-pin-lock":"fontawesome/solid/location-pin-lock.svg","fontawesome-solid-location-pin":"fontawesome/solid/location-pin.svg","fontawesome-solid-lock-open":"fontawesome/solid/lock-open.svg","fontawesome-solid-lock":"fontawesome/solid/lock.svg","fontawesome-solid-locust":"fontawesome/solid/locust.svg","fontawesome-solid-lungs-virus":"fontawesome/solid/lungs-virus.svg","fontawesome-solid-lungs":"fontawesome/solid/lungs.svg","fontawesome-solid-m":"fontawesome/solid/m.svg","fontawesome-solid-magnet":"fontawesome/solid/magnet.svg","fontawesome-solid-magnifying-glass-arrow-right":"fontawesome/solid/magnifying-glass-arrow-right.svg","fontawesome-solid-magnifying-glass-chart":"fontawesome/solid/magnifying-glass-chart.svg","fontawesome-solid-magnifying-glass-dollar":"fontawesome/solid/magnifying-glass-dollar.svg","fontawesome-solid-magnifying-glass-location":"fontawesome/solid/magnifying-glass-location.svg","fontawesome-solid-magnifying-glass-minus":"fontawesome/solid/magnifying-glass-minus.svg","fontawesome-solid-magnifying-glass-plus":"fontawesome/solid/magnifying-glass-plus.svg","fontawesome-solid-magnifying-glass":"fontawesome/solid/magnifying-glass.svg","fontawesome-solid-manat-sign":"fontawesome/solid/manat-sign.svg","fontawesome-solid-map-location-dot":"fontawesome/solid/map-location-dot.svg","fontawesome-solid-map-location":"fontawesome/solid/map-location.svg","fontawesome-solid-map-pin":"fontawesome/solid/map-pin.svg","fontawesome-solid-map":"fontawesome/solid/map.svg","fontawesome-solid-marker":"fontawesome/solid/marker.svg","fontawesome-solid-mars-and-venus-burst":"fontawesome/solid/mars-and-venus-burst.svg","fontawesome-solid-mars-and-venus":"fontawesome/solid/mars-and-venus.svg","fontawesome-solid-mars-double":"fontawesome/solid/mars-double.svg","fontawesome-solid-mars-stroke-right":"fontawesome/solid/mars-stroke-right.svg","fontawesome-solid-mars-stroke-up":"fontawesome/solid/mars-stroke-up.svg","fontawesome-solid-mars-stroke":"fontawesome/solid/mars-stroke.svg","fontawesome-solid-mars":"fontawesome/solid/mars.svg","fontawesome-solid-martini-glass-citrus":"fontawesome/solid/martini-glass-citrus.svg","fontawesome-solid-martini-glass-empty":"fontawesome/solid/martini-glass-empty.svg","fontawesome-solid-martini-glass":"fontawesome/solid/martini-glass.svg","fontawesome-solid-mask-face":"fontawesome/solid/mask-face.svg","fontawesome-solid-mask-ventilator":"fontawesome/solid/mask-ventilator.svg","fontawesome-solid-mask":"fontawesome/solid/mask.svg","fontawesome-solid-masks-theater":"fontawesome/solid/masks-theater.svg","fontawesome-solid-mattress-pillow":"fontawesome/solid/mattress-pillow.svg","fontawesome-solid-maximize":"fontawesome/solid/maximize.svg","fontawesome-solid-medal":"fontawesome/solid/medal.svg","fontawesome-solid-memory":"fontawesome/solid/memory.svg","fontawesome-solid-menorah":"fontawesome/solid/menorah.svg","fontawesome-solid-mercury":"fontawesome/solid/mercury.svg","fontawesome-solid-message":"fontawesome/solid/message.svg","fontawesome-solid-meteor":"fontawesome/solid/meteor.svg","fontawesome-solid-microchip":"fontawesome/solid/microchip.svg","fontawesome-solid-microphone-lines-slash":"fontawesome/solid/microphone-lines-slash.svg","fontawesome-solid-microphone-lines":"fontawesome/solid/microphone-lines.svg","fontawesome-solid-microphone-slash":"fontawesome/solid/microphone-slash.svg","fontawesome-solid-microphone":"fontawesome/solid/microphone.svg","fontawesome-solid-microscope":"fontawesome/solid/microscope.svg","fontawesome-solid-mill-sign":"fontawesome/solid/mill-sign.svg","fontawesome-solid-minimize":"fontawesome/solid/minimize.svg","fontawesome-solid-minus":"fontawesome/solid/minus.svg","fontawesome-solid-mitten":"fontawesome/solid/mitten.svg","fontawesome-solid-mobile-button":"fontawesome/solid/mobile-button.svg","fontawesome-solid-mobile-retro":"fontawesome/solid/mobile-retro.svg","fontawesome-solid-mobile-screen-button":"fontawesome/solid/mobile-screen-button.svg","fontawesome-solid-mobile-screen":"fontawesome/solid/mobile-screen.svg","fontawesome-solid-mobile":"fontawesome/solid/mobile.svg","fontawesome-solid-money-bill-1-wave":"fontawesome/solid/money-bill-1-wave.svg","fontawesome-solid-money-bill-1":"fontawesome/solid/money-bill-1.svg","fontawesome-solid-money-bill-transfer":"fontawesome/solid/money-bill-transfer.svg","fontawesome-solid-money-bill-trend-up":"fontawesome/solid/money-bill-trend-up.svg","fontawesome-solid-money-bill-wave":"fontawesome/solid/money-bill-wave.svg","fontawesome-solid-money-bill-wheat":"fontawesome/solid/money-bill-wheat.svg","fontawesome-solid-money-bill":"fontawesome/solid/money-bill.svg","fontawesome-solid-money-bills":"fontawesome/solid/money-bills.svg","fontawesome-solid-money-check-dollar":"fontawesome/solid/money-check-dollar.svg","fontawesome-solid-money-check":"fontawesome/solid/money-check.svg","fontawesome-solid-monument":"fontawesome/solid/monument.svg","fontawesome-solid-moon":"fontawesome/solid/moon.svg","fontawesome-solid-mortar-pestle":"fontawesome/solid/mortar-pestle.svg","fontawesome-solid-mosque":"fontawesome/solid/mosque.svg","fontawesome-solid-mosquito-net":"fontawesome/solid/mosquito-net.svg","fontawesome-solid-mosquito":"fontawesome/solid/mosquito.svg","fontawesome-solid-motorcycle":"fontawesome/solid/motorcycle.svg","fontawesome-solid-mound":"fontawesome/solid/mound.svg","fontawesome-solid-mountain-city":"fontawesome/solid/mountain-city.svg","fontawesome-solid-mountain-sun":"fontawesome/solid/mountain-sun.svg","fontawesome-solid-mountain":"fontawesome/solid/mountain.svg","fontawesome-solid-mug-hot":"fontawesome/solid/mug-hot.svg","fontawesome-solid-mug-saucer":"fontawesome/solid/mug-saucer.svg","fontawesome-solid-music":"fontawesome/solid/music.svg","fontawesome-solid-n":"fontawesome/solid/n.svg","fontawesome-solid-naira-sign":"fontawesome/solid/naira-sign.svg","fontawesome-solid-network-wired":"fontawesome/solid/network-wired.svg","fontawesome-solid-neuter":"fontawesome/solid/neuter.svg","fontawesome-solid-newspaper":"fontawesome/solid/newspaper.svg","fontawesome-solid-not-equal":"fontawesome/solid/not-equal.svg","fontawesome-solid-notdef":"fontawesome/solid/notdef.svg","fontawesome-solid-note-sticky":"fontawesome/solid/note-sticky.svg","fontawesome-solid-notes-medical":"fontawesome/solid/notes-medical.svg","fontawesome-solid-o":"fontawesome/solid/o.svg","fontawesome-solid-object-group":"fontawesome/solid/object-group.svg","fontawesome-solid-object-ungroup":"fontawesome/solid/object-ungroup.svg","fontawesome-solid-oil-can":"fontawesome/solid/oil-can.svg","fontawesome-solid-oil-well":"fontawesome/solid/oil-well.svg","fontawesome-solid-om":"fontawesome/solid/om.svg","fontawesome-solid-otter":"fontawesome/solid/otter.svg","fontawesome-solid-outdent":"fontawesome/solid/outdent.svg","fontawesome-solid-p":"fontawesome/solid/p.svg","fontawesome-solid-pager":"fontawesome/solid/pager.svg","fontawesome-solid-paint-roller":"fontawesome/solid/paint-roller.svg","fontawesome-solid-paintbrush":"fontawesome/solid/paintbrush.svg","fontawesome-solid-palette":"fontawesome/solid/palette.svg","fontawesome-solid-pallet":"fontawesome/solid/pallet.svg","fontawesome-solid-panorama":"fontawesome/solid/panorama.svg","fontawesome-solid-paper-plane":"fontawesome/solid/paper-plane.svg","fontawesome-solid-paperclip":"fontawesome/solid/paperclip.svg","fontawesome-solid-parachute-box":"fontawesome/solid/parachute-box.svg","fontawesome-solid-paragraph":"fontawesome/solid/paragraph.svg","fontawesome-solid-passport":"fontawesome/solid/passport.svg","fontawesome-solid-paste":"fontawesome/solid/paste.svg","fontawesome-solid-pause":"fontawesome/solid/pause.svg","fontawesome-solid-paw":"fontawesome/solid/paw.svg","fontawesome-solid-peace":"fontawesome/solid/peace.svg","fontawesome-solid-pen-clip":"fontawesome/solid/pen-clip.svg","fontawesome-solid-pen-fancy":"fontawesome/solid/pen-fancy.svg","fontawesome-solid-pen-nib":"fontawesome/solid/pen-nib.svg","fontawesome-solid-pen-ruler":"fontawesome/solid/pen-ruler.svg","fontawesome-solid-pen-to-square":"fontawesome/solid/pen-to-square.svg","fontawesome-solid-pen":"fontawesome/solid/pen.svg","fontawesome-solid-pencil":"fontawesome/solid/pencil.svg","fontawesome-solid-people-arrows":"fontawesome/solid/people-arrows.svg","fontawesome-solid-people-carry-box":"fontawesome/solid/people-carry-box.svg","fontawesome-solid-people-group":"fontawesome/solid/people-group.svg","fontawesome-solid-people-line":"fontawesome/solid/people-line.svg","fontawesome-solid-people-pulling":"fontawesome/solid/people-pulling.svg","fontawesome-solid-people-robbery":"fontawesome/solid/people-robbery.svg","fontawesome-solid-people-roof":"fontawesome/solid/people-roof.svg","fontawesome-solid-pepper-hot":"fontawesome/solid/pepper-hot.svg","fontawesome-solid-percent":"fontawesome/solid/percent.svg","fontawesome-solid-person-arrow-down-to-line":"fontawesome/solid/person-arrow-down-to-line.svg","fontawesome-solid-person-arrow-up-from-line":"fontawesome/solid/person-arrow-up-from-line.svg","fontawesome-solid-person-biking":"fontawesome/solid/person-biking.svg","fontawesome-solid-person-booth":"fontawesome/solid/person-booth.svg","fontawesome-solid-person-breastfeeding":"fontawesome/solid/person-breastfeeding.svg","fontawesome-solid-person-burst":"fontawesome/solid/person-burst.svg","fontawesome-solid-person-cane":"fontawesome/solid/person-cane.svg","fontawesome-solid-person-chalkboard":"fontawesome/solid/person-chalkboard.svg","fontawesome-solid-person-circle-check":"fontawesome/solid/person-circle-check.svg","fontawesome-solid-person-circle-exclamation":"fontawesome/solid/person-circle-exclamation.svg","fontawesome-solid-person-circle-minus":"fontawesome/solid/person-circle-minus.svg","fontawesome-solid-person-circle-plus":"fontawesome/solid/person-circle-plus.svg","fontawesome-solid-person-circle-question":"fontawesome/solid/person-circle-question.svg","fontawesome-solid-person-circle-xmark":"fontawesome/solid/person-circle-xmark.svg","fontawesome-solid-person-digging":"fontawesome/solid/person-digging.svg","fontawesome-solid-person-dots-from-line":"fontawesome/solid/person-dots-from-line.svg","fontawesome-solid-person-dress-burst":"fontawesome/solid/person-dress-burst.svg","fontawesome-solid-person-dress":"fontawesome/solid/person-dress.svg","fontawesome-solid-person-drowning":"fontawesome/solid/person-drowning.svg","fontawesome-solid-person-falling-burst":"fontawesome/solid/person-falling-burst.svg","fontawesome-solid-person-falling":"fontawesome/solid/person-falling.svg","fontawesome-solid-person-half-dress":"fontawesome/solid/person-half-dress.svg","fontawesome-solid-person-harassing":"fontawesome/solid/person-harassing.svg","fontawesome-solid-person-hiking":"fontawesome/solid/person-hiking.svg","fontawesome-solid-person-military-pointing":"fontawesome/solid/person-military-pointing.svg","fontawesome-solid-person-military-rifle":"fontawesome/solid/person-military-rifle.svg","fontawesome-solid-person-military-to-person":"fontawesome/solid/person-military-to-person.svg","fontawesome-solid-person-praying":"fontawesome/solid/person-praying.svg","fontawesome-solid-person-pregnant":"fontawesome/solid/person-pregnant.svg","fontawesome-solid-person-rays":"fontawesome/solid/person-rays.svg","fontawesome-solid-person-rifle":"fontawesome/solid/person-rifle.svg","fontawesome-solid-person-running":"fontawesome/solid/person-running.svg","fontawesome-solid-person-shelter":"fontawesome/solid/person-shelter.svg","fontawesome-solid-person-skating":"fontawesome/solid/person-skating.svg","fontawesome-solid-person-skiing-nordic":"fontawesome/solid/person-skiing-nordic.svg","fontawesome-solid-person-skiing":"fontawesome/solid/person-skiing.svg","fontawesome-solid-person-snowboarding":"fontawesome/solid/person-snowboarding.svg","fontawesome-solid-person-swimming":"fontawesome/solid/person-swimming.svg","fontawesome-solid-person-through-window":"fontawesome/solid/person-through-window.svg","fontawesome-solid-person-walking-arrow-loop-left":"fontawesome/solid/person-walking-arrow-loop-left.svg","fontawesome-solid-person-walking-arrow-right":"fontawesome/solid/person-walking-arrow-right.svg","fontawesome-solid-person-walking-dashed-line-arrow-right":"fontawesome/solid/person-walking-dashed-line-arrow-right.svg","fontawesome-solid-person-walking-luggage":"fontawesome/solid/person-walking-luggage.svg","fontawesome-solid-person-walking-with-cane":"fontawesome/solid/person-walking-with-cane.svg","fontawesome-solid-person-walking":"fontawesome/solid/person-walking.svg","fontawesome-solid-person":"fontawesome/solid/person.svg","fontawesome-solid-peseta-sign":"fontawesome/solid/peseta-sign.svg","fontawesome-solid-peso-sign":"fontawesome/solid/peso-sign.svg","fontawesome-solid-phone-flip":"fontawesome/solid/phone-flip.svg","fontawesome-solid-phone-slash":"fontawesome/solid/phone-slash.svg","fontawesome-solid-phone-volume":"fontawesome/solid/phone-volume.svg","fontawesome-solid-phone":"fontawesome/solid/phone.svg","fontawesome-solid-photo-film":"fontawesome/solid/photo-film.svg","fontawesome-solid-piggy-bank":"fontawesome/solid/piggy-bank.svg","fontawesome-solid-pills":"fontawesome/solid/pills.svg","fontawesome-solid-pizza-slice":"fontawesome/solid/pizza-slice.svg","fontawesome-solid-place-of-worship":"fontawesome/solid/place-of-worship.svg","fontawesome-solid-plane-arrival":"fontawesome/solid/plane-arrival.svg","fontawesome-solid-plane-circle-check":"fontawesome/solid/plane-circle-check.svg","fontawesome-solid-plane-circle-exclamation":"fontawesome/solid/plane-circle-exclamation.svg","fontawesome-solid-plane-circle-xmark":"fontawesome/solid/plane-circle-xmark.svg","fontawesome-solid-plane-departure":"fontawesome/solid/plane-departure.svg","fontawesome-solid-plane-lock":"fontawesome/solid/plane-lock.svg","fontawesome-solid-plane-slash":"fontawesome/solid/plane-slash.svg","fontawesome-solid-plane-up":"fontawesome/solid/plane-up.svg","fontawesome-solid-plane":"fontawesome/solid/plane.svg","fontawesome-solid-plant-wilt":"fontawesome/solid/plant-wilt.svg","fontawesome-solid-plate-wheat":"fontawesome/solid/plate-wheat.svg","fontawesome-solid-play":"fontawesome/solid/play.svg","fontawesome-solid-plug-circle-bolt":"fontawesome/solid/plug-circle-bolt.svg","fontawesome-solid-plug-circle-check":"fontawesome/solid/plug-circle-check.svg","fontawesome-solid-plug-circle-exclamation":"fontawesome/solid/plug-circle-exclamation.svg","fontawesome-solid-plug-circle-minus":"fontawesome/solid/plug-circle-minus.svg","fontawesome-solid-plug-circle-plus":"fontawesome/solid/plug-circle-plus.svg","fontawesome-solid-plug-circle-xmark":"fontawesome/solid/plug-circle-xmark.svg","fontawesome-solid-plug":"fontawesome/solid/plug.svg","fontawesome-solid-plus-minus":"fontawesome/solid/plus-minus.svg","fontawesome-solid-plus":"fontawesome/solid/plus.svg","fontawesome-solid-podcast":"fontawesome/solid/podcast.svg","fontawesome-solid-poo-storm":"fontawesome/solid/poo-storm.svg","fontawesome-solid-poo":"fontawesome/solid/poo.svg","fontawesome-solid-poop":"fontawesome/solid/poop.svg","fontawesome-solid-power-off":"fontawesome/solid/power-off.svg","fontawesome-solid-prescription-bottle-medical":"fontawesome/solid/prescription-bottle-medical.svg","fontawesome-solid-prescription-bottle":"fontawesome/solid/prescription-bottle.svg","fontawesome-solid-prescription":"fontawesome/solid/prescription.svg","fontawesome-solid-print":"fontawesome/solid/print.svg","fontawesome-solid-pump-medical":"fontawesome/solid/pump-medical.svg","fontawesome-solid-pump-soap":"fontawesome/solid/pump-soap.svg","fontawesome-solid-puzzle-piece":"fontawesome/solid/puzzle-piece.svg","fontawesome-solid-q":"fontawesome/solid/q.svg","fontawesome-solid-qrcode":"fontawesome/solid/qrcode.svg","fontawesome-solid-question":"fontawesome/solid/question.svg","fontawesome-solid-quote-left":"fontawesome/solid/quote-left.svg","fontawesome-solid-quote-right":"fontawesome/solid/quote-right.svg","fontawesome-solid-r":"fontawesome/solid/r.svg","fontawesome-solid-radiation":"fontawesome/solid/radiation.svg","fontawesome-solid-radio":"fontawesome/solid/radio.svg","fontawesome-solid-rainbow":"fontawesome/solid/rainbow.svg","fontawesome-solid-ranking-star":"fontawesome/solid/ranking-star.svg","fontawesome-solid-receipt":"fontawesome/solid/receipt.svg","fontawesome-solid-record-vinyl":"fontawesome/solid/record-vinyl.svg","fontawesome-solid-rectangle-ad":"fontawesome/solid/rectangle-ad.svg","fontawesome-solid-rectangle-list":"fontawesome/solid/rectangle-list.svg","fontawesome-solid-rectangle-xmark":"fontawesome/solid/rectangle-xmark.svg","fontawesome-solid-recycle":"fontawesome/solid/recycle.svg","fontawesome-solid-registered":"fontawesome/solid/registered.svg","fontawesome-solid-repeat":"fontawesome/solid/repeat.svg","fontawesome-solid-reply-all":"fontawesome/solid/reply-all.svg","fontawesome-solid-reply":"fontawesome/solid/reply.svg","fontawesome-solid-republican":"fontawesome/solid/republican.svg","fontawesome-solid-restroom":"fontawesome/solid/restroom.svg","fontawesome-solid-retweet":"fontawesome/solid/retweet.svg","fontawesome-solid-ribbon":"fontawesome/solid/ribbon.svg","fontawesome-solid-right-from-bracket":"fontawesome/solid/right-from-bracket.svg","fontawesome-solid-right-left":"fontawesome/solid/right-left.svg","fontawesome-solid-right-long":"fontawesome/solid/right-long.svg","fontawesome-solid-right-to-bracket":"fontawesome/solid/right-to-bracket.svg","fontawesome-solid-ring":"fontawesome/solid/ring.svg","fontawesome-solid-road-barrier":"fontawesome/solid/road-barrier.svg","fontawesome-solid-road-bridge":"fontawesome/solid/road-bridge.svg","fontawesome-solid-road-circle-check":"fontawesome/solid/road-circle-check.svg","fontawesome-solid-road-circle-exclamation":"fontawesome/solid/road-circle-exclamation.svg","fontawesome-solid-road-circle-xmark":"fontawesome/solid/road-circle-xmark.svg","fontawesome-solid-road-lock":"fontawesome/solid/road-lock.svg","fontawesome-solid-road-spikes":"fontawesome/solid/road-spikes.svg","fontawesome-solid-road":"fontawesome/solid/road.svg","fontawesome-solid-robot":"fontawesome/solid/robot.svg","fontawesome-solid-rocket":"fontawesome/solid/rocket.svg","fontawesome-solid-rotate-left":"fontawesome/solid/rotate-left.svg","fontawesome-solid-rotate-right":"fontawesome/solid/rotate-right.svg","fontawesome-solid-rotate":"fontawesome/solid/rotate.svg","fontawesome-solid-route":"fontawesome/solid/route.svg","fontawesome-solid-rss":"fontawesome/solid/rss.svg","fontawesome-solid-ruble-sign":"fontawesome/solid/ruble-sign.svg","fontawesome-solid-rug":"fontawesome/solid/rug.svg","fontawesome-solid-ruler-combined":"fontawesome/solid/ruler-combined.svg","fontawesome-solid-ruler-horizontal":"fontawesome/solid/ruler-horizontal.svg","fontawesome-solid-ruler-vertical":"fontawesome/solid/ruler-vertical.svg","fontawesome-solid-ruler":"fontawesome/solid/ruler.svg","fontawesome-solid-rupee-sign":"fontawesome/solid/rupee-sign.svg","fontawesome-solid-rupiah-sign":"fontawesome/solid/rupiah-sign.svg","fontawesome-solid-s":"fontawesome/solid/s.svg","fontawesome-solid-sack-dollar":"fontawesome/solid/sack-dollar.svg","fontawesome-solid-sack-xmark":"fontawesome/solid/sack-xmark.svg","fontawesome-solid-sailboat":"fontawesome/solid/sailboat.svg","fontawesome-solid-satellite-dish":"fontawesome/solid/satellite-dish.svg","fontawesome-solid-satellite":"fontawesome/solid/satellite.svg","fontawesome-solid-scale-balanced":"fontawesome/solid/scale-balanced.svg","fontawesome-solid-scale-unbalanced-flip":"fontawesome/solid/scale-unbalanced-flip.svg","fontawesome-solid-scale-unbalanced":"fontawesome/solid/scale-unbalanced.svg","fontawesome-solid-school-circle-check":"fontawesome/solid/school-circle-check.svg","fontawesome-solid-school-circle-exclamation":"fontawesome/solid/school-circle-exclamation.svg","fontawesome-solid-school-circle-xmark":"fontawesome/solid/school-circle-xmark.svg","fontawesome-solid-school-flag":"fontawesome/solid/school-flag.svg","fontawesome-solid-school-lock":"fontawesome/solid/school-lock.svg","fontawesome-solid-school":"fontawesome/solid/school.svg","fontawesome-solid-scissors":"fontawesome/solid/scissors.svg","fontawesome-solid-screwdriver-wrench":"fontawesome/solid/screwdriver-wrench.svg","fontawesome-solid-screwdriver":"fontawesome/solid/screwdriver.svg","fontawesome-solid-scroll-torah":"fontawesome/solid/scroll-torah.svg","fontawesome-solid-scroll":"fontawesome/solid/scroll.svg","fontawesome-solid-sd-card":"fontawesome/solid/sd-card.svg","fontawesome-solid-section":"fontawesome/solid/section.svg","fontawesome-solid-seedling":"fontawesome/solid/seedling.svg","fontawesome-solid-server":"fontawesome/solid/server.svg","fontawesome-solid-shapes":"fontawesome/solid/shapes.svg","fontawesome-solid-share-from-square":"fontawesome/solid/share-from-square.svg","fontawesome-solid-share-nodes":"fontawesome/solid/share-nodes.svg","fontawesome-solid-share":"fontawesome/solid/share.svg","fontawesome-solid-sheet-plastic":"fontawesome/solid/sheet-plastic.svg","fontawesome-solid-shekel-sign":"fontawesome/solid/shekel-sign.svg","fontawesome-solid-shield-cat":"fontawesome/solid/shield-cat.svg","fontawesome-solid-shield-dog":"fontawesome/solid/shield-dog.svg","fontawesome-solid-shield-halved":"fontawesome/solid/shield-halved.svg","fontawesome-solid-shield-heart":"fontawesome/solid/shield-heart.svg","fontawesome-solid-shield-virus":"fontawesome/solid/shield-virus.svg","fontawesome-solid-shield":"fontawesome/solid/shield.svg","fontawesome-solid-ship":"fontawesome/solid/ship.svg","fontawesome-solid-shirt":"fontawesome/solid/shirt.svg","fontawesome-solid-shoe-prints":"fontawesome/solid/shoe-prints.svg","fontawesome-solid-shop-lock":"fontawesome/solid/shop-lock.svg","fontawesome-solid-shop-slash":"fontawesome/solid/shop-slash.svg","fontawesome-solid-shop":"fontawesome/solid/shop.svg","fontawesome-solid-shower":"fontawesome/solid/shower.svg","fontawesome-solid-shrimp":"fontawesome/solid/shrimp.svg","fontawesome-solid-shuffle":"fontawesome/solid/shuffle.svg","fontawesome-solid-shuttle-space":"fontawesome/solid/shuttle-space.svg","fontawesome-solid-sign-hanging":"fontawesome/solid/sign-hanging.svg","fontawesome-solid-signal":"fontawesome/solid/signal.svg","fontawesome-solid-signature":"fontawesome/solid/signature.svg","fontawesome-solid-signs-post":"fontawesome/solid/signs-post.svg","fontawesome-solid-sim-card":"fontawesome/solid/sim-card.svg","fontawesome-solid-sink":"fontawesome/solid/sink.svg","fontawesome-solid-sitemap":"fontawesome/solid/sitemap.svg","fontawesome-solid-skull-crossbones":"fontawesome/solid/skull-crossbones.svg","fontawesome-solid-skull":"fontawesome/solid/skull.svg","fontawesome-solid-slash":"fontawesome/solid/slash.svg","fontawesome-solid-sleigh":"fontawesome/solid/sleigh.svg","fontawesome-solid-sliders":"fontawesome/solid/sliders.svg","fontawesome-solid-smog":"fontawesome/solid/smog.svg","fontawesome-solid-smoking":"fontawesome/solid/smoking.svg","fontawesome-solid-snowflake":"fontawesome/solid/snowflake.svg","fontawesome-solid-snowman":"fontawesome/solid/snowman.svg","fontawesome-solid-snowplow":"fontawesome/solid/snowplow.svg","fontawesome-solid-soap":"fontawesome/solid/soap.svg","fontawesome-solid-socks":"fontawesome/solid/socks.svg","fontawesome-solid-solar-panel":"fontawesome/solid/solar-panel.svg","fontawesome-solid-sort-down":"fontawesome/solid/sort-down.svg","fontawesome-solid-sort-up":"fontawesome/solid/sort-up.svg","fontawesome-solid-sort":"fontawesome/solid/sort.svg","fontawesome-solid-spa":"fontawesome/solid/spa.svg","fontawesome-solid-spaghetti-monster-flying":"fontawesome/solid/spaghetti-monster-flying.svg","fontawesome-solid-spell-check":"fontawesome/solid/spell-check.svg","fontawesome-solid-spider":"fontawesome/solid/spider.svg","fontawesome-solid-spinner":"fontawesome/solid/spinner.svg","fontawesome-solid-splotch":"fontawesome/solid/splotch.svg","fontawesome-solid-spoon":"fontawesome/solid/spoon.svg","fontawesome-solid-spray-can-sparkles":"fontawesome/solid/spray-can-sparkles.svg","fontawesome-solid-spray-can":"fontawesome/solid/spray-can.svg","fontawesome-solid-square-arrow-up-right":"fontawesome/solid/square-arrow-up-right.svg","fontawesome-solid-square-caret-down":"fontawesome/solid/square-caret-down.svg","fontawesome-solid-square-caret-left":"fontawesome/solid/square-caret-left.svg","fontawesome-solid-square-caret-right":"fontawesome/solid/square-caret-right.svg","fontawesome-solid-square-caret-up":"fontawesome/solid/square-caret-up.svg","fontawesome-solid-square-check":"fontawesome/solid/square-check.svg","fontawesome-solid-square-envelope":"fontawesome/solid/square-envelope.svg","fontawesome-solid-square-full":"fontawesome/solid/square-full.svg","fontawesome-solid-square-h":"fontawesome/solid/square-h.svg","fontawesome-solid-square-minus":"fontawesome/solid/square-minus.svg","fontawesome-solid-square-nfi":"fontawesome/solid/square-nfi.svg","fontawesome-solid-square-parking":"fontawesome/solid/square-parking.svg","fontawesome-solid-square-pen":"fontawesome/solid/square-pen.svg","fontawesome-solid-square-person-confined":"fontawesome/solid/square-person-confined.svg","fontawesome-solid-square-phone-flip":"fontawesome/solid/square-phone-flip.svg","fontawesome-solid-square-phone":"fontawesome/solid/square-phone.svg","fontawesome-solid-square-plus":"fontawesome/solid/square-plus.svg","fontawesome-solid-square-poll-horizontal":"fontawesome/solid/square-poll-horizontal.svg","fontawesome-solid-square-poll-vertical":"fontawesome/solid/square-poll-vertical.svg","fontawesome-solid-square-root-variable":"fontawesome/solid/square-root-variable.svg","fontawesome-solid-square-rss":"fontawesome/solid/square-rss.svg","fontawesome-solid-square-share-nodes":"fontawesome/solid/square-share-nodes.svg","fontawesome-solid-square-up-right":"fontawesome/solid/square-up-right.svg","fontawesome-solid-square-virus":"fontawesome/solid/square-virus.svg","fontawesome-solid-square-xmark":"fontawesome/solid/square-xmark.svg","fontawesome-solid-square":"fontawesome/solid/square.svg","fontawesome-solid-staff-snake":"fontawesome/solid/staff-snake.svg","fontawesome-solid-stairs":"fontawesome/solid/stairs.svg","fontawesome-solid-stamp":"fontawesome/solid/stamp.svg","fontawesome-solid-stapler":"fontawesome/solid/stapler.svg","fontawesome-solid-star-and-crescent":"fontawesome/solid/star-and-crescent.svg","fontawesome-solid-star-half-stroke":"fontawesome/solid/star-half-stroke.svg","fontawesome-solid-star-half":"fontawesome/solid/star-half.svg","fontawesome-solid-star-of-david":"fontawesome/solid/star-of-david.svg","fontawesome-solid-star-of-life":"fontawesome/solid/star-of-life.svg","fontawesome-solid-star":"fontawesome/solid/star.svg","fontawesome-solid-sterling-sign":"fontawesome/solid/sterling-sign.svg","fontawesome-solid-stethoscope":"fontawesome/solid/stethoscope.svg","fontawesome-solid-stop":"fontawesome/solid/stop.svg","fontawesome-solid-stopwatch-20":"fontawesome/solid/stopwatch-20.svg","fontawesome-solid-stopwatch":"fontawesome/solid/stopwatch.svg","fontawesome-solid-store-slash":"fontawesome/solid/store-slash.svg","fontawesome-solid-store":"fontawesome/solid/store.svg","fontawesome-solid-street-view":"fontawesome/solid/street-view.svg","fontawesome-solid-strikethrough":"fontawesome/solid/strikethrough.svg","fontawesome-solid-stroopwafel":"fontawesome/solid/stroopwafel.svg","fontawesome-solid-subscript":"fontawesome/solid/subscript.svg","fontawesome-solid-suitcase-medical":"fontawesome/solid/suitcase-medical.svg","fontawesome-solid-suitcase-rolling":"fontawesome/solid/suitcase-rolling.svg","fontawesome-solid-suitcase":"fontawesome/solid/suitcase.svg","fontawesome-solid-sun-plant-wilt":"fontawesome/solid/sun-plant-wilt.svg","fontawesome-solid-sun":"fontawesome/solid/sun.svg","fontawesome-solid-superscript":"fontawesome/solid/superscript.svg","fontawesome-solid-swatchbook":"fontawesome/solid/swatchbook.svg","fontawesome-solid-synagogue":"fontawesome/solid/synagogue.svg","fontawesome-solid-syringe":"fontawesome/solid/syringe.svg","fontawesome-solid-t":"fontawesome/solid/t.svg","fontawesome-solid-table-cells-large":"fontawesome/solid/table-cells-large.svg","fontawesome-solid-table-cells":"fontawesome/solid/table-cells.svg","fontawesome-solid-table-columns":"fontawesome/solid/table-columns.svg","fontawesome-solid-table-list":"fontawesome/solid/table-list.svg","fontawesome-solid-table-tennis-paddle-ball":"fontawesome/solid/table-tennis-paddle-ball.svg","fontawesome-solid-table":"fontawesome/solid/table.svg","fontawesome-solid-tablet-button":"fontawesome/solid/tablet-button.svg","fontawesome-solid-tablet-screen-button":"fontawesome/solid/tablet-screen-button.svg","fontawesome-solid-tablet":"fontawesome/solid/tablet.svg","fontawesome-solid-tablets":"fontawesome/solid/tablets.svg","fontawesome-solid-tachograph-digital":"fontawesome/solid/tachograph-digital.svg","fontawesome-solid-tag":"fontawesome/solid/tag.svg","fontawesome-solid-tags":"fontawesome/solid/tags.svg","fontawesome-solid-tape":"fontawesome/solid/tape.svg","fontawesome-solid-tarp-droplet":"fontawesome/solid/tarp-droplet.svg","fontawesome-solid-tarp":"fontawesome/solid/tarp.svg","fontawesome-solid-taxi":"fontawesome/solid/taxi.svg","fontawesome-solid-teeth-open":"fontawesome/solid/teeth-open.svg","fontawesome-solid-teeth":"fontawesome/solid/teeth.svg","fontawesome-solid-temperature-arrow-down":"fontawesome/solid/temperature-arrow-down.svg","fontawesome-solid-temperature-arrow-up":"fontawesome/solid/temperature-arrow-up.svg","fontawesome-solid-temperature-empty":"fontawesome/solid/temperature-empty.svg","fontawesome-solid-temperature-full":"fontawesome/solid/temperature-full.svg","fontawesome-solid-temperature-half":"fontawesome/solid/temperature-half.svg","fontawesome-solid-temperature-high":"fontawesome/solid/temperature-high.svg","fontawesome-solid-temperature-low":"fontawesome/solid/temperature-low.svg","fontawesome-solid-temperature-quarter":"fontawesome/solid/temperature-quarter.svg","fontawesome-solid-temperature-three-quarters":"fontawesome/solid/temperature-three-quarters.svg","fontawesome-solid-tenge-sign":"fontawesome/solid/tenge-sign.svg","fontawesome-solid-tent-arrow-down-to-line":"fontawesome/solid/tent-arrow-down-to-line.svg","fontawesome-solid-tent-arrow-left-right":"fontawesome/solid/tent-arrow-left-right.svg","fontawesome-solid-tent-arrow-turn-left":"fontawesome/solid/tent-arrow-turn-left.svg","fontawesome-solid-tent-arrows-down":"fontawesome/solid/tent-arrows-down.svg","fontawesome-solid-tent":"fontawesome/solid/tent.svg","fontawesome-solid-tents":"fontawesome/solid/tents.svg","fontawesome-solid-terminal":"fontawesome/solid/terminal.svg","fontawesome-solid-text-height":"fontawesome/solid/text-height.svg","fontawesome-solid-text-slash":"fontawesome/solid/text-slash.svg","fontawesome-solid-text-width":"fontawesome/solid/text-width.svg","fontawesome-solid-thermometer":"fontawesome/solid/thermometer.svg","fontawesome-solid-thumbs-down":"fontawesome/solid/thumbs-down.svg","fontawesome-solid-thumbs-up":"fontawesome/solid/thumbs-up.svg","fontawesome-solid-thumbtack":"fontawesome/solid/thumbtack.svg","fontawesome-solid-ticket-simple":"fontawesome/solid/ticket-simple.svg","fontawesome-solid-ticket":"fontawesome/solid/ticket.svg","fontawesome-solid-timeline":"fontawesome/solid/timeline.svg","fontawesome-solid-toggle-off":"fontawesome/solid/toggle-off.svg","fontawesome-solid-toggle-on":"fontawesome/solid/toggle-on.svg","fontawesome-solid-toilet-paper-slash":"fontawesome/solid/toilet-paper-slash.svg","fontawesome-solid-toilet-paper":"fontawesome/solid/toilet-paper.svg","fontawesome-solid-toilet-portable":"fontawesome/solid/toilet-portable.svg","fontawesome-solid-toilet":"fontawesome/solid/toilet.svg","fontawesome-solid-toilets-portable":"fontawesome/solid/toilets-portable.svg","fontawesome-solid-toolbox":"fontawesome/solid/toolbox.svg","fontawesome-solid-tooth":"fontawesome/solid/tooth.svg","fontawesome-solid-torii-gate":"fontawesome/solid/torii-gate.svg","fontawesome-solid-tornado":"fontawesome/solid/tornado.svg","fontawesome-solid-tower-broadcast":"fontawesome/solid/tower-broadcast.svg","fontawesome-solid-tower-cell":"fontawesome/solid/tower-cell.svg","fontawesome-solid-tower-observation":"fontawesome/solid/tower-observation.svg","fontawesome-solid-tractor":"fontawesome/solid/tractor.svg","fontawesome-solid-trademark":"fontawesome/solid/trademark.svg","fontawesome-solid-traffic-light":"fontawesome/solid/traffic-light.svg","fontawesome-solid-trailer":"fontawesome/solid/trailer.svg","fontawesome-solid-train-subway":"fontawesome/solid/train-subway.svg","fontawesome-solid-train-tram":"fontawesome/solid/train-tram.svg","fontawesome-solid-train":"fontawesome/solid/train.svg","fontawesome-solid-transgender":"fontawesome/solid/transgender.svg","fontawesome-solid-trash-arrow-up":"fontawesome/solid/trash-arrow-up.svg","fontawesome-solid-trash-can-arrow-up":"fontawesome/solid/trash-can-arrow-up.svg","fontawesome-solid-trash-can":"fontawesome/solid/trash-can.svg","fontawesome-solid-trash":"fontawesome/solid/trash.svg","fontawesome-solid-tree-city":"fontawesome/solid/tree-city.svg","fontawesome-solid-tree":"fontawesome/solid/tree.svg","fontawesome-solid-triangle-exclamation":"fontawesome/solid/triangle-exclamation.svg","fontawesome-solid-trophy":"fontawesome/solid/trophy.svg","fontawesome-solid-trowel-bricks":"fontawesome/solid/trowel-bricks.svg","fontawesome-solid-trowel":"fontawesome/solid/trowel.svg","fontawesome-solid-truck-arrow-right":"fontawesome/solid/truck-arrow-right.svg","fontawesome-solid-truck-droplet":"fontawesome/solid/truck-droplet.svg","fontawesome-solid-truck-fast":"fontawesome/solid/truck-fast.svg","fontawesome-solid-truck-field-un":"fontawesome/solid/truck-field-un.svg","fontawesome-solid-truck-field":"fontawesome/solid/truck-field.svg","fontawesome-solid-truck-front":"fontawesome/solid/truck-front.svg","fontawesome-solid-truck-medical":"fontawesome/solid/truck-medical.svg","fontawesome-solid-truck-monster":"fontawesome/solid/truck-monster.svg","fontawesome-solid-truck-moving":"fontawesome/solid/truck-moving.svg","fontawesome-solid-truck-pickup":"fontawesome/solid/truck-pickup.svg","fontawesome-solid-truck-plane":"fontawesome/solid/truck-plane.svg","fontawesome-solid-truck-ramp-box":"fontawesome/solid/truck-ramp-box.svg","fontawesome-solid-truck":"fontawesome/solid/truck.svg","fontawesome-solid-tty":"fontawesome/solid/tty.svg","fontawesome-solid-turkish-lira-sign":"fontawesome/solid/turkish-lira-sign.svg","fontawesome-solid-turn-down":"fontawesome/solid/turn-down.svg","fontawesome-solid-turn-up":"fontawesome/solid/turn-up.svg","fontawesome-solid-tv":"fontawesome/solid/tv.svg","fontawesome-solid-u":"fontawesome/solid/u.svg","fontawesome-solid-umbrella-beach":"fontawesome/solid/umbrella-beach.svg","fontawesome-solid-umbrella":"fontawesome/solid/umbrella.svg","fontawesome-solid-underline":"fontawesome/solid/underline.svg","fontawesome-solid-universal-access":"fontawesome/solid/universal-access.svg","fontawesome-solid-unlock-keyhole":"fontawesome/solid/unlock-keyhole.svg","fontawesome-solid-unlock":"fontawesome/solid/unlock.svg","fontawesome-solid-up-down-left-right":"fontawesome/solid/up-down-left-right.svg","fontawesome-solid-up-down":"fontawesome/solid/up-down.svg","fontawesome-solid-up-long":"fontawesome/solid/up-long.svg","fontawesome-solid-up-right-and-down-left-from-center":"fontawesome/solid/up-right-and-down-left-from-center.svg","fontawesome-solid-up-right-from-square":"fontawesome/solid/up-right-from-square.svg","fontawesome-solid-upload":"fontawesome/solid/upload.svg","fontawesome-solid-user-astronaut":"fontawesome/solid/user-astronaut.svg","fontawesome-solid-user-check":"fontawesome/solid/user-check.svg","fontawesome-solid-user-clock":"fontawesome/solid/user-clock.svg","fontawesome-solid-user-doctor":"fontawesome/solid/user-doctor.svg","fontawesome-solid-user-gear":"fontawesome/solid/user-gear.svg","fontawesome-solid-user-graduate":"fontawesome/solid/user-graduate.svg","fontawesome-solid-user-group":"fontawesome/solid/user-group.svg","fontawesome-solid-user-injured":"fontawesome/solid/user-injured.svg","fontawesome-solid-user-large-slash":"fontawesome/solid/user-large-slash.svg","fontawesome-solid-user-large":"fontawesome/solid/user-large.svg","fontawesome-solid-user-lock":"fontawesome/solid/user-lock.svg","fontawesome-solid-user-minus":"fontawesome/solid/user-minus.svg","fontawesome-solid-user-ninja":"fontawesome/solid/user-ninja.svg","fontawesome-solid-user-nurse":"fontawesome/solid/user-nurse.svg","fontawesome-solid-user-pen":"fontawesome/solid/user-pen.svg","fontawesome-solid-user-plus":"fontawesome/solid/user-plus.svg","fontawesome-solid-user-secret":"fontawesome/solid/user-secret.svg","fontawesome-solid-user-shield":"fontawesome/solid/user-shield.svg","fontawesome-solid-user-slash":"fontawesome/solid/user-slash.svg","fontawesome-solid-user-tag":"fontawesome/solid/user-tag.svg","fontawesome-solid-user-tie":"fontawesome/solid/user-tie.svg","fontawesome-solid-user-xmark":"fontawesome/solid/user-xmark.svg","fontawesome-solid-user":"fontawesome/solid/user.svg","fontawesome-solid-users-between-lines":"fontawesome/solid/users-between-lines.svg","fontawesome-solid-users-gear":"fontawesome/solid/users-gear.svg","fontawesome-solid-users-line":"fontawesome/solid/users-line.svg","fontawesome-solid-users-rays":"fontawesome/solid/users-rays.svg","fontawesome-solid-users-rectangle":"fontawesome/solid/users-rectangle.svg","fontawesome-solid-users-slash":"fontawesome/solid/users-slash.svg","fontawesome-solid-users-viewfinder":"fontawesome/solid/users-viewfinder.svg","fontawesome-solid-users":"fontawesome/solid/users.svg","fontawesome-solid-utensils":"fontawesome/solid/utensils.svg","fontawesome-solid-v":"fontawesome/solid/v.svg","fontawesome-solid-van-shuttle":"fontawesome/solid/van-shuttle.svg","fontawesome-solid-vault":"fontawesome/solid/vault.svg","fontawesome-solid-vector-square":"fontawesome/solid/vector-square.svg","fontawesome-solid-venus-double":"fontawesome/solid/venus-double.svg","fontawesome-solid-venus-mars":"fontawesome/solid/venus-mars.svg","fontawesome-solid-venus":"fontawesome/solid/venus.svg","fontawesome-solid-vest-patches":"fontawesome/solid/vest-patches.svg","fontawesome-solid-vest":"fontawesome/solid/vest.svg","fontawesome-solid-vial-circle-check":"fontawesome/solid/vial-circle-check.svg","fontawesome-solid-vial-virus":"fontawesome/solid/vial-virus.svg","fontawesome-solid-vial":"fontawesome/solid/vial.svg","fontawesome-solid-vials":"fontawesome/solid/vials.svg","fontawesome-solid-video-slash":"fontawesome/solid/video-slash.svg","fontawesome-solid-video":"fontawesome/solid/video.svg","fontawesome-solid-vihara":"fontawesome/solid/vihara.svg","fontawesome-solid-virus-covid-slash":"fontawesome/solid/virus-covid-slash.svg","fontawesome-solid-virus-covid":"fontawesome/solid/virus-covid.svg","fontawesome-solid-virus-slash":"fontawesome/solid/virus-slash.svg","fontawesome-solid-virus":"fontawesome/solid/virus.svg","fontawesome-solid-viruses":"fontawesome/solid/viruses.svg","fontawesome-solid-voicemail":"fontawesome/solid/voicemail.svg","fontawesome-solid-volcano":"fontawesome/solid/volcano.svg","fontawesome-solid-volleyball":"fontawesome/solid/volleyball.svg","fontawesome-solid-volume-high":"fontawesome/solid/volume-high.svg","fontawesome-solid-volume-low":"fontawesome/solid/volume-low.svg","fontawesome-solid-volume-off":"fontawesome/solid/volume-off.svg","fontawesome-solid-volume-xmark":"fontawesome/solid/volume-xmark.svg","fontawesome-solid-vr-cardboard":"fontawesome/solid/vr-cardboard.svg","fontawesome-solid-w":"fontawesome/solid/w.svg","fontawesome-solid-walkie-talkie":"fontawesome/solid/walkie-talkie.svg","fontawesome-solid-wallet":"fontawesome/solid/wallet.svg","fontawesome-solid-wand-magic-sparkles":"fontawesome/solid/wand-magic-sparkles.svg","fontawesome-solid-wand-magic":"fontawesome/solid/wand-magic.svg","fontawesome-solid-wand-sparkles":"fontawesome/solid/wand-sparkles.svg","fontawesome-solid-warehouse":"fontawesome/solid/warehouse.svg","fontawesome-solid-water-ladder":"fontawesome/solid/water-ladder.svg","fontawesome-solid-water":"fontawesome/solid/water.svg","fontawesome-solid-wave-square":"fontawesome/solid/wave-square.svg","fontawesome-solid-weight-hanging":"fontawesome/solid/weight-hanging.svg","fontawesome-solid-weight-scale":"fontawesome/solid/weight-scale.svg","fontawesome-solid-wheat-awn-circle-exclamation":"fontawesome/solid/wheat-awn-circle-exclamation.svg","fontawesome-solid-wheat-awn":"fontawesome/solid/wheat-awn.svg","fontawesome-solid-wheelchair-move":"fontawesome/solid/wheelchair-move.svg","fontawesome-solid-wheelchair":"fontawesome/solid/wheelchair.svg","fontawesome-solid-whiskey-glass":"fontawesome/solid/whiskey-glass.svg","fontawesome-solid-wifi":"fontawesome/solid/wifi.svg","fontawesome-solid-wind":"fontawesome/solid/wind.svg","fontawesome-solid-window-maximize":"fontawesome/solid/window-maximize.svg","fontawesome-solid-window-minimize":"fontawesome/solid/window-minimize.svg","fontawesome-solid-window-restore":"fontawesome/solid/window-restore.svg","fontawesome-solid-wine-bottle":"fontawesome/solid/wine-bottle.svg","fontawesome-solid-wine-glass-empty":"fontawesome/solid/wine-glass-empty.svg","fontawesome-solid-wine-glass":"fontawesome/solid/wine-glass.svg","fontawesome-solid-won-sign":"fontawesome/solid/won-sign.svg","fontawesome-solid-worm":"fontawesome/solid/worm.svg","fontawesome-solid-wrench":"fontawesome/solid/wrench.svg","fontawesome-solid-x-ray":"fontawesome/solid/x-ray.svg","fontawesome-solid-x":"fontawesome/solid/x.svg","fontawesome-solid-xmark":"fontawesome/solid/xmark.svg","fontawesome-solid-xmarks-lines":"fontawesome/solid/xmarks-lines.svg","fontawesome-solid-y":"fontawesome/solid/y.svg","fontawesome-solid-yen-sign":"fontawesome/solid/yen-sign.svg","fontawesome-solid-yin-yang":"fontawesome/solid/yin-yang.svg","fontawesome-solid-z":"fontawesome/solid/z.svg","logo":"logo.svg","material-ab-testing":"material/ab-testing.svg","material-abacus":"material/abacus.svg","material-abjad-arabic":"material/abjad-arabic.svg","material-abjad-hebrew":"material/abjad-hebrew.svg","material-abugida-devanagari":"material/abugida-devanagari.svg","material-abugida-thai":"material/abugida-thai.svg","material-access-point-check":"material/access-point-check.svg","material-access-point-minus":"material/access-point-minus.svg","material-access-point-network-off":"material/access-point-network-off.svg","material-access-point-network":"material/access-point-network.svg","material-access-point-off":"material/access-point-off.svg","material-access-point-plus":"material/access-point-plus.svg","material-access-point-remove":"material/access-point-remove.svg","material-access-point":"material/access-point.svg","material-account-alert-outline":"material/account-alert-outline.svg","material-account-alert":"material/account-alert.svg","material-account-arrow-down-outline":"material/account-arrow-down-outline.svg","material-account-arrow-down":"material/account-arrow-down.svg","material-account-arrow-left-outline":"material/account-arrow-left-outline.svg","material-account-arrow-left":"material/account-arrow-left.svg","material-account-arrow-right-outline":"material/account-arrow-right-outline.svg","material-account-arrow-right":"material/account-arrow-right.svg","material-account-arrow-up-outline":"material/account-arrow-up-outline.svg","material-account-arrow-up":"material/account-arrow-up.svg","material-account-badge-outline":"material/account-badge-outline.svg","material-account-badge":"material/account-badge.svg","material-account-box-multiple-outline":"material/account-box-multiple-outline.svg","material-account-box-multiple":"material/account-box-multiple.svg","material-account-box-outline":"material/account-box-outline.svg","material-account-box":"material/account-box.svg","material-account-cancel-outline":"material/account-cancel-outline.svg","material-account-cancel":"material/account-cancel.svg","material-account-card-outline":"material/account-card-outline.svg","material-account-card":"material/account-card.svg","material-account-cash-outline":"material/account-cash-outline.svg","material-account-cash":"material/account-cash.svg","material-account-check-outline":"material/account-check-outline.svg","material-account-check":"material/account-check.svg","material-account-child-circle":"material/account-child-circle.svg","material-account-child-outline":"material/account-child-outline.svg","material-account-child":"material/account-child.svg","material-account-circle-outline":"material/account-circle-outline.svg","material-account-circle":"material/account-circle.svg","material-account-clock-outline":"material/account-clock-outline.svg","material-account-clock":"material/account-clock.svg","material-account-cog-outline":"material/account-cog-outline.svg","material-account-cog":"material/account-cog.svg","material-account-convert-outline":"material/account-convert-outline.svg","material-account-convert":"material/account-convert.svg","material-account-cowboy-hat-outline":"material/account-cowboy-hat-outline.svg","material-account-cowboy-hat":"material/account-cowboy-hat.svg","material-account-credit-card-outline":"material/account-credit-card-outline.svg","material-account-credit-card":"material/account-credit-card.svg","material-account-details-outline":"material/account-details-outline.svg","material-account-details":"material/account-details.svg","material-account-edit-outline":"material/account-edit-outline.svg","material-account-edit":"material/account-edit.svg","material-account-eye-outline":"material/account-eye-outline.svg","material-account-eye":"material/account-eye.svg","material-account-filter-outline":"material/account-filter-outline.svg","material-account-filter":"material/account-filter.svg","material-account-group-outline":"material/account-group-outline.svg","material-account-group":"material/account-group.svg","material-account-hard-hat-outline":"material/account-hard-hat-outline.svg","material-account-hard-hat":"material/account-hard-hat.svg","material-account-heart-outline":"material/account-heart-outline.svg","material-account-heart":"material/account-heart.svg","material-account-injury-outline":"material/account-injury-outline.svg","material-account-injury":"material/account-injury.svg","material-account-key-outline":"material/account-key-outline.svg","material-account-key":"material/account-key.svg","material-account-lock-open-outline":"material/account-lock-open-outline.svg","material-account-lock-open":"material/account-lock-open.svg","material-account-lock-outline":"material/account-lock-outline.svg","material-account-lock":"material/account-lock.svg","material-account-minus-outline":"material/account-minus-outline.svg","material-account-minus":"material/account-minus.svg","material-account-multiple-check-outline":"material/account-multiple-check-outline.svg","material-account-multiple-check":"material/account-multiple-check.svg","material-account-multiple-minus-outline":"material/account-multiple-minus-outline.svg","material-account-multiple-minus":"material/account-multiple-minus.svg","material-account-multiple-outline":"material/account-multiple-outline.svg","material-account-multiple-plus-outline":"material/account-multiple-plus-outline.svg","material-account-multiple-plus":"material/account-multiple-plus.svg","material-account-multiple-remove-outline":"material/account-multiple-remove-outline.svg","material-account-multiple-remove":"material/account-multiple-remove.svg","material-account-multiple":"material/account-multiple.svg","material-account-music-outline":"material/account-music-outline.svg","material-account-music":"material/account-music.svg","material-account-network-off-outline":"material/account-network-off-outline.svg","material-account-network-off":"material/account-network-off.svg","material-account-network-outline":"material/account-network-outline.svg","material-account-network":"material/account-network.svg","material-account-off-outline":"material/account-off-outline.svg","material-account-off":"material/account-off.svg","material-account-outline":"material/account-outline.svg","material-account-plus-outline":"material/account-plus-outline.svg","material-account-plus":"material/account-plus.svg","material-account-question-outline":"material/account-question-outline.svg","material-account-question":"material/account-question.svg","material-account-reactivate-outline":"material/account-reactivate-outline.svg","material-account-reactivate":"material/account-reactivate.svg","material-account-remove-outline":"material/account-remove-outline.svg","material-account-remove":"material/account-remove.svg","material-account-school-outline":"material/account-school-outline.svg","material-account-school":"material/account-school.svg","material-account-search-outline":"material/account-search-outline.svg","material-account-search":"material/account-search.svg","material-account-settings-outline":"material/account-settings-outline.svg","material-account-settings":"material/account-settings.svg","material-account-star-outline":"material/account-star-outline.svg","material-account-star":"material/account-star.svg","material-account-supervisor-circle-outline":"material/account-supervisor-circle-outline.svg","material-account-supervisor-circle":"material/account-supervisor-circle.svg","material-account-supervisor-outline":"material/account-supervisor-outline.svg","material-account-supervisor":"material/account-supervisor.svg","material-account-switch-outline":"material/account-switch-outline.svg","material-account-switch":"material/account-switch.svg","material-account-sync-outline":"material/account-sync-outline.svg","material-account-sync":"material/account-sync.svg","material-account-tie-hat-outline":"material/account-tie-hat-outline.svg","material-account-tie-hat":"material/account-tie-hat.svg","material-account-tie-outline":"material/account-tie-outline.svg","material-account-tie-voice-off-outline":"material/account-tie-voice-off-outline.svg","material-account-tie-voice-off":"material/account-tie-voice-off.svg","material-account-tie-voice-outline":"material/account-tie-voice-outline.svg","material-account-tie-voice":"material/account-tie-voice.svg","material-account-tie-woman":"material/account-tie-woman.svg","material-account-tie":"material/account-tie.svg","material-account-voice-off":"material/account-voice-off.svg","material-account-voice":"material/account-voice.svg","material-account-wrench-outline":"material/account-wrench-outline.svg","material-account-wrench":"material/account-wrench.svg","material-account":"material/account.svg","material-adjust":"material/adjust.svg","material-advertisements-off":"material/advertisements-off.svg","material-advertisements":"material/advertisements.svg","material-air-conditioner":"material/air-conditioner.svg","material-air-filter":"material/air-filter.svg","material-air-horn":"material/air-horn.svg","material-air-humidifier-off":"material/air-humidifier-off.svg","material-air-humidifier":"material/air-humidifier.svg","material-air-purifier-off":"material/air-purifier-off.svg","material-air-purifier":"material/air-purifier.svg","material-airbag":"material/airbag.svg","material-airballoon-outline":"material/airballoon-outline.svg","material-airballoon":"material/airballoon.svg","material-airplane-alert":"material/airplane-alert.svg","material-airplane-check":"material/airplane-check.svg","material-airplane-clock":"material/airplane-clock.svg","material-airplane-cog":"material/airplane-cog.svg","material-airplane-edit":"material/airplane-edit.svg","material-airplane-landing":"material/airplane-landing.svg","material-airplane-marker":"material/airplane-marker.svg","material-airplane-minus":"material/airplane-minus.svg","material-airplane-off":"material/airplane-off.svg","material-airplane-plus":"material/airplane-plus.svg","material-airplane-remove":"material/airplane-remove.svg","material-airplane-search":"material/airplane-search.svg","material-airplane-settings":"material/airplane-settings.svg","material-airplane-takeoff":"material/airplane-takeoff.svg","material-airplane":"material/airplane.svg","material-airport":"material/airport.svg","material-alarm-bell":"material/alarm-bell.svg","material-alarm-check":"material/alarm-check.svg","material-alarm-light-off-outline":"material/alarm-light-off-outline.svg","material-alarm-light-off":"material/alarm-light-off.svg","material-alarm-light-outline":"material/alarm-light-outline.svg","material-alarm-light":"material/alarm-light.svg","material-alarm-multiple":"material/alarm-multiple.svg","material-alarm-note-off":"material/alarm-note-off.svg","material-alarm-note":"material/alarm-note.svg","material-alarm-off":"material/alarm-off.svg","material-alarm-panel-outline":"material/alarm-panel-outline.svg","material-alarm-panel":"material/alarm-panel.svg","material-alarm-plus":"material/alarm-plus.svg","material-alarm-snooze":"material/alarm-snooze.svg","material-alarm":"material/alarm.svg","material-album":"material/album.svg","material-alert-box-outline":"material/alert-box-outline.svg","material-alert-box":"material/alert-box.svg","material-alert-circle-check-outline":"material/alert-circle-check-outline.svg","material-alert-circle-check":"material/alert-circle-check.svg","material-alert-circle-outline":"material/alert-circle-outline.svg","material-alert-circle":"material/alert-circle.svg","material-alert-decagram-outline":"material/alert-decagram-outline.svg","material-alert-decagram":"material/alert-decagram.svg","material-alert-minus-outline":"material/alert-minus-outline.svg","material-alert-minus":"material/alert-minus.svg","material-alert-octagon-outline":"material/alert-octagon-outline.svg","material-alert-octagon":"material/alert-octagon.svg","material-alert-octagram-outline":"material/alert-octagram-outline.svg","material-alert-octagram":"material/alert-octagram.svg","material-alert-outline":"material/alert-outline.svg","material-alert-plus-outline":"material/alert-plus-outline.svg","material-alert-plus":"material/alert-plus.svg","material-alert-remove-outline":"material/alert-remove-outline.svg","material-alert-remove":"material/alert-remove.svg","material-alert-rhombus-outline":"material/alert-rhombus-outline.svg","material-alert-rhombus":"material/alert-rhombus.svg","material-alert":"material/alert.svg","material-alien-outline":"material/alien-outline.svg","material-alien":"material/alien.svg","material-align-horizontal-center":"material/align-horizontal-center.svg","material-align-horizontal-distribute":"material/align-horizontal-distribute.svg","material-align-horizontal-left":"material/align-horizontal-left.svg","material-align-horizontal-right":"material/align-horizontal-right.svg","material-align-vertical-bottom":"material/align-vertical-bottom.svg","material-align-vertical-center":"material/align-vertical-center.svg","material-align-vertical-distribute":"material/align-vertical-distribute.svg","material-align-vertical-top":"material/align-vertical-top.svg","material-all-inclusive-box-outline":"material/all-inclusive-box-outline.svg","material-all-inclusive-box":"material/all-inclusive-box.svg","material-all-inclusive":"material/all-inclusive.svg","material-allergy":"material/allergy.svg","material-alpha-a-box-outline":"material/alpha-a-box-outline.svg","material-alpha-a-box":"material/alpha-a-box.svg","material-alpha-a-circle-outline":"material/alpha-a-circle-outline.svg","material-alpha-a-circle":"material/alpha-a-circle.svg","material-alpha-a":"material/alpha-a.svg","material-alpha-b-box-outline":"material/alpha-b-box-outline.svg","material-alpha-b-box":"material/alpha-b-box.svg","material-alpha-b-circle-outline":"material/alpha-b-circle-outline.svg","material-alpha-b-circle":"material/alpha-b-circle.svg","material-alpha-b":"material/alpha-b.svg","material-alpha-c-box-outline":"material/alpha-c-box-outline.svg","material-alpha-c-box":"material/alpha-c-box.svg","material-alpha-c-circle-outline":"material/alpha-c-circle-outline.svg","material-alpha-c-circle":"material/alpha-c-circle.svg","material-alpha-c":"material/alpha-c.svg","material-alpha-d-box-outline":"material/alpha-d-box-outline.svg","material-alpha-d-box":"material/alpha-d-box.svg","material-alpha-d-circle-outline":"material/alpha-d-circle-outline.svg","material-alpha-d-circle":"material/alpha-d-circle.svg","material-alpha-d":"material/alpha-d.svg","material-alpha-e-box-outline":"material/alpha-e-box-outline.svg","material-alpha-e-box":"material/alpha-e-box.svg","material-alpha-e-circle-outline":"material/alpha-e-circle-outline.svg","material-alpha-e-circle":"material/alpha-e-circle.svg","material-alpha-e":"material/alpha-e.svg","material-alpha-f-box-outline":"material/alpha-f-box-outline.svg","material-alpha-f-box":"material/alpha-f-box.svg","material-alpha-f-circle-outline":"material/alpha-f-circle-outline.svg","material-alpha-f-circle":"material/alpha-f-circle.svg","material-alpha-f":"material/alpha-f.svg","material-alpha-g-box-outline":"material/alpha-g-box-outline.svg","material-alpha-g-box":"material/alpha-g-box.svg","material-alpha-g-circle-outline":"material/alpha-g-circle-outline.svg","material-alpha-g-circle":"material/alpha-g-circle.svg","material-alpha-g":"material/alpha-g.svg","material-alpha-h-box-outline":"material/alpha-h-box-outline.svg","material-alpha-h-box":"material/alpha-h-box.svg","material-alpha-h-circle-outline":"material/alpha-h-circle-outline.svg","material-alpha-h-circle":"material/alpha-h-circle.svg","material-alpha-h":"material/alpha-h.svg","material-alpha-i-box-outline":"material/alpha-i-box-outline.svg","material-alpha-i-box":"material/alpha-i-box.svg","material-alpha-i-circle-outline":"material/alpha-i-circle-outline.svg","material-alpha-i-circle":"material/alpha-i-circle.svg","material-alpha-i":"material/alpha-i.svg","material-alpha-j-box-outline":"material/alpha-j-box-outline.svg","material-alpha-j-box":"material/alpha-j-box.svg","material-alpha-j-circle-outline":"material/alpha-j-circle-outline.svg","material-alpha-j-circle":"material/alpha-j-circle.svg","material-alpha-j":"material/alpha-j.svg","material-alpha-k-box-outline":"material/alpha-k-box-outline.svg","material-alpha-k-box":"material/alpha-k-box.svg","material-alpha-k-circle-outline":"material/alpha-k-circle-outline.svg","material-alpha-k-circle":"material/alpha-k-circle.svg","material-alpha-k":"material/alpha-k.svg","material-alpha-l-box-outline":"material/alpha-l-box-outline.svg","material-alpha-l-box":"material/alpha-l-box.svg","material-alpha-l-circle-outline":"material/alpha-l-circle-outline.svg","material-alpha-l-circle":"material/alpha-l-circle.svg","material-alpha-l":"material/alpha-l.svg","material-alpha-m-box-outline":"material/alpha-m-box-outline.svg","material-alpha-m-box":"material/alpha-m-box.svg","material-alpha-m-circle-outline":"material/alpha-m-circle-outline.svg","material-alpha-m-circle":"material/alpha-m-circle.svg","material-alpha-m":"material/alpha-m.svg","material-alpha-n-box-outline":"material/alpha-n-box-outline.svg","material-alpha-n-box":"material/alpha-n-box.svg","material-alpha-n-circle-outline":"material/alpha-n-circle-outline.svg","material-alpha-n-circle":"material/alpha-n-circle.svg","material-alpha-n":"material/alpha-n.svg","material-alpha-o-box-outline":"material/alpha-o-box-outline.svg","material-alpha-o-box":"material/alpha-o-box.svg","material-alpha-o-circle-outline":"material/alpha-o-circle-outline.svg","material-alpha-o-circle":"material/alpha-o-circle.svg","material-alpha-o":"material/alpha-o.svg","material-alpha-p-box-outline":"material/alpha-p-box-outline.svg","material-alpha-p-box":"material/alpha-p-box.svg","material-alpha-p-circle-outline":"material/alpha-p-circle-outline.svg","material-alpha-p-circle":"material/alpha-p-circle.svg","material-alpha-p":"material/alpha-p.svg","material-alpha-q-box-outline":"material/alpha-q-box-outline.svg","material-alpha-q-box":"material/alpha-q-box.svg","material-alpha-q-circle-outline":"material/alpha-q-circle-outline.svg","material-alpha-q-circle":"material/alpha-q-circle.svg","material-alpha-q":"material/alpha-q.svg","material-alpha-r-box-outline":"material/alpha-r-box-outline.svg","material-alpha-r-box":"material/alpha-r-box.svg","material-alpha-r-circle-outline":"material/alpha-r-circle-outline.svg","material-alpha-r-circle":"material/alpha-r-circle.svg","material-alpha-r":"material/alpha-r.svg","material-alpha-s-box-outline":"material/alpha-s-box-outline.svg","material-alpha-s-box":"material/alpha-s-box.svg","material-alpha-s-circle-outline":"material/alpha-s-circle-outline.svg","material-alpha-s-circle":"material/alpha-s-circle.svg","material-alpha-s":"material/alpha-s.svg","material-alpha-t-box-outline":"material/alpha-t-box-outline.svg","material-alpha-t-box":"material/alpha-t-box.svg","material-alpha-t-circle-outline":"material/alpha-t-circle-outline.svg","material-alpha-t-circle":"material/alpha-t-circle.svg","material-alpha-t":"material/alpha-t.svg","material-alpha-u-box-outline":"material/alpha-u-box-outline.svg","material-alpha-u-box":"material/alpha-u-box.svg","material-alpha-u-circle-outline":"material/alpha-u-circle-outline.svg","material-alpha-u-circle":"material/alpha-u-circle.svg","material-alpha-u":"material/alpha-u.svg","material-alpha-v-box-outline":"material/alpha-v-box-outline.svg","material-alpha-v-box":"material/alpha-v-box.svg","material-alpha-v-circle-outline":"material/alpha-v-circle-outline.svg","material-alpha-v-circle":"material/alpha-v-circle.svg","material-alpha-v":"material/alpha-v.svg","material-alpha-w-box-outline":"material/alpha-w-box-outline.svg","material-alpha-w-box":"material/alpha-w-box.svg","material-alpha-w-circle-outline":"material/alpha-w-circle-outline.svg","material-alpha-w-circle":"material/alpha-w-circle.svg","material-alpha-w":"material/alpha-w.svg","material-alpha-x-box-outline":"material/alpha-x-box-outline.svg","material-alpha-x-box":"material/alpha-x-box.svg","material-alpha-x-circle-outline":"material/alpha-x-circle-outline.svg","material-alpha-x-circle":"material/alpha-x-circle.svg","material-alpha-x":"material/alpha-x.svg","material-alpha-y-box-outline":"material/alpha-y-box-outline.svg","material-alpha-y-box":"material/alpha-y-box.svg","material-alpha-y-circle-outline":"material/alpha-y-circle-outline.svg","material-alpha-y-circle":"material/alpha-y-circle.svg","material-alpha-y":"material/alpha-y.svg","material-alpha-z-box-outline":"material/alpha-z-box-outline.svg","material-alpha-z-box":"material/alpha-z-box.svg","material-alpha-z-circle-outline":"material/alpha-z-circle-outline.svg","material-alpha-z-circle":"material/alpha-z-circle.svg","material-alpha-z":"material/alpha-z.svg","material-alpha":"material/alpha.svg","material-alphabet-aurebesh":"material/alphabet-aurebesh.svg","material-alphabet-cyrillic":"material/alphabet-cyrillic.svg","material-alphabet-greek":"material/alphabet-greek.svg","material-alphabet-latin":"material/alphabet-latin.svg","material-alphabet-piqad":"material/alphabet-piqad.svg","material-alphabet-tengwar":"material/alphabet-tengwar.svg","material-alphabetical-off":"material/alphabetical-off.svg","material-alphabetical-variant-off":"material/alphabetical-variant-off.svg","material-alphabetical-variant":"material/alphabetical-variant.svg","material-alphabetical":"material/alphabetical.svg","material-altimeter":"material/altimeter.svg","material-ambulance":"material/ambulance.svg","material-ammunition":"material/ammunition.svg","material-ampersand":"material/ampersand.svg","material-amplifier-off":"material/amplifier-off.svg","material-amplifier":"material/amplifier.svg","material-anchor":"material/anchor.svg","material-android-studio":"material/android-studio.svg","material-android":"material/android.svg","material-angle-acute":"material/angle-acute.svg","material-angle-obtuse":"material/angle-obtuse.svg","material-angle-right":"material/angle-right.svg","material-angular":"material/angular.svg","material-angularjs":"material/angularjs.svg","material-animation-outline":"material/animation-outline.svg","material-animation-play-outline":"material/animation-play-outline.svg","material-animation-play":"material/animation-play.svg","material-animation":"material/animation.svg","material-ansible":"material/ansible.svg","material-antenna":"material/antenna.svg","material-anvil":"material/anvil.svg","material-apache-kafka":"material/apache-kafka.svg","material-api-off":"material/api-off.svg","material-api":"material/api.svg","material-apple-finder":"material/apple-finder.svg","material-apple-icloud":"material/apple-icloud.svg","material-apple-ios":"material/apple-ios.svg","material-apple-keyboard-caps":"material/apple-keyboard-caps.svg","material-apple-keyboard-command":"material/apple-keyboard-command.svg","material-apple-keyboard-control":"material/apple-keyboard-control.svg","material-apple-keyboard-option":"material/apple-keyboard-option.svg","material-apple-keyboard-shift":"material/apple-keyboard-shift.svg","material-apple-safari":"material/apple-safari.svg","material-apple":"material/apple.svg","material-application-array-outline":"material/application-array-outline.svg","material-application-array":"material/application-array.svg","material-application-braces-outline":"material/application-braces-outline.svg","material-application-braces":"material/application-braces.svg","material-application-brackets-outline":"material/application-brackets-outline.svg","material-application-brackets":"material/application-brackets.svg","material-application-cog-outline":"material/application-cog-outline.svg","material-application-cog":"material/application-cog.svg","material-application-edit-outline":"material/application-edit-outline.svg","material-application-edit":"material/application-edit.svg","material-application-export":"material/application-export.svg","material-application-import":"material/application-import.svg","material-application-outline":"material/application-outline.svg","material-application-parentheses-outline":"material/application-parentheses-outline.svg","material-application-parentheses":"material/application-parentheses.svg","material-application-settings-outline":"material/application-settings-outline.svg","material-application-settings":"material/application-settings.svg","material-application-variable-outline":"material/application-variable-outline.svg","material-application-variable":"material/application-variable.svg","material-application":"material/application.svg","material-approximately-equal-box":"material/approximately-equal-box.svg","material-approximately-equal":"material/approximately-equal.svg","material-apps-box":"material/apps-box.svg","material-apps":"material/apps.svg","material-arch":"material/arch.svg","material-archive-alert-outline":"material/archive-alert-outline.svg","material-archive-alert":"material/archive-alert.svg","material-archive-arrow-down-outline":"material/archive-arrow-down-outline.svg","material-archive-arrow-down":"material/archive-arrow-down.svg","material-archive-arrow-up-outline":"material/archive-arrow-up-outline.svg","material-archive-arrow-up":"material/archive-arrow-up.svg","material-archive-cancel-outline":"material/archive-cancel-outline.svg","material-archive-cancel":"material/archive-cancel.svg","material-archive-check-outline":"material/archive-check-outline.svg","material-archive-check":"material/archive-check.svg","material-archive-clock-outline":"material/archive-clock-outline.svg","material-archive-clock":"material/archive-clock.svg","material-archive-cog-outline":"material/archive-cog-outline.svg","material-archive-cog":"material/archive-cog.svg","material-archive-edit-outline":"material/archive-edit-outline.svg","material-archive-edit":"material/archive-edit.svg","material-archive-eye-outline":"material/archive-eye-outline.svg","material-archive-eye":"material/archive-eye.svg","material-archive-lock-open-outline":"material/archive-lock-open-outline.svg","material-archive-lock-open":"material/archive-lock-open.svg","material-archive-lock-outline":"material/archive-lock-outline.svg","material-archive-lock":"material/archive-lock.svg","material-archive-marker-outline":"material/archive-marker-outline.svg","material-archive-marker":"material/archive-marker.svg","material-archive-minus-outline":"material/archive-minus-outline.svg","material-archive-minus":"material/archive-minus.svg","material-archive-music-outline":"material/archive-music-outline.svg","material-archive-music":"material/archive-music.svg","material-archive-off-outline":"material/archive-off-outline.svg","material-archive-off":"material/archive-off.svg","material-archive-outline":"material/archive-outline.svg","material-archive-plus-outline":"material/archive-plus-outline.svg","material-archive-plus":"material/archive-plus.svg","material-archive-refresh-outline":"material/archive-refresh-outline.svg","material-archive-refresh":"material/archive-refresh.svg","material-archive-remove-outline":"material/archive-remove-outline.svg","material-archive-remove":"material/archive-remove.svg","material-archive-search-outline":"material/archive-search-outline.svg","material-archive-search":"material/archive-search.svg","material-archive-settings-outline":"material/archive-settings-outline.svg","material-archive-settings":"material/archive-settings.svg","material-archive-star-outline":"material/archive-star-outline.svg","material-archive-star":"material/archive-star.svg","material-archive-sync-outline":"material/archive-sync-outline.svg","material-archive-sync":"material/archive-sync.svg","material-archive":"material/archive.svg","material-arm-flex-outline":"material/arm-flex-outline.svg","material-arm-flex":"material/arm-flex.svg","material-arrange-bring-forward":"material/arrange-bring-forward.svg","material-arrange-bring-to-front":"material/arrange-bring-to-front.svg","material-arrange-send-backward":"material/arrange-send-backward.svg","material-arrange-send-to-back":"material/arrange-send-to-back.svg","material-arrow-all":"material/arrow-all.svg","material-arrow-bottom-left-bold-box-outline":"material/arrow-bottom-left-bold-box-outline.svg","material-arrow-bottom-left-bold-box":"material/arrow-bottom-left-bold-box.svg","material-arrow-bottom-left-bold-outline":"material/arrow-bottom-left-bold-outline.svg","material-arrow-bottom-left-thick":"material/arrow-bottom-left-thick.svg","material-arrow-bottom-left-thin-circle-outline":"material/arrow-bottom-left-thin-circle-outline.svg","material-arrow-bottom-left-thin":"material/arrow-bottom-left-thin.svg","material-arrow-bottom-left":"material/arrow-bottom-left.svg","material-arrow-bottom-right-bold-box-outline":"material/arrow-bottom-right-bold-box-outline.svg","material-arrow-bottom-right-bold-box":"material/arrow-bottom-right-bold-box.svg","material-arrow-bottom-right-bold-outline":"material/arrow-bottom-right-bold-outline.svg","material-arrow-bottom-right-thick":"material/arrow-bottom-right-thick.svg","material-arrow-bottom-right-thin-circle-outline":"material/arrow-bottom-right-thin-circle-outline.svg","material-arrow-bottom-right-thin":"material/arrow-bottom-right-thin.svg","material-arrow-bottom-right":"material/arrow-bottom-right.svg","material-arrow-collapse-all":"material/arrow-collapse-all.svg","material-arrow-collapse-down":"material/arrow-collapse-down.svg","material-arrow-collapse-horizontal":"material/arrow-collapse-horizontal.svg","material-arrow-collapse-left":"material/arrow-collapse-left.svg","material-arrow-collapse-right":"material/arrow-collapse-right.svg","material-arrow-collapse-up":"material/arrow-collapse-up.svg","material-arrow-collapse-vertical":"material/arrow-collapse-vertical.svg","material-arrow-collapse":"material/arrow-collapse.svg","material-arrow-decision-auto-outline":"material/arrow-decision-auto-outline.svg","material-arrow-decision-auto":"material/arrow-decision-auto.svg","material-arrow-decision-outline":"material/arrow-decision-outline.svg","material-arrow-decision":"material/arrow-decision.svg","material-arrow-down-bold-box-outline":"material/arrow-down-bold-box-outline.svg","material-arrow-down-bold-box":"material/arrow-down-bold-box.svg","material-arrow-down-bold-circle-outline":"material/arrow-down-bold-circle-outline.svg","material-arrow-down-bold-circle":"material/arrow-down-bold-circle.svg","material-arrow-down-bold-hexagon-outline":"material/arrow-down-bold-hexagon-outline.svg","material-arrow-down-bold-outline":"material/arrow-down-bold-outline.svg","material-arrow-down-bold":"material/arrow-down-bold.svg","material-arrow-down-box":"material/arrow-down-box.svg","material-arrow-down-circle-outline":"material/arrow-down-circle-outline.svg","material-arrow-down-circle":"material/arrow-down-circle.svg","material-arrow-down-drop-circle-outline":"material/arrow-down-drop-circle-outline.svg","material-arrow-down-drop-circle":"material/arrow-down-drop-circle.svg","material-arrow-down-left-bold":"material/arrow-down-left-bold.svg","material-arrow-down-left":"material/arrow-down-left.svg","material-arrow-down-right-bold":"material/arrow-down-right-bold.svg","material-arrow-down-right":"material/arrow-down-right.svg","material-arrow-down-thick":"material/arrow-down-thick.svg","material-arrow-down-thin-circle-outline":"material/arrow-down-thin-circle-outline.svg","material-arrow-down-thin":"material/arrow-down-thin.svg","material-arrow-down":"material/arrow-down.svg","material-arrow-expand-all":"material/arrow-expand-all.svg","material-arrow-expand-down":"material/arrow-expand-down.svg","material-arrow-expand-horizontal":"material/arrow-expand-horizontal.svg","material-arrow-expand-left":"material/arrow-expand-left.svg","material-arrow-expand-right":"material/arrow-expand-right.svg","material-arrow-expand-up":"material/arrow-expand-up.svg","material-arrow-expand-vertical":"material/arrow-expand-vertical.svg","material-arrow-expand":"material/arrow-expand.svg","material-arrow-horizontal-lock":"material/arrow-horizontal-lock.svg","material-arrow-left-bold-box-outline":"material/arrow-left-bold-box-outline.svg","material-arrow-left-bold-box":"material/arrow-left-bold-box.svg","material-arrow-left-bold-circle-outline":"material/arrow-left-bold-circle-outline.svg","material-arrow-left-bold-circle":"material/arrow-left-bold-circle.svg","material-arrow-left-bold-hexagon-outline":"material/arrow-left-bold-hexagon-outline.svg","material-arrow-left-bold-outline":"material/arrow-left-bold-outline.svg","material-arrow-left-bold":"material/arrow-left-bold.svg","material-arrow-left-bottom-bold":"material/arrow-left-bottom-bold.svg","material-arrow-left-bottom":"material/arrow-left-bottom.svg","material-arrow-left-box":"material/arrow-left-box.svg","material-arrow-left-circle-outline":"material/arrow-left-circle-outline.svg","material-arrow-left-circle":"material/arrow-left-circle.svg","material-arrow-left-drop-circle-outline":"material/arrow-left-drop-circle-outline.svg","material-arrow-left-drop-circle":"material/arrow-left-drop-circle.svg","material-arrow-left-right-bold-outline":"material/arrow-left-right-bold-outline.svg","material-arrow-left-right-bold":"material/arrow-left-right-bold.svg","material-arrow-left-right":"material/arrow-left-right.svg","material-arrow-left-thick":"material/arrow-left-thick.svg","material-arrow-left-thin-circle-outline":"material/arrow-left-thin-circle-outline.svg","material-arrow-left-thin":"material/arrow-left-thin.svg","material-arrow-left-top-bold":"material/arrow-left-top-bold.svg","material-arrow-left-top":"material/arrow-left-top.svg","material-arrow-left":"material/arrow-left.svg","material-arrow-projectile-multiple":"material/arrow-projectile-multiple.svg","material-arrow-projectile":"material/arrow-projectile.svg","material-arrow-right-bold-box-outline":"material/arrow-right-bold-box-outline.svg","material-arrow-right-bold-box":"material/arrow-right-bold-box.svg","material-arrow-right-bold-circle-outline":"material/arrow-right-bold-circle-outline.svg","material-arrow-right-bold-circle":"material/arrow-right-bold-circle.svg","material-arrow-right-bold-hexagon-outline":"material/arrow-right-bold-hexagon-outline.svg","material-arrow-right-bold-outline":"material/arrow-right-bold-outline.svg","material-arrow-right-bold":"material/arrow-right-bold.svg","material-arrow-right-bottom-bold":"material/arrow-right-bottom-bold.svg","material-arrow-right-bottom":"material/arrow-right-bottom.svg","material-arrow-right-box":"material/arrow-right-box.svg","material-arrow-right-circle-outline":"material/arrow-right-circle-outline.svg","material-arrow-right-circle":"material/arrow-right-circle.svg","material-arrow-right-drop-circle-outline":"material/arrow-right-drop-circle-outline.svg","material-arrow-right-drop-circle":"material/arrow-right-drop-circle.svg","material-arrow-right-thick":"material/arrow-right-thick.svg","material-arrow-right-thin-circle-outline":"material/arrow-right-thin-circle-outline.svg","material-arrow-right-thin":"material/arrow-right-thin.svg","material-arrow-right-top-bold":"material/arrow-right-top-bold.svg","material-arrow-right-top":"material/arrow-right-top.svg","material-arrow-right":"material/arrow-right.svg","material-arrow-split-horizontal":"material/arrow-split-horizontal.svg","material-arrow-split-vertical":"material/arrow-split-vertical.svg","material-arrow-top-left-bold-box-outline":"material/arrow-top-left-bold-box-outline.svg","material-arrow-top-left-bold-box":"material/arrow-top-left-bold-box.svg","material-arrow-top-left-bold-outline":"material/arrow-top-left-bold-outline.svg","material-arrow-top-left-bottom-right-bold":"material/arrow-top-left-bottom-right-bold.svg","material-arrow-top-left-bottom-right":"material/arrow-top-left-bottom-right.svg","material-arrow-top-left-thick":"material/arrow-top-left-thick.svg","material-arrow-top-left-thin-circle-outline":"material/arrow-top-left-thin-circle-outline.svg","material-arrow-top-left-thin":"material/arrow-top-left-thin.svg","material-arrow-top-left":"material/arrow-top-left.svg","material-arrow-top-right-bold-box-outline":"material/arrow-top-right-bold-box-outline.svg","material-arrow-top-right-bold-box":"material/arrow-top-right-bold-box.svg","material-arrow-top-right-bold-outline":"material/arrow-top-right-bold-outline.svg","material-arrow-top-right-bottom-left-bold":"material/arrow-top-right-bottom-left-bold.svg","material-arrow-top-right-bottom-left":"material/arrow-top-right-bottom-left.svg","material-arrow-top-right-thick":"material/arrow-top-right-thick.svg","material-arrow-top-right-thin-circle-outline":"material/arrow-top-right-thin-circle-outline.svg","material-arrow-top-right-thin":"material/arrow-top-right-thin.svg","material-arrow-top-right":"material/arrow-top-right.svg","material-arrow-u-down-left-bold":"material/arrow-u-down-left-bold.svg","material-arrow-u-down-left":"material/arrow-u-down-left.svg","material-arrow-u-down-right-bold":"material/arrow-u-down-right-bold.svg","material-arrow-u-down-right":"material/arrow-u-down-right.svg","material-arrow-u-left-bottom-bold":"material/arrow-u-left-bottom-bold.svg","material-arrow-u-left-bottom":"material/arrow-u-left-bottom.svg","material-arrow-u-left-top-bold":"material/arrow-u-left-top-bold.svg","material-arrow-u-left-top":"material/arrow-u-left-top.svg","material-arrow-u-right-bottom-bold":"material/arrow-u-right-bottom-bold.svg","material-arrow-u-right-bottom":"material/arrow-u-right-bottom.svg","material-arrow-u-right-top-bold":"material/arrow-u-right-top-bold.svg","material-arrow-u-right-top":"material/arrow-u-right-top.svg","material-arrow-u-up-left-bold":"material/arrow-u-up-left-bold.svg","material-arrow-u-up-left":"material/arrow-u-up-left.svg","material-arrow-u-up-right-bold":"material/arrow-u-up-right-bold.svg","material-arrow-u-up-right":"material/arrow-u-up-right.svg","material-arrow-up-bold-box-outline":"material/arrow-up-bold-box-outline.svg","material-arrow-up-bold-box":"material/arrow-up-bold-box.svg","material-arrow-up-bold-circle-outline":"material/arrow-up-bold-circle-outline.svg","material-arrow-up-bold-circle":"material/arrow-up-bold-circle.svg","material-arrow-up-bold-hexagon-outline":"material/arrow-up-bold-hexagon-outline.svg","material-arrow-up-bold-outline":"material/arrow-up-bold-outline.svg","material-arrow-up-bold":"material/arrow-up-bold.svg","material-arrow-up-box":"material/arrow-up-box.svg","material-arrow-up-circle-outline":"material/arrow-up-circle-outline.svg","material-arrow-up-circle":"material/arrow-up-circle.svg","material-arrow-up-down-bold-outline":"material/arrow-up-down-bold-outline.svg","material-arrow-up-down-bold":"material/arrow-up-down-bold.svg","material-arrow-up-down":"material/arrow-up-down.svg","material-arrow-up-drop-circle-outline":"material/arrow-up-drop-circle-outline.svg","material-arrow-up-drop-circle":"material/arrow-up-drop-circle.svg","material-arrow-up-left-bold":"material/arrow-up-left-bold.svg","material-arrow-up-left":"material/arrow-up-left.svg","material-arrow-up-right-bold":"material/arrow-up-right-bold.svg","material-arrow-up-right":"material/arrow-up-right.svg","material-arrow-up-thick":"material/arrow-up-thick.svg","material-arrow-up-thin-circle-outline":"material/arrow-up-thin-circle-outline.svg","material-arrow-up-thin":"material/arrow-up-thin.svg","material-arrow-up":"material/arrow-up.svg","material-arrow-vertical-lock":"material/arrow-vertical-lock.svg","material-artboard":"material/artboard.svg","material-artstation":"material/artstation.svg","material-aspect-ratio":"material/aspect-ratio.svg","material-assistant":"material/assistant.svg","material-asterisk-circle-outline":"material/asterisk-circle-outline.svg","material-asterisk":"material/asterisk.svg","material-at":"material/at.svg","material-atlassian":"material/atlassian.svg","material-atm":"material/atm.svg","material-atom-variant":"material/atom-variant.svg","material-atom":"material/atom.svg","material-attachment-check":"material/attachment-check.svg","material-attachment-lock":"material/attachment-lock.svg","material-attachment-minus":"material/attachment-minus.svg","material-attachment-off":"material/attachment-off.svg","material-attachment-plus":"material/attachment-plus.svg","material-attachment-remove":"material/attachment-remove.svg","material-attachment":"material/attachment.svg","material-atv":"material/atv.svg","material-audio-input-rca":"material/audio-input-rca.svg","material-audio-input-stereo-minijack":"material/audio-input-stereo-minijack.svg","material-audio-input-xlr":"material/audio-input-xlr.svg","material-audio-video-off":"material/audio-video-off.svg","material-audio-video":"material/audio-video.svg","material-augmented-reality":"material/augmented-reality.svg","material-auto-download":"material/auto-download.svg","material-auto-fix":"material/auto-fix.svg","material-auto-upload":"material/auto-upload.svg","material-autorenew-off":"material/autorenew-off.svg","material-autorenew":"material/autorenew.svg","material-av-timer":"material/av-timer.svg","material-awning-outline":"material/awning-outline.svg","material-awning":"material/awning.svg","material-aws":"material/aws.svg","material-axe-battle":"material/axe-battle.svg","material-axe":"material/axe.svg","material-axis-arrow-info":"material/axis-arrow-info.svg","material-axis-arrow-lock":"material/axis-arrow-lock.svg","material-axis-arrow":"material/axis-arrow.svg","material-axis-lock":"material/axis-lock.svg","material-axis-x-arrow-lock":"material/axis-x-arrow-lock.svg","material-axis-x-arrow":"material/axis-x-arrow.svg","material-axis-x-rotate-clockwise":"material/axis-x-rotate-clockwise.svg","material-axis-x-rotate-counterclockwise":"material/axis-x-rotate-counterclockwise.svg","material-axis-x-y-arrow-lock":"material/axis-x-y-arrow-lock.svg","material-axis-y-arrow-lock":"material/axis-y-arrow-lock.svg","material-axis-y-arrow":"material/axis-y-arrow.svg","material-axis-y-rotate-clockwise":"material/axis-y-rotate-clockwise.svg","material-axis-y-rotate-counterclockwise":"material/axis-y-rotate-counterclockwise.svg","material-axis-z-arrow-lock":"material/axis-z-arrow-lock.svg","material-axis-z-arrow":"material/axis-z-arrow.svg","material-axis-z-rotate-clockwise":"material/axis-z-rotate-clockwise.svg","material-axis-z-rotate-counterclockwise":"material/axis-z-rotate-counterclockwise.svg","material-axis":"material/axis.svg","material-babel":"material/babel.svg","material-baby-bottle-outline":"material/baby-bottle-outline.svg","material-baby-bottle":"material/baby-bottle.svg","material-baby-buggy-off":"material/baby-buggy-off.svg","material-baby-buggy":"material/baby-buggy.svg","material-baby-carriage-off":"material/baby-carriage-off.svg","material-baby-carriage":"material/baby-carriage.svg","material-baby-face-outline":"material/baby-face-outline.svg","material-baby-face":"material/baby-face.svg","material-baby":"material/baby.svg","material-backburger":"material/backburger.svg","material-backspace-outline":"material/backspace-outline.svg","material-backspace-reverse-outline":"material/backspace-reverse-outline.svg","material-backspace-reverse":"material/backspace-reverse.svg","material-backspace":"material/backspace.svg","material-backup-restore":"material/backup-restore.svg","material-bacteria-outline":"material/bacteria-outline.svg","material-bacteria":"material/bacteria.svg","material-badge-account-alert-outline":"material/badge-account-alert-outline.svg","material-badge-account-alert":"material/badge-account-alert.svg","material-badge-account-horizontal-outline":"material/badge-account-horizontal-outline.svg","material-badge-account-horizontal":"material/badge-account-horizontal.svg","material-badge-account-outline":"material/badge-account-outline.svg","material-badge-account":"material/badge-account.svg","material-badminton":"material/badminton.svg","material-bag-carry-on-check":"material/bag-carry-on-check.svg","material-bag-carry-on-off":"material/bag-carry-on-off.svg","material-bag-carry-on":"material/bag-carry-on.svg","material-bag-checked":"material/bag-checked.svg","material-bag-personal-off-outline":"material/bag-personal-off-outline.svg","material-bag-personal-off":"material/bag-personal-off.svg","material-bag-personal-outline":"material/bag-personal-outline.svg","material-bag-personal-tag-outline":"material/bag-personal-tag-outline.svg","material-bag-personal-tag":"material/bag-personal-tag.svg","material-bag-personal":"material/bag-personal.svg","material-bag-suitcase-off-outline":"material/bag-suitcase-off-outline.svg","material-bag-suitcase-off":"material/bag-suitcase-off.svg","material-bag-suitcase-outline":"material/bag-suitcase-outline.svg","material-bag-suitcase":"material/bag-suitcase.svg","material-baguette":"material/baguette.svg","material-balcony":"material/balcony.svg","material-balloon":"material/balloon.svg","material-ballot-outline":"material/ballot-outline.svg","material-ballot-recount-outline":"material/ballot-recount-outline.svg","material-ballot-recount":"material/ballot-recount.svg","material-ballot":"material/ballot.svg","material-bandage":"material/bandage.svg","material-bank-check":"material/bank-check.svg","material-bank-minus":"material/bank-minus.svg","material-bank-off-outline":"material/bank-off-outline.svg","material-bank-off":"material/bank-off.svg","material-bank-outline":"material/bank-outline.svg","material-bank-plus":"material/bank-plus.svg","material-bank-remove":"material/bank-remove.svg","material-bank-transfer-in":"material/bank-transfer-in.svg","material-bank-transfer-out":"material/bank-transfer-out.svg","material-bank-transfer":"material/bank-transfer.svg","material-bank":"material/bank.svg","material-barcode-off":"material/barcode-off.svg","material-barcode-scan":"material/barcode-scan.svg","material-barcode":"material/barcode.svg","material-barley-off":"material/barley-off.svg","material-barley":"material/barley.svg","material-barn":"material/barn.svg","material-barrel-outline":"material/barrel-outline.svg","material-barrel":"material/barrel.svg","material-baseball-bat":"material/baseball-bat.svg","material-baseball-diamond-outline":"material/baseball-diamond-outline.svg","material-baseball-diamond":"material/baseball-diamond.svg","material-baseball":"material/baseball.svg","material-bash":"material/bash.svg","material-basket-check-outline":"material/basket-check-outline.svg","material-basket-check":"material/basket-check.svg","material-basket-fill":"material/basket-fill.svg","material-basket-minus-outline":"material/basket-minus-outline.svg","material-basket-minus":"material/basket-minus.svg","material-basket-off-outline":"material/basket-off-outline.svg","material-basket-off":"material/basket-off.svg","material-basket-outline":"material/basket-outline.svg","material-basket-plus-outline":"material/basket-plus-outline.svg","material-basket-plus":"material/basket-plus.svg","material-basket-remove-outline":"material/basket-remove-outline.svg","material-basket-remove":"material/basket-remove.svg","material-basket-unfill":"material/basket-unfill.svg","material-basket":"material/basket.svg","material-basketball-hoop-outline":"material/basketball-hoop-outline.svg","material-basketball-hoop":"material/basketball-hoop.svg","material-basketball":"material/basketball.svg","material-bat":"material/bat.svg","material-bathtub-outline":"material/bathtub-outline.svg","material-bathtub":"material/bathtub.svg","material-battery-10-bluetooth":"material/battery-10-bluetooth.svg","material-battery-10":"material/battery-10.svg","material-battery-20-bluetooth":"material/battery-20-bluetooth.svg","material-battery-20":"material/battery-20.svg","material-battery-30-bluetooth":"material/battery-30-bluetooth.svg","material-battery-30":"material/battery-30.svg","material-battery-40-bluetooth":"material/battery-40-bluetooth.svg","material-battery-40":"material/battery-40.svg","material-battery-50-bluetooth":"material/battery-50-bluetooth.svg","material-battery-50":"material/battery-50.svg","material-battery-60-bluetooth":"material/battery-60-bluetooth.svg","material-battery-60":"material/battery-60.svg","material-battery-70-bluetooth":"material/battery-70-bluetooth.svg","material-battery-70":"material/battery-70.svg","material-battery-80-bluetooth":"material/battery-80-bluetooth.svg","material-battery-80":"material/battery-80.svg","material-battery-90-bluetooth":"material/battery-90-bluetooth.svg","material-battery-90":"material/battery-90.svg","material-battery-alert-bluetooth":"material/battery-alert-bluetooth.svg","material-battery-alert-variant-outline":"material/battery-alert-variant-outline.svg","material-battery-alert-variant":"material/battery-alert-variant.svg","material-battery-alert":"material/battery-alert.svg","material-battery-arrow-down-outline":"material/battery-arrow-down-outline.svg","material-battery-arrow-down":"material/battery-arrow-down.svg","material-battery-arrow-up-outline":"material/battery-arrow-up-outline.svg","material-battery-arrow-up":"material/battery-arrow-up.svg","material-battery-bluetooth-variant":"material/battery-bluetooth-variant.svg","material-battery-bluetooth":"material/battery-bluetooth.svg","material-battery-charging-10":"material/battery-charging-10.svg","material-battery-charging-100":"material/battery-charging-100.svg","material-battery-charging-20":"material/battery-charging-20.svg","material-battery-charging-30":"material/battery-charging-30.svg","material-battery-charging-40":"material/battery-charging-40.svg","material-battery-charging-50":"material/battery-charging-50.svg","material-battery-charging-60":"material/battery-charging-60.svg","material-battery-charging-70":"material/battery-charging-70.svg","material-battery-charging-80":"material/battery-charging-80.svg","material-battery-charging-90":"material/battery-charging-90.svg","material-battery-charging-high":"material/battery-charging-high.svg","material-battery-charging-low":"material/battery-charging-low.svg","material-battery-charging-medium":"material/battery-charging-medium.svg","material-battery-charging-outline":"material/battery-charging-outline.svg","material-battery-charging-wireless-10":"material/battery-charging-wireless-10.svg","material-battery-charging-wireless-20":"material/battery-charging-wireless-20.svg","material-battery-charging-wireless-30":"material/battery-charging-wireless-30.svg","material-battery-charging-wireless-40":"material/battery-charging-wireless-40.svg","material-battery-charging-wireless-50":"material/battery-charging-wireless-50.svg","material-battery-charging-wireless-60":"material/battery-charging-wireless-60.svg","material-battery-charging-wireless-70":"material/battery-charging-wireless-70.svg","material-battery-charging-wireless-80":"material/battery-charging-wireless-80.svg","material-battery-charging-wireless-90":"material/battery-charging-wireless-90.svg","material-battery-charging-wireless-alert":"material/battery-charging-wireless-alert.svg","material-battery-charging-wireless-outline":"material/battery-charging-wireless-outline.svg","material-battery-charging-wireless":"material/battery-charging-wireless.svg","material-battery-charging":"material/battery-charging.svg","material-battery-check-outline":"material/battery-check-outline.svg","material-battery-check":"material/battery-check.svg","material-battery-clock-outline":"material/battery-clock-outline.svg","material-battery-clock":"material/battery-clock.svg","material-battery-heart-outline":"material/battery-heart-outline.svg","material-battery-heart-variant":"material/battery-heart-variant.svg","material-battery-heart":"material/battery-heart.svg","material-battery-high":"material/battery-high.svg","material-battery-lock-open":"material/battery-lock-open.svg","material-battery-lock":"material/battery-lock.svg","material-battery-low":"material/battery-low.svg","material-battery-medium":"material/battery-medium.svg","material-battery-minus-outline":"material/battery-minus-outline.svg","material-battery-minus-variant":"material/battery-minus-variant.svg","material-battery-minus":"material/battery-minus.svg","material-battery-negative":"material/battery-negative.svg","material-battery-off-outline":"material/battery-off-outline.svg","material-battery-off":"material/battery-off.svg","material-battery-outline":"material/battery-outline.svg","material-battery-plus-outline":"material/battery-plus-outline.svg","material-battery-plus-variant":"material/battery-plus-variant.svg","material-battery-plus":"material/battery-plus.svg","material-battery-positive":"material/battery-positive.svg","material-battery-remove-outline":"material/battery-remove-outline.svg","material-battery-remove":"material/battery-remove.svg","material-battery-sync-outline":"material/battery-sync-outline.svg","material-battery-sync":"material/battery-sync.svg","material-battery-unknown-bluetooth":"material/battery-unknown-bluetooth.svg","material-battery-unknown":"material/battery-unknown.svg","material-battery":"material/battery.svg","material-beach":"material/beach.svg","material-beaker-alert-outline":"material/beaker-alert-outline.svg","material-beaker-alert":"material/beaker-alert.svg","material-beaker-check-outline":"material/beaker-check-outline.svg","material-beaker-check":"material/beaker-check.svg","material-beaker-minus-outline":"material/beaker-minus-outline.svg","material-beaker-minus":"material/beaker-minus.svg","material-beaker-outline":"material/beaker-outline.svg","material-beaker-plus-outline":"material/beaker-plus-outline.svg","material-beaker-plus":"material/beaker-plus.svg","material-beaker-question-outline":"material/beaker-question-outline.svg","material-beaker-question":"material/beaker-question.svg","material-beaker-remove-outline":"material/beaker-remove-outline.svg","material-beaker-remove":"material/beaker-remove.svg","material-beaker":"material/beaker.svg","material-bed-clock":"material/bed-clock.svg","material-bed-double-outline":"material/bed-double-outline.svg","material-bed-double":"material/bed-double.svg","material-bed-empty":"material/bed-empty.svg","material-bed-king-outline":"material/bed-king-outline.svg","material-bed-king":"material/bed-king.svg","material-bed-outline":"material/bed-outline.svg","material-bed-queen-outline":"material/bed-queen-outline.svg","material-bed-queen":"material/bed-queen.svg","material-bed-single-outline":"material/bed-single-outline.svg","material-bed-single":"material/bed-single.svg","material-bed":"material/bed.svg","material-bee-flower":"material/bee-flower.svg","material-bee":"material/bee.svg","material-beehive-off-outline":"material/beehive-off-outline.svg","material-beehive-outline":"material/beehive-outline.svg","material-beekeeper":"material/beekeeper.svg","material-beer-outline":"material/beer-outline.svg","material-beer":"material/beer.svg","material-bell-alert-outline":"material/bell-alert-outline.svg","material-bell-alert":"material/bell-alert.svg","material-bell-badge-outline":"material/bell-badge-outline.svg","material-bell-badge":"material/bell-badge.svg","material-bell-cancel-outline":"material/bell-cancel-outline.svg","material-bell-cancel":"material/bell-cancel.svg","material-bell-check-outline":"material/bell-check-outline.svg","material-bell-check":"material/bell-check.svg","material-bell-circle-outline":"material/bell-circle-outline.svg","material-bell-circle":"material/bell-circle.svg","material-bell-cog-outline":"material/bell-cog-outline.svg","material-bell-cog":"material/bell-cog.svg","material-bell-minus-outline":"material/bell-minus-outline.svg","material-bell-minus":"material/bell-minus.svg","material-bell-off-outline":"material/bell-off-outline.svg","material-bell-off":"material/bell-off.svg","material-bell-outline":"material/bell-outline.svg","material-bell-plus-outline":"material/bell-plus-outline.svg","material-bell-plus":"material/bell-plus.svg","material-bell-remove-outline":"material/bell-remove-outline.svg","material-bell-remove":"material/bell-remove.svg","material-bell-ring-outline":"material/bell-ring-outline.svg","material-bell-ring":"material/bell-ring.svg","material-bell-sleep-outline":"material/bell-sleep-outline.svg","material-bell-sleep":"material/bell-sleep.svg","material-bell":"material/bell.svg","material-beta":"material/beta.svg","material-betamax":"material/betamax.svg","material-biathlon":"material/biathlon.svg","material-bicycle-basket":"material/bicycle-basket.svg","material-bicycle-cargo":"material/bicycle-cargo.svg","material-bicycle-electric":"material/bicycle-electric.svg","material-bicycle-penny-farthing":"material/bicycle-penny-farthing.svg","material-bicycle":"material/bicycle.svg","material-bike-fast":"material/bike-fast.svg","material-bike":"material/bike.svg","material-billboard":"material/billboard.svg","material-billiards-rack":"material/billiards-rack.svg","material-billiards":"material/billiards.svg","material-binoculars":"material/binoculars.svg","material-bio":"material/bio.svg","material-biohazard":"material/biohazard.svg","material-bird":"material/bird.svg","material-bitbucket":"material/bitbucket.svg","material-bitcoin":"material/bitcoin.svg","material-black-mesa":"material/black-mesa.svg","material-blender-outline":"material/blender-outline.svg","material-blender-software":"material/blender-software.svg","material-blender":"material/blender.svg","material-blinds-horizontal-closed":"material/blinds-horizontal-closed.svg","material-blinds-horizontal":"material/blinds-horizontal.svg","material-blinds-open":"material/blinds-open.svg","material-blinds-vertical-closed":"material/blinds-vertical-closed.svg","material-blinds-vertical":"material/blinds-vertical.svg","material-blinds":"material/blinds.svg","material-block-helper":"material/block-helper.svg","material-blood-bag":"material/blood-bag.svg","material-bluetooth-audio":"material/bluetooth-audio.svg","material-bluetooth-connect":"material/bluetooth-connect.svg","material-bluetooth-off":"material/bluetooth-off.svg","material-bluetooth-settings":"material/bluetooth-settings.svg","material-bluetooth-transfer":"material/bluetooth-transfer.svg","material-bluetooth":"material/bluetooth.svg","material-blur-linear":"material/blur-linear.svg","material-blur-off":"material/blur-off.svg","material-blur-radial":"material/blur-radial.svg","material-blur":"material/blur.svg","material-bolt":"material/bolt.svg","material-bomb-off":"material/bomb-off.svg","material-bomb":"material/bomb.svg","material-bone-off":"material/bone-off.svg","material-bone":"material/bone.svg","material-book-account-outline":"material/book-account-outline.svg","material-book-account":"material/book-account.svg","material-book-alert-outline":"material/book-alert-outline.svg","material-book-alert":"material/book-alert.svg","material-book-alphabet":"material/book-alphabet.svg","material-book-arrow-down-outline":"material/book-arrow-down-outline.svg","material-book-arrow-down":"material/book-arrow-down.svg","material-book-arrow-left-outline":"material/book-arrow-left-outline.svg","material-book-arrow-left":"material/book-arrow-left.svg","material-book-arrow-right-outline":"material/book-arrow-right-outline.svg","material-book-arrow-right":"material/book-arrow-right.svg","material-book-arrow-up-outline":"material/book-arrow-up-outline.svg","material-book-arrow-up":"material/book-arrow-up.svg","material-book-cancel-outline":"material/book-cancel-outline.svg","material-book-cancel":"material/book-cancel.svg","material-book-check-outline":"material/book-check-outline.svg","material-book-check":"material/book-check.svg","material-book-clock-outline":"material/book-clock-outline.svg","material-book-clock":"material/book-clock.svg","material-book-cog-outline":"material/book-cog-outline.svg","material-book-cog":"material/book-cog.svg","material-book-cross":"material/book-cross.svg","material-book-edit-outline":"material/book-edit-outline.svg","material-book-edit":"material/book-edit.svg","material-book-education-outline":"material/book-education-outline.svg","material-book-education":"material/book-education.svg","material-book-heart-outline":"material/book-heart-outline.svg","material-book-heart":"material/book-heart.svg","material-book-information-variant":"material/book-information-variant.svg","material-book-lock-open-outline":"material/book-lock-open-outline.svg","material-book-lock-open":"material/book-lock-open.svg","material-book-lock-outline":"material/book-lock-outline.svg","material-book-lock":"material/book-lock.svg","material-book-marker-outline":"material/book-marker-outline.svg","material-book-marker":"material/book-marker.svg","material-book-minus-multiple-outline":"material/book-minus-multiple-outline.svg","material-book-minus-multiple":"material/book-minus-multiple.svg","material-book-minus-outline":"material/book-minus-outline.svg","material-book-minus":"material/book-minus.svg","material-book-multiple-outline":"material/book-multiple-outline.svg","material-book-multiple":"material/book-multiple.svg","material-book-music-outline":"material/book-music-outline.svg","material-book-music":"material/book-music.svg","material-book-off-outline":"material/book-off-outline.svg","material-book-off":"material/book-off.svg","material-book-open-blank-variant":"material/book-open-blank-variant.svg","material-book-open-outline":"material/book-open-outline.svg","material-book-open-page-variant-outline":"material/book-open-page-variant-outline.svg","material-book-open-page-variant":"material/book-open-page-variant.svg","material-book-open-variant":"material/book-open-variant.svg","material-book-open":"material/book-open.svg","material-book-outline":"material/book-outline.svg","material-book-play-outline":"material/book-play-outline.svg","material-book-play":"material/book-play.svg","material-book-plus-multiple-outline":"material/book-plus-multiple-outline.svg","material-book-plus-multiple":"material/book-plus-multiple.svg","material-book-plus-outline":"material/book-plus-outline.svg","material-book-plus":"material/book-plus.svg","material-book-refresh-outline":"material/book-refresh-outline.svg","material-book-refresh":"material/book-refresh.svg","material-book-remove-multiple-outline":"material/book-remove-multiple-outline.svg","material-book-remove-multiple":"material/book-remove-multiple.svg","material-book-remove-outline":"material/book-remove-outline.svg","material-book-remove":"material/book-remove.svg","material-book-search-outline":"material/book-search-outline.svg","material-book-search":"material/book-search.svg","material-book-settings-outline":"material/book-settings-outline.svg","material-book-settings":"material/book-settings.svg","material-book-sync-outline":"material/book-sync-outline.svg","material-book-sync":"material/book-sync.svg","material-book-variant":"material/book-variant.svg","material-book":"material/book.svg","material-bookmark-box-multiple-outline":"material/bookmark-box-multiple-outline.svg","material-bookmark-box-multiple":"material/bookmark-box-multiple.svg","material-bookmark-box-outline":"material/bookmark-box-outline.svg","material-bookmark-box":"material/bookmark-box.svg","material-bookmark-check-outline":"material/bookmark-check-outline.svg","material-bookmark-check":"material/bookmark-check.svg","material-bookmark-minus-outline":"material/bookmark-minus-outline.svg","material-bookmark-minus":"material/bookmark-minus.svg","material-bookmark-multiple-outline":"material/bookmark-multiple-outline.svg","material-bookmark-multiple":"material/bookmark-multiple.svg","material-bookmark-music-outline":"material/bookmark-music-outline.svg","material-bookmark-music":"material/bookmark-music.svg","material-bookmark-off-outline":"material/bookmark-off-outline.svg","material-bookmark-off":"material/bookmark-off.svg","material-bookmark-outline":"material/bookmark-outline.svg","material-bookmark-plus-outline":"material/bookmark-plus-outline.svg","material-bookmark-plus":"material/bookmark-plus.svg","material-bookmark-remove-outline":"material/bookmark-remove-outline.svg","material-bookmark-remove":"material/bookmark-remove.svg","material-bookmark":"material/bookmark.svg","material-bookshelf":"material/bookshelf.svg","material-boom-gate-alert-outline":"material/boom-gate-alert-outline.svg","material-boom-gate-alert":"material/boom-gate-alert.svg","material-boom-gate-arrow-down-outline":"material/boom-gate-arrow-down-outline.svg","material-boom-gate-arrow-down":"material/boom-gate-arrow-down.svg","material-boom-gate-arrow-up-outline":"material/boom-gate-arrow-up-outline.svg","material-boom-gate-arrow-up":"material/boom-gate-arrow-up.svg","material-boom-gate-outline":"material/boom-gate-outline.svg","material-boom-gate-up-outline":"material/boom-gate-up-outline.svg","material-boom-gate-up":"material/boom-gate-up.svg","material-boom-gate":"material/boom-gate.svg","material-boombox":"material/boombox.svg","material-boomerang":"material/boomerang.svg","material-bootstrap":"material/bootstrap.svg","material-border-all-variant":"material/border-all-variant.svg","material-border-all":"material/border-all.svg","material-border-bottom-variant":"material/border-bottom-variant.svg","material-border-bottom":"material/border-bottom.svg","material-border-color":"material/border-color.svg","material-border-horizontal":"material/border-horizontal.svg","material-border-inside":"material/border-inside.svg","material-border-left-variant":"material/border-left-variant.svg","material-border-left":"material/border-left.svg","material-border-none-variant":"material/border-none-variant.svg","material-border-none":"material/border-none.svg","material-border-outside":"material/border-outside.svg","material-border-radius":"material/border-radius.svg","material-border-right-variant":"material/border-right-variant.svg","material-border-right":"material/border-right.svg","material-border-style":"material/border-style.svg","material-border-top-variant":"material/border-top-variant.svg","material-border-top":"material/border-top.svg","material-border-vertical":"material/border-vertical.svg","material-bottle-soda-classic-outline":"material/bottle-soda-classic-outline.svg","material-bottle-soda-classic":"material/bottle-soda-classic.svg","material-bottle-soda-outline":"material/bottle-soda-outline.svg","material-bottle-soda":"material/bottle-soda.svg","material-bottle-tonic-outline":"material/bottle-tonic-outline.svg","material-bottle-tonic-plus-outline":"material/bottle-tonic-plus-outline.svg","material-bottle-tonic-plus":"material/bottle-tonic-plus.svg","material-bottle-tonic-skull-outline":"material/bottle-tonic-skull-outline.svg","material-bottle-tonic-skull":"material/bottle-tonic-skull.svg","material-bottle-tonic":"material/bottle-tonic.svg","material-bottle-wine-outline":"material/bottle-wine-outline.svg","material-bottle-wine":"material/bottle-wine.svg","material-bow-arrow":"material/bow-arrow.svg","material-bow-tie":"material/bow-tie.svg","material-bowl-mix-outline":"material/bowl-mix-outline.svg","material-bowl-mix":"material/bowl-mix.svg","material-bowl-outline":"material/bowl-outline.svg","material-bowl":"material/bowl.svg","material-bowling":"material/bowling.svg","material-box-cutter-off":"material/box-cutter-off.svg","material-box-cutter":"material/box-cutter.svg","material-box-shadow":"material/box-shadow.svg","material-box":"material/box.svg","material-boxing-glove":"material/boxing-glove.svg","material-braille":"material/braille.svg","material-brain":"material/brain.svg","material-bread-slice-outline":"material/bread-slice-outline.svg","material-bread-slice":"material/bread-slice.svg","material-bridge":"material/bridge.svg","material-briefcase-account-outline":"material/briefcase-account-outline.svg","material-briefcase-account":"material/briefcase-account.svg","material-briefcase-arrow-left-right-outline":"material/briefcase-arrow-left-right-outline.svg","material-briefcase-arrow-left-right":"material/briefcase-arrow-left-right.svg","material-briefcase-arrow-up-down-outline":"material/briefcase-arrow-up-down-outline.svg","material-briefcase-arrow-up-down":"material/briefcase-arrow-up-down.svg","material-briefcase-check-outline":"material/briefcase-check-outline.svg","material-briefcase-check":"material/briefcase-check.svg","material-briefcase-clock-outline":"material/briefcase-clock-outline.svg","material-briefcase-clock":"material/briefcase-clock.svg","material-briefcase-download-outline":"material/briefcase-download-outline.svg","material-briefcase-download":"material/briefcase-download.svg","material-briefcase-edit-outline":"material/briefcase-edit-outline.svg","material-briefcase-edit":"material/briefcase-edit.svg","material-briefcase-eye-outline":"material/briefcase-eye-outline.svg","material-briefcase-eye":"material/briefcase-eye.svg","material-briefcase-minus-outline":"material/briefcase-minus-outline.svg","material-briefcase-minus":"material/briefcase-minus.svg","material-briefcase-off-outline":"material/briefcase-off-outline.svg","material-briefcase-off":"material/briefcase-off.svg","material-briefcase-outline":"material/briefcase-outline.svg","material-briefcase-plus-outline":"material/briefcase-plus-outline.svg","material-briefcase-plus":"material/briefcase-plus.svg","material-briefcase-remove-outline":"material/briefcase-remove-outline.svg","material-briefcase-remove":"material/briefcase-remove.svg","material-briefcase-search-outline":"material/briefcase-search-outline.svg","material-briefcase-search":"material/briefcase-search.svg","material-briefcase-upload-outline":"material/briefcase-upload-outline.svg","material-briefcase-upload":"material/briefcase-upload.svg","material-briefcase-variant-off-outline":"material/briefcase-variant-off-outline.svg","material-briefcase-variant-off":"material/briefcase-variant-off.svg","material-briefcase-variant-outline":"material/briefcase-variant-outline.svg","material-briefcase-variant":"material/briefcase-variant.svg","material-briefcase":"material/briefcase.svg","material-brightness-1":"material/brightness-1.svg","material-brightness-2":"material/brightness-2.svg","material-brightness-3":"material/brightness-3.svg","material-brightness-4":"material/brightness-4.svg","material-brightness-5":"material/brightness-5.svg","material-brightness-6":"material/brightness-6.svg","material-brightness-7":"material/brightness-7.svg","material-brightness-auto":"material/brightness-auto.svg","material-brightness-percent":"material/brightness-percent.svg","material-broadcast-off":"material/broadcast-off.svg","material-broadcast":"material/broadcast.svg","material-broom":"material/broom.svg","material-brush-off":"material/brush-off.svg","material-brush-outline":"material/brush-outline.svg","material-brush-variant":"material/brush-variant.svg","material-brush":"material/brush.svg","material-bucket-outline":"material/bucket-outline.svg","material-bucket":"material/bucket.svg","material-buffet":"material/buffet.svg","material-bug-check-outline":"material/bug-check-outline.svg","material-bug-check":"material/bug-check.svg","material-bug-outline":"material/bug-outline.svg","material-bug-pause-outline":"material/bug-pause-outline.svg","material-bug-pause":"material/bug-pause.svg","material-bug-play-outline":"material/bug-play-outline.svg","material-bug-play":"material/bug-play.svg","material-bug-stop-outline":"material/bug-stop-outline.svg","material-bug-stop":"material/bug-stop.svg","material-bug":"material/bug.svg","material-bugle":"material/bugle.svg","material-bulkhead-light":"material/bulkhead-light.svg","material-bulldozer":"material/bulldozer.svg","material-bullet":"material/bullet.svg","material-bulletin-board":"material/bulletin-board.svg","material-bullhorn-outline":"material/bullhorn-outline.svg","material-bullhorn-variant-outline":"material/bullhorn-variant-outline.svg","material-bullhorn-variant":"material/bullhorn-variant.svg","material-bullhorn":"material/bullhorn.svg","material-bullseye-arrow":"material/bullseye-arrow.svg","material-bullseye":"material/bullseye.svg","material-bulma":"material/bulma.svg","material-bunk-bed-outline":"material/bunk-bed-outline.svg","material-bunk-bed":"material/bunk-bed.svg","material-bus-alert":"material/bus-alert.svg","material-bus-articulated-end":"material/bus-articulated-end.svg","material-bus-articulated-front":"material/bus-articulated-front.svg","material-bus-clock":"material/bus-clock.svg","material-bus-double-decker":"material/bus-double-decker.svg","material-bus-electric":"material/bus-electric.svg","material-bus-marker":"material/bus-marker.svg","material-bus-multiple":"material/bus-multiple.svg","material-bus-school":"material/bus-school.svg","material-bus-side":"material/bus-side.svg","material-bus-stop-covered":"material/bus-stop-covered.svg","material-bus-stop-uncovered":"material/bus-stop-uncovered.svg","material-bus-stop":"material/bus-stop.svg","material-bus":"material/bus.svg","material-butterfly-outline":"material/butterfly-outline.svg","material-butterfly":"material/butterfly.svg","material-button-cursor":"material/button-cursor.svg","material-button-pointer":"material/button-pointer.svg","material-cabin-a-frame":"material/cabin-a-frame.svg","material-cable-data":"material/cable-data.svg","material-cached":"material/cached.svg","material-cactus":"material/cactus.svg","material-cake-layered":"material/cake-layered.svg","material-cake-variant-outline":"material/cake-variant-outline.svg","material-cake-variant":"material/cake-variant.svg","material-cake":"material/cake.svg","material-calculator-variant-outline":"material/calculator-variant-outline.svg","material-calculator-variant":"material/calculator-variant.svg","material-calculator":"material/calculator.svg","material-calendar-account-outline":"material/calendar-account-outline.svg","material-calendar-account":"material/calendar-account.svg","material-calendar-alert-outline":"material/calendar-alert-outline.svg","material-calendar-alert":"material/calendar-alert.svg","material-calendar-arrow-left":"material/calendar-arrow-left.svg","material-calendar-arrow-right":"material/calendar-arrow-right.svg","material-calendar-badge-outline":"material/calendar-badge-outline.svg","material-calendar-badge":"material/calendar-badge.svg","material-calendar-blank-multiple":"material/calendar-blank-multiple.svg","material-calendar-blank-outline":"material/calendar-blank-outline.svg","material-calendar-blank":"material/calendar-blank.svg","material-calendar-check-outline":"material/calendar-check-outline.svg","material-calendar-check":"material/calendar-check.svg","material-calendar-clock-outline":"material/calendar-clock-outline.svg","material-calendar-clock":"material/calendar-clock.svg","material-calendar-collapse-horizontal-outline":"material/calendar-collapse-horizontal-outline.svg","material-calendar-collapse-horizontal":"material/calendar-collapse-horizontal.svg","material-calendar-cursor-outline":"material/calendar-cursor-outline.svg","material-calendar-cursor":"material/calendar-cursor.svg","material-calendar-edit-outline":"material/calendar-edit-outline.svg","material-calendar-edit":"material/calendar-edit.svg","material-calendar-end-outline":"material/calendar-end-outline.svg","material-calendar-end":"material/calendar-end.svg","material-calendar-expand-horizontal-outline":"material/calendar-expand-horizontal-outline.svg","material-calendar-expand-horizontal":"material/calendar-expand-horizontal.svg","material-calendar-export-outline":"material/calendar-export-outline.svg","material-calendar-export":"material/calendar-export.svg","material-calendar-filter-outline":"material/calendar-filter-outline.svg","material-calendar-filter":"material/calendar-filter.svg","material-calendar-heart-outline":"material/calendar-heart-outline.svg","material-calendar-heart":"material/calendar-heart.svg","material-calendar-import-outline":"material/calendar-import-outline.svg","material-calendar-import":"material/calendar-import.svg","material-calendar-lock-open-outline":"material/calendar-lock-open-outline.svg","material-calendar-lock-open":"material/calendar-lock-open.svg","material-calendar-lock-outline":"material/calendar-lock-outline.svg","material-calendar-lock":"material/calendar-lock.svg","material-calendar-minus-outline":"material/calendar-minus-outline.svg","material-calendar-minus":"material/calendar-minus.svg","material-calendar-month-outline":"material/calendar-month-outline.svg","material-calendar-month":"material/calendar-month.svg","material-calendar-multiple-check":"material/calendar-multiple-check.svg","material-calendar-multiple":"material/calendar-multiple.svg","material-calendar-multiselect-outline":"material/calendar-multiselect-outline.svg","material-calendar-multiselect":"material/calendar-multiselect.svg","material-calendar-outline":"material/calendar-outline.svg","material-calendar-plus-outline":"material/calendar-plus-outline.svg","material-calendar-plus":"material/calendar-plus.svg","material-calendar-question-outline":"material/calendar-question-outline.svg","material-calendar-question":"material/calendar-question.svg","material-calendar-range-outline":"material/calendar-range-outline.svg","material-calendar-range":"material/calendar-range.svg","material-calendar-refresh-outline":"material/calendar-refresh-outline.svg","material-calendar-refresh":"material/calendar-refresh.svg","material-calendar-remove-outline":"material/calendar-remove-outline.svg","material-calendar-remove":"material/calendar-remove.svg","material-calendar-search-outline":"material/calendar-search-outline.svg","material-calendar-search":"material/calendar-search.svg","material-calendar-star-outline":"material/calendar-star-outline.svg","material-calendar-star":"material/calendar-star.svg","material-calendar-start-outline":"material/calendar-start-outline.svg","material-calendar-start":"material/calendar-start.svg","material-calendar-sync-outline":"material/calendar-sync-outline.svg","material-calendar-sync":"material/calendar-sync.svg","material-calendar-text-outline":"material/calendar-text-outline.svg","material-calendar-text":"material/calendar-text.svg","material-calendar-today-outline":"material/calendar-today-outline.svg","material-calendar-today":"material/calendar-today.svg","material-calendar-week-begin-outline":"material/calendar-week-begin-outline.svg","material-calendar-week-begin":"material/calendar-week-begin.svg","material-calendar-week-outline":"material/calendar-week-outline.svg","material-calendar-week":"material/calendar-week.svg","material-calendar-weekend-outline":"material/calendar-weekend-outline.svg","material-calendar-weekend":"material/calendar-weekend.svg","material-calendar":"material/calendar.svg","material-call-made":"material/call-made.svg","material-call-merge":"material/call-merge.svg","material-call-missed":"material/call-missed.svg","material-call-received":"material/call-received.svg","material-call-split":"material/call-split.svg","material-camcorder-off":"material/camcorder-off.svg","material-camcorder":"material/camcorder.svg","material-camera-account":"material/camera-account.svg","material-camera-burst":"material/camera-burst.svg","material-camera-control":"material/camera-control.svg","material-camera-document-off":"material/camera-document-off.svg","material-camera-document":"material/camera-document.svg","material-camera-enhance-outline":"material/camera-enhance-outline.svg","material-camera-enhance":"material/camera-enhance.svg","material-camera-flip-outline":"material/camera-flip-outline.svg","material-camera-flip":"material/camera-flip.svg","material-camera-front-variant":"material/camera-front-variant.svg","material-camera-front":"material/camera-front.svg","material-camera-gopro":"material/camera-gopro.svg","material-camera-image":"material/camera-image.svg","material-camera-iris":"material/camera-iris.svg","material-camera-lock-outline":"material/camera-lock-outline.svg","material-camera-lock":"material/camera-lock.svg","material-camera-marker-outline":"material/camera-marker-outline.svg","material-camera-marker":"material/camera-marker.svg","material-camera-metering-center":"material/camera-metering-center.svg","material-camera-metering-matrix":"material/camera-metering-matrix.svg","material-camera-metering-partial":"material/camera-metering-partial.svg","material-camera-metering-spot":"material/camera-metering-spot.svg","material-camera-off-outline":"material/camera-off-outline.svg","material-camera-off":"material/camera-off.svg","material-camera-outline":"material/camera-outline.svg","material-camera-party-mode":"material/camera-party-mode.svg","material-camera-plus-outline":"material/camera-plus-outline.svg","material-camera-plus":"material/camera-plus.svg","material-camera-rear-variant":"material/camera-rear-variant.svg","material-camera-rear":"material/camera-rear.svg","material-camera-retake-outline":"material/camera-retake-outline.svg","material-camera-retake":"material/camera-retake.svg","material-camera-switch-outline":"material/camera-switch-outline.svg","material-camera-switch":"material/camera-switch.svg","material-camera-timer":"material/camera-timer.svg","material-camera-wireless-outline":"material/camera-wireless-outline.svg","material-camera-wireless":"material/camera-wireless.svg","material-camera":"material/camera.svg","material-campfire":"material/campfire.svg","material-cancel":"material/cancel.svg","material-candelabra-fire":"material/candelabra-fire.svg","material-candelabra":"material/candelabra.svg","material-candle":"material/candle.svg","material-candy-off-outline":"material/candy-off-outline.svg","material-candy-off":"material/candy-off.svg","material-candy-outline":"material/candy-outline.svg","material-candy":"material/candy.svg","material-candycane":"material/candycane.svg","material-cannabis-off":"material/cannabis-off.svg","material-cannabis":"material/cannabis.svg","material-caps-lock":"material/caps-lock.svg","material-car-2-plus":"material/car-2-plus.svg","material-car-3-plus":"material/car-3-plus.svg","material-car-arrow-left":"material/car-arrow-left.svg","material-car-arrow-right":"material/car-arrow-right.svg","material-car-back":"material/car-back.svg","material-car-battery":"material/car-battery.svg","material-car-brake-abs":"material/car-brake-abs.svg","material-car-brake-alert":"material/car-brake-alert.svg","material-car-brake-fluid-level":"material/car-brake-fluid-level.svg","material-car-brake-hold":"material/car-brake-hold.svg","material-car-brake-low-pressure":"material/car-brake-low-pressure.svg","material-car-brake-parking":"material/car-brake-parking.svg","material-car-brake-retarder":"material/car-brake-retarder.svg","material-car-brake-temperature":"material/car-brake-temperature.svg","material-car-brake-worn-linings":"material/car-brake-worn-linings.svg","material-car-child-seat":"material/car-child-seat.svg","material-car-clock":"material/car-clock.svg","material-car-clutch":"material/car-clutch.svg","material-car-cog":"material/car-cog.svg","material-car-connected":"material/car-connected.svg","material-car-convertible":"material/car-convertible.svg","material-car-coolant-level":"material/car-coolant-level.svg","material-car-cruise-control":"material/car-cruise-control.svg","material-car-defrost-front":"material/car-defrost-front.svg","material-car-defrost-rear":"material/car-defrost-rear.svg","material-car-door-lock":"material/car-door-lock.svg","material-car-door":"material/car-door.svg","material-car-electric-outline":"material/car-electric-outline.svg","material-car-electric":"material/car-electric.svg","material-car-emergency":"material/car-emergency.svg","material-car-esp":"material/car-esp.svg","material-car-estate":"material/car-estate.svg","material-car-hatchback":"material/car-hatchback.svg","material-car-info":"material/car-info.svg","material-car-key":"material/car-key.svg","material-car-lifted-pickup":"material/car-lifted-pickup.svg","material-car-light-alert":"material/car-light-alert.svg","material-car-light-dimmed":"material/car-light-dimmed.svg","material-car-light-fog":"material/car-light-fog.svg","material-car-light-high":"material/car-light-high.svg","material-car-limousine":"material/car-limousine.svg","material-car-multiple":"material/car-multiple.svg","material-car-off":"material/car-off.svg","material-car-outline":"material/car-outline.svg","material-car-parking-lights":"material/car-parking-lights.svg","material-car-pickup":"material/car-pickup.svg","material-car-search-outline":"material/car-search-outline.svg","material-car-search":"material/car-search.svg","material-car-seat-cooler":"material/car-seat-cooler.svg","material-car-seat-heater":"material/car-seat-heater.svg","material-car-seat":"material/car-seat.svg","material-car-select":"material/car-select.svg","material-car-settings":"material/car-settings.svg","material-car-shift-pattern":"material/car-shift-pattern.svg","material-car-side":"material/car-side.svg","material-car-speed-limiter":"material/car-speed-limiter.svg","material-car-sports":"material/car-sports.svg","material-car-tire-alert":"material/car-tire-alert.svg","material-car-traction-control":"material/car-traction-control.svg","material-car-turbocharger":"material/car-turbocharger.svg","material-car-wash":"material/car-wash.svg","material-car-windshield-outline":"material/car-windshield-outline.svg","material-car-windshield":"material/car-windshield.svg","material-car-wireless":"material/car-wireless.svg","material-car-wrench":"material/car-wrench.svg","material-car":"material/car.svg","material-carabiner":"material/carabiner.svg","material-caravan":"material/caravan.svg","material-card-account-details-outline":"material/card-account-details-outline.svg","material-card-account-details-star-outline":"material/card-account-details-star-outline.svg","material-card-account-details-star":"material/card-account-details-star.svg","material-card-account-details":"material/card-account-details.svg","material-card-account-mail-outline":"material/card-account-mail-outline.svg","material-card-account-mail":"material/card-account-mail.svg","material-card-account-phone-outline":"material/card-account-phone-outline.svg","material-card-account-phone":"material/card-account-phone.svg","material-card-bulleted-off-outline":"material/card-bulleted-off-outline.svg","material-card-bulleted-off":"material/card-bulleted-off.svg","material-card-bulleted-outline":"material/card-bulleted-outline.svg","material-card-bulleted-settings-outline":"material/card-bulleted-settings-outline.svg","material-card-bulleted-settings":"material/card-bulleted-settings.svg","material-card-bulleted":"material/card-bulleted.svg","material-card-minus-outline":"material/card-minus-outline.svg","material-card-minus":"material/card-minus.svg","material-card-multiple-outline":"material/card-multiple-outline.svg","material-card-multiple":"material/card-multiple.svg","material-card-off-outline":"material/card-off-outline.svg","material-card-off":"material/card-off.svg","material-card-outline":"material/card-outline.svg","material-card-plus-outline":"material/card-plus-outline.svg","material-card-plus":"material/card-plus.svg","material-card-remove-outline":"material/card-remove-outline.svg","material-card-remove":"material/card-remove.svg","material-card-search-outline":"material/card-search-outline.svg","material-card-search":"material/card-search.svg","material-card-text-outline":"material/card-text-outline.svg","material-card-text":"material/card-text.svg","material-card":"material/card.svg","material-cards-club-outline":"material/cards-club-outline.svg","material-cards-club":"material/cards-club.svg","material-cards-diamond-outline":"material/cards-diamond-outline.svg","material-cards-diamond":"material/cards-diamond.svg","material-cards-heart-outline":"material/cards-heart-outline.svg","material-cards-heart":"material/cards-heart.svg","material-cards-outline":"material/cards-outline.svg","material-cards-playing-club-multiple-outline":"material/cards-playing-club-multiple-outline.svg","material-cards-playing-club-multiple":"material/cards-playing-club-multiple.svg","material-cards-playing-club-outline":"material/cards-playing-club-outline.svg","material-cards-playing-club":"material/cards-playing-club.svg","material-cards-playing-diamond-multiple-outline":"material/cards-playing-diamond-multiple-outline.svg","material-cards-playing-diamond-multiple":"material/cards-playing-diamond-multiple.svg","material-cards-playing-diamond-outline":"material/cards-playing-diamond-outline.svg","material-cards-playing-diamond":"material/cards-playing-diamond.svg","material-cards-playing-heart-multiple-outline":"material/cards-playing-heart-multiple-outline.svg","material-cards-playing-heart-multiple":"material/cards-playing-heart-multiple.svg","material-cards-playing-heart-outline":"material/cards-playing-heart-outline.svg","material-cards-playing-heart":"material/cards-playing-heart.svg","material-cards-playing-outline":"material/cards-playing-outline.svg","material-cards-playing-spade-multiple-outline":"material/cards-playing-spade-multiple-outline.svg","material-cards-playing-spade-multiple":"material/cards-playing-spade-multiple.svg","material-cards-playing-spade-outline":"material/cards-playing-spade-outline.svg","material-cards-playing-spade":"material/cards-playing-spade.svg","material-cards-playing":"material/cards-playing.svg","material-cards-spade-outline":"material/cards-spade-outline.svg","material-cards-spade":"material/cards-spade.svg","material-cards-variant":"material/cards-variant.svg","material-cards":"material/cards.svg","material-carrot":"material/carrot.svg","material-cart-arrow-down":"material/cart-arrow-down.svg","material-cart-arrow-right":"material/cart-arrow-right.svg","material-cart-arrow-up":"material/cart-arrow-up.svg","material-cart-check":"material/cart-check.svg","material-cart-heart":"material/cart-heart.svg","material-cart-minus":"material/cart-minus.svg","material-cart-off":"material/cart-off.svg","material-cart-outline":"material/cart-outline.svg","material-cart-percent":"material/cart-percent.svg","material-cart-plus":"material/cart-plus.svg","material-cart-remove":"material/cart-remove.svg","material-cart-variant":"material/cart-variant.svg","material-cart":"material/cart.svg","material-case-sensitive-alt":"material/case-sensitive-alt.svg","material-cash-100":"material/cash-100.svg","material-cash-check":"material/cash-check.svg","material-cash-clock":"material/cash-clock.svg","material-cash-fast":"material/cash-fast.svg","material-cash-lock-open":"material/cash-lock-open.svg","material-cash-lock":"material/cash-lock.svg","material-cash-marker":"material/cash-marker.svg","material-cash-minus":"material/cash-minus.svg","material-cash-multiple":"material/cash-multiple.svg","material-cash-plus":"material/cash-plus.svg","material-cash-refund":"material/cash-refund.svg","material-cash-register":"material/cash-register.svg","material-cash-remove":"material/cash-remove.svg","material-cash-sync":"material/cash-sync.svg","material-cash":"material/cash.svg","material-cassette":"material/cassette.svg","material-cast-audio-variant":"material/cast-audio-variant.svg","material-cast-audio":"material/cast-audio.svg","material-cast-connected":"material/cast-connected.svg","material-cast-education":"material/cast-education.svg","material-cast-off":"material/cast-off.svg","material-cast-variant":"material/cast-variant.svg","material-cast":"material/cast.svg","material-castle":"material/castle.svg","material-cat":"material/cat.svg","material-cctv-off":"material/cctv-off.svg","material-cctv":"material/cctv.svg","material-ceiling-fan-light":"material/ceiling-fan-light.svg","material-ceiling-fan":"material/ceiling-fan.svg","material-ceiling-light-multiple-outline":"material/ceiling-light-multiple-outline.svg","material-ceiling-light-multiple":"material/ceiling-light-multiple.svg","material-ceiling-light-outline":"material/ceiling-light-outline.svg","material-ceiling-light":"material/ceiling-light.svg","material-cellphone-arrow-down-variant":"material/cellphone-arrow-down-variant.svg","material-cellphone-arrow-down":"material/cellphone-arrow-down.svg","material-cellphone-basic":"material/cellphone-basic.svg","material-cellphone-charging":"material/cellphone-charging.svg","material-cellphone-check":"material/cellphone-check.svg","material-cellphone-cog":"material/cellphone-cog.svg","material-cellphone-dock":"material/cellphone-dock.svg","material-cellphone-information":"material/cellphone-information.svg","material-cellphone-key":"material/cellphone-key.svg","material-cellphone-link-off":"material/cellphone-link-off.svg","material-cellphone-link":"material/cellphone-link.svg","material-cellphone-lock":"material/cellphone-lock.svg","material-cellphone-marker":"material/cellphone-marker.svg","material-cellphone-message-off":"material/cellphone-message-off.svg","material-cellphone-message":"material/cellphone-message.svg","material-cellphone-nfc-off":"material/cellphone-nfc-off.svg","material-cellphone-nfc":"material/cellphone-nfc.svg","material-cellphone-off":"material/cellphone-off.svg","material-cellphone-play":"material/cellphone-play.svg","material-cellphone-remove":"material/cellphone-remove.svg","material-cellphone-screenshot":"material/cellphone-screenshot.svg","material-cellphone-settings":"material/cellphone-settings.svg","material-cellphone-sound":"material/cellphone-sound.svg","material-cellphone-text":"material/cellphone-text.svg","material-cellphone-wireless":"material/cellphone-wireless.svg","material-cellphone":"material/cellphone.svg","material-centos":"material/centos.svg","material-certificate-outline":"material/certificate-outline.svg","material-certificate":"material/certificate.svg","material-chair-rolling":"material/chair-rolling.svg","material-chair-school":"material/chair-school.svg","material-chandelier":"material/chandelier.svg","material-charity":"material/charity.svg","material-chart-arc":"material/chart-arc.svg","material-chart-areaspline-variant":"material/chart-areaspline-variant.svg","material-chart-areaspline":"material/chart-areaspline.svg","material-chart-bar-stacked":"material/chart-bar-stacked.svg","material-chart-bar":"material/chart-bar.svg","material-chart-bell-curve-cumulative":"material/chart-bell-curve-cumulative.svg","material-chart-bell-curve":"material/chart-bell-curve.svg","material-chart-box-outline":"material/chart-box-outline.svg","material-chart-box-plus-outline":"material/chart-box-plus-outline.svg","material-chart-box":"material/chart-box.svg","material-chart-bubble":"material/chart-bubble.svg","material-chart-donut-variant":"material/chart-donut-variant.svg","material-chart-donut":"material/chart-donut.svg","material-chart-gantt":"material/chart-gantt.svg","material-chart-histogram":"material/chart-histogram.svg","material-chart-line-stacked":"material/chart-line-stacked.svg","material-chart-line-variant":"material/chart-line-variant.svg","material-chart-line":"material/chart-line.svg","material-chart-multiline":"material/chart-multiline.svg","material-chart-multiple":"material/chart-multiple.svg","material-chart-pie":"material/chart-pie.svg","material-chart-ppf":"material/chart-ppf.svg","material-chart-sankey-variant":"material/chart-sankey-variant.svg","material-chart-sankey":"material/chart-sankey.svg","material-chart-scatter-plot-hexbin":"material/chart-scatter-plot-hexbin.svg","material-chart-scatter-plot":"material/chart-scatter-plot.svg","material-chart-timeline-variant-shimmer":"material/chart-timeline-variant-shimmer.svg","material-chart-timeline-variant":"material/chart-timeline-variant.svg","material-chart-timeline":"material/chart-timeline.svg","material-chart-tree":"material/chart-tree.svg","material-chart-waterfall":"material/chart-waterfall.svg","material-chat-alert-outline":"material/chat-alert-outline.svg","material-chat-alert":"material/chat-alert.svg","material-chat-minus-outline":"material/chat-minus-outline.svg","material-chat-minus":"material/chat-minus.svg","material-chat-outline":"material/chat-outline.svg","material-chat-plus-outline":"material/chat-plus-outline.svg","material-chat-plus":"material/chat-plus.svg","material-chat-processing-outline":"material/chat-processing-outline.svg","material-chat-processing":"material/chat-processing.svg","material-chat-question-outline":"material/chat-question-outline.svg","material-chat-question":"material/chat-question.svg","material-chat-remove-outline":"material/chat-remove-outline.svg","material-chat-remove":"material/chat-remove.svg","material-chat-sleep-outline":"material/chat-sleep-outline.svg","material-chat-sleep":"material/chat-sleep.svg","material-chat":"material/chat.svg","material-check-all":"material/check-all.svg","material-check-bold":"material/check-bold.svg","material-check-circle-outline":"material/check-circle-outline.svg","material-check-circle":"material/check-circle.svg","material-check-decagram-outline":"material/check-decagram-outline.svg","material-check-decagram":"material/check-decagram.svg","material-check-network-outline":"material/check-network-outline.svg","material-check-network":"material/check-network.svg","material-check-outline":"material/check-outline.svg","material-check-underline-circle-outline":"material/check-underline-circle-outline.svg","material-check-underline-circle":"material/check-underline-circle.svg","material-check-underline":"material/check-underline.svg","material-check":"material/check.svg","material-checkbook":"material/checkbook.svg","material-checkbox-blank-badge-outline":"material/checkbox-blank-badge-outline.svg","material-checkbox-blank-badge":"material/checkbox-blank-badge.svg","material-checkbox-blank-circle-outline":"material/checkbox-blank-circle-outline.svg","material-checkbox-blank-circle":"material/checkbox-blank-circle.svg","material-checkbox-blank-off-outline":"material/checkbox-blank-off-outline.svg","material-checkbox-blank-off":"material/checkbox-blank-off.svg","material-checkbox-blank-outline":"material/checkbox-blank-outline.svg","material-checkbox-blank":"material/checkbox-blank.svg","material-checkbox-intermediate-variant":"material/checkbox-intermediate-variant.svg","material-checkbox-intermediate":"material/checkbox-intermediate.svg","material-checkbox-marked-circle-outline":"material/checkbox-marked-circle-outline.svg","material-checkbox-marked-circle-plus-outline":"material/checkbox-marked-circle-plus-outline.svg","material-checkbox-marked-circle":"material/checkbox-marked-circle.svg","material-checkbox-marked-outline":"material/checkbox-marked-outline.svg","material-checkbox-marked":"material/checkbox-marked.svg","material-checkbox-multiple-blank-circle-outline":"material/checkbox-multiple-blank-circle-outline.svg","material-checkbox-multiple-blank-circle":"material/checkbox-multiple-blank-circle.svg","material-checkbox-multiple-blank-outline":"material/checkbox-multiple-blank-outline.svg","material-checkbox-multiple-blank":"material/checkbox-multiple-blank.svg","material-checkbox-multiple-marked-circle-outline":"material/checkbox-multiple-marked-circle-outline.svg","material-checkbox-multiple-marked-circle":"material/checkbox-multiple-marked-circle.svg","material-checkbox-multiple-marked-outline":"material/checkbox-multiple-marked-outline.svg","material-checkbox-multiple-marked":"material/checkbox-multiple-marked.svg","material-checkbox-multiple-outline":"material/checkbox-multiple-outline.svg","material-checkbox-outline":"material/checkbox-outline.svg","material-checkerboard-minus":"material/checkerboard-minus.svg","material-checkerboard-plus":"material/checkerboard-plus.svg","material-checkerboard-remove":"material/checkerboard-remove.svg","material-checkerboard":"material/checkerboard.svg","material-cheese-off":"material/cheese-off.svg","material-cheese":"material/cheese.svg","material-chef-hat":"material/chef-hat.svg","material-chemical-weapon":"material/chemical-weapon.svg","material-chess-bishop":"material/chess-bishop.svg","material-chess-king":"material/chess-king.svg","material-chess-knight":"material/chess-knight.svg","material-chess-pawn":"material/chess-pawn.svg","material-chess-queen":"material/chess-queen.svg","material-chess-rook":"material/chess-rook.svg","material-chevron-double-down":"material/chevron-double-down.svg","material-chevron-double-left":"material/chevron-double-left.svg","material-chevron-double-right":"material/chevron-double-right.svg","material-chevron-double-up":"material/chevron-double-up.svg","material-chevron-down-box-outline":"material/chevron-down-box-outline.svg","material-chevron-down-box":"material/chevron-down-box.svg","material-chevron-down-circle-outline":"material/chevron-down-circle-outline.svg","material-chevron-down-circle":"material/chevron-down-circle.svg","material-chevron-down":"material/chevron-down.svg","material-chevron-left-box-outline":"material/chevron-left-box-outline.svg","material-chevron-left-box":"material/chevron-left-box.svg","material-chevron-left-circle-outline":"material/chevron-left-circle-outline.svg","material-chevron-left-circle":"material/chevron-left-circle.svg","material-chevron-left":"material/chevron-left.svg","material-chevron-right-box-outline":"material/chevron-right-box-outline.svg","material-chevron-right-box":"material/chevron-right-box.svg","material-chevron-right-circle-outline":"material/chevron-right-circle-outline.svg","material-chevron-right-circle":"material/chevron-right-circle.svg","material-chevron-right":"material/chevron-right.svg","material-chevron-triple-down":"material/chevron-triple-down.svg","material-chevron-triple-left":"material/chevron-triple-left.svg","material-chevron-triple-right":"material/chevron-triple-right.svg","material-chevron-triple-up":"material/chevron-triple-up.svg","material-chevron-up-box-outline":"material/chevron-up-box-outline.svg","material-chevron-up-box":"material/chevron-up-box.svg","material-chevron-up-circle-outline":"material/chevron-up-circle-outline.svg","material-chevron-up-circle":"material/chevron-up-circle.svg","material-chevron-up":"material/chevron-up.svg","material-chili-alert-outline":"material/chili-alert-outline.svg","material-chili-alert":"material/chili-alert.svg","material-chili-hot-outline":"material/chili-hot-outline.svg","material-chili-hot":"material/chili-hot.svg","material-chili-medium-outline":"material/chili-medium-outline.svg","material-chili-medium":"material/chili-medium.svg","material-chili-mild-outline":"material/chili-mild-outline.svg","material-chili-mild":"material/chili-mild.svg","material-chili-off-outline":"material/chili-off-outline.svg","material-chili-off":"material/chili-off.svg","material-chip":"material/chip.svg","material-church-outline":"material/church-outline.svg","material-church":"material/church.svg","material-cigar-off":"material/cigar-off.svg","material-cigar":"material/cigar.svg","material-circle-box-outline":"material/circle-box-outline.svg","material-circle-box":"material/circle-box.svg","material-circle-double":"material/circle-double.svg","material-circle-edit-outline":"material/circle-edit-outline.svg","material-circle-expand":"material/circle-expand.svg","material-circle-half-full":"material/circle-half-full.svg","material-circle-half":"material/circle-half.svg","material-circle-medium":"material/circle-medium.svg","material-circle-multiple-outline":"material/circle-multiple-outline.svg","material-circle-multiple":"material/circle-multiple.svg","material-circle-off-outline":"material/circle-off-outline.svg","material-circle-opacity":"material/circle-opacity.svg","material-circle-outline":"material/circle-outline.svg","material-circle-slice-1":"material/circle-slice-1.svg","material-circle-slice-2":"material/circle-slice-2.svg","material-circle-slice-3":"material/circle-slice-3.svg","material-circle-slice-4":"material/circle-slice-4.svg","material-circle-slice-5":"material/circle-slice-5.svg","material-circle-slice-6":"material/circle-slice-6.svg","material-circle-slice-7":"material/circle-slice-7.svg","material-circle-slice-8":"material/circle-slice-8.svg","material-circle-small":"material/circle-small.svg","material-circle":"material/circle.svg","material-circular-saw":"material/circular-saw.svg","material-city-variant-outline":"material/city-variant-outline.svg","material-city-variant":"material/city-variant.svg","material-city":"material/city.svg","material-clipboard-account-outline":"material/clipboard-account-outline.svg","material-clipboard-account":"material/clipboard-account.svg","material-clipboard-alert-outline":"material/clipboard-alert-outline.svg","material-clipboard-alert":"material/clipboard-alert.svg","material-clipboard-arrow-down-outline":"material/clipboard-arrow-down-outline.svg","material-clipboard-arrow-down":"material/clipboard-arrow-down.svg","material-clipboard-arrow-left-outline":"material/clipboard-arrow-left-outline.svg","material-clipboard-arrow-left":"material/clipboard-arrow-left.svg","material-clipboard-arrow-right-outline":"material/clipboard-arrow-right-outline.svg","material-clipboard-arrow-right":"material/clipboard-arrow-right.svg","material-clipboard-arrow-up-outline":"material/clipboard-arrow-up-outline.svg","material-clipboard-arrow-up":"material/clipboard-arrow-up.svg","material-clipboard-check-multiple-outline":"material/clipboard-check-multiple-outline.svg","material-clipboard-check-multiple":"material/clipboard-check-multiple.svg","material-clipboard-check-outline":"material/clipboard-check-outline.svg","material-clipboard-check":"material/clipboard-check.svg","material-clipboard-clock-outline":"material/clipboard-clock-outline.svg","material-clipboard-clock":"material/clipboard-clock.svg","material-clipboard-edit-outline":"material/clipboard-edit-outline.svg","material-clipboard-edit":"material/clipboard-edit.svg","material-clipboard-file-outline":"material/clipboard-file-outline.svg","material-clipboard-file":"material/clipboard-file.svg","material-clipboard-flow-outline":"material/clipboard-flow-outline.svg","material-clipboard-flow":"material/clipboard-flow.svg","material-clipboard-list-outline":"material/clipboard-list-outline.svg","material-clipboard-list":"material/clipboard-list.svg","material-clipboard-minus-outline":"material/clipboard-minus-outline.svg","material-clipboard-minus":"material/clipboard-minus.svg","material-clipboard-multiple-outline":"material/clipboard-multiple-outline.svg","material-clipboard-multiple":"material/clipboard-multiple.svg","material-clipboard-off-outline":"material/clipboard-off-outline.svg","material-clipboard-off":"material/clipboard-off.svg","material-clipboard-outline":"material/clipboard-outline.svg","material-clipboard-play-multiple-outline":"material/clipboard-play-multiple-outline.svg","material-clipboard-play-multiple":"material/clipboard-play-multiple.svg","material-clipboard-play-outline":"material/clipboard-play-outline.svg","material-clipboard-play":"material/clipboard-play.svg","material-clipboard-plus-outline":"material/clipboard-plus-outline.svg","material-clipboard-plus":"material/clipboard-plus.svg","material-clipboard-pulse-outline":"material/clipboard-pulse-outline.svg","material-clipboard-pulse":"material/clipboard-pulse.svg","material-clipboard-remove-outline":"material/clipboard-remove-outline.svg","material-clipboard-remove":"material/clipboard-remove.svg","material-clipboard-search-outline":"material/clipboard-search-outline.svg","material-clipboard-search":"material/clipboard-search.svg","material-clipboard-text-clock-outline":"material/clipboard-text-clock-outline.svg","material-clipboard-text-clock":"material/clipboard-text-clock.svg","material-clipboard-text-multiple-outline":"material/clipboard-text-multiple-outline.svg","material-clipboard-text-multiple":"material/clipboard-text-multiple.svg","material-clipboard-text-off-outline":"material/clipboard-text-off-outline.svg","material-clipboard-text-off":"material/clipboard-text-off.svg","material-clipboard-text-outline":"material/clipboard-text-outline.svg","material-clipboard-text-play-outline":"material/clipboard-text-play-outline.svg","material-clipboard-text-play":"material/clipboard-text-play.svg","material-clipboard-text-search-outline":"material/clipboard-text-search-outline.svg","material-clipboard-text-search":"material/clipboard-text-search.svg","material-clipboard-text":"material/clipboard-text.svg","material-clipboard":"material/clipboard.svg","material-clippy":"material/clippy.svg","material-clock-alert-outline":"material/clock-alert-outline.svg","material-clock-alert":"material/clock-alert.svg","material-clock-check-outline":"material/clock-check-outline.svg","material-clock-check":"material/clock-check.svg","material-clock-digital":"material/clock-digital.svg","material-clock-edit-outline":"material/clock-edit-outline.svg","material-clock-edit":"material/clock-edit.svg","material-clock-end":"material/clock-end.svg","material-clock-fast":"material/clock-fast.svg","material-clock-in":"material/clock-in.svg","material-clock-minus-outline":"material/clock-minus-outline.svg","material-clock-minus":"material/clock-minus.svg","material-clock-out":"material/clock-out.svg","material-clock-outline":"material/clock-outline.svg","material-clock-plus-outline":"material/clock-plus-outline.svg","material-clock-plus":"material/clock-plus.svg","material-clock-remove-outline":"material/clock-remove-outline.svg","material-clock-remove":"material/clock-remove.svg","material-clock-start":"material/clock-start.svg","material-clock-time-eight-outline":"material/clock-time-eight-outline.svg","material-clock-time-eight":"material/clock-time-eight.svg","material-clock-time-eleven-outline":"material/clock-time-eleven-outline.svg","material-clock-time-eleven":"material/clock-time-eleven.svg","material-clock-time-five-outline":"material/clock-time-five-outline.svg","material-clock-time-five":"material/clock-time-five.svg","material-clock-time-four-outline":"material/clock-time-four-outline.svg","material-clock-time-four":"material/clock-time-four.svg","material-clock-time-nine-outline":"material/clock-time-nine-outline.svg","material-clock-time-nine":"material/clock-time-nine.svg","material-clock-time-one-outline":"material/clock-time-one-outline.svg","material-clock-time-one":"material/clock-time-one.svg","material-clock-time-seven-outline":"material/clock-time-seven-outline.svg","material-clock-time-seven":"material/clock-time-seven.svg","material-clock-time-six-outline":"material/clock-time-six-outline.svg","material-clock-time-six":"material/clock-time-six.svg","material-clock-time-ten-outline":"material/clock-time-ten-outline.svg","material-clock-time-ten":"material/clock-time-ten.svg","material-clock-time-three-outline":"material/clock-time-three-outline.svg","material-clock-time-three":"material/clock-time-three.svg","material-clock-time-twelve-outline":"material/clock-time-twelve-outline.svg","material-clock-time-twelve":"material/clock-time-twelve.svg","material-clock-time-two-outline":"material/clock-time-two-outline.svg","material-clock-time-two":"material/clock-time-two.svg","material-clock":"material/clock.svg","material-close-box-multiple-outline":"material/close-box-multiple-outline.svg","material-close-box-multiple":"material/close-box-multiple.svg","material-close-box-outline":"material/close-box-outline.svg","material-close-box":"material/close-box.svg","material-close-circle-multiple-outline":"material/close-circle-multiple-outline.svg","material-close-circle-multiple":"material/close-circle-multiple.svg","material-close-circle-outline":"material/close-circle-outline.svg","material-close-circle":"material/close-circle.svg","material-close-network-outline":"material/close-network-outline.svg","material-close-network":"material/close-network.svg","material-close-octagon-outline":"material/close-octagon-outline.svg","material-close-octagon":"material/close-octagon.svg","material-close-outline":"material/close-outline.svg","material-close-thick":"material/close-thick.svg","material-close":"material/close.svg","material-closed-caption-outline":"material/closed-caption-outline.svg","material-closed-caption":"material/closed-caption.svg","material-cloud-alert":"material/cloud-alert.svg","material-cloud-braces":"material/cloud-braces.svg","material-cloud-check-outline":"material/cloud-check-outline.svg","material-cloud-check":"material/cloud-check.svg","material-cloud-circle":"material/cloud-circle.svg","material-cloud-download-outline":"material/cloud-download-outline.svg","material-cloud-download":"material/cloud-download.svg","material-cloud-lock-outline":"material/cloud-lock-outline.svg","material-cloud-lock":"material/cloud-lock.svg","material-cloud-off-outline":"material/cloud-off-outline.svg","material-cloud-outline":"material/cloud-outline.svg","material-cloud-percent-outline":"material/cloud-percent-outline.svg","material-cloud-percent":"material/cloud-percent.svg","material-cloud-print-outline":"material/cloud-print-outline.svg","material-cloud-print":"material/cloud-print.svg","material-cloud-question":"material/cloud-question.svg","material-cloud-refresh":"material/cloud-refresh.svg","material-cloud-search-outline":"material/cloud-search-outline.svg","material-cloud-search":"material/cloud-search.svg","material-cloud-sync-outline":"material/cloud-sync-outline.svg","material-cloud-sync":"material/cloud-sync.svg","material-cloud-tags":"material/cloud-tags.svg","material-cloud-upload-outline":"material/cloud-upload-outline.svg","material-cloud-upload":"material/cloud-upload.svg","material-cloud":"material/cloud.svg","material-clouds":"material/clouds.svg","material-clover":"material/clover.svg","material-coach-lamp-variant":"material/coach-lamp-variant.svg","material-coach-lamp":"material/coach-lamp.svg","material-coat-rack":"material/coat-rack.svg","material-code-array":"material/code-array.svg","material-code-braces-box":"material/code-braces-box.svg","material-code-braces":"material/code-braces.svg","material-code-brackets":"material/code-brackets.svg","material-code-equal":"material/code-equal.svg","material-code-greater-than-or-equal":"material/code-greater-than-or-equal.svg","material-code-greater-than":"material/code-greater-than.svg","material-code-json":"material/code-json.svg","material-code-less-than-or-equal":"material/code-less-than-or-equal.svg","material-code-less-than":"material/code-less-than.svg","material-code-not-equal-variant":"material/code-not-equal-variant.svg","material-code-not-equal":"material/code-not-equal.svg","material-code-parentheses-box":"material/code-parentheses-box.svg","material-code-parentheses":"material/code-parentheses.svg","material-code-string":"material/code-string.svg","material-code-tags-check":"material/code-tags-check.svg","material-code-tags":"material/code-tags.svg","material-codepen":"material/codepen.svg","material-coffee-maker-check-outline":"material/coffee-maker-check-outline.svg","material-coffee-maker-check":"material/coffee-maker-check.svg","material-coffee-maker-outline":"material/coffee-maker-outline.svg","material-coffee-maker":"material/coffee-maker.svg","material-coffee-off-outline":"material/coffee-off-outline.svg","material-coffee-off":"material/coffee-off.svg","material-coffee-outline":"material/coffee-outline.svg","material-coffee-to-go-outline":"material/coffee-to-go-outline.svg","material-coffee-to-go":"material/coffee-to-go.svg","material-coffee":"material/coffee.svg","material-coffin":"material/coffin.svg","material-cog-box":"material/cog-box.svg","material-cog-clockwise":"material/cog-clockwise.svg","material-cog-counterclockwise":"material/cog-counterclockwise.svg","material-cog-off-outline":"material/cog-off-outline.svg","material-cog-off":"material/cog-off.svg","material-cog-outline":"material/cog-outline.svg","material-cog-pause-outline":"material/cog-pause-outline.svg","material-cog-pause":"material/cog-pause.svg","material-cog-play-outline":"material/cog-play-outline.svg","material-cog-play":"material/cog-play.svg","material-cog-refresh-outline":"material/cog-refresh-outline.svg","material-cog-refresh":"material/cog-refresh.svg","material-cog-stop-outline":"material/cog-stop-outline.svg","material-cog-stop":"material/cog-stop.svg","material-cog-sync-outline":"material/cog-sync-outline.svg","material-cog-sync":"material/cog-sync.svg","material-cog-transfer-outline":"material/cog-transfer-outline.svg","material-cog-transfer":"material/cog-transfer.svg","material-cog":"material/cog.svg","material-cogs":"material/cogs.svg","material-collage":"material/collage.svg","material-collapse-all-outline":"material/collapse-all-outline.svg","material-collapse-all":"material/collapse-all.svg","material-color-helper":"material/color-helper.svg","material-comma-box-outline":"material/comma-box-outline.svg","material-comma-box":"material/comma-box.svg","material-comma-circle-outline":"material/comma-circle-outline.svg","material-comma-circle":"material/comma-circle.svg","material-comma":"material/comma.svg","material-comment-account-outline":"material/comment-account-outline.svg","material-comment-account":"material/comment-account.svg","material-comment-alert-outline":"material/comment-alert-outline.svg","material-comment-alert":"material/comment-alert.svg","material-comment-arrow-left-outline":"material/comment-arrow-left-outline.svg","material-comment-arrow-left":"material/comment-arrow-left.svg","material-comment-arrow-right-outline":"material/comment-arrow-right-outline.svg","material-comment-arrow-right":"material/comment-arrow-right.svg","material-comment-bookmark-outline":"material/comment-bookmark-outline.svg","material-comment-bookmark":"material/comment-bookmark.svg","material-comment-check-outline":"material/comment-check-outline.svg","material-comment-check":"material/comment-check.svg","material-comment-edit-outline":"material/comment-edit-outline.svg","material-comment-edit":"material/comment-edit.svg","material-comment-eye-outline":"material/comment-eye-outline.svg","material-comment-eye":"material/comment-eye.svg","material-comment-flash-outline":"material/comment-flash-outline.svg","material-comment-flash":"material/comment-flash.svg","material-comment-minus-outline":"material/comment-minus-outline.svg","material-comment-minus":"material/comment-minus.svg","material-comment-multiple-outline":"material/comment-multiple-outline.svg","material-comment-multiple":"material/comment-multiple.svg","material-comment-off-outline":"material/comment-off-outline.svg","material-comment-off":"material/comment-off.svg","material-comment-outline":"material/comment-outline.svg","material-comment-plus-outline":"material/comment-plus-outline.svg","material-comment-plus":"material/comment-plus.svg","material-comment-processing-outline":"material/comment-processing-outline.svg","material-comment-processing":"material/comment-processing.svg","material-comment-question-outline":"material/comment-question-outline.svg","material-comment-question":"material/comment-question.svg","material-comment-quote-outline":"material/comment-quote-outline.svg","material-comment-quote":"material/comment-quote.svg","material-comment-remove-outline":"material/comment-remove-outline.svg","material-comment-remove":"material/comment-remove.svg","material-comment-search-outline":"material/comment-search-outline.svg","material-comment-search":"material/comment-search.svg","material-comment-text-multiple-outline":"material/comment-text-multiple-outline.svg","material-comment-text-multiple":"material/comment-text-multiple.svg","material-comment-text-outline":"material/comment-text-outline.svg","material-comment-text":"material/comment-text.svg","material-comment":"material/comment.svg","material-compare-horizontal":"material/compare-horizontal.svg","material-compare-remove":"material/compare-remove.svg","material-compare-vertical":"material/compare-vertical.svg","material-compare":"material/compare.svg","material-compass-off-outline":"material/compass-off-outline.svg","material-compass-off":"material/compass-off.svg","material-compass-outline":"material/compass-outline.svg","material-compass-rose":"material/compass-rose.svg","material-compass":"material/compass.svg","material-compost":"material/compost.svg","material-cone-off":"material/cone-off.svg","material-cone":"material/cone.svg","material-connection":"material/connection.svg","material-console-line":"material/console-line.svg","material-console-network-outline":"material/console-network-outline.svg","material-console-network":"material/console-network.svg","material-console":"material/console.svg","material-consolidate":"material/consolidate.svg","material-contactless-payment-circle-outline":"material/contactless-payment-circle-outline.svg","material-contactless-payment-circle":"material/contactless-payment-circle.svg","material-contactless-payment":"material/contactless-payment.svg","material-contacts-outline":"material/contacts-outline.svg","material-contacts":"material/contacts.svg","material-contain-end":"material/contain-end.svg","material-contain-start":"material/contain-start.svg","material-contain":"material/contain.svg","material-content-copy":"material/content-copy.svg","material-content-cut":"material/content-cut.svg","material-content-duplicate":"material/content-duplicate.svg","material-content-paste":"material/content-paste.svg","material-content-save-alert-outline":"material/content-save-alert-outline.svg","material-content-save-alert":"material/content-save-alert.svg","material-content-save-all-outline":"material/content-save-all-outline.svg","material-content-save-all":"material/content-save-all.svg","material-content-save-check-outline":"material/content-save-check-outline.svg","material-content-save-check":"material/content-save-check.svg","material-content-save-cog-outline":"material/content-save-cog-outline.svg","material-content-save-cog":"material/content-save-cog.svg","material-content-save-edit-outline":"material/content-save-edit-outline.svg","material-content-save-edit":"material/content-save-edit.svg","material-content-save-minus-outline":"material/content-save-minus-outline.svg","material-content-save-minus":"material/content-save-minus.svg","material-content-save-move-outline":"material/content-save-move-outline.svg","material-content-save-move":"material/content-save-move.svg","material-content-save-off-outline":"material/content-save-off-outline.svg","material-content-save-off":"material/content-save-off.svg","material-content-save-outline":"material/content-save-outline.svg","material-content-save-plus-outline":"material/content-save-plus-outline.svg","material-content-save-plus":"material/content-save-plus.svg","material-content-save-settings-outline":"material/content-save-settings-outline.svg","material-content-save-settings":"material/content-save-settings.svg","material-content-save":"material/content-save.svg","material-contrast-box":"material/contrast-box.svg","material-contrast-circle":"material/contrast-circle.svg","material-contrast":"material/contrast.svg","material-controller-classic-outline":"material/controller-classic-outline.svg","material-controller-classic":"material/controller-classic.svg","material-controller-off":"material/controller-off.svg","material-controller":"material/controller.svg","material-cookie-alert-outline":"material/cookie-alert-outline.svg","material-cookie-alert":"material/cookie-alert.svg","material-cookie-check-outline":"material/cookie-check-outline.svg","material-cookie-check":"material/cookie-check.svg","material-cookie-clock-outline":"material/cookie-clock-outline.svg","material-cookie-clock":"material/cookie-clock.svg","material-cookie-cog-outline":"material/cookie-cog-outline.svg","material-cookie-cog":"material/cookie-cog.svg","material-cookie-edit-outline":"material/cookie-edit-outline.svg","material-cookie-edit":"material/cookie-edit.svg","material-cookie-lock-outline":"material/cookie-lock-outline.svg","material-cookie-lock":"material/cookie-lock.svg","material-cookie-minus-outline":"material/cookie-minus-outline.svg","material-cookie-minus":"material/cookie-minus.svg","material-cookie-off-outline":"material/cookie-off-outline.svg","material-cookie-off":"material/cookie-off.svg","material-cookie-outline":"material/cookie-outline.svg","material-cookie-plus-outline":"material/cookie-plus-outline.svg","material-cookie-plus":"material/cookie-plus.svg","material-cookie-refresh-outline":"material/cookie-refresh-outline.svg","material-cookie-refresh":"material/cookie-refresh.svg","material-cookie-remove-outline":"material/cookie-remove-outline.svg","material-cookie-remove":"material/cookie-remove.svg","material-cookie-settings-outline":"material/cookie-settings-outline.svg","material-cookie-settings":"material/cookie-settings.svg","material-cookie":"material/cookie.svg","material-coolant-temperature":"material/coolant-temperature.svg","material-copyleft":"material/copyleft.svg","material-copyright":"material/copyright.svg","material-cordova":"material/cordova.svg","material-corn-off":"material/corn-off.svg","material-corn":"material/corn.svg","material-cosine-wave":"material/cosine-wave.svg","material-counter":"material/counter.svg","material-countertop-outline":"material/countertop-outline.svg","material-countertop":"material/countertop.svg","material-cow-off":"material/cow-off.svg","material-cow":"material/cow.svg","material-cpu-32-bit":"material/cpu-32-bit.svg","material-cpu-64-bit":"material/cpu-64-bit.svg","material-cradle-outline":"material/cradle-outline.svg","material-cradle":"material/cradle.svg","material-crane":"material/crane.svg","material-creation":"material/creation.svg","material-creative-commons":"material/creative-commons.svg","material-credit-card-check-outline":"material/credit-card-check-outline.svg","material-credit-card-check":"material/credit-card-check.svg","material-credit-card-chip-outline":"material/credit-card-chip-outline.svg","material-credit-card-chip":"material/credit-card-chip.svg","material-credit-card-clock-outline":"material/credit-card-clock-outline.svg","material-credit-card-clock":"material/credit-card-clock.svg","material-credit-card-edit-outline":"material/credit-card-edit-outline.svg","material-credit-card-edit":"material/credit-card-edit.svg","material-credit-card-fast-outline":"material/credit-card-fast-outline.svg","material-credit-card-fast":"material/credit-card-fast.svg","material-credit-card-lock-outline":"material/credit-card-lock-outline.svg","material-credit-card-lock":"material/credit-card-lock.svg","material-credit-card-marker-outline":"material/credit-card-marker-outline.svg","material-credit-card-marker":"material/credit-card-marker.svg","material-credit-card-minus-outline":"material/credit-card-minus-outline.svg","material-credit-card-minus":"material/credit-card-minus.svg","material-credit-card-multiple-outline":"material/credit-card-multiple-outline.svg","material-credit-card-multiple":"material/credit-card-multiple.svg","material-credit-card-off-outline":"material/credit-card-off-outline.svg","material-credit-card-off":"material/credit-card-off.svg","material-credit-card-outline":"material/credit-card-outline.svg","material-credit-card-plus-outline":"material/credit-card-plus-outline.svg","material-credit-card-plus":"material/credit-card-plus.svg","material-credit-card-refresh-outline":"material/credit-card-refresh-outline.svg","material-credit-card-refresh":"material/credit-card-refresh.svg","material-credit-card-refund-outline":"material/credit-card-refund-outline.svg","material-credit-card-refund":"material/credit-card-refund.svg","material-credit-card-remove-outline":"material/credit-card-remove-outline.svg","material-credit-card-remove":"material/credit-card-remove.svg","material-credit-card-scan-outline":"material/credit-card-scan-outline.svg","material-credit-card-scan":"material/credit-card-scan.svg","material-credit-card-search-outline":"material/credit-card-search-outline.svg","material-credit-card-search":"material/credit-card-search.svg","material-credit-card-settings-outline":"material/credit-card-settings-outline.svg","material-credit-card-settings":"material/credit-card-settings.svg","material-credit-card-sync-outline":"material/credit-card-sync-outline.svg","material-credit-card-sync":"material/credit-card-sync.svg","material-credit-card-wireless-off-outline":"material/credit-card-wireless-off-outline.svg","material-credit-card-wireless-off":"material/credit-card-wireless-off.svg","material-credit-card-wireless-outline":"material/credit-card-wireless-outline.svg","material-credit-card-wireless":"material/credit-card-wireless.svg","material-credit-card":"material/credit-card.svg","material-cricket":"material/cricket.svg","material-crop-free":"material/crop-free.svg","material-crop-landscape":"material/crop-landscape.svg","material-crop-portrait":"material/crop-portrait.svg","material-crop-rotate":"material/crop-rotate.svg","material-crop-square":"material/crop-square.svg","material-crop":"material/crop.svg","material-cross-bolnisi":"material/cross-bolnisi.svg","material-cross-celtic":"material/cross-celtic.svg","material-cross-outline":"material/cross-outline.svg","material-cross":"material/cross.svg","material-crosshairs-gps":"material/crosshairs-gps.svg","material-crosshairs-off":"material/crosshairs-off.svg","material-crosshairs-question":"material/crosshairs-question.svg","material-crosshairs":"material/crosshairs.svg","material-crowd":"material/crowd.svg","material-crown-circle-outline":"material/crown-circle-outline.svg","material-crown-circle":"material/crown-circle.svg","material-crown-outline":"material/crown-outline.svg","material-crown":"material/crown.svg","material-cryengine":"material/cryengine.svg","material-crystal-ball":"material/crystal-ball.svg","material-cube-off-outline":"material/cube-off-outline.svg","material-cube-off":"material/cube-off.svg","material-cube-outline":"material/cube-outline.svg","material-cube-scan":"material/cube-scan.svg","material-cube-send":"material/cube-send.svg","material-cube-unfolded":"material/cube-unfolded.svg","material-cube":"material/cube.svg","material-cup-off-outline":"material/cup-off-outline.svg","material-cup-off":"material/cup-off.svg","material-cup-outline":"material/cup-outline.svg","material-cup-water":"material/cup-water.svg","material-cup":"material/cup.svg","material-cupboard-outline":"material/cupboard-outline.svg","material-cupboard":"material/cupboard.svg","material-cupcake":"material/cupcake.svg","material-curling":"material/curling.svg","material-currency-bdt":"material/currency-bdt.svg","material-currency-brl":"material/currency-brl.svg","material-currency-btc":"material/currency-btc.svg","material-currency-cny":"material/currency-cny.svg","material-currency-eth":"material/currency-eth.svg","material-currency-eur-off":"material/currency-eur-off.svg","material-currency-eur":"material/currency-eur.svg","material-currency-fra":"material/currency-fra.svg","material-currency-gbp":"material/currency-gbp.svg","material-currency-ils":"material/currency-ils.svg","material-currency-inr":"material/currency-inr.svg","material-currency-jpy":"material/currency-jpy.svg","material-currency-krw":"material/currency-krw.svg","material-currency-kzt":"material/currency-kzt.svg","material-currency-mnt":"material/currency-mnt.svg","material-currency-ngn":"material/currency-ngn.svg","material-currency-php":"material/currency-php.svg","material-currency-rial":"material/currency-rial.svg","material-currency-rub":"material/currency-rub.svg","material-currency-rupee":"material/currency-rupee.svg","material-currency-sign":"material/currency-sign.svg","material-currency-try":"material/currency-try.svg","material-currency-twd":"material/currency-twd.svg","material-currency-uah":"material/currency-uah.svg","material-currency-usd-off":"material/currency-usd-off.svg","material-currency-usd":"material/currency-usd.svg","material-current-ac":"material/current-ac.svg","material-current-dc":"material/current-dc.svg","material-cursor-default-click-outline":"material/cursor-default-click-outline.svg","material-cursor-default-click":"material/cursor-default-click.svg","material-cursor-default-gesture-outline":"material/cursor-default-gesture-outline.svg","material-cursor-default-gesture":"material/cursor-default-gesture.svg","material-cursor-default-outline":"material/cursor-default-outline.svg","material-cursor-default":"material/cursor-default.svg","material-cursor-move":"material/cursor-move.svg","material-cursor-pointer":"material/cursor-pointer.svg","material-cursor-text":"material/cursor-text.svg","material-curtains-closed":"material/curtains-closed.svg","material-curtains":"material/curtains.svg","material-cylinder-off":"material/cylinder-off.svg","material-cylinder":"material/cylinder.svg","material-dance-ballroom":"material/dance-ballroom.svg","material-dance-pole":"material/dance-pole.svg","material-data-matrix-edit":"material/data-matrix-edit.svg","material-data-matrix-minus":"material/data-matrix-minus.svg","material-data-matrix-plus":"material/data-matrix-plus.svg","material-data-matrix-remove":"material/data-matrix-remove.svg","material-data-matrix-scan":"material/data-matrix-scan.svg","material-data-matrix":"material/data-matrix.svg","material-database-alert-outline":"material/database-alert-outline.svg","material-database-alert":"material/database-alert.svg","material-database-arrow-down-outline":"material/database-arrow-down-outline.svg","material-database-arrow-down":"material/database-arrow-down.svg","material-database-arrow-left-outline":"material/database-arrow-left-outline.svg","material-database-arrow-left":"material/database-arrow-left.svg","material-database-arrow-right-outline":"material/database-arrow-right-outline.svg","material-database-arrow-right":"material/database-arrow-right.svg","material-database-arrow-up-outline":"material/database-arrow-up-outline.svg","material-database-arrow-up":"material/database-arrow-up.svg","material-database-check-outline":"material/database-check-outline.svg","material-database-check":"material/database-check.svg","material-database-clock-outline":"material/database-clock-outline.svg","material-database-clock":"material/database-clock.svg","material-database-cog-outline":"material/database-cog-outline.svg","material-database-cog":"material/database-cog.svg","material-database-edit-outline":"material/database-edit-outline.svg","material-database-edit":"material/database-edit.svg","material-database-export-outline":"material/database-export-outline.svg","material-database-export":"material/database-export.svg","material-database-eye-off-outline":"material/database-eye-off-outline.svg","material-database-eye-off":"material/database-eye-off.svg","material-database-eye-outline":"material/database-eye-outline.svg","material-database-eye":"material/database-eye.svg","material-database-import-outline":"material/database-import-outline.svg","material-database-import":"material/database-import.svg","material-database-lock-outline":"material/database-lock-outline.svg","material-database-lock":"material/database-lock.svg","material-database-marker-outline":"material/database-marker-outline.svg","material-database-marker":"material/database-marker.svg","material-database-minus-outline":"material/database-minus-outline.svg","material-database-minus":"material/database-minus.svg","material-database-off-outline":"material/database-off-outline.svg","material-database-off":"material/database-off.svg","material-database-outline":"material/database-outline.svg","material-database-plus-outline":"material/database-plus-outline.svg","material-database-plus":"material/database-plus.svg","material-database-refresh-outline":"material/database-refresh-outline.svg","material-database-refresh":"material/database-refresh.svg","material-database-remove-outline":"material/database-remove-outline.svg","material-database-remove":"material/database-remove.svg","material-database-search-outline":"material/database-search-outline.svg","material-database-search":"material/database-search.svg","material-database-settings-outline":"material/database-settings-outline.svg","material-database-settings":"material/database-settings.svg","material-database-sync-outline":"material/database-sync-outline.svg","material-database-sync":"material/database-sync.svg","material-database":"material/database.svg","material-death-star-variant":"material/death-star-variant.svg","material-death-star":"material/death-star.svg","material-deathly-hallows":"material/deathly-hallows.svg","material-debian":"material/debian.svg","material-debug-step-into":"material/debug-step-into.svg","material-debug-step-out":"material/debug-step-out.svg","material-debug-step-over":"material/debug-step-over.svg","material-decagram-outline":"material/decagram-outline.svg","material-decagram":"material/decagram.svg","material-decimal-comma-decrease":"material/decimal-comma-decrease.svg","material-decimal-comma-increase":"material/decimal-comma-increase.svg","material-decimal-comma":"material/decimal-comma.svg","material-decimal-decrease":"material/decimal-decrease.svg","material-decimal-increase":"material/decimal-increase.svg","material-decimal":"material/decimal.svg","material-delete-alert-outline":"material/delete-alert-outline.svg","material-delete-alert":"material/delete-alert.svg","material-delete-circle-outline":"material/delete-circle-outline.svg","material-delete-circle":"material/delete-circle.svg","material-delete-clock-outline":"material/delete-clock-outline.svg","material-delete-clock":"material/delete-clock.svg","material-delete-empty-outline":"material/delete-empty-outline.svg","material-delete-empty":"material/delete-empty.svg","material-delete-forever-outline":"material/delete-forever-outline.svg","material-delete-forever":"material/delete-forever.svg","material-delete-off-outline":"material/delete-off-outline.svg","material-delete-off":"material/delete-off.svg","material-delete-outline":"material/delete-outline.svg","material-delete-restore":"material/delete-restore.svg","material-delete-sweep-outline":"material/delete-sweep-outline.svg","material-delete-sweep":"material/delete-sweep.svg","material-delete-variant":"material/delete-variant.svg","material-delete":"material/delete.svg","material-delta":"material/delta.svg","material-desk-lamp-off":"material/desk-lamp-off.svg","material-desk-lamp-on":"material/desk-lamp-on.svg","material-desk-lamp":"material/desk-lamp.svg","material-desk":"material/desk.svg","material-deskphone":"material/deskphone.svg","material-desktop-classic":"material/desktop-classic.svg","material-desktop-tower-monitor":"material/desktop-tower-monitor.svg","material-desktop-tower":"material/desktop-tower.svg","material-details":"material/details.svg","material-dev-to":"material/dev-to.svg","material-developer-board":"material/developer-board.svg","material-deviantart":"material/deviantart.svg","material-devices":"material/devices.svg","material-dharmachakra":"material/dharmachakra.svg","material-diabetes":"material/diabetes.svg","material-dialpad":"material/dialpad.svg","material-diameter-outline":"material/diameter-outline.svg","material-diameter-variant":"material/diameter-variant.svg","material-diameter":"material/diameter.svg","material-diamond-outline":"material/diamond-outline.svg","material-diamond-stone":"material/diamond-stone.svg","material-diamond":"material/diamond.svg","material-dice-1-outline":"material/dice-1-outline.svg","material-dice-1":"material/dice-1.svg","material-dice-2-outline":"material/dice-2-outline.svg","material-dice-2":"material/dice-2.svg","material-dice-3-outline":"material/dice-3-outline.svg","material-dice-3":"material/dice-3.svg","material-dice-4-outline":"material/dice-4-outline.svg","material-dice-4":"material/dice-4.svg","material-dice-5-outline":"material/dice-5-outline.svg","material-dice-5":"material/dice-5.svg","material-dice-6-outline":"material/dice-6-outline.svg","material-dice-6":"material/dice-6.svg","material-dice-d10-outline":"material/dice-d10-outline.svg","material-dice-d10":"material/dice-d10.svg","material-dice-d12-outline":"material/dice-d12-outline.svg","material-dice-d12":"material/dice-d12.svg","material-dice-d20-outline":"material/dice-d20-outline.svg","material-dice-d20":"material/dice-d20.svg","material-dice-d4-outline":"material/dice-d4-outline.svg","material-dice-d4":"material/dice-d4.svg","material-dice-d6-outline":"material/dice-d6-outline.svg","material-dice-d6":"material/dice-d6.svg","material-dice-d8-outline":"material/dice-d8-outline.svg","material-dice-d8":"material/dice-d8.svg","material-dice-multiple-outline":"material/dice-multiple-outline.svg","material-dice-multiple":"material/dice-multiple.svg","material-digital-ocean":"material/digital-ocean.svg","material-dip-switch":"material/dip-switch.svg","material-directions-fork":"material/directions-fork.svg","material-directions":"material/directions.svg","material-disc-alert":"material/disc-alert.svg","material-disc-player":"material/disc-player.svg","material-disc":"material/disc.svg","material-dishwasher-alert":"material/dishwasher-alert.svg","material-dishwasher-off":"material/dishwasher-off.svg","material-dishwasher":"material/dishwasher.svg","material-disqus":"material/disqus.svg","material-distribute-horizontal-center":"material/distribute-horizontal-center.svg","material-distribute-horizontal-left":"material/distribute-horizontal-left.svg","material-distribute-horizontal-right":"material/distribute-horizontal-right.svg","material-distribute-vertical-bottom":"material/distribute-vertical-bottom.svg","material-distribute-vertical-center":"material/distribute-vertical-center.svg","material-distribute-vertical-top":"material/distribute-vertical-top.svg","material-diversify":"material/diversify.svg","material-diving-flippers":"material/diving-flippers.svg","material-diving-helmet":"material/diving-helmet.svg","material-diving-scuba-flag":"material/diving-scuba-flag.svg","material-diving-scuba-mask":"material/diving-scuba-mask.svg","material-diving-scuba-tank-multiple":"material/diving-scuba-tank-multiple.svg","material-diving-scuba-tank":"material/diving-scuba-tank.svg","material-diving-scuba":"material/diving-scuba.svg","material-diving-snorkel":"material/diving-snorkel.svg","material-diving":"material/diving.svg","material-division-box":"material/division-box.svg","material-division":"material/division.svg","material-dlna":"material/dlna.svg","material-dna":"material/dna.svg","material-dns-outline":"material/dns-outline.svg","material-dns":"material/dns.svg","material-dock-bottom":"material/dock-bottom.svg","material-dock-left":"material/dock-left.svg","material-dock-right":"material/dock-right.svg","material-dock-top":"material/dock-top.svg","material-dock-window":"material/dock-window.svg","material-docker":"material/docker.svg","material-doctor":"material/doctor.svg","material-dog-service":"material/dog-service.svg","material-dog-side-off":"material/dog-side-off.svg","material-dog-side":"material/dog-side.svg","material-dog":"material/dog.svg","material-dolby":"material/dolby.svg","material-dolly":"material/dolly.svg","material-dolphin":"material/dolphin.svg","material-domain-off":"material/domain-off.svg","material-domain-plus":"material/domain-plus.svg","material-domain-remove":"material/domain-remove.svg","material-domain":"material/domain.svg","material-dome-light":"material/dome-light.svg","material-domino-mask":"material/domino-mask.svg","material-donkey":"material/donkey.svg","material-door-closed-lock":"material/door-closed-lock.svg","material-door-closed":"material/door-closed.svg","material-door-open":"material/door-open.svg","material-door-sliding-lock":"material/door-sliding-lock.svg","material-door-sliding-open":"material/door-sliding-open.svg","material-door-sliding":"material/door-sliding.svg","material-door":"material/door.svg","material-doorbell-video":"material/doorbell-video.svg","material-doorbell":"material/doorbell.svg","material-dot-net":"material/dot-net.svg","material-dots-circle":"material/dots-circle.svg","material-dots-grid":"material/dots-grid.svg","material-dots-hexagon":"material/dots-hexagon.svg","material-dots-horizontal-circle-outline":"material/dots-horizontal-circle-outline.svg","material-dots-horizontal-circle":"material/dots-horizontal-circle.svg","material-dots-horizontal":"material/dots-horizontal.svg","material-dots-square":"material/dots-square.svg","material-dots-triangle":"material/dots-triangle.svg","material-dots-vertical-circle-outline":"material/dots-vertical-circle-outline.svg","material-dots-vertical-circle":"material/dots-vertical-circle.svg","material-dots-vertical":"material/dots-vertical.svg","material-download-box-outline":"material/download-box-outline.svg","material-download-box":"material/download-box.svg","material-download-circle-outline":"material/download-circle-outline.svg","material-download-circle":"material/download-circle.svg","material-download-lock-outline":"material/download-lock-outline.svg","material-download-lock":"material/download-lock.svg","material-download-multiple":"material/download-multiple.svg","material-download-network-outline":"material/download-network-outline.svg","material-download-network":"material/download-network.svg","material-download-off-outline":"material/download-off-outline.svg","material-download-off":"material/download-off.svg","material-download-outline":"material/download-outline.svg","material-download":"material/download.svg","material-drag-horizontal-variant":"material/drag-horizontal-variant.svg","material-drag-horizontal":"material/drag-horizontal.svg","material-drag-variant":"material/drag-variant.svg","material-drag-vertical-variant":"material/drag-vertical-variant.svg","material-drag-vertical":"material/drag-vertical.svg","material-drag":"material/drag.svg","material-drama-masks":"material/drama-masks.svg","material-draw-pen":"material/draw-pen.svg","material-draw":"material/draw.svg","material-drawing-box":"material/drawing-box.svg","material-drawing":"material/drawing.svg","material-dresser-outline":"material/dresser-outline.svg","material-dresser":"material/dresser.svg","material-drone":"material/drone.svg","material-dropbox":"material/dropbox.svg","material-drupal":"material/drupal.svg","material-duck":"material/duck.svg","material-dumbbell":"material/dumbbell.svg","material-dump-truck":"material/dump-truck.svg","material-ear-hearing-loop":"material/ear-hearing-loop.svg","material-ear-hearing-off":"material/ear-hearing-off.svg","material-ear-hearing":"material/ear-hearing.svg","material-earbuds-off-outline":"material/earbuds-off-outline.svg","material-earbuds-off":"material/earbuds-off.svg","material-earbuds-outline":"material/earbuds-outline.svg","material-earbuds":"material/earbuds.svg","material-earth-arrow-right":"material/earth-arrow-right.svg","material-earth-box-minus":"material/earth-box-minus.svg","material-earth-box-off":"material/earth-box-off.svg","material-earth-box-plus":"material/earth-box-plus.svg","material-earth-box-remove":"material/earth-box-remove.svg","material-earth-box":"material/earth-box.svg","material-earth-minus":"material/earth-minus.svg","material-earth-off":"material/earth-off.svg","material-earth-plus":"material/earth-plus.svg","material-earth-remove":"material/earth-remove.svg","material-earth":"material/earth.svg","material-egg-easter":"material/egg-easter.svg","material-egg-fried":"material/egg-fried.svg","material-egg-off-outline":"material/egg-off-outline.svg","material-egg-off":"material/egg-off.svg","material-egg-outline":"material/egg-outline.svg","material-egg":"material/egg.svg","material-eiffel-tower":"material/eiffel-tower.svg","material-eight-track":"material/eight-track.svg","material-eject-circle-outline":"material/eject-circle-outline.svg","material-eject-circle":"material/eject-circle.svg","material-eject-outline":"material/eject-outline.svg","material-eject":"material/eject.svg","material-electric-switch-closed":"material/electric-switch-closed.svg","material-electric-switch":"material/electric-switch.svg","material-electron-framework":"material/electron-framework.svg","material-elephant":"material/elephant.svg","material-elevation-decline":"material/elevation-decline.svg","material-elevation-rise":"material/elevation-rise.svg","material-elevator-down":"material/elevator-down.svg","material-elevator-passenger-off-outline":"material/elevator-passenger-off-outline.svg","material-elevator-passenger-off":"material/elevator-passenger-off.svg","material-elevator-passenger-outline":"material/elevator-passenger-outline.svg","material-elevator-passenger":"material/elevator-passenger.svg","material-elevator-up":"material/elevator-up.svg","material-elevator":"material/elevator.svg","material-ellipse-outline":"material/ellipse-outline.svg","material-ellipse":"material/ellipse.svg","material-email-alert-outline":"material/email-alert-outline.svg","material-email-alert":"material/email-alert.svg","material-email-arrow-left-outline":"material/email-arrow-left-outline.svg","material-email-arrow-left":"material/email-arrow-left.svg","material-email-arrow-right-outline":"material/email-arrow-right-outline.svg","material-email-arrow-right":"material/email-arrow-right.svg","material-email-box":"material/email-box.svg","material-email-check-outline":"material/email-check-outline.svg","material-email-check":"material/email-check.svg","material-email-edit-outline":"material/email-edit-outline.svg","material-email-edit":"material/email-edit.svg","material-email-fast-outline":"material/email-fast-outline.svg","material-email-fast":"material/email-fast.svg","material-email-lock-outline":"material/email-lock-outline.svg","material-email-lock":"material/email-lock.svg","material-email-mark-as-unread":"material/email-mark-as-unread.svg","material-email-minus-outline":"material/email-minus-outline.svg","material-email-minus":"material/email-minus.svg","material-email-multiple-outline":"material/email-multiple-outline.svg","material-email-multiple":"material/email-multiple.svg","material-email-newsletter":"material/email-newsletter.svg","material-email-off-outline":"material/email-off-outline.svg","material-email-off":"material/email-off.svg","material-email-open-multiple-outline":"material/email-open-multiple-outline.svg","material-email-open-multiple":"material/email-open-multiple.svg","material-email-open-outline":"material/email-open-outline.svg","material-email-open":"material/email-open.svg","material-email-outline":"material/email-outline.svg","material-email-plus-outline":"material/email-plus-outline.svg","material-email-plus":"material/email-plus.svg","material-email-remove-outline":"material/email-remove-outline.svg","material-email-remove":"material/email-remove.svg","material-email-seal-outline":"material/email-seal-outline.svg","material-email-seal":"material/email-seal.svg","material-email-search-outline":"material/email-search-outline.svg","material-email-search":"material/email-search.svg","material-email-sync-outline":"material/email-sync-outline.svg","material-email-sync":"material/email-sync.svg","material-email-variant":"material/email-variant.svg","material-email":"material/email.svg","material-ember":"material/ember.svg","material-emby":"material/emby.svg","material-emoticon-angry-outline":"material/emoticon-angry-outline.svg","material-emoticon-angry":"material/emoticon-angry.svg","material-emoticon-confused-outline":"material/emoticon-confused-outline.svg","material-emoticon-confused":"material/emoticon-confused.svg","material-emoticon-cool-outline":"material/emoticon-cool-outline.svg","material-emoticon-cool":"material/emoticon-cool.svg","material-emoticon-cry-outline":"material/emoticon-cry-outline.svg","material-emoticon-cry":"material/emoticon-cry.svg","material-emoticon-dead-outline":"material/emoticon-dead-outline.svg","material-emoticon-dead":"material/emoticon-dead.svg","material-emoticon-devil-outline":"material/emoticon-devil-outline.svg","material-emoticon-devil":"material/emoticon-devil.svg","material-emoticon-excited-outline":"material/emoticon-excited-outline.svg","material-emoticon-excited":"material/emoticon-excited.svg","material-emoticon-frown-outline":"material/emoticon-frown-outline.svg","material-emoticon-frown":"material/emoticon-frown.svg","material-emoticon-happy-outline":"material/emoticon-happy-outline.svg","material-emoticon-happy":"material/emoticon-happy.svg","material-emoticon-kiss-outline":"material/emoticon-kiss-outline.svg","material-emoticon-kiss":"material/emoticon-kiss.svg","material-emoticon-lol-outline":"material/emoticon-lol-outline.svg","material-emoticon-lol":"material/emoticon-lol.svg","material-emoticon-neutral-outline":"material/emoticon-neutral-outline.svg","material-emoticon-neutral":"material/emoticon-neutral.svg","material-emoticon-outline":"material/emoticon-outline.svg","material-emoticon-poop-outline":"material/emoticon-poop-outline.svg","material-emoticon-poop":"material/emoticon-poop.svg","material-emoticon-sad-outline":"material/emoticon-sad-outline.svg","material-emoticon-sad":"material/emoticon-sad.svg","material-emoticon-sick-outline":"material/emoticon-sick-outline.svg","material-emoticon-sick":"material/emoticon-sick.svg","material-emoticon-tongue-outline":"material/emoticon-tongue-outline.svg","material-emoticon-tongue":"material/emoticon-tongue.svg","material-emoticon-wink-outline":"material/emoticon-wink-outline.svg","material-emoticon-wink":"material/emoticon-wink.svg","material-emoticon":"material/emoticon.svg","material-engine-off-outline":"material/engine-off-outline.svg","material-engine-off":"material/engine-off.svg","material-engine-outline":"material/engine-outline.svg","material-engine":"material/engine.svg","material-epsilon":"material/epsilon.svg","material-equal-box":"material/equal-box.svg","material-equal":"material/equal.svg","material-equalizer-outline":"material/equalizer-outline.svg","material-equalizer":"material/equalizer.svg","material-eraser-variant":"material/eraser-variant.svg","material-eraser":"material/eraser.svg","material-escalator-box":"material/escalator-box.svg","material-escalator-down":"material/escalator-down.svg","material-escalator-up":"material/escalator-up.svg","material-escalator":"material/escalator.svg","material-eslint":"material/eslint.svg","material-et":"material/et.svg","material-ethereum":"material/ethereum.svg","material-ethernet-cable-off":"material/ethernet-cable-off.svg","material-ethernet-cable":"material/ethernet-cable.svg","material-ethernet":"material/ethernet.svg","material-ev-plug-ccs1":"material/ev-plug-ccs1.svg","material-ev-plug-ccs2":"material/ev-plug-ccs2.svg","material-ev-plug-chademo":"material/ev-plug-chademo.svg","material-ev-plug-tesla":"material/ev-plug-tesla.svg","material-ev-plug-type1":"material/ev-plug-type1.svg","material-ev-plug-type2":"material/ev-plug-type2.svg","material-ev-station":"material/ev-station.svg","material-evernote":"material/evernote.svg","material-excavator":"material/excavator.svg","material-exclamation-thick":"material/exclamation-thick.svg","material-exclamation":"material/exclamation.svg","material-exit-run":"material/exit-run.svg","material-exit-to-app":"material/exit-to-app.svg","material-expand-all-outline":"material/expand-all-outline.svg","material-expand-all":"material/expand-all.svg","material-expansion-card-variant":"material/expansion-card-variant.svg","material-expansion-card":"material/expansion-card.svg","material-exponent-box":"material/exponent-box.svg","material-exponent":"material/exponent.svg","material-export-variant":"material/export-variant.svg","material-export":"material/export.svg","material-eye-arrow-left-outline":"material/eye-arrow-left-outline.svg","material-eye-arrow-left":"material/eye-arrow-left.svg","material-eye-arrow-right-outline":"material/eye-arrow-right-outline.svg","material-eye-arrow-right":"material/eye-arrow-right.svg","material-eye-check-outline":"material/eye-check-outline.svg","material-eye-check":"material/eye-check.svg","material-eye-circle-outline":"material/eye-circle-outline.svg","material-eye-circle":"material/eye-circle.svg","material-eye-minus-outline":"material/eye-minus-outline.svg","material-eye-minus":"material/eye-minus.svg","material-eye-off-outline":"material/eye-off-outline.svg","material-eye-off":"material/eye-off.svg","material-eye-outline":"material/eye-outline.svg","material-eye-plus-outline":"material/eye-plus-outline.svg","material-eye-plus":"material/eye-plus.svg","material-eye-refresh-outline":"material/eye-refresh-outline.svg","material-eye-refresh":"material/eye-refresh.svg","material-eye-remove-outline":"material/eye-remove-outline.svg","material-eye-remove":"material/eye-remove.svg","material-eye-settings-outline":"material/eye-settings-outline.svg","material-eye-settings":"material/eye-settings.svg","material-eye":"material/eye.svg","material-eyedropper-minus":"material/eyedropper-minus.svg","material-eyedropper-off":"material/eyedropper-off.svg","material-eyedropper-plus":"material/eyedropper-plus.svg","material-eyedropper-remove":"material/eyedropper-remove.svg","material-eyedropper-variant":"material/eyedropper-variant.svg","material-eyedropper":"material/eyedropper.svg","material-face-agent":"material/face-agent.svg","material-face-man-outline":"material/face-man-outline.svg","material-face-man-profile":"material/face-man-profile.svg","material-face-man-shimmer-outline":"material/face-man-shimmer-outline.svg","material-face-man-shimmer":"material/face-man-shimmer.svg","material-face-man":"material/face-man.svg","material-face-mask-outline":"material/face-mask-outline.svg","material-face-mask":"material/face-mask.svg","material-face-recognition":"material/face-recognition.svg","material-face-woman-outline":"material/face-woman-outline.svg","material-face-woman-profile":"material/face-woman-profile.svg","material-face-woman-shimmer-outline":"material/face-woman-shimmer-outline.svg","material-face-woman-shimmer":"material/face-woman-shimmer.svg","material-face-woman":"material/face-woman.svg","material-facebook-gaming":"material/facebook-gaming.svg","material-facebook-messenger":"material/facebook-messenger.svg","material-facebook-workplace":"material/facebook-workplace.svg","material-facebook":"material/facebook.svg","material-factory":"material/factory.svg","material-family-tree":"material/family-tree.svg","material-fan-alert":"material/fan-alert.svg","material-fan-auto":"material/fan-auto.svg","material-fan-chevron-down":"material/fan-chevron-down.svg","material-fan-chevron-up":"material/fan-chevron-up.svg","material-fan-clock":"material/fan-clock.svg","material-fan-minus":"material/fan-minus.svg","material-fan-off":"material/fan-off.svg","material-fan-plus":"material/fan-plus.svg","material-fan-remove":"material/fan-remove.svg","material-fan-speed-1":"material/fan-speed-1.svg","material-fan-speed-2":"material/fan-speed-2.svg","material-fan-speed-3":"material/fan-speed-3.svg","material-fan":"material/fan.svg","material-fast-forward-10":"material/fast-forward-10.svg","material-fast-forward-15":"material/fast-forward-15.svg","material-fast-forward-30":"material/fast-forward-30.svg","material-fast-forward-45":"material/fast-forward-45.svg","material-fast-forward-5":"material/fast-forward-5.svg","material-fast-forward-60":"material/fast-forward-60.svg","material-fast-forward-outline":"material/fast-forward-outline.svg","material-fast-forward":"material/fast-forward.svg","material-faucet-variant":"material/faucet-variant.svg","material-faucet":"material/faucet.svg","material-fax":"material/fax.svg","material-feather":"material/feather.svg","material-feature-search-outline":"material/feature-search-outline.svg","material-feature-search":"material/feature-search.svg","material-fedora":"material/fedora.svg","material-fence-electric":"material/fence-electric.svg","material-fence":"material/fence.svg","material-fencing":"material/fencing.svg","material-ferris-wheel":"material/ferris-wheel.svg","material-ferry":"material/ferry.svg","material-file-account-outline":"material/file-account-outline.svg","material-file-account":"material/file-account.svg","material-file-alert-outline":"material/file-alert-outline.svg","material-file-alert":"material/file-alert.svg","material-file-arrow-left-right-outline":"material/file-arrow-left-right-outline.svg","material-file-arrow-left-right":"material/file-arrow-left-right.svg","material-file-arrow-up-down-outline":"material/file-arrow-up-down-outline.svg","material-file-arrow-up-down":"material/file-arrow-up-down.svg","material-file-cabinet":"material/file-cabinet.svg","material-file-cad-box":"material/file-cad-box.svg","material-file-cad":"material/file-cad.svg","material-file-cancel-outline":"material/file-cancel-outline.svg","material-file-cancel":"material/file-cancel.svg","material-file-certificate-outline":"material/file-certificate-outline.svg","material-file-certificate":"material/file-certificate.svg","material-file-chart-check-outline":"material/file-chart-check-outline.svg","material-file-chart-check":"material/file-chart-check.svg","material-file-chart-outline":"material/file-chart-outline.svg","material-file-chart":"material/file-chart.svg","material-file-check-outline":"material/file-check-outline.svg","material-file-check":"material/file-check.svg","material-file-clock-outline":"material/file-clock-outline.svg","material-file-clock":"material/file-clock.svg","material-file-cloud-outline":"material/file-cloud-outline.svg","material-file-cloud":"material/file-cloud.svg","material-file-code-outline":"material/file-code-outline.svg","material-file-code":"material/file-code.svg","material-file-cog-outline":"material/file-cog-outline.svg","material-file-cog":"material/file-cog.svg","material-file-compare":"material/file-compare.svg","material-file-delimited-outline":"material/file-delimited-outline.svg","material-file-delimited":"material/file-delimited.svg","material-file-document-alert-outline":"material/file-document-alert-outline.svg","material-file-document-alert":"material/file-document-alert.svg","material-file-document-check-outline":"material/file-document-check-outline.svg","material-file-document-check":"material/file-document-check.svg","material-file-document-edit-outline":"material/file-document-edit-outline.svg","material-file-document-edit":"material/file-document-edit.svg","material-file-document-minus-outline":"material/file-document-minus-outline.svg","material-file-document-minus":"material/file-document-minus.svg","material-file-document-multiple-outline":"material/file-document-multiple-outline.svg","material-file-document-multiple":"material/file-document-multiple.svg","material-file-document-outline":"material/file-document-outline.svg","material-file-document-plus-outline":"material/file-document-plus-outline.svg","material-file-document-plus":"material/file-document-plus.svg","material-file-document-remove-outline":"material/file-document-remove-outline.svg","material-file-document-remove":"material/file-document-remove.svg","material-file-document":"material/file-document.svg","material-file-download-outline":"material/file-download-outline.svg","material-file-download":"material/file-download.svg","material-file-edit-outline":"material/file-edit-outline.svg","material-file-edit":"material/file-edit.svg","material-file-excel-box-outline":"material/file-excel-box-outline.svg","material-file-excel-box":"material/file-excel-box.svg","material-file-excel-outline":"material/file-excel-outline.svg","material-file-excel":"material/file-excel.svg","material-file-export-outline":"material/file-export-outline.svg","material-file-export":"material/file-export.svg","material-file-eye-outline":"material/file-eye-outline.svg","material-file-eye":"material/file-eye.svg","material-file-find-outline":"material/file-find-outline.svg","material-file-find":"material/file-find.svg","material-file-gif-box":"material/file-gif-box.svg","material-file-hidden":"material/file-hidden.svg","material-file-image-marker-outline":"material/file-image-marker-outline.svg","material-file-image-marker":"material/file-image-marker.svg","material-file-image-minus-outline":"material/file-image-minus-outline.svg","material-file-image-minus":"material/file-image-minus.svg","material-file-image-outline":"material/file-image-outline.svg","material-file-image-plus-outline":"material/file-image-plus-outline.svg","material-file-image-plus":"material/file-image-plus.svg","material-file-image-remove-outline":"material/file-image-remove-outline.svg","material-file-image-remove":"material/file-image-remove.svg","material-file-image":"material/file-image.svg","material-file-import-outline":"material/file-import-outline.svg","material-file-import":"material/file-import.svg","material-file-jpg-box":"material/file-jpg-box.svg","material-file-key-outline":"material/file-key-outline.svg","material-file-key":"material/file-key.svg","material-file-link-outline":"material/file-link-outline.svg","material-file-link":"material/file-link.svg","material-file-lock-open-outline":"material/file-lock-open-outline.svg","material-file-lock-open":"material/file-lock-open.svg","material-file-lock-outline":"material/file-lock-outline.svg","material-file-lock":"material/file-lock.svg","material-file-marker-outline":"material/file-marker-outline.svg","material-file-marker":"material/file-marker.svg","material-file-minus-outline":"material/file-minus-outline.svg","material-file-minus":"material/file-minus.svg","material-file-move-outline":"material/file-move-outline.svg","material-file-move":"material/file-move.svg","material-file-multiple-outline":"material/file-multiple-outline.svg","material-file-multiple":"material/file-multiple.svg","material-file-music-outline":"material/file-music-outline.svg","material-file-music":"material/file-music.svg","material-file-outline":"material/file-outline.svg","material-file-pdf-box":"material/file-pdf-box.svg","material-file-percent-outline":"material/file-percent-outline.svg","material-file-percent":"material/file-percent.svg","material-file-phone-outline":"material/file-phone-outline.svg","material-file-phone":"material/file-phone.svg","material-file-plus-outline":"material/file-plus-outline.svg","material-file-plus":"material/file-plus.svg","material-file-png-box":"material/file-png-box.svg","material-file-powerpoint-box-outline":"material/file-powerpoint-box-outline.svg","material-file-powerpoint-box":"material/file-powerpoint-box.svg","material-file-powerpoint-outline":"material/file-powerpoint-outline.svg","material-file-powerpoint":"material/file-powerpoint.svg","material-file-presentation-box":"material/file-presentation-box.svg","material-file-question-outline":"material/file-question-outline.svg","material-file-question":"material/file-question.svg","material-file-refresh-outline":"material/file-refresh-outline.svg","material-file-refresh":"material/file-refresh.svg","material-file-remove-outline":"material/file-remove-outline.svg","material-file-remove":"material/file-remove.svg","material-file-replace-outline":"material/file-replace-outline.svg","material-file-replace":"material/file-replace.svg","material-file-restore-outline":"material/file-restore-outline.svg","material-file-restore":"material/file-restore.svg","material-file-rotate-left-outline":"material/file-rotate-left-outline.svg","material-file-rotate-left":"material/file-rotate-left.svg","material-file-rotate-right-outline":"material/file-rotate-right-outline.svg","material-file-rotate-right":"material/file-rotate-right.svg","material-file-search-outline":"material/file-search-outline.svg","material-file-search":"material/file-search.svg","material-file-send-outline":"material/file-send-outline.svg","material-file-send":"material/file-send.svg","material-file-settings-outline":"material/file-settings-outline.svg","material-file-settings":"material/file-settings.svg","material-file-sign":"material/file-sign.svg","material-file-star-outline":"material/file-star-outline.svg","material-file-star":"material/file-star.svg","material-file-swap-outline":"material/file-swap-outline.svg","material-file-swap":"material/file-swap.svg","material-file-sync-outline":"material/file-sync-outline.svg","material-file-sync":"material/file-sync.svg","material-file-table-box-multiple-outline":"material/file-table-box-multiple-outline.svg","material-file-table-box-multiple":"material/file-table-box-multiple.svg","material-file-table-box-outline":"material/file-table-box-outline.svg","material-file-table-box":"material/file-table-box.svg","material-file-table-outline":"material/file-table-outline.svg","material-file-table":"material/file-table.svg","material-file-tree-outline":"material/file-tree-outline.svg","material-file-tree":"material/file-tree.svg","material-file-undo-outline":"material/file-undo-outline.svg","material-file-undo":"material/file-undo.svg","material-file-upload-outline":"material/file-upload-outline.svg","material-file-upload":"material/file-upload.svg","material-file-video-outline":"material/file-video-outline.svg","material-file-video":"material/file-video.svg","material-file-word-box-outline":"material/file-word-box-outline.svg","material-file-word-box":"material/file-word-box.svg","material-file-word-outline":"material/file-word-outline.svg","material-file-word":"material/file-word.svg","material-file-xml-box":"material/file-xml-box.svg","material-file":"material/file.svg","material-film":"material/film.svg","material-filmstrip-box-multiple":"material/filmstrip-box-multiple.svg","material-filmstrip-box":"material/filmstrip-box.svg","material-filmstrip-off":"material/filmstrip-off.svg","material-filmstrip":"material/filmstrip.svg","material-filter-check-outline":"material/filter-check-outline.svg","material-filter-check":"material/filter-check.svg","material-filter-cog-outline":"material/filter-cog-outline.svg","material-filter-cog":"material/filter-cog.svg","material-filter-menu-outline":"material/filter-menu-outline.svg","material-filter-menu":"material/filter-menu.svg","material-filter-minus-outline":"material/filter-minus-outline.svg","material-filter-minus":"material/filter-minus.svg","material-filter-multiple-outline":"material/filter-multiple-outline.svg","material-filter-multiple":"material/filter-multiple.svg","material-filter-off-outline":"material/filter-off-outline.svg","material-filter-off":"material/filter-off.svg","material-filter-outline":"material/filter-outline.svg","material-filter-plus-outline":"material/filter-plus-outline.svg","material-filter-plus":"material/filter-plus.svg","material-filter-remove-outline":"material/filter-remove-outline.svg","material-filter-remove":"material/filter-remove.svg","material-filter-settings-outline":"material/filter-settings-outline.svg","material-filter-settings":"material/filter-settings.svg","material-filter-variant-minus":"material/filter-variant-minus.svg","material-filter-variant-plus":"material/filter-variant-plus.svg","material-filter-variant-remove":"material/filter-variant-remove.svg","material-filter-variant":"material/filter-variant.svg","material-filter":"material/filter.svg","material-finance":"material/finance.svg","material-find-replace":"material/find-replace.svg","material-fingerprint-off":"material/fingerprint-off.svg","material-fingerprint":"material/fingerprint.svg","material-fire-alert":"material/fire-alert.svg","material-fire-circle":"material/fire-circle.svg","material-fire-extinguisher":"material/fire-extinguisher.svg","material-fire-hydrant-alert":"material/fire-hydrant-alert.svg","material-fire-hydrant-off":"material/fire-hydrant-off.svg","material-fire-hydrant":"material/fire-hydrant.svg","material-fire-off":"material/fire-off.svg","material-fire-truck":"material/fire-truck.svg","material-fire":"material/fire.svg","material-firebase":"material/firebase.svg","material-firefox":"material/firefox.svg","material-fireplace-off":"material/fireplace-off.svg","material-fireplace":"material/fireplace.svg","material-firewire":"material/firewire.svg","material-firework-off":"material/firework-off.svg","material-firework":"material/firework.svg","material-fish-off":"material/fish-off.svg","material-fish":"material/fish.svg","material-fishbowl-outline":"material/fishbowl-outline.svg","material-fishbowl":"material/fishbowl.svg","material-fit-to-page-outline":"material/fit-to-page-outline.svg","material-fit-to-page":"material/fit-to-page.svg","material-fit-to-screen-outline":"material/fit-to-screen-outline.svg","material-fit-to-screen":"material/fit-to-screen.svg","material-flag-checkered":"material/flag-checkered.svg","material-flag-minus-outline":"material/flag-minus-outline.svg","material-flag-minus":"material/flag-minus.svg","material-flag-off-outline":"material/flag-off-outline.svg","material-flag-off":"material/flag-off.svg","material-flag-outline":"material/flag-outline.svg","material-flag-plus-outline":"material/flag-plus-outline.svg","material-flag-plus":"material/flag-plus.svg","material-flag-remove-outline":"material/flag-remove-outline.svg","material-flag-remove":"material/flag-remove.svg","material-flag-triangle":"material/flag-triangle.svg","material-flag-variant-minus-outline":"material/flag-variant-minus-outline.svg","material-flag-variant-minus":"material/flag-variant-minus.svg","material-flag-variant-off-outline":"material/flag-variant-off-outline.svg","material-flag-variant-off":"material/flag-variant-off.svg","material-flag-variant-outline":"material/flag-variant-outline.svg","material-flag-variant-plus-outline":"material/flag-variant-plus-outline.svg","material-flag-variant-plus":"material/flag-variant-plus.svg","material-flag-variant-remove-outline":"material/flag-variant-remove-outline.svg","material-flag-variant-remove":"material/flag-variant-remove.svg","material-flag-variant":"material/flag-variant.svg","material-flag":"material/flag.svg","material-flare":"material/flare.svg","material-flash-alert-outline":"material/flash-alert-outline.svg","material-flash-alert":"material/flash-alert.svg","material-flash-auto":"material/flash-auto.svg","material-flash-off-outline":"material/flash-off-outline.svg","material-flash-off":"material/flash-off.svg","material-flash-outline":"material/flash-outline.svg","material-flash-red-eye":"material/flash-red-eye.svg","material-flash-triangle-outline":"material/flash-triangle-outline.svg","material-flash-triangle":"material/flash-triangle.svg","material-flash":"material/flash.svg","material-flashlight-off":"material/flashlight-off.svg","material-flashlight":"material/flashlight.svg","material-flask-empty-minus-outline":"material/flask-empty-minus-outline.svg","material-flask-empty-minus":"material/flask-empty-minus.svg","material-flask-empty-off-outline":"material/flask-empty-off-outline.svg","material-flask-empty-off":"material/flask-empty-off.svg","material-flask-empty-outline":"material/flask-empty-outline.svg","material-flask-empty-plus-outline":"material/flask-empty-plus-outline.svg","material-flask-empty-plus":"material/flask-empty-plus.svg","material-flask-empty-remove-outline":"material/flask-empty-remove-outline.svg","material-flask-empty-remove":"material/flask-empty-remove.svg","material-flask-empty":"material/flask-empty.svg","material-flask-minus-outline":"material/flask-minus-outline.svg","material-flask-minus":"material/flask-minus.svg","material-flask-off-outline":"material/flask-off-outline.svg","material-flask-off":"material/flask-off.svg","material-flask-outline":"material/flask-outline.svg","material-flask-plus-outline":"material/flask-plus-outline.svg","material-flask-plus":"material/flask-plus.svg","material-flask-remove-outline":"material/flask-remove-outline.svg","material-flask-remove":"material/flask-remove.svg","material-flask-round-bottom-empty-outline":"material/flask-round-bottom-empty-outline.svg","material-flask-round-bottom-empty":"material/flask-round-bottom-empty.svg","material-flask-round-bottom-outline":"material/flask-round-bottom-outline.svg","material-flask-round-bottom":"material/flask-round-bottom.svg","material-flask":"material/flask.svg","material-fleur-de-lis":"material/fleur-de-lis.svg","material-flip-horizontal":"material/flip-horizontal.svg","material-flip-to-back":"material/flip-to-back.svg","material-flip-to-front":"material/flip-to-front.svg","material-flip-vertical":"material/flip-vertical.svg","material-floor-lamp-dual-outline":"material/floor-lamp-dual-outline.svg","material-floor-lamp-dual":"material/floor-lamp-dual.svg","material-floor-lamp-outline":"material/floor-lamp-outline.svg","material-floor-lamp-torchiere-outline":"material/floor-lamp-torchiere-outline.svg","material-floor-lamp-torchiere-variant-outline":"material/floor-lamp-torchiere-variant-outline.svg","material-floor-lamp-torchiere-variant":"material/floor-lamp-torchiere-variant.svg","material-floor-lamp-torchiere":"material/floor-lamp-torchiere.svg","material-floor-lamp":"material/floor-lamp.svg","material-floor-plan":"material/floor-plan.svg","material-floppy-variant":"material/floppy-variant.svg","material-floppy":"material/floppy.svg","material-flower-outline":"material/flower-outline.svg","material-flower-pollen-outline":"material/flower-pollen-outline.svg","material-flower-pollen":"material/flower-pollen.svg","material-flower-poppy":"material/flower-poppy.svg","material-flower-tulip-outline":"material/flower-tulip-outline.svg","material-flower-tulip":"material/flower-tulip.svg","material-flower":"material/flower.svg","material-focus-auto":"material/focus-auto.svg","material-focus-field-horizontal":"material/focus-field-horizontal.svg","material-focus-field-vertical":"material/focus-field-vertical.svg","material-focus-field":"material/focus-field.svg","material-folder-account-outline":"material/folder-account-outline.svg","material-folder-account":"material/folder-account.svg","material-folder-alert-outline":"material/folder-alert-outline.svg","material-folder-alert":"material/folder-alert.svg","material-folder-arrow-down-outline":"material/folder-arrow-down-outline.svg","material-folder-arrow-down":"material/folder-arrow-down.svg","material-folder-arrow-left-outline":"material/folder-arrow-left-outline.svg","material-folder-arrow-left-right-outline":"material/folder-arrow-left-right-outline.svg","material-folder-arrow-left-right":"material/folder-arrow-left-right.svg","material-folder-arrow-left":"material/folder-arrow-left.svg","material-folder-arrow-right-outline":"material/folder-arrow-right-outline.svg","material-folder-arrow-right":"material/folder-arrow-right.svg","material-folder-arrow-up-down-outline":"material/folder-arrow-up-down-outline.svg","material-folder-arrow-up-down":"material/folder-arrow-up-down.svg","material-folder-arrow-up-outline":"material/folder-arrow-up-outline.svg","material-folder-arrow-up":"material/folder-arrow-up.svg","material-folder-cancel-outline":"material/folder-cancel-outline.svg","material-folder-cancel":"material/folder-cancel.svg","material-folder-check-outline":"material/folder-check-outline.svg","material-folder-check":"material/folder-check.svg","material-folder-clock-outline":"material/folder-clock-outline.svg","material-folder-clock":"material/folder-clock.svg","material-folder-cog-outline":"material/folder-cog-outline.svg","material-folder-cog":"material/folder-cog.svg","material-folder-download-outline":"material/folder-download-outline.svg","material-folder-download":"material/folder-download.svg","material-folder-edit-outline":"material/folder-edit-outline.svg","material-folder-edit":"material/folder-edit.svg","material-folder-eye-outline":"material/folder-eye-outline.svg","material-folder-eye":"material/folder-eye.svg","material-folder-file-outline":"material/folder-file-outline.svg","material-folder-file":"material/folder-file.svg","material-folder-google-drive":"material/folder-google-drive.svg","material-folder-heart-outline":"material/folder-heart-outline.svg","material-folder-heart":"material/folder-heart.svg","material-folder-hidden":"material/folder-hidden.svg","material-folder-home-outline":"material/folder-home-outline.svg","material-folder-home":"material/folder-home.svg","material-folder-image":"material/folder-image.svg","material-folder-information-outline":"material/folder-information-outline.svg","material-folder-information":"material/folder-information.svg","material-folder-key-network-outline":"material/folder-key-network-outline.svg","material-folder-key-network":"material/folder-key-network.svg","material-folder-key-outline":"material/folder-key-outline.svg","material-folder-key":"material/folder-key.svg","material-folder-lock-open-outline":"material/folder-lock-open-outline.svg","material-folder-lock-open":"material/folder-lock-open.svg","material-folder-lock-outline":"material/folder-lock-outline.svg","material-folder-lock":"material/folder-lock.svg","material-folder-marker-outline":"material/folder-marker-outline.svg","material-folder-marker":"material/folder-marker.svg","material-folder-minus-outline":"material/folder-minus-outline.svg","material-folder-minus":"material/folder-minus.svg","material-folder-move-outline":"material/folder-move-outline.svg","material-folder-move":"material/folder-move.svg","material-folder-multiple-image":"material/folder-multiple-image.svg","material-folder-multiple-outline":"material/folder-multiple-outline.svg","material-folder-multiple-plus-outline":"material/folder-multiple-plus-outline.svg","material-folder-multiple-plus":"material/folder-multiple-plus.svg","material-folder-multiple":"material/folder-multiple.svg","material-folder-music-outline":"material/folder-music-outline.svg","material-folder-music":"material/folder-music.svg","material-folder-network-outline":"material/folder-network-outline.svg","material-folder-network":"material/folder-network.svg","material-folder-off-outline":"material/folder-off-outline.svg","material-folder-off":"material/folder-off.svg","material-folder-open-outline":"material/folder-open-outline.svg","material-folder-open":"material/folder-open.svg","material-folder-outline":"material/folder-outline.svg","material-folder-play-outline":"material/folder-play-outline.svg","material-folder-play":"material/folder-play.svg","material-folder-plus-outline":"material/folder-plus-outline.svg","material-folder-plus":"material/folder-plus.svg","material-folder-pound-outline":"material/folder-pound-outline.svg","material-folder-pound":"material/folder-pound.svg","material-folder-question-outline":"material/folder-question-outline.svg","material-folder-question":"material/folder-question.svg","material-folder-refresh-outline":"material/folder-refresh-outline.svg","material-folder-refresh":"material/folder-refresh.svg","material-folder-remove-outline":"material/folder-remove-outline.svg","material-folder-remove":"material/folder-remove.svg","material-folder-search-outline":"material/folder-search-outline.svg","material-folder-search":"material/folder-search.svg","material-folder-settings-outline":"material/folder-settings-outline.svg","material-folder-settings":"material/folder-settings.svg","material-folder-star-multiple-outline":"material/folder-star-multiple-outline.svg","material-folder-star-multiple":"material/folder-star-multiple.svg","material-folder-star-outline":"material/folder-star-outline.svg","material-folder-star":"material/folder-star.svg","material-folder-swap-outline":"material/folder-swap-outline.svg","material-folder-swap":"material/folder-swap.svg","material-folder-sync-outline":"material/folder-sync-outline.svg","material-folder-sync":"material/folder-sync.svg","material-folder-table-outline":"material/folder-table-outline.svg","material-folder-table":"material/folder-table.svg","material-folder-text-outline":"material/folder-text-outline.svg","material-folder-text":"material/folder-text.svg","material-folder-upload-outline":"material/folder-upload-outline.svg","material-folder-upload":"material/folder-upload.svg","material-folder-wrench-outline":"material/folder-wrench-outline.svg","material-folder-wrench":"material/folder-wrench.svg","material-folder-zip-outline":"material/folder-zip-outline.svg","material-folder-zip":"material/folder-zip.svg","material-folder":"material/folder.svg","material-font-awesome":"material/font-awesome.svg","material-food-apple-outline":"material/food-apple-outline.svg","material-food-apple":"material/food-apple.svg","material-food-croissant":"material/food-croissant.svg","material-food-drumstick-off-outline":"material/food-drumstick-off-outline.svg","material-food-drumstick-off":"material/food-drumstick-off.svg","material-food-drumstick-outline":"material/food-drumstick-outline.svg","material-food-drumstick":"material/food-drumstick.svg","material-food-fork-drink":"material/food-fork-drink.svg","material-food-halal":"material/food-halal.svg","material-food-hot-dog":"material/food-hot-dog.svg","material-food-kosher":"material/food-kosher.svg","material-food-off-outline":"material/food-off-outline.svg","material-food-off":"material/food-off.svg","material-food-outline":"material/food-outline.svg","material-food-steak-off":"material/food-steak-off.svg","material-food-steak":"material/food-steak.svg","material-food-takeout-box-outline":"material/food-takeout-box-outline.svg","material-food-takeout-box":"material/food-takeout-box.svg","material-food-turkey":"material/food-turkey.svg","material-food-variant-off":"material/food-variant-off.svg","material-food-variant":"material/food-variant.svg","material-food":"material/food.svg","material-foot-print":"material/foot-print.svg","material-football-australian":"material/football-australian.svg","material-football-helmet":"material/football-helmet.svg","material-football":"material/football.svg","material-forest":"material/forest.svg","material-forklift":"material/forklift.svg","material-form-dropdown":"material/form-dropdown.svg","material-form-select":"material/form-select.svg","material-form-textarea":"material/form-textarea.svg","material-form-textbox-lock":"material/form-textbox-lock.svg","material-form-textbox-password":"material/form-textbox-password.svg","material-form-textbox":"material/form-textbox.svg","material-format-align-bottom":"material/format-align-bottom.svg","material-format-align-center":"material/format-align-center.svg","material-format-align-justify":"material/format-align-justify.svg","material-format-align-left":"material/format-align-left.svg","material-format-align-middle":"material/format-align-middle.svg","material-format-align-right":"material/format-align-right.svg","material-format-align-top":"material/format-align-top.svg","material-format-annotation-minus":"material/format-annotation-minus.svg","material-format-annotation-plus":"material/format-annotation-plus.svg","material-format-bold":"material/format-bold.svg","material-format-clear":"material/format-clear.svg","material-format-color-fill":"material/format-color-fill.svg","material-format-color-highlight":"material/format-color-highlight.svg","material-format-color-marker-cancel":"material/format-color-marker-cancel.svg","material-format-color-text":"material/format-color-text.svg","material-format-columns":"material/format-columns.svg","material-format-float-center":"material/format-float-center.svg","material-format-float-left":"material/format-float-left.svg","material-format-float-none":"material/format-float-none.svg","material-format-float-right":"material/format-float-right.svg","material-format-font-size-decrease":"material/format-font-size-decrease.svg","material-format-font-size-increase":"material/format-font-size-increase.svg","material-format-font":"material/format-font.svg","material-format-header-1":"material/format-header-1.svg","material-format-header-2":"material/format-header-2.svg","material-format-header-3":"material/format-header-3.svg","material-format-header-4":"material/format-header-4.svg","material-format-header-5":"material/format-header-5.svg","material-format-header-6":"material/format-header-6.svg","material-format-header-decrease":"material/format-header-decrease.svg","material-format-header-equal":"material/format-header-equal.svg","material-format-header-increase":"material/format-header-increase.svg","material-format-header-pound":"material/format-header-pound.svg","material-format-horizontal-align-center":"material/format-horizontal-align-center.svg","material-format-horizontal-align-left":"material/format-horizontal-align-left.svg","material-format-horizontal-align-right":"material/format-horizontal-align-right.svg","material-format-indent-decrease":"material/format-indent-decrease.svg","material-format-indent-increase":"material/format-indent-increase.svg","material-format-italic":"material/format-italic.svg","material-format-letter-case-lower":"material/format-letter-case-lower.svg","material-format-letter-case-upper":"material/format-letter-case-upper.svg","material-format-letter-case":"material/format-letter-case.svg","material-format-letter-ends-with":"material/format-letter-ends-with.svg","material-format-letter-matches":"material/format-letter-matches.svg","material-format-letter-spacing-variant":"material/format-letter-spacing-variant.svg","material-format-letter-spacing":"material/format-letter-spacing.svg","material-format-letter-starts-with":"material/format-letter-starts-with.svg","material-format-line-height":"material/format-line-height.svg","material-format-line-spacing":"material/format-line-spacing.svg","material-format-line-style":"material/format-line-style.svg","material-format-line-weight":"material/format-line-weight.svg","material-format-list-bulleted-square":"material/format-list-bulleted-square.svg","material-format-list-bulleted-triangle":"material/format-list-bulleted-triangle.svg","material-format-list-bulleted-type":"material/format-list-bulleted-type.svg","material-format-list-bulleted":"material/format-list-bulleted.svg","material-format-list-checkbox":"material/format-list-checkbox.svg","material-format-list-checks":"material/format-list-checks.svg","material-format-list-group-plus":"material/format-list-group-plus.svg","material-format-list-group":"material/format-list-group.svg","material-format-list-numbered-rtl":"material/format-list-numbered-rtl.svg","material-format-list-numbered":"material/format-list-numbered.svg","material-format-list-text":"material/format-list-text.svg","material-format-overline":"material/format-overline.svg","material-format-page-break":"material/format-page-break.svg","material-format-page-split":"material/format-page-split.svg","material-format-paint":"material/format-paint.svg","material-format-paragraph-spacing":"material/format-paragraph-spacing.svg","material-format-paragraph":"material/format-paragraph.svg","material-format-pilcrow-arrow-left":"material/format-pilcrow-arrow-left.svg","material-format-pilcrow-arrow-right":"material/format-pilcrow-arrow-right.svg","material-format-pilcrow":"material/format-pilcrow.svg","material-format-quote-close-outline":"material/format-quote-close-outline.svg","material-format-quote-close":"material/format-quote-close.svg","material-format-quote-open-outline":"material/format-quote-open-outline.svg","material-format-quote-open":"material/format-quote-open.svg","material-format-rotate-90":"material/format-rotate-90.svg","material-format-section":"material/format-section.svg","material-format-size":"material/format-size.svg","material-format-strikethrough-variant":"material/format-strikethrough-variant.svg","material-format-strikethrough":"material/format-strikethrough.svg","material-format-subscript":"material/format-subscript.svg","material-format-superscript":"material/format-superscript.svg","material-format-text-rotation-angle-down":"material/format-text-rotation-angle-down.svg","material-format-text-rotation-angle-up":"material/format-text-rotation-angle-up.svg","material-format-text-rotation-down-vertical":"material/format-text-rotation-down-vertical.svg","material-format-text-rotation-down":"material/format-text-rotation-down.svg","material-format-text-rotation-none":"material/format-text-rotation-none.svg","material-format-text-rotation-up":"material/format-text-rotation-up.svg","material-format-text-rotation-vertical":"material/format-text-rotation-vertical.svg","material-format-text-variant-outline":"material/format-text-variant-outline.svg","material-format-text-variant":"material/format-text-variant.svg","material-format-text-wrapping-clip":"material/format-text-wrapping-clip.svg","material-format-text-wrapping-overflow":"material/format-text-wrapping-overflow.svg","material-format-text-wrapping-wrap":"material/format-text-wrapping-wrap.svg","material-format-text":"material/format-text.svg","material-format-textbox":"material/format-textbox.svg","material-format-title":"material/format-title.svg","material-format-underline-wavy":"material/format-underline-wavy.svg","material-format-underline":"material/format-underline.svg","material-format-vertical-align-bottom":"material/format-vertical-align-bottom.svg","material-format-vertical-align-center":"material/format-vertical-align-center.svg","material-format-vertical-align-top":"material/format-vertical-align-top.svg","material-format-wrap-inline":"material/format-wrap-inline.svg","material-format-wrap-square":"material/format-wrap-square.svg","material-format-wrap-tight":"material/format-wrap-tight.svg","material-format-wrap-top-bottom":"material/format-wrap-top-bottom.svg","material-forum-minus-outline":"material/forum-minus-outline.svg","material-forum-minus":"material/forum-minus.svg","material-forum-outline":"material/forum-outline.svg","material-forum-plus-outline":"material/forum-plus-outline.svg","material-forum-plus":"material/forum-plus.svg","material-forum-remove-outline":"material/forum-remove-outline.svg","material-forum-remove":"material/forum-remove.svg","material-forum":"material/forum.svg","material-forward":"material/forward.svg","material-forwardburger":"material/forwardburger.svg","material-fountain-pen-tip":"material/fountain-pen-tip.svg","material-fountain-pen":"material/fountain-pen.svg","material-fountain":"material/fountain.svg","material-fraction-one-half":"material/fraction-one-half.svg","material-freebsd":"material/freebsd.svg","material-french-fries":"material/french-fries.svg","material-frequently-asked-questions":"material/frequently-asked-questions.svg","material-fridge-alert-outline":"material/fridge-alert-outline.svg","material-fridge-alert":"material/fridge-alert.svg","material-fridge-bottom":"material/fridge-bottom.svg","material-fridge-industrial-alert-outline":"material/fridge-industrial-alert-outline.svg","material-fridge-industrial-alert":"material/fridge-industrial-alert.svg","material-fridge-industrial-off-outline":"material/fridge-industrial-off-outline.svg","material-fridge-industrial-off":"material/fridge-industrial-off.svg","material-fridge-industrial-outline":"material/fridge-industrial-outline.svg","material-fridge-industrial":"material/fridge-industrial.svg","material-fridge-off-outline":"material/fridge-off-outline.svg","material-fridge-off":"material/fridge-off.svg","material-fridge-outline":"material/fridge-outline.svg","material-fridge-top":"material/fridge-top.svg","material-fridge-variant-alert-outline":"material/fridge-variant-alert-outline.svg","material-fridge-variant-alert":"material/fridge-variant-alert.svg","material-fridge-variant-off-outline":"material/fridge-variant-off-outline.svg","material-fridge-variant-off":"material/fridge-variant-off.svg","material-fridge-variant-outline":"material/fridge-variant-outline.svg","material-fridge-variant":"material/fridge-variant.svg","material-fridge":"material/fridge.svg","material-fruit-cherries-off":"material/fruit-cherries-off.svg","material-fruit-cherries":"material/fruit-cherries.svg","material-fruit-citrus-off":"material/fruit-citrus-off.svg","material-fruit-citrus":"material/fruit-citrus.svg","material-fruit-grapes-outline":"material/fruit-grapes-outline.svg","material-fruit-grapes":"material/fruit-grapes.svg","material-fruit-pear":"material/fruit-pear.svg","material-fruit-pineapple":"material/fruit-pineapple.svg","material-fruit-watermelon":"material/fruit-watermelon.svg","material-fuel-cell":"material/fuel-cell.svg","material-fuel":"material/fuel.svg","material-fullscreen-exit":"material/fullscreen-exit.svg","material-fullscreen":"material/fullscreen.svg","material-function-variant":"material/function-variant.svg","material-function":"material/function.svg","material-furigana-horizontal":"material/furigana-horizontal.svg","material-furigana-vertical":"material/furigana-vertical.svg","material-fuse-alert":"material/fuse-alert.svg","material-fuse-blade":"material/fuse-blade.svg","material-fuse-off":"material/fuse-off.svg","material-fuse":"material/fuse.svg","material-gamepad-circle-down":"material/gamepad-circle-down.svg","material-gamepad-circle-left":"material/gamepad-circle-left.svg","material-gamepad-circle-outline":"material/gamepad-circle-outline.svg","material-gamepad-circle-right":"material/gamepad-circle-right.svg","material-gamepad-circle-up":"material/gamepad-circle-up.svg","material-gamepad-circle":"material/gamepad-circle.svg","material-gamepad-down":"material/gamepad-down.svg","material-gamepad-left":"material/gamepad-left.svg","material-gamepad-outline":"material/gamepad-outline.svg","material-gamepad-right":"material/gamepad-right.svg","material-gamepad-round-down":"material/gamepad-round-down.svg","material-gamepad-round-left":"material/gamepad-round-left.svg","material-gamepad-round-outline":"material/gamepad-round-outline.svg","material-gamepad-round-right":"material/gamepad-round-right.svg","material-gamepad-round-up":"material/gamepad-round-up.svg","material-gamepad-round":"material/gamepad-round.svg","material-gamepad-square-outline":"material/gamepad-square-outline.svg","material-gamepad-square":"material/gamepad-square.svg","material-gamepad-up":"material/gamepad-up.svg","material-gamepad-variant-outline":"material/gamepad-variant-outline.svg","material-gamepad-variant":"material/gamepad-variant.svg","material-gamepad":"material/gamepad.svg","material-gamma":"material/gamma.svg","material-gantry-crane":"material/gantry-crane.svg","material-garage-alert-variant":"material/garage-alert-variant.svg","material-garage-alert":"material/garage-alert.svg","material-garage-lock":"material/garage-lock.svg","material-garage-open-variant":"material/garage-open-variant.svg","material-garage-open":"material/garage-open.svg","material-garage-variant-lock":"material/garage-variant-lock.svg","material-garage-variant":"material/garage-variant.svg","material-garage":"material/garage.svg","material-gas-burner":"material/gas-burner.svg","material-gas-cylinder":"material/gas-cylinder.svg","material-gas-station-off-outline":"material/gas-station-off-outline.svg","material-gas-station-off":"material/gas-station-off.svg","material-gas-station-outline":"material/gas-station-outline.svg","material-gas-station":"material/gas-station.svg","material-gate-alert":"material/gate-alert.svg","material-gate-and":"material/gate-and.svg","material-gate-arrow-left":"material/gate-arrow-left.svg","material-gate-arrow-right":"material/gate-arrow-right.svg","material-gate-buffer":"material/gate-buffer.svg","material-gate-nand":"material/gate-nand.svg","material-gate-nor":"material/gate-nor.svg","material-gate-not":"material/gate-not.svg","material-gate-open":"material/gate-open.svg","material-gate-or":"material/gate-or.svg","material-gate-xnor":"material/gate-xnor.svg","material-gate-xor":"material/gate-xor.svg","material-gate":"material/gate.svg","material-gatsby":"material/gatsby.svg","material-gauge-empty":"material/gauge-empty.svg","material-gauge-full":"material/gauge-full.svg","material-gauge-low":"material/gauge-low.svg","material-gauge":"material/gauge.svg","material-gavel":"material/gavel.svg","material-gender-female":"material/gender-female.svg","material-gender-male-female-variant":"material/gender-male-female-variant.svg","material-gender-male-female":"material/gender-male-female.svg","material-gender-male":"material/gender-male.svg","material-gender-non-binary":"material/gender-non-binary.svg","material-gender-transgender":"material/gender-transgender.svg","material-gentoo":"material/gentoo.svg","material-gesture-double-tap":"material/gesture-double-tap.svg","material-gesture-pinch":"material/gesture-pinch.svg","material-gesture-spread":"material/gesture-spread.svg","material-gesture-swipe-down":"material/gesture-swipe-down.svg","material-gesture-swipe-horizontal":"material/gesture-swipe-horizontal.svg","material-gesture-swipe-left":"material/gesture-swipe-left.svg","material-gesture-swipe-right":"material/gesture-swipe-right.svg","material-gesture-swipe-up":"material/gesture-swipe-up.svg","material-gesture-swipe-vertical":"material/gesture-swipe-vertical.svg","material-gesture-swipe":"material/gesture-swipe.svg","material-gesture-tap-box":"material/gesture-tap-box.svg","material-gesture-tap-button":"material/gesture-tap-button.svg","material-gesture-tap-hold":"material/gesture-tap-hold.svg","material-gesture-tap":"material/gesture-tap.svg","material-gesture-two-double-tap":"material/gesture-two-double-tap.svg","material-gesture-two-tap":"material/gesture-two-tap.svg","material-gesture":"material/gesture.svg","material-ghost-off-outline":"material/ghost-off-outline.svg","material-ghost-off":"material/ghost-off.svg","material-ghost-outline":"material/ghost-outline.svg","material-ghost":"material/ghost.svg","material-gift-off-outline":"material/gift-off-outline.svg","material-gift-off":"material/gift-off.svg","material-gift-open-outline":"material/gift-open-outline.svg","material-gift-open":"material/gift-open.svg","material-gift-outline":"material/gift-outline.svg","material-gift":"material/gift.svg","material-git":"material/git.svg","material-github":"material/github.svg","material-gitlab":"material/gitlab.svg","material-glass-cocktail-off":"material/glass-cocktail-off.svg","material-glass-cocktail":"material/glass-cocktail.svg","material-glass-flute":"material/glass-flute.svg","material-glass-fragile":"material/glass-fragile.svg","material-glass-mug-off":"material/glass-mug-off.svg","material-glass-mug-variant-off":"material/glass-mug-variant-off.svg","material-glass-mug-variant":"material/glass-mug-variant.svg","material-glass-mug":"material/glass-mug.svg","material-glass-pint-outline":"material/glass-pint-outline.svg","material-glass-stange":"material/glass-stange.svg","material-glass-tulip":"material/glass-tulip.svg","material-glass-wine":"material/glass-wine.svg","material-glasses":"material/glasses.svg","material-globe-light-outline":"material/globe-light-outline.svg","material-globe-light":"material/globe-light.svg","material-globe-model":"material/globe-model.svg","material-gmail":"material/gmail.svg","material-gnome":"material/gnome.svg","material-go-kart-track":"material/go-kart-track.svg","material-go-kart":"material/go-kart.svg","material-gog":"material/gog.svg","material-gold":"material/gold.svg","material-golf-cart":"material/golf-cart.svg","material-golf-tee":"material/golf-tee.svg","material-golf":"material/golf.svg","material-gondola":"material/gondola.svg","material-goodreads":"material/goodreads.svg","material-google-ads":"material/google-ads.svg","material-google-analytics":"material/google-analytics.svg","material-google-assistant":"material/google-assistant.svg","material-google-cardboard":"material/google-cardboard.svg","material-google-chrome":"material/google-chrome.svg","material-google-circles-communities":"material/google-circles-communities.svg","material-google-circles-extended":"material/google-circles-extended.svg","material-google-circles-group":"material/google-circles-group.svg","material-google-circles":"material/google-circles.svg","material-google-classroom":"material/google-classroom.svg","material-google-cloud":"material/google-cloud.svg","material-google-downasaur":"material/google-downasaur.svg","material-google-drive":"material/google-drive.svg","material-google-earth":"material/google-earth.svg","material-google-fit":"material/google-fit.svg","material-google-glass":"material/google-glass.svg","material-google-hangouts":"material/google-hangouts.svg","material-google-keep":"material/google-keep.svg","material-google-lens":"material/google-lens.svg","material-google-maps":"material/google-maps.svg","material-google-my-business":"material/google-my-business.svg","material-google-nearby":"material/google-nearby.svg","material-google-play":"material/google-play.svg","material-google-plus":"material/google-plus.svg","material-google-podcast":"material/google-podcast.svg","material-google-spreadsheet":"material/google-spreadsheet.svg","material-google-street-view":"material/google-street-view.svg","material-google-translate":"material/google-translate.svg","material-google":"material/google.svg","material-gradient-horizontal":"material/gradient-horizontal.svg","material-gradient-vertical":"material/gradient-vertical.svg","material-grain":"material/grain.svg","material-graph-outline":"material/graph-outline.svg","material-graph":"material/graph.svg","material-graphql":"material/graphql.svg","material-grass":"material/grass.svg","material-grave-stone":"material/grave-stone.svg","material-grease-pencil":"material/grease-pencil.svg","material-greater-than-or-equal":"material/greater-than-or-equal.svg","material-greater-than":"material/greater-than.svg","material-greenhouse":"material/greenhouse.svg","material-grid-large":"material/grid-large.svg","material-grid-off":"material/grid-off.svg","material-grid":"material/grid.svg","material-grill-outline":"material/grill-outline.svg","material-grill":"material/grill.svg","material-group":"material/group.svg","material-guitar-acoustic":"material/guitar-acoustic.svg","material-guitar-electric":"material/guitar-electric.svg","material-guitar-pick-outline":"material/guitar-pick-outline.svg","material-guitar-pick":"material/guitar-pick.svg","material-guy-fawkes-mask":"material/guy-fawkes-mask.svg","material-gymnastics":"material/gymnastics.svg","material-hail":"material/hail.svg","material-hair-dryer-outline":"material/hair-dryer-outline.svg","material-hair-dryer":"material/hair-dryer.svg","material-halloween":"material/halloween.svg","material-hamburger-check":"material/hamburger-check.svg","material-hamburger-minus":"material/hamburger-minus.svg","material-hamburger-off":"material/hamburger-off.svg","material-hamburger-plus":"material/hamburger-plus.svg","material-hamburger-remove":"material/hamburger-remove.svg","material-hamburger":"material/hamburger.svg","material-hammer-screwdriver":"material/hammer-screwdriver.svg","material-hammer-sickle":"material/hammer-sickle.svg","material-hammer-wrench":"material/hammer-wrench.svg","material-hammer":"material/hammer.svg","material-hand-back-left-off-outline":"material/hand-back-left-off-outline.svg","material-hand-back-left-off":"material/hand-back-left-off.svg","material-hand-back-left-outline":"material/hand-back-left-outline.svg","material-hand-back-left":"material/hand-back-left.svg","material-hand-back-right-off-outline":"material/hand-back-right-off-outline.svg","material-hand-back-right-off":"material/hand-back-right-off.svg","material-hand-back-right-outline":"material/hand-back-right-outline.svg","material-hand-back-right":"material/hand-back-right.svg","material-hand-clap-off":"material/hand-clap-off.svg","material-hand-clap":"material/hand-clap.svg","material-hand-coin-outline":"material/hand-coin-outline.svg","material-hand-coin":"material/hand-coin.svg","material-hand-cycle":"material/hand-cycle.svg","material-hand-extended-outline":"material/hand-extended-outline.svg","material-hand-extended":"material/hand-extended.svg","material-hand-front-left-outline":"material/hand-front-left-outline.svg","material-hand-front-left":"material/hand-front-left.svg","material-hand-front-right-outline":"material/hand-front-right-outline.svg","material-hand-front-right":"material/hand-front-right.svg","material-hand-heart-outline":"material/hand-heart-outline.svg","material-hand-heart":"material/hand-heart.svg","material-hand-okay":"material/hand-okay.svg","material-hand-peace-variant":"material/hand-peace-variant.svg","material-hand-peace":"material/hand-peace.svg","material-hand-pointing-down":"material/hand-pointing-down.svg","material-hand-pointing-left":"material/hand-pointing-left.svg","material-hand-pointing-right":"material/hand-pointing-right.svg","material-hand-pointing-up":"material/hand-pointing-up.svg","material-hand-saw":"material/hand-saw.svg","material-hand-wash-outline":"material/hand-wash-outline.svg","material-hand-wash":"material/hand-wash.svg","material-hand-water":"material/hand-water.svg","material-hand-wave-outline":"material/hand-wave-outline.svg","material-hand-wave":"material/hand-wave.svg","material-handball":"material/handball.svg","material-handcuffs":"material/handcuffs.svg","material-hands-pray":"material/hands-pray.svg","material-handshake-outline":"material/handshake-outline.svg","material-handshake":"material/handshake.svg","material-hanger":"material/hanger.svg","material-hard-hat":"material/hard-hat.svg","material-harddisk-plus":"material/harddisk-plus.svg","material-harddisk-remove":"material/harddisk-remove.svg","material-harddisk":"material/harddisk.svg","material-hat-fedora":"material/hat-fedora.svg","material-hazard-lights":"material/hazard-lights.svg","material-hdmi-port":"material/hdmi-port.svg","material-hdr-off":"material/hdr-off.svg","material-hdr":"material/hdr.svg","material-head-alert-outline":"material/head-alert-outline.svg","material-head-alert":"material/head-alert.svg","material-head-check-outline":"material/head-check-outline.svg","material-head-check":"material/head-check.svg","material-head-cog-outline":"material/head-cog-outline.svg","material-head-cog":"material/head-cog.svg","material-head-dots-horizontal-outline":"material/head-dots-horizontal-outline.svg","material-head-dots-horizontal":"material/head-dots-horizontal.svg","material-head-flash-outline":"material/head-flash-outline.svg","material-head-flash":"material/head-flash.svg","material-head-heart-outline":"material/head-heart-outline.svg","material-head-heart":"material/head-heart.svg","material-head-lightbulb-outline":"material/head-lightbulb-outline.svg","material-head-lightbulb":"material/head-lightbulb.svg","material-head-minus-outline":"material/head-minus-outline.svg","material-head-minus":"material/head-minus.svg","material-head-outline":"material/head-outline.svg","material-head-plus-outline":"material/head-plus-outline.svg","material-head-plus":"material/head-plus.svg","material-head-question-outline":"material/head-question-outline.svg","material-head-question":"material/head-question.svg","material-head-remove-outline":"material/head-remove-outline.svg","material-head-remove":"material/head-remove.svg","material-head-snowflake-outline":"material/head-snowflake-outline.svg","material-head-snowflake":"material/head-snowflake.svg","material-head-sync-outline":"material/head-sync-outline.svg","material-head-sync":"material/head-sync.svg","material-head":"material/head.svg","material-headphones-bluetooth":"material/headphones-bluetooth.svg","material-headphones-box":"material/headphones-box.svg","material-headphones-off":"material/headphones-off.svg","material-headphones-settings":"material/headphones-settings.svg","material-headphones":"material/headphones.svg","material-headset-dock":"material/headset-dock.svg","material-headset-off":"material/headset-off.svg","material-headset":"material/headset.svg","material-heart-box-outline":"material/heart-box-outline.svg","material-heart-box":"material/heart-box.svg","material-heart-broken-outline":"material/heart-broken-outline.svg","material-heart-broken":"material/heart-broken.svg","material-heart-circle-outline":"material/heart-circle-outline.svg","material-heart-circle":"material/heart-circle.svg","material-heart-cog-outline":"material/heart-cog-outline.svg","material-heart-cog":"material/heart-cog.svg","material-heart-flash":"material/heart-flash.svg","material-heart-half-full":"material/heart-half-full.svg","material-heart-half-outline":"material/heart-half-outline.svg","material-heart-half":"material/heart-half.svg","material-heart-minus-outline":"material/heart-minus-outline.svg","material-heart-minus":"material/heart-minus.svg","material-heart-multiple-outline":"material/heart-multiple-outline.svg","material-heart-multiple":"material/heart-multiple.svg","material-heart-off-outline":"material/heart-off-outline.svg","material-heart-off":"material/heart-off.svg","material-heart-outline":"material/heart-outline.svg","material-heart-plus-outline":"material/heart-plus-outline.svg","material-heart-plus":"material/heart-plus.svg","material-heart-pulse":"material/heart-pulse.svg","material-heart-remove-outline":"material/heart-remove-outline.svg","material-heart-remove":"material/heart-remove.svg","material-heart-settings-outline":"material/heart-settings-outline.svg","material-heart-settings":"material/heart-settings.svg","material-heart":"material/heart.svg","material-heat-pump-outline":"material/heat-pump-outline.svg","material-heat-pump":"material/heat-pump.svg","material-heat-wave":"material/heat-wave.svg","material-heating-coil":"material/heating-coil.svg","material-helicopter":"material/helicopter.svg","material-help-box":"material/help-box.svg","material-help-circle-outline":"material/help-circle-outline.svg","material-help-circle":"material/help-circle.svg","material-help-network-outline":"material/help-network-outline.svg","material-help-network":"material/help-network.svg","material-help-rhombus-outline":"material/help-rhombus-outline.svg","material-help-rhombus":"material/help-rhombus.svg","material-help":"material/help.svg","material-hexadecimal":"material/hexadecimal.svg","material-hexagon-multiple-outline":"material/hexagon-multiple-outline.svg","material-hexagon-multiple":"material/hexagon-multiple.svg","material-hexagon-outline":"material/hexagon-outline.svg","material-hexagon-slice-1":"material/hexagon-slice-1.svg","material-hexagon-slice-2":"material/hexagon-slice-2.svg","material-hexagon-slice-3":"material/hexagon-slice-3.svg","material-hexagon-slice-4":"material/hexagon-slice-4.svg","material-hexagon-slice-5":"material/hexagon-slice-5.svg","material-hexagon-slice-6":"material/hexagon-slice-6.svg","material-hexagon":"material/hexagon.svg","material-hexagram-outline":"material/hexagram-outline.svg","material-hexagram":"material/hexagram.svg","material-high-definition-box":"material/high-definition-box.svg","material-high-definition":"material/high-definition.svg","material-highway":"material/highway.svg","material-hiking":"material/hiking.svg","material-history":"material/history.svg","material-hockey-puck":"material/hockey-puck.svg","material-hockey-sticks":"material/hockey-sticks.svg","material-hololens":"material/hololens.svg","material-home-account":"material/home-account.svg","material-home-alert-outline":"material/home-alert-outline.svg","material-home-alert":"material/home-alert.svg","material-home-analytics":"material/home-analytics.svg","material-home-assistant":"material/home-assistant.svg","material-home-automation":"material/home-automation.svg","material-home-battery-outline":"material/home-battery-outline.svg","material-home-battery":"material/home-battery.svg","material-home-circle-outline":"material/home-circle-outline.svg","material-home-circle":"material/home-circle.svg","material-home-city-outline":"material/home-city-outline.svg","material-home-city":"material/home-city.svg","material-home-clock-outline":"material/home-clock-outline.svg","material-home-clock":"material/home-clock.svg","material-home-edit-outline":"material/home-edit-outline.svg","material-home-edit":"material/home-edit.svg","material-home-export-outline":"material/home-export-outline.svg","material-home-flood":"material/home-flood.svg","material-home-floor-0":"material/home-floor-0.svg","material-home-floor-1":"material/home-floor-1.svg","material-home-floor-2":"material/home-floor-2.svg","material-home-floor-3":"material/home-floor-3.svg","material-home-floor-a":"material/home-floor-a.svg","material-home-floor-b":"material/home-floor-b.svg","material-home-floor-g":"material/home-floor-g.svg","material-home-floor-l":"material/home-floor-l.svg","material-home-floor-negative-1":"material/home-floor-negative-1.svg","material-home-group-minus":"material/home-group-minus.svg","material-home-group-plus":"material/home-group-plus.svg","material-home-group-remove":"material/home-group-remove.svg","material-home-group":"material/home-group.svg","material-home-heart":"material/home-heart.svg","material-home-import-outline":"material/home-import-outline.svg","material-home-lightbulb-outline":"material/home-lightbulb-outline.svg","material-home-lightbulb":"material/home-lightbulb.svg","material-home-lightning-bolt-outline":"material/home-lightning-bolt-outline.svg","material-home-lightning-bolt":"material/home-lightning-bolt.svg","material-home-lock-open":"material/home-lock-open.svg","material-home-lock":"material/home-lock.svg","material-home-map-marker":"material/home-map-marker.svg","material-home-minus-outline":"material/home-minus-outline.svg","material-home-minus":"material/home-minus.svg","material-home-modern":"material/home-modern.svg","material-home-off-outline":"material/home-off-outline.svg","material-home-off":"material/home-off.svg","material-home-outline":"material/home-outline.svg","material-home-plus-outline":"material/home-plus-outline.svg","material-home-plus":"material/home-plus.svg","material-home-remove-outline":"material/home-remove-outline.svg","material-home-remove":"material/home-remove.svg","material-home-roof":"material/home-roof.svg","material-home-search-outline":"material/home-search-outline.svg","material-home-search":"material/home-search.svg","material-home-silo-outline":"material/home-silo-outline.svg","material-home-silo":"material/home-silo.svg","material-home-switch-outline":"material/home-switch-outline.svg","material-home-switch":"material/home-switch.svg","material-home-thermometer-outline":"material/home-thermometer-outline.svg","material-home-thermometer":"material/home-thermometer.svg","material-home-variant-outline":"material/home-variant-outline.svg","material-home-variant":"material/home-variant.svg","material-home":"material/home.svg","material-hook-off":"material/hook-off.svg","material-hook":"material/hook.svg","material-hoop-house":"material/hoop-house.svg","material-hops":"material/hops.svg","material-horizontal-rotate-clockwise":"material/horizontal-rotate-clockwise.svg","material-horizontal-rotate-counterclockwise":"material/horizontal-rotate-counterclockwise.svg","material-horse-human":"material/horse-human.svg","material-horse-variant-fast":"material/horse-variant-fast.svg","material-horse-variant":"material/horse-variant.svg","material-horse":"material/horse.svg","material-horseshoe":"material/horseshoe.svg","material-hospital-box-outline":"material/hospital-box-outline.svg","material-hospital-box":"material/hospital-box.svg","material-hospital-building":"material/hospital-building.svg","material-hospital-marker":"material/hospital-marker.svg","material-hospital":"material/hospital.svg","material-hot-tub":"material/hot-tub.svg","material-hours-24":"material/hours-24.svg","material-hubspot":"material/hubspot.svg","material-hulu":"material/hulu.svg","material-human-baby-changing-table":"material/human-baby-changing-table.svg","material-human-cane":"material/human-cane.svg","material-human-capacity-decrease":"material/human-capacity-decrease.svg","material-human-capacity-increase":"material/human-capacity-increase.svg","material-human-child":"material/human-child.svg","material-human-dolly":"material/human-dolly.svg","material-human-edit":"material/human-edit.svg","material-human-female-boy":"material/human-female-boy.svg","material-human-female-dance":"material/human-female-dance.svg","material-human-female-female":"material/human-female-female.svg","material-human-female-girl":"material/human-female-girl.svg","material-human-female":"material/human-female.svg","material-human-greeting-proximity":"material/human-greeting-proximity.svg","material-human-greeting-variant":"material/human-greeting-variant.svg","material-human-greeting":"material/human-greeting.svg","material-human-handsdown":"material/human-handsdown.svg","material-human-handsup":"material/human-handsup.svg","material-human-male-board-poll":"material/human-male-board-poll.svg","material-human-male-board":"material/human-male-board.svg","material-human-male-boy":"material/human-male-boy.svg","material-human-male-child":"material/human-male-child.svg","material-human-male-female-child":"material/human-male-female-child.svg","material-human-male-female":"material/human-male-female.svg","material-human-male-girl":"material/human-male-girl.svg","material-human-male-height-variant":"material/human-male-height-variant.svg","material-human-male-height":"material/human-male-height.svg","material-human-male-male":"material/human-male-male.svg","material-human-male":"material/human-male.svg","material-human-non-binary":"material/human-non-binary.svg","material-human-pregnant":"material/human-pregnant.svg","material-human-queue":"material/human-queue.svg","material-human-scooter":"material/human-scooter.svg","material-human-walker":"material/human-walker.svg","material-human-wheelchair":"material/human-wheelchair.svg","material-human-white-cane":"material/human-white-cane.svg","material-human":"material/human.svg","material-humble-bundle":"material/humble-bundle.svg","material-hvac-off":"material/hvac-off.svg","material-hvac":"material/hvac.svg","material-hydraulic-oil-level":"material/hydraulic-oil-level.svg","material-hydraulic-oil-temperature":"material/hydraulic-oil-temperature.svg","material-hydro-power":"material/hydro-power.svg","material-hydrogen-station":"material/hydrogen-station.svg","material-ice-cream-off":"material/ice-cream-off.svg","material-ice-cream":"material/ice-cream.svg","material-ice-pop":"material/ice-pop.svg","material-id-card":"material/id-card.svg","material-identifier":"material/identifier.svg","material-ideogram-cjk-variant":"material/ideogram-cjk-variant.svg","material-ideogram-cjk":"material/ideogram-cjk.svg","material-image-album":"material/image-album.svg","material-image-area-close":"material/image-area-close.svg","material-image-area":"material/image-area.svg","material-image-auto-adjust":"material/image-auto-adjust.svg","material-image-broken-variant":"material/image-broken-variant.svg","material-image-broken":"material/image-broken.svg","material-image-check-outline":"material/image-check-outline.svg","material-image-check":"material/image-check.svg","material-image-edit-outline":"material/image-edit-outline.svg","material-image-edit":"material/image-edit.svg","material-image-filter-black-white":"material/image-filter-black-white.svg","material-image-filter-center-focus-strong-outline":"material/image-filter-center-focus-strong-outline.svg","material-image-filter-center-focus-strong":"material/image-filter-center-focus-strong.svg","material-image-filter-center-focus-weak":"material/image-filter-center-focus-weak.svg","material-image-filter-center-focus":"material/image-filter-center-focus.svg","material-image-filter-drama":"material/image-filter-drama.svg","material-image-filter-frames":"material/image-filter-frames.svg","material-image-filter-hdr":"material/image-filter-hdr.svg","material-image-filter-none":"material/image-filter-none.svg","material-image-filter-tilt-shift":"material/image-filter-tilt-shift.svg","material-image-filter-vintage":"material/image-filter-vintage.svg","material-image-frame":"material/image-frame.svg","material-image-lock-outline":"material/image-lock-outline.svg","material-image-lock":"material/image-lock.svg","material-image-marker-outline":"material/image-marker-outline.svg","material-image-marker":"material/image-marker.svg","material-image-minus-outline":"material/image-minus-outline.svg","material-image-minus":"material/image-minus.svg","material-image-move":"material/image-move.svg","material-image-multiple-outline":"material/image-multiple-outline.svg","material-image-multiple":"material/image-multiple.svg","material-image-off-outline":"material/image-off-outline.svg","material-image-off":"material/image-off.svg","material-image-outline":"material/image-outline.svg","material-image-plus-outline":"material/image-plus-outline.svg","material-image-plus":"material/image-plus.svg","material-image-refresh-outline":"material/image-refresh-outline.svg","material-image-refresh":"material/image-refresh.svg","material-image-remove-outline":"material/image-remove-outline.svg","material-image-remove":"material/image-remove.svg","material-image-search-outline":"material/image-search-outline.svg","material-image-search":"material/image-search.svg","material-image-size-select-actual":"material/image-size-select-actual.svg","material-image-size-select-large":"material/image-size-select-large.svg","material-image-size-select-small":"material/image-size-select-small.svg","material-image-sync-outline":"material/image-sync-outline.svg","material-image-sync":"material/image-sync.svg","material-image-text":"material/image-text.svg","material-image":"material/image.svg","material-import":"material/import.svg","material-inbox-arrow-down-outline":"material/inbox-arrow-down-outline.svg","material-inbox-arrow-down":"material/inbox-arrow-down.svg","material-inbox-arrow-up-outline":"material/inbox-arrow-up-outline.svg","material-inbox-arrow-up":"material/inbox-arrow-up.svg","material-inbox-full-outline":"material/inbox-full-outline.svg","material-inbox-full":"material/inbox-full.svg","material-inbox-multiple-outline":"material/inbox-multiple-outline.svg","material-inbox-multiple":"material/inbox-multiple.svg","material-inbox-outline":"material/inbox-outline.svg","material-inbox-remove-outline":"material/inbox-remove-outline.svg","material-inbox-remove":"material/inbox-remove.svg","material-inbox":"material/inbox.svg","material-incognito-circle-off":"material/incognito-circle-off.svg","material-incognito-circle":"material/incognito-circle.svg","material-incognito-off":"material/incognito-off.svg","material-incognito":"material/incognito.svg","material-induction":"material/induction.svg","material-infinity":"material/infinity.svg","material-information-off-outline":"material/information-off-outline.svg","material-information-off":"material/information-off.svg","material-information-outline":"material/information-outline.svg","material-information-variant":"material/information-variant.svg","material-information":"material/information.svg","material-instagram":"material/instagram.svg","material-instrument-triangle":"material/instrument-triangle.svg","material-integrated-circuit-chip":"material/integrated-circuit-chip.svg","material-invert-colors-off":"material/invert-colors-off.svg","material-invert-colors":"material/invert-colors.svg","material-iobroker":"material/iobroker.svg","material-ip-network-outline":"material/ip-network-outline.svg","material-ip-network":"material/ip-network.svg","material-ip-outline":"material/ip-outline.svg","material-ip":"material/ip.svg","material-ipod":"material/ipod.svg","material-iron-board":"material/iron-board.svg","material-iron-outline":"material/iron-outline.svg","material-iron":"material/iron.svg","material-island":"material/island.svg","material-iv-bag":"material/iv-bag.svg","material-jabber":"material/jabber.svg","material-jeepney":"material/jeepney.svg","material-jellyfish-outline":"material/jellyfish-outline.svg","material-jellyfish":"material/jellyfish.svg","material-jira":"material/jira.svg","material-jquery":"material/jquery.svg","material-jsfiddle":"material/jsfiddle.svg","material-jump-rope":"material/jump-rope.svg","material-kabaddi":"material/kabaddi.svg","material-kangaroo":"material/kangaroo.svg","material-karate":"material/karate.svg","material-kayaking":"material/kayaking.svg","material-keg":"material/keg.svg","material-kettle-alert-outline":"material/kettle-alert-outline.svg","material-kettle-alert":"material/kettle-alert.svg","material-kettle-off-outline":"material/kettle-off-outline.svg","material-kettle-off":"material/kettle-off.svg","material-kettle-outline":"material/kettle-outline.svg","material-kettle-pour-over":"material/kettle-pour-over.svg","material-kettle-steam-outline":"material/kettle-steam-outline.svg","material-kettle-steam":"material/kettle-steam.svg","material-kettle":"material/kettle.svg","material-kettlebell":"material/kettlebell.svg","material-key-alert-outline":"material/key-alert-outline.svg","material-key-alert":"material/key-alert.svg","material-key-arrow-right":"material/key-arrow-right.svg","material-key-chain-variant":"material/key-chain-variant.svg","material-key-chain":"material/key-chain.svg","material-key-change":"material/key-change.svg","material-key-link":"material/key-link.svg","material-key-minus":"material/key-minus.svg","material-key-outline":"material/key-outline.svg","material-key-plus":"material/key-plus.svg","material-key-remove":"material/key-remove.svg","material-key-star":"material/key-star.svg","material-key-variant":"material/key-variant.svg","material-key-wireless":"material/key-wireless.svg","material-key":"material/key.svg","material-keyboard-backspace":"material/keyboard-backspace.svg","material-keyboard-caps":"material/keyboard-caps.svg","material-keyboard-close":"material/keyboard-close.svg","material-keyboard-esc":"material/keyboard-esc.svg","material-keyboard-f1":"material/keyboard-f1.svg","material-keyboard-f10":"material/keyboard-f10.svg","material-keyboard-f11":"material/keyboard-f11.svg","material-keyboard-f12":"material/keyboard-f12.svg","material-keyboard-f2":"material/keyboard-f2.svg","material-keyboard-f3":"material/keyboard-f3.svg","material-keyboard-f4":"material/keyboard-f4.svg","material-keyboard-f5":"material/keyboard-f5.svg","material-keyboard-f6":"material/keyboard-f6.svg","material-keyboard-f7":"material/keyboard-f7.svg","material-keyboard-f8":"material/keyboard-f8.svg","material-keyboard-f9":"material/keyboard-f9.svg","material-keyboard-off-outline":"material/keyboard-off-outline.svg","material-keyboard-off":"material/keyboard-off.svg","material-keyboard-outline":"material/keyboard-outline.svg","material-keyboard-return":"material/keyboard-return.svg","material-keyboard-settings-outline":"material/keyboard-settings-outline.svg","material-keyboard-settings":"material/keyboard-settings.svg","material-keyboard-space":"material/keyboard-space.svg","material-keyboard-tab-reverse":"material/keyboard-tab-reverse.svg","material-keyboard-tab":"material/keyboard-tab.svg","material-keyboard-variant":"material/keyboard-variant.svg","material-keyboard":"material/keyboard.svg","material-khanda":"material/khanda.svg","material-kickstarter":"material/kickstarter.svg","material-kite-outline":"material/kite-outline.svg","material-kite":"material/kite.svg","material-kitesurfing":"material/kitesurfing.svg","material-klingon":"material/klingon.svg","material-knife-military":"material/knife-military.svg","material-knife":"material/knife.svg","material-knob":"material/knob.svg","material-koala":"material/koala.svg","material-kodi":"material/kodi.svg","material-kubernetes":"material/kubernetes.svg","material-label-multiple-outline":"material/label-multiple-outline.svg","material-label-multiple":"material/label-multiple.svg","material-label-off-outline":"material/label-off-outline.svg","material-label-off":"material/label-off.svg","material-label-outline":"material/label-outline.svg","material-label-percent-outline":"material/label-percent-outline.svg","material-label-percent":"material/label-percent.svg","material-label-variant-outline":"material/label-variant-outline.svg","material-label-variant":"material/label-variant.svg","material-label":"material/label.svg","material-ladder":"material/ladder.svg","material-ladybug":"material/ladybug.svg","material-lambda":"material/lambda.svg","material-lamp-outline":"material/lamp-outline.svg","material-lamp":"material/lamp.svg","material-lamps-outline":"material/lamps-outline.svg","material-lamps":"material/lamps.svg","material-lan-check":"material/lan-check.svg","material-lan-connect":"material/lan-connect.svg","material-lan-disconnect":"material/lan-disconnect.svg","material-lan-pending":"material/lan-pending.svg","material-lan":"material/lan.svg","material-land-fields":"material/land-fields.svg","material-land-plots-circle-variant":"material/land-plots-circle-variant.svg","material-land-plots-circle":"material/land-plots-circle.svg","material-land-plots":"material/land-plots.svg","material-land-rows-horizontal":"material/land-rows-horizontal.svg","material-land-rows-vertical":"material/land-rows-vertical.svg","material-landslide-outline":"material/landslide-outline.svg","material-landslide":"material/landslide.svg","material-language-c":"material/language-c.svg","material-language-cpp":"material/language-cpp.svg","material-language-csharp":"material/language-csharp.svg","material-language-css3":"material/language-css3.svg","material-language-fortran":"material/language-fortran.svg","material-language-go":"material/language-go.svg","material-language-haskell":"material/language-haskell.svg","material-language-html5":"material/language-html5.svg","material-language-java":"material/language-java.svg","material-language-javascript":"material/language-javascript.svg","material-language-kotlin":"material/language-kotlin.svg","material-language-lua":"material/language-lua.svg","material-language-markdown-outline":"material/language-markdown-outline.svg","material-language-markdown":"material/language-markdown.svg","material-language-php":"material/language-php.svg","material-language-python":"material/language-python.svg","material-language-r":"material/language-r.svg","material-language-ruby-on-rails":"material/language-ruby-on-rails.svg","material-language-ruby":"material/language-ruby.svg","material-language-rust":"material/language-rust.svg","material-language-swift":"material/language-swift.svg","material-language-typescript":"material/language-typescript.svg","material-language-xaml":"material/language-xaml.svg","material-laptop-account":"material/laptop-account.svg","material-laptop-off":"material/laptop-off.svg","material-laptop":"material/laptop.svg","material-laravel":"material/laravel.svg","material-laser-pointer":"material/laser-pointer.svg","material-lasso":"material/lasso.svg","material-lastpass":"material/lastpass.svg","material-latitude":"material/latitude.svg","material-launch":"material/launch.svg","material-lava-lamp":"material/lava-lamp.svg","material-layers-edit":"material/layers-edit.svg","material-layers-minus":"material/layers-minus.svg","material-layers-off-outline":"material/layers-off-outline.svg","material-layers-off":"material/layers-off.svg","material-layers-outline":"material/layers-outline.svg","material-layers-plus":"material/layers-plus.svg","material-layers-remove":"material/layers-remove.svg","material-layers-search-outline":"material/layers-search-outline.svg","material-layers-search":"material/layers-search.svg","material-layers-triple-outline":"material/layers-triple-outline.svg","material-layers-triple":"material/layers-triple.svg","material-layers":"material/layers.svg","material-lead-pencil":"material/lead-pencil.svg","material-leaf-circle-outline":"material/leaf-circle-outline.svg","material-leaf-circle":"material/leaf-circle.svg","material-leaf-maple-off":"material/leaf-maple-off.svg","material-leaf-maple":"material/leaf-maple.svg","material-leaf-off":"material/leaf-off.svg","material-leaf":"material/leaf.svg","material-leak-off":"material/leak-off.svg","material-leak":"material/leak.svg","material-lectern":"material/lectern.svg","material-led-off":"material/led-off.svg","material-led-on":"material/led-on.svg","material-led-outline":"material/led-outline.svg","material-led-strip-variant-off":"material/led-strip-variant-off.svg","material-led-strip-variant":"material/led-strip-variant.svg","material-led-strip":"material/led-strip.svg","material-led-variant-off":"material/led-variant-off.svg","material-led-variant-on":"material/led-variant-on.svg","material-led-variant-outline":"material/led-variant-outline.svg","material-leek":"material/leek.svg","material-less-than-or-equal":"material/less-than-or-equal.svg","material-less-than":"material/less-than.svg","material-library-outline":"material/library-outline.svg","material-library-shelves":"material/library-shelves.svg","material-library":"material/library.svg","material-license":"material/license.svg","material-lifebuoy":"material/lifebuoy.svg","material-light-flood-down":"material/light-flood-down.svg","material-light-flood-up":"material/light-flood-up.svg","material-light-recessed":"material/light-recessed.svg","material-light-switch-off":"material/light-switch-off.svg","material-light-switch":"material/light-switch.svg","material-lightbulb-alert-outline":"material/lightbulb-alert-outline.svg","material-lightbulb-alert":"material/lightbulb-alert.svg","material-lightbulb-auto-outline":"material/lightbulb-auto-outline.svg","material-lightbulb-auto":"material/lightbulb-auto.svg","material-lightbulb-cfl-off":"material/lightbulb-cfl-off.svg","material-lightbulb-cfl-spiral-off":"material/lightbulb-cfl-spiral-off.svg","material-lightbulb-cfl-spiral":"material/lightbulb-cfl-spiral.svg","material-lightbulb-cfl":"material/lightbulb-cfl.svg","material-lightbulb-fluorescent-tube-outline":"material/lightbulb-fluorescent-tube-outline.svg","material-lightbulb-fluorescent-tube":"material/lightbulb-fluorescent-tube.svg","material-lightbulb-group-off-outline":"material/lightbulb-group-off-outline.svg","material-lightbulb-group-off":"material/lightbulb-group-off.svg","material-lightbulb-group-outline":"material/lightbulb-group-outline.svg","material-lightbulb-group":"material/lightbulb-group.svg","material-lightbulb-multiple-off-outline":"material/lightbulb-multiple-off-outline.svg","material-lightbulb-multiple-off":"material/lightbulb-multiple-off.svg","material-lightbulb-multiple-outline":"material/lightbulb-multiple-outline.svg","material-lightbulb-multiple":"material/lightbulb-multiple.svg","material-lightbulb-night-outline":"material/lightbulb-night-outline.svg","material-lightbulb-night":"material/lightbulb-night.svg","material-lightbulb-off-outline":"material/lightbulb-off-outline.svg","material-lightbulb-off":"material/lightbulb-off.svg","material-lightbulb-on-10":"material/lightbulb-on-10.svg","material-lightbulb-on-20":"material/lightbulb-on-20.svg","material-lightbulb-on-30":"material/lightbulb-on-30.svg","material-lightbulb-on-40":"material/lightbulb-on-40.svg","material-lightbulb-on-50":"material/lightbulb-on-50.svg","material-lightbulb-on-60":"material/lightbulb-on-60.svg","material-lightbulb-on-70":"material/lightbulb-on-70.svg","material-lightbulb-on-80":"material/lightbulb-on-80.svg","material-lightbulb-on-90":"material/lightbulb-on-90.svg","material-lightbulb-on-outline":"material/lightbulb-on-outline.svg","material-lightbulb-on":"material/lightbulb-on.svg","material-lightbulb-outline":"material/lightbulb-outline.svg","material-lightbulb-question-outline":"material/lightbulb-question-outline.svg","material-lightbulb-question":"material/lightbulb-question.svg","material-lightbulb-spot-off":"material/lightbulb-spot-off.svg","material-lightbulb-spot":"material/lightbulb-spot.svg","material-lightbulb-variant-outline":"material/lightbulb-variant-outline.svg","material-lightbulb-variant":"material/lightbulb-variant.svg","material-lightbulb":"material/lightbulb.svg","material-lighthouse-on":"material/lighthouse-on.svg","material-lighthouse":"material/lighthouse.svg","material-lightning-bolt-circle":"material/lightning-bolt-circle.svg","material-lightning-bolt-outline":"material/lightning-bolt-outline.svg","material-lightning-bolt":"material/lightning-bolt.svg","material-line-scan":"material/line-scan.svg","material-lingerie":"material/lingerie.svg","material-link-box-outline":"material/link-box-outline.svg","material-link-box-variant-outline":"material/link-box-variant-outline.svg","material-link-box-variant":"material/link-box-variant.svg","material-link-box":"material/link-box.svg","material-link-lock":"material/link-lock.svg","material-link-off":"material/link-off.svg","material-link-plus":"material/link-plus.svg","material-link-variant-minus":"material/link-variant-minus.svg","material-link-variant-off":"material/link-variant-off.svg","material-link-variant-plus":"material/link-variant-plus.svg","material-link-variant-remove":"material/link-variant-remove.svg","material-link-variant":"material/link-variant.svg","material-link":"material/link.svg","material-linkedin":"material/linkedin.svg","material-linux-mint":"material/linux-mint.svg","material-linux":"material/linux.svg","material-lipstick":"material/lipstick.svg","material-liquid-spot":"material/liquid-spot.svg","material-liquor":"material/liquor.svg","material-list-box-outline":"material/list-box-outline.svg","material-list-box":"material/list-box.svg","material-list-status":"material/list-status.svg","material-litecoin":"material/litecoin.svg","material-loading":"material/loading.svg","material-location-enter":"material/location-enter.svg","material-location-exit":"material/location-exit.svg","material-lock-alert-outline":"material/lock-alert-outline.svg","material-lock-alert":"material/lock-alert.svg","material-lock-check-outline":"material/lock-check-outline.svg","material-lock-check":"material/lock-check.svg","material-lock-clock":"material/lock-clock.svg","material-lock-minus-outline":"material/lock-minus-outline.svg","material-lock-minus":"material/lock-minus.svg","material-lock-off-outline":"material/lock-off-outline.svg","material-lock-off":"material/lock-off.svg","material-lock-open-alert-outline":"material/lock-open-alert-outline.svg","material-lock-open-alert":"material/lock-open-alert.svg","material-lock-open-check-outline":"material/lock-open-check-outline.svg","material-lock-open-check":"material/lock-open-check.svg","material-lock-open-minus-outline":"material/lock-open-minus-outline.svg","material-lock-open-minus":"material/lock-open-minus.svg","material-lock-open-outline":"material/lock-open-outline.svg","material-lock-open-plus-outline":"material/lock-open-plus-outline.svg","material-lock-open-plus":"material/lock-open-plus.svg","material-lock-open-remove-outline":"material/lock-open-remove-outline.svg","material-lock-open-remove":"material/lock-open-remove.svg","material-lock-open-variant-outline":"material/lock-open-variant-outline.svg","material-lock-open-variant":"material/lock-open-variant.svg","material-lock-open":"material/lock-open.svg","material-lock-outline":"material/lock-outline.svg","material-lock-pattern":"material/lock-pattern.svg","material-lock-plus-outline":"material/lock-plus-outline.svg","material-lock-plus":"material/lock-plus.svg","material-lock-question":"material/lock-question.svg","material-lock-remove-outline":"material/lock-remove-outline.svg","material-lock-remove":"material/lock-remove.svg","material-lock-reset":"material/lock-reset.svg","material-lock-smart":"material/lock-smart.svg","material-lock":"material/lock.svg","material-locker-multiple":"material/locker-multiple.svg","material-locker":"material/locker.svg","material-login-variant":"material/login-variant.svg","material-login":"material/login.svg","material-logout-variant":"material/logout-variant.svg","material-logout":"material/logout.svg","material-longitude":"material/longitude.svg","material-looks":"material/looks.svg","material-lotion-outline":"material/lotion-outline.svg","material-lotion-plus-outline":"material/lotion-plus-outline.svg","material-lotion-plus":"material/lotion-plus.svg","material-lotion":"material/lotion.svg","material-loupe":"material/loupe.svg","material-lumx":"material/lumx.svg","material-lungs":"material/lungs.svg","material-mace":"material/mace.svg","material-magazine-pistol":"material/magazine-pistol.svg","material-magazine-rifle":"material/magazine-rifle.svg","material-magic-staff":"material/magic-staff.svg","material-magnet-on":"material/magnet-on.svg","material-magnet":"material/magnet.svg","material-magnify-close":"material/magnify-close.svg","material-magnify-expand":"material/magnify-expand.svg","material-magnify-minus-cursor":"material/magnify-minus-cursor.svg","material-magnify-minus-outline":"material/magnify-minus-outline.svg","material-magnify-minus":"material/magnify-minus.svg","material-magnify-plus-cursor":"material/magnify-plus-cursor.svg","material-magnify-plus-outline":"material/magnify-plus-outline.svg","material-magnify-plus":"material/magnify-plus.svg","material-magnify-remove-cursor":"material/magnify-remove-cursor.svg","material-magnify-remove-outline":"material/magnify-remove-outline.svg","material-magnify-scan":"material/magnify-scan.svg","material-magnify":"material/magnify.svg","material-mail":"material/mail.svg","material-mailbox-open-outline":"material/mailbox-open-outline.svg","material-mailbox-open-up-outline":"material/mailbox-open-up-outline.svg","material-mailbox-open-up":"material/mailbox-open-up.svg","material-mailbox-open":"material/mailbox-open.svg","material-mailbox-outline":"material/mailbox-outline.svg","material-mailbox-up-outline":"material/mailbox-up-outline.svg","material-mailbox-up":"material/mailbox-up.svg","material-mailbox":"material/mailbox.svg","material-manjaro":"material/manjaro.svg","material-map-check-outline":"material/map-check-outline.svg","material-map-check":"material/map-check.svg","material-map-clock-outline":"material/map-clock-outline.svg","material-map-clock":"material/map-clock.svg","material-map-legend":"material/map-legend.svg","material-map-marker-account-outline":"material/map-marker-account-outline.svg","material-map-marker-account":"material/map-marker-account.svg","material-map-marker-alert-outline":"material/map-marker-alert-outline.svg","material-map-marker-alert":"material/map-marker-alert.svg","material-map-marker-check-outline":"material/map-marker-check-outline.svg","material-map-marker-check":"material/map-marker-check.svg","material-map-marker-circle":"material/map-marker-circle.svg","material-map-marker-distance":"material/map-marker-distance.svg","material-map-marker-down":"material/map-marker-down.svg","material-map-marker-left-outline":"material/map-marker-left-outline.svg","material-map-marker-left":"material/map-marker-left.svg","material-map-marker-minus-outline":"material/map-marker-minus-outline.svg","material-map-marker-minus":"material/map-marker-minus.svg","material-map-marker-multiple-outline":"material/map-marker-multiple-outline.svg","material-map-marker-multiple":"material/map-marker-multiple.svg","material-map-marker-off-outline":"material/map-marker-off-outline.svg","material-map-marker-off":"material/map-marker-off.svg","material-map-marker-outline":"material/map-marker-outline.svg","material-map-marker-path":"material/map-marker-path.svg","material-map-marker-plus-outline":"material/map-marker-plus-outline.svg","material-map-marker-plus":"material/map-marker-plus.svg","material-map-marker-question-outline":"material/map-marker-question-outline.svg","material-map-marker-question":"material/map-marker-question.svg","material-map-marker-radius-outline":"material/map-marker-radius-outline.svg","material-map-marker-radius":"material/map-marker-radius.svg","material-map-marker-remove-outline":"material/map-marker-remove-outline.svg","material-map-marker-remove-variant":"material/map-marker-remove-variant.svg","material-map-marker-remove":"material/map-marker-remove.svg","material-map-marker-right-outline":"material/map-marker-right-outline.svg","material-map-marker-right":"material/map-marker-right.svg","material-map-marker-star-outline":"material/map-marker-star-outline.svg","material-map-marker-star":"material/map-marker-star.svg","material-map-marker-up":"material/map-marker-up.svg","material-map-marker":"material/map-marker.svg","material-map-minus":"material/map-minus.svg","material-map-outline":"material/map-outline.svg","material-map-plus":"material/map-plus.svg","material-map-search-outline":"material/map-search-outline.svg","material-map-search":"material/map-search.svg","material-map":"material/map.svg","material-mapbox":"material/mapbox.svg","material-margin":"material/margin.svg","material-marker-cancel":"material/marker-cancel.svg","material-marker-check":"material/marker-check.svg","material-marker":"material/marker.svg","material-mastodon":"material/mastodon.svg","material-material-design":"material/material-design.svg","material-material-ui":"material/material-ui.svg","material-math-compass":"material/math-compass.svg","material-math-cos":"material/math-cos.svg","material-math-integral-box":"material/math-integral-box.svg","material-math-integral":"material/math-integral.svg","material-math-log":"material/math-log.svg","material-math-norm-box":"material/math-norm-box.svg","material-math-norm":"material/math-norm.svg","material-math-sin":"material/math-sin.svg","material-math-tan":"material/math-tan.svg","material-matrix":"material/matrix.svg","material-medal-outline":"material/medal-outline.svg","material-medal":"material/medal.svg","material-medical-bag":"material/medical-bag.svg","material-medical-cotton-swab":"material/medical-cotton-swab.svg","material-medication-outline":"material/medication-outline.svg","material-medication":"material/medication.svg","material-meditation":"material/meditation.svg","material-memory":"material/memory.svg","material-menorah-fire":"material/menorah-fire.svg","material-menorah":"material/menorah.svg","material-menu-down-outline":"material/menu-down-outline.svg","material-menu-down":"material/menu-down.svg","material-menu-left-outline":"material/menu-left-outline.svg","material-menu-left":"material/menu-left.svg","material-menu-open":"material/menu-open.svg","material-menu-right-outline":"material/menu-right-outline.svg","material-menu-right":"material/menu-right.svg","material-menu-swap-outline":"material/menu-swap-outline.svg","material-menu-swap":"material/menu-swap.svg","material-menu-up-outline":"material/menu-up-outline.svg","material-menu-up":"material/menu-up.svg","material-menu":"material/menu.svg","material-merge":"material/merge.svg","material-message-alert-outline":"material/message-alert-outline.svg","material-message-alert":"material/message-alert.svg","material-message-arrow-left-outline":"material/message-arrow-left-outline.svg","material-message-arrow-left":"material/message-arrow-left.svg","material-message-arrow-right-outline":"material/message-arrow-right-outline.svg","material-message-arrow-right":"material/message-arrow-right.svg","material-message-badge-outline":"material/message-badge-outline.svg","material-message-badge":"material/message-badge.svg","material-message-bookmark-outline":"material/message-bookmark-outline.svg","material-message-bookmark":"material/message-bookmark.svg","material-message-bulleted-off":"material/message-bulleted-off.svg","material-message-bulleted":"material/message-bulleted.svg","material-message-check-outline":"material/message-check-outline.svg","material-message-check":"material/message-check.svg","material-message-cog-outline":"material/message-cog-outline.svg","material-message-cog":"material/message-cog.svg","material-message-draw":"material/message-draw.svg","material-message-fast-outline":"material/message-fast-outline.svg","material-message-fast":"material/message-fast.svg","material-message-flash-outline":"material/message-flash-outline.svg","material-message-flash":"material/message-flash.svg","material-message-image-outline":"material/message-image-outline.svg","material-message-image":"material/message-image.svg","material-message-lock-outline":"material/message-lock-outline.svg","material-message-lock":"material/message-lock.svg","material-message-minus-outline":"material/message-minus-outline.svg","material-message-minus":"material/message-minus.svg","material-message-off-outline":"material/message-off-outline.svg","material-message-off":"material/message-off.svg","material-message-outline":"material/message-outline.svg","material-message-plus-outline":"material/message-plus-outline.svg","material-message-plus":"material/message-plus.svg","material-message-processing-outline":"material/message-processing-outline.svg","material-message-processing":"material/message-processing.svg","material-message-question-outline":"material/message-question-outline.svg","material-message-question":"material/message-question.svg","material-message-reply-outline":"material/message-reply-outline.svg","material-message-reply-text-outline":"material/message-reply-text-outline.svg","material-message-reply-text":"material/message-reply-text.svg","material-message-reply":"material/message-reply.svg","material-message-settings-outline":"material/message-settings-outline.svg","material-message-settings":"material/message-settings.svg","material-message-star-outline":"material/message-star-outline.svg","material-message-star":"material/message-star.svg","material-message-text-clock-outline":"material/message-text-clock-outline.svg","material-message-text-clock":"material/message-text-clock.svg","material-message-text-fast-outline":"material/message-text-fast-outline.svg","material-message-text-fast":"material/message-text-fast.svg","material-message-text-lock-outline":"material/message-text-lock-outline.svg","material-message-text-lock":"material/message-text-lock.svg","material-message-text-outline":"material/message-text-outline.svg","material-message-text":"material/message-text.svg","material-message-video":"material/message-video.svg","material-message":"material/message.svg","material-meteor":"material/meteor.svg","material-meter-electric-outline":"material/meter-electric-outline.svg","material-meter-electric":"material/meter-electric.svg","material-meter-gas-outline":"material/meter-gas-outline.svg","material-meter-gas":"material/meter-gas.svg","material-metronome-tick":"material/metronome-tick.svg","material-metronome":"material/metronome.svg","material-micro-sd":"material/micro-sd.svg","material-microphone-message-off":"material/microphone-message-off.svg","material-microphone-message":"material/microphone-message.svg","material-microphone-minus":"material/microphone-minus.svg","material-microphone-off":"material/microphone-off.svg","material-microphone-outline":"material/microphone-outline.svg","material-microphone-plus":"material/microphone-plus.svg","material-microphone-question-outline":"material/microphone-question-outline.svg","material-microphone-question":"material/microphone-question.svg","material-microphone-settings":"material/microphone-settings.svg","material-microphone-variant-off":"material/microphone-variant-off.svg","material-microphone-variant":"material/microphone-variant.svg","material-microphone":"material/microphone.svg","material-microscope":"material/microscope.svg","material-microsoft-access":"material/microsoft-access.svg","material-microsoft-azure-devops":"material/microsoft-azure-devops.svg","material-microsoft-azure":"material/microsoft-azure.svg","material-microsoft-bing":"material/microsoft-bing.svg","material-microsoft-dynamics-365":"material/microsoft-dynamics-365.svg","material-microsoft-edge":"material/microsoft-edge.svg","material-microsoft-excel":"material/microsoft-excel.svg","material-microsoft-internet-explorer":"material/microsoft-internet-explorer.svg","material-microsoft-office":"material/microsoft-office.svg","material-microsoft-onedrive":"material/microsoft-onedrive.svg","material-microsoft-onenote":"material/microsoft-onenote.svg","material-microsoft-outlook":"material/microsoft-outlook.svg","material-microsoft-powerpoint":"material/microsoft-powerpoint.svg","material-microsoft-sharepoint":"material/microsoft-sharepoint.svg","material-microsoft-teams":"material/microsoft-teams.svg","material-microsoft-visual-studio-code":"material/microsoft-visual-studio-code.svg","material-microsoft-visual-studio":"material/microsoft-visual-studio.svg","material-microsoft-windows-classic":"material/microsoft-windows-classic.svg","material-microsoft-windows":"material/microsoft-windows.svg","material-microsoft-word":"material/microsoft-word.svg","material-microsoft-xbox-controller-battery-alert":"material/microsoft-xbox-controller-battery-alert.svg","material-microsoft-xbox-controller-battery-charging":"material/microsoft-xbox-controller-battery-charging.svg","material-microsoft-xbox-controller-battery-empty":"material/microsoft-xbox-controller-battery-empty.svg","material-microsoft-xbox-controller-battery-full":"material/microsoft-xbox-controller-battery-full.svg","material-microsoft-xbox-controller-battery-low":"material/microsoft-xbox-controller-battery-low.svg","material-microsoft-xbox-controller-battery-medium":"material/microsoft-xbox-controller-battery-medium.svg","material-microsoft-xbox-controller-battery-unknown":"material/microsoft-xbox-controller-battery-unknown.svg","material-microsoft-xbox-controller-menu":"material/microsoft-xbox-controller-menu.svg","material-microsoft-xbox-controller-off":"material/microsoft-xbox-controller-off.svg","material-microsoft-xbox-controller-view":"material/microsoft-xbox-controller-view.svg","material-microsoft-xbox-controller":"material/microsoft-xbox-controller.svg","material-microsoft-xbox":"material/microsoft-xbox.svg","material-microsoft":"material/microsoft.svg","material-microwave-off":"material/microwave-off.svg","material-microwave":"material/microwave.svg","material-middleware-outline":"material/middleware-outline.svg","material-middleware":"material/middleware.svg","material-midi-port":"material/midi-port.svg","material-midi":"material/midi.svg","material-mine":"material/mine.svg","material-minecraft":"material/minecraft.svg","material-mini-sd":"material/mini-sd.svg","material-minidisc":"material/minidisc.svg","material-minus-box-multiple-outline":"material/minus-box-multiple-outline.svg","material-minus-box-multiple":"material/minus-box-multiple.svg","material-minus-box-outline":"material/minus-box-outline.svg","material-minus-box":"material/minus-box.svg","material-minus-circle-multiple-outline":"material/minus-circle-multiple-outline.svg","material-minus-circle-multiple":"material/minus-circle-multiple.svg","material-minus-circle-off-outline":"material/minus-circle-off-outline.svg","material-minus-circle-off":"material/minus-circle-off.svg","material-minus-circle-outline":"material/minus-circle-outline.svg","material-minus-circle":"material/minus-circle.svg","material-minus-network-outline":"material/minus-network-outline.svg","material-minus-network":"material/minus-network.svg","material-minus-thick":"material/minus-thick.svg","material-minus":"material/minus.svg","material-mirror-rectangle":"material/mirror-rectangle.svg","material-mirror-variant":"material/mirror-variant.svg","material-mirror":"material/mirror.svg","material-mixed-martial-arts":"material/mixed-martial-arts.svg","material-mixed-reality":"material/mixed-reality.svg","material-molecule-co":"material/molecule-co.svg","material-molecule-co2":"material/molecule-co2.svg","material-molecule":"material/molecule.svg","material-monitor-account":"material/monitor-account.svg","material-monitor-arrow-down-variant":"material/monitor-arrow-down-variant.svg","material-monitor-arrow-down":"material/monitor-arrow-down.svg","material-monitor-cellphone-star":"material/monitor-cellphone-star.svg","material-monitor-cellphone":"material/monitor-cellphone.svg","material-monitor-dashboard":"material/monitor-dashboard.svg","material-monitor-edit":"material/monitor-edit.svg","material-monitor-eye":"material/monitor-eye.svg","material-monitor-lock":"material/monitor-lock.svg","material-monitor-multiple":"material/monitor-multiple.svg","material-monitor-off":"material/monitor-off.svg","material-monitor-screenshot":"material/monitor-screenshot.svg","material-monitor-share":"material/monitor-share.svg","material-monitor-shimmer":"material/monitor-shimmer.svg","material-monitor-small":"material/monitor-small.svg","material-monitor-speaker-off":"material/monitor-speaker-off.svg","material-monitor-speaker":"material/monitor-speaker.svg","material-monitor-star":"material/monitor-star.svg","material-monitor":"material/monitor.svg","material-moon-first-quarter":"material/moon-first-quarter.svg","material-moon-full":"material/moon-full.svg","material-moon-last-quarter":"material/moon-last-quarter.svg","material-moon-new":"material/moon-new.svg","material-moon-waning-crescent":"material/moon-waning-crescent.svg","material-moon-waning-gibbous":"material/moon-waning-gibbous.svg","material-moon-waxing-crescent":"material/moon-waxing-crescent.svg","material-moon-waxing-gibbous":"material/moon-waxing-gibbous.svg","material-moped-electric-outline":"material/moped-electric-outline.svg","material-moped-electric":"material/moped-electric.svg","material-moped-outline":"material/moped-outline.svg","material-moped":"material/moped.svg","material-more":"material/more.svg","material-mortar-pestle-plus":"material/mortar-pestle-plus.svg","material-mortar-pestle":"material/mortar-pestle.svg","material-mosque-outline":"material/mosque-outline.svg","material-mosque":"material/mosque.svg","material-mother-heart":"material/mother-heart.svg","material-mother-nurse":"material/mother-nurse.svg","material-motion-outline":"material/motion-outline.svg","material-motion-pause-outline":"material/motion-pause-outline.svg","material-motion-pause":"material/motion-pause.svg","material-motion-play-outline":"material/motion-play-outline.svg","material-motion-play":"material/motion-play.svg","material-motion-sensor-off":"material/motion-sensor-off.svg","material-motion-sensor":"material/motion-sensor.svg","material-motion":"material/motion.svg","material-motorbike-electric":"material/motorbike-electric.svg","material-motorbike-off":"material/motorbike-off.svg","material-motorbike":"material/motorbike.svg","material-mouse-bluetooth":"material/mouse-bluetooth.svg","material-mouse-move-down":"material/mouse-move-down.svg","material-mouse-move-up":"material/mouse-move-up.svg","material-mouse-move-vertical":"material/mouse-move-vertical.svg","material-mouse-off":"material/mouse-off.svg","material-mouse-variant-off":"material/mouse-variant-off.svg","material-mouse-variant":"material/mouse-variant.svg","material-mouse":"material/mouse.svg","material-move-resize-variant":"material/move-resize-variant.svg","material-move-resize":"material/move-resize.svg","material-movie-check-outline":"material/movie-check-outline.svg","material-movie-check":"material/movie-check.svg","material-movie-cog-outline":"material/movie-cog-outline.svg","material-movie-cog":"material/movie-cog.svg","material-movie-edit-outline":"material/movie-edit-outline.svg","material-movie-edit":"material/movie-edit.svg","material-movie-filter-outline":"material/movie-filter-outline.svg","material-movie-filter":"material/movie-filter.svg","material-movie-minus-outline":"material/movie-minus-outline.svg","material-movie-minus":"material/movie-minus.svg","material-movie-off-outline":"material/movie-off-outline.svg","material-movie-off":"material/movie-off.svg","material-movie-open-check-outline":"material/movie-open-check-outline.svg","material-movie-open-check":"material/movie-open-check.svg","material-movie-open-cog-outline":"material/movie-open-cog-outline.svg","material-movie-open-cog":"material/movie-open-cog.svg","material-movie-open-edit-outline":"material/movie-open-edit-outline.svg","material-movie-open-edit":"material/movie-open-edit.svg","material-movie-open-minus-outline":"material/movie-open-minus-outline.svg","material-movie-open-minus":"material/movie-open-minus.svg","material-movie-open-off-outline":"material/movie-open-off-outline.svg","material-movie-open-off":"material/movie-open-off.svg","material-movie-open-outline":"material/movie-open-outline.svg","material-movie-open-play-outline":"material/movie-open-play-outline.svg","material-movie-open-play":"material/movie-open-play.svg","material-movie-open-plus-outline":"material/movie-open-plus-outline.svg","material-movie-open-plus":"material/movie-open-plus.svg","material-movie-open-remove-outline":"material/movie-open-remove-outline.svg","material-movie-open-remove":"material/movie-open-remove.svg","material-movie-open-settings-outline":"material/movie-open-settings-outline.svg","material-movie-open-settings":"material/movie-open-settings.svg","material-movie-open-star-outline":"material/movie-open-star-outline.svg","material-movie-open-star":"material/movie-open-star.svg","material-movie-open":"material/movie-open.svg","material-movie-outline":"material/movie-outline.svg","material-movie-play-outline":"material/movie-play-outline.svg","material-movie-play":"material/movie-play.svg","material-movie-plus-outline":"material/movie-plus-outline.svg","material-movie-plus":"material/movie-plus.svg","material-movie-remove-outline":"material/movie-remove-outline.svg","material-movie-remove":"material/movie-remove.svg","material-movie-roll":"material/movie-roll.svg","material-movie-search-outline":"material/movie-search-outline.svg","material-movie-search":"material/movie-search.svg","material-movie-settings-outline":"material/movie-settings-outline.svg","material-movie-settings":"material/movie-settings.svg","material-movie-star-outline":"material/movie-star-outline.svg","material-movie-star":"material/movie-star.svg","material-movie":"material/movie.svg","material-mower-bag-on":"material/mower-bag-on.svg","material-mower-bag":"material/mower-bag.svg","material-mower-on":"material/mower-on.svg","material-mower":"material/mower.svg","material-muffin":"material/muffin.svg","material-multicast":"material/multicast.svg","material-multimedia":"material/multimedia.svg","material-multiplication-box":"material/multiplication-box.svg","material-multiplication":"material/multiplication.svg","material-mushroom-off-outline":"material/mushroom-off-outline.svg","material-mushroom-off":"material/mushroom-off.svg","material-mushroom-outline":"material/mushroom-outline.svg","material-mushroom":"material/mushroom.svg","material-music-accidental-double-flat":"material/music-accidental-double-flat.svg","material-music-accidental-double-sharp":"material/music-accidental-double-sharp.svg","material-music-accidental-flat":"material/music-accidental-flat.svg","material-music-accidental-natural":"material/music-accidental-natural.svg","material-music-accidental-sharp":"material/music-accidental-sharp.svg","material-music-box-multiple-outline":"material/music-box-multiple-outline.svg","material-music-box-multiple":"material/music-box-multiple.svg","material-music-box-outline":"material/music-box-outline.svg","material-music-box":"material/music-box.svg","material-music-circle-outline":"material/music-circle-outline.svg","material-music-circle":"material/music-circle.svg","material-music-clef-alto":"material/music-clef-alto.svg","material-music-clef-bass":"material/music-clef-bass.svg","material-music-clef-treble":"material/music-clef-treble.svg","material-music-note-bluetooth-off":"material/music-note-bluetooth-off.svg","material-music-note-bluetooth":"material/music-note-bluetooth.svg","material-music-note-eighth-dotted":"material/music-note-eighth-dotted.svg","material-music-note-eighth":"material/music-note-eighth.svg","material-music-note-half-dotted":"material/music-note-half-dotted.svg","material-music-note-half":"material/music-note-half.svg","material-music-note-minus":"material/music-note-minus.svg","material-music-note-off-outline":"material/music-note-off-outline.svg","material-music-note-off":"material/music-note-off.svg","material-music-note-outline":"material/music-note-outline.svg","material-music-note-plus":"material/music-note-plus.svg","material-music-note-quarter-dotted":"material/music-note-quarter-dotted.svg","material-music-note-quarter":"material/music-note-quarter.svg","material-music-note-sixteenth-dotted":"material/music-note-sixteenth-dotted.svg","material-music-note-sixteenth":"material/music-note-sixteenth.svg","material-music-note-whole-dotted":"material/music-note-whole-dotted.svg","material-music-note-whole":"material/music-note-whole.svg","material-music-note":"material/music-note.svg","material-music-off":"material/music-off.svg","material-music-rest-eighth":"material/music-rest-eighth.svg","material-music-rest-half":"material/music-rest-half.svg","material-music-rest-quarter":"material/music-rest-quarter.svg","material-music-rest-sixteenth":"material/music-rest-sixteenth.svg","material-music-rest-whole":"material/music-rest-whole.svg","material-music":"material/music.svg","material-mustache":"material/mustache.svg","material-nail":"material/nail.svg","material-nas":"material/nas.svg","material-nativescript":"material/nativescript.svg","material-nature-people":"material/nature-people.svg","material-nature":"material/nature.svg","material-navigation-outline":"material/navigation-outline.svg","material-navigation-variant-outline":"material/navigation-variant-outline.svg","material-navigation-variant":"material/navigation-variant.svg","material-navigation":"material/navigation.svg","material-near-me":"material/near-me.svg","material-necklace":"material/necklace.svg","material-needle-off":"material/needle-off.svg","material-needle":"material/needle.svg","material-netflix":"material/netflix.svg","material-network-off-outline":"material/network-off-outline.svg","material-network-off":"material/network-off.svg","material-network-outline":"material/network-outline.svg","material-network-pos":"material/network-pos.svg","material-network-strength-1-alert":"material/network-strength-1-alert.svg","material-network-strength-1":"material/network-strength-1.svg","material-network-strength-2-alert":"material/network-strength-2-alert.svg","material-network-strength-2":"material/network-strength-2.svg","material-network-strength-3-alert":"material/network-strength-3-alert.svg","material-network-strength-3":"material/network-strength-3.svg","material-network-strength-4-alert":"material/network-strength-4-alert.svg","material-network-strength-4-cog":"material/network-strength-4-cog.svg","material-network-strength-4":"material/network-strength-4.svg","material-network-strength-off-outline":"material/network-strength-off-outline.svg","material-network-strength-off":"material/network-strength-off.svg","material-network-strength-outline":"material/network-strength-outline.svg","material-network":"material/network.svg","material-new-box":"material/new-box.svg","material-newspaper-check":"material/newspaper-check.svg","material-newspaper-minus":"material/newspaper-minus.svg","material-newspaper-plus":"material/newspaper-plus.svg","material-newspaper-remove":"material/newspaper-remove.svg","material-newspaper-variant-multiple-outline":"material/newspaper-variant-multiple-outline.svg","material-newspaper-variant-multiple":"material/newspaper-variant-multiple.svg","material-newspaper-variant-outline":"material/newspaper-variant-outline.svg","material-newspaper-variant":"material/newspaper-variant.svg","material-newspaper":"material/newspaper.svg","material-nfc-search-variant":"material/nfc-search-variant.svg","material-nfc-tap":"material/nfc-tap.svg","material-nfc-variant-off":"material/nfc-variant-off.svg","material-nfc-variant":"material/nfc-variant.svg","material-nfc":"material/nfc.svg","material-ninja":"material/ninja.svg","material-nintendo-game-boy":"material/nintendo-game-boy.svg","material-nintendo-switch":"material/nintendo-switch.svg","material-nintendo-wii":"material/nintendo-wii.svg","material-nintendo-wiiu":"material/nintendo-wiiu.svg","material-nix":"material/nix.svg","material-nodejs":"material/nodejs.svg","material-noodles":"material/noodles.svg","material-not-equal-variant":"material/not-equal-variant.svg","material-not-equal":"material/not-equal.svg","material-note-alert-outline":"material/note-alert-outline.svg","material-note-alert":"material/note-alert.svg","material-note-check-outline":"material/note-check-outline.svg","material-note-check":"material/note-check.svg","material-note-edit-outline":"material/note-edit-outline.svg","material-note-edit":"material/note-edit.svg","material-note-minus-outline":"material/note-minus-outline.svg","material-note-minus":"material/note-minus.svg","material-note-multiple-outline":"material/note-multiple-outline.svg","material-note-multiple":"material/note-multiple.svg","material-note-off-outline":"material/note-off-outline.svg","material-note-off":"material/note-off.svg","material-note-outline":"material/note-outline.svg","material-note-plus-outline":"material/note-plus-outline.svg","material-note-plus":"material/note-plus.svg","material-note-remove-outline":"material/note-remove-outline.svg","material-note-remove":"material/note-remove.svg","material-note-search-outline":"material/note-search-outline.svg","material-note-search":"material/note-search.svg","material-note-text-outline":"material/note-text-outline.svg","material-note-text":"material/note-text.svg","material-note":"material/note.svg","material-notebook-check-outline":"material/notebook-check-outline.svg","material-notebook-check":"material/notebook-check.svg","material-notebook-edit-outline":"material/notebook-edit-outline.svg","material-notebook-edit":"material/notebook-edit.svg","material-notebook-heart-outline":"material/notebook-heart-outline.svg","material-notebook-heart":"material/notebook-heart.svg","material-notebook-minus-outline":"material/notebook-minus-outline.svg","material-notebook-minus":"material/notebook-minus.svg","material-notebook-multiple":"material/notebook-multiple.svg","material-notebook-outline":"material/notebook-outline.svg","material-notebook-plus-outline":"material/notebook-plus-outline.svg","material-notebook-plus":"material/notebook-plus.svg","material-notebook-remove-outline":"material/notebook-remove-outline.svg","material-notebook-remove":"material/notebook-remove.svg","material-notebook":"material/notebook.svg","material-notification-clear-all":"material/notification-clear-all.svg","material-npm":"material/npm.svg","material-nuke":"material/nuke.svg","material-null":"material/null.svg","material-numeric-0-box-multiple-outline":"material/numeric-0-box-multiple-outline.svg","material-numeric-0-box-multiple":"material/numeric-0-box-multiple.svg","material-numeric-0-box-outline":"material/numeric-0-box-outline.svg","material-numeric-0-box":"material/numeric-0-box.svg","material-numeric-0-circle-outline":"material/numeric-0-circle-outline.svg","material-numeric-0-circle":"material/numeric-0-circle.svg","material-numeric-0":"material/numeric-0.svg","material-numeric-1-box-multiple-outline":"material/numeric-1-box-multiple-outline.svg","material-numeric-1-box-multiple":"material/numeric-1-box-multiple.svg","material-numeric-1-box-outline":"material/numeric-1-box-outline.svg","material-numeric-1-box":"material/numeric-1-box.svg","material-numeric-1-circle-outline":"material/numeric-1-circle-outline.svg","material-numeric-1-circle":"material/numeric-1-circle.svg","material-numeric-1":"material/numeric-1.svg","material-numeric-10-box-multiple-outline":"material/numeric-10-box-multiple-outline.svg","material-numeric-10-box-multiple":"material/numeric-10-box-multiple.svg","material-numeric-10-box-outline":"material/numeric-10-box-outline.svg","material-numeric-10-box":"material/numeric-10-box.svg","material-numeric-10-circle-outline":"material/numeric-10-circle-outline.svg","material-numeric-10-circle":"material/numeric-10-circle.svg","material-numeric-10":"material/numeric-10.svg","material-numeric-2-box-multiple-outline":"material/numeric-2-box-multiple-outline.svg","material-numeric-2-box-multiple":"material/numeric-2-box-multiple.svg","material-numeric-2-box-outline":"material/numeric-2-box-outline.svg","material-numeric-2-box":"material/numeric-2-box.svg","material-numeric-2-circle-outline":"material/numeric-2-circle-outline.svg","material-numeric-2-circle":"material/numeric-2-circle.svg","material-numeric-2":"material/numeric-2.svg","material-numeric-3-box-multiple-outline":"material/numeric-3-box-multiple-outline.svg","material-numeric-3-box-multiple":"material/numeric-3-box-multiple.svg","material-numeric-3-box-outline":"material/numeric-3-box-outline.svg","material-numeric-3-box":"material/numeric-3-box.svg","material-numeric-3-circle-outline":"material/numeric-3-circle-outline.svg","material-numeric-3-circle":"material/numeric-3-circle.svg","material-numeric-3":"material/numeric-3.svg","material-numeric-4-box-multiple-outline":"material/numeric-4-box-multiple-outline.svg","material-numeric-4-box-multiple":"material/numeric-4-box-multiple.svg","material-numeric-4-box-outline":"material/numeric-4-box-outline.svg","material-numeric-4-box":"material/numeric-4-box.svg","material-numeric-4-circle-outline":"material/numeric-4-circle-outline.svg","material-numeric-4-circle":"material/numeric-4-circle.svg","material-numeric-4":"material/numeric-4.svg","material-numeric-5-box-multiple-outline":"material/numeric-5-box-multiple-outline.svg","material-numeric-5-box-multiple":"material/numeric-5-box-multiple.svg","material-numeric-5-box-outline":"material/numeric-5-box-outline.svg","material-numeric-5-box":"material/numeric-5-box.svg","material-numeric-5-circle-outline":"material/numeric-5-circle-outline.svg","material-numeric-5-circle":"material/numeric-5-circle.svg","material-numeric-5":"material/numeric-5.svg","material-numeric-6-box-multiple-outline":"material/numeric-6-box-multiple-outline.svg","material-numeric-6-box-multiple":"material/numeric-6-box-multiple.svg","material-numeric-6-box-outline":"material/numeric-6-box-outline.svg","material-numeric-6-box":"material/numeric-6-box.svg","material-numeric-6-circle-outline":"material/numeric-6-circle-outline.svg","material-numeric-6-circle":"material/numeric-6-circle.svg","material-numeric-6":"material/numeric-6.svg","material-numeric-7-box-multiple-outline":"material/numeric-7-box-multiple-outline.svg","material-numeric-7-box-multiple":"material/numeric-7-box-multiple.svg","material-numeric-7-box-outline":"material/numeric-7-box-outline.svg","material-numeric-7-box":"material/numeric-7-box.svg","material-numeric-7-circle-outline":"material/numeric-7-circle-outline.svg","material-numeric-7-circle":"material/numeric-7-circle.svg","material-numeric-7":"material/numeric-7.svg","material-numeric-8-box-multiple-outline":"material/numeric-8-box-multiple-outline.svg","material-numeric-8-box-multiple":"material/numeric-8-box-multiple.svg","material-numeric-8-box-outline":"material/numeric-8-box-outline.svg","material-numeric-8-box":"material/numeric-8-box.svg","material-numeric-8-circle-outline":"material/numeric-8-circle-outline.svg","material-numeric-8-circle":"material/numeric-8-circle.svg","material-numeric-8":"material/numeric-8.svg","material-numeric-9-box-multiple-outline":"material/numeric-9-box-multiple-outline.svg","material-numeric-9-box-multiple":"material/numeric-9-box-multiple.svg","material-numeric-9-box-outline":"material/numeric-9-box-outline.svg","material-numeric-9-box":"material/numeric-9-box.svg","material-numeric-9-circle-outline":"material/numeric-9-circle-outline.svg","material-numeric-9-circle":"material/numeric-9-circle.svg","material-numeric-9-plus-box-multiple-outline":"material/numeric-9-plus-box-multiple-outline.svg","material-numeric-9-plus-box-multiple":"material/numeric-9-plus-box-multiple.svg","material-numeric-9-plus-box-outline":"material/numeric-9-plus-box-outline.svg","material-numeric-9-plus-box":"material/numeric-9-plus-box.svg","material-numeric-9-plus-circle-outline":"material/numeric-9-plus-circle-outline.svg","material-numeric-9-plus-circle":"material/numeric-9-plus-circle.svg","material-numeric-9-plus":"material/numeric-9-plus.svg","material-numeric-9":"material/numeric-9.svg","material-numeric-negative-1":"material/numeric-negative-1.svg","material-numeric-off":"material/numeric-off.svg","material-numeric-positive-1":"material/numeric-positive-1.svg","material-numeric":"material/numeric.svg","material-nut":"material/nut.svg","material-nutrition":"material/nutrition.svg","material-nuxt":"material/nuxt.svg","material-oar":"material/oar.svg","material-ocarina":"material/ocarina.svg","material-oci":"material/oci.svg","material-ocr":"material/ocr.svg","material-octagon-outline":"material/octagon-outline.svg","material-octagon":"material/octagon.svg","material-octagram-outline":"material/octagram-outline.svg","material-octagram":"material/octagram.svg","material-octahedron-off":"material/octahedron-off.svg","material-octahedron":"material/octahedron.svg","material-odnoklassniki":"material/odnoklassniki.svg","material-offer":"material/offer.svg","material-office-building-cog-outline":"material/office-building-cog-outline.svg","material-office-building-cog":"material/office-building-cog.svg","material-office-building-marker-outline":"material/office-building-marker-outline.svg","material-office-building-marker":"material/office-building-marker.svg","material-office-building-minus-outline":"material/office-building-minus-outline.svg","material-office-building-minus":"material/office-building-minus.svg","material-office-building-outline":"material/office-building-outline.svg","material-office-building-plus-outline":"material/office-building-plus-outline.svg","material-office-building-plus":"material/office-building-plus.svg","material-office-building-remove-outline":"material/office-building-remove-outline.svg","material-office-building-remove":"material/office-building-remove.svg","material-office-building":"material/office-building.svg","material-oil-lamp":"material/oil-lamp.svg","material-oil-level":"material/oil-level.svg","material-oil-temperature":"material/oil-temperature.svg","material-oil":"material/oil.svg","material-om":"material/om.svg","material-omega":"material/omega.svg","material-one-up":"material/one-up.svg","material-onepassword":"material/onepassword.svg","material-opacity":"material/opacity.svg","material-open-in-app":"material/open-in-app.svg","material-open-in-new":"material/open-in-new.svg","material-open-source-initiative":"material/open-source-initiative.svg","material-openid":"material/openid.svg","material-opera":"material/opera.svg","material-orbit-variant":"material/orbit-variant.svg","material-orbit":"material/orbit.svg","material-order-alphabetical-ascending":"material/order-alphabetical-ascending.svg","material-order-alphabetical-descending":"material/order-alphabetical-descending.svg","material-order-bool-ascending-variant":"material/order-bool-ascending-variant.svg","material-order-bool-ascending":"material/order-bool-ascending.svg","material-order-bool-descending-variant":"material/order-bool-descending-variant.svg","material-order-bool-descending":"material/order-bool-descending.svg","material-order-numeric-ascending":"material/order-numeric-ascending.svg","material-order-numeric-descending":"material/order-numeric-descending.svg","material-origin":"material/origin.svg","material-ornament-variant":"material/ornament-variant.svg","material-ornament":"material/ornament.svg","material-outdoor-lamp":"material/outdoor-lamp.svg","material-overscan":"material/overscan.svg","material-owl":"material/owl.svg","material-pac-man":"material/pac-man.svg","material-package-check":"material/package-check.svg","material-package-down":"material/package-down.svg","material-package-up":"material/package-up.svg","material-package-variant-closed-check":"material/package-variant-closed-check.svg","material-package-variant-closed-minus":"material/package-variant-closed-minus.svg","material-package-variant-closed-plus":"material/package-variant-closed-plus.svg","material-package-variant-closed-remove":"material/package-variant-closed-remove.svg","material-package-variant-closed":"material/package-variant-closed.svg","material-package-variant-minus":"material/package-variant-minus.svg","material-package-variant-plus":"material/package-variant-plus.svg","material-package-variant-remove":"material/package-variant-remove.svg","material-package-variant":"material/package-variant.svg","material-package":"material/package.svg","material-page-first":"material/page-first.svg","material-page-last":"material/page-last.svg","material-page-layout-body":"material/page-layout-body.svg","material-page-layout-footer":"material/page-layout-footer.svg","material-page-layout-header-footer":"material/page-layout-header-footer.svg","material-page-layout-header":"material/page-layout-header.svg","material-page-layout-sidebar-left":"material/page-layout-sidebar-left.svg","material-page-layout-sidebar-right":"material/page-layout-sidebar-right.svg","material-page-next-outline":"material/page-next-outline.svg","material-page-next":"material/page-next.svg","material-page-previous-outline":"material/page-previous-outline.svg","material-page-previous":"material/page-previous.svg","material-pail-minus-outline":"material/pail-minus-outline.svg","material-pail-minus":"material/pail-minus.svg","material-pail-off-outline":"material/pail-off-outline.svg","material-pail-off":"material/pail-off.svg","material-pail-outline":"material/pail-outline.svg","material-pail-plus-outline":"material/pail-plus-outline.svg","material-pail-plus":"material/pail-plus.svg","material-pail-remove-outline":"material/pail-remove-outline.svg","material-pail-remove":"material/pail-remove.svg","material-pail":"material/pail.svg","material-palette-advanced":"material/palette-advanced.svg","material-palette-outline":"material/palette-outline.svg","material-palette-swatch-outline":"material/palette-swatch-outline.svg","material-palette-swatch-variant":"material/palette-swatch-variant.svg","material-palette-swatch":"material/palette-swatch.svg","material-palette":"material/palette.svg","material-palm-tree":"material/palm-tree.svg","material-pan-bottom-left":"material/pan-bottom-left.svg","material-pan-bottom-right":"material/pan-bottom-right.svg","material-pan-down":"material/pan-down.svg","material-pan-horizontal":"material/pan-horizontal.svg","material-pan-left":"material/pan-left.svg","material-pan-right":"material/pan-right.svg","material-pan-top-left":"material/pan-top-left.svg","material-pan-top-right":"material/pan-top-right.svg","material-pan-up":"material/pan-up.svg","material-pan-vertical":"material/pan-vertical.svg","material-pan":"material/pan.svg","material-panda":"material/panda.svg","material-pandora":"material/pandora.svg","material-panorama-fisheye":"material/panorama-fisheye.svg","material-panorama-horizontal-outline":"material/panorama-horizontal-outline.svg","material-panorama-horizontal":"material/panorama-horizontal.svg","material-panorama-outline":"material/panorama-outline.svg","material-panorama-sphere-outline":"material/panorama-sphere-outline.svg","material-panorama-sphere":"material/panorama-sphere.svg","material-panorama-variant-outline":"material/panorama-variant-outline.svg","material-panorama-variant":"material/panorama-variant.svg","material-panorama-vertical-outline":"material/panorama-vertical-outline.svg","material-panorama-vertical":"material/panorama-vertical.svg","material-panorama-wide-angle-outline":"material/panorama-wide-angle-outline.svg","material-panorama-wide-angle":"material/panorama-wide-angle.svg","material-panorama":"material/panorama.svg","material-paper-cut-vertical":"material/paper-cut-vertical.svg","material-paper-roll-outline":"material/paper-roll-outline.svg","material-paper-roll":"material/paper-roll.svg","material-paperclip-check":"material/paperclip-check.svg","material-paperclip-lock":"material/paperclip-lock.svg","material-paperclip-minus":"material/paperclip-minus.svg","material-paperclip-off":"material/paperclip-off.svg","material-paperclip-plus":"material/paperclip-plus.svg","material-paperclip-remove":"material/paperclip-remove.svg","material-paperclip":"material/paperclip.svg","material-parachute-outline":"material/parachute-outline.svg","material-parachute":"material/parachute.svg","material-paragliding":"material/paragliding.svg","material-parking":"material/parking.svg","material-party-popper":"material/party-popper.svg","material-passport-biometric":"material/passport-biometric.svg","material-passport":"material/passport.svg","material-pasta":"material/pasta.svg","material-patio-heater":"material/patio-heater.svg","material-patreon":"material/patreon.svg","material-pause-box-outline":"material/pause-box-outline.svg","material-pause-box":"material/pause-box.svg","material-pause-circle-outline":"material/pause-circle-outline.svg","material-pause-circle":"material/pause-circle.svg","material-pause-octagon-outline":"material/pause-octagon-outline.svg","material-pause-octagon":"material/pause-octagon.svg","material-pause":"material/pause.svg","material-paw-off-outline":"material/paw-off-outline.svg","material-paw-off":"material/paw-off.svg","material-paw-outline":"material/paw-outline.svg","material-paw":"material/paw.svg","material-peace":"material/peace.svg","material-peanut-off-outline":"material/peanut-off-outline.svg","material-peanut-off":"material/peanut-off.svg","material-peanut-outline":"material/peanut-outline.svg","material-peanut":"material/peanut.svg","material-pen-lock":"material/pen-lock.svg","material-pen-minus":"material/pen-minus.svg","material-pen-off":"material/pen-off.svg","material-pen-plus":"material/pen-plus.svg","material-pen-remove":"material/pen-remove.svg","material-pen":"material/pen.svg","material-pencil-box-multiple-outline":"material/pencil-box-multiple-outline.svg","material-pencil-box-multiple":"material/pencil-box-multiple.svg","material-pencil-box-outline":"material/pencil-box-outline.svg","material-pencil-box":"material/pencil-box.svg","material-pencil-circle-outline":"material/pencil-circle-outline.svg","material-pencil-circle":"material/pencil-circle.svg","material-pencil-lock-outline":"material/pencil-lock-outline.svg","material-pencil-lock":"material/pencil-lock.svg","material-pencil-minus-outline":"material/pencil-minus-outline.svg","material-pencil-minus":"material/pencil-minus.svg","material-pencil-off-outline":"material/pencil-off-outline.svg","material-pencil-off":"material/pencil-off.svg","material-pencil-outline":"material/pencil-outline.svg","material-pencil-plus-outline":"material/pencil-plus-outline.svg","material-pencil-plus":"material/pencil-plus.svg","material-pencil-remove-outline":"material/pencil-remove-outline.svg","material-pencil-remove":"material/pencil-remove.svg","material-pencil-ruler":"material/pencil-ruler.svg","material-pencil":"material/pencil.svg","material-penguin":"material/penguin.svg","material-pentagon-outline":"material/pentagon-outline.svg","material-pentagon":"material/pentagon.svg","material-pentagram":"material/pentagram.svg","material-percent-box-outline":"material/percent-box-outline.svg","material-percent-box":"material/percent-box.svg","material-percent-circle-outline":"material/percent-circle-outline.svg","material-percent-circle":"material/percent-circle.svg","material-percent-outline":"material/percent-outline.svg","material-percent":"material/percent.svg","material-periodic-table":"material/periodic-table.svg","material-perspective-less":"material/perspective-less.svg","material-perspective-more":"material/perspective-more.svg","material-ph":"material/ph.svg","material-phone-alert-outline":"material/phone-alert-outline.svg","material-phone-alert":"material/phone-alert.svg","material-phone-bluetooth-outline":"material/phone-bluetooth-outline.svg","material-phone-bluetooth":"material/phone-bluetooth.svg","material-phone-cancel-outline":"material/phone-cancel-outline.svg","material-phone-cancel":"material/phone-cancel.svg","material-phone-check-outline":"material/phone-check-outline.svg","material-phone-check":"material/phone-check.svg","material-phone-classic-off":"material/phone-classic-off.svg","material-phone-classic":"material/phone-classic.svg","material-phone-clock":"material/phone-clock.svg","material-phone-dial-outline":"material/phone-dial-outline.svg","material-phone-dial":"material/phone-dial.svg","material-phone-forward-outline":"material/phone-forward-outline.svg","material-phone-forward":"material/phone-forward.svg","material-phone-hangup-outline":"material/phone-hangup-outline.svg","material-phone-hangup":"material/phone-hangup.svg","material-phone-in-talk-outline":"material/phone-in-talk-outline.svg","material-phone-in-talk":"material/phone-in-talk.svg","material-phone-incoming-outgoing-outline":"material/phone-incoming-outgoing-outline.svg","material-phone-incoming-outgoing":"material/phone-incoming-outgoing.svg","material-phone-incoming-outline":"material/phone-incoming-outline.svg","material-phone-incoming":"material/phone-incoming.svg","material-phone-lock-outline":"material/phone-lock-outline.svg","material-phone-lock":"material/phone-lock.svg","material-phone-log-outline":"material/phone-log-outline.svg","material-phone-log":"material/phone-log.svg","material-phone-message-outline":"material/phone-message-outline.svg","material-phone-message":"material/phone-message.svg","material-phone-minus-outline":"material/phone-minus-outline.svg","material-phone-minus":"material/phone-minus.svg","material-phone-missed-outline":"material/phone-missed-outline.svg","material-phone-missed":"material/phone-missed.svg","material-phone-off-outline":"material/phone-off-outline.svg","material-phone-off":"material/phone-off.svg","material-phone-outgoing-outline":"material/phone-outgoing-outline.svg","material-phone-outgoing":"material/phone-outgoing.svg","material-phone-outline":"material/phone-outline.svg","material-phone-paused-outline":"material/phone-paused-outline.svg","material-phone-paused":"material/phone-paused.svg","material-phone-plus-outline":"material/phone-plus-outline.svg","material-phone-plus":"material/phone-plus.svg","material-phone-refresh-outline":"material/phone-refresh-outline.svg","material-phone-refresh":"material/phone-refresh.svg","material-phone-remove-outline":"material/phone-remove-outline.svg","material-phone-remove":"material/phone-remove.svg","material-phone-return-outline":"material/phone-return-outline.svg","material-phone-return":"material/phone-return.svg","material-phone-ring-outline":"material/phone-ring-outline.svg","material-phone-ring":"material/phone-ring.svg","material-phone-rotate-landscape":"material/phone-rotate-landscape.svg","material-phone-rotate-portrait":"material/phone-rotate-portrait.svg","material-phone-settings-outline":"material/phone-settings-outline.svg","material-phone-settings":"material/phone-settings.svg","material-phone-sync-outline":"material/phone-sync-outline.svg","material-phone-sync":"material/phone-sync.svg","material-phone-voip":"material/phone-voip.svg","material-phone":"material/phone.svg","material-pi-box":"material/pi-box.svg","material-pi-hole":"material/pi-hole.svg","material-pi":"material/pi.svg","material-piano-off":"material/piano-off.svg","material-piano":"material/piano.svg","material-pickaxe":"material/pickaxe.svg","material-picture-in-picture-bottom-right-outline":"material/picture-in-picture-bottom-right-outline.svg","material-picture-in-picture-bottom-right":"material/picture-in-picture-bottom-right.svg","material-picture-in-picture-top-right-outline":"material/picture-in-picture-top-right-outline.svg","material-picture-in-picture-top-right":"material/picture-in-picture-top-right.svg","material-pier-crane":"material/pier-crane.svg","material-pier":"material/pier.svg","material-pig-variant-outline":"material/pig-variant-outline.svg","material-pig-variant":"material/pig-variant.svg","material-pig":"material/pig.svg","material-piggy-bank-outline":"material/piggy-bank-outline.svg","material-piggy-bank":"material/piggy-bank.svg","material-pill-multiple":"material/pill-multiple.svg","material-pill-off":"material/pill-off.svg","material-pill":"material/pill.svg","material-pillar":"material/pillar.svg","material-pin-off-outline":"material/pin-off-outline.svg","material-pin-off":"material/pin-off.svg","material-pin-outline":"material/pin-outline.svg","material-pin":"material/pin.svg","material-pine-tree-box":"material/pine-tree-box.svg","material-pine-tree-fire":"material/pine-tree-fire.svg","material-pine-tree":"material/pine-tree.svg","material-pinterest":"material/pinterest.svg","material-pinwheel-outline":"material/pinwheel-outline.svg","material-pinwheel":"material/pinwheel.svg","material-pipe-disconnected":"material/pipe-disconnected.svg","material-pipe-leak":"material/pipe-leak.svg","material-pipe-valve":"material/pipe-valve.svg","material-pipe-wrench":"material/pipe-wrench.svg","material-pipe":"material/pipe.svg","material-pirate":"material/pirate.svg","material-pistol":"material/pistol.svg","material-piston":"material/piston.svg","material-pitchfork":"material/pitchfork.svg","material-pizza":"material/pizza.svg","material-plane-car":"material/plane-car.svg","material-plane-train":"material/plane-train.svg","material-play-box-lock-open-outline":"material/play-box-lock-open-outline.svg","material-play-box-lock-open":"material/play-box-lock-open.svg","material-play-box-lock-outline":"material/play-box-lock-outline.svg","material-play-box-lock":"material/play-box-lock.svg","material-play-box-multiple-outline":"material/play-box-multiple-outline.svg","material-play-box-multiple":"material/play-box-multiple.svg","material-play-box-outline":"material/play-box-outline.svg","material-play-box":"material/play-box.svg","material-play-circle-outline":"material/play-circle-outline.svg","material-play-circle":"material/play-circle.svg","material-play-network-outline":"material/play-network-outline.svg","material-play-network":"material/play-network.svg","material-play-outline":"material/play-outline.svg","material-play-pause":"material/play-pause.svg","material-play-protected-content":"material/play-protected-content.svg","material-play-speed":"material/play-speed.svg","material-play":"material/play.svg","material-playlist-check":"material/playlist-check.svg","material-playlist-edit":"material/playlist-edit.svg","material-playlist-minus":"material/playlist-minus.svg","material-playlist-music-outline":"material/playlist-music-outline.svg","material-playlist-music":"material/playlist-music.svg","material-playlist-play":"material/playlist-play.svg","material-playlist-plus":"material/playlist-plus.svg","material-playlist-remove":"material/playlist-remove.svg","material-playlist-star":"material/playlist-star.svg","material-plex":"material/plex.svg","material-pliers":"material/pliers.svg","material-plus-box-multiple-outline":"material/plus-box-multiple-outline.svg","material-plus-box-multiple":"material/plus-box-multiple.svg","material-plus-box-outline":"material/plus-box-outline.svg","material-plus-box":"material/plus-box.svg","material-plus-circle-multiple-outline":"material/plus-circle-multiple-outline.svg","material-plus-circle-multiple":"material/plus-circle-multiple.svg","material-plus-circle-outline":"material/plus-circle-outline.svg","material-plus-circle":"material/plus-circle.svg","material-plus-lock-open":"material/plus-lock-open.svg","material-plus-lock":"material/plus-lock.svg","material-plus-minus-box":"material/plus-minus-box.svg","material-plus-minus-variant":"material/plus-minus-variant.svg","material-plus-minus":"material/plus-minus.svg","material-plus-network-outline":"material/plus-network-outline.svg","material-plus-network":"material/plus-network.svg","material-plus-outline":"material/plus-outline.svg","material-plus-thick":"material/plus-thick.svg","material-plus":"material/plus.svg","material-podcast":"material/podcast.svg","material-podium-bronze":"material/podium-bronze.svg","material-podium-gold":"material/podium-gold.svg","material-podium-silver":"material/podium-silver.svg","material-podium":"material/podium.svg","material-point-of-sale":"material/point-of-sale.svg","material-pokeball":"material/pokeball.svg","material-pokemon-go":"material/pokemon-go.svg","material-poker-chip":"material/poker-chip.svg","material-polaroid":"material/polaroid.svg","material-police-badge-outline":"material/police-badge-outline.svg","material-police-badge":"material/police-badge.svg","material-police-station":"material/police-station.svg","material-poll":"material/poll.svg","material-polo":"material/polo.svg","material-polymer":"material/polymer.svg","material-pool-thermometer":"material/pool-thermometer.svg","material-pool":"material/pool.svg","material-popcorn":"material/popcorn.svg","material-post-lamp":"material/post-lamp.svg","material-post-outline":"material/post-outline.svg","material-post":"material/post.svg","material-postage-stamp":"material/postage-stamp.svg","material-pot-mix-outline":"material/pot-mix-outline.svg","material-pot-mix":"material/pot-mix.svg","material-pot-outline":"material/pot-outline.svg","material-pot-steam-outline":"material/pot-steam-outline.svg","material-pot-steam":"material/pot-steam.svg","material-pot":"material/pot.svg","material-pound-box-outline":"material/pound-box-outline.svg","material-pound-box":"material/pound-box.svg","material-pound":"material/pound.svg","material-power-cycle":"material/power-cycle.svg","material-power-off":"material/power-off.svg","material-power-on":"material/power-on.svg","material-power-plug-off-outline":"material/power-plug-off-outline.svg","material-power-plug-off":"material/power-plug-off.svg","material-power-plug-outline":"material/power-plug-outline.svg","material-power-plug":"material/power-plug.svg","material-power-settings":"material/power-settings.svg","material-power-sleep":"material/power-sleep.svg","material-power-socket-au":"material/power-socket-au.svg","material-power-socket-ch":"material/power-socket-ch.svg","material-power-socket-de":"material/power-socket-de.svg","material-power-socket-eu":"material/power-socket-eu.svg","material-power-socket-fr":"material/power-socket-fr.svg","material-power-socket-it":"material/power-socket-it.svg","material-power-socket-jp":"material/power-socket-jp.svg","material-power-socket-uk":"material/power-socket-uk.svg","material-power-socket-us":"material/power-socket-us.svg","material-power-socket":"material/power-socket.svg","material-power-standby":"material/power-standby.svg","material-power":"material/power.svg","material-powershell":"material/powershell.svg","material-prescription":"material/prescription.svg","material-presentation-play":"material/presentation-play.svg","material-presentation":"material/presentation.svg","material-pretzel":"material/pretzel.svg","material-printer-3d-nozzle-alert-outline":"material/printer-3d-nozzle-alert-outline.svg","material-printer-3d-nozzle-alert":"material/printer-3d-nozzle-alert.svg","material-printer-3d-nozzle-heat-outline":"material/printer-3d-nozzle-heat-outline.svg","material-printer-3d-nozzle-heat":"material/printer-3d-nozzle-heat.svg","material-printer-3d-nozzle-off-outline":"material/printer-3d-nozzle-off-outline.svg","material-printer-3d-nozzle-off":"material/printer-3d-nozzle-off.svg","material-printer-3d-nozzle-outline":"material/printer-3d-nozzle-outline.svg","material-printer-3d-nozzle":"material/printer-3d-nozzle.svg","material-printer-3d-off":"material/printer-3d-off.svg","material-printer-3d":"material/printer-3d.svg","material-printer-alert":"material/printer-alert.svg","material-printer-check":"material/printer-check.svg","material-printer-eye":"material/printer-eye.svg","material-printer-off-outline":"material/printer-off-outline.svg","material-printer-off":"material/printer-off.svg","material-printer-outline":"material/printer-outline.svg","material-printer-pos":"material/printer-pos.svg","material-printer-search":"material/printer-search.svg","material-printer-settings":"material/printer-settings.svg","material-printer-wireless":"material/printer-wireless.svg","material-printer":"material/printer.svg","material-priority-high":"material/priority-high.svg","material-priority-low":"material/priority-low.svg","material-professional-hexagon":"material/professional-hexagon.svg","material-progress-alert":"material/progress-alert.svg","material-progress-check":"material/progress-check.svg","material-progress-clock":"material/progress-clock.svg","material-progress-close":"material/progress-close.svg","material-progress-download":"material/progress-download.svg","material-progress-helper":"material/progress-helper.svg","material-progress-pencil":"material/progress-pencil.svg","material-progress-question":"material/progress-question.svg","material-progress-star":"material/progress-star.svg","material-progress-upload":"material/progress-upload.svg","material-progress-wrench":"material/progress-wrench.svg","material-projector-off":"material/projector-off.svg","material-projector-screen-off-outline":"material/projector-screen-off-outline.svg","material-projector-screen-off":"material/projector-screen-off.svg","material-projector-screen-outline":"material/projector-screen-outline.svg","material-projector-screen-variant-off-outline":"material/projector-screen-variant-off-outline.svg","material-projector-screen-variant-off":"material/projector-screen-variant-off.svg","material-projector-screen-variant-outline":"material/projector-screen-variant-outline.svg","material-projector-screen-variant":"material/projector-screen-variant.svg","material-projector-screen":"material/projector-screen.svg","material-projector":"material/projector.svg","material-propane-tank-outline":"material/propane-tank-outline.svg","material-propane-tank":"material/propane-tank.svg","material-protocol":"material/protocol.svg","material-publish-off":"material/publish-off.svg","material-publish":"material/publish.svg","material-pulse":"material/pulse.svg","material-pump-off":"material/pump-off.svg","material-pump":"material/pump.svg","material-pumpkin":"material/pumpkin.svg","material-purse-outline":"material/purse-outline.svg","material-purse":"material/purse.svg","material-puzzle-check-outline":"material/puzzle-check-outline.svg","material-puzzle-check":"material/puzzle-check.svg","material-puzzle-edit-outline":"material/puzzle-edit-outline.svg","material-puzzle-edit":"material/puzzle-edit.svg","material-puzzle-heart-outline":"material/puzzle-heart-outline.svg","material-puzzle-heart":"material/puzzle-heart.svg","material-puzzle-minus-outline":"material/puzzle-minus-outline.svg","material-puzzle-minus":"material/puzzle-minus.svg","material-puzzle-outline":"material/puzzle-outline.svg","material-puzzle-plus-outline":"material/puzzle-plus-outline.svg","material-puzzle-plus":"material/puzzle-plus.svg","material-puzzle-remove-outline":"material/puzzle-remove-outline.svg","material-puzzle-remove":"material/puzzle-remove.svg","material-puzzle-star-outline":"material/puzzle-star-outline.svg","material-puzzle-star":"material/puzzle-star.svg","material-puzzle":"material/puzzle.svg","material-pyramid-off":"material/pyramid-off.svg","material-pyramid":"material/pyramid.svg","material-qi":"material/qi.svg","material-qqchat":"material/qqchat.svg","material-qrcode-edit":"material/qrcode-edit.svg","material-qrcode-minus":"material/qrcode-minus.svg","material-qrcode-plus":"material/qrcode-plus.svg","material-qrcode-remove":"material/qrcode-remove.svg","material-qrcode-scan":"material/qrcode-scan.svg","material-qrcode":"material/qrcode.svg","material-quadcopter":"material/quadcopter.svg","material-quality-high":"material/quality-high.svg","material-quality-low":"material/quality-low.svg","material-quality-medium":"material/quality-medium.svg","material-quora":"material/quora.svg","material-rabbit-variant-outline":"material/rabbit-variant-outline.svg","material-rabbit-variant":"material/rabbit-variant.svg","material-rabbit":"material/rabbit.svg","material-racing-helmet":"material/racing-helmet.svg","material-racquetball":"material/racquetball.svg","material-radar":"material/radar.svg","material-radiator-disabled":"material/radiator-disabled.svg","material-radiator-off":"material/radiator-off.svg","material-radiator":"material/radiator.svg","material-radio-am":"material/radio-am.svg","material-radio-fm":"material/radio-fm.svg","material-radio-handheld":"material/radio-handheld.svg","material-radio-off":"material/radio-off.svg","material-radio-tower":"material/radio-tower.svg","material-radio":"material/radio.svg","material-radioactive-circle-outline":"material/radioactive-circle-outline.svg","material-radioactive-circle":"material/radioactive-circle.svg","material-radioactive-off":"material/radioactive-off.svg","material-radioactive":"material/radioactive.svg","material-radiobox-blank":"material/radiobox-blank.svg","material-radiobox-marked":"material/radiobox-marked.svg","material-radiology-box-outline":"material/radiology-box-outline.svg","material-radiology-box":"material/radiology-box.svg","material-radius-outline":"material/radius-outline.svg","material-radius":"material/radius.svg","material-railroad-light":"material/railroad-light.svg","material-rake":"material/rake.svg","material-raspberry-pi":"material/raspberry-pi.svg","material-raw-off":"material/raw-off.svg","material-raw":"material/raw.svg","material-ray-end-arrow":"material/ray-end-arrow.svg","material-ray-end":"material/ray-end.svg","material-ray-start-arrow":"material/ray-start-arrow.svg","material-ray-start-end":"material/ray-start-end.svg","material-ray-start-vertex-end":"material/ray-start-vertex-end.svg","material-ray-start":"material/ray-start.svg","material-ray-vertex":"material/ray-vertex.svg","material-razor-double-edge":"material/razor-double-edge.svg","material-razor-single-edge":"material/razor-single-edge.svg","material-react":"material/react.svg","material-read":"material/read.svg","material-receipt-outline":"material/receipt-outline.svg","material-receipt-text-check-outline":"material/receipt-text-check-outline.svg","material-receipt-text-check":"material/receipt-text-check.svg","material-receipt-text-minus-outline":"material/receipt-text-minus-outline.svg","material-receipt-text-minus":"material/receipt-text-minus.svg","material-receipt-text-outline":"material/receipt-text-outline.svg","material-receipt-text-plus-outline":"material/receipt-text-plus-outline.svg","material-receipt-text-plus":"material/receipt-text-plus.svg","material-receipt-text-remove-outline":"material/receipt-text-remove-outline.svg","material-receipt-text-remove":"material/receipt-text-remove.svg","material-receipt-text":"material/receipt-text.svg","material-receipt":"material/receipt.svg","material-record-circle-outline":"material/record-circle-outline.svg","material-record-circle":"material/record-circle.svg","material-record-player":"material/record-player.svg","material-record-rec":"material/record-rec.svg","material-record":"material/record.svg","material-rectangle-outline":"material/rectangle-outline.svg","material-rectangle":"material/rectangle.svg","material-recycle-variant":"material/recycle-variant.svg","material-recycle":"material/recycle.svg","material-reddit":"material/reddit.svg","material-redhat":"material/redhat.svg","material-redo-variant":"material/redo-variant.svg","material-redo":"material/redo.svg","material-reflect-horizontal":"material/reflect-horizontal.svg","material-reflect-vertical":"material/reflect-vertical.svg","material-refresh-auto":"material/refresh-auto.svg","material-refresh-circle":"material/refresh-circle.svg","material-refresh":"material/refresh.svg","material-regex":"material/regex.svg","material-registered-trademark":"material/registered-trademark.svg","material-reiterate":"material/reiterate.svg","material-relation-many-to-many":"material/relation-many-to-many.svg","material-relation-many-to-one-or-many":"material/relation-many-to-one-or-many.svg","material-relation-many-to-one":"material/relation-many-to-one.svg","material-relation-many-to-only-one":"material/relation-many-to-only-one.svg","material-relation-many-to-zero-or-many":"material/relation-many-to-zero-or-many.svg","material-relation-many-to-zero-or-one":"material/relation-many-to-zero-or-one.svg","material-relation-one-or-many-to-many":"material/relation-one-or-many-to-many.svg","material-relation-one-or-many-to-one-or-many":"material/relation-one-or-many-to-one-or-many.svg","material-relation-one-or-many-to-one":"material/relation-one-or-many-to-one.svg","material-relation-one-or-many-to-only-one":"material/relation-one-or-many-to-only-one.svg","material-relation-one-or-many-to-zero-or-many":"material/relation-one-or-many-to-zero-or-many.svg","material-relation-one-or-many-to-zero-or-one":"material/relation-one-or-many-to-zero-or-one.svg","material-relation-one-to-many":"material/relation-one-to-many.svg","material-relation-one-to-one-or-many":"material/relation-one-to-one-or-many.svg","material-relation-one-to-one":"material/relation-one-to-one.svg","material-relation-one-to-only-one":"material/relation-one-to-only-one.svg","material-relation-one-to-zero-or-many":"material/relation-one-to-zero-or-many.svg","material-relation-one-to-zero-or-one":"material/relation-one-to-zero-or-one.svg","material-relation-only-one-to-many":"material/relation-only-one-to-many.svg","material-relation-only-one-to-one-or-many":"material/relation-only-one-to-one-or-many.svg","material-relation-only-one-to-one":"material/relation-only-one-to-one.svg","material-relation-only-one-to-only-one":"material/relation-only-one-to-only-one.svg","material-relation-only-one-to-zero-or-many":"material/relation-only-one-to-zero-or-many.svg","material-relation-only-one-to-zero-or-one":"material/relation-only-one-to-zero-or-one.svg","material-relation-zero-or-many-to-many":"material/relation-zero-or-many-to-many.svg","material-relation-zero-or-many-to-one-or-many":"material/relation-zero-or-many-to-one-or-many.svg","material-relation-zero-or-many-to-one":"material/relation-zero-or-many-to-one.svg","material-relation-zero-or-many-to-only-one":"material/relation-zero-or-many-to-only-one.svg","material-relation-zero-or-many-to-zero-or-many":"material/relation-zero-or-many-to-zero-or-many.svg","material-relation-zero-or-many-to-zero-or-one":"material/relation-zero-or-many-to-zero-or-one.svg","material-relation-zero-or-one-to-many":"material/relation-zero-or-one-to-many.svg","material-relation-zero-or-one-to-one-or-many":"material/relation-zero-or-one-to-one-or-many.svg","material-relation-zero-or-one-to-one":"material/relation-zero-or-one-to-one.svg","material-relation-zero-or-one-to-only-one":"material/relation-zero-or-one-to-only-one.svg","material-relation-zero-or-one-to-zero-or-many":"material/relation-zero-or-one-to-zero-or-many.svg","material-relation-zero-or-one-to-zero-or-one":"material/relation-zero-or-one-to-zero-or-one.svg","material-relative-scale":"material/relative-scale.svg","material-reload-alert":"material/reload-alert.svg","material-reload":"material/reload.svg","material-reminder":"material/reminder.svg","material-remote-desktop":"material/remote-desktop.svg","material-remote-off":"material/remote-off.svg","material-remote-tv-off":"material/remote-tv-off.svg","material-remote-tv":"material/remote-tv.svg","material-remote":"material/remote.svg","material-rename-box":"material/rename-box.svg","material-reorder-horizontal":"material/reorder-horizontal.svg","material-reorder-vertical":"material/reorder-vertical.svg","material-repeat-off":"material/repeat-off.svg","material-repeat-once":"material/repeat-once.svg","material-repeat-variant":"material/repeat-variant.svg","material-repeat":"material/repeat.svg","material-replay":"material/replay.svg","material-reply-all-outline":"material/reply-all-outline.svg","material-reply-all":"material/reply-all.svg","material-reply-circle":"material/reply-circle.svg","material-reply-outline":"material/reply-outline.svg","material-reply":"material/reply.svg","material-reproduction":"material/reproduction.svg","material-resistor-nodes":"material/resistor-nodes.svg","material-resistor":"material/resistor.svg","material-resize-bottom-right":"material/resize-bottom-right.svg","material-resize":"material/resize.svg","material-responsive":"material/responsive.svg","material-restart-alert":"material/restart-alert.svg","material-restart-off":"material/restart-off.svg","material-restart":"material/restart.svg","material-restore-alert":"material/restore-alert.svg","material-restore":"material/restore.svg","material-rewind-10":"material/rewind-10.svg","material-rewind-15":"material/rewind-15.svg","material-rewind-30":"material/rewind-30.svg","material-rewind-45":"material/rewind-45.svg","material-rewind-5":"material/rewind-5.svg","material-rewind-60":"material/rewind-60.svg","material-rewind-outline":"material/rewind-outline.svg","material-rewind":"material/rewind.svg","material-rhombus-medium-outline":"material/rhombus-medium-outline.svg","material-rhombus-medium":"material/rhombus-medium.svg","material-rhombus-outline":"material/rhombus-outline.svg","material-rhombus-split-outline":"material/rhombus-split-outline.svg","material-rhombus-split":"material/rhombus-split.svg","material-rhombus":"material/rhombus.svg","material-ribbon":"material/ribbon.svg","material-rice":"material/rice.svg","material-rickshaw-electric":"material/rickshaw-electric.svg","material-rickshaw":"material/rickshaw.svg","material-ring":"material/ring.svg","material-rivet":"material/rivet.svg","material-road-variant":"material/road-variant.svg","material-road":"material/road.svg","material-robber":"material/robber.svg","material-robot-angry-outline":"material/robot-angry-outline.svg","material-robot-angry":"material/robot-angry.svg","material-robot-confused-outline":"material/robot-confused-outline.svg","material-robot-confused":"material/robot-confused.svg","material-robot-dead-outline":"material/robot-dead-outline.svg","material-robot-dead":"material/robot-dead.svg","material-robot-excited-outline":"material/robot-excited-outline.svg","material-robot-excited":"material/robot-excited.svg","material-robot-happy-outline":"material/robot-happy-outline.svg","material-robot-happy":"material/robot-happy.svg","material-robot-industrial-outline":"material/robot-industrial-outline.svg","material-robot-industrial":"material/robot-industrial.svg","material-robot-love-outline":"material/robot-love-outline.svg","material-robot-love":"material/robot-love.svg","material-robot-mower-outline":"material/robot-mower-outline.svg","material-robot-mower":"material/robot-mower.svg","material-robot-off-outline":"material/robot-off-outline.svg","material-robot-off":"material/robot-off.svg","material-robot-outline":"material/robot-outline.svg","material-robot-vacuum-alert":"material/robot-vacuum-alert.svg","material-robot-vacuum-variant-alert":"material/robot-vacuum-variant-alert.svg","material-robot-vacuum-variant":"material/robot-vacuum-variant.svg","material-robot-vacuum":"material/robot-vacuum.svg","material-robot":"material/robot.svg","material-rocket-launch-outline":"material/rocket-launch-outline.svg","material-rocket-launch":"material/rocket-launch.svg","material-rocket-outline":"material/rocket-outline.svg","material-rocket":"material/rocket.svg","material-rodent":"material/rodent.svg","material-roller-shade-closed":"material/roller-shade-closed.svg","material-roller-shade":"material/roller-shade.svg","material-roller-skate-off":"material/roller-skate-off.svg","material-roller-skate":"material/roller-skate.svg","material-rollerblade-off":"material/rollerblade-off.svg","material-rollerblade":"material/rollerblade.svg","material-rollupjs":"material/rollupjs.svg","material-rolodex-outline":"material/rolodex-outline.svg","material-rolodex":"material/rolodex.svg","material-roman-numeral-1":"material/roman-numeral-1.svg","material-roman-numeral-10":"material/roman-numeral-10.svg","material-roman-numeral-2":"material/roman-numeral-2.svg","material-roman-numeral-3":"material/roman-numeral-3.svg","material-roman-numeral-4":"material/roman-numeral-4.svg","material-roman-numeral-5":"material/roman-numeral-5.svg","material-roman-numeral-6":"material/roman-numeral-6.svg","material-roman-numeral-7":"material/roman-numeral-7.svg","material-roman-numeral-8":"material/roman-numeral-8.svg","material-roman-numeral-9":"material/roman-numeral-9.svg","material-room-service-outline":"material/room-service-outline.svg","material-room-service":"material/room-service.svg","material-rotate-360":"material/rotate-360.svg","material-rotate-3d-variant":"material/rotate-3d-variant.svg","material-rotate-3d":"material/rotate-3d.svg","material-rotate-left-variant":"material/rotate-left-variant.svg","material-rotate-left":"material/rotate-left.svg","material-rotate-orbit":"material/rotate-orbit.svg","material-rotate-right-variant":"material/rotate-right-variant.svg","material-rotate-right":"material/rotate-right.svg","material-rounded-corner":"material/rounded-corner.svg","material-router-network":"material/router-network.svg","material-router-wireless-off":"material/router-wireless-off.svg","material-router-wireless-settings":"material/router-wireless-settings.svg","material-router-wireless":"material/router-wireless.svg","material-router":"material/router.svg","material-routes-clock":"material/routes-clock.svg","material-routes":"material/routes.svg","material-rowing":"material/rowing.svg","material-rss-box":"material/rss-box.svg","material-rss-off":"material/rss-off.svg","material-rss":"material/rss.svg","material-rug":"material/rug.svg","material-rugby":"material/rugby.svg","material-ruler-square-compass":"material/ruler-square-compass.svg","material-ruler-square":"material/ruler-square.svg","material-ruler":"material/ruler.svg","material-run-fast":"material/run-fast.svg","material-run":"material/run.svg","material-rv-truck":"material/rv-truck.svg","material-sack-percent":"material/sack-percent.svg","material-sack":"material/sack.svg","material-safe-square-outline":"material/safe-square-outline.svg","material-safe-square":"material/safe-square.svg","material-safe":"material/safe.svg","material-safety-goggles":"material/safety-goggles.svg","material-sail-boat-sink":"material/sail-boat-sink.svg","material-sail-boat":"material/sail-boat.svg","material-sale-outline":"material/sale-outline.svg","material-sale":"material/sale.svg","material-salesforce":"material/salesforce.svg","material-sass":"material/sass.svg","material-satellite-uplink":"material/satellite-uplink.svg","material-satellite-variant":"material/satellite-variant.svg","material-satellite":"material/satellite.svg","material-sausage-off":"material/sausage-off.svg","material-sausage":"material/sausage.svg","material-saw-blade":"material/saw-blade.svg","material-sawtooth-wave":"material/sawtooth-wave.svg","material-saxophone":"material/saxophone.svg","material-scale-balance":"material/scale-balance.svg","material-scale-bathroom":"material/scale-bathroom.svg","material-scale-off":"material/scale-off.svg","material-scale-unbalanced":"material/scale-unbalanced.svg","material-scale":"material/scale.svg","material-scan-helper":"material/scan-helper.svg","material-scanner-off":"material/scanner-off.svg","material-scanner":"material/scanner.svg","material-scatter-plot-outline":"material/scatter-plot-outline.svg","material-scatter-plot":"material/scatter-plot.svg","material-scent-off":"material/scent-off.svg","material-scent":"material/scent.svg","material-school-outline":"material/school-outline.svg","material-school":"material/school.svg","material-scissors-cutting":"material/scissors-cutting.svg","material-scooter-electric":"material/scooter-electric.svg","material-scooter":"material/scooter.svg","material-scoreboard-outline":"material/scoreboard-outline.svg","material-scoreboard":"material/scoreboard.svg","material-screen-rotation-lock":"material/screen-rotation-lock.svg","material-screen-rotation":"material/screen-rotation.svg","material-screw-flat-top":"material/screw-flat-top.svg","material-screw-lag":"material/screw-lag.svg","material-screw-machine-flat-top":"material/screw-machine-flat-top.svg","material-screw-machine-round-top":"material/screw-machine-round-top.svg","material-screw-round-top":"material/screw-round-top.svg","material-screwdriver":"material/screwdriver.svg","material-script-outline":"material/script-outline.svg","material-script-text-key-outline":"material/script-text-key-outline.svg","material-script-text-key":"material/script-text-key.svg","material-script-text-outline":"material/script-text-outline.svg","material-script-text-play-outline":"material/script-text-play-outline.svg","material-script-text-play":"material/script-text-play.svg","material-script-text":"material/script-text.svg","material-script":"material/script.svg","material-sd":"material/sd.svg","material-seal-variant":"material/seal-variant.svg","material-seal":"material/seal.svg","material-search-web":"material/search-web.svg","material-seat-flat-angled":"material/seat-flat-angled.svg","material-seat-flat":"material/seat-flat.svg","material-seat-individual-suite":"material/seat-individual-suite.svg","material-seat-legroom-extra":"material/seat-legroom-extra.svg","material-seat-legroom-normal":"material/seat-legroom-normal.svg","material-seat-legroom-reduced":"material/seat-legroom-reduced.svg","material-seat-outline":"material/seat-outline.svg","material-seat-passenger":"material/seat-passenger.svg","material-seat-recline-extra":"material/seat-recline-extra.svg","material-seat-recline-normal":"material/seat-recline-normal.svg","material-seat":"material/seat.svg","material-seatbelt":"material/seatbelt.svg","material-security-network":"material/security-network.svg","material-security":"material/security.svg","material-seed-off-outline":"material/seed-off-outline.svg","material-seed-off":"material/seed-off.svg","material-seed-outline":"material/seed-outline.svg","material-seed-plus-outline":"material/seed-plus-outline.svg","material-seed-plus":"material/seed-plus.svg","material-seed":"material/seed.svg","material-seesaw":"material/seesaw.svg","material-segment":"material/segment.svg","material-select-all":"material/select-all.svg","material-select-arrow-down":"material/select-arrow-down.svg","material-select-arrow-up":"material/select-arrow-up.svg","material-select-color":"material/select-color.svg","material-select-compare":"material/select-compare.svg","material-select-drag":"material/select-drag.svg","material-select-group":"material/select-group.svg","material-select-inverse":"material/select-inverse.svg","material-select-marker":"material/select-marker.svg","material-select-multiple-marker":"material/select-multiple-marker.svg","material-select-multiple":"material/select-multiple.svg","material-select-off":"material/select-off.svg","material-select-place":"material/select-place.svg","material-select-remove":"material/select-remove.svg","material-select-search":"material/select-search.svg","material-select":"material/select.svg","material-selection-drag":"material/selection-drag.svg","material-selection-ellipse-arrow-inside":"material/selection-ellipse-arrow-inside.svg","material-selection-ellipse-remove":"material/selection-ellipse-remove.svg","material-selection-ellipse":"material/selection-ellipse.svg","material-selection-marker":"material/selection-marker.svg","material-selection-multiple-marker":"material/selection-multiple-marker.svg","material-selection-multiple":"material/selection-multiple.svg","material-selection-off":"material/selection-off.svg","material-selection-remove":"material/selection-remove.svg","material-selection-search":"material/selection-search.svg","material-selection":"material/selection.svg","material-semantic-web":"material/semantic-web.svg","material-send-check-outline":"material/send-check-outline.svg","material-send-check":"material/send-check.svg","material-send-circle-outline":"material/send-circle-outline.svg","material-send-circle":"material/send-circle.svg","material-send-clock-outline":"material/send-clock-outline.svg","material-send-clock":"material/send-clock.svg","material-send-lock-outline":"material/send-lock-outline.svg","material-send-lock":"material/send-lock.svg","material-send-outline":"material/send-outline.svg","material-send":"material/send.svg","material-serial-port":"material/serial-port.svg","material-server-minus":"material/server-minus.svg","material-server-network-off":"material/server-network-off.svg","material-server-network":"material/server-network.svg","material-server-off":"material/server-off.svg","material-server-plus":"material/server-plus.svg","material-server-remove":"material/server-remove.svg","material-server-security":"material/server-security.svg","material-server":"material/server.svg","material-set-all":"material/set-all.svg","material-set-center-right":"material/set-center-right.svg","material-set-center":"material/set-center.svg","material-set-left-center":"material/set-left-center.svg","material-set-left-right":"material/set-left-right.svg","material-set-left":"material/set-left.svg","material-set-merge":"material/set-merge.svg","material-set-none":"material/set-none.svg","material-set-right":"material/set-right.svg","material-set-split":"material/set-split.svg","material-set-square":"material/set-square.svg","material-set-top-box":"material/set-top-box.svg","material-settings-helper":"material/settings-helper.svg","material-shaker-outline":"material/shaker-outline.svg","material-shaker":"material/shaker.svg","material-shape-circle-plus":"material/shape-circle-plus.svg","material-shape-outline":"material/shape-outline.svg","material-shape-oval-plus":"material/shape-oval-plus.svg","material-shape-plus":"material/shape-plus.svg","material-shape-polygon-plus":"material/shape-polygon-plus.svg","material-shape-rectangle-plus":"material/shape-rectangle-plus.svg","material-shape-square-plus":"material/shape-square-plus.svg","material-shape-square-rounded-plus":"material/shape-square-rounded-plus.svg","material-shape":"material/shape.svg","material-share-all-outline":"material/share-all-outline.svg","material-share-all":"material/share-all.svg","material-share-circle":"material/share-circle.svg","material-share-off-outline":"material/share-off-outline.svg","material-share-off":"material/share-off.svg","material-share-outline":"material/share-outline.svg","material-share-variant-outline":"material/share-variant-outline.svg","material-share-variant":"material/share-variant.svg","material-share":"material/share.svg","material-shark-fin-outline":"material/shark-fin-outline.svg","material-shark-fin":"material/shark-fin.svg","material-shark-off":"material/shark-off.svg","material-shark":"material/shark.svg","material-sheep":"material/sheep.svg","material-shield-account-outline":"material/shield-account-outline.svg","material-shield-account-variant-outline":"material/shield-account-variant-outline.svg","material-shield-account-variant":"material/shield-account-variant.svg","material-shield-account":"material/shield-account.svg","material-shield-airplane-outline":"material/shield-airplane-outline.svg","material-shield-airplane":"material/shield-airplane.svg","material-shield-alert-outline":"material/shield-alert-outline.svg","material-shield-alert":"material/shield-alert.svg","material-shield-bug-outline":"material/shield-bug-outline.svg","material-shield-bug":"material/shield-bug.svg","material-shield-car":"material/shield-car.svg","material-shield-check-outline":"material/shield-check-outline.svg","material-shield-check":"material/shield-check.svg","material-shield-cross-outline":"material/shield-cross-outline.svg","material-shield-cross":"material/shield-cross.svg","material-shield-crown-outline":"material/shield-crown-outline.svg","material-shield-crown":"material/shield-crown.svg","material-shield-edit-outline":"material/shield-edit-outline.svg","material-shield-edit":"material/shield-edit.svg","material-shield-half-full":"material/shield-half-full.svg","material-shield-half":"material/shield-half.svg","material-shield-home-outline":"material/shield-home-outline.svg","material-shield-home":"material/shield-home.svg","material-shield-key-outline":"material/shield-key-outline.svg","material-shield-key":"material/shield-key.svg","material-shield-link-variant-outline":"material/shield-link-variant-outline.svg","material-shield-link-variant":"material/shield-link-variant.svg","material-shield-lock-open-outline":"material/shield-lock-open-outline.svg","material-shield-lock-open":"material/shield-lock-open.svg","material-shield-lock-outline":"material/shield-lock-outline.svg","material-shield-lock":"material/shield-lock.svg","material-shield-moon-outline":"material/shield-moon-outline.svg","material-shield-moon":"material/shield-moon.svg","material-shield-off-outline":"material/shield-off-outline.svg","material-shield-off":"material/shield-off.svg","material-shield-outline":"material/shield-outline.svg","material-shield-plus-outline":"material/shield-plus-outline.svg","material-shield-plus":"material/shield-plus.svg","material-shield-refresh-outline":"material/shield-refresh-outline.svg","material-shield-refresh":"material/shield-refresh.svg","material-shield-remove-outline":"material/shield-remove-outline.svg","material-shield-remove":"material/shield-remove.svg","material-shield-search":"material/shield-search.svg","material-shield-star-outline":"material/shield-star-outline.svg","material-shield-star":"material/shield-star.svg","material-shield-sun-outline":"material/shield-sun-outline.svg","material-shield-sun":"material/shield-sun.svg","material-shield-sword-outline":"material/shield-sword-outline.svg","material-shield-sword":"material/shield-sword.svg","material-shield-sync-outline":"material/shield-sync-outline.svg","material-shield-sync":"material/shield-sync.svg","material-shield":"material/shield.svg","material-shimmer":"material/shimmer.svg","material-ship-wheel":"material/ship-wheel.svg","material-shipping-pallet":"material/shipping-pallet.svg","material-shoe-ballet":"material/shoe-ballet.svg","material-shoe-cleat":"material/shoe-cleat.svg","material-shoe-formal":"material/shoe-formal.svg","material-shoe-heel":"material/shoe-heel.svg","material-shoe-print":"material/shoe-print.svg","material-shoe-sneaker":"material/shoe-sneaker.svg","material-shopping-music":"material/shopping-music.svg","material-shopping-outline":"material/shopping-outline.svg","material-shopping-search-outline":"material/shopping-search-outline.svg","material-shopping-search":"material/shopping-search.svg","material-shopping":"material/shopping.svg","material-shore":"material/shore.svg","material-shovel-off":"material/shovel-off.svg","material-shovel":"material/shovel.svg","material-shower-head":"material/shower-head.svg","material-shower":"material/shower.svg","material-shredder":"material/shredder.svg","material-shuffle-disabled":"material/shuffle-disabled.svg","material-shuffle-variant":"material/shuffle-variant.svg","material-shuffle":"material/shuffle.svg","material-shuriken":"material/shuriken.svg","material-sickle":"material/sickle.svg","material-sigma-lower":"material/sigma-lower.svg","material-sigma":"material/sigma.svg","material-sign-caution":"material/sign-caution.svg","material-sign-direction-minus":"material/sign-direction-minus.svg","material-sign-direction-plus":"material/sign-direction-plus.svg","material-sign-direction-remove":"material/sign-direction-remove.svg","material-sign-direction":"material/sign-direction.svg","material-sign-language-outline":"material/sign-language-outline.svg","material-sign-language":"material/sign-language.svg","material-sign-pole":"material/sign-pole.svg","material-sign-real-estate":"material/sign-real-estate.svg","material-sign-text":"material/sign-text.svg","material-sign-yield":"material/sign-yield.svg","material-signal-2g":"material/signal-2g.svg","material-signal-3g":"material/signal-3g.svg","material-signal-4g":"material/signal-4g.svg","material-signal-5g":"material/signal-5g.svg","material-signal-cellular-1":"material/signal-cellular-1.svg","material-signal-cellular-2":"material/signal-cellular-2.svg","material-signal-cellular-3":"material/signal-cellular-3.svg","material-signal-cellular-outline":"material/signal-cellular-outline.svg","material-signal-distance-variant":"material/signal-distance-variant.svg","material-signal-hspa-plus":"material/signal-hspa-plus.svg","material-signal-hspa":"material/signal-hspa.svg","material-signal-off":"material/signal-off.svg","material-signal-variant":"material/signal-variant.svg","material-signal":"material/signal.svg","material-signature-freehand":"material/signature-freehand.svg","material-signature-image":"material/signature-image.svg","material-signature-text":"material/signature-text.svg","material-signature":"material/signature.svg","material-silo-outline":"material/silo-outline.svg","material-silo":"material/silo.svg","material-silverware-clean":"material/silverware-clean.svg","material-silverware-fork-knife":"material/silverware-fork-knife.svg","material-silverware-fork":"material/silverware-fork.svg","material-silverware-spoon":"material/silverware-spoon.svg","material-silverware-variant":"material/silverware-variant.svg","material-silverware":"material/silverware.svg","material-sim-alert-outline":"material/sim-alert-outline.svg","material-sim-alert":"material/sim-alert.svg","material-sim-off-outline":"material/sim-off-outline.svg","material-sim-off":"material/sim-off.svg","material-sim-outline":"material/sim-outline.svg","material-sim":"material/sim.svg","material-simple-icons":"material/simple-icons.svg","material-sina-weibo":"material/sina-weibo.svg","material-sine-wave":"material/sine-wave.svg","material-sitemap-outline":"material/sitemap-outline.svg","material-sitemap":"material/sitemap.svg","material-size-l":"material/size-l.svg","material-size-m":"material/size-m.svg","material-size-s":"material/size-s.svg","material-size-xl":"material/size-xl.svg","material-size-xs":"material/size-xs.svg","material-size-xxl":"material/size-xxl.svg","material-size-xxs":"material/size-xxs.svg","material-size-xxxl":"material/size-xxxl.svg","material-skate-off":"material/skate-off.svg","material-skate":"material/skate.svg","material-skateboard":"material/skateboard.svg","material-skateboarding":"material/skateboarding.svg","material-skew-less":"material/skew-less.svg","material-skew-more":"material/skew-more.svg","material-ski-cross-country":"material/ski-cross-country.svg","material-ski-water":"material/ski-water.svg","material-ski":"material/ski.svg","material-skip-backward-outline":"material/skip-backward-outline.svg","material-skip-backward":"material/skip-backward.svg","material-skip-forward-outline":"material/skip-forward-outline.svg","material-skip-forward":"material/skip-forward.svg","material-skip-next-circle-outline":"material/skip-next-circle-outline.svg","material-skip-next-circle":"material/skip-next-circle.svg","material-skip-next-outline":"material/skip-next-outline.svg","material-skip-next":"material/skip-next.svg","material-skip-previous-circle-outline":"material/skip-previous-circle-outline.svg","material-skip-previous-circle":"material/skip-previous-circle.svg","material-skip-previous-outline":"material/skip-previous-outline.svg","material-skip-previous":"material/skip-previous.svg","material-skull-crossbones-outline":"material/skull-crossbones-outline.svg","material-skull-crossbones":"material/skull-crossbones.svg","material-skull-outline":"material/skull-outline.svg","material-skull-scan-outline":"material/skull-scan-outline.svg","material-skull-scan":"material/skull-scan.svg","material-skull":"material/skull.svg","material-skype-business":"material/skype-business.svg","material-skype":"material/skype.svg","material-slack":"material/slack.svg","material-slash-forward-box":"material/slash-forward-box.svg","material-slash-forward":"material/slash-forward.svg","material-sledding":"material/sledding.svg","material-sleep-off":"material/sleep-off.svg","material-sleep":"material/sleep.svg","material-slide":"material/slide.svg","material-slope-downhill":"material/slope-downhill.svg","material-slope-uphill":"material/slope-uphill.svg","material-slot-machine-outline":"material/slot-machine-outline.svg","material-slot-machine":"material/slot-machine.svg","material-smart-card-off-outline":"material/smart-card-off-outline.svg","material-smart-card-off":"material/smart-card-off.svg","material-smart-card-outline":"material/smart-card-outline.svg","material-smart-card-reader-outline":"material/smart-card-reader-outline.svg","material-smart-card-reader":"material/smart-card-reader.svg","material-smart-card":"material/smart-card.svg","material-smog":"material/smog.svg","material-smoke-detector-alert-outline":"material/smoke-detector-alert-outline.svg","material-smoke-detector-alert":"material/smoke-detector-alert.svg","material-smoke-detector-off-outline":"material/smoke-detector-off-outline.svg","material-smoke-detector-off":"material/smoke-detector-off.svg","material-smoke-detector-outline":"material/smoke-detector-outline.svg","material-smoke-detector-variant-alert":"material/smoke-detector-variant-alert.svg","material-smoke-detector-variant-off":"material/smoke-detector-variant-off.svg","material-smoke-detector-variant":"material/smoke-detector-variant.svg","material-smoke-detector":"material/smoke-detector.svg","material-smoke":"material/smoke.svg","material-smoking-off":"material/smoking-off.svg","material-smoking-pipe-off":"material/smoking-pipe-off.svg","material-smoking-pipe":"material/smoking-pipe.svg","material-smoking":"material/smoking.svg","material-snail":"material/snail.svg","material-snake":"material/snake.svg","material-snapchat":"material/snapchat.svg","material-snowboard":"material/snowboard.svg","material-snowflake-alert":"material/snowflake-alert.svg","material-snowflake-check":"material/snowflake-check.svg","material-snowflake-melt":"material/snowflake-melt.svg","material-snowflake-off":"material/snowflake-off.svg","material-snowflake-thermometer":"material/snowflake-thermometer.svg","material-snowflake-variant":"material/snowflake-variant.svg","material-snowflake":"material/snowflake.svg","material-snowman":"material/snowman.svg","material-snowmobile":"material/snowmobile.svg","material-snowshoeing":"material/snowshoeing.svg","material-soccer-field":"material/soccer-field.svg","material-soccer":"material/soccer.svg","material-social-distance-2-meters":"material/social-distance-2-meters.svg","material-social-distance-6-feet":"material/social-distance-6-feet.svg","material-sofa-outline":"material/sofa-outline.svg","material-sofa-single-outline":"material/sofa-single-outline.svg","material-sofa-single":"material/sofa-single.svg","material-sofa":"material/sofa.svg","material-solar-panel-large":"material/solar-panel-large.svg","material-solar-panel":"material/solar-panel.svg","material-solar-power-variant-outline":"material/solar-power-variant-outline.svg","material-solar-power-variant":"material/solar-power-variant.svg","material-solar-power":"material/solar-power.svg","material-soldering-iron":"material/soldering-iron.svg","material-solid":"material/solid.svg","material-sony-playstation":"material/sony-playstation.svg","material-sort-alphabetical-ascending-variant":"material/sort-alphabetical-ascending-variant.svg","material-sort-alphabetical-ascending":"material/sort-alphabetical-ascending.svg","material-sort-alphabetical-descending-variant":"material/sort-alphabetical-descending-variant.svg","material-sort-alphabetical-descending":"material/sort-alphabetical-descending.svg","material-sort-alphabetical-variant":"material/sort-alphabetical-variant.svg","material-sort-ascending":"material/sort-ascending.svg","material-sort-bool-ascending-variant":"material/sort-bool-ascending-variant.svg","material-sort-bool-ascending":"material/sort-bool-ascending.svg","material-sort-bool-descending-variant":"material/sort-bool-descending-variant.svg","material-sort-bool-descending":"material/sort-bool-descending.svg","material-sort-calendar-ascending":"material/sort-calendar-ascending.svg","material-sort-calendar-descending":"material/sort-calendar-descending.svg","material-sort-clock-ascending-outline":"material/sort-clock-ascending-outline.svg","material-sort-clock-ascending":"material/sort-clock-ascending.svg","material-sort-clock-descending-outline":"material/sort-clock-descending-outline.svg","material-sort-clock-descending":"material/sort-clock-descending.svg","material-sort-descending":"material/sort-descending.svg","material-sort-numeric-ascending-variant":"material/sort-numeric-ascending-variant.svg","material-sort-numeric-ascending":"material/sort-numeric-ascending.svg","material-sort-numeric-descending-variant":"material/sort-numeric-descending-variant.svg","material-sort-numeric-descending":"material/sort-numeric-descending.svg","material-sort-numeric-variant":"material/sort-numeric-variant.svg","material-sort-reverse-variant":"material/sort-reverse-variant.svg","material-sort-variant-lock-open":"material/sort-variant-lock-open.svg","material-sort-variant-lock":"material/sort-variant-lock.svg","material-sort-variant-off":"material/sort-variant-off.svg","material-sort-variant-remove":"material/sort-variant-remove.svg","material-sort-variant":"material/sort-variant.svg","material-sort":"material/sort.svg","material-soundbar":"material/soundbar.svg","material-soundcloud":"material/soundcloud.svg","material-source-branch-check":"material/source-branch-check.svg","material-source-branch-minus":"material/source-branch-minus.svg","material-source-branch-plus":"material/source-branch-plus.svg","material-source-branch-refresh":"material/source-branch-refresh.svg","material-source-branch-remove":"material/source-branch-remove.svg","material-source-branch-sync":"material/source-branch-sync.svg","material-source-branch":"material/source-branch.svg","material-source-commit-end-local":"material/source-commit-end-local.svg","material-source-commit-end":"material/source-commit-end.svg","material-source-commit-local":"material/source-commit-local.svg","material-source-commit-next-local":"material/source-commit-next-local.svg","material-source-commit-start-next-local":"material/source-commit-start-next-local.svg","material-source-commit-start":"material/source-commit-start.svg","material-source-commit":"material/source-commit.svg","material-source-fork":"material/source-fork.svg","material-source-merge":"material/source-merge.svg","material-source-pull":"material/source-pull.svg","material-source-repository-multiple":"material/source-repository-multiple.svg","material-source-repository":"material/source-repository.svg","material-soy-sauce-off":"material/soy-sauce-off.svg","material-soy-sauce":"material/soy-sauce.svg","material-spa-outline":"material/spa-outline.svg","material-spa":"material/spa.svg","material-space-invaders":"material/space-invaders.svg","material-space-station":"material/space-station.svg","material-spade":"material/spade.svg","material-speaker-bluetooth":"material/speaker-bluetooth.svg","material-speaker-message":"material/speaker-message.svg","material-speaker-multiple":"material/speaker-multiple.svg","material-speaker-off":"material/speaker-off.svg","material-speaker-pause":"material/speaker-pause.svg","material-speaker-play":"material/speaker-play.svg","material-speaker-stop":"material/speaker-stop.svg","material-speaker-wireless":"material/speaker-wireless.svg","material-speaker":"material/speaker.svg","material-spear":"material/spear.svg","material-speedometer-medium":"material/speedometer-medium.svg","material-speedometer-slow":"material/speedometer-slow.svg","material-speedometer":"material/speedometer.svg","material-spellcheck":"material/spellcheck.svg","material-sphere-off":"material/sphere-off.svg","material-sphere":"material/sphere.svg","material-spider-thread":"material/spider-thread.svg","material-spider-web":"material/spider-web.svg","material-spider":"material/spider.svg","material-spirit-level":"material/spirit-level.svg","material-spoon-sugar":"material/spoon-sugar.svg","material-spotify":"material/spotify.svg","material-spotlight-beam":"material/spotlight-beam.svg","material-spotlight":"material/spotlight.svg","material-spray-bottle":"material/spray-bottle.svg","material-spray":"material/spray.svg","material-sprinkler-fire":"material/sprinkler-fire.svg","material-sprinkler-variant":"material/sprinkler-variant.svg","material-sprinkler":"material/sprinkler.svg","material-sprout-outline":"material/sprout-outline.svg","material-sprout":"material/sprout.svg","material-square-circle":"material/square-circle.svg","material-square-edit-outline":"material/square-edit-outline.svg","material-square-medium-outline":"material/square-medium-outline.svg","material-square-medium":"material/square-medium.svg","material-square-off-outline":"material/square-off-outline.svg","material-square-off":"material/square-off.svg","material-square-opacity":"material/square-opacity.svg","material-square-outline":"material/square-outline.svg","material-square-root-box":"material/square-root-box.svg","material-square-root":"material/square-root.svg","material-square-rounded-badge-outline":"material/square-rounded-badge-outline.svg","material-square-rounded-badge":"material/square-rounded-badge.svg","material-square-rounded-outline":"material/square-rounded-outline.svg","material-square-rounded":"material/square-rounded.svg","material-square-small":"material/square-small.svg","material-square-wave":"material/square-wave.svg","material-square":"material/square.svg","material-squeegee":"material/squeegee.svg","material-ssh":"material/ssh.svg","material-stack-exchange":"material/stack-exchange.svg","material-stack-overflow":"material/stack-overflow.svg","material-stackpath":"material/stackpath.svg","material-stadium-outline":"material/stadium-outline.svg","material-stadium-variant":"material/stadium-variant.svg","material-stadium":"material/stadium.svg","material-stairs-box":"material/stairs-box.svg","material-stairs-down":"material/stairs-down.svg","material-stairs-up":"material/stairs-up.svg","material-stairs":"material/stairs.svg","material-stamper":"material/stamper.svg","material-standard-definition":"material/standard-definition.svg","material-star-box-multiple-outline":"material/star-box-multiple-outline.svg","material-star-box-multiple":"material/star-box-multiple.svg","material-star-box-outline":"material/star-box-outline.svg","material-star-box":"material/star-box.svg","material-star-check-outline":"material/star-check-outline.svg","material-star-check":"material/star-check.svg","material-star-circle-outline":"material/star-circle-outline.svg","material-star-circle":"material/star-circle.svg","material-star-cog-outline":"material/star-cog-outline.svg","material-star-cog":"material/star-cog.svg","material-star-crescent":"material/star-crescent.svg","material-star-david":"material/star-david.svg","material-star-face":"material/star-face.svg","material-star-four-points-outline":"material/star-four-points-outline.svg","material-star-four-points":"material/star-four-points.svg","material-star-half-full":"material/star-half-full.svg","material-star-half":"material/star-half.svg","material-star-minus-outline":"material/star-minus-outline.svg","material-star-minus":"material/star-minus.svg","material-star-off-outline":"material/star-off-outline.svg","material-star-off":"material/star-off.svg","material-star-outline":"material/star-outline.svg","material-star-plus-outline":"material/star-plus-outline.svg","material-star-plus":"material/star-plus.svg","material-star-remove-outline":"material/star-remove-outline.svg","material-star-remove":"material/star-remove.svg","material-star-settings-outline":"material/star-settings-outline.svg","material-star-settings":"material/star-settings.svg","material-star-shooting-outline":"material/star-shooting-outline.svg","material-star-shooting":"material/star-shooting.svg","material-star-three-points-outline":"material/star-three-points-outline.svg","material-star-three-points":"material/star-three-points.svg","material-star":"material/star.svg","material-state-machine":"material/state-machine.svg","material-steam":"material/steam.svg","material-steering-off":"material/steering-off.svg","material-steering":"material/steering.svg","material-step-backward-2":"material/step-backward-2.svg","material-step-backward":"material/step-backward.svg","material-step-forward-2":"material/step-forward-2.svg","material-step-forward":"material/step-forward.svg","material-stethoscope":"material/stethoscope.svg","material-sticker-alert-outline":"material/sticker-alert-outline.svg","material-sticker-alert":"material/sticker-alert.svg","material-sticker-check-outline":"material/sticker-check-outline.svg","material-sticker-check":"material/sticker-check.svg","material-sticker-circle-outline":"material/sticker-circle-outline.svg","material-sticker-emoji":"material/sticker-emoji.svg","material-sticker-minus-outline":"material/sticker-minus-outline.svg","material-sticker-minus":"material/sticker-minus.svg","material-sticker-outline":"material/sticker-outline.svg","material-sticker-plus-outline":"material/sticker-plus-outline.svg","material-sticker-plus":"material/sticker-plus.svg","material-sticker-remove-outline":"material/sticker-remove-outline.svg","material-sticker-remove":"material/sticker-remove.svg","material-sticker-text-outline":"material/sticker-text-outline.svg","material-sticker-text":"material/sticker-text.svg","material-sticker":"material/sticker.svg","material-stocking":"material/stocking.svg","material-stomach":"material/stomach.svg","material-stool-outline":"material/stool-outline.svg","material-stool":"material/stool.svg","material-stop-circle-outline":"material/stop-circle-outline.svg","material-stop-circle":"material/stop-circle.svg","material-stop":"material/stop.svg","material-storage-tank-outline":"material/storage-tank-outline.svg","material-storage-tank":"material/storage-tank.svg","material-store-24-hour":"material/store-24-hour.svg","material-store-alert-outline":"material/store-alert-outline.svg","material-store-alert":"material/store-alert.svg","material-store-check-outline":"material/store-check-outline.svg","material-store-check":"material/store-check.svg","material-store-clock-outline":"material/store-clock-outline.svg","material-store-clock":"material/store-clock.svg","material-store-cog-outline":"material/store-cog-outline.svg","material-store-cog":"material/store-cog.svg","material-store-edit-outline":"material/store-edit-outline.svg","material-store-edit":"material/store-edit.svg","material-store-marker-outline":"material/store-marker-outline.svg","material-store-marker":"material/store-marker.svg","material-store-minus-outline":"material/store-minus-outline.svg","material-store-minus":"material/store-minus.svg","material-store-off-outline":"material/store-off-outline.svg","material-store-off":"material/store-off.svg","material-store-outline":"material/store-outline.svg","material-store-plus-outline":"material/store-plus-outline.svg","material-store-plus":"material/store-plus.svg","material-store-remove-outline":"material/store-remove-outline.svg","material-store-remove":"material/store-remove.svg","material-store-search-outline":"material/store-search-outline.svg","material-store-search":"material/store-search.svg","material-store-settings-outline":"material/store-settings-outline.svg","material-store-settings":"material/store-settings.svg","material-store":"material/store.svg","material-storefront-check-outline":"material/storefront-check-outline.svg","material-storefront-check":"material/storefront-check.svg","material-storefront-edit-outline":"material/storefront-edit-outline.svg","material-storefront-edit":"material/storefront-edit.svg","material-storefront-minus-outline":"material/storefront-minus-outline.svg","material-storefront-minus":"material/storefront-minus.svg","material-storefront-outline":"material/storefront-outline.svg","material-storefront-plus-outline":"material/storefront-plus-outline.svg","material-storefront-plus":"material/storefront-plus.svg","material-storefront-remove-outline":"material/storefront-remove-outline.svg","material-storefront-remove":"material/storefront-remove.svg","material-storefront":"material/storefront.svg","material-stove":"material/stove.svg","material-strategy":"material/strategy.svg","material-stretch-to-page-outline":"material/stretch-to-page-outline.svg","material-stretch-to-page":"material/stretch-to-page.svg","material-string-lights-off":"material/string-lights-off.svg","material-string-lights":"material/string-lights.svg","material-subdirectory-arrow-left":"material/subdirectory-arrow-left.svg","material-subdirectory-arrow-right":"material/subdirectory-arrow-right.svg","material-submarine":"material/submarine.svg","material-subtitles-outline":"material/subtitles-outline.svg","material-subtitles":"material/subtitles.svg","material-subway-alert-variant":"material/subway-alert-variant.svg","material-subway-variant":"material/subway-variant.svg","material-subway":"material/subway.svg","material-summit":"material/summit.svg","material-sun-angle-outline":"material/sun-angle-outline.svg","material-sun-angle":"material/sun-angle.svg","material-sun-clock-outline":"material/sun-clock-outline.svg","material-sun-clock":"material/sun-clock.svg","material-sun-compass":"material/sun-compass.svg","material-sun-snowflake-variant":"material/sun-snowflake-variant.svg","material-sun-snowflake":"material/sun-snowflake.svg","material-sun-thermometer-outline":"material/sun-thermometer-outline.svg","material-sun-thermometer":"material/sun-thermometer.svg","material-sun-wireless-outline":"material/sun-wireless-outline.svg","material-sun-wireless":"material/sun-wireless.svg","material-sunglasses":"material/sunglasses.svg","material-surfing":"material/surfing.svg","material-surround-sound-2-0":"material/surround-sound-2-0.svg","material-surround-sound-2-1":"material/surround-sound-2-1.svg","material-surround-sound-3-1":"material/surround-sound-3-1.svg","material-surround-sound-5-1-2":"material/surround-sound-5-1-2.svg","material-surround-sound-5-1":"material/surround-sound-5-1.svg","material-surround-sound-7-1":"material/surround-sound-7-1.svg","material-surround-sound":"material/surround-sound.svg","material-svg":"material/svg.svg","material-swap-horizontal-bold":"material/swap-horizontal-bold.svg","material-swap-horizontal-circle-outline":"material/swap-horizontal-circle-outline.svg","material-swap-horizontal-circle":"material/swap-horizontal-circle.svg","material-swap-horizontal-variant":"material/swap-horizontal-variant.svg","material-swap-horizontal":"material/swap-horizontal.svg","material-swap-vertical-bold":"material/swap-vertical-bold.svg","material-swap-vertical-circle-outline":"material/swap-vertical-circle-outline.svg","material-swap-vertical-circle":"material/swap-vertical-circle.svg","material-swap-vertical-variant":"material/swap-vertical-variant.svg","material-swap-vertical":"material/swap-vertical.svg","material-swim":"material/swim.svg","material-switch":"material/switch.svg","material-sword-cross":"material/sword-cross.svg","material-sword":"material/sword.svg","material-syllabary-hangul":"material/syllabary-hangul.svg","material-syllabary-hiragana":"material/syllabary-hiragana.svg","material-syllabary-katakana-halfwidth":"material/syllabary-katakana-halfwidth.svg","material-syllabary-katakana":"material/syllabary-katakana.svg","material-symbol":"material/symbol.svg","material-symfony":"material/symfony.svg","material-synagogue-outline":"material/synagogue-outline.svg","material-synagogue":"material/synagogue.svg","material-sync-alert":"material/sync-alert.svg","material-sync-circle":"material/sync-circle.svg","material-sync-off":"material/sync-off.svg","material-sync":"material/sync.svg","material-tab-minus":"material/tab-minus.svg","material-tab-plus":"material/tab-plus.svg","material-tab-remove":"material/tab-remove.svg","material-tab-search":"material/tab-search.svg","material-tab-unselected":"material/tab-unselected.svg","material-tab":"material/tab.svg","material-table-account":"material/table-account.svg","material-table-alert":"material/table-alert.svg","material-table-arrow-down":"material/table-arrow-down.svg","material-table-arrow-left":"material/table-arrow-left.svg","material-table-arrow-right":"material/table-arrow-right.svg","material-table-arrow-up":"material/table-arrow-up.svg","material-table-border":"material/table-border.svg","material-table-cancel":"material/table-cancel.svg","material-table-chair":"material/table-chair.svg","material-table-check":"material/table-check.svg","material-table-clock":"material/table-clock.svg","material-table-cog":"material/table-cog.svg","material-table-column-plus-after":"material/table-column-plus-after.svg","material-table-column-plus-before":"material/table-column-plus-before.svg","material-table-column-remove":"material/table-column-remove.svg","material-table-column-width":"material/table-column-width.svg","material-table-column":"material/table-column.svg","material-table-edit":"material/table-edit.svg","material-table-eye-off":"material/table-eye-off.svg","material-table-eye":"material/table-eye.svg","material-table-filter":"material/table-filter.svg","material-table-furniture":"material/table-furniture.svg","material-table-headers-eye-off":"material/table-headers-eye-off.svg","material-table-headers-eye":"material/table-headers-eye.svg","material-table-heart":"material/table-heart.svg","material-table-key":"material/table-key.svg","material-table-large-plus":"material/table-large-plus.svg","material-table-large-remove":"material/table-large-remove.svg","material-table-large":"material/table-large.svg","material-table-lock":"material/table-lock.svg","material-table-merge-cells":"material/table-merge-cells.svg","material-table-minus":"material/table-minus.svg","material-table-multiple":"material/table-multiple.svg","material-table-network":"material/table-network.svg","material-table-of-contents":"material/table-of-contents.svg","material-table-off":"material/table-off.svg","material-table-picnic":"material/table-picnic.svg","material-table-pivot":"material/table-pivot.svg","material-table-plus":"material/table-plus.svg","material-table-question":"material/table-question.svg","material-table-refresh":"material/table-refresh.svg","material-table-remove":"material/table-remove.svg","material-table-row-height":"material/table-row-height.svg","material-table-row-plus-after":"material/table-row-plus-after.svg","material-table-row-plus-before":"material/table-row-plus-before.svg","material-table-row-remove":"material/table-row-remove.svg","material-table-row":"material/table-row.svg","material-table-search":"material/table-search.svg","material-table-settings":"material/table-settings.svg","material-table-split-cell":"material/table-split-cell.svg","material-table-star":"material/table-star.svg","material-table-sync":"material/table-sync.svg","material-table-tennis":"material/table-tennis.svg","material-table":"material/table.svg","material-tablet-cellphone":"material/tablet-cellphone.svg","material-tablet-dashboard":"material/tablet-dashboard.svg","material-tablet":"material/tablet.svg","material-taco":"material/taco.svg","material-tag-arrow-down-outline":"material/tag-arrow-down-outline.svg","material-tag-arrow-down":"material/tag-arrow-down.svg","material-tag-arrow-left-outline":"material/tag-arrow-left-outline.svg","material-tag-arrow-left":"material/tag-arrow-left.svg","material-tag-arrow-right-outline":"material/tag-arrow-right-outline.svg","material-tag-arrow-right":"material/tag-arrow-right.svg","material-tag-arrow-up-outline":"material/tag-arrow-up-outline.svg","material-tag-arrow-up":"material/tag-arrow-up.svg","material-tag-check-outline":"material/tag-check-outline.svg","material-tag-check":"material/tag-check.svg","material-tag-faces":"material/tag-faces.svg","material-tag-heart-outline":"material/tag-heart-outline.svg","material-tag-heart":"material/tag-heart.svg","material-tag-minus-outline":"material/tag-minus-outline.svg","material-tag-minus":"material/tag-minus.svg","material-tag-multiple-outline":"material/tag-multiple-outline.svg","material-tag-multiple":"material/tag-multiple.svg","material-tag-off-outline":"material/tag-off-outline.svg","material-tag-off":"material/tag-off.svg","material-tag-outline":"material/tag-outline.svg","material-tag-plus-outline":"material/tag-plus-outline.svg","material-tag-plus":"material/tag-plus.svg","material-tag-remove-outline":"material/tag-remove-outline.svg","material-tag-remove":"material/tag-remove.svg","material-tag-search-outline":"material/tag-search-outline.svg","material-tag-search":"material/tag-search.svg","material-tag-text-outline":"material/tag-text-outline.svg","material-tag-text":"material/tag-text.svg","material-tag":"material/tag.svg","material-tailwind":"material/tailwind.svg","material-tally-mark-1":"material/tally-mark-1.svg","material-tally-mark-2":"material/tally-mark-2.svg","material-tally-mark-3":"material/tally-mark-3.svg","material-tally-mark-4":"material/tally-mark-4.svg","material-tally-mark-5":"material/tally-mark-5.svg","material-tangram":"material/tangram.svg","material-tank":"material/tank.svg","material-tanker-truck":"material/tanker-truck.svg","material-tape-drive":"material/tape-drive.svg","material-tape-measure":"material/tape-measure.svg","material-target-account":"material/target-account.svg","material-target-variant":"material/target-variant.svg","material-target":"material/target.svg","material-taxi":"material/taxi.svg","material-tea-outline":"material/tea-outline.svg","material-tea":"material/tea.svg","material-teamviewer":"material/teamviewer.svg","material-teddy-bear":"material/teddy-bear.svg","material-telescope":"material/telescope.svg","material-television-ambient-light":"material/television-ambient-light.svg","material-television-box":"material/television-box.svg","material-television-classic-off":"material/television-classic-off.svg","material-television-classic":"material/television-classic.svg","material-television-guide":"material/television-guide.svg","material-television-off":"material/television-off.svg","material-television-pause":"material/television-pause.svg","material-television-play":"material/television-play.svg","material-television-shimmer":"material/television-shimmer.svg","material-television-speaker-off":"material/television-speaker-off.svg","material-television-speaker":"material/television-speaker.svg","material-television-stop":"material/television-stop.svg","material-television":"material/television.svg","material-temperature-celsius":"material/temperature-celsius.svg","material-temperature-fahrenheit":"material/temperature-fahrenheit.svg","material-temperature-kelvin":"material/temperature-kelvin.svg","material-temple-buddhist-outline":"material/temple-buddhist-outline.svg","material-temple-buddhist":"material/temple-buddhist.svg","material-temple-hindu-outline":"material/temple-hindu-outline.svg","material-temple-hindu":"material/temple-hindu.svg","material-tennis-ball":"material/tennis-ball.svg","material-tennis":"material/tennis.svg","material-tent":"material/tent.svg","material-terraform":"material/terraform.svg","material-terrain":"material/terrain.svg","material-test-tube-empty":"material/test-tube-empty.svg","material-test-tube-off":"material/test-tube-off.svg","material-test-tube":"material/test-tube.svg","material-text-account":"material/text-account.svg","material-text-box-check-outline":"material/text-box-check-outline.svg","material-text-box-check":"material/text-box-check.svg","material-text-box-edit-outline":"material/text-box-edit-outline.svg","material-text-box-edit":"material/text-box-edit.svg","material-text-box-minus-outline":"material/text-box-minus-outline.svg","material-text-box-minus":"material/text-box-minus.svg","material-text-box-multiple-outline":"material/text-box-multiple-outline.svg","material-text-box-multiple":"material/text-box-multiple.svg","material-text-box-outline":"material/text-box-outline.svg","material-text-box-plus-outline":"material/text-box-plus-outline.svg","material-text-box-plus":"material/text-box-plus.svg","material-text-box-remove-outline":"material/text-box-remove-outline.svg","material-text-box-remove":"material/text-box-remove.svg","material-text-box-search-outline":"material/text-box-search-outline.svg","material-text-box-search":"material/text-box-search.svg","material-text-box":"material/text-box.svg","material-text-long":"material/text-long.svg","material-text-recognition":"material/text-recognition.svg","material-text-search-variant":"material/text-search-variant.svg","material-text-search":"material/text-search.svg","material-text-shadow":"material/text-shadow.svg","material-text-short":"material/text-short.svg","material-text":"material/text.svg","material-texture-box":"material/texture-box.svg","material-texture":"material/texture.svg","material-theater":"material/theater.svg","material-theme-light-dark":"material/theme-light-dark.svg","material-thermometer-alert":"material/thermometer-alert.svg","material-thermometer-auto":"material/thermometer-auto.svg","material-thermometer-bluetooth":"material/thermometer-bluetooth.svg","material-thermometer-check":"material/thermometer-check.svg","material-thermometer-chevron-down":"material/thermometer-chevron-down.svg","material-thermometer-chevron-up":"material/thermometer-chevron-up.svg","material-thermometer-high":"material/thermometer-high.svg","material-thermometer-lines":"material/thermometer-lines.svg","material-thermometer-low":"material/thermometer-low.svg","material-thermometer-minus":"material/thermometer-minus.svg","material-thermometer-off":"material/thermometer-off.svg","material-thermometer-plus":"material/thermometer-plus.svg","material-thermometer-probe-off":"material/thermometer-probe-off.svg","material-thermometer-probe":"material/thermometer-probe.svg","material-thermometer-water":"material/thermometer-water.svg","material-thermometer":"material/thermometer.svg","material-thermostat-auto":"material/thermostat-auto.svg","material-thermostat-box-auto":"material/thermostat-box-auto.svg","material-thermostat-box":"material/thermostat-box.svg","material-thermostat":"material/thermostat.svg","material-thought-bubble-outline":"material/thought-bubble-outline.svg","material-thought-bubble":"material/thought-bubble.svg","material-thumb-down-outline":"material/thumb-down-outline.svg","material-thumb-down":"material/thumb-down.svg","material-thumb-up-outline":"material/thumb-up-outline.svg","material-thumb-up":"material/thumb-up.svg","material-thumbs-up-down-outline":"material/thumbs-up-down-outline.svg","material-thumbs-up-down":"material/thumbs-up-down.svg","material-ticket-account":"material/ticket-account.svg","material-ticket-confirmation-outline":"material/ticket-confirmation-outline.svg","material-ticket-confirmation":"material/ticket-confirmation.svg","material-ticket-outline":"material/ticket-outline.svg","material-ticket-percent-outline":"material/ticket-percent-outline.svg","material-ticket-percent":"material/ticket-percent.svg","material-ticket":"material/ticket.svg","material-tie":"material/tie.svg","material-tilde-off":"material/tilde-off.svg","material-tilde":"material/tilde.svg","material-timelapse":"material/timelapse.svg","material-timeline-alert-outline":"material/timeline-alert-outline.svg","material-timeline-alert":"material/timeline-alert.svg","material-timeline-check-outline":"material/timeline-check-outline.svg","material-timeline-check":"material/timeline-check.svg","material-timeline-clock-outline":"material/timeline-clock-outline.svg","material-timeline-clock":"material/timeline-clock.svg","material-timeline-minus-outline":"material/timeline-minus-outline.svg","material-timeline-minus":"material/timeline-minus.svg","material-timeline-outline":"material/timeline-outline.svg","material-timeline-plus-outline":"material/timeline-plus-outline.svg","material-timeline-plus":"material/timeline-plus.svg","material-timeline-question-outline":"material/timeline-question-outline.svg","material-timeline-question":"material/timeline-question.svg","material-timeline-remove-outline":"material/timeline-remove-outline.svg","material-timeline-remove":"material/timeline-remove.svg","material-timeline-text-outline":"material/timeline-text-outline.svg","material-timeline-text":"material/timeline-text.svg","material-timeline":"material/timeline.svg","material-timer-10":"material/timer-10.svg","material-timer-3":"material/timer-3.svg","material-timer-alert-outline":"material/timer-alert-outline.svg","material-timer-alert":"material/timer-alert.svg","material-timer-cancel-outline":"material/timer-cancel-outline.svg","material-timer-cancel":"material/timer-cancel.svg","material-timer-check-outline":"material/timer-check-outline.svg","material-timer-check":"material/timer-check.svg","material-timer-cog-outline":"material/timer-cog-outline.svg","material-timer-cog":"material/timer-cog.svg","material-timer-edit-outline":"material/timer-edit-outline.svg","material-timer-edit":"material/timer-edit.svg","material-timer-lock-open-outline":"material/timer-lock-open-outline.svg","material-timer-lock-open":"material/timer-lock-open.svg","material-timer-lock-outline":"material/timer-lock-outline.svg","material-timer-lock":"material/timer-lock.svg","material-timer-marker-outline":"material/timer-marker-outline.svg","material-timer-marker":"material/timer-marker.svg","material-timer-minus-outline":"material/timer-minus-outline.svg","material-timer-minus":"material/timer-minus.svg","material-timer-music-outline":"material/timer-music-outline.svg","material-timer-music":"material/timer-music.svg","material-timer-off-outline":"material/timer-off-outline.svg","material-timer-off":"material/timer-off.svg","material-timer-outline":"material/timer-outline.svg","material-timer-pause-outline":"material/timer-pause-outline.svg","material-timer-pause":"material/timer-pause.svg","material-timer-play-outline":"material/timer-play-outline.svg","material-timer-play":"material/timer-play.svg","material-timer-plus-outline":"material/timer-plus-outline.svg","material-timer-plus":"material/timer-plus.svg","material-timer-refresh-outline":"material/timer-refresh-outline.svg","material-timer-refresh":"material/timer-refresh.svg","material-timer-remove-outline":"material/timer-remove-outline.svg","material-timer-remove":"material/timer-remove.svg","material-timer-sand-complete":"material/timer-sand-complete.svg","material-timer-sand-empty":"material/timer-sand-empty.svg","material-timer-sand-full":"material/timer-sand-full.svg","material-timer-sand-paused":"material/timer-sand-paused.svg","material-timer-sand":"material/timer-sand.svg","material-timer-settings-outline":"material/timer-settings-outline.svg","material-timer-settings":"material/timer-settings.svg","material-timer-star-outline":"material/timer-star-outline.svg","material-timer-star":"material/timer-star.svg","material-timer-stop-outline":"material/timer-stop-outline.svg","material-timer-stop":"material/timer-stop.svg","material-timer-sync-outline":"material/timer-sync-outline.svg","material-timer-sync":"material/timer-sync.svg","material-timer":"material/timer.svg","material-timetable":"material/timetable.svg","material-tire":"material/tire.svg","material-toaster-off":"material/toaster-off.svg","material-toaster-oven":"material/toaster-oven.svg","material-toaster":"material/toaster.svg","material-toggle-switch-off-outline":"material/toggle-switch-off-outline.svg","material-toggle-switch-off":"material/toggle-switch-off.svg","material-toggle-switch-outline":"material/toggle-switch-outline.svg","material-toggle-switch-variant-off":"material/toggle-switch-variant-off.svg","material-toggle-switch-variant":"material/toggle-switch-variant.svg","material-toggle-switch":"material/toggle-switch.svg","material-toilet":"material/toilet.svg","material-toolbox-outline":"material/toolbox-outline.svg","material-toolbox":"material/toolbox.svg","material-tools":"material/tools.svg","material-tooltip-account":"material/tooltip-account.svg","material-tooltip-cellphone":"material/tooltip-cellphone.svg","material-tooltip-check-outline":"material/tooltip-check-outline.svg","material-tooltip-check":"material/tooltip-check.svg","material-tooltip-edit-outline":"material/tooltip-edit-outline.svg","material-tooltip-edit":"material/tooltip-edit.svg","material-tooltip-image-outline":"material/tooltip-image-outline.svg","material-tooltip-image":"material/tooltip-image.svg","material-tooltip-minus-outline":"material/tooltip-minus-outline.svg","material-tooltip-minus":"material/tooltip-minus.svg","material-tooltip-outline":"material/tooltip-outline.svg","material-tooltip-plus-outline":"material/tooltip-plus-outline.svg","material-tooltip-plus":"material/tooltip-plus.svg","material-tooltip-remove-outline":"material/tooltip-remove-outline.svg","material-tooltip-remove":"material/tooltip-remove.svg","material-tooltip-text-outline":"material/tooltip-text-outline.svg","material-tooltip-text":"material/tooltip-text.svg","material-tooltip":"material/tooltip.svg","material-tooth-outline":"material/tooth-outline.svg","material-tooth":"material/tooth.svg","material-toothbrush-electric":"material/toothbrush-electric.svg","material-toothbrush-paste":"material/toothbrush-paste.svg","material-toothbrush":"material/toothbrush.svg","material-torch":"material/torch.svg","material-tortoise":"material/tortoise.svg","material-toslink":"material/toslink.svg","material-tournament":"material/tournament.svg","material-tow-truck":"material/tow-truck.svg","material-tower-beach":"material/tower-beach.svg","material-tower-fire":"material/tower-fire.svg","material-town-hall":"material/town-hall.svg","material-toy-brick-marker-outline":"material/toy-brick-marker-outline.svg","material-toy-brick-marker":"material/toy-brick-marker.svg","material-toy-brick-minus-outline":"material/toy-brick-minus-outline.svg","material-toy-brick-minus":"material/toy-brick-minus.svg","material-toy-brick-outline":"material/toy-brick-outline.svg","material-toy-brick-plus-outline":"material/toy-brick-plus-outline.svg","material-toy-brick-plus":"material/toy-brick-plus.svg","material-toy-brick-remove-outline":"material/toy-brick-remove-outline.svg","material-toy-brick-remove":"material/toy-brick-remove.svg","material-toy-brick-search-outline":"material/toy-brick-search-outline.svg","material-toy-brick-search":"material/toy-brick-search.svg","material-toy-brick":"material/toy-brick.svg","material-track-light-off":"material/track-light-off.svg","material-track-light":"material/track-light.svg","material-trackpad-lock":"material/trackpad-lock.svg","material-trackpad":"material/trackpad.svg","material-tractor-variant":"material/tractor-variant.svg","material-tractor":"material/tractor.svg","material-trademark":"material/trademark.svg","material-traffic-cone":"material/traffic-cone.svg","material-traffic-light-outline":"material/traffic-light-outline.svg","material-traffic-light":"material/traffic-light.svg","material-train-car-autorack":"material/train-car-autorack.svg","material-train-car-box-full":"material/train-car-box-full.svg","material-train-car-box-open":"material/train-car-box-open.svg","material-train-car-box":"material/train-car-box.svg","material-train-car-caboose":"material/train-car-caboose.svg","material-train-car-centerbeam-full":"material/train-car-centerbeam-full.svg","material-train-car-centerbeam":"material/train-car-centerbeam.svg","material-train-car-container":"material/train-car-container.svg","material-train-car-flatbed-car":"material/train-car-flatbed-car.svg","material-train-car-flatbed-tank":"material/train-car-flatbed-tank.svg","material-train-car-flatbed":"material/train-car-flatbed.svg","material-train-car-gondola-full":"material/train-car-gondola-full.svg","material-train-car-gondola":"material/train-car-gondola.svg","material-train-car-hopper-covered":"material/train-car-hopper-covered.svg","material-train-car-hopper-full":"material/train-car-hopper-full.svg","material-train-car-hopper":"material/train-car-hopper.svg","material-train-car-intermodal":"material/train-car-intermodal.svg","material-train-car-passenger-door-open":"material/train-car-passenger-door-open.svg","material-train-car-passenger-door":"material/train-car-passenger-door.svg","material-train-car-passenger-variant":"material/train-car-passenger-variant.svg","material-train-car-passenger":"material/train-car-passenger.svg","material-train-car-tank":"material/train-car-tank.svg","material-train-car":"material/train-car.svg","material-train-variant":"material/train-variant.svg","material-train":"material/train.svg","material-tram-side":"material/tram-side.svg","material-tram":"material/tram.svg","material-transcribe-close":"material/transcribe-close.svg","material-transcribe":"material/transcribe.svg","material-transfer-down":"material/transfer-down.svg","material-transfer-left":"material/transfer-left.svg","material-transfer-right":"material/transfer-right.svg","material-transfer-up":"material/transfer-up.svg","material-transfer":"material/transfer.svg","material-transit-connection-horizontal":"material/transit-connection-horizontal.svg","material-transit-connection-variant":"material/transit-connection-variant.svg","material-transit-connection":"material/transit-connection.svg","material-transit-detour":"material/transit-detour.svg","material-transit-skip":"material/transit-skip.svg","material-transit-transfer":"material/transit-transfer.svg","material-transition-masked":"material/transition-masked.svg","material-transition":"material/transition.svg","material-translate-off":"material/translate-off.svg","material-translate-variant":"material/translate-variant.svg","material-translate":"material/translate.svg","material-transmission-tower-export":"material/transmission-tower-export.svg","material-transmission-tower-import":"material/transmission-tower-import.svg","material-transmission-tower-off":"material/transmission-tower-off.svg","material-transmission-tower":"material/transmission-tower.svg","material-trash-can-outline":"material/trash-can-outline.svg","material-trash-can":"material/trash-can.svg","material-tray-alert":"material/tray-alert.svg","material-tray-arrow-down":"material/tray-arrow-down.svg","material-tray-arrow-up":"material/tray-arrow-up.svg","material-tray-full":"material/tray-full.svg","material-tray-minus":"material/tray-minus.svg","material-tray-plus":"material/tray-plus.svg","material-tray-remove":"material/tray-remove.svg","material-tray":"material/tray.svg","material-treasure-chest":"material/treasure-chest.svg","material-tree-outline":"material/tree-outline.svg","material-tree":"material/tree.svg","material-trello":"material/trello.svg","material-trending-down":"material/trending-down.svg","material-trending-neutral":"material/trending-neutral.svg","material-trending-up":"material/trending-up.svg","material-triangle-outline":"material/triangle-outline.svg","material-triangle-small-down":"material/triangle-small-down.svg","material-triangle-small-up":"material/triangle-small-up.svg","material-triangle-wave":"material/triangle-wave.svg","material-triangle":"material/triangle.svg","material-triforce":"material/triforce.svg","material-trophy-award":"material/trophy-award.svg","material-trophy-broken":"material/trophy-broken.svg","material-trophy-outline":"material/trophy-outline.svg","material-trophy-variant-outline":"material/trophy-variant-outline.svg","material-trophy-variant":"material/trophy-variant.svg","material-trophy":"material/trophy.svg","material-truck-alert-outline":"material/truck-alert-outline.svg","material-truck-alert":"material/truck-alert.svg","material-truck-cargo-container":"material/truck-cargo-container.svg","material-truck-check-outline":"material/truck-check-outline.svg","material-truck-check":"material/truck-check.svg","material-truck-delivery-outline":"material/truck-delivery-outline.svg","material-truck-delivery":"material/truck-delivery.svg","material-truck-fast-outline":"material/truck-fast-outline.svg","material-truck-fast":"material/truck-fast.svg","material-truck-flatbed":"material/truck-flatbed.svg","material-truck-minus-outline":"material/truck-minus-outline.svg","material-truck-minus":"material/truck-minus.svg","material-truck-outline":"material/truck-outline.svg","material-truck-plus-outline":"material/truck-plus-outline.svg","material-truck-plus":"material/truck-plus.svg","material-truck-remove-outline":"material/truck-remove-outline.svg","material-truck-remove":"material/truck-remove.svg","material-truck-snowflake":"material/truck-snowflake.svg","material-truck-trailer":"material/truck-trailer.svg","material-truck":"material/truck.svg","material-trumpet":"material/trumpet.svg","material-tshirt-crew-outline":"material/tshirt-crew-outline.svg","material-tshirt-crew":"material/tshirt-crew.svg","material-tshirt-v-outline":"material/tshirt-v-outline.svg","material-tshirt-v":"material/tshirt-v.svg","material-tsunami":"material/tsunami.svg","material-tumble-dryer-alert":"material/tumble-dryer-alert.svg","material-tumble-dryer-off":"material/tumble-dryer-off.svg","material-tumble-dryer":"material/tumble-dryer.svg","material-tune-variant":"material/tune-variant.svg","material-tune-vertical-variant":"material/tune-vertical-variant.svg","material-tune-vertical":"material/tune-vertical.svg","material-tune":"material/tune.svg","material-tunnel-outline":"material/tunnel-outline.svg","material-tunnel":"material/tunnel.svg","material-turbine":"material/turbine.svg","material-turkey":"material/turkey.svg","material-turnstile-outline":"material/turnstile-outline.svg","material-turnstile":"material/turnstile.svg","material-turtle":"material/turtle.svg","material-twitch":"material/twitch.svg","material-twitter":"material/twitter.svg","material-two-factor-authentication":"material/two-factor-authentication.svg","material-typewriter":"material/typewriter.svg","material-ubisoft":"material/ubisoft.svg","material-ubuntu":"material/ubuntu.svg","material-ufo-outline":"material/ufo-outline.svg","material-ufo":"material/ufo.svg","material-ultra-high-definition":"material/ultra-high-definition.svg","material-umbraco":"material/umbraco.svg","material-umbrella-beach-outline":"material/umbrella-beach-outline.svg","material-umbrella-beach":"material/umbrella-beach.svg","material-umbrella-closed-outline":"material/umbrella-closed-outline.svg","material-umbrella-closed-variant":"material/umbrella-closed-variant.svg","material-umbrella-closed":"material/umbrella-closed.svg","material-umbrella-outline":"material/umbrella-outline.svg","material-umbrella":"material/umbrella.svg","material-undo-variant":"material/undo-variant.svg","material-undo":"material/undo.svg","material-unfold-less-horizontal":"material/unfold-less-horizontal.svg","material-unfold-less-vertical":"material/unfold-less-vertical.svg","material-unfold-more-horizontal":"material/unfold-more-horizontal.svg","material-unfold-more-vertical":"material/unfold-more-vertical.svg","material-ungroup":"material/ungroup.svg","material-unicode":"material/unicode.svg","material-unicorn-variant":"material/unicorn-variant.svg","material-unicorn":"material/unicorn.svg","material-unicycle":"material/unicycle.svg","material-unity":"material/unity.svg","material-unreal":"material/unreal.svg","material-update":"material/update.svg","material-upload-lock-outline":"material/upload-lock-outline.svg","material-upload-lock":"material/upload-lock.svg","material-upload-multiple":"material/upload-multiple.svg","material-upload-network-outline":"material/upload-network-outline.svg","material-upload-network":"material/upload-network.svg","material-upload-off-outline":"material/upload-off-outline.svg","material-upload-off":"material/upload-off.svg","material-upload-outline":"material/upload-outline.svg","material-upload":"material/upload.svg","material-usb-flash-drive-outline":"material/usb-flash-drive-outline.svg","material-usb-flash-drive":"material/usb-flash-drive.svg","material-usb-port":"material/usb-port.svg","material-usb":"material/usb.svg","material-vacuum-outline":"material/vacuum-outline.svg","material-vacuum":"material/vacuum.svg","material-valve-closed":"material/valve-closed.svg","material-valve-open":"material/valve-open.svg","material-valve":"material/valve.svg","material-van-passenger":"material/van-passenger.svg","material-van-utility":"material/van-utility.svg","material-vanish-quarter":"material/vanish-quarter.svg","material-vanish":"material/vanish.svg","material-vanity-light":"material/vanity-light.svg","material-variable-box":"material/variable-box.svg","material-variable":"material/variable.svg","material-vector-arrange-above":"material/vector-arrange-above.svg","material-vector-arrange-below":"material/vector-arrange-below.svg","material-vector-bezier":"material/vector-bezier.svg","material-vector-circle-variant":"material/vector-circle-variant.svg","material-vector-circle":"material/vector-circle.svg","material-vector-combine":"material/vector-combine.svg","material-vector-curve":"material/vector-curve.svg","material-vector-difference-ab":"material/vector-difference-ab.svg","material-vector-difference-ba":"material/vector-difference-ba.svg","material-vector-difference":"material/vector-difference.svg","material-vector-ellipse":"material/vector-ellipse.svg","material-vector-intersection":"material/vector-intersection.svg","material-vector-line":"material/vector-line.svg","material-vector-link":"material/vector-link.svg","material-vector-point-edit":"material/vector-point-edit.svg","material-vector-point-minus":"material/vector-point-minus.svg","material-vector-point-plus":"material/vector-point-plus.svg","material-vector-point-select":"material/vector-point-select.svg","material-vector-point":"material/vector-point.svg","material-vector-polygon-variant":"material/vector-polygon-variant.svg","material-vector-polygon":"material/vector-polygon.svg","material-vector-polyline-edit":"material/vector-polyline-edit.svg","material-vector-polyline-minus":"material/vector-polyline-minus.svg","material-vector-polyline-plus":"material/vector-polyline-plus.svg","material-vector-polyline-remove":"material/vector-polyline-remove.svg","material-vector-polyline":"material/vector-polyline.svg","material-vector-radius":"material/vector-radius.svg","material-vector-rectangle":"material/vector-rectangle.svg","material-vector-selection":"material/vector-selection.svg","material-vector-square-close":"material/vector-square-close.svg","material-vector-square-edit":"material/vector-square-edit.svg","material-vector-square-minus":"material/vector-square-minus.svg","material-vector-square-open":"material/vector-square-open.svg","material-vector-square-plus":"material/vector-square-plus.svg","material-vector-square-remove":"material/vector-square-remove.svg","material-vector-square":"material/vector-square.svg","material-vector-triangle":"material/vector-triangle.svg","material-vector-union":"material/vector-union.svg","material-vhs":"material/vhs.svg","material-vibrate-off":"material/vibrate-off.svg","material-vibrate":"material/vibrate.svg","material-video-2d":"material/video-2d.svg","material-video-3d-off":"material/video-3d-off.svg","material-video-3d-variant":"material/video-3d-variant.svg","material-video-3d":"material/video-3d.svg","material-video-4k-box":"material/video-4k-box.svg","material-video-account":"material/video-account.svg","material-video-box-off":"material/video-box-off.svg","material-video-box":"material/video-box.svg","material-video-check-outline":"material/video-check-outline.svg","material-video-check":"material/video-check.svg","material-video-high-definition":"material/video-high-definition.svg","material-video-image":"material/video-image.svg","material-video-input-antenna":"material/video-input-antenna.svg","material-video-input-component":"material/video-input-component.svg","material-video-input-hdmi":"material/video-input-hdmi.svg","material-video-input-scart":"material/video-input-scart.svg","material-video-input-svideo":"material/video-input-svideo.svg","material-video-marker-outline":"material/video-marker-outline.svg","material-video-marker":"material/video-marker.svg","material-video-minus-outline":"material/video-minus-outline.svg","material-video-minus":"material/video-minus.svg","material-video-off-outline":"material/video-off-outline.svg","material-video-off":"material/video-off.svg","material-video-outline":"material/video-outline.svg","material-video-plus-outline":"material/video-plus-outline.svg","material-video-plus":"material/video-plus.svg","material-video-stabilization":"material/video-stabilization.svg","material-video-switch-outline":"material/video-switch-outline.svg","material-video-switch":"material/video-switch.svg","material-video-vintage":"material/video-vintage.svg","material-video-wireless-outline":"material/video-wireless-outline.svg","material-video-wireless":"material/video-wireless.svg","material-video":"material/video.svg","material-view-agenda-outline":"material/view-agenda-outline.svg","material-view-agenda":"material/view-agenda.svg","material-view-array-outline":"material/view-array-outline.svg","material-view-array":"material/view-array.svg","material-view-carousel-outline":"material/view-carousel-outline.svg","material-view-carousel":"material/view-carousel.svg","material-view-column-outline":"material/view-column-outline.svg","material-view-column":"material/view-column.svg","material-view-comfy-outline":"material/view-comfy-outline.svg","material-view-comfy":"material/view-comfy.svg","material-view-compact-outline":"material/view-compact-outline.svg","material-view-compact":"material/view-compact.svg","material-view-dashboard-edit-outline":"material/view-dashboard-edit-outline.svg","material-view-dashboard-edit":"material/view-dashboard-edit.svg","material-view-dashboard-outline":"material/view-dashboard-outline.svg","material-view-dashboard-variant-outline":"material/view-dashboard-variant-outline.svg","material-view-dashboard-variant":"material/view-dashboard-variant.svg","material-view-dashboard":"material/view-dashboard.svg","material-view-day-outline":"material/view-day-outline.svg","material-view-day":"material/view-day.svg","material-view-gallery-outline":"material/view-gallery-outline.svg","material-view-gallery":"material/view-gallery.svg","material-view-grid-outline":"material/view-grid-outline.svg","material-view-grid-plus-outline":"material/view-grid-plus-outline.svg","material-view-grid-plus":"material/view-grid-plus.svg","material-view-grid":"material/view-grid.svg","material-view-headline":"material/view-headline.svg","material-view-list-outline":"material/view-list-outline.svg","material-view-list":"material/view-list.svg","material-view-module-outline":"material/view-module-outline.svg","material-view-module":"material/view-module.svg","material-view-parallel-outline":"material/view-parallel-outline.svg","material-view-parallel":"material/view-parallel.svg","material-view-quilt-outline":"material/view-quilt-outline.svg","material-view-quilt":"material/view-quilt.svg","material-view-sequential-outline":"material/view-sequential-outline.svg","material-view-sequential":"material/view-sequential.svg","material-view-split-horizontal":"material/view-split-horizontal.svg","material-view-split-vertical":"material/view-split-vertical.svg","material-view-stream-outline":"material/view-stream-outline.svg","material-view-stream":"material/view-stream.svg","material-view-week-outline":"material/view-week-outline.svg","material-view-week":"material/view-week.svg","material-vimeo":"material/vimeo.svg","material-violin":"material/violin.svg","material-virtual-reality":"material/virtual-reality.svg","material-virus-off-outline":"material/virus-off-outline.svg","material-virus-off":"material/virus-off.svg","material-virus-outline":"material/virus-outline.svg","material-virus":"material/virus.svg","material-vlc":"material/vlc.svg","material-voicemail":"material/voicemail.svg","material-volcano-outline":"material/volcano-outline.svg","material-volcano":"material/volcano.svg","material-volleyball":"material/volleyball.svg","material-volume-equal":"material/volume-equal.svg","material-volume-high":"material/volume-high.svg","material-volume-low":"material/volume-low.svg","material-volume-medium":"material/volume-medium.svg","material-volume-minus":"material/volume-minus.svg","material-volume-mute":"material/volume-mute.svg","material-volume-off":"material/volume-off.svg","material-volume-plus":"material/volume-plus.svg","material-volume-source":"material/volume-source.svg","material-volume-variant-off":"material/volume-variant-off.svg","material-volume-vibrate":"material/volume-vibrate.svg","material-vote-outline":"material/vote-outline.svg","material-vote":"material/vote.svg","material-vpn":"material/vpn.svg","material-vuejs":"material/vuejs.svg","material-vuetify":"material/vuetify.svg","material-walk":"material/walk.svg","material-wall-fire":"material/wall-fire.svg","material-wall-sconce-flat-outline":"material/wall-sconce-flat-outline.svg","material-wall-sconce-flat-variant-outline":"material/wall-sconce-flat-variant-outline.svg","material-wall-sconce-flat-variant":"material/wall-sconce-flat-variant.svg","material-wall-sconce-flat":"material/wall-sconce-flat.svg","material-wall-sconce-outline":"material/wall-sconce-outline.svg","material-wall-sconce-round-outline":"material/wall-sconce-round-outline.svg","material-wall-sconce-round-variant-outline":"material/wall-sconce-round-variant-outline.svg","material-wall-sconce-round-variant":"material/wall-sconce-round-variant.svg","material-wall-sconce-round":"material/wall-sconce-round.svg","material-wall-sconce":"material/wall-sconce.svg","material-wall":"material/wall.svg","material-wallet-giftcard":"material/wallet-giftcard.svg","material-wallet-membership":"material/wallet-membership.svg","material-wallet-outline":"material/wallet-outline.svg","material-wallet-plus-outline":"material/wallet-plus-outline.svg","material-wallet-plus":"material/wallet-plus.svg","material-wallet-travel":"material/wallet-travel.svg","material-wallet":"material/wallet.svg","material-wallpaper":"material/wallpaper.svg","material-wan":"material/wan.svg","material-wardrobe-outline":"material/wardrobe-outline.svg","material-wardrobe":"material/wardrobe.svg","material-warehouse":"material/warehouse.svg","material-washing-machine-alert":"material/washing-machine-alert.svg","material-washing-machine-off":"material/washing-machine-off.svg","material-washing-machine":"material/washing-machine.svg","material-watch-export-variant":"material/watch-export-variant.svg","material-watch-export":"material/watch-export.svg","material-watch-import-variant":"material/watch-import-variant.svg","material-watch-import":"material/watch-import.svg","material-watch-variant":"material/watch-variant.svg","material-watch-vibrate-off":"material/watch-vibrate-off.svg","material-watch-vibrate":"material/watch-vibrate.svg","material-watch":"material/watch.svg","material-water-alert-outline":"material/water-alert-outline.svg","material-water-alert":"material/water-alert.svg","material-water-boiler-alert":"material/water-boiler-alert.svg","material-water-boiler-auto":"material/water-boiler-auto.svg","material-water-boiler-off":"material/water-boiler-off.svg","material-water-boiler":"material/water-boiler.svg","material-water-check-outline":"material/water-check-outline.svg","material-water-check":"material/water-check.svg","material-water-circle":"material/water-circle.svg","material-water-minus-outline":"material/water-minus-outline.svg","material-water-minus":"material/water-minus.svg","material-water-off-outline":"material/water-off-outline.svg","material-water-off":"material/water-off.svg","material-water-opacity":"material/water-opacity.svg","material-water-outline":"material/water-outline.svg","material-water-percent-alert":"material/water-percent-alert.svg","material-water-percent":"material/water-percent.svg","material-water-plus-outline":"material/water-plus-outline.svg","material-water-plus":"material/water-plus.svg","material-water-polo":"material/water-polo.svg","material-water-pump-off":"material/water-pump-off.svg","material-water-pump":"material/water-pump.svg","material-water-remove-outline":"material/water-remove-outline.svg","material-water-remove":"material/water-remove.svg","material-water-sync":"material/water-sync.svg","material-water-thermometer-outline":"material/water-thermometer-outline.svg","material-water-thermometer":"material/water-thermometer.svg","material-water-well-outline":"material/water-well-outline.svg","material-water-well":"material/water-well.svg","material-water":"material/water.svg","material-waterfall":"material/waterfall.svg","material-watering-can-outline":"material/watering-can-outline.svg","material-watering-can":"material/watering-can.svg","material-watermark":"material/watermark.svg","material-wave":"material/wave.svg","material-waveform":"material/waveform.svg","material-waves-arrow-left":"material/waves-arrow-left.svg","material-waves-arrow-right":"material/waves-arrow-right.svg","material-waves-arrow-up":"material/waves-arrow-up.svg","material-waves":"material/waves.svg","material-waze":"material/waze.svg","material-weather-cloudy-alert":"material/weather-cloudy-alert.svg","material-weather-cloudy-arrow-right":"material/weather-cloudy-arrow-right.svg","material-weather-cloudy-clock":"material/weather-cloudy-clock.svg","material-weather-cloudy":"material/weather-cloudy.svg","material-weather-dust":"material/weather-dust.svg","material-weather-fog":"material/weather-fog.svg","material-weather-hail":"material/weather-hail.svg","material-weather-hazy":"material/weather-hazy.svg","material-weather-hurricane":"material/weather-hurricane.svg","material-weather-lightning-rainy":"material/weather-lightning-rainy.svg","material-weather-lightning":"material/weather-lightning.svg","material-weather-night-partly-cloudy":"material/weather-night-partly-cloudy.svg","material-weather-night":"material/weather-night.svg","material-weather-partly-cloudy":"material/weather-partly-cloudy.svg","material-weather-partly-lightning":"material/weather-partly-lightning.svg","material-weather-partly-rainy":"material/weather-partly-rainy.svg","material-weather-partly-snowy-rainy":"material/weather-partly-snowy-rainy.svg","material-weather-partly-snowy":"material/weather-partly-snowy.svg","material-weather-pouring":"material/weather-pouring.svg","material-weather-rainy":"material/weather-rainy.svg","material-weather-snowy-heavy":"material/weather-snowy-heavy.svg","material-weather-snowy-rainy":"material/weather-snowy-rainy.svg","material-weather-snowy":"material/weather-snowy.svg","material-weather-sunny-alert":"material/weather-sunny-alert.svg","material-weather-sunny-off":"material/weather-sunny-off.svg","material-weather-sunny":"material/weather-sunny.svg","material-weather-sunset-down":"material/weather-sunset-down.svg","material-weather-sunset-up":"material/weather-sunset-up.svg","material-weather-sunset":"material/weather-sunset.svg","material-weather-tornado":"material/weather-tornado.svg","material-weather-windy-variant":"material/weather-windy-variant.svg","material-weather-windy":"material/weather-windy.svg","material-web-box":"material/web-box.svg","material-web-cancel":"material/web-cancel.svg","material-web-check":"material/web-check.svg","material-web-clock":"material/web-clock.svg","material-web-minus":"material/web-minus.svg","material-web-off":"material/web-off.svg","material-web-plus":"material/web-plus.svg","material-web-refresh":"material/web-refresh.svg","material-web-remove":"material/web-remove.svg","material-web-sync":"material/web-sync.svg","material-web":"material/web.svg","material-webcam-off":"material/webcam-off.svg","material-webcam":"material/webcam.svg","material-webhook":"material/webhook.svg","material-webpack":"material/webpack.svg","material-webrtc":"material/webrtc.svg","material-wechat":"material/wechat.svg","material-weight-gram":"material/weight-gram.svg","material-weight-kilogram":"material/weight-kilogram.svg","material-weight-lifter":"material/weight-lifter.svg","material-weight-pound":"material/weight-pound.svg","material-weight":"material/weight.svg","material-whatsapp":"material/whatsapp.svg","material-wheel-barrow":"material/wheel-barrow.svg","material-wheelchair-accessibility":"material/wheelchair-accessibility.svg","material-wheelchair":"material/wheelchair.svg","material-whistle-outline":"material/whistle-outline.svg","material-whistle":"material/whistle.svg","material-white-balance-auto":"material/white-balance-auto.svg","material-white-balance-incandescent":"material/white-balance-incandescent.svg","material-white-balance-iridescent":"material/white-balance-iridescent.svg","material-white-balance-sunny":"material/white-balance-sunny.svg","material-widgets-outline":"material/widgets-outline.svg","material-widgets":"material/widgets.svg","material-wifi-alert":"material/wifi-alert.svg","material-wifi-arrow-down":"material/wifi-arrow-down.svg","material-wifi-arrow-left-right":"material/wifi-arrow-left-right.svg","material-wifi-arrow-left":"material/wifi-arrow-left.svg","material-wifi-arrow-right":"material/wifi-arrow-right.svg","material-wifi-arrow-up-down":"material/wifi-arrow-up-down.svg","material-wifi-arrow-up":"material/wifi-arrow-up.svg","material-wifi-cancel":"material/wifi-cancel.svg","material-wifi-check":"material/wifi-check.svg","material-wifi-cog":"material/wifi-cog.svg","material-wifi-lock-open":"material/wifi-lock-open.svg","material-wifi-lock":"material/wifi-lock.svg","material-wifi-marker":"material/wifi-marker.svg","material-wifi-minus":"material/wifi-minus.svg","material-wifi-off":"material/wifi-off.svg","material-wifi-plus":"material/wifi-plus.svg","material-wifi-refresh":"material/wifi-refresh.svg","material-wifi-remove":"material/wifi-remove.svg","material-wifi-settings":"material/wifi-settings.svg","material-wifi-star":"material/wifi-star.svg","material-wifi-strength-1-alert":"material/wifi-strength-1-alert.svg","material-wifi-strength-1-lock-open":"material/wifi-strength-1-lock-open.svg","material-wifi-strength-1-lock":"material/wifi-strength-1-lock.svg","material-wifi-strength-1":"material/wifi-strength-1.svg","material-wifi-strength-2-alert":"material/wifi-strength-2-alert.svg","material-wifi-strength-2-lock-open":"material/wifi-strength-2-lock-open.svg","material-wifi-strength-2-lock":"material/wifi-strength-2-lock.svg","material-wifi-strength-2":"material/wifi-strength-2.svg","material-wifi-strength-3-alert":"material/wifi-strength-3-alert.svg","material-wifi-strength-3-lock-open":"material/wifi-strength-3-lock-open.svg","material-wifi-strength-3-lock":"material/wifi-strength-3-lock.svg","material-wifi-strength-3":"material/wifi-strength-3.svg","material-wifi-strength-4-alert":"material/wifi-strength-4-alert.svg","material-wifi-strength-4-lock-open":"material/wifi-strength-4-lock-open.svg","material-wifi-strength-4-lock":"material/wifi-strength-4-lock.svg","material-wifi-strength-4":"material/wifi-strength-4.svg","material-wifi-strength-alert-outline":"material/wifi-strength-alert-outline.svg","material-wifi-strength-lock-open-outline":"material/wifi-strength-lock-open-outline.svg","material-wifi-strength-lock-outline":"material/wifi-strength-lock-outline.svg","material-wifi-strength-off-outline":"material/wifi-strength-off-outline.svg","material-wifi-strength-off":"material/wifi-strength-off.svg","material-wifi-strength-outline":"material/wifi-strength-outline.svg","material-wifi-sync":"material/wifi-sync.svg","material-wifi":"material/wifi.svg","material-wikipedia":"material/wikipedia.svg","material-wind-power-outline":"material/wind-power-outline.svg","material-wind-power":"material/wind-power.svg","material-wind-turbine-alert":"material/wind-turbine-alert.svg","material-wind-turbine-check":"material/wind-turbine-check.svg","material-wind-turbine":"material/wind-turbine.svg","material-window-close":"material/window-close.svg","material-window-closed-variant":"material/window-closed-variant.svg","material-window-closed":"material/window-closed.svg","material-window-maximize":"material/window-maximize.svg","material-window-minimize":"material/window-minimize.svg","material-window-open-variant":"material/window-open-variant.svg","material-window-open":"material/window-open.svg","material-window-restore":"material/window-restore.svg","material-window-shutter-alert":"material/window-shutter-alert.svg","material-window-shutter-auto":"material/window-shutter-auto.svg","material-window-shutter-cog":"material/window-shutter-cog.svg","material-window-shutter-open":"material/window-shutter-open.svg","material-window-shutter-settings":"material/window-shutter-settings.svg","material-window-shutter":"material/window-shutter.svg","material-windsock":"material/windsock.svg","material-wiper-wash-alert":"material/wiper-wash-alert.svg","material-wiper-wash":"material/wiper-wash.svg","material-wiper":"material/wiper.svg","material-wizard-hat":"material/wizard-hat.svg","material-wordpress":"material/wordpress.svg","material-wrap-disabled":"material/wrap-disabled.svg","material-wrap":"material/wrap.svg","material-wrench-check-outline":"material/wrench-check-outline.svg","material-wrench-check":"material/wrench-check.svg","material-wrench-clock-outline":"material/wrench-clock-outline.svg","material-wrench-clock":"material/wrench-clock.svg","material-wrench-cog-outline":"material/wrench-cog-outline.svg","material-wrench-cog":"material/wrench-cog.svg","material-wrench-outline":"material/wrench-outline.svg","material-wrench":"material/wrench.svg","material-xamarin":"material/xamarin.svg","material-xml":"material/xml.svg","material-xmpp":"material/xmpp.svg","material-yahoo":"material/yahoo.svg","material-yeast":"material/yeast.svg","material-yin-yang":"material/yin-yang.svg","material-yoga":"material/yoga.svg","material-youtube-gaming":"material/youtube-gaming.svg","material-youtube-studio":"material/youtube-studio.svg","material-youtube-subscription":"material/youtube-subscription.svg","material-youtube-tv":"material/youtube-tv.svg","material-youtube":"material/youtube.svg","material-yurt":"material/yurt.svg","material-z-wave":"material/z-wave.svg","material-zend":"material/zend.svg","material-zigbee":"material/zigbee.svg","material-zip-box-outline":"material/zip-box-outline.svg","material-zip-box":"material/zip-box.svg","material-zip-disk":"material/zip-disk.svg","material-zodiac-aquarius":"material/zodiac-aquarius.svg","material-zodiac-aries":"material/zodiac-aries.svg","material-zodiac-cancer":"material/zodiac-cancer.svg","material-zodiac-capricorn":"material/zodiac-capricorn.svg","material-zodiac-gemini":"material/zodiac-gemini.svg","material-zodiac-leo":"material/zodiac-leo.svg","material-zodiac-libra":"material/zodiac-libra.svg","material-zodiac-pisces":"material/zodiac-pisces.svg","material-zodiac-sagittarius":"material/zodiac-sagittarius.svg","material-zodiac-scorpio":"material/zodiac-scorpio.svg","material-zodiac-taurus":"material/zodiac-taurus.svg","material-zodiac-virgo":"material/zodiac-virgo.svg","octicons-accessibility-16":"octicons/accessibility-16.svg","octicons-alert-16":"octicons/alert-16.svg","octicons-alert-24":"octicons/alert-24.svg","octicons-alert-fill-12":"octicons/alert-fill-12.svg","octicons-apps-16":"octicons/apps-16.svg","octicons-archive-16":"octicons/archive-16.svg","octicons-archive-24":"octicons/archive-24.svg","octicons-arrow-both-16":"octicons/arrow-both-16.svg","octicons-arrow-both-24":"octicons/arrow-both-24.svg","octicons-arrow-down-16":"octicons/arrow-down-16.svg","octicons-arrow-down-24":"octicons/arrow-down-24.svg","octicons-arrow-down-left-24":"octicons/arrow-down-left-24.svg","octicons-arrow-down-right-24":"octicons/arrow-down-right-24.svg","octicons-arrow-left-16":"octicons/arrow-left-16.svg","octicons-arrow-left-24":"octicons/arrow-left-24.svg","octicons-arrow-right-16":"octicons/arrow-right-16.svg","octicons-arrow-right-24":"octicons/arrow-right-24.svg","octicons-arrow-switch-16":"octicons/arrow-switch-16.svg","octicons-arrow-switch-24":"octicons/arrow-switch-24.svg","octicons-arrow-up-16":"octicons/arrow-up-16.svg","octicons-arrow-up-24":"octicons/arrow-up-24.svg","octicons-arrow-up-left-24":"octicons/arrow-up-left-24.svg","octicons-arrow-up-right-24":"octicons/arrow-up-right-24.svg","octicons-beaker-16":"octicons/beaker-16.svg","octicons-beaker-24":"octicons/beaker-24.svg","octicons-bell-16":"octicons/bell-16.svg","octicons-bell-24":"octicons/bell-24.svg","octicons-bell-fill-16":"octicons/bell-fill-16.svg","octicons-bell-fill-24":"octicons/bell-fill-24.svg","octicons-bell-slash-16":"octicons/bell-slash-16.svg","octicons-bell-slash-24":"octicons/bell-slash-24.svg","octicons-blocked-16":"octicons/blocked-16.svg","octicons-blocked-24":"octicons/blocked-24.svg","octicons-bold-16":"octicons/bold-16.svg","octicons-bold-24":"octicons/bold-24.svg","octicons-book-16":"octicons/book-16.svg","octicons-book-24":"octicons/book-24.svg","octicons-bookmark-16":"octicons/bookmark-16.svg","octicons-bookmark-24":"octicons/bookmark-24.svg","octicons-bookmark-fill-24":"octicons/bookmark-fill-24.svg","octicons-bookmark-slash-16":"octicons/bookmark-slash-16.svg","octicons-bookmark-slash-24":"octicons/bookmark-slash-24.svg","octicons-bookmark-slash-fill-24":"octicons/bookmark-slash-fill-24.svg","octicons-briefcase-16":"octicons/briefcase-16.svg","octicons-briefcase-24":"octicons/briefcase-24.svg","octicons-broadcast-16":"octicons/broadcast-16.svg","octicons-broadcast-24":"octicons/broadcast-24.svg","octicons-browser-16":"octicons/browser-16.svg","octicons-browser-24":"octicons/browser-24.svg","octicons-bug-16":"octicons/bug-16.svg","octicons-bug-24":"octicons/bug-24.svg","octicons-cache-16":"octicons/cache-16.svg","octicons-calendar-16":"octicons/calendar-16.svg","octicons-calendar-24":"octicons/calendar-24.svg","octicons-check-16":"octicons/check-16.svg","octicons-check-24":"octicons/check-24.svg","octicons-check-circle-16":"octicons/check-circle-16.svg","octicons-check-circle-24":"octicons/check-circle-24.svg","octicons-check-circle-fill-12":"octicons/check-circle-fill-12.svg","octicons-check-circle-fill-16":"octicons/check-circle-fill-16.svg","octicons-check-circle-fill-24":"octicons/check-circle-fill-24.svg","octicons-checkbox-16":"octicons/checkbox-16.svg","octicons-checkbox-24":"octicons/checkbox-24.svg","octicons-checklist-16":"octicons/checklist-16.svg","octicons-checklist-24":"octicons/checklist-24.svg","octicons-chevron-down-16":"octicons/chevron-down-16.svg","octicons-chevron-down-24":"octicons/chevron-down-24.svg","octicons-chevron-left-16":"octicons/chevron-left-16.svg","octicons-chevron-left-24":"octicons/chevron-left-24.svg","octicons-chevron-right-16":"octicons/chevron-right-16.svg","octicons-chevron-right-24":"octicons/chevron-right-24.svg","octicons-chevron-up-16":"octicons/chevron-up-16.svg","octicons-chevron-up-24":"octicons/chevron-up-24.svg","octicons-circle-16":"octicons/circle-16.svg","octicons-circle-24":"octicons/circle-24.svg","octicons-circle-slash-16":"octicons/circle-slash-16.svg","octicons-circle-slash-24":"octicons/circle-slash-24.svg","octicons-clock-16":"octicons/clock-16.svg","octicons-clock-24":"octicons/clock-24.svg","octicons-cloud-16":"octicons/cloud-16.svg","octicons-cloud-24":"octicons/cloud-24.svg","octicons-cloud-offline-16":"octicons/cloud-offline-16.svg","octicons-cloud-offline-24":"octicons/cloud-offline-24.svg","octicons-code-16":"octicons/code-16.svg","octicons-code-24":"octicons/code-24.svg","octicons-code-of-conduct-16":"octicons/code-of-conduct-16.svg","octicons-code-of-conduct-24":"octicons/code-of-conduct-24.svg","octicons-code-review-16":"octicons/code-review-16.svg","octicons-code-review-24":"octicons/code-review-24.svg","octicons-code-square-16":"octicons/code-square-16.svg","octicons-code-square-24":"octicons/code-square-24.svg","octicons-codescan-16":"octicons/codescan-16.svg","octicons-codescan-24":"octicons/codescan-24.svg","octicons-codescan-checkmark-16":"octicons/codescan-checkmark-16.svg","octicons-codescan-checkmark-24":"octicons/codescan-checkmark-24.svg","octicons-codespaces-16":"octicons/codespaces-16.svg","octicons-codespaces-24":"octicons/codespaces-24.svg","octicons-columns-16":"octicons/columns-16.svg","octicons-columns-24":"octicons/columns-24.svg","octicons-command-palette-16":"octicons/command-palette-16.svg","octicons-command-palette-24":"octicons/command-palette-24.svg","octicons-comment-16":"octicons/comment-16.svg","octicons-comment-24":"octicons/comment-24.svg","octicons-comment-discussion-16":"octicons/comment-discussion-16.svg","octicons-comment-discussion-24":"octicons/comment-discussion-24.svg","octicons-commit-24":"octicons/commit-24.svg","octicons-container-16":"octicons/container-16.svg","octicons-container-24":"octicons/container-24.svg","octicons-copilot-16":"octicons/copilot-16.svg","octicons-copilot-24":"octicons/copilot-24.svg","octicons-copilot-48":"octicons/copilot-48.svg","octicons-copilot-96":"octicons/copilot-96.svg","octicons-copilot-error-16":"octicons/copilot-error-16.svg","octicons-copilot-warning-16":"octicons/copilot-warning-16.svg","octicons-copy-16":"octicons/copy-16.svg","octicons-copy-24":"octicons/copy-24.svg","octicons-cpu-16":"octicons/cpu-16.svg","octicons-cpu-24":"octicons/cpu-24.svg","octicons-credit-card-16":"octicons/credit-card-16.svg","octicons-credit-card-24":"octicons/credit-card-24.svg","octicons-cross-reference-16":"octicons/cross-reference-16.svg","octicons-cross-reference-24":"octicons/cross-reference-24.svg","octicons-dash-16":"octicons/dash-16.svg","octicons-dash-24":"octicons/dash-24.svg","octicons-database-16":"octicons/database-16.svg","octicons-database-24":"octicons/database-24.svg","octicons-dependabot-16":"octicons/dependabot-16.svg","octicons-dependabot-24":"octicons/dependabot-24.svg","octicons-desktop-download-16":"octicons/desktop-download-16.svg","octicons-desktop-download-24":"octicons/desktop-download-24.svg","octicons-device-camera-16":"octicons/device-camera-16.svg","octicons-device-camera-video-16":"octicons/device-camera-video-16.svg","octicons-device-camera-video-24":"octicons/device-camera-video-24.svg","octicons-device-desktop-16":"octicons/device-desktop-16.svg","octicons-device-desktop-24":"octicons/device-desktop-24.svg","octicons-device-mobile-16":"octicons/device-mobile-16.svg","octicons-device-mobile-24":"octicons/device-mobile-24.svg","octicons-diamond-16":"octicons/diamond-16.svg","octicons-diamond-24":"octicons/diamond-24.svg","octicons-diff-16":"octicons/diff-16.svg","octicons-diff-24":"octicons/diff-24.svg","octicons-diff-added-16":"octicons/diff-added-16.svg","octicons-diff-ignored-16":"octicons/diff-ignored-16.svg","octicons-diff-modified-16":"octicons/diff-modified-16.svg","octicons-diff-removed-16":"octicons/diff-removed-16.svg","octicons-diff-renamed-16":"octicons/diff-renamed-16.svg","octicons-dot-16":"octicons/dot-16.svg","octicons-dot-24":"octicons/dot-24.svg","octicons-dot-fill-16":"octicons/dot-fill-16.svg","octicons-dot-fill-24":"octicons/dot-fill-24.svg","octicons-download-16":"octicons/download-16.svg","octicons-download-24":"octicons/download-24.svg","octicons-duplicate-16":"octicons/duplicate-16.svg","octicons-duplicate-24":"octicons/duplicate-24.svg","octicons-ellipsis-16":"octicons/ellipsis-16.svg","octicons-eye-16":"octicons/eye-16.svg","octicons-eye-24":"octicons/eye-24.svg","octicons-eye-closed-16":"octicons/eye-closed-16.svg","octicons-eye-closed-24":"octicons/eye-closed-24.svg","octicons-feed-discussion-16":"octicons/feed-discussion-16.svg","octicons-feed-forked-16":"octicons/feed-forked-16.svg","octicons-feed-heart-16":"octicons/feed-heart-16.svg","octicons-feed-merged-16":"octicons/feed-merged-16.svg","octicons-feed-person-16":"octicons/feed-person-16.svg","octicons-feed-repo-16":"octicons/feed-repo-16.svg","octicons-feed-rocket-16":"octicons/feed-rocket-16.svg","octicons-feed-star-16":"octicons/feed-star-16.svg","octicons-feed-tag-16":"octicons/feed-tag-16.svg","octicons-feed-trophy-16":"octicons/feed-trophy-16.svg","octicons-file-16":"octicons/file-16.svg","octicons-file-24":"octicons/file-24.svg","octicons-file-added-16":"octicons/file-added-16.svg","octicons-file-badge-16":"octicons/file-badge-16.svg","octicons-file-binary-16":"octicons/file-binary-16.svg","octicons-file-binary-24":"octicons/file-binary-24.svg","octicons-file-code-16":"octicons/file-code-16.svg","octicons-file-code-24":"octicons/file-code-24.svg","octicons-file-diff-16":"octicons/file-diff-16.svg","octicons-file-diff-24":"octicons/file-diff-24.svg","octicons-file-directory-16":"octicons/file-directory-16.svg","octicons-file-directory-24":"octicons/file-directory-24.svg","octicons-file-directory-fill-16":"octicons/file-directory-fill-16.svg","octicons-file-directory-fill-24":"octicons/file-directory-fill-24.svg","octicons-file-directory-open-fill-16":"octicons/file-directory-open-fill-16.svg","octicons-file-media-24":"octicons/file-media-24.svg","octicons-file-moved-16":"octicons/file-moved-16.svg","octicons-file-removed-16":"octicons/file-removed-16.svg","octicons-file-submodule-16":"octicons/file-submodule-16.svg","octicons-file-submodule-24":"octicons/file-submodule-24.svg","octicons-file-symlink-file-16":"octicons/file-symlink-file-16.svg","octicons-file-symlink-file-24":"octicons/file-symlink-file-24.svg","octicons-file-zip-16":"octicons/file-zip-16.svg","octicons-file-zip-24":"octicons/file-zip-24.svg","octicons-filter-16":"octicons/filter-16.svg","octicons-filter-24":"octicons/filter-24.svg","octicons-flame-16":"octicons/flame-16.svg","octicons-flame-24":"octicons/flame-24.svg","octicons-fold-16":"octicons/fold-16.svg","octicons-fold-24":"octicons/fold-24.svg","octicons-fold-down-16":"octicons/fold-down-16.svg","octicons-fold-down-24":"octicons/fold-down-24.svg","octicons-fold-up-16":"octicons/fold-up-16.svg","octicons-fold-up-24":"octicons/fold-up-24.svg","octicons-gear-16":"octicons/gear-16.svg","octicons-gear-24":"octicons/gear-24.svg","octicons-gift-16":"octicons/gift-16.svg","octicons-gift-24":"octicons/gift-24.svg","octicons-git-branch-16":"octicons/git-branch-16.svg","octicons-git-branch-24":"octicons/git-branch-24.svg","octicons-git-commit-16":"octicons/git-commit-16.svg","octicons-git-commit-24":"octicons/git-commit-24.svg","octicons-git-compare-16":"octicons/git-compare-16.svg","octicons-git-compare-24":"octicons/git-compare-24.svg","octicons-git-merge-16":"octicons/git-merge-16.svg","octicons-git-merge-24":"octicons/git-merge-24.svg","octicons-git-merge-queue-16":"octicons/git-merge-queue-16.svg","octicons-git-pull-request-16":"octicons/git-pull-request-16.svg","octicons-git-pull-request-24":"octicons/git-pull-request-24.svg","octicons-git-pull-request-closed-16":"octicons/git-pull-request-closed-16.svg","octicons-git-pull-request-closed-24":"octicons/git-pull-request-closed-24.svg","octicons-git-pull-request-draft-16":"octicons/git-pull-request-draft-16.svg","octicons-git-pull-request-draft-24":"octicons/git-pull-request-draft-24.svg","octicons-globe-16":"octicons/globe-16.svg","octicons-globe-24":"octicons/globe-24.svg","octicons-grabber-16":"octicons/grabber-16.svg","octicons-grabber-24":"octicons/grabber-24.svg","octicons-graph-16":"octicons/graph-16.svg","octicons-graph-24":"octicons/graph-24.svg","octicons-hash-16":"octicons/hash-16.svg","octicons-hash-24":"octicons/hash-24.svg","octicons-heading-16":"octicons/heading-16.svg","octicons-heading-24":"octicons/heading-24.svg","octicons-heart-16":"octicons/heart-16.svg","octicons-heart-24":"octicons/heart-24.svg","octicons-heart-fill-16":"octicons/heart-fill-16.svg","octicons-heart-fill-24":"octicons/heart-fill-24.svg","octicons-history-16":"octicons/history-16.svg","octicons-history-24":"octicons/history-24.svg","octicons-home-16":"octicons/home-16.svg","octicons-home-24":"octicons/home-24.svg","octicons-home-fill-24":"octicons/home-fill-24.svg","octicons-horizontal-rule-16":"octicons/horizontal-rule-16.svg","octicons-horizontal-rule-24":"octicons/horizontal-rule-24.svg","octicons-hourglass-16":"octicons/hourglass-16.svg","octicons-hourglass-24":"octicons/hourglass-24.svg","octicons-hubot-16":"octicons/hubot-16.svg","octicons-hubot-24":"octicons/hubot-24.svg","octicons-id-badge-16":"octicons/id-badge-16.svg","octicons-image-16":"octicons/image-16.svg","octicons-image-24":"octicons/image-24.svg","octicons-inbox-16":"octicons/inbox-16.svg","octicons-inbox-24":"octicons/inbox-24.svg","octicons-infinity-16":"octicons/infinity-16.svg","octicons-infinity-24":"octicons/infinity-24.svg","octicons-info-16":"octicons/info-16.svg","octicons-info-24":"octicons/info-24.svg","octicons-issue-closed-16":"octicons/issue-closed-16.svg","octicons-issue-closed-24":"octicons/issue-closed-24.svg","octicons-issue-draft-16":"octicons/issue-draft-16.svg","octicons-issue-draft-24":"octicons/issue-draft-24.svg","octicons-issue-opened-16":"octicons/issue-opened-16.svg","octicons-issue-opened-24":"octicons/issue-opened-24.svg","octicons-issue-reopened-16":"octicons/issue-reopened-16.svg","octicons-issue-reopened-24":"octicons/issue-reopened-24.svg","octicons-italic-16":"octicons/italic-16.svg","octicons-italic-24":"octicons/italic-24.svg","octicons-iterations-16":"octicons/iterations-16.svg","octicons-iterations-24":"octicons/iterations-24.svg","octicons-kebab-horizontal-16":"octicons/kebab-horizontal-16.svg","octicons-kebab-horizontal-24":"octicons/kebab-horizontal-24.svg","octicons-key-16":"octicons/key-16.svg","octicons-key-24":"octicons/key-24.svg","octicons-key-asterisk-16":"octicons/key-asterisk-16.svg","octicons-law-16":"octicons/law-16.svg","octicons-law-24":"octicons/law-24.svg","octicons-light-bulb-16":"octicons/light-bulb-16.svg","octicons-light-bulb-24":"octicons/light-bulb-24.svg","octicons-link-16":"octicons/link-16.svg","octicons-link-24":"octicons/link-24.svg","octicons-link-external-16":"octicons/link-external-16.svg","octicons-link-external-24":"octicons/link-external-24.svg","octicons-list-ordered-16":"octicons/list-ordered-16.svg","octicons-list-ordered-24":"octicons/list-ordered-24.svg","octicons-list-unordered-16":"octicons/list-unordered-16.svg","octicons-list-unordered-24":"octicons/list-unordered-24.svg","octicons-location-16":"octicons/location-16.svg","octicons-location-24":"octicons/location-24.svg","octicons-lock-16":"octicons/lock-16.svg","octicons-lock-24":"octicons/lock-24.svg","octicons-log-16":"octicons/log-16.svg","octicons-logo-gist-16":"octicons/logo-gist-16.svg","octicons-logo-github-16":"octicons/logo-github-16.svg","octicons-mail-16":"octicons/mail-16.svg","octicons-mail-24":"octicons/mail-24.svg","octicons-mark-github-16":"octicons/mark-github-16.svg","octicons-markdown-16":"octicons/markdown-16.svg","octicons-megaphone-16":"octicons/megaphone-16.svg","octicons-megaphone-24":"octicons/megaphone-24.svg","octicons-mention-16":"octicons/mention-16.svg","octicons-mention-24":"octicons/mention-24.svg","octicons-meter-16":"octicons/meter-16.svg","octicons-milestone-16":"octicons/milestone-16.svg","octicons-milestone-24":"octicons/milestone-24.svg","octicons-mirror-16":"octicons/mirror-16.svg","octicons-mirror-24":"octicons/mirror-24.svg","octicons-moon-16":"octicons/moon-16.svg","octicons-moon-24":"octicons/moon-24.svg","octicons-mortar-board-16":"octicons/mortar-board-16.svg","octicons-mortar-board-24":"octicons/mortar-board-24.svg","octicons-multi-select-16":"octicons/multi-select-16.svg","octicons-multi-select-24":"octicons/multi-select-24.svg","octicons-mute-16":"octicons/mute-16.svg","octicons-mute-24":"octicons/mute-24.svg","octicons-no-entry-16":"octicons/no-entry-16.svg","octicons-no-entry-24":"octicons/no-entry-24.svg","octicons-no-entry-fill-12":"octicons/no-entry-fill-12.svg","octicons-north-star-16":"octicons/north-star-16.svg","octicons-north-star-24":"octicons/north-star-24.svg","octicons-note-16":"octicons/note-16.svg","octicons-note-24":"octicons/note-24.svg","octicons-number-16":"octicons/number-16.svg","octicons-number-24":"octicons/number-24.svg","octicons-organization-16":"octicons/organization-16.svg","octicons-organization-24":"octicons/organization-24.svg","octicons-package-16":"octicons/package-16.svg","octicons-package-24":"octicons/package-24.svg","octicons-package-dependencies-16":"octicons/package-dependencies-16.svg","octicons-package-dependencies-24":"octicons/package-dependencies-24.svg","octicons-package-dependents-16":"octicons/package-dependents-16.svg","octicons-package-dependents-24":"octicons/package-dependents-24.svg","octicons-paintbrush-16":"octicons/paintbrush-16.svg","octicons-paper-airplane-16":"octicons/paper-airplane-16.svg","octicons-paper-airplane-24":"octicons/paper-airplane-24.svg","octicons-paperclip-16":"octicons/paperclip-16.svg","octicons-paperclip-24":"octicons/paperclip-24.svg","octicons-paste-16":"octicons/paste-16.svg","octicons-paste-24":"octicons/paste-24.svg","octicons-pencil-16":"octicons/pencil-16.svg","octicons-pencil-24":"octicons/pencil-24.svg","octicons-people-16":"octicons/people-16.svg","octicons-people-24":"octicons/people-24.svg","octicons-person-16":"octicons/person-16.svg","octicons-person-24":"octicons/person-24.svg","octicons-person-add-16":"octicons/person-add-16.svg","octicons-person-add-24":"octicons/person-add-24.svg","octicons-person-fill-16":"octicons/person-fill-16.svg","octicons-person-fill-24":"octicons/person-fill-24.svg","octicons-pin-16":"octicons/pin-16.svg","octicons-pin-24":"octicons/pin-24.svg","octicons-play-16":"octicons/play-16.svg","octicons-play-24":"octicons/play-24.svg","octicons-plug-16":"octicons/plug-16.svg","octicons-plug-24":"octicons/plug-24.svg","octicons-plus-16":"octicons/plus-16.svg","octicons-plus-24":"octicons/plus-24.svg","octicons-plus-circle-16":"octicons/plus-circle-16.svg","octicons-plus-circle-24":"octicons/plus-circle-24.svg","octicons-project-16":"octicons/project-16.svg","octicons-project-24":"octicons/project-24.svg","octicons-pulse-16":"octicons/pulse-16.svg","octicons-pulse-24":"octicons/pulse-24.svg","octicons-question-16":"octicons/question-16.svg","octicons-question-24":"octicons/question-24.svg","octicons-quote-16":"octicons/quote-16.svg","octicons-quote-24":"octicons/quote-24.svg","octicons-reply-16":"octicons/reply-16.svg","octicons-reply-24":"octicons/reply-24.svg","octicons-repo-16":"octicons/repo-16.svg","octicons-repo-24":"octicons/repo-24.svg","octicons-repo-clone-16":"octicons/repo-clone-16.svg","octicons-repo-deleted-16":"octicons/repo-deleted-16.svg","octicons-repo-forked-16":"octicons/repo-forked-16.svg","octicons-repo-forked-24":"octicons/repo-forked-24.svg","octicons-repo-locked-16":"octicons/repo-locked-16.svg","octicons-repo-locked-24":"octicons/repo-locked-24.svg","octicons-repo-pull-16":"octicons/repo-pull-16.svg","octicons-repo-push-16":"octicons/repo-push-16.svg","octicons-repo-push-24":"octicons/repo-push-24.svg","octicons-repo-template-16":"octicons/repo-template-16.svg","octicons-repo-template-24":"octicons/repo-template-24.svg","octicons-report-16":"octicons/report-16.svg","octicons-report-24":"octicons/report-24.svg","octicons-rocket-16":"octicons/rocket-16.svg","octicons-rocket-24":"octicons/rocket-24.svg","octicons-rows-16":"octicons/rows-16.svg","octicons-rows-24":"octicons/rows-24.svg","octicons-rss-16":"octicons/rss-16.svg","octicons-rss-24":"octicons/rss-24.svg","octicons-ruby-16":"octicons/ruby-16.svg","octicons-ruby-24":"octicons/ruby-24.svg","octicons-screen-full-16":"octicons/screen-full-16.svg","octicons-screen-full-24":"octicons/screen-full-24.svg","octicons-screen-normal-16":"octicons/screen-normal-16.svg","octicons-screen-normal-24":"octicons/screen-normal-24.svg","octicons-search-16":"octicons/search-16.svg","octicons-search-24":"octicons/search-24.svg","octicons-server-16":"octicons/server-16.svg","octicons-server-24":"octicons/server-24.svg","octicons-share-16":"octicons/share-16.svg","octicons-share-24":"octicons/share-24.svg","octicons-share-android-16":"octicons/share-android-16.svg","octicons-share-android-24":"octicons/share-android-24.svg","octicons-shield-16":"octicons/shield-16.svg","octicons-shield-24":"octicons/shield-24.svg","octicons-shield-check-16":"octicons/shield-check-16.svg","octicons-shield-check-24":"octicons/shield-check-24.svg","octicons-shield-lock-16":"octicons/shield-lock-16.svg","octicons-shield-lock-24":"octicons/shield-lock-24.svg","octicons-shield-x-16":"octicons/shield-x-16.svg","octicons-shield-x-24":"octicons/shield-x-24.svg","octicons-sidebar-collapse-16":"octicons/sidebar-collapse-16.svg","octicons-sidebar-collapse-24":"octicons/sidebar-collapse-24.svg","octicons-sidebar-expand-16":"octicons/sidebar-expand-16.svg","octicons-sidebar-expand-24":"octicons/sidebar-expand-24.svg","octicons-sign-in-16":"octicons/sign-in-16.svg","octicons-sign-in-24":"octicons/sign-in-24.svg","octicons-sign-out-16":"octicons/sign-out-16.svg","octicons-sign-out-24":"octicons/sign-out-24.svg","octicons-single-select-16":"octicons/single-select-16.svg","octicons-single-select-24":"octicons/single-select-24.svg","octicons-skip-16":"octicons/skip-16.svg","octicons-skip-24":"octicons/skip-24.svg","octicons-sliders-16":"octicons/sliders-16.svg","octicons-smiley-16":"octicons/smiley-16.svg","octicons-smiley-24":"octicons/smiley-24.svg","octicons-sort-asc-16":"octicons/sort-asc-16.svg","octicons-sort-asc-24":"octicons/sort-asc-24.svg","octicons-sort-desc-16":"octicons/sort-desc-16.svg","octicons-sort-desc-24":"octicons/sort-desc-24.svg","octicons-square-16":"octicons/square-16.svg","octicons-square-24":"octicons/square-24.svg","octicons-square-fill-16":"octicons/square-fill-16.svg","octicons-square-fill-24":"octicons/square-fill-24.svg","octicons-squirrel-16":"octicons/squirrel-16.svg","octicons-squirrel-24":"octicons/squirrel-24.svg","octicons-stack-16":"octicons/stack-16.svg","octicons-stack-24":"octicons/stack-24.svg","octicons-star-16":"octicons/star-16.svg","octicons-star-24":"octicons/star-24.svg","octicons-star-fill-16":"octicons/star-fill-16.svg","octicons-star-fill-24":"octicons/star-fill-24.svg","octicons-stop-16":"octicons/stop-16.svg","octicons-stop-24":"octicons/stop-24.svg","octicons-stopwatch-16":"octicons/stopwatch-16.svg","octicons-stopwatch-24":"octicons/stopwatch-24.svg","octicons-strikethrough-16":"octicons/strikethrough-16.svg","octicons-strikethrough-24":"octicons/strikethrough-24.svg","octicons-sun-16":"octicons/sun-16.svg","octicons-sun-24":"octicons/sun-24.svg","octicons-sync-16":"octicons/sync-16.svg","octicons-sync-24":"octicons/sync-24.svg","octicons-tab-24":"octicons/tab-24.svg","octicons-tab-external-16":"octicons/tab-external-16.svg","octicons-table-16":"octicons/table-16.svg","octicons-table-24":"octicons/table-24.svg","octicons-tag-16":"octicons/tag-16.svg","octicons-tag-24":"octicons/tag-24.svg","octicons-tasklist-16":"octicons/tasklist-16.svg","octicons-tasklist-24":"octicons/tasklist-24.svg","octicons-telescope-16":"octicons/telescope-16.svg","octicons-telescope-24":"octicons/telescope-24.svg","octicons-telescope-fill-16":"octicons/telescope-fill-16.svg","octicons-telescope-fill-24":"octicons/telescope-fill-24.svg","octicons-terminal-16":"octicons/terminal-16.svg","octicons-terminal-24":"octicons/terminal-24.svg","octicons-three-bars-16":"octicons/three-bars-16.svg","octicons-thumbsdown-16":"octicons/thumbsdown-16.svg","octicons-thumbsdown-24":"octicons/thumbsdown-24.svg","octicons-thumbsup-16":"octicons/thumbsup-16.svg","octicons-thumbsup-24":"octicons/thumbsup-24.svg","octicons-tools-16":"octicons/tools-16.svg","octicons-tools-24":"octicons/tools-24.svg","octicons-trash-16":"octicons/trash-16.svg","octicons-trash-24":"octicons/trash-24.svg","octicons-triangle-down-16":"octicons/triangle-down-16.svg","octicons-triangle-down-24":"octicons/triangle-down-24.svg","octicons-triangle-left-16":"octicons/triangle-left-16.svg","octicons-triangle-left-24":"octicons/triangle-left-24.svg","octicons-triangle-right-16":"octicons/triangle-right-16.svg","octicons-triangle-right-24":"octicons/triangle-right-24.svg","octicons-triangle-up-16":"octicons/triangle-up-16.svg","octicons-triangle-up-24":"octicons/triangle-up-24.svg","octicons-trophy-16":"octicons/trophy-16.svg","octicons-trophy-24":"octicons/trophy-24.svg","octicons-typography-16":"octicons/typography-16.svg","octicons-typography-24":"octicons/typography-24.svg","octicons-unfold-16":"octicons/unfold-16.svg","octicons-unfold-24":"octicons/unfold-24.svg","octicons-unlock-16":"octicons/unlock-16.svg","octicons-unlock-24":"octicons/unlock-24.svg","octicons-unmute-16":"octicons/unmute-16.svg","octicons-unmute-24":"octicons/unmute-24.svg","octicons-unverified-16":"octicons/unverified-16.svg","octicons-unverified-24":"octicons/unverified-24.svg","octicons-upload-16":"octicons/upload-16.svg","octicons-upload-24":"octicons/upload-24.svg","octicons-verified-16":"octicons/verified-16.svg","octicons-verified-24":"octicons/verified-24.svg","octicons-versions-16":"octicons/versions-16.svg","octicons-versions-24":"octicons/versions-24.svg","octicons-video-16":"octicons/video-16.svg","octicons-video-24":"octicons/video-24.svg","octicons-webhook-16":"octicons/webhook-16.svg","octicons-workflow-16":"octicons/workflow-16.svg","octicons-workflow-24":"octicons/workflow-24.svg","octicons-x-16":"octicons/x-16.svg","octicons-x-24":"octicons/x-24.svg","octicons-x-circle-16":"octicons/x-circle-16.svg","octicons-x-circle-24":"octicons/x-circle-24.svg","octicons-x-circle-fill-12":"octicons/x-circle-fill-12.svg","octicons-x-circle-fill-16":"octicons/x-circle-fill-16.svg","octicons-x-circle-fill-24":"octicons/x-circle-fill-24.svg","octicons-zap-16":"octicons/zap-16.svg","octicons-zap-24":"octicons/zap-24.svg"}},"emojis":{"base":"https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/","data":{"100":"1f4af.svg","1234":"1f522.svg","8ball":"1f3b1.svg","a":"1f170.svg","ab":"1f18e.svg","abacus":"1f9ee.svg","abc":"1f524.svg","abcd":"1f521.svg","accept":"1f251.svg","accordion":"1fa97.svg","adhesive_bandage":"1fa79.svg","adult":"1f9d1.svg","adult_tone1":"1f9d1-1f3fb.svg","adult_tone2":"1f9d1-1f3fc.svg","adult_tone3":"1f9d1-1f3fd.svg","adult_tone4":"1f9d1-1f3fe.svg","adult_tone5":"1f9d1-1f3ff.svg","aerial_tramway":"1f6a1.svg","airplane":"2708.svg","airplane_arriving":"1f6ec.svg","airplane_departure":"1f6eb.svg","airplane_small":"1f6e9.svg","alarm_clock":"23f0.svg","alembic":"2697.svg","alien":"1f47d.svg","ambulance":"1f691.svg","amphora":"1f3fa.svg","anatomical_heart":"1fac0.svg","anchor":"2693.svg","angel":"1f47c.svg","angel_tone1":"1f47c-1f3fb.svg","angel_tone2":"1f47c-1f3fc.svg","angel_tone3":"1f47c-1f3fd.svg","angel_tone4":"1f47c-1f3fe.svg","angel_tone5":"1f47c-1f3ff.svg","anger":"1f4a2.svg","anger_right":"1f5ef.svg","angry":"1f620.svg","anguished":"1f627.svg","ant":"1f41c.svg","apple":"1f34e.svg","aquarius":"2652.svg","aries":"2648.svg","arrow_backward":"25c0.svg","arrow_double_down":"23ec.svg","arrow_double_up":"23eb.svg","arrow_down":"2b07.svg","arrow_down_small":"1f53d.svg","arrow_forward":"25b6.svg","arrow_heading_down":"2935.svg","arrow_heading_up":"2934.svg","arrow_left":"2b05.svg","arrow_lower_left":"2199.svg","arrow_lower_right":"2198.svg","arrow_right":"27a1.svg","arrow_right_hook":"21aa.svg","arrow_up":"2b06.svg","arrow_up_down":"2195.svg","arrow_up_small":"1f53c.svg","arrow_upper_left":"2196.svg","arrow_upper_right":"2197.svg","arrows_clockwise":"1f503.svg","arrows_counterclockwise":"1f504.svg","art":"1f3a8.svg","articulated_lorry":"1f69b.svg","artist":"1f9d1-200d-1f3a8.svg","artist_tone1":"1f9d1-1f3fb-200d-1f3a8.svg","artist_tone2":"1f9d1-1f3fc-200d-1f3a8.svg","artist_tone3":"1f9d1-1f3fd-200d-1f3a8.svg","artist_tone4":"1f9d1-1f3fe-200d-1f3a8.svg","artist_tone5":"1f9d1-1f3ff-200d-1f3a8.svg","asterisk":"2a-20e3.svg","astonished":"1f632.svg","astronaut":"1f9d1-200d-1f680.svg","astronaut_tone1":"1f9d1-1f3fb-200d-1f680.svg","astronaut_tone2":"1f9d1-1f3fc-200d-1f680.svg","astronaut_tone3":"1f9d1-1f3fd-200d-1f680.svg","astronaut_tone4":"1f9d1-1f3fe-200d-1f680.svg","astronaut_tone5":"1f9d1-1f3ff-200d-1f680.svg","athletic_shoe":"1f45f.svg","atm":"1f3e7.svg","atom":"269b.svg","auto_rickshaw":"1f6fa.svg","avocado":"1f951.svg","axe":"1fa93.svg","b":"1f171.svg","baby":"1f476.svg","baby_bottle":"1f37c.svg","baby_chick":"1f424.svg","baby_symbol":"1f6bc.svg","baby_tone1":"1f476-1f3fb.svg","baby_tone2":"1f476-1f3fc.svg","baby_tone3":"1f476-1f3fd.svg","baby_tone4":"1f476-1f3fe.svg","baby_tone5":"1f476-1f3ff.svg","back":"1f519.svg","bacon":"1f953.svg","badger":"1f9a1.svg","badminton":"1f3f8.svg","bagel":"1f96f.svg","baggage_claim":"1f6c4.svg","bald":"1f9b2.svg","ballet_shoes":"1fa70.svg","balloon":"1f388.svg","ballot_box":"1f5f3.svg","ballot_box_with_check":"2611.svg","bamboo":"1f38d.svg","banana":"1f34c.svg","bangbang":"203c.svg","banjo":"1fa95.svg","bank":"1f3e6.svg","bar_chart":"1f4ca.svg","barber":"1f488.svg","baseball":"26be.svg","basket":"1f9fa.svg","basketball":"1f3c0.svg","bat":"1f987.svg","bath":"1f6c0.svg","bath_tone1":"1f6c0-1f3fb.svg","bath_tone2":"1f6c0-1f3fc.svg","bath_tone3":"1f6c0-1f3fd.svg","bath_tone4":"1f6c0-1f3fe.svg","bath_tone5":"1f6c0-1f3ff.svg","bathtub":"1f6c1.svg","battery":"1f50b.svg","beach":"1f3d6.svg","beach_umbrella":"26f1.svg","bear":"1f43b.svg","bearded_person":"1f9d4.svg","bearded_person_tone1":"1f9d4-1f3fb.svg","bearded_person_tone2":"1f9d4-1f3fc.svg","bearded_person_tone3":"1f9d4-1f3fd.svg","bearded_person_tone4":"1f9d4-1f3fe.svg","bearded_person_tone5":"1f9d4-1f3ff.svg","beaver":"1f9ab.svg","bed":"1f6cf.svg","bee":"1f41d.svg","beer":"1f37a.svg","beers":"1f37b.svg","beetle":"1fab2.svg","beginner":"1f530.svg","bell":"1f514.svg","bell_pepper":"1fad1.svg","bellhop":"1f6ce.svg","bento":"1f371.svg","beverage_box":"1f9c3.svg","bike":"1f6b2.svg","bikini":"1f459.svg","billed_cap":"1f9e2.svg","biohazard":"2623.svg","bird":"1f426.svg","birthday":"1f382.svg","bison":"1f9ac.svg","black_cat":"1f408-200d-2b1b.svg","black_circle":"26ab.svg","black_heart":"1f5a4.svg","black_joker":"1f0cf.svg","black_large_square":"2b1b.svg","black_medium_small_square":"25fe.svg","black_medium_square":"25fc.svg","black_nib":"2712.svg","black_small_square":"25aa.svg","black_square_button":"1f532.svg","blond-haired_man":"1f471-200d-2642-fe0f.svg","blond-haired_man_tone1":"1f471-1f3fb-200d-2642-fe0f.svg","blond-haired_man_tone2":"1f471-1f3fc-200d-2642-fe0f.svg","blond-haired_man_tone3":"1f471-1f3fd-200d-2642-fe0f.svg","blond-haired_man_tone4":"1f471-1f3fe-200d-2642-fe0f.svg","blond-haired_man_tone5":"1f471-1f3ff-200d-2642-fe0f.svg","blond-haired_woman":"1f471-200d-2640-fe0f.svg","blond-haired_woman_tone1":"1f471-1f3fb-200d-2640-fe0f.svg","blond-haired_woman_tone2":"1f471-1f3fc-200d-2640-fe0f.svg","blond-haired_woman_tone3":"1f471-1f3fd-200d-2640-fe0f.svg","blond-haired_woman_tone4":"1f471-1f3fe-200d-2640-fe0f.svg","blond-haired_woman_tone5":"1f471-1f3ff-200d-2640-fe0f.svg","blond_haired_person":"1f471.svg","blond_haired_person_tone1":"1f471-1f3fb.svg","blond_haired_person_tone2":"1f471-1f3fc.svg","blond_haired_person_tone3":"1f471-1f3fd.svg","blond_haired_person_tone4":"1f471-1f3fe.svg","blond_haired_person_tone5":"1f471-1f3ff.svg","blossom":"1f33c.svg","blowfish":"1f421.svg","blue_book":"1f4d8.svg","blue_car":"1f699.svg","blue_circle":"1f535.svg","blue_heart":"1f499.svg","blue_square":"1f7e6.svg","blueberries":"1fad0.svg","blush":"1f60a.svg","boar":"1f417.svg","bomb":"1f4a3.svg","bone":"1f9b4.svg","book":"1f4d6.svg","bookmark":"1f516.svg","bookmark_tabs":"1f4d1.svg","books":"1f4da.svg","boom":"1f4a5.svg","boomerang":"1fa83.svg","boot":"1f462.svg","bouquet":"1f490.svg","bow_and_arrow":"1f3f9.svg","bowl_with_spoon":"1f963.svg","bowling":"1f3b3.svg","boxing_glove":"1f94a.svg","boy":"1f466.svg","boy_tone1":"1f466-1f3fb.svg","boy_tone2":"1f466-1f3fc.svg","boy_tone3":"1f466-1f3fd.svg","boy_tone4":"1f466-1f3fe.svg","boy_tone5":"1f466-1f3ff.svg","brain":"1f9e0.svg","bread":"1f35e.svg","breast_feeding":"1f931.svg","breast_feeding_tone1":"1f931-1f3fb.svg","breast_feeding_tone2":"1f931-1f3fc.svg","breast_feeding_tone3":"1f931-1f3fd.svg","breast_feeding_tone4":"1f931-1f3fe.svg","breast_feeding_tone5":"1f931-1f3ff.svg","bricks":"1f9f1.svg","bridge_at_night":"1f309.svg","briefcase":"1f4bc.svg","briefs":"1fa72.svg","broccoli":"1f966.svg","broken_heart":"1f494.svg","broom":"1f9f9.svg","brown_circle":"1f7e4.svg","brown_heart":"1f90e.svg","brown_square":"1f7eb.svg","bubble_tea":"1f9cb.svg","bucket":"1faa3.svg","bug":"1f41b.svg","bulb":"1f4a1.svg","bullettrain_front":"1f685.svg","bullettrain_side":"1f684.svg","burrito":"1f32f.svg","bus":"1f68c.svg","busstop":"1f68f.svg","bust_in_silhouette":"1f464.svg","busts_in_silhouette":"1f465.svg","butter":"1f9c8.svg","butterfly":"1f98b.svg","cactus":"1f335.svg","cake":"1f370.svg","calendar":"1f4c6.svg","calendar_spiral":"1f5d3.svg","call_me":"1f919.svg","call_me_tone1":"1f919-1f3fb.svg","call_me_tone2":"1f919-1f3fc.svg","call_me_tone3":"1f919-1f3fd.svg","call_me_tone4":"1f919-1f3fe.svg","call_me_tone5":"1f919-1f3ff.svg","calling":"1f4f2.svg","camel":"1f42b.svg","camera":"1f4f7.svg","camera_with_flash":"1f4f8.svg","camping":"1f3d5.svg","cancer":"264b.svg","candle":"1f56f.svg","candy":"1f36c.svg","canned_food":"1f96b.svg","canoe":"1f6f6.svg","capital_abcd":"1f520.svg","capricorn":"2651.svg","card_box":"1f5c3.svg","card_index":"1f4c7.svg","carousel_horse":"1f3a0.svg","carpentry_saw":"1fa9a.svg","carrot":"1f955.svg","cat2":"1f408.svg","cat":"1f431.svg","cd":"1f4bf.svg","chains":"26d3.svg","chair":"1fa91.svg","champagne":"1f37e.svg","champagne_glass":"1f942.svg","chart":"1f4b9.svg","chart_with_downwards_trend":"1f4c9.svg","chart_with_upwards_trend":"1f4c8.svg","checkered_flag":"1f3c1.svg","cheese":"1f9c0.svg","cherries":"1f352.svg","cherry_blossom":"1f338.svg","chess_pawn":"265f.svg","chestnut":"1f330.svg","chicken":"1f414.svg","child":"1f9d2.svg","child_tone1":"1f9d2-1f3fb.svg","child_tone2":"1f9d2-1f3fc.svg","child_tone3":"1f9d2-1f3fd.svg","child_tone4":"1f9d2-1f3fe.svg","child_tone5":"1f9d2-1f3ff.svg","children_crossing":"1f6b8.svg","chipmunk":"1f43f.svg","chocolate_bar":"1f36b.svg","chopsticks":"1f962.svg","christmas_tree":"1f384.svg","church":"26ea.svg","cinema":"1f3a6.svg","circus_tent":"1f3aa.svg","city_dusk":"1f306.svg","city_sunset":"1f307.svg","cityscape":"1f3d9.svg","cl":"1f191.svg","clap":"1f44f.svg","clap_tone1":"1f44f-1f3fb.svg","clap_tone2":"1f44f-1f3fc.svg","clap_tone3":"1f44f-1f3fd.svg","clap_tone4":"1f44f-1f3fe.svg","clap_tone5":"1f44f-1f3ff.svg","clapper":"1f3ac.svg","classical_building":"1f3db.svg","clipboard":"1f4cb.svg","clock1030":"1f565.svg","clock10":"1f559.svg","clock1130":"1f566.svg","clock11":"1f55a.svg","clock1230":"1f567.svg","clock12":"1f55b.svg","clock130":"1f55c.svg","clock1":"1f550.svg","clock230":"1f55d.svg","clock2":"1f551.svg","clock330":"1f55e.svg","clock3":"1f552.svg","clock430":"1f55f.svg","clock4":"1f553.svg","clock530":"1f560.svg","clock5":"1f554.svg","clock630":"1f561.svg","clock6":"1f555.svg","clock730":"1f562.svg","clock7":"1f556.svg","clock830":"1f563.svg","clock8":"1f557.svg","clock930":"1f564.svg","clock9":"1f558.svg","clock":"1f570.svg","closed_book":"1f4d5.svg","closed_lock_with_key":"1f510.svg","closed_umbrella":"1f302.svg","cloud":"2601.svg","cloud_lightning":"1f329.svg","cloud_rain":"1f327.svg","cloud_snow":"1f328.svg","cloud_tornado":"1f32a.svg","clown":"1f921.svg","clubs":"2663.svg","coat":"1f9e5.svg","cockroach":"1fab3.svg","cocktail":"1f378.svg","coconut":"1f965.svg","coffee":"2615.svg","coffin":"26b0.svg","coin":"1fa99.svg","cold_face":"1f976.svg","cold_sweat":"1f630.svg","comet":"2604.svg","compass":"1f9ed.svg","compression":"1f5dc.svg","computer":"1f4bb.svg","confetti_ball":"1f38a.svg","confounded":"1f616.svg","confused":"1f615.svg","congratulations":"3297.svg","construction":"1f6a7.svg","construction_site":"1f3d7.svg","construction_worker":"1f477.svg","construction_worker_tone1":"1f477-1f3fb.svg","construction_worker_tone2":"1f477-1f3fc.svg","construction_worker_tone3":"1f477-1f3fd.svg","construction_worker_tone4":"1f477-1f3fe.svg","construction_worker_tone5":"1f477-1f3ff.svg","control_knobs":"1f39b.svg","convenience_store":"1f3ea.svg","cook":"1f9d1-200d-1f373.svg","cook_tone1":"1f9d1-1f3fb-200d-1f373.svg","cook_tone2":"1f9d1-1f3fc-200d-1f373.svg","cook_tone3":"1f9d1-1f3fd-200d-1f373.svg","cook_tone4":"1f9d1-1f3fe-200d-1f373.svg","cook_tone5":"1f9d1-1f3ff-200d-1f373.svg","cookie":"1f36a.svg","cooking":"1f373.svg","cool":"1f192.svg","copyright":"a9.svg","corn":"1f33d.svg","couch":"1f6cb.svg","couple":"1f46b.svg","couple_mm":"1f468-200d-2764-fe0f-200d-1f468.svg","couple_with_heart":"1f491.svg","couple_with_heart_man_man_tone1":"1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg","couple_with_heart_man_man_tone1_tone2":"1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg","couple_with_heart_man_man_tone1_tone3":"1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg","couple_with_heart_man_man_tone1_tone4":"1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg","couple_with_heart_man_man_tone1_tone5":"1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg","couple_with_heart_man_man_tone2":"1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg","couple_with_heart_man_man_tone2_tone1":"1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg","couple_with_heart_man_man_tone2_tone3":"1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg","couple_with_heart_man_man_tone2_tone4":"1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg","couple_with_heart_man_man_tone2_tone5":"1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg","couple_with_heart_man_man_tone3":"1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg","couple_with_heart_man_man_tone3_tone1":"1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg","couple_with_heart_man_man_tone3_tone2":"1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg","couple_with_heart_man_man_tone3_tone4":"1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg","couple_with_heart_man_man_tone3_tone5":"1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg","couple_with_heart_man_man_tone4":"1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg","couple_with_heart_man_man_tone4_tone1":"1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg","couple_with_heart_man_man_tone4_tone2":"1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg","couple_with_heart_man_man_tone4_tone3":"1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg","couple_with_heart_man_man_tone4_tone5":"1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg","couple_with_heart_man_man_tone5":"1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg","couple_with_heart_man_man_tone5_tone1":"1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg","couple_with_heart_man_man_tone5_tone2":"1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg","couple_with_heart_man_man_tone5_tone3":"1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg","couple_with_heart_man_man_tone5_tone4":"1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg","couple_with_heart_person_person_tone1_tone2":"1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc.svg","couple_with_heart_person_person_tone1_tone3":"1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd.svg","couple_with_heart_person_person_tone1_tone4":"1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe.svg","couple_with_heart_person_person_tone1_tone5":"1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff.svg","couple_with_heart_person_person_tone2_tone1":"1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb.svg","couple_with_heart_person_person_tone2_tone3":"1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd.svg","couple_with_heart_person_person_tone2_tone4":"1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe.svg","couple_with_heart_person_person_tone2_tone5":"1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff.svg","couple_with_heart_person_person_tone3_tone1":"1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb.svg","couple_with_heart_person_person_tone3_tone2":"1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc.svg","couple_with_heart_person_person_tone3_tone4":"1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe.svg","couple_with_heart_person_person_tone3_tone5":"1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff.svg","couple_with_heart_person_person_tone4_tone1":"1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb.svg","couple_with_heart_person_person_tone4_tone2":"1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc.svg","couple_with_heart_person_person_tone4_tone3":"1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd.svg","couple_with_heart_person_person_tone4_tone5":"1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff.svg","couple_with_heart_person_person_tone5_tone1":"1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb.svg","couple_with_heart_person_person_tone5_tone2":"1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc.svg","couple_with_heart_person_person_tone5_tone3":"1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd.svg","couple_with_heart_person_person_tone5_tone4":"1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe.svg","couple_with_heart_tone1":"1f491-1f3fb.svg","couple_with_heart_tone2":"1f491-1f3fc.svg","couple_with_heart_tone3":"1f491-1f3fd.svg","couple_with_heart_tone4":"1f491-1f3fe.svg","couple_with_heart_tone5":"1f491-1f3ff.svg","couple_with_heart_woman_man":"1f469-200d-2764-fe0f-200d-1f468.svg","couple_with_heart_woman_man_tone1":"1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg","couple_with_heart_woman_man_tone1_tone2":"1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg","couple_with_heart_woman_man_tone1_tone3":"1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg","couple_with_heart_woman_man_tone1_tone4":"1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg","couple_with_heart_woman_man_tone1_tone5":"1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg","couple_with_heart_woman_man_tone2":"1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg","couple_with_heart_woman_man_tone2_tone1":"1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg","couple_with_heart_woman_man_tone2_tone3":"1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg","couple_with_heart_woman_man_tone2_tone4":"1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg","couple_with_heart_woman_man_tone2_tone5":"1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg","couple_with_heart_woman_man_tone3":"1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg","couple_with_heart_woman_man_tone3_tone1":"1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg","couple_with_heart_woman_man_tone3_tone2":"1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg","couple_with_heart_woman_man_tone3_tone4":"1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg","couple_with_heart_woman_man_tone3_tone5":"1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg","couple_with_heart_woman_man_tone4":"1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg","couple_with_heart_woman_man_tone4_tone1":"1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg","couple_with_heart_woman_man_tone4_tone2":"1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg","couple_with_heart_woman_man_tone4_tone3":"1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg","couple_with_heart_woman_man_tone4_tone5":"1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg","couple_with_heart_woman_man_tone5":"1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg","couple_with_heart_woman_man_tone5_tone1":"1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg","couple_with_heart_woman_man_tone5_tone2":"1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg","couple_with_heart_woman_man_tone5_tone3":"1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg","couple_with_heart_woman_man_tone5_tone4":"1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg","couple_with_heart_woman_woman_tone1":"1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb.svg","couple_with_heart_woman_woman_tone1_tone2":"1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc.svg","couple_with_heart_woman_woman_tone1_tone3":"1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd.svg","couple_with_heart_woman_woman_tone1_tone4":"1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe.svg","couple_with_heart_woman_woman_tone1_tone5":"1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff.svg","couple_with_heart_woman_woman_tone2":"1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc.svg","couple_with_heart_woman_woman_tone2_tone1":"1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb.svg","couple_with_heart_woman_woman_tone2_tone3":"1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd.svg","couple_with_heart_woman_woman_tone2_tone4":"1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe.svg","couple_with_heart_woman_woman_tone2_tone5":"1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff.svg","couple_with_heart_woman_woman_tone3":"1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd.svg","couple_with_heart_woman_woman_tone3_tone1":"1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb.svg","couple_with_heart_woman_woman_tone3_tone2":"1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc.svg","couple_with_heart_woman_woman_tone3_tone4":"1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe.svg","couple_with_heart_woman_woman_tone3_tone5":"1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff.svg","couple_with_heart_woman_woman_tone4":"1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe.svg","couple_with_heart_woman_woman_tone4_tone1":"1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb.svg","couple_with_heart_woman_woman_tone4_tone2":"1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc.svg","couple_with_heart_woman_woman_tone4_tone3":"1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd.svg","couple_with_heart_woman_woman_tone4_tone5":"1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff.svg","couple_with_heart_woman_woman_tone5":"1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff.svg","couple_with_heart_woman_woman_tone5_tone1":"1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb.svg","couple_with_heart_woman_woman_tone5_tone2":"1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc.svg","couple_with_heart_woman_woman_tone5_tone3":"1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd.svg","couple_with_heart_woman_woman_tone5_tone4":"1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe.svg","couple_ww":"1f469-200d-2764-fe0f-200d-1f469.svg","couplekiss":"1f48f.svg","cow2":"1f404.svg","cow":"1f42e.svg","cowboy":"1f920.svg","crab":"1f980.svg","crayon":"1f58d.svg","credit_card":"1f4b3.svg","crescent_moon":"1f319.svg","cricket":"1f997.svg","cricket_game":"1f3cf.svg","crocodile":"1f40a.svg","croissant":"1f950.svg","cross":"271d.svg","crossed_flags":"1f38c.svg","crossed_swords":"2694.svg","crown":"1f451.svg","cruise_ship":"1f6f3.svg","cry":"1f622.svg","crying_cat_face":"1f63f.svg","crystal_ball":"1f52e.svg","cucumber":"1f952.svg","cup_with_straw":"1f964.svg","cupcake":"1f9c1.svg","cupid":"1f498.svg","curling_stone":"1f94c.svg","curly_haired":"1f9b1.svg","curly_loop":"27b0.svg","currency_exchange":"1f4b1.svg","curry":"1f35b.svg","custard":"1f36e.svg","customs":"1f6c3.svg","cut_of_meat":"1f969.svg","cyclone":"1f300.svg","dagger":"1f5e1.svg","dancer":"1f483.svg","dancer_tone1":"1f483-1f3fb.svg","dancer_tone2":"1f483-1f3fc.svg","dancer_tone3":"1f483-1f3fd.svg","dancer_tone4":"1f483-1f3fe.svg","dancer_tone5":"1f483-1f3ff.svg","dango":"1f361.svg","dark_sunglasses":"1f576.svg","dart":"1f3af.svg","dash":"1f4a8.svg","date":"1f4c5.svg","deaf_man":"1f9cf-200d-2642-fe0f.svg","deaf_man_tone1":"1f9cf-1f3fb-200d-2642-fe0f.svg","deaf_man_tone2":"1f9cf-1f3fc-200d-2642-fe0f.svg","deaf_man_tone3":"1f9cf-1f3fd-200d-2642-fe0f.svg","deaf_man_tone4":"1f9cf-1f3fe-200d-2642-fe0f.svg","deaf_man_tone5":"1f9cf-1f3ff-200d-2642-fe0f.svg","deaf_person":"1f9cf.svg","deaf_person_tone1":"1f9cf-1f3fb.svg","deaf_person_tone2":"1f9cf-1f3fc.svg","deaf_person_tone3":"1f9cf-1f3fd.svg","deaf_person_tone4":"1f9cf-1f3fe.svg","deaf_person_tone5":"1f9cf-1f3ff.svg","deaf_woman":"1f9cf-200d-2640-fe0f.svg","deaf_woman_tone1":"1f9cf-1f3fb-200d-2640-fe0f.svg","deaf_woman_tone2":"1f9cf-1f3fc-200d-2640-fe0f.svg","deaf_woman_tone3":"1f9cf-1f3fd-200d-2640-fe0f.svg","deaf_woman_tone4":"1f9cf-1f3fe-200d-2640-fe0f.svg","deaf_woman_tone5":"1f9cf-1f3ff-200d-2640-fe0f.svg","deciduous_tree":"1f333.svg","deer":"1f98c.svg","department_store":"1f3ec.svg","desert":"1f3dc.svg","desktop":"1f5a5.svg","detective":"1f575.svg","detective_tone1":"1f575-1f3fb.svg","detective_tone2":"1f575-1f3fc.svg","detective_tone3":"1f575-1f3fd.svg","detective_tone4":"1f575-1f3fe.svg","detective_tone5":"1f575-1f3ff.svg","diamond_shape_with_a_dot_inside":"1f4a0.svg","diamonds":"2666.svg","disappointed":"1f61e.svg","disappointed_relieved":"1f625.svg","disguised_face":"1f978.svg","dividers":"1f5c2.svg","diving_mask":"1f93f.svg","diya_lamp":"1fa94.svg","dizzy":"1f4ab.svg","dizzy_face":"1f635.svg","dna":"1f9ec.svg","do_not_litter":"1f6af.svg","dodo":"1f9a4.svg","dog2":"1f415.svg","dog":"1f436.svg","dollar":"1f4b5.svg","dolls":"1f38e.svg","dolphin":"1f42c.svg","door":"1f6aa.svg","doughnut":"1f369.svg","dove":"1f54a.svg","dragon":"1f409.svg","dragon_face":"1f432.svg","dress":"1f457.svg","dromedary_camel":"1f42a.svg","drooling_face":"1f924.svg","drop_of_blood":"1fa78.svg","droplet":"1f4a7.svg","drum":"1f941.svg","duck":"1f986.svg","dumpling":"1f95f.svg","dvd":"1f4c0.svg","e-mail":"1f4e7.svg","eagle":"1f985.svg","ear":"1f442.svg","ear_of_rice":"1f33e.svg","ear_tone1":"1f442-1f3fb.svg","ear_tone2":"1f442-1f3fc.svg","ear_tone3":"1f442-1f3fd.svg","ear_tone4":"1f442-1f3fe.svg","ear_tone5":"1f442-1f3ff.svg","ear_with_hearing_aid":"1f9bb.svg","ear_with_hearing_aid_tone1":"1f9bb-1f3fb.svg","ear_with_hearing_aid_tone2":"1f9bb-1f3fc.svg","ear_with_hearing_aid_tone3":"1f9bb-1f3fd.svg","ear_with_hearing_aid_tone4":"1f9bb-1f3fe.svg","ear_with_hearing_aid_tone5":"1f9bb-1f3ff.svg","earth_africa":"1f30d.svg","earth_americas":"1f30e.svg","earth_asia":"1f30f.svg","egg":"1f95a.svg","eggplant":"1f346.svg","eight":"38-20e3.svg","eight_pointed_black_star":"2734.svg","eight_spoked_asterisk":"2733.svg","eject":"23cf.svg","electric_plug":"1f50c.svg","elephant":"1f418.svg","elevator":"1f6d7.svg","elf":"1f9dd.svg","elf_tone1":"1f9dd-1f3fb.svg","elf_tone2":"1f9dd-1f3fc.svg","elf_tone3":"1f9dd-1f3fd.svg","elf_tone4":"1f9dd-1f3fe.svg","elf_tone5":"1f9dd-1f3ff.svg","end":"1f51a.svg","england":"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.svg","envelope":"2709.svg","envelope_with_arrow":"1f4e9.svg","euro":"1f4b6.svg","european_castle":"1f3f0.svg","european_post_office":"1f3e4.svg","evergreen_tree":"1f332.svg","exclamation":"2757.svg","exploding_head":"1f92f.svg","expressionless":"1f611.svg","eye":"1f441.svg","eye_in_speech_bubble":"1f441-200d-1f5e8.svg","eyeglasses":"1f453.svg","eyes":"1f440.svg","face_exhaling":"1f62e-200d-1f4a8.svg","face_in_clouds":"1f636-200d-1f32b-fe0f.svg","face_vomiting":"1f92e.svg","face_with_hand_over_mouth":"1f92d.svg","face_with_monocle":"1f9d0.svg","face_with_raised_eyebrow":"1f928.svg","face_with_spiral_eyes":"1f635-200d-1f4ab.svg","face_with_symbols_over_mouth":"1f92c.svg","factory":"1f3ed.svg","factory_worker":"1f9d1-200d-1f3ed.svg","factory_worker_tone1":"1f9d1-1f3fb-200d-1f3ed.svg","factory_worker_tone2":"1f9d1-1f3fc-200d-1f3ed.svg","factory_worker_tone3":"1f9d1-1f3fd-200d-1f3ed.svg","factory_worker_tone4":"1f9d1-1f3fe-200d-1f3ed.svg","factory_worker_tone5":"1f9d1-1f3ff-200d-1f3ed.svg","fairy":"1f9da.svg","fairy_tone1":"1f9da-1f3fb.svg","fairy_tone2":"1f9da-1f3fc.svg","fairy_tone3":"1f9da-1f3fd.svg","fairy_tone4":"1f9da-1f3fe.svg","fairy_tone5":"1f9da-1f3ff.svg","falafel":"1f9c6.svg","fallen_leaf":"1f342.svg","family":"1f46a.svg","family_man_boy":"1f468-200d-1f466.svg","family_man_boy_boy":"1f468-200d-1f466-200d-1f466.svg","family_man_girl":"1f468-200d-1f467.svg","family_man_girl_boy":"1f468-200d-1f467-200d-1f466.svg","family_man_girl_girl":"1f468-200d-1f467-200d-1f467.svg","family_man_woman_boy":"1f468-200d-1f469-200d-1f466.svg","family_mmb":"1f468-200d-1f468-200d-1f466.svg","family_mmbb":"1f468-200d-1f468-200d-1f466-200d-1f466.svg","family_mmg":"1f468-200d-1f468-200d-1f467.svg","family_mmgb":"1f468-200d-1f468-200d-1f467-200d-1f466.svg","family_mmgg":"1f468-200d-1f468-200d-1f467-200d-1f467.svg","family_mwbb":"1f468-200d-1f469-200d-1f466-200d-1f466.svg","family_mwg":"1f468-200d-1f469-200d-1f467.svg","family_mwgb":"1f468-200d-1f469-200d-1f467-200d-1f466.svg","family_mwgg":"1f468-200d-1f469-200d-1f467-200d-1f467.svg","family_woman_boy":"1f469-200d-1f466.svg","family_woman_boy_boy":"1f469-200d-1f466-200d-1f466.svg","family_woman_girl":"1f469-200d-1f467.svg","family_woman_girl_boy":"1f469-200d-1f467-200d-1f466.svg","family_woman_girl_girl":"1f469-200d-1f467-200d-1f467.svg","family_wwb":"1f469-200d-1f469-200d-1f466.svg","family_wwbb":"1f469-200d-1f469-200d-1f466-200d-1f466.svg","family_wwg":"1f469-200d-1f469-200d-1f467.svg","family_wwgb":"1f469-200d-1f469-200d-1f467-200d-1f466.svg","family_wwgg":"1f469-200d-1f469-200d-1f467-200d-1f467.svg","farmer":"1f9d1-200d-1f33e.svg","farmer_tone1":"1f9d1-1f3fb-200d-1f33e.svg","farmer_tone2":"1f9d1-1f3fc-200d-1f33e.svg","farmer_tone3":"1f9d1-1f3fd-200d-1f33e.svg","farmer_tone4":"1f9d1-1f3fe-200d-1f33e.svg","farmer_tone5":"1f9d1-1f3ff-200d-1f33e.svg","fast_forward":"23e9.svg","fax":"1f4e0.svg","fearful":"1f628.svg","feather":"1fab6.svg","feet":"1f43e.svg","female_sign":"2640.svg","ferris_wheel":"1f3a1.svg","ferry":"26f4.svg","field_hockey":"1f3d1.svg","file_cabinet":"1f5c4.svg","file_folder":"1f4c1.svg","film_frames":"1f39e.svg","fingers_crossed":"1f91e.svg","fingers_crossed_tone1":"1f91e-1f3fb.svg","fingers_crossed_tone2":"1f91e-1f3fc.svg","fingers_crossed_tone3":"1f91e-1f3fd.svg","fingers_crossed_tone4":"1f91e-1f3fe.svg","fingers_crossed_tone5":"1f91e-1f3ff.svg","fire":"1f525.svg","fire_engine":"1f692.svg","fire_extinguisher":"1f9ef.svg","firecracker":"1f9e8.svg","firefighter":"1f9d1-200d-1f692.svg","firefighter_tone1":"1f9d1-1f3fb-200d-1f692.svg","firefighter_tone2":"1f9d1-1f3fc-200d-1f692.svg","firefighter_tone3":"1f9d1-1f3fd-200d-1f692.svg","firefighter_tone4":"1f9d1-1f3fe-200d-1f692.svg","firefighter_tone5":"1f9d1-1f3ff-200d-1f692.svg","fireworks":"1f386.svg","first_place":"1f947.svg","first_quarter_moon":"1f313.svg","first_quarter_moon_with_face":"1f31b.svg","fish":"1f41f.svg","fish_cake":"1f365.svg","fishing_pole_and_fish":"1f3a3.svg","fist":"270a.svg","fist_tone1":"270a-1f3fb.svg","fist_tone2":"270a-1f3fc.svg","fist_tone3":"270a-1f3fd.svg","fist_tone4":"270a-1f3fe.svg","fist_tone5":"270a-1f3ff.svg","five":"35-20e3.svg","flag_ac":"1f1e6-1f1e8.svg","flag_ad":"1f1e6-1f1e9.svg","flag_ae":"1f1e6-1f1ea.svg","flag_af":"1f1e6-1f1eb.svg","flag_ag":"1f1e6-1f1ec.svg","flag_ai":"1f1e6-1f1ee.svg","flag_al":"1f1e6-1f1f1.svg","flag_am":"1f1e6-1f1f2.svg","flag_ao":"1f1e6-1f1f4.svg","flag_aq":"1f1e6-1f1f6.svg","flag_ar":"1f1e6-1f1f7.svg","flag_as":"1f1e6-1f1f8.svg","flag_at":"1f1e6-1f1f9.svg","flag_au":"1f1e6-1f1fa.svg","flag_aw":"1f1e6-1f1fc.svg","flag_ax":"1f1e6-1f1fd.svg","flag_az":"1f1e6-1f1ff.svg","flag_ba":"1f1e7-1f1e6.svg","flag_bb":"1f1e7-1f1e7.svg","flag_bd":"1f1e7-1f1e9.svg","flag_be":"1f1e7-1f1ea.svg","flag_bf":"1f1e7-1f1eb.svg","flag_bg":"1f1e7-1f1ec.svg","flag_bh":"1f1e7-1f1ed.svg","flag_bi":"1f1e7-1f1ee.svg","flag_bj":"1f1e7-1f1ef.svg","flag_bl":"1f1e7-1f1f1.svg","flag_black":"1f3f4.svg","flag_bm":"1f1e7-1f1f2.svg","flag_bn":"1f1e7-1f1f3.svg","flag_bo":"1f1e7-1f1f4.svg","flag_bq":"1f1e7-1f1f6.svg","flag_br":"1f1e7-1f1f7.svg","flag_bs":"1f1e7-1f1f8.svg","flag_bt":"1f1e7-1f1f9.svg","flag_bv":"1f1e7-1f1fb.svg","flag_bw":"1f1e7-1f1fc.svg","flag_by":"1f1e7-1f1fe.svg","flag_bz":"1f1e7-1f1ff.svg","flag_ca":"1f1e8-1f1e6.svg","flag_cc":"1f1e8-1f1e8.svg","flag_cd":"1f1e8-1f1e9.svg","flag_cf":"1f1e8-1f1eb.svg","flag_cg":"1f1e8-1f1ec.svg","flag_ch":"1f1e8-1f1ed.svg","flag_ci":"1f1e8-1f1ee.svg","flag_ck":"1f1e8-1f1f0.svg","flag_cl":"1f1e8-1f1f1.svg","flag_cm":"1f1e8-1f1f2.svg","flag_cn":"1f1e8-1f1f3.svg","flag_co":"1f1e8-1f1f4.svg","flag_cp":"1f1e8-1f1f5.svg","flag_cr":"1f1e8-1f1f7.svg","flag_cu":"1f1e8-1f1fa.svg","flag_cv":"1f1e8-1f1fb.svg","flag_cw":"1f1e8-1f1fc.svg","flag_cx":"1f1e8-1f1fd.svg","flag_cy":"1f1e8-1f1fe.svg","flag_cz":"1f1e8-1f1ff.svg","flag_de":"1f1e9-1f1ea.svg","flag_dg":"1f1e9-1f1ec.svg","flag_dj":"1f1e9-1f1ef.svg","flag_dk":"1f1e9-1f1f0.svg","flag_dm":"1f1e9-1f1f2.svg","flag_do":"1f1e9-1f1f4.svg","flag_dz":"1f1e9-1f1ff.svg","flag_ea":"1f1ea-1f1e6.svg","flag_ec":"1f1ea-1f1e8.svg","flag_ee":"1f1ea-1f1ea.svg","flag_eg":"1f1ea-1f1ec.svg","flag_eh":"1f1ea-1f1ed.svg","flag_er":"1f1ea-1f1f7.svg","flag_es":"1f1ea-1f1f8.svg","flag_et":"1f1ea-1f1f9.svg","flag_eu":"1f1ea-1f1fa.svg","flag_fi":"1f1eb-1f1ee.svg","flag_fj":"1f1eb-1f1ef.svg","flag_fk":"1f1eb-1f1f0.svg","flag_fm":"1f1eb-1f1f2.svg","flag_fo":"1f1eb-1f1f4.svg","flag_fr":"1f1eb-1f1f7.svg","flag_ga":"1f1ec-1f1e6.svg","flag_gb":"1f1ec-1f1e7.svg","flag_gd":"1f1ec-1f1e9.svg","flag_ge":"1f1ec-1f1ea.svg","flag_gf":"1f1ec-1f1eb.svg","flag_gg":"1f1ec-1f1ec.svg","flag_gh":"1f1ec-1f1ed.svg","flag_gi":"1f1ec-1f1ee.svg","flag_gl":"1f1ec-1f1f1.svg","flag_gm":"1f1ec-1f1f2.svg","flag_gn":"1f1ec-1f1f3.svg","flag_gp":"1f1ec-1f1f5.svg","flag_gq":"1f1ec-1f1f6.svg","flag_gr":"1f1ec-1f1f7.svg","flag_gs":"1f1ec-1f1f8.svg","flag_gt":"1f1ec-1f1f9.svg","flag_gu":"1f1ec-1f1fa.svg","flag_gw":"1f1ec-1f1fc.svg","flag_gy":"1f1ec-1f1fe.svg","flag_hk":"1f1ed-1f1f0.svg","flag_hm":"1f1ed-1f1f2.svg","flag_hn":"1f1ed-1f1f3.svg","flag_hr":"1f1ed-1f1f7.svg","flag_ht":"1f1ed-1f1f9.svg","flag_hu":"1f1ed-1f1fa.svg","flag_ic":"1f1ee-1f1e8.svg","flag_id":"1f1ee-1f1e9.svg","flag_ie":"1f1ee-1f1ea.svg","flag_il":"1f1ee-1f1f1.svg","flag_im":"1f1ee-1f1f2.svg","flag_in":"1f1ee-1f1f3.svg","flag_io":"1f1ee-1f1f4.svg","flag_iq":"1f1ee-1f1f6.svg","flag_ir":"1f1ee-1f1f7.svg","flag_is":"1f1ee-1f1f8.svg","flag_it":"1f1ee-1f1f9.svg","flag_je":"1f1ef-1f1ea.svg","flag_jm":"1f1ef-1f1f2.svg","flag_jo":"1f1ef-1f1f4.svg","flag_jp":"1f1ef-1f1f5.svg","flag_ke":"1f1f0-1f1ea.svg","flag_kg":"1f1f0-1f1ec.svg","flag_kh":"1f1f0-1f1ed.svg","flag_ki":"1f1f0-1f1ee.svg","flag_km":"1f1f0-1f1f2.svg","flag_kn":"1f1f0-1f1f3.svg","flag_kp":"1f1f0-1f1f5.svg","flag_kr":"1f1f0-1f1f7.svg","flag_kw":"1f1f0-1f1fc.svg","flag_ky":"1f1f0-1f1fe.svg","flag_kz":"1f1f0-1f1ff.svg","flag_la":"1f1f1-1f1e6.svg","flag_lb":"1f1f1-1f1e7.svg","flag_lc":"1f1f1-1f1e8.svg","flag_li":"1f1f1-1f1ee.svg","flag_lk":"1f1f1-1f1f0.svg","flag_lr":"1f1f1-1f1f7.svg","flag_ls":"1f1f1-1f1f8.svg","flag_lt":"1f1f1-1f1f9.svg","flag_lu":"1f1f1-1f1fa.svg","flag_lv":"1f1f1-1f1fb.svg","flag_ly":"1f1f1-1f1fe.svg","flag_ma":"1f1f2-1f1e6.svg","flag_mc":"1f1f2-1f1e8.svg","flag_md":"1f1f2-1f1e9.svg","flag_me":"1f1f2-1f1ea.svg","flag_mf":"1f1f2-1f1eb.svg","flag_mg":"1f1f2-1f1ec.svg","flag_mh":"1f1f2-1f1ed.svg","flag_mk":"1f1f2-1f1f0.svg","flag_ml":"1f1f2-1f1f1.svg","flag_mm":"1f1f2-1f1f2.svg","flag_mn":"1f1f2-1f1f3.svg","flag_mo":"1f1f2-1f1f4.svg","flag_mp":"1f1f2-1f1f5.svg","flag_mq":"1f1f2-1f1f6.svg","flag_mr":"1f1f2-1f1f7.svg","flag_ms":"1f1f2-1f1f8.svg","flag_mt":"1f1f2-1f1f9.svg","flag_mu":"1f1f2-1f1fa.svg","flag_mv":"1f1f2-1f1fb.svg","flag_mw":"1f1f2-1f1fc.svg","flag_mx":"1f1f2-1f1fd.svg","flag_my":"1f1f2-1f1fe.svg","flag_mz":"1f1f2-1f1ff.svg","flag_na":"1f1f3-1f1e6.svg","flag_nc":"1f1f3-1f1e8.svg","flag_ne":"1f1f3-1f1ea.svg","flag_nf":"1f1f3-1f1eb.svg","flag_ng":"1f1f3-1f1ec.svg","flag_ni":"1f1f3-1f1ee.svg","flag_nl":"1f1f3-1f1f1.svg","flag_no":"1f1f3-1f1f4.svg","flag_np":"1f1f3-1f1f5.svg","flag_nr":"1f1f3-1f1f7.svg","flag_nu":"1f1f3-1f1fa.svg","flag_nz":"1f1f3-1f1ff.svg","flag_om":"1f1f4-1f1f2.svg","flag_pa":"1f1f5-1f1e6.svg","flag_pe":"1f1f5-1f1ea.svg","flag_pf":"1f1f5-1f1eb.svg","flag_pg":"1f1f5-1f1ec.svg","flag_ph":"1f1f5-1f1ed.svg","flag_pk":"1f1f5-1f1f0.svg","flag_pl":"1f1f5-1f1f1.svg","flag_pm":"1f1f5-1f1f2.svg","flag_pn":"1f1f5-1f1f3.svg","flag_pr":"1f1f5-1f1f7.svg","flag_ps":"1f1f5-1f1f8.svg","flag_pt":"1f1f5-1f1f9.svg","flag_pw":"1f1f5-1f1fc.svg","flag_py":"1f1f5-1f1fe.svg","flag_qa":"1f1f6-1f1e6.svg","flag_re":"1f1f7-1f1ea.svg","flag_ro":"1f1f7-1f1f4.svg","flag_rs":"1f1f7-1f1f8.svg","flag_ru":"1f1f7-1f1fa.svg","flag_rw":"1f1f7-1f1fc.svg","flag_sa":"1f1f8-1f1e6.svg","flag_sb":"1f1f8-1f1e7.svg","flag_sc":"1f1f8-1f1e8.svg","flag_sd":"1f1f8-1f1e9.svg","flag_se":"1f1f8-1f1ea.svg","flag_sg":"1f1f8-1f1ec.svg","flag_sh":"1f1f8-1f1ed.svg","flag_si":"1f1f8-1f1ee.svg","flag_sj":"1f1f8-1f1ef.svg","flag_sk":"1f1f8-1f1f0.svg","flag_sl":"1f1f8-1f1f1.svg","flag_sm":"1f1f8-1f1f2.svg","flag_sn":"1f1f8-1f1f3.svg","flag_so":"1f1f8-1f1f4.svg","flag_sr":"1f1f8-1f1f7.svg","flag_ss":"1f1f8-1f1f8.svg","flag_st":"1f1f8-1f1f9.svg","flag_sv":"1f1f8-1f1fb.svg","flag_sx":"1f1f8-1f1fd.svg","flag_sy":"1f1f8-1f1fe.svg","flag_sz":"1f1f8-1f1ff.svg","flag_ta":"1f1f9-1f1e6.svg","flag_tc":"1f1f9-1f1e8.svg","flag_td":"1f1f9-1f1e9.svg","flag_tf":"1f1f9-1f1eb.svg","flag_tg":"1f1f9-1f1ec.svg","flag_th":"1f1f9-1f1ed.svg","flag_tj":"1f1f9-1f1ef.svg","flag_tk":"1f1f9-1f1f0.svg","flag_tl":"1f1f9-1f1f1.svg","flag_tm":"1f1f9-1f1f2.svg","flag_tn":"1f1f9-1f1f3.svg","flag_to":"1f1f9-1f1f4.svg","flag_tr":"1f1f9-1f1f7.svg","flag_tt":"1f1f9-1f1f9.svg","flag_tv":"1f1f9-1f1fb.svg","flag_tw":"1f1f9-1f1fc.svg","flag_tz":"1f1f9-1f1ff.svg","flag_ua":"1f1fa-1f1e6.svg","flag_ug":"1f1fa-1f1ec.svg","flag_um":"1f1fa-1f1f2.svg","flag_us":"1f1fa-1f1f8.svg","flag_uy":"1f1fa-1f1fe.svg","flag_uz":"1f1fa-1f1ff.svg","flag_va":"1f1fb-1f1e6.svg","flag_vc":"1f1fb-1f1e8.svg","flag_ve":"1f1fb-1f1ea.svg","flag_vg":"1f1fb-1f1ec.svg","flag_vi":"1f1fb-1f1ee.svg","flag_vn":"1f1fb-1f1f3.svg","flag_vu":"1f1fb-1f1fa.svg","flag_wf":"1f1fc-1f1eb.svg","flag_white":"1f3f3.svg","flag_ws":"1f1fc-1f1f8.svg","flag_xk":"1f1fd-1f1f0.svg","flag_ye":"1f1fe-1f1ea.svg","flag_yt":"1f1fe-1f1f9.svg","flag_za":"1f1ff-1f1e6.svg","flag_zm":"1f1ff-1f1f2.svg","flag_zw":"1f1ff-1f1fc.svg","flags":"1f38f.svg","flamingo":"1f9a9.svg","flashlight":"1f526.svg","flatbread":"1fad3.svg","fleur-de-lis":"269c.svg","floppy_disk":"1f4be.svg","flower_playing_cards":"1f3b4.svg","flushed":"1f633.svg","fly":"1fab0.svg","flying_disc":"1f94f.svg","flying_saucer":"1f6f8.svg","fog":"1f32b.svg","foggy":"1f301.svg","fondue":"1fad5.svg","foot":"1f9b6.svg","foot_tone1":"1f9b6-1f3fb.svg","foot_tone2":"1f9b6-1f3fc.svg","foot_tone3":"1f9b6-1f3fd.svg","foot_tone4":"1f9b6-1f3fe.svg","foot_tone5":"1f9b6-1f3ff.svg","football":"1f3c8.svg","footprints":"1f463.svg","fork_and_knife":"1f374.svg","fork_knife_plate":"1f37d.svg","fortune_cookie":"1f960.svg","fountain":"26f2.svg","four":"34-20e3.svg","four_leaf_clover":"1f340.svg","fox":"1f98a.svg","frame_photo":"1f5bc.svg","free":"1f193.svg","french_bread":"1f956.svg","fried_shrimp":"1f364.svg","fries":"1f35f.svg","frog":"1f438.svg","frowning2":"2639.svg","frowning":"1f626.svg","fuelpump":"26fd.svg","full_moon":"1f315.svg","full_moon_with_face":"1f31d.svg","game_die":"1f3b2.svg","garlic":"1f9c4.svg","gear":"2699.svg","gem":"1f48e.svg","gemini":"264a.svg","genie":"1f9de.svg","ghost":"1f47b.svg","gift":"1f381.svg","gift_heart":"1f49d.svg","giraffe":"1f992.svg","girl":"1f467.svg","girl_tone1":"1f467-1f3fb.svg","girl_tone2":"1f467-1f3fc.svg","girl_tone3":"1f467-1f3fd.svg","girl_tone4":"1f467-1f3fe.svg","girl_tone5":"1f467-1f3ff.svg","globe_with_meridians":"1f310.svg","gloves":"1f9e4.svg","goal":"1f945.svg","goat":"1f410.svg","goggles":"1f97d.svg","golf":"26f3.svg","gorilla":"1f98d.svg","grapes":"1f347.svg","green_apple":"1f34f.svg","green_book":"1f4d7.svg","green_circle":"1f7e2.svg","green_heart":"1f49a.svg","green_square":"1f7e9.svg","grey_exclamation":"2755.svg","grey_question":"2754.svg","grimacing":"1f62c.svg","grin":"1f601.svg","grinning":"1f600.svg","guard":"1f482.svg","guard_tone1":"1f482-1f3fb.svg","guard_tone2":"1f482-1f3fc.svg","guard_tone3":"1f482-1f3fd.svg","guard_tone4":"1f482-1f3fe.svg","guard_tone5":"1f482-1f3ff.svg","guide_dog":"1f9ae.svg","guitar":"1f3b8.svg","gun":"1f52b.svg","hamburger":"1f354.svg","hammer":"1f528.svg","hammer_pick":"2692.svg","hamster":"1f439.svg","hand_splayed":"1f590.svg","hand_splayed_tone1":"1f590-1f3fb.svg","hand_splayed_tone2":"1f590-1f3fc.svg","hand_splayed_tone3":"1f590-1f3fd.svg","hand_splayed_tone4":"1f590-1f3fe.svg","hand_splayed_tone5":"1f590-1f3ff.svg","handbag":"1f45c.svg","handshake":"1f91d.svg","hash":"23-20e3.svg","hatched_chick":"1f425.svg","hatching_chick":"1f423.svg","head_bandage":"1f915.svg","headphones":"1f3a7.svg","headstone":"1faa6.svg","health_worker":"1f9d1-200d-2695-fe0f.svg","health_worker_tone1":"1f9d1-1f3fb-200d-2695-fe0f.svg","health_worker_tone2":"1f9d1-1f3fc-200d-2695-fe0f.svg","health_worker_tone3":"1f9d1-1f3fd-200d-2695-fe0f.svg","health_worker_tone4":"1f9d1-1f3fe-200d-2695-fe0f.svg","health_worker_tone5":"1f9d1-1f3ff-200d-2695-fe0f.svg","hear_no_evil":"1f649.svg","heart":"2764.svg","heart_decoration":"1f49f.svg","heart_exclamation":"2763.svg","heart_eyes":"1f60d.svg","heart_eyes_cat":"1f63b.svg","heart_on_fire":"2764-fe0f-200d-1f525.svg","heartbeat":"1f493.svg","heartpulse":"1f497.svg","hearts":"2665.svg","heavy_check_mark":"2714.svg","heavy_division_sign":"2797.svg","heavy_dollar_sign":"1f4b2.svg","heavy_minus_sign":"2796.svg","heavy_multiplication_x":"2716.svg","heavy_plus_sign":"2795.svg","hedgehog":"1f994.svg","helicopter":"1f681.svg","helmet_with_cross":"26d1.svg","herb":"1f33f.svg","hibiscus":"1f33a.svg","high_brightness":"1f506.svg","high_heel":"1f460.svg","hiking_boot":"1f97e.svg","hindu_temple":"1f6d5.svg","hippopotamus":"1f99b.svg","hockey":"1f3d2.svg","hole":"1f573.svg","homes":"1f3d8.svg","honey_pot":"1f36f.svg","hook":"1fa9d.svg","horse":"1f434.svg","horse_racing":"1f3c7.svg","horse_racing_tone1":"1f3c7-1f3fb.svg","horse_racing_tone2":"1f3c7-1f3fc.svg","horse_racing_tone3":"1f3c7-1f3fd.svg","horse_racing_tone4":"1f3c7-1f3fe.svg","horse_racing_tone5":"1f3c7-1f3ff.svg","hospital":"1f3e5.svg","hot_face":"1f975.svg","hot_pepper":"1f336.svg","hotdog":"1f32d.svg","hotel":"1f3e8.svg","hotsprings":"2668.svg","hourglass":"231b.svg","hourglass_flowing_sand":"23f3.svg","house":"1f3e0.svg","house_abandoned":"1f3da.svg","house_with_garden":"1f3e1.svg","hugging":"1f917.svg","hushed":"1f62f.svg","hut":"1f6d6.svg","ice_cream":"1f368.svg","ice_cube":"1f9ca.svg","ice_skate":"26f8.svg","icecream":"1f366.svg","id":"1f194.svg","ideograph_advantage":"1f250.svg","imp":"1f47f.svg","inbox_tray":"1f4e5.svg","incoming_envelope":"1f4e8.svg","infinity":"267e.svg","information_source":"2139.svg","innocent":"1f607.svg","interrobang":"2049.svg","island":"1f3dd.svg","izakaya_lantern":"1f3ee.svg","jack_o_lantern":"1f383.svg","japan":"1f5fe.svg","japanese_castle":"1f3ef.svg","japanese_goblin":"1f47a.svg","japanese_ogre":"1f479.svg","jeans":"1f456.svg","jigsaw":"1f9e9.svg","joy":"1f602.svg","joy_cat":"1f639.svg","joystick":"1f579.svg","judge":"1f9d1-200d-2696-fe0f.svg","judge_tone1":"1f9d1-1f3fb-200d-2696-fe0f.svg","judge_tone2":"1f9d1-1f3fc-200d-2696-fe0f.svg","judge_tone3":"1f9d1-1f3fd-200d-2696-fe0f.svg","judge_tone4":"1f9d1-1f3fe-200d-2696-fe0f.svg","judge_tone5":"1f9d1-1f3ff-200d-2696-fe0f.svg","kaaba":"1f54b.svg","kangaroo":"1f998.svg","key2":"1f5dd.svg","key":"1f511.svg","keyboard":"2328.svg","keycap_ten":"1f51f.svg","kimono":"1f458.svg","kiss":"1f48b.svg","kiss_man_man_tone1":"1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg","kiss_man_man_tone1_tone2":"1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg","kiss_man_man_tone1_tone3":"1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg","kiss_man_man_tone1_tone4":"1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg","kiss_man_man_tone1_tone5":"1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg","kiss_man_man_tone2":"1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg","kiss_man_man_tone2_tone1":"1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg","kiss_man_man_tone2_tone3":"1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg","kiss_man_man_tone2_tone4":"1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg","kiss_man_man_tone2_tone5":"1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg","kiss_man_man_tone3":"1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg","kiss_man_man_tone3_tone1":"1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg","kiss_man_man_tone3_tone2":"1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg","kiss_man_man_tone3_tone4":"1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg","kiss_man_man_tone3_tone5":"1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg","kiss_man_man_tone4":"1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg","kiss_man_man_tone4_tone1":"1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg","kiss_man_man_tone4_tone2":"1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg","kiss_man_man_tone4_tone3":"1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg","kiss_man_man_tone4_tone5":"1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg","kiss_man_man_tone5":"1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg","kiss_man_man_tone5_tone1":"1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg","kiss_man_man_tone5_tone2":"1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg","kiss_man_man_tone5_tone3":"1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg","kiss_man_man_tone5_tone4":"1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg","kiss_mm":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg","kiss_person_person_tone1_tone2":"1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg","kiss_person_person_tone1_tone3":"1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg","kiss_person_person_tone1_tone4":"1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg","kiss_person_person_tone1_tone5":"1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg","kiss_person_person_tone2_tone1":"1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg","kiss_person_person_tone2_tone3":"1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg","kiss_person_person_tone2_tone4":"1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg","kiss_person_person_tone2_tone5":"1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg","kiss_person_person_tone3_tone1":"1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg","kiss_person_person_tone3_tone2":"1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg","kiss_person_person_tone3_tone4":"1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg","kiss_person_person_tone3_tone5":"1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg","kiss_person_person_tone4_tone1":"1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg","kiss_person_person_tone4_tone2":"1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg","kiss_person_person_tone4_tone3":"1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg","kiss_person_person_tone4_tone5":"1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg","kiss_person_person_tone5_tone1":"1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg","kiss_person_person_tone5_tone2":"1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg","kiss_person_person_tone5_tone3":"1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg","kiss_person_person_tone5_tone4":"1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg","kiss_tone1":"1f48f-1f3fb.svg","kiss_tone2":"1f48f-1f3fc.svg","kiss_tone3":"1f48f-1f3fd.svg","kiss_tone4":"1f48f-1f3fe.svg","kiss_tone5":"1f48f-1f3ff.svg","kiss_woman_man":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg","kiss_woman_man_tone1":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg","kiss_woman_man_tone1_tone2":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg","kiss_woman_man_tone1_tone3":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg","kiss_woman_man_tone1_tone4":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg","kiss_woman_man_tone1_tone5":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg","kiss_woman_man_tone2":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg","kiss_woman_man_tone2_tone1":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg","kiss_woman_man_tone2_tone3":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg","kiss_woman_man_tone2_tone4":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg","kiss_woman_man_tone2_tone5":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg","kiss_woman_man_tone3":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg","kiss_woman_man_tone3_tone1":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg","kiss_woman_man_tone3_tone2":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg","kiss_woman_man_tone3_tone4":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg","kiss_woman_man_tone3_tone5":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg","kiss_woman_man_tone4":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg","kiss_woman_man_tone4_tone1":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg","kiss_woman_man_tone4_tone2":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg","kiss_woman_man_tone4_tone3":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg","kiss_woman_man_tone4_tone5":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg","kiss_woman_man_tone5":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg","kiss_woman_man_tone5_tone1":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg","kiss_woman_man_tone5_tone2":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg","kiss_woman_man_tone5_tone3":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg","kiss_woman_man_tone5_tone4":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg","kiss_woman_woman_tone1":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg","kiss_woman_woman_tone1_tone2":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg","kiss_woman_woman_tone1_tone3":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg","kiss_woman_woman_tone1_tone4":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg","kiss_woman_woman_tone1_tone5":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg","kiss_woman_woman_tone2":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg","kiss_woman_woman_tone2_tone1":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg","kiss_woman_woman_tone2_tone3":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg","kiss_woman_woman_tone2_tone4":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg","kiss_woman_woman_tone2_tone5":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg","kiss_woman_woman_tone3":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg","kiss_woman_woman_tone3_tone1":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg","kiss_woman_woman_tone3_tone2":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg","kiss_woman_woman_tone3_tone4":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg","kiss_woman_woman_tone3_tone5":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg","kiss_woman_woman_tone4":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg","kiss_woman_woman_tone4_tone1":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg","kiss_woman_woman_tone4_tone2":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg","kiss_woman_woman_tone4_tone3":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg","kiss_woman_woman_tone4_tone5":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg","kiss_woman_woman_tone5":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg","kiss_woman_woman_tone5_tone1":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg","kiss_woman_woman_tone5_tone2":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg","kiss_woman_woman_tone5_tone3":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg","kiss_woman_woman_tone5_tone4":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg","kiss_ww":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg","kissing":"1f617.svg","kissing_cat":"1f63d.svg","kissing_closed_eyes":"1f61a.svg","kissing_heart":"1f618.svg","kissing_smiling_eyes":"1f619.svg","kite":"1fa81.svg","kiwi":"1f95d.svg","knife":"1f52a.svg","knot":"1faa2.svg","koala":"1f428.svg","koko":"1f201.svg","lab_coat":"1f97c.svg","label":"1f3f7.svg","lacrosse":"1f94d.svg","ladder":"1fa9c.svg","lady_beetle":"1f41e.svg","large_blue_diamond":"1f537.svg","large_orange_diamond":"1f536.svg","last_quarter_moon":"1f317.svg","last_quarter_moon_with_face":"1f31c.svg","laughing":"1f606.svg","leafy_green":"1f96c.svg","leaves":"1f343.svg","ledger":"1f4d2.svg","left_facing_fist":"1f91b.svg","left_facing_fist_tone1":"1f91b-1f3fb.svg","left_facing_fist_tone2":"1f91b-1f3fc.svg","left_facing_fist_tone3":"1f91b-1f3fd.svg","left_facing_fist_tone4":"1f91b-1f3fe.svg","left_facing_fist_tone5":"1f91b-1f3ff.svg","left_luggage":"1f6c5.svg","left_right_arrow":"2194.svg","leftwards_arrow_with_hook":"21a9.svg","leg":"1f9b5.svg","leg_tone1":"1f9b5-1f3fb.svg","leg_tone2":"1f9b5-1f3fc.svg","leg_tone3":"1f9b5-1f3fd.svg","leg_tone4":"1f9b5-1f3fe.svg","leg_tone5":"1f9b5-1f3ff.svg","lemon":"1f34b.svg","leo":"264c.svg","leopard":"1f406.svg","level_slider":"1f39a.svg","levitate":"1f574.svg","levitate_tone1":"1f574-1f3fb.svg","levitate_tone2":"1f574-1f3fc.svg","levitate_tone3":"1f574-1f3fd.svg","levitate_tone4":"1f574-1f3fe.svg","levitate_tone5":"1f574-1f3ff.svg","libra":"264e.svg","light_rail":"1f688.svg","link":"1f517.svg","lion_face":"1f981.svg","lips":"1f444.svg","lipstick":"1f484.svg","lizard":"1f98e.svg","llama":"1f999.svg","lobster":"1f99e.svg","lock":"1f512.svg","lock_with_ink_pen":"1f50f.svg","lollipop":"1f36d.svg","long_drum":"1fa98.svg","loop":"27bf.svg","loud_sound":"1f50a.svg","loudspeaker":"1f4e2.svg","love_hotel":"1f3e9.svg","love_letter":"1f48c.svg","love_you_gesture":"1f91f.svg","love_you_gesture_tone1":"1f91f-1f3fb.svg","love_you_gesture_tone2":"1f91f-1f3fc.svg","love_you_gesture_tone3":"1f91f-1f3fd.svg","love_you_gesture_tone4":"1f91f-1f3fe.svg","love_you_gesture_tone5":"1f91f-1f3ff.svg","low_brightness":"1f505.svg","luggage":"1f9f3.svg","lungs":"1fac1.svg","lying_face":"1f925.svg","m":"24c2.svg","mag":"1f50d.svg","mag_right":"1f50e.svg","mage":"1f9d9.svg","mage_tone1":"1f9d9-1f3fb.svg","mage_tone2":"1f9d9-1f3fc.svg","mage_tone3":"1f9d9-1f3fd.svg","mage_tone4":"1f9d9-1f3fe.svg","mage_tone5":"1f9d9-1f3ff.svg","magic_wand":"1fa84.svg","magnet":"1f9f2.svg","mahjong":"1f004.svg","mailbox":"1f4eb.svg","mailbox_closed":"1f4ea.svg","mailbox_with_mail":"1f4ec.svg","mailbox_with_no_mail":"1f4ed.svg","male_sign":"2642.svg","mammoth":"1f9a3.svg","man":"1f468.svg","man_artist":"1f468-200d-1f3a8.svg","man_artist_tone1":"1f468-1f3fb-200d-1f3a8.svg","man_artist_tone2":"1f468-1f3fc-200d-1f3a8.svg","man_artist_tone3":"1f468-1f3fd-200d-1f3a8.svg","man_artist_tone4":"1f468-1f3fe-200d-1f3a8.svg","man_artist_tone5":"1f468-1f3ff-200d-1f3a8.svg","man_astronaut":"1f468-200d-1f680.svg","man_astronaut_tone1":"1f468-1f3fb-200d-1f680.svg","man_astronaut_tone2":"1f468-1f3fc-200d-1f680.svg","man_astronaut_tone3":"1f468-1f3fd-200d-1f680.svg","man_astronaut_tone4":"1f468-1f3fe-200d-1f680.svg","man_astronaut_tone5":"1f468-1f3ff-200d-1f680.svg","man_bald":"1f468-200d-1f9b2.svg","man_bald_tone1":"1f468-1f3fb-200d-1f9b2.svg","man_bald_tone2":"1f468-1f3fc-200d-1f9b2.svg","man_bald_tone3":"1f468-1f3fd-200d-1f9b2.svg","man_bald_tone4":"1f468-1f3fe-200d-1f9b2.svg","man_bald_tone5":"1f468-1f3ff-200d-1f9b2.svg","man_beard":"1f9d4-200d-2642-fe0f.svg","man_biking":"1f6b4-200d-2642-fe0f.svg","man_biking_tone1":"1f6b4-1f3fb-200d-2642-fe0f.svg","man_biking_tone2":"1f6b4-1f3fc-200d-2642-fe0f.svg","man_biking_tone3":"1f6b4-1f3fd-200d-2642-fe0f.svg","man_biking_tone4":"1f6b4-1f3fe-200d-2642-fe0f.svg","man_biking_tone5":"1f6b4-1f3ff-200d-2642-fe0f.svg","man_bouncing_ball":"26f9-fe0f-200d-2642-fe0f.svg","man_bouncing_ball_tone1":"26f9-1f3fb-200d-2642-fe0f.svg","man_bouncing_ball_tone2":"26f9-1f3fc-200d-2642-fe0f.svg","man_bouncing_ball_tone3":"26f9-1f3fd-200d-2642-fe0f.svg","man_bouncing_ball_tone4":"26f9-1f3fe-200d-2642-fe0f.svg","man_bouncing_ball_tone5":"26f9-1f3ff-200d-2642-fe0f.svg","man_bowing":"1f647-200d-2642-fe0f.svg","man_bowing_tone1":"1f647-1f3fb-200d-2642-fe0f.svg","man_bowing_tone2":"1f647-1f3fc-200d-2642-fe0f.svg","man_bowing_tone3":"1f647-1f3fd-200d-2642-fe0f.svg","man_bowing_tone4":"1f647-1f3fe-200d-2642-fe0f.svg","man_bowing_tone5":"1f647-1f3ff-200d-2642-fe0f.svg","man_cartwheeling":"1f938-200d-2642-fe0f.svg","man_cartwheeling_tone1":"1f938-1f3fb-200d-2642-fe0f.svg","man_cartwheeling_tone2":"1f938-1f3fc-200d-2642-fe0f.svg","man_cartwheeling_tone3":"1f938-1f3fd-200d-2642-fe0f.svg","man_cartwheeling_tone4":"1f938-1f3fe-200d-2642-fe0f.svg","man_cartwheeling_tone5":"1f938-1f3ff-200d-2642-fe0f.svg","man_climbing":"1f9d7-200d-2642-fe0f.svg","man_climbing_tone1":"1f9d7-1f3fb-200d-2642-fe0f.svg","man_climbing_tone2":"1f9d7-1f3fc-200d-2642-fe0f.svg","man_climbing_tone3":"1f9d7-1f3fd-200d-2642-fe0f.svg","man_climbing_tone4":"1f9d7-1f3fe-200d-2642-fe0f.svg","man_climbing_tone5":"1f9d7-1f3ff-200d-2642-fe0f.svg","man_construction_worker":"1f477-200d-2642-fe0f.svg","man_construction_worker_tone1":"1f477-1f3fb-200d-2642-fe0f.svg","man_construction_worker_tone2":"1f477-1f3fc-200d-2642-fe0f.svg","man_construction_worker_tone3":"1f477-1f3fd-200d-2642-fe0f.svg","man_construction_worker_tone4":"1f477-1f3fe-200d-2642-fe0f.svg","man_construction_worker_tone5":"1f477-1f3ff-200d-2642-fe0f.svg","man_cook":"1f468-200d-1f373.svg","man_cook_tone1":"1f468-1f3fb-200d-1f373.svg","man_cook_tone2":"1f468-1f3fc-200d-1f373.svg","man_cook_tone3":"1f468-1f3fd-200d-1f373.svg","man_cook_tone4":"1f468-1f3fe-200d-1f373.svg","man_cook_tone5":"1f468-1f3ff-200d-1f373.svg","man_curly_haired":"1f468-200d-1f9b1.svg","man_curly_haired_tone1":"1f468-1f3fb-200d-1f9b1.svg","man_curly_haired_tone2":"1f468-1f3fc-200d-1f9b1.svg","man_curly_haired_tone3":"1f468-1f3fd-200d-1f9b1.svg","man_curly_haired_tone4":"1f468-1f3fe-200d-1f9b1.svg","man_curly_haired_tone5":"1f468-1f3ff-200d-1f9b1.svg","man_dancing":"1f57a.svg","man_dancing_tone1":"1f57a-1f3fb.svg","man_dancing_tone2":"1f57a-1f3fc.svg","man_dancing_tone3":"1f57a-1f3fd.svg","man_dancing_tone4":"1f57a-1f3fe.svg","man_dancing_tone5":"1f57a-1f3ff.svg","man_detective":"1f575-fe0f-200d-2642-fe0f.svg","man_detective_tone1":"1f575-1f3fb-200d-2642-fe0f.svg","man_detective_tone2":"1f575-1f3fc-200d-2642-fe0f.svg","man_detective_tone3":"1f575-1f3fd-200d-2642-fe0f.svg","man_detective_tone4":"1f575-1f3fe-200d-2642-fe0f.svg","man_detective_tone5":"1f575-1f3ff-200d-2642-fe0f.svg","man_elf":"1f9dd-200d-2642-fe0f.svg","man_elf_tone1":"1f9dd-1f3fb-200d-2642-fe0f.svg","man_elf_tone2":"1f9dd-1f3fc-200d-2642-fe0f.svg","man_elf_tone3":"1f9dd-1f3fd-200d-2642-fe0f.svg","man_elf_tone4":"1f9dd-1f3fe-200d-2642-fe0f.svg","man_elf_tone5":"1f9dd-1f3ff-200d-2642-fe0f.svg","man_facepalming":"1f926-200d-2642-fe0f.svg","man_facepalming_tone1":"1f926-1f3fb-200d-2642-fe0f.svg","man_facepalming_tone2":"1f926-1f3fc-200d-2642-fe0f.svg","man_facepalming_tone3":"1f926-1f3fd-200d-2642-fe0f.svg","man_facepalming_tone4":"1f926-1f3fe-200d-2642-fe0f.svg","man_facepalming_tone5":"1f926-1f3ff-200d-2642-fe0f.svg","man_factory_worker":"1f468-200d-1f3ed.svg","man_factory_worker_tone1":"1f468-1f3fb-200d-1f3ed.svg","man_factory_worker_tone2":"1f468-1f3fc-200d-1f3ed.svg","man_factory_worker_tone3":"1f468-1f3fd-200d-1f3ed.svg","man_factory_worker_tone4":"1f468-1f3fe-200d-1f3ed.svg","man_factory_worker_tone5":"1f468-1f3ff-200d-1f3ed.svg","man_fairy":"1f9da-200d-2642-fe0f.svg","man_fairy_tone1":"1f9da-1f3fb-200d-2642-fe0f.svg","man_fairy_tone2":"1f9da-1f3fc-200d-2642-fe0f.svg","man_fairy_tone3":"1f9da-1f3fd-200d-2642-fe0f.svg","man_fairy_tone4":"1f9da-1f3fe-200d-2642-fe0f.svg","man_fairy_tone5":"1f9da-1f3ff-200d-2642-fe0f.svg","man_farmer":"1f468-200d-1f33e.svg","man_farmer_tone1":"1f468-1f3fb-200d-1f33e.svg","man_farmer_tone2":"1f468-1f3fc-200d-1f33e.svg","man_farmer_tone3":"1f468-1f3fd-200d-1f33e.svg","man_farmer_tone4":"1f468-1f3fe-200d-1f33e.svg","man_farmer_tone5":"1f468-1f3ff-200d-1f33e.svg","man_feeding_baby":"1f468-200d-1f37c.svg","man_feeding_baby_tone1":"1f468-1f3fb-200d-1f37c.svg","man_feeding_baby_tone2":"1f468-1f3fc-200d-1f37c.svg","man_feeding_baby_tone3":"1f468-1f3fd-200d-1f37c.svg","man_feeding_baby_tone4":"1f468-1f3fe-200d-1f37c.svg","man_feeding_baby_tone5":"1f468-1f3ff-200d-1f37c.svg","man_firefighter":"1f468-200d-1f692.svg","man_firefighter_tone1":"1f468-1f3fb-200d-1f692.svg","man_firefighter_tone2":"1f468-1f3fc-200d-1f692.svg","man_firefighter_tone3":"1f468-1f3fd-200d-1f692.svg","man_firefighter_tone4":"1f468-1f3fe-200d-1f692.svg","man_firefighter_tone5":"1f468-1f3ff-200d-1f692.svg","man_frowning":"1f64d-200d-2642-fe0f.svg","man_frowning_tone1":"1f64d-1f3fb-200d-2642-fe0f.svg","man_frowning_tone2":"1f64d-1f3fc-200d-2642-fe0f.svg","man_frowning_tone3":"1f64d-1f3fd-200d-2642-fe0f.svg","man_frowning_tone4":"1f64d-1f3fe-200d-2642-fe0f.svg","man_frowning_tone5":"1f64d-1f3ff-200d-2642-fe0f.svg","man_genie":"1f9de-200d-2642-fe0f.svg","man_gesturing_no":"1f645-200d-2642-fe0f.svg","man_gesturing_no_tone1":"1f645-1f3fb-200d-2642-fe0f.svg","man_gesturing_no_tone2":"1f645-1f3fc-200d-2642-fe0f.svg","man_gesturing_no_tone3":"1f645-1f3fd-200d-2642-fe0f.svg","man_gesturing_no_tone4":"1f645-1f3fe-200d-2642-fe0f.svg","man_gesturing_no_tone5":"1f645-1f3ff-200d-2642-fe0f.svg","man_gesturing_ok":"1f646-200d-2642-fe0f.svg","man_gesturing_ok_tone1":"1f646-1f3fb-200d-2642-fe0f.svg","man_gesturing_ok_tone2":"1f646-1f3fc-200d-2642-fe0f.svg","man_gesturing_ok_tone3":"1f646-1f3fd-200d-2642-fe0f.svg","man_gesturing_ok_tone4":"1f646-1f3fe-200d-2642-fe0f.svg","man_gesturing_ok_tone5":"1f646-1f3ff-200d-2642-fe0f.svg","man_getting_face_massage":"1f486-200d-2642-fe0f.svg","man_getting_face_massage_tone1":"1f486-1f3fb-200d-2642-fe0f.svg","man_getting_face_massage_tone2":"1f486-1f3fc-200d-2642-fe0f.svg","man_getting_face_massage_tone3":"1f486-1f3fd-200d-2642-fe0f.svg","man_getting_face_massage_tone4":"1f486-1f3fe-200d-2642-fe0f.svg","man_getting_face_massage_tone5":"1f486-1f3ff-200d-2642-fe0f.svg","man_getting_haircut":"1f487-200d-2642-fe0f.svg","man_getting_haircut_tone1":"1f487-1f3fb-200d-2642-fe0f.svg","man_getting_haircut_tone2":"1f487-1f3fc-200d-2642-fe0f.svg","man_getting_haircut_tone3":"1f487-1f3fd-200d-2642-fe0f.svg","man_getting_haircut_tone4":"1f487-1f3fe-200d-2642-fe0f.svg","man_getting_haircut_tone5":"1f487-1f3ff-200d-2642-fe0f.svg","man_golfing":"1f3cc-fe0f-200d-2642-fe0f.svg","man_golfing_tone1":"1f3cc-1f3fb-200d-2642-fe0f.svg","man_golfing_tone2":"1f3cc-1f3fc-200d-2642-fe0f.svg","man_golfing_tone3":"1f3cc-1f3fd-200d-2642-fe0f.svg","man_golfing_tone4":"1f3cc-1f3fe-200d-2642-fe0f.svg","man_golfing_tone5":"1f3cc-1f3ff-200d-2642-fe0f.svg","man_guard":"1f482-200d-2642-fe0f.svg","man_guard_tone1":"1f482-1f3fb-200d-2642-fe0f.svg","man_guard_tone2":"1f482-1f3fc-200d-2642-fe0f.svg","man_guard_tone3":"1f482-1f3fd-200d-2642-fe0f.svg","man_guard_tone4":"1f482-1f3fe-200d-2642-fe0f.svg","man_guard_tone5":"1f482-1f3ff-200d-2642-fe0f.svg","man_health_worker":"1f468-200d-2695-fe0f.svg","man_health_worker_tone1":"1f468-1f3fb-200d-2695-fe0f.svg","man_health_worker_tone2":"1f468-1f3fc-200d-2695-fe0f.svg","man_health_worker_tone3":"1f468-1f3fd-200d-2695-fe0f.svg","man_health_worker_tone4":"1f468-1f3fe-200d-2695-fe0f.svg","man_health_worker_tone5":"1f468-1f3ff-200d-2695-fe0f.svg","man_in_lotus_position":"1f9d8-200d-2642-fe0f.svg","man_in_lotus_position_tone1":"1f9d8-1f3fb-200d-2642-fe0f.svg","man_in_lotus_position_tone2":"1f9d8-1f3fc-200d-2642-fe0f.svg","man_in_lotus_position_tone3":"1f9d8-1f3fd-200d-2642-fe0f.svg","man_in_lotus_position_tone4":"1f9d8-1f3fe-200d-2642-fe0f.svg","man_in_lotus_position_tone5":"1f9d8-1f3ff-200d-2642-fe0f.svg","man_in_manual_wheelchair":"1f468-200d-1f9bd.svg","man_in_manual_wheelchair_tone1":"1f468-1f3fb-200d-1f9bd.svg","man_in_manual_wheelchair_tone2":"1f468-1f3fc-200d-1f9bd.svg","man_in_manual_wheelchair_tone3":"1f468-1f3fd-200d-1f9bd.svg","man_in_manual_wheelchair_tone4":"1f468-1f3fe-200d-1f9bd.svg","man_in_manual_wheelchair_tone5":"1f468-1f3ff-200d-1f9bd.svg","man_in_motorized_wheelchair":"1f468-200d-1f9bc.svg","man_in_motorized_wheelchair_tone1":"1f468-1f3fb-200d-1f9bc.svg","man_in_motorized_wheelchair_tone2":"1f468-1f3fc-200d-1f9bc.svg","man_in_motorized_wheelchair_tone3":"1f468-1f3fd-200d-1f9bc.svg","man_in_motorized_wheelchair_tone4":"1f468-1f3fe-200d-1f9bc.svg","man_in_motorized_wheelchair_tone5":"1f468-1f3ff-200d-1f9bc.svg","man_in_santa_hat":"1f468-200d-1f384.svg","man_in_santa_hat_tone1":"1f468-1f3fb-200d-1f384.svg","man_in_santa_hat_tone2":"1f468-1f3fc-200d-1f384.svg","man_in_santa_hat_tone3":"1f468-1f3fd-200d-1f384.svg","man_in_santa_hat_tone4":"1f468-1f3fe-200d-1f384.svg","man_in_santa_hat_tone5":"1f469-1f3ff-200d-1f384.svg","man_in_steamy_room":"1f9d6-200d-2642-fe0f.svg","man_in_steamy_room_tone1":"1f9d6-1f3fb-200d-2642-fe0f.svg","man_in_steamy_room_tone2":"1f9d6-1f3fc-200d-2642-fe0f.svg","man_in_steamy_room_tone3":"1f9d6-1f3fd-200d-2642-fe0f.svg","man_in_steamy_room_tone4":"1f9d6-1f3fe-200d-2642-fe0f.svg","man_in_steamy_room_tone5":"1f9d6-1f3ff-200d-2642-fe0f.svg","man_in_tuxedo":"1f935-200d-2642-fe0f.svg","man_in_tuxedo_tone1":"1f935-1f3fb-200d-2642-fe0f.svg","man_in_tuxedo_tone2":"1f935-1f3fc-200d-2642-fe0f.svg","man_in_tuxedo_tone3":"1f935-1f3fd-200d-2642-fe0f.svg","man_in_tuxedo_tone4":"1f935-1f3fe-200d-2642-fe0f.svg","man_in_tuxedo_tone5":"1f935-1f3ff-200d-2642-fe0f.svg","man_judge":"1f468-200d-2696-fe0f.svg","man_judge_tone1":"1f468-1f3fb-200d-2696-fe0f.svg","man_judge_tone2":"1f468-1f3fc-200d-2696-fe0f.svg","man_judge_tone3":"1f468-1f3fd-200d-2696-fe0f.svg","man_judge_tone4":"1f468-1f3fe-200d-2696-fe0f.svg","man_judge_tone5":"1f468-1f3ff-200d-2696-fe0f.svg","man_juggling":"1f939-200d-2642-fe0f.svg","man_juggling_tone1":"1f939-1f3fb-200d-2642-fe0f.svg","man_juggling_tone2":"1f939-1f3fc-200d-2642-fe0f.svg","man_juggling_tone3":"1f939-1f3fd-200d-2642-fe0f.svg","man_juggling_tone4":"1f939-1f3fe-200d-2642-fe0f.svg","man_juggling_tone5":"1f939-1f3ff-200d-2642-fe0f.svg","man_kneeling":"1f9ce-200d-2642-fe0f.svg","man_kneeling_tone1":"1f9ce-1f3fb-200d-2642-fe0f.svg","man_kneeling_tone2":"1f9ce-1f3fc-200d-2642-fe0f.svg","man_kneeling_tone3":"1f9ce-1f3fd-200d-2642-fe0f.svg","man_kneeling_tone4":"1f9ce-1f3fe-200d-2642-fe0f.svg","man_kneeling_tone5":"1f9ce-1f3ff-200d-2642-fe0f.svg","man_lifting_weights":"1f3cb-fe0f-200d-2642-fe0f.svg","man_lifting_weights_tone1":"1f3cb-1f3fb-200d-2642-fe0f.svg","man_lifting_weights_tone2":"1f3cb-1f3fc-200d-2642-fe0f.svg","man_lifting_weights_tone3":"1f3cb-1f3fd-200d-2642-fe0f.svg","man_lifting_weights_tone4":"1f3cb-1f3fe-200d-2642-fe0f.svg","man_lifting_weights_tone5":"1f3cb-1f3ff-200d-2642-fe0f.svg","man_mage":"1f9d9-200d-2642-fe0f.svg","man_mage_tone1":"1f9d9-1f3fb-200d-2642-fe0f.svg","man_mage_tone2":"1f9d9-1f3fc-200d-2642-fe0f.svg","man_mage_tone3":"1f9d9-1f3fd-200d-2642-fe0f.svg","man_mage_tone4":"1f9d9-1f3fe-200d-2642-fe0f.svg","man_mage_tone5":"1f9d9-1f3ff-200d-2642-fe0f.svg","man_mechanic":"1f468-200d-1f527.svg","man_mechanic_tone1":"1f468-1f3fb-200d-1f527.svg","man_mechanic_tone2":"1f468-1f3fc-200d-1f527.svg","man_mechanic_tone3":"1f468-1f3fd-200d-1f527.svg","man_mechanic_tone4":"1f468-1f3fe-200d-1f527.svg","man_mechanic_tone5":"1f468-1f3ff-200d-1f527.svg","man_mountain_biking":"1f6b5-200d-2642-fe0f.svg","man_mountain_biking_tone1":"1f6b5-1f3fb-200d-2642-fe0f.svg","man_mountain_biking_tone2":"1f6b5-1f3fc-200d-2642-fe0f.svg","man_mountain_biking_tone3":"1f6b5-1f3fd-200d-2642-fe0f.svg","man_mountain_biking_tone4":"1f6b5-1f3fe-200d-2642-fe0f.svg","man_mountain_biking_tone5":"1f6b5-1f3ff-200d-2642-fe0f.svg","man_office_worker":"1f468-200d-1f4bc.svg","man_office_worker_tone1":"1f468-1f3fb-200d-1f4bc.svg","man_office_worker_tone2":"1f468-1f3fc-200d-1f4bc.svg","man_office_worker_tone3":"1f468-1f3fd-200d-1f4bc.svg","man_office_worker_tone4":"1f468-1f3fe-200d-1f4bc.svg","man_office_worker_tone5":"1f468-1f3ff-200d-1f4bc.svg","man_pilot":"1f468-200d-2708-fe0f.svg","man_pilot_tone1":"1f468-1f3fb-200d-2708-fe0f.svg","man_pilot_tone2":"1f468-1f3fc-200d-2708-fe0f.svg","man_pilot_tone3":"1f468-1f3fd-200d-2708-fe0f.svg","man_pilot_tone4":"1f468-1f3fe-200d-2708-fe0f.svg","man_pilot_tone5":"1f468-1f3ff-200d-2708-fe0f.svg","man_playing_handball":"1f93e-200d-2642-fe0f.svg","man_playing_handball_tone1":"1f93e-1f3fb-200d-2642-fe0f.svg","man_playing_handball_tone2":"1f93e-1f3fc-200d-2642-fe0f.svg","man_playing_handball_tone3":"1f93e-1f3fd-200d-2642-fe0f.svg","man_playing_handball_tone4":"1f93e-1f3fe-200d-2642-fe0f.svg","man_playing_handball_tone5":"1f93e-1f3ff-200d-2642-fe0f.svg","man_playing_water_polo":"1f93d-200d-2642-fe0f.svg","man_playing_water_polo_tone1":"1f93d-1f3fb-200d-2642-fe0f.svg","man_playing_water_polo_tone2":"1f93d-1f3fc-200d-2642-fe0f.svg","man_playing_water_polo_tone3":"1f93d-1f3fd-200d-2642-fe0f.svg","man_playing_water_polo_tone4":"1f93d-1f3fe-200d-2642-fe0f.svg","man_playing_water_polo_tone5":"1f93d-1f3ff-200d-2642-fe0f.svg","man_police_officer":"1f46e-200d-2642-fe0f.svg","man_police_officer_tone1":"1f46e-1f3fb-200d-2642-fe0f.svg","man_police_officer_tone2":"1f46e-1f3fc-200d-2642-fe0f.svg","man_police_officer_tone3":"1f46e-1f3fd-200d-2642-fe0f.svg","man_police_officer_tone4":"1f46e-1f3fe-200d-2642-fe0f.svg","man_police_officer_tone5":"1f46e-1f3ff-200d-2642-fe0f.svg","man_pouting":"1f64e-200d-2642-fe0f.svg","man_pouting_tone1":"1f64e-1f3fb-200d-2642-fe0f.svg","man_pouting_tone2":"1f64e-1f3fc-200d-2642-fe0f.svg","man_pouting_tone3":"1f64e-1f3fd-200d-2642-fe0f.svg","man_pouting_tone4":"1f64e-1f3fe-200d-2642-fe0f.svg","man_pouting_tone5":"1f64e-1f3ff-200d-2642-fe0f.svg","man_raising_hand":"1f64b-200d-2642-fe0f.svg","man_raising_hand_tone1":"1f64b-1f3fb-200d-2642-fe0f.svg","man_raising_hand_tone2":"1f64b-1f3fc-200d-2642-fe0f.svg","man_raising_hand_tone3":"1f64b-1f3fd-200d-2642-fe0f.svg","man_raising_hand_tone4":"1f64b-1f3fe-200d-2642-fe0f.svg","man_raising_hand_tone5":"1f64b-1f3ff-200d-2642-fe0f.svg","man_red_haired":"1f468-200d-1f9b0.svg","man_red_haired_tone1":"1f468-1f3fb-200d-1f9b0.svg","man_red_haired_tone2":"1f468-1f3fc-200d-1f9b0.svg","man_red_haired_tone3":"1f468-1f3fd-200d-1f9b0.svg","man_red_haired_tone4":"1f468-1f3fe-200d-1f9b0.svg","man_red_haired_tone5":"1f468-1f3ff-200d-1f9b0.svg","man_rowing_boat":"1f6a3-200d-2642-fe0f.svg","man_rowing_boat_tone1":"1f6a3-1f3fb-200d-2642-fe0f.svg","man_rowing_boat_tone2":"1f6a3-1f3fc-200d-2642-fe0f.svg","man_rowing_boat_tone3":"1f6a3-1f3fd-200d-2642-fe0f.svg","man_rowing_boat_tone4":"1f6a3-1f3fe-200d-2642-fe0f.svg","man_rowing_boat_tone5":"1f6a3-1f3ff-200d-2642-fe0f.svg","man_running":"1f3c3-200d-2642-fe0f.svg","man_running_tone1":"1f3c3-1f3fb-200d-2642-fe0f.svg","man_running_tone2":"1f3c3-1f3fc-200d-2642-fe0f.svg","man_running_tone3":"1f3c3-1f3fd-200d-2642-fe0f.svg","man_running_tone4":"1f3c3-1f3fe-200d-2642-fe0f.svg","man_running_tone5":"1f3c3-1f3ff-200d-2642-fe0f.svg","man_scientist":"1f468-200d-1f52c.svg","man_scientist_tone1":"1f468-1f3fb-200d-1f52c.svg","man_scientist_tone2":"1f468-1f3fc-200d-1f52c.svg","man_scientist_tone3":"1f468-1f3fd-200d-1f52c.svg","man_scientist_tone4":"1f468-1f3fe-200d-1f52c.svg","man_scientist_tone5":"1f468-1f3ff-200d-1f52c.svg","man_shrugging":"1f937-200d-2642-fe0f.svg","man_shrugging_tone1":"1f937-1f3fb-200d-2642-fe0f.svg","man_shrugging_tone2":"1f937-1f3fc-200d-2642-fe0f.svg","man_shrugging_tone3":"1f937-1f3fd-200d-2642-fe0f.svg","man_shrugging_tone4":"1f937-1f3fe-200d-2642-fe0f.svg","man_shrugging_tone5":"1f937-1f3ff-200d-2642-fe0f.svg","man_singer":"1f468-200d-1f3a4.svg","man_singer_tone1":"1f468-1f3fb-200d-1f3a4.svg","man_singer_tone2":"1f468-1f3fc-200d-1f3a4.svg","man_singer_tone3":"1f468-1f3fd-200d-1f3a4.svg","man_singer_tone4":"1f468-1f3fe-200d-1f3a4.svg","man_singer_tone5":"1f468-1f3ff-200d-1f3a4.svg","man_standing":"1f9cd-200d-2642-fe0f.svg","man_standing_tone1":"1f9cd-1f3fb-200d-2642-fe0f.svg","man_standing_tone2":"1f9cd-1f3fc-200d-2642-fe0f.svg","man_standing_tone3":"1f9cd-1f3fd-200d-2642-fe0f.svg","man_standing_tone4":"1f9cd-1f3fe-200d-2642-fe0f.svg","man_standing_tone5":"1f9cd-1f3ff-200d-2642-fe0f.svg","man_student":"1f468-200d-1f393.svg","man_student_tone1":"1f468-1f3fb-200d-1f393.svg","man_student_tone2":"1f468-1f3fc-200d-1f393.svg","man_student_tone3":"1f468-1f3fd-200d-1f393.svg","man_student_tone4":"1f468-1f3fe-200d-1f393.svg","man_student_tone5":"1f468-1f3ff-200d-1f393.svg","man_superhero":"1f9b8-200d-2642-fe0f.svg","man_superhero_tone1":"1f9b8-1f3fb-200d-2642-fe0f.svg","man_superhero_tone2":"1f9b8-1f3fc-200d-2642-fe0f.svg","man_superhero_tone3":"1f9b8-1f3fd-200d-2642-fe0f.svg","man_superhero_tone4":"1f9b8-1f3fe-200d-2642-fe0f.svg","man_superhero_tone5":"1f9b8-1f3ff-200d-2642-fe0f.svg","man_supervillain":"1f9b9-200d-2642-fe0f.svg","man_supervillain_tone1":"1f9b9-1f3fb-200d-2642-fe0f.svg","man_supervillain_tone2":"1f9b9-1f3fc-200d-2642-fe0f.svg","man_supervillain_tone3":"1f9b9-1f3fd-200d-2642-fe0f.svg","man_supervillain_tone4":"1f9b9-1f3fe-200d-2642-fe0f.svg","man_supervillain_tone5":"1f9b9-1f3ff-200d-2642-fe0f.svg","man_surfing":"1f3c4-200d-2642-fe0f.svg","man_surfing_tone1":"1f3c4-1f3fb-200d-2642-fe0f.svg","man_surfing_tone2":"1f3c4-1f3fc-200d-2642-fe0f.svg","man_surfing_tone3":"1f3c4-1f3fd-200d-2642-fe0f.svg","man_surfing_tone4":"1f3c4-1f3fe-200d-2642-fe0f.svg","man_surfing_tone5":"1f3c4-1f3ff-200d-2642-fe0f.svg","man_swimming":"1f3ca-200d-2642-fe0f.svg","man_swimming_tone1":"1f3ca-1f3fb-200d-2642-fe0f.svg","man_swimming_tone2":"1f3ca-1f3fc-200d-2642-fe0f.svg","man_swimming_tone3":"1f3ca-1f3fd-200d-2642-fe0f.svg","man_swimming_tone4":"1f3ca-1f3fe-200d-2642-fe0f.svg","man_swimming_tone5":"1f3ca-1f3ff-200d-2642-fe0f.svg","man_teacher":"1f468-200d-1f3eb.svg","man_teacher_tone1":"1f468-1f3fb-200d-1f3eb.svg","man_teacher_tone2":"1f468-1f3fc-200d-1f3eb.svg","man_teacher_tone3":"1f468-1f3fd-200d-1f3eb.svg","man_teacher_tone4":"1f468-1f3fe-200d-1f3eb.svg","man_teacher_tone5":"1f468-1f3ff-200d-1f3eb.svg","man_technologist":"1f468-200d-1f4bb.svg","man_technologist_tone1":"1f468-1f3fb-200d-1f4bb.svg","man_technologist_tone2":"1f468-1f3fc-200d-1f4bb.svg","man_technologist_tone3":"1f468-1f3fd-200d-1f4bb.svg","man_technologist_tone4":"1f468-1f3fe-200d-1f4bb.svg","man_technologist_tone5":"1f468-1f3ff-200d-1f4bb.svg","man_tipping_hand":"1f481-200d-2642-fe0f.svg","man_tipping_hand_tone1":"1f481-1f3fb-200d-2642-fe0f.svg","man_tipping_hand_tone2":"1f481-1f3fc-200d-2642-fe0f.svg","man_tipping_hand_tone3":"1f481-1f3fd-200d-2642-fe0f.svg","man_tipping_hand_tone4":"1f481-1f3fe-200d-2642-fe0f.svg","man_tipping_hand_tone5":"1f481-1f3ff-200d-2642-fe0f.svg","man_tone1":"1f468-1f3fb.svg","man_tone1_beard":"1f9d4-1f3fb-200d-2642-fe0f.svg","man_tone2":"1f468-1f3fc.svg","man_tone2_beard":"1f9d4-1f3fc-200d-2642-fe0f.svg","man_tone3":"1f468-1f3fd.svg","man_tone3_beard":"1f9d4-1f3fd-200d-2642-fe0f.svg","man_tone4":"1f468-1f3fe.svg","man_tone4_beard":"1f9d4-1f3fe-200d-2642-fe0f.svg","man_tone5":"1f468-1f3ff.svg","man_tone5_beard":"1f9d4-1f3ff-200d-2642-fe0f.svg","man_vampire":"1f9db-200d-2642-fe0f.svg","man_vampire_tone1":"1f9db-1f3fb-200d-2642-fe0f.svg","man_vampire_tone2":"1f9db-1f3fc-200d-2642-fe0f.svg","man_vampire_tone3":"1f9db-1f3fd-200d-2642-fe0f.svg","man_vampire_tone4":"1f9db-1f3fe-200d-2642-fe0f.svg","man_vampire_tone5":"1f9db-1f3ff-200d-2642-fe0f.svg","man_walking":"1f6b6-200d-2642-fe0f.svg","man_walking_tone1":"1f6b6-1f3fb-200d-2642-fe0f.svg","man_walking_tone2":"1f6b6-1f3fc-200d-2642-fe0f.svg","man_walking_tone3":"1f6b6-1f3fd-200d-2642-fe0f.svg","man_walking_tone4":"1f6b6-1f3fe-200d-2642-fe0f.svg","man_walking_tone5":"1f6b6-1f3ff-200d-2642-fe0f.svg","man_wearing_turban":"1f473-200d-2642-fe0f.svg","man_wearing_turban_tone1":"1f473-1f3fb-200d-2642-fe0f.svg","man_wearing_turban_tone2":"1f473-1f3fc-200d-2642-fe0f.svg","man_wearing_turban_tone3":"1f473-1f3fd-200d-2642-fe0f.svg","man_wearing_turban_tone4":"1f473-1f3fe-200d-2642-fe0f.svg","man_wearing_turban_tone5":"1f473-1f3ff-200d-2642-fe0f.svg","man_white_haired":"1f468-200d-1f9b3.svg","man_white_haired_tone1":"1f468-1f3fb-200d-1f9b3.svg","man_white_haired_tone2":"1f468-1f3fc-200d-1f9b3.svg","man_white_haired_tone3":"1f468-1f3fd-200d-1f9b3.svg","man_white_haired_tone4":"1f468-1f3fe-200d-1f9b3.svg","man_white_haired_tone5":"1f468-1f3ff-200d-1f9b3.svg","man_with_chinese_cap":"1f472.svg","man_with_chinese_cap_tone1":"1f472-1f3fb.svg","man_with_chinese_cap_tone2":"1f472-1f3fc.svg","man_with_chinese_cap_tone3":"1f472-1f3fd.svg","man_with_chinese_cap_tone4":"1f472-1f3fe.svg","man_with_chinese_cap_tone5":"1f472-1f3ff.svg","man_with_probing_cane":"1f468-200d-1f9af.svg","man_with_probing_cane_tone1":"1f468-1f3fb-200d-1f9af.svg","man_with_probing_cane_tone2":"1f468-1f3fc-200d-1f9af.svg","man_with_probing_cane_tone3":"1f468-1f3fd-200d-1f9af.svg","man_with_probing_cane_tone4":"1f468-1f3fe-200d-1f9af.svg","man_with_probing_cane_tone5":"1f468-1f3ff-200d-1f9af.svg","man_with_veil":"1f470-200d-2642-fe0f.svg","man_with_veil_tone1":"1f470-1f3fb-200d-2642-fe0f.svg","man_with_veil_tone2":"1f470-1f3fc-200d-2642-fe0f.svg","man_with_veil_tone3":"1f470-1f3fd-200d-2642-fe0f.svg","man_with_veil_tone4":"1f470-1f3fe-200d-2642-fe0f.svg","man_with_veil_tone5":"1f470-1f3ff-200d-2642-fe0f.svg","man_zombie":"1f9df-200d-2642-fe0f.svg","mango":"1f96d.svg","mans_shoe":"1f45e.svg","manual_wheelchair":"1f9bd.svg","map":"1f5fa.svg","maple_leaf":"1f341.svg","martial_arts_uniform":"1f94b.svg","mask":"1f637.svg","mate":"1f9c9.svg","meat_on_bone":"1f356.svg","mechanic":"1f9d1-200d-1f527.svg","mechanic_tone1":"1f9d1-1f3fb-200d-1f527.svg","mechanic_tone2":"1f9d1-1f3fc-200d-1f527.svg","mechanic_tone3":"1f9d1-1f3fd-200d-1f527.svg","mechanic_tone4":"1f9d1-1f3fe-200d-1f527.svg","mechanic_tone5":"1f9d1-1f3ff-200d-1f527.svg","mechanical_arm":"1f9be.svg","mechanical_leg":"1f9bf.svg","medal":"1f3c5.svg","medical_symbol":"2695.svg","mega":"1f4e3.svg","melon":"1f348.svg","men_holding_hands_tone1":"1f46c-1f3fb.svg","men_holding_hands_tone1_tone2":"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc.svg","men_holding_hands_tone1_tone3":"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd.svg","men_holding_hands_tone1_tone4":"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe.svg","men_holding_hands_tone1_tone5":"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff.svg","men_holding_hands_tone2":"1f46c-1f3fc.svg","men_holding_hands_tone2_tone1":"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb.svg","men_holding_hands_tone2_tone3":"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd.svg","men_holding_hands_tone2_tone4":"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe.svg","men_holding_hands_tone2_tone5":"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff.svg","men_holding_hands_tone3":"1f46c-1f3fd.svg","men_holding_hands_tone3_tone1":"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb.svg","men_holding_hands_tone3_tone2":"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc.svg","men_holding_hands_tone3_tone4":"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe.svg","men_holding_hands_tone3_tone5":"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff.svg","men_holding_hands_tone4":"1f46c-1f3fe.svg","men_holding_hands_tone4_tone1":"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb.svg","men_holding_hands_tone4_tone2":"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc.svg","men_holding_hands_tone4_tone3":"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd.svg","men_holding_hands_tone4_tone5":"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff.svg","men_holding_hands_tone5":"1f46c-1f3ff.svg","men_holding_hands_tone5_tone1":"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb.svg","men_holding_hands_tone5_tone2":"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc.svg","men_holding_hands_tone5_tone3":"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd.svg","men_holding_hands_tone5_tone4":"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe.svg","men_with_bunny_ears_partying":"1f46f-200d-2642-fe0f.svg","men_wrestling":"1f93c-200d-2642-fe0f.svg","mending_heart":"2764-fe0f-200d-1fa79.svg","menorah":"1f54e.svg","mens":"1f6b9.svg","mermaid":"1f9dc-200d-2640-fe0f.svg","mermaid_tone1":"1f9dc-1f3fb-200d-2640-fe0f.svg","mermaid_tone2":"1f9dc-1f3fc-200d-2640-fe0f.svg","mermaid_tone3":"1f9dc-1f3fd-200d-2640-fe0f.svg","mermaid_tone4":"1f9dc-1f3fe-200d-2640-fe0f.svg","mermaid_tone5":"1f9dc-1f3ff-200d-2640-fe0f.svg","merman":"1f9dc-200d-2642-fe0f.svg","merman_tone1":"1f9dc-1f3fb-200d-2642-fe0f.svg","merman_tone2":"1f9dc-1f3fc-200d-2642-fe0f.svg","merman_tone3":"1f9dc-1f3fd-200d-2642-fe0f.svg","merman_tone4":"1f9dc-1f3fe-200d-2642-fe0f.svg","merman_tone5":"1f9dc-1f3ff-200d-2642-fe0f.svg","merperson":"1f9dc.svg","merperson_tone1":"1f9dc-1f3fb.svg","merperson_tone2":"1f9dc-1f3fc.svg","merperson_tone3":"1f9dc-1f3fd.svg","merperson_tone4":"1f9dc-1f3fe.svg","merperson_tone5":"1f9dc-1f3ff.svg","metal":"1f918.svg","metal_tone1":"1f918-1f3fb.svg","metal_tone2":"1f918-1f3fc.svg","metal_tone3":"1f918-1f3fd.svg","metal_tone4":"1f918-1f3fe.svg","metal_tone5":"1f918-1f3ff.svg","metro":"1f687.svg","microbe":"1f9a0.svg","microphone2":"1f399.svg","microphone":"1f3a4.svg","microscope":"1f52c.svg","middle_finger":"1f595.svg","middle_finger_tone1":"1f595-1f3fb.svg","middle_finger_tone2":"1f595-1f3fc.svg","middle_finger_tone3":"1f595-1f3fd.svg","middle_finger_tone4":"1f595-1f3fe.svg","middle_finger_tone5":"1f595-1f3ff.svg","military_helmet":"1fa96.svg","military_medal":"1f396.svg","milk":"1f95b.svg","milky_way":"1f30c.svg","minibus":"1f690.svg","minidisc":"1f4bd.svg","mirror":"1fa9e.svg","mobile_phone":"1f4f1.svg","mobile_phone_off":"1f4f4.svg","money_mouth":"1f911.svg","money_with_wings":"1f4b8.svg","moneybag":"1f4b0.svg","monkey":"1f412.svg","monkey_face":"1f435.svg","monorail":"1f69d.svg","moon_cake":"1f96e.svg","mortar_board":"1f393.svg","mosque":"1f54c.svg","mosquito":"1f99f.svg","motor_scooter":"1f6f5.svg","motorboat":"1f6e5.svg","motorcycle":"1f3cd.svg","motorized_wheelchair":"1f9bc.svg","motorway":"1f6e3.svg","mount_fuji":"1f5fb.svg","mountain":"26f0.svg","mountain_cableway":"1f6a0.svg","mountain_railway":"1f69e.svg","mountain_snow":"1f3d4.svg","mouse2":"1f401.svg","mouse":"1f42d.svg","mouse_three_button":"1f5b1.svg","mouse_trap":"1faa4.svg","movie_camera":"1f3a5.svg","moyai":"1f5ff.svg","mrs_claus":"1f936.svg","mrs_claus_tone1":"1f936-1f3fb.svg","mrs_claus_tone2":"1f936-1f3fc.svg","mrs_claus_tone3":"1f936-1f3fd.svg","mrs_claus_tone4":"1f936-1f3fe.svg","mrs_claus_tone5":"1f936-1f3ff.svg","muscle":"1f4aa.svg","muscle_tone1":"1f4aa-1f3fb.svg","muscle_tone2":"1f4aa-1f3fc.svg","muscle_tone3":"1f4aa-1f3fd.svg","muscle_tone4":"1f4aa-1f3fe.svg","muscle_tone5":"1f4aa-1f3ff.svg","mushroom":"1f344.svg","musical_keyboard":"1f3b9.svg","musical_note":"1f3b5.svg","musical_score":"1f3bc.svg","mute":"1f507.svg","mx_claus":"1f9d1-200d-1f384.svg","mx_claus_tone1":"1f9d1-1f3fb-200d-1f384.svg","mx_claus_tone2":"1f9d1-1f3fc-200d-1f384.svg","mx_claus_tone3":"1f9d1-1f3fd-200d-1f384.svg","mx_claus_tone4":"1f9d1-1f3fe-200d-1f384.svg","mx_claus_tone5":"1f9d1-1f3ff-200d-1f384.svg","nail_care":"1f485.svg","nail_care_tone1":"1f485-1f3fb.svg","nail_care_tone2":"1f485-1f3fc.svg","nail_care_tone3":"1f485-1f3fd.svg","nail_care_tone4":"1f485-1f3fe.svg","nail_care_tone5":"1f485-1f3ff.svg","name_badge":"1f4db.svg","nauseated_face":"1f922.svg","nazar_amulet":"1f9ff.svg","necktie":"1f454.svg","negative_squared_cross_mark":"274e.svg","nerd":"1f913.svg","nesting_dolls":"1fa86.svg","neutral_face":"1f610.svg","new":"1f195.svg","new_moon":"1f311.svg","new_moon_with_face":"1f31a.svg","newspaper2":"1f5de.svg","newspaper":"1f4f0.svg","ng":"1f196.svg","night_with_stars":"1f303.svg","nine":"39-20e3.svg","ninja":"1f977.svg","ninja_tone1":"1f977-1f3fb.svg","ninja_tone2":"1f977-1f3fc.svg","ninja_tone3":"1f977-1f3fd.svg","ninja_tone4":"1f977-1f3fe.svg","ninja_tone5":"1f977-1f3ff.svg","no_bell":"1f515.svg","no_bicycles":"1f6b3.svg","no_entry":"26d4.svg","no_entry_sign":"1f6ab.svg","no_mobile_phones":"1f4f5.svg","no_mouth":"1f636.svg","no_pedestrians":"1f6b7.svg","no_smoking":"1f6ad.svg","non-potable_water":"1f6b1.svg","nose":"1f443.svg","nose_tone1":"1f443-1f3fb.svg","nose_tone2":"1f443-1f3fc.svg","nose_tone3":"1f443-1f3fd.svg","nose_tone4":"1f443-1f3fe.svg","nose_tone5":"1f443-1f3ff.svg","notebook":"1f4d3.svg","notebook_with_decorative_cover":"1f4d4.svg","notepad_spiral":"1f5d2.svg","notes":"1f3b6.svg","nut_and_bolt":"1f529.svg","o2":"1f17e.svg","o":"2b55.svg","ocean":"1f30a.svg","octagonal_sign":"1f6d1.svg","octopus":"1f419.svg","oden":"1f362.svg","office":"1f3e2.svg","office_worker":"1f9d1-200d-1f4bc.svg","office_worker_tone1":"1f9d1-1f3fb-200d-1f4bc.svg","office_worker_tone2":"1f9d1-1f3fc-200d-1f4bc.svg","office_worker_tone3":"1f9d1-1f3fd-200d-1f4bc.svg","office_worker_tone4":"1f9d1-1f3fe-200d-1f4bc.svg","office_worker_tone5":"1f9d1-1f3ff-200d-1f4bc.svg","oil":"1f6e2.svg","ok":"1f197.svg","ok_hand":"1f44c.svg","ok_hand_tone1":"1f44c-1f3fb.svg","ok_hand_tone2":"1f44c-1f3fc.svg","ok_hand_tone3":"1f44c-1f3fd.svg","ok_hand_tone4":"1f44c-1f3fe.svg","ok_hand_tone5":"1f44c-1f3ff.svg","older_adult":"1f9d3.svg","older_adult_tone1":"1f9d3-1f3fb.svg","older_adult_tone2":"1f9d3-1f3fc.svg","older_adult_tone3":"1f9d3-1f3fd.svg","older_adult_tone4":"1f9d3-1f3fe.svg","older_adult_tone5":"1f9d3-1f3ff.svg","older_man":"1f474.svg","older_man_tone1":"1f474-1f3fb.svg","older_man_tone2":"1f474-1f3fc.svg","older_man_tone3":"1f474-1f3fd.svg","older_man_tone4":"1f474-1f3fe.svg","older_man_tone5":"1f474-1f3ff.svg","older_woman":"1f475.svg","older_woman_tone1":"1f475-1f3fb.svg","older_woman_tone2":"1f475-1f3fc.svg","older_woman_tone3":"1f475-1f3fd.svg","older_woman_tone4":"1f475-1f3fe.svg","older_woman_tone5":"1f475-1f3ff.svg","olive":"1fad2.svg","om_symbol":"1f549.svg","on":"1f51b.svg","oncoming_automobile":"1f698.svg","oncoming_bus":"1f68d.svg","oncoming_police_car":"1f694.svg","oncoming_taxi":"1f696.svg","one":"31-20e3.svg","one_piece_swimsuit":"1fa71.svg","onion":"1f9c5.svg","open_file_folder":"1f4c2.svg","open_hands":"1f450.svg","open_hands_tone1":"1f450-1f3fb.svg","open_hands_tone2":"1f450-1f3fc.svg","open_hands_tone3":"1f450-1f3fd.svg","open_hands_tone4":"1f450-1f3fe.svg","open_hands_tone5":"1f450-1f3ff.svg","open_mouth":"1f62e.svg","ophiuchus":"26ce.svg","orange_book":"1f4d9.svg","orange_circle":"1f7e0.svg","orange_heart":"1f9e1.svg","orange_square":"1f7e7.svg","orangutan":"1f9a7.svg","orthodox_cross":"2626.svg","otter":"1f9a6.svg","outbox_tray":"1f4e4.svg","owl":"1f989.svg","ox":"1f402.svg","oyster":"1f9aa.svg","package":"1f4e6.svg","page_facing_up":"1f4c4.svg","page_with_curl":"1f4c3.svg","pager":"1f4df.svg","paintbrush":"1f58c.svg","palm_tree":"1f334.svg","palms_up_together":"1f932.svg","palms_up_together_tone1":"1f932-1f3fb.svg","palms_up_together_tone2":"1f932-1f3fc.svg","palms_up_together_tone3":"1f932-1f3fd.svg","palms_up_together_tone4":"1f932-1f3fe.svg","palms_up_together_tone5":"1f932-1f3ff.svg","pancakes":"1f95e.svg","panda_face":"1f43c.svg","paperclip":"1f4ce.svg","paperclips":"1f587.svg","parachute":"1fa82.svg","park":"1f3de.svg","parking":"1f17f.svg","parrot":"1f99c.svg","part_alternation_mark":"303d.svg","partly_sunny":"26c5.svg","partying_face":"1f973.svg","passport_control":"1f6c2.svg","pause_button":"23f8.svg","peace":"262e.svg","peach":"1f351.svg","peacock":"1f99a.svg","peanuts":"1f95c.svg","pear":"1f350.svg","pen_ballpoint":"1f58a.svg","pen_fountain":"1f58b.svg","pencil2":"270f.svg","pencil":"1f4dd.svg","penguin":"1f427.svg","pensive":"1f614.svg","people_holding_hands":"1f9d1-200d-1f91d-200d-1f9d1.svg","people_holding_hands_tone1":"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb.svg","people_holding_hands_tone1_tone2":"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc.svg","people_holding_hands_tone1_tone3":"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd.svg","people_holding_hands_tone1_tone4":"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe.svg","people_holding_hands_tone1_tone5":"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff.svg","people_holding_hands_tone2":"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc.svg","people_holding_hands_tone2_tone1":"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb.svg","people_holding_hands_tone2_tone3":"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd.svg","people_holding_hands_tone2_tone4":"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe.svg","people_holding_hands_tone2_tone5":"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff.svg","people_holding_hands_tone3":"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd.svg","people_holding_hands_tone3_tone1":"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb.svg","people_holding_hands_tone3_tone2":"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc.svg","people_holding_hands_tone3_tone4":"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe.svg","people_holding_hands_tone3_tone5":"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff.svg","people_holding_hands_tone4":"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe.svg","people_holding_hands_tone4_tone1":"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb.svg","people_holding_hands_tone4_tone2":"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc.svg","people_holding_hands_tone4_tone3":"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd.svg","people_holding_hands_tone4_tone5":"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff.svg","people_holding_hands_tone5":"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff.svg","people_holding_hands_tone5_tone1":"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb.svg","people_holding_hands_tone5_tone2":"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc.svg","people_holding_hands_tone5_tone3":"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd.svg","people_holding_hands_tone5_tone4":"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe.svg","people_hugging":"1fac2.svg","people_with_bunny_ears_partying":"1f46f.svg","people_wrestling":"1f93c.svg","performing_arts":"1f3ad.svg","persevere":"1f623.svg","person_bald":"1f9d1-200d-1f9b2.svg","person_biking":"1f6b4.svg","person_biking_tone1":"1f6b4-1f3fb.svg","person_biking_tone2":"1f6b4-1f3fc.svg","person_biking_tone3":"1f6b4-1f3fd.svg","person_biking_tone4":"1f6b4-1f3fe.svg","person_biking_tone5":"1f6b4-1f3ff.svg","person_bouncing_ball":"26f9.svg","person_bouncing_ball_tone1":"26f9-1f3fb.svg","person_bouncing_ball_tone2":"26f9-1f3fc.svg","person_bouncing_ball_tone3":"26f9-1f3fd.svg","person_bouncing_ball_tone4":"26f9-1f3fe.svg","person_bouncing_ball_tone5":"26f9-1f3ff.svg","person_bowing":"1f647.svg","person_bowing_tone1":"1f647-1f3fb.svg","person_bowing_tone2":"1f647-1f3fc.svg","person_bowing_tone3":"1f647-1f3fd.svg","person_bowing_tone4":"1f647-1f3fe.svg","person_bowing_tone5":"1f647-1f3ff.svg","person_climbing":"1f9d7.svg","person_climbing_tone1":"1f9d7-1f3fb.svg","person_climbing_tone2":"1f9d7-1f3fc.svg","person_climbing_tone3":"1f9d7-1f3fd.svg","person_climbing_tone4":"1f9d7-1f3fe.svg","person_climbing_tone5":"1f9d7-1f3ff.svg","person_curly_hair":"1f9d1-200d-1f9b1.svg","person_doing_cartwheel":"1f938.svg","person_doing_cartwheel_tone1":"1f938-1f3fb.svg","person_doing_cartwheel_tone2":"1f938-1f3fc.svg","person_doing_cartwheel_tone3":"1f938-1f3fd.svg","person_doing_cartwheel_tone4":"1f938-1f3fe.svg","person_doing_cartwheel_tone5":"1f938-1f3ff.svg","person_facepalming":"1f926.svg","person_facepalming_tone1":"1f926-1f3fb.svg","person_facepalming_tone2":"1f926-1f3fc.svg","person_facepalming_tone3":"1f926-1f3fd.svg","person_facepalming_tone4":"1f926-1f3fe.svg","person_facepalming_tone5":"1f926-1f3ff.svg","person_feeding_baby":"1f9d1-200d-1f37c.svg","person_feeding_baby_tone1":"1f9d1-1f3fb-200d-1f37c.svg","person_feeding_baby_tone2":"1f9d1-1f3fc-200d-1f37c.svg","person_feeding_baby_tone3":"1f9d1-1f3fd-200d-1f37c.svg","person_feeding_baby_tone4":"1f9d1-1f3fe-200d-1f37c.svg","person_feeding_baby_tone5":"1f9d1-1f3ff-200d-1f37c.svg","person_fencing":"1f93a.svg","person_frowning":"1f64d.svg","person_frowning_tone1":"1f64d-1f3fb.svg","person_frowning_tone2":"1f64d-1f3fc.svg","person_frowning_tone3":"1f64d-1f3fd.svg","person_frowning_tone4":"1f64d-1f3fe.svg","person_frowning_tone5":"1f64d-1f3ff.svg","person_gesturing_no":"1f645.svg","person_gesturing_no_tone1":"1f645-1f3fb.svg","person_gesturing_no_tone2":"1f645-1f3fc.svg","person_gesturing_no_tone3":"1f645-1f3fd.svg","person_gesturing_no_tone4":"1f645-1f3fe.svg","person_gesturing_no_tone5":"1f645-1f3ff.svg","person_gesturing_ok":"1f646.svg","person_gesturing_ok_tone1":"1f646-1f3fb.svg","person_gesturing_ok_tone2":"1f646-1f3fc.svg","person_gesturing_ok_tone3":"1f646-1f3fd.svg","person_gesturing_ok_tone4":"1f646-1f3fe.svg","person_gesturing_ok_tone5":"1f646-1f3ff.svg","person_getting_haircut":"1f487.svg","person_getting_haircut_tone1":"1f487-1f3fb.svg","person_getting_haircut_tone2":"1f487-1f3fc.svg","person_getting_haircut_tone3":"1f487-1f3fd.svg","person_getting_haircut_tone4":"1f487-1f3fe.svg","person_getting_haircut_tone5":"1f487-1f3ff.svg","person_getting_massage":"1f486.svg","person_getting_massage_tone1":"1f486-1f3fb.svg","person_getting_massage_tone2":"1f486-1f3fc.svg","person_getting_massage_tone3":"1f486-1f3fd.svg","person_getting_massage_tone4":"1f486-1f3fe.svg","person_getting_massage_tone5":"1f486-1f3ff.svg","person_golfing":"1f3cc.svg","person_golfing_tone1":"1f3cc-1f3fb.svg","person_golfing_tone2":"1f3cc-1f3fc.svg","person_golfing_tone3":"1f3cc-1f3fd.svg","person_golfing_tone4":"1f3cc-1f3fe.svg","person_golfing_tone5":"1f3cc-1f3ff.svg","person_in_bed_tone1":"1f6cc-1f3fb.svg","person_in_bed_tone2":"1f6cc-1f3fc.svg","person_in_bed_tone3":"1f6cc-1f3fd.svg","person_in_bed_tone4":"1f6cc-1f3fe.svg","person_in_bed_tone5":"1f6cc-1f3ff.svg","person_in_lotus_position":"1f9d8.svg","person_in_lotus_position_tone1":"1f9d8-1f3fb.svg","person_in_lotus_position_tone2":"1f9d8-1f3fc.svg","person_in_lotus_position_tone3":"1f9d8-1f3fd.svg","person_in_lotus_position_tone4":"1f9d8-1f3fe.svg","person_in_lotus_position_tone5":"1f9d8-1f3ff.svg","person_in_manual_wheelchair":"1f9d1-200d-1f9bd.svg","person_in_manual_wheelchair_tone1":"1f9d1-1f3fb-200d-1f9bd.svg","person_in_manual_wheelchair_tone2":"1f9d1-1f3fc-200d-1f9bd.svg","person_in_manual_wheelchair_tone3":"1f9d1-1f3fd-200d-1f9bd.svg","person_in_manual_wheelchair_tone4":"1f9d1-1f3fe-200d-1f9bd.svg","person_in_manual_wheelchair_tone5":"1f9d1-1f3ff-200d-1f9bd.svg","person_in_motorized_wheelchair":"1f9d1-200d-1f9bc.svg","person_in_motorized_wheelchair_tone1":"1f9d1-1f3fb-200d-1f9bc.svg","person_in_motorized_wheelchair_tone2":"1f9d1-1f3fc-200d-1f9bc.svg","person_in_motorized_wheelchair_tone3":"1f9d1-1f3fd-200d-1f9bc.svg","person_in_motorized_wheelchair_tone4":"1f9d1-1f3fe-200d-1f9bc.svg","person_in_motorized_wheelchair_tone5":"1f9d1-1f3ff-200d-1f9bc.svg","person_in_steamy_room":"1f9d6.svg","person_in_steamy_room_tone1":"1f9d6-1f3fb.svg","person_in_steamy_room_tone2":"1f9d6-1f3fc.svg","person_in_steamy_room_tone3":"1f9d6-1f3fd.svg","person_in_steamy_room_tone4":"1f9d6-1f3fe.svg","person_in_steamy_room_tone5":"1f9d6-1f3ff.svg","person_in_tuxedo":"1f935.svg","person_in_tuxedo_tone1":"1f935-1f3fb.svg","person_in_tuxedo_tone2":"1f935-1f3fc.svg","person_in_tuxedo_tone3":"1f935-1f3fd.svg","person_in_tuxedo_tone4":"1f935-1f3fe.svg","person_in_tuxedo_tone5":"1f935-1f3ff.svg","person_juggling":"1f939.svg","person_juggling_tone1":"1f939-1f3fb.svg","person_juggling_tone2":"1f939-1f3fc.svg","person_juggling_tone3":"1f939-1f3fd.svg","person_juggling_tone4":"1f939-1f3fe.svg","person_juggling_tone5":"1f939-1f3ff.svg","person_kneeling":"1f9ce.svg","person_kneeling_tone1":"1f9ce-1f3fb.svg","person_kneeling_tone2":"1f9ce-1f3fc.svg","person_kneeling_tone3":"1f9ce-1f3fd.svg","person_kneeling_tone4":"1f9ce-1f3fe.svg","person_kneeling_tone5":"1f9ce-1f3ff.svg","person_lifting_weights":"1f3cb.svg","person_lifting_weights_tone1":"1f3cb-1f3fb.svg","person_lifting_weights_tone2":"1f3cb-1f3fc.svg","person_lifting_weights_tone3":"1f3cb-1f3fd.svg","person_lifting_weights_tone4":"1f3cb-1f3fe.svg","person_lifting_weights_tone5":"1f3cb-1f3ff.svg","person_mountain_biking":"1f6b5.svg","person_mountain_biking_tone1":"1f6b5-1f3fb.svg","person_mountain_biking_tone2":"1f6b5-1f3fc.svg","person_mountain_biking_tone3":"1f6b5-1f3fd.svg","person_mountain_biking_tone4":"1f6b5-1f3fe.svg","person_mountain_biking_tone5":"1f6b5-1f3ff.svg","person_playing_handball":"1f93e.svg","person_playing_handball_tone1":"1f93e-1f3fb.svg","person_playing_handball_tone2":"1f93e-1f3fc.svg","person_playing_handball_tone3":"1f93e-1f3fd.svg","person_playing_handball_tone4":"1f93e-1f3fe.svg","person_playing_handball_tone5":"1f93e-1f3ff.svg","person_playing_water_polo":"1f93d.svg","person_playing_water_polo_tone1":"1f93d-1f3fb.svg","person_playing_water_polo_tone2":"1f93d-1f3fc.svg","person_playing_water_polo_tone3":"1f93d-1f3fd.svg","person_playing_water_polo_tone4":"1f93d-1f3fe.svg","person_playing_water_polo_tone5":"1f93d-1f3ff.svg","person_pouting":"1f64e.svg","person_pouting_tone1":"1f64e-1f3fb.svg","person_pouting_tone2":"1f64e-1f3fc.svg","person_pouting_tone3":"1f64e-1f3fd.svg","person_pouting_tone4":"1f64e-1f3fe.svg","person_pouting_tone5":"1f64e-1f3ff.svg","person_raising_hand":"1f64b.svg","person_raising_hand_tone1":"1f64b-1f3fb.svg","person_raising_hand_tone2":"1f64b-1f3fc.svg","person_raising_hand_tone3":"1f64b-1f3fd.svg","person_raising_hand_tone4":"1f64b-1f3fe.svg","person_raising_hand_tone5":"1f64b-1f3ff.svg","person_red_hair":"1f9d1-200d-1f9b0.svg","person_rowing_boat":"1f6a3.svg","person_rowing_boat_tone1":"1f6a3-1f3fb.svg","person_rowing_boat_tone2":"1f6a3-1f3fc.svg","person_rowing_boat_tone3":"1f6a3-1f3fd.svg","person_rowing_boat_tone4":"1f6a3-1f3fe.svg","person_rowing_boat_tone5":"1f6a3-1f3ff.svg","person_running":"1f3c3.svg","person_running_tone1":"1f3c3-1f3fb.svg","person_running_tone2":"1f3c3-1f3fc.svg","person_running_tone3":"1f3c3-1f3fd.svg","person_running_tone4":"1f3c3-1f3fe.svg","person_running_tone5":"1f3c3-1f3ff.svg","person_shrugging":"1f937.svg","person_shrugging_tone1":"1f937-1f3fb.svg","person_shrugging_tone2":"1f937-1f3fc.svg","person_shrugging_tone3":"1f937-1f3fd.svg","person_shrugging_tone4":"1f937-1f3fe.svg","person_shrugging_tone5":"1f937-1f3ff.svg","person_standing":"1f9cd.svg","person_standing_tone1":"1f9cd-1f3fb.svg","person_standing_tone2":"1f9cd-1f3fc.svg","person_standing_tone3":"1f9cd-1f3fd.svg","person_standing_tone4":"1f9cd-1f3fe.svg","person_standing_tone5":"1f9cd-1f3ff.svg","person_surfing":"1f3c4.svg","person_surfing_tone1":"1f3c4-1f3fb.svg","person_surfing_tone2":"1f3c4-1f3fc.svg","person_surfing_tone3":"1f3c4-1f3fd.svg","person_surfing_tone4":"1f3c4-1f3fe.svg","person_surfing_tone5":"1f3c4-1f3ff.svg","person_swimming":"1f3ca.svg","person_swimming_tone1":"1f3ca-1f3fb.svg","person_swimming_tone2":"1f3ca-1f3fc.svg","person_swimming_tone3":"1f3ca-1f3fd.svg","person_swimming_tone4":"1f3ca-1f3fe.svg","person_swimming_tone5":"1f3ca-1f3ff.svg","person_tipping_hand":"1f481.svg","person_tipping_hand_tone1":"1f481-1f3fb.svg","person_tipping_hand_tone2":"1f481-1f3fc.svg","person_tipping_hand_tone3":"1f481-1f3fd.svg","person_tipping_hand_tone4":"1f481-1f3fe.svg","person_tipping_hand_tone5":"1f481-1f3ff.svg","person_tone1_bald":"1f9d1-1f3fb-200d-1f9b2.svg","person_tone1_curly_hair":"1f9d1-1f3fb-200d-1f9b1.svg","person_tone1_red_hair":"1f9d1-1f3fb-200d-1f9b0.svg","person_tone1_white_hair":"1f9d1-1f3fb-200d-1f9b3.svg","person_tone2_bald":"1f9d1-1f3fc-200d-1f9b2.svg","person_tone2_curly_hair":"1f9d1-1f3fc-200d-1f9b1.svg","person_tone2_red_hair":"1f9d1-1f3fc-200d-1f9b0.svg","person_tone2_white_hair":"1f9d1-1f3fc-200d-1f9b3.svg","person_tone3_bald":"1f9d1-1f3fd-200d-1f9b2.svg","person_tone3_curly_hair":"1f9d1-1f3fd-200d-1f9b1.svg","person_tone3_red_hair":"1f9d1-1f3fd-200d-1f9b0.svg","person_tone3_white_hair":"1f9d1-1f3fd-200d-1f9b3.svg","person_tone4_bald":"1f9d1-1f3fe-200d-1f9b2.svg","person_tone4_curly_hair":"1f9d1-1f3fe-200d-1f9b1.svg","person_tone4_red_hair":"1f9d1-1f3fe-200d-1f9b0.svg","person_tone4_white_hair":"1f9d1-1f3fe-200d-1f9b3.svg","person_tone5_bald":"1f9d1-1f3ff-200d-1f9b2.svg","person_tone5_curly_hair":"1f9d1-1f3ff-200d-1f9b1.svg","person_tone5_red_hair":"1f9d1-1f3ff-200d-1f9b0.svg","person_tone5_white_hair":"1f9d1-1f3ff-200d-1f9b3.svg","person_walking":"1f6b6.svg","person_walking_tone1":"1f6b6-1f3fb.svg","person_walking_tone2":"1f6b6-1f3fc.svg","person_walking_tone3":"1f6b6-1f3fd.svg","person_walking_tone4":"1f6b6-1f3fe.svg","person_walking_tone5":"1f6b6-1f3ff.svg","person_wearing_turban":"1f473.svg","person_wearing_turban_tone1":"1f473-1f3fb.svg","person_wearing_turban_tone2":"1f473-1f3fc.svg","person_wearing_turban_tone3":"1f473-1f3fd.svg","person_wearing_turban_tone4":"1f473-1f3fe.svg","person_wearing_turban_tone5":"1f473-1f3ff.svg","person_white_hair":"1f9d1-200d-1f9b3.svg","person_with_probing_cane":"1f9d1-200d-1f9af.svg","person_with_probing_cane_tone1":"1f9d1-1f3fb-200d-1f9af.svg","person_with_probing_cane_tone2":"1f9d1-1f3fc-200d-1f9af.svg","person_with_probing_cane_tone3":"1f9d1-1f3fd-200d-1f9af.svg","person_with_probing_cane_tone4":"1f9d1-1f3fe-200d-1f9af.svg","person_with_probing_cane_tone5":"1f9d1-1f3ff-200d-1f9af.svg","person_with_veil":"1f470.svg","person_with_veil_tone1":"1f470-1f3fb.svg","person_with_veil_tone2":"1f470-1f3fc.svg","person_with_veil_tone3":"1f470-1f3fd.svg","person_with_veil_tone4":"1f470-1f3fe.svg","person_with_veil_tone5":"1f470-1f3ff.svg","petri_dish":"1f9eb.svg","pick":"26cf.svg","pickup_truck":"1f6fb.svg","pie":"1f967.svg","pig2":"1f416.svg","pig":"1f437.svg","pig_nose":"1f43d.svg","pill":"1f48a.svg","pilot":"1f9d1-200d-2708-fe0f.svg","pilot_tone1":"1f9d1-1f3fb-200d-2708-fe0f.svg","pilot_tone2":"1f9d1-1f3fc-200d-2708-fe0f.svg","pilot_tone3":"1f9d1-1f3fd-200d-2708-fe0f.svg","pilot_tone4":"1f9d1-1f3fe-200d-2708-fe0f.svg","pilot_tone5":"1f9d1-1f3ff-200d-2708-fe0f.svg","pinched_fingers":"1f90c.svg","pinched_fingers_tone1":"1f90c-1f3fb.svg","pinched_fingers_tone2":"1f90c-1f3fc.svg","pinched_fingers_tone3":"1f90c-1f3fd.svg","pinched_fingers_tone4":"1f90c-1f3fe.svg","pinched_fingers_tone5":"1f90c-1f3ff.svg","pinching_hand":"1f90f.svg","pinching_hand_tone1":"1f90f-1f3fb.svg","pinching_hand_tone2":"1f90f-1f3fc.svg","pinching_hand_tone3":"1f90f-1f3fd.svg","pinching_hand_tone4":"1f90f-1f3fe.svg","pinching_hand_tone5":"1f90f-1f3ff.svg","pineapple":"1f34d.svg","ping_pong":"1f3d3.svg","pirate_flag":"1f3f4-200d-2620-fe0f.svg","pisces":"2653.svg","pizza":"1f355.svg","piñata":"1fa85.svg","placard":"1faa7.svg","place_of_worship":"1f6d0.svg","play_pause":"23ef.svg","pleading_face":"1f97a.svg","plunger":"1faa0.svg","point_down":"1f447.svg","point_down_tone1":"1f447-1f3fb.svg","point_down_tone2":"1f447-1f3fc.svg","point_down_tone3":"1f447-1f3fd.svg","point_down_tone4":"1f447-1f3fe.svg","point_down_tone5":"1f447-1f3ff.svg","point_left":"1f448.svg","point_left_tone1":"1f448-1f3fb.svg","point_left_tone2":"1f448-1f3fc.svg","point_left_tone3":"1f448-1f3fd.svg","point_left_tone4":"1f448-1f3fe.svg","point_left_tone5":"1f448-1f3ff.svg","point_right":"1f449.svg","point_right_tone1":"1f449-1f3fb.svg","point_right_tone2":"1f449-1f3fc.svg","point_right_tone3":"1f449-1f3fd.svg","point_right_tone4":"1f449-1f3fe.svg","point_right_tone5":"1f449-1f3ff.svg","point_up":"261d.svg","point_up_2":"1f446.svg","point_up_2_tone1":"1f446-1f3fb.svg","point_up_2_tone2":"1f446-1f3fc.svg","point_up_2_tone3":"1f446-1f3fd.svg","point_up_2_tone4":"1f446-1f3fe.svg","point_up_2_tone5":"1f446-1f3ff.svg","point_up_tone1":"261d-1f3fb.svg","point_up_tone2":"261d-1f3fc.svg","point_up_tone3":"261d-1f3fd.svg","point_up_tone4":"261d-1f3fe.svg","point_up_tone5":"261d-1f3ff.svg","polar_bear":"1f43b-200d-2744-fe0f.svg","police_car":"1f693.svg","police_officer":"1f46e.svg","police_officer_tone1":"1f46e-1f3fb.svg","police_officer_tone2":"1f46e-1f3fc.svg","police_officer_tone3":"1f46e-1f3fd.svg","police_officer_tone4":"1f46e-1f3fe.svg","police_officer_tone5":"1f46e-1f3ff.svg","poodle":"1f429.svg","poop":"1f4a9.svg","popcorn":"1f37f.svg","post_office":"1f3e3.svg","postal_horn":"1f4ef.svg","postbox":"1f4ee.svg","potable_water":"1f6b0.svg","potato":"1f954.svg","potted_plant":"1fab4.svg","pouch":"1f45d.svg","poultry_leg":"1f357.svg","pound":"1f4b7.svg","pouting_cat":"1f63e.svg","pray":"1f64f.svg","pray_tone1":"1f64f-1f3fb.svg","pray_tone2":"1f64f-1f3fc.svg","pray_tone3":"1f64f-1f3fd.svg","pray_tone4":"1f64f-1f3fe.svg","pray_tone5":"1f64f-1f3ff.svg","prayer_beads":"1f4ff.svg","pregnant_woman":"1f930.svg","pregnant_woman_tone1":"1f930-1f3fb.svg","pregnant_woman_tone2":"1f930-1f3fc.svg","pregnant_woman_tone3":"1f930-1f3fd.svg","pregnant_woman_tone4":"1f930-1f3fe.svg","pregnant_woman_tone5":"1f930-1f3ff.svg","pretzel":"1f968.svg","prince":"1f934.svg","prince_tone1":"1f934-1f3fb.svg","prince_tone2":"1f934-1f3fc.svg","prince_tone3":"1f934-1f3fd.svg","prince_tone4":"1f934-1f3fe.svg","prince_tone5":"1f934-1f3ff.svg","princess":"1f478.svg","princess_tone1":"1f478-1f3fb.svg","princess_tone2":"1f478-1f3fc.svg","princess_tone3":"1f478-1f3fd.svg","princess_tone4":"1f478-1f3fe.svg","princess_tone5":"1f478-1f3ff.svg","printer":"1f5a8.svg","probing_cane":"1f9af.svg","projector":"1f4fd.svg","punch":"1f44a.svg","punch_tone1":"1f44a-1f3fb.svg","punch_tone2":"1f44a-1f3fc.svg","punch_tone3":"1f44a-1f3fd.svg","punch_tone4":"1f44a-1f3fe.svg","punch_tone5":"1f44a-1f3ff.svg","purple_circle":"1f7e3.svg","purple_heart":"1f49c.svg","purple_square":"1f7ea.svg","purse":"1f45b.svg","pushpin":"1f4cc.svg","put_litter_in_its_place":"1f6ae.svg","question":"2753.svg","rabbit2":"1f407.svg","rabbit":"1f430.svg","raccoon":"1f99d.svg","race_car":"1f3ce.svg","racehorse":"1f40e.svg","radio":"1f4fb.svg","radio_button":"1f518.svg","radioactive":"2622.svg","rage":"1f621.svg","railway_car":"1f683.svg","railway_track":"1f6e4.svg","rainbow":"1f308.svg","rainbow_flag":"1f3f3-fe0f-200d-1f308.svg","raised_back_of_hand":"1f91a.svg","raised_back_of_hand_tone1":"1f91a-1f3fb.svg","raised_back_of_hand_tone2":"1f91a-1f3fc.svg","raised_back_of_hand_tone3":"1f91a-1f3fd.svg","raised_back_of_hand_tone4":"1f91a-1f3fe.svg","raised_back_of_hand_tone5":"1f91a-1f3ff.svg","raised_hand":"270b.svg","raised_hand_tone1":"270b-1f3fb.svg","raised_hand_tone2":"270b-1f3fc.svg","raised_hand_tone3":"270b-1f3fd.svg","raised_hand_tone4":"270b-1f3fe.svg","raised_hand_tone5":"270b-1f3ff.svg","raised_hands":"1f64c.svg","raised_hands_tone1":"1f64c-1f3fb.svg","raised_hands_tone2":"1f64c-1f3fc.svg","raised_hands_tone3":"1f64c-1f3fd.svg","raised_hands_tone4":"1f64c-1f3fe.svg","raised_hands_tone5":"1f64c-1f3ff.svg","ram":"1f40f.svg","ramen":"1f35c.svg","rat":"1f400.svg","razor":"1fa92.svg","receipt":"1f9fe.svg","record_button":"23fa.svg","recycle":"267b.svg","red_car":"1f697.svg","red_circle":"1f534.svg","red_envelope":"1f9e7.svg","red_haired":"1f9b0.svg","red_square":"1f7e5.svg","regional_indicator_a":"1f1e6.svg","regional_indicator_b":"1f1e7.svg","regional_indicator_c":"1f1e8.svg","regional_indicator_d":"1f1e9.svg","regional_indicator_e":"1f1ea.svg","regional_indicator_f":"1f1eb.svg","regional_indicator_g":"1f1ec.svg","regional_indicator_h":"1f1ed.svg","regional_indicator_i":"1f1ee.svg","regional_indicator_j":"1f1ef.svg","regional_indicator_k":"1f1f0.svg","regional_indicator_l":"1f1f1.svg","regional_indicator_m":"1f1f2.svg","regional_indicator_n":"1f1f3.svg","regional_indicator_o":"1f1f4.svg","regional_indicator_p":"1f1f5.svg","regional_indicator_q":"1f1f6.svg","regional_indicator_r":"1f1f7.svg","regional_indicator_s":"1f1f8.svg","regional_indicator_t":"1f1f9.svg","regional_indicator_u":"1f1fa.svg","regional_indicator_v":"1f1fb.svg","regional_indicator_w":"1f1fc.svg","regional_indicator_x":"1f1fd.svg","regional_indicator_y":"1f1fe.svg","regional_indicator_z":"1f1ff.svg","registered":"ae.svg","relaxed":"263a.svg","relieved":"1f60c.svg","reminder_ribbon":"1f397.svg","repeat":"1f501.svg","repeat_one":"1f502.svg","restroom":"1f6bb.svg","revolving_hearts":"1f49e.svg","rewind":"23ea.svg","rhino":"1f98f.svg","ribbon":"1f380.svg","rice":"1f35a.svg","rice_ball":"1f359.svg","rice_cracker":"1f358.svg","rice_scene":"1f391.svg","right_facing_fist":"1f91c.svg","right_facing_fist_tone1":"1f91c-1f3fb.svg","right_facing_fist_tone2":"1f91c-1f3fc.svg","right_facing_fist_tone3":"1f91c-1f3fd.svg","right_facing_fist_tone4":"1f91c-1f3fe.svg","right_facing_fist_tone5":"1f91c-1f3ff.svg","ring":"1f48d.svg","ringed_planet":"1fa90.svg","robot":"1f916.svg","rock":"1faa8.svg","rocket":"1f680.svg","rofl":"1f923.svg","roll_of_paper":"1f9fb.svg","roller_coaster":"1f3a2.svg","roller_skate":"1f6fc.svg","rolling_eyes":"1f644.svg","rooster":"1f413.svg","rose":"1f339.svg","rosette":"1f3f5.svg","rotating_light":"1f6a8.svg","round_pushpin":"1f4cd.svg","rugby_football":"1f3c9.svg","running_shirt_with_sash":"1f3bd.svg","sa":"1f202.svg","safety_pin":"1f9f7.svg","safety_vest":"1f9ba.svg","sagittarius":"2650.svg","sailboat":"26f5.svg","sake":"1f376.svg","salad":"1f957.svg","salt":"1f9c2.svg","sandal":"1f461.svg","sandwich":"1f96a.svg","santa":"1f385.svg","santa_tone1":"1f385-1f3fb.svg","santa_tone2":"1f385-1f3fc.svg","santa_tone3":"1f385-1f3fd.svg","santa_tone4":"1f385-1f3fe.svg","santa_tone5":"1f385-1f3ff.svg","sari":"1f97b.svg","satellite":"1f4e1.svg","satellite_orbital":"1f6f0.svg","sauropod":"1f995.svg","saxophone":"1f3b7.svg","scales":"2696.svg","scarf":"1f9e3.svg","school":"1f3eb.svg","school_satchel":"1f392.svg","scientist":"1f9d1-200d-1f52c.svg","scientist_tone1":"1f9d1-1f3fb-200d-1f52c.svg","scientist_tone2":"1f9d1-1f3fc-200d-1f52c.svg","scientist_tone3":"1f9d1-1f3fd-200d-1f52c.svg","scientist_tone4":"1f9d1-1f3fe-200d-1f52c.svg","scientist_tone5":"1f9d1-1f3ff-200d-1f52c.svg","scissors":"2702.svg","scooter":"1f6f4.svg","scorpion":"1f982.svg","scorpius":"264f.svg","scotland":"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.svg","scream":"1f631.svg","scream_cat":"1f640.svg","screwdriver":"1fa9b.svg","scroll":"1f4dc.svg","seal":"1f9ad.svg","seat":"1f4ba.svg","second_place":"1f948.svg","secret":"3299.svg","see_no_evil":"1f648.svg","seedling":"1f331.svg","selfie":"1f933.svg","selfie_tone1":"1f933-1f3fb.svg","selfie_tone2":"1f933-1f3fc.svg","selfie_tone3":"1f933-1f3fd.svg","selfie_tone4":"1f933-1f3fe.svg","selfie_tone5":"1f933-1f3ff.svg","service_dog":"1f415-200d-1f9ba.svg","seven":"37-20e3.svg","sewing_needle":"1faa1.svg","shallow_pan_of_food":"1f958.svg","shamrock":"2618.svg","shark":"1f988.svg","shaved_ice":"1f367.svg","sheep":"1f411.svg","shell":"1f41a.svg","shibuya":"e50a.svg","shield":"1f6e1.svg","shinto_shrine":"26e9.svg","ship":"1f6a2.svg","shirt":"1f455.svg","shopping_bags":"1f6cd.svg","shopping_cart":"1f6d2.svg","shorts":"1fa73.svg","shower":"1f6bf.svg","shrimp":"1f990.svg","shushing_face":"1f92b.svg","signal_strength":"1f4f6.svg","singer":"1f9d1-200d-1f3a4.svg","singer_tone1":"1f9d1-1f3fb-200d-1f3a4.svg","singer_tone2":"1f9d1-1f3fc-200d-1f3a4.svg","singer_tone3":"1f9d1-1f3fd-200d-1f3a4.svg","singer_tone4":"1f9d1-1f3fe-200d-1f3a4.svg","singer_tone5":"1f9d1-1f3ff-200d-1f3a4.svg","six":"36-20e3.svg","six_pointed_star":"1f52f.svg","skateboard":"1f6f9.svg","ski":"1f3bf.svg","skier":"26f7.svg","skier_tone1":"26f7-1f3fb.svg","skier_tone2":"26f7-1f3fc.svg","skier_tone3":"26f7-1f3fd.svg","skier_tone4":"26f7-1f3fe.svg","skier_tone5":"26f7-1f3ff.svg","skull":"1f480.svg","skull_crossbones":"2620.svg","skunk":"1f9a8.svg","sled":"1f6f7.svg","sleeping":"1f634.svg","sleeping_accommodation":"1f6cc.svg","sleepy":"1f62a.svg","slight_frown":"1f641.svg","slight_smile":"1f642.svg","slot_machine":"1f3b0.svg","sloth":"1f9a5.svg","small_blue_diamond":"1f539.svg","small_orange_diamond":"1f538.svg","small_red_triangle":"1f53a.svg","small_red_triangle_down":"1f53b.svg","smile":"1f604.svg","smile_cat":"1f638.svg","smiley":"1f603.svg","smiley_cat":"1f63a.svg","smiling_face_with_3_hearts":"1f970.svg","smiling_face_with_tear":"1f972.svg","smiling_imp":"1f608.svg","smirk":"1f60f.svg","smirk_cat":"1f63c.svg","smoking":"1f6ac.svg","snail":"1f40c.svg","snake":"1f40d.svg","sneezing_face":"1f927.svg","snowboarder":"1f3c2.svg","snowboarder_tone1":"1f3c2-1f3fb.svg","snowboarder_tone2":"1f3c2-1f3fc.svg","snowboarder_tone3":"1f3c2-1f3fd.svg","snowboarder_tone4":"1f3c2-1f3fe.svg","snowboarder_tone5":"1f3c2-1f3ff.svg","snowflake":"2744.svg","snowman2":"2603.svg","snowman":"26c4.svg","soap":"1f9fc.svg","sob":"1f62d.svg","soccer":"26bd.svg","socks":"1f9e6.svg","softball":"1f94e.svg","soon":"1f51c.svg","sos":"1f198.svg","sound":"1f509.svg","space_invader":"1f47e.svg","spades":"2660.svg","spaghetti":"1f35d.svg","sparkle":"2747.svg","sparkler":"1f387.svg","sparkles":"2728.svg","sparkling_heart":"1f496.svg","speak_no_evil":"1f64a.svg","speaker":"1f508.svg","speaking_head":"1f5e3.svg","speech_balloon":"1f4ac.svg","speech_left":"1f5e8.svg","speedboat":"1f6a4.svg","spider":"1f577.svg","spider_web":"1f578.svg","sponge":"1f9fd.svg","spoon":"1f944.svg","squeeze_bottle":"1f9f4.svg","squid":"1f991.svg","stadium":"1f3df.svg","star2":"1f31f.svg","star":"2b50.svg","star_and_crescent":"262a.svg","star_of_david":"2721.svg","star_struck":"1f929.svg","stars":"1f320.svg","station":"1f689.svg","statue_of_liberty":"1f5fd.svg","steam_locomotive":"1f682.svg","stethoscope":"1fa7a.svg","stew":"1f372.svg","stop_button":"23f9.svg","stopwatch":"23f1.svg","straight_ruler":"1f4cf.svg","strawberry":"1f353.svg","stuck_out_tongue":"1f61b.svg","stuck_out_tongue_closed_eyes":"1f61d.svg","stuck_out_tongue_winking_eye":"1f61c.svg","student":"1f9d1-200d-1f393.svg","student_tone1":"1f9d1-1f3fb-200d-1f393.svg","student_tone2":"1f9d1-1f3fc-200d-1f393.svg","student_tone3":"1f9d1-1f3fd-200d-1f393.svg","student_tone4":"1f9d1-1f3fe-200d-1f393.svg","student_tone5":"1f9d1-1f3ff-200d-1f393.svg","stuffed_flatbread":"1f959.svg","sun_with_face":"1f31e.svg","sunflower":"1f33b.svg","sunglasses":"1f60e.svg","sunny":"2600.svg","sunrise":"1f305.svg","sunrise_over_mountains":"1f304.svg","superhero":"1f9b8.svg","superhero_tone1":"1f9b8-1f3fb.svg","superhero_tone2":"1f9b8-1f3fc.svg","superhero_tone3":"1f9b8-1f3fd.svg","superhero_tone4":"1f9b8-1f3fe.svg","superhero_tone5":"1f9b8-1f3ff.svg","supervillain":"1f9b9.svg","supervillain_tone1":"1f9b9-1f3fb.svg","supervillain_tone2":"1f9b9-1f3fc.svg","supervillain_tone3":"1f9b9-1f3fd.svg","supervillain_tone4":"1f9b9-1f3fe.svg","supervillain_tone5":"1f9b9-1f3ff.svg","sushi":"1f363.svg","suspension_railway":"1f69f.svg","swan":"1f9a2.svg","sweat":"1f613.svg","sweat_drops":"1f4a6.svg","sweat_smile":"1f605.svg","sweet_potato":"1f360.svg","symbols":"1f523.svg","synagogue":"1f54d.svg","syringe":"1f489.svg","t_rex":"1f996.svg","taco":"1f32e.svg","tada":"1f389.svg","takeout_box":"1f961.svg","tamale":"1fad4.svg","tanabata_tree":"1f38b.svg","tangerine":"1f34a.svg","taurus":"2649.svg","taxi":"1f695.svg","tea":"1f375.svg","teacher":"1f9d1-200d-1f3eb.svg","teacher_tone1":"1f9d1-1f3fb-200d-1f3eb.svg","teacher_tone2":"1f9d1-1f3fc-200d-1f3eb.svg","teacher_tone3":"1f9d1-1f3fd-200d-1f3eb.svg","teacher_tone4":"1f9d1-1f3fe-200d-1f3eb.svg","teacher_tone5":"1f9d1-1f3ff-200d-1f3eb.svg","teapot":"1fad6.svg","technologist":"1f9d1-200d-1f4bb.svg","technologist_tone1":"1f9d1-1f3fb-200d-1f4bb.svg","technologist_tone2":"1f9d1-1f3fc-200d-1f4bb.svg","technologist_tone3":"1f9d1-1f3fd-200d-1f4bb.svg","technologist_tone4":"1f9d1-1f3fe-200d-1f4bb.svg","technologist_tone5":"1f9d1-1f3ff-200d-1f4bb.svg","teddy_bear":"1f9f8.svg","telephone":"260e.svg","telephone_receiver":"1f4de.svg","telescope":"1f52d.svg","tennis":"1f3be.svg","tent":"26fa.svg","test_tube":"1f9ea.svg","thermometer":"1f321.svg","thermometer_face":"1f912.svg","thinking":"1f914.svg","third_place":"1f949.svg","thong_sandal":"1fa74.svg","thought_balloon":"1f4ad.svg","thread":"1f9f5.svg","three":"33-20e3.svg","thumbsdown":"1f44e.svg","thumbsdown_tone1":"1f44e-1f3fb.svg","thumbsdown_tone2":"1f44e-1f3fc.svg","thumbsdown_tone3":"1f44e-1f3fd.svg","thumbsdown_tone4":"1f44e-1f3fe.svg","thumbsdown_tone5":"1f44e-1f3ff.svg","thumbsup":"1f44d.svg","thumbsup_tone1":"1f44d-1f3fb.svg","thumbsup_tone2":"1f44d-1f3fc.svg","thumbsup_tone3":"1f44d-1f3fd.svg","thumbsup_tone4":"1f44d-1f3fe.svg","thumbsup_tone5":"1f44d-1f3ff.svg","thunder_cloud_rain":"26c8.svg","ticket":"1f3ab.svg","tickets":"1f39f.svg","tiger2":"1f405.svg","tiger":"1f42f.svg","timer":"23f2.svg","tired_face":"1f62b.svg","tm":"2122.svg","toilet":"1f6bd.svg","tokyo_tower":"1f5fc.svg","tomato":"1f345.svg","tone1":"1f3fb.svg","tone2":"1f3fc.svg","tone3":"1f3fd.svg","tone4":"1f3fe.svg","tone5":"1f3ff.svg","tongue":"1f445.svg","toolbox":"1f9f0.svg","tools":"1f6e0.svg","tooth":"1f9b7.svg","toothbrush":"1faa5.svg","top":"1f51d.svg","tophat":"1f3a9.svg","track_next":"23ed.svg","track_previous":"23ee.svg","trackball":"1f5b2.svg","tractor":"1f69c.svg","traffic_light":"1f6a5.svg","train2":"1f686.svg","train":"1f68b.svg","tram":"1f68a.svg","transgender_flag":"1f3f3-fe0f-200d-26a7-fe0f.svg","transgender_symbol":"26a7.svg","triangular_flag_on_post":"1f6a9.svg","triangular_ruler":"1f4d0.svg","trident":"1f531.svg","triumph":"1f624.svg","trolleybus":"1f68e.svg","trophy":"1f3c6.svg","tropical_drink":"1f379.svg","tropical_fish":"1f420.svg","truck":"1f69a.svg","trumpet":"1f3ba.svg","tulip":"1f337.svg","tumbler_glass":"1f943.svg","turkey":"1f983.svg","turtle":"1f422.svg","tv":"1f4fa.svg","twisted_rightwards_arrows":"1f500.svg","two":"32-20e3.svg","two_hearts":"1f495.svg","two_men_holding_hands":"1f46c.svg","two_women_holding_hands":"1f46d.svg","u5272":"1f239.svg","u5408":"1f234.svg","u55b6":"1f23a.svg","u6307":"1f22f.svg","u6708":"1f237.svg","u6709":"1f236.svg","u6e80":"1f235.svg","u7121":"1f21a.svg","u7533":"1f238.svg","u7981":"1f232.svg","u7a7a":"1f233.svg","umbrella2":"2602.svg","umbrella":"2614.svg","unamused":"1f612.svg","underage":"1f51e.svg","unicorn":"1f984.svg","united_nations":"1f1fa-1f1f3.svg","unlock":"1f513.svg","up":"1f199.svg","upside_down":"1f643.svg","urn":"26b1.svg","v":"270c.svg","v_tone1":"270c-1f3fb.svg","v_tone2":"270c-1f3fc.svg","v_tone3":"270c-1f3fd.svg","v_tone4":"270c-1f3fe.svg","v_tone5":"270c-1f3ff.svg","vampire":"1f9db.svg","vampire_tone1":"1f9db-1f3fb.svg","vampire_tone2":"1f9db-1f3fc.svg","vampire_tone3":"1f9db-1f3fd.svg","vampire_tone4":"1f9db-1f3fe.svg","vampire_tone5":"1f9db-1f3ff.svg","vertical_traffic_light":"1f6a6.svg","vhs":"1f4fc.svg","vibration_mode":"1f4f3.svg","video_camera":"1f4f9.svg","video_game":"1f3ae.svg","violin":"1f3bb.svg","virgo":"264d.svg","volcano":"1f30b.svg","volleyball":"1f3d0.svg","vs":"1f19a.svg","vulcan":"1f596.svg","vulcan_tone1":"1f596-1f3fb.svg","vulcan_tone2":"1f596-1f3fc.svg","vulcan_tone3":"1f596-1f3fd.svg","vulcan_tone4":"1f596-1f3fe.svg","vulcan_tone5":"1f596-1f3ff.svg","waffle":"1f9c7.svg","wales":"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg","waning_crescent_moon":"1f318.svg","waning_gibbous_moon":"1f316.svg","warning":"26a0.svg","wastebasket":"1f5d1.svg","watch":"231a.svg","water_buffalo":"1f403.svg","watermelon":"1f349.svg","wave":"1f44b.svg","wave_tone1":"1f44b-1f3fb.svg","wave_tone2":"1f44b-1f3fc.svg","wave_tone3":"1f44b-1f3fd.svg","wave_tone4":"1f44b-1f3fe.svg","wave_tone5":"1f44b-1f3ff.svg","wavy_dash":"3030.svg","waxing_crescent_moon":"1f312.svg","waxing_gibbous_moon":"1f314.svg","wc":"1f6be.svg","weary":"1f629.svg","wedding":"1f492.svg","whale2":"1f40b.svg","whale":"1f433.svg","wheel_of_dharma":"2638.svg","wheelchair":"267f.svg","white_check_mark":"2705.svg","white_circle":"26aa.svg","white_flower":"1f4ae.svg","white_haired":"1f9b3.svg","white_heart":"1f90d.svg","white_large_square":"2b1c.svg","white_medium_small_square":"25fd.svg","white_medium_square":"25fb.svg","white_small_square":"25ab.svg","white_square_button":"1f533.svg","white_sun_cloud":"1f325.svg","white_sun_rain_cloud":"1f326.svg","white_sun_small_cloud":"1f324.svg","wilted_rose":"1f940.svg","wind_blowing_face":"1f32c.svg","wind_chime":"1f390.svg","window":"1fa9f.svg","wine_glass":"1f377.svg","wink":"1f609.svg","wolf":"1f43a.svg","woman":"1f469.svg","woman_and_man_holding_hands_tone1":"1f46b-1f3fb.svg","woman_and_man_holding_hands_tone1_tone2":"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc.svg","woman_and_man_holding_hands_tone1_tone3":"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd.svg","woman_and_man_holding_hands_tone1_tone4":"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe.svg","woman_and_man_holding_hands_tone1_tone5":"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff.svg","woman_and_man_holding_hands_tone2":"1f46b-1f3fc.svg","woman_and_man_holding_hands_tone2_tone1":"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb.svg","woman_and_man_holding_hands_tone2_tone3":"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd.svg","woman_and_man_holding_hands_tone2_tone4":"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe.svg","woman_and_man_holding_hands_tone2_tone5":"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff.svg","woman_and_man_holding_hands_tone3":"1f46b-1f3fd.svg","woman_and_man_holding_hands_tone3_tone1":"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb.svg","woman_and_man_holding_hands_tone3_tone2":"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc.svg","woman_and_man_holding_hands_tone3_tone4":"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe.svg","woman_and_man_holding_hands_tone3_tone5":"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff.svg","woman_and_man_holding_hands_tone4":"1f46b-1f3fe.svg","woman_and_man_holding_hands_tone4_tone1":"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb.svg","woman_and_man_holding_hands_tone4_tone2":"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc.svg","woman_and_man_holding_hands_tone4_tone3":"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd.svg","woman_and_man_holding_hands_tone4_tone5":"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff.svg","woman_and_man_holding_hands_tone5":"1f46b-1f3ff.svg","woman_and_man_holding_hands_tone5_tone1":"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb.svg","woman_and_man_holding_hands_tone5_tone2":"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc.svg","woman_and_man_holding_hands_tone5_tone3":"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd.svg","woman_and_man_holding_hands_tone5_tone4":"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe.svg","woman_artist":"1f469-200d-1f3a8.svg","woman_artist_tone1":"1f469-1f3fb-200d-1f3a8.svg","woman_artist_tone2":"1f469-1f3fc-200d-1f3a8.svg","woman_artist_tone3":"1f469-1f3fd-200d-1f3a8.svg","woman_artist_tone4":"1f469-1f3fe-200d-1f3a8.svg","woman_artist_tone5":"1f469-1f3ff-200d-1f3a8.svg","woman_astronaut":"1f469-200d-1f680.svg","woman_astronaut_tone1":"1f469-1f3fb-200d-1f680.svg","woman_astronaut_tone2":"1f469-1f3fc-200d-1f680.svg","woman_astronaut_tone3":"1f469-1f3fd-200d-1f680.svg","woman_astronaut_tone4":"1f469-1f3fe-200d-1f680.svg","woman_astronaut_tone5":"1f469-1f3ff-200d-1f680.svg","woman_bald":"1f469-200d-1f9b2.svg","woman_bald_tone1":"1f469-1f3fb-200d-1f9b2.svg","woman_bald_tone2":"1f469-1f3fc-200d-1f9b2.svg","woman_bald_tone3":"1f469-1f3fd-200d-1f9b2.svg","woman_bald_tone4":"1f469-1f3fe-200d-1f9b2.svg","woman_bald_tone5":"1f469-1f3ff-200d-1f9b2.svg","woman_beard":"1f9d4-200d-2640-fe0f.svg","woman_biking":"1f6b4-200d-2640-fe0f.svg","woman_biking_tone1":"1f6b4-1f3fb-200d-2640-fe0f.svg","woman_biking_tone2":"1f6b4-1f3fc-200d-2640-fe0f.svg","woman_biking_tone3":"1f6b4-1f3fd-200d-2640-fe0f.svg","woman_biking_tone4":"1f6b4-1f3fe-200d-2640-fe0f.svg","woman_biking_tone5":"1f6b4-1f3ff-200d-2640-fe0f.svg","woman_bouncing_ball":"26f9-fe0f-200d-2640-fe0f.svg","woman_bouncing_ball_tone1":"26f9-1f3fb-200d-2640-fe0f.svg","woman_bouncing_ball_tone2":"26f9-1f3fc-200d-2640-fe0f.svg","woman_bouncing_ball_tone3":"26f9-1f3fd-200d-2640-fe0f.svg","woman_bouncing_ball_tone4":"26f9-1f3fe-200d-2640-fe0f.svg","woman_bouncing_ball_tone5":"26f9-1f3ff-200d-2640-fe0f.svg","woman_bowing":"1f647-200d-2640-fe0f.svg","woman_bowing_tone1":"1f647-1f3fb-200d-2640-fe0f.svg","woman_bowing_tone2":"1f647-1f3fc-200d-2640-fe0f.svg","woman_bowing_tone3":"1f647-1f3fd-200d-2640-fe0f.svg","woman_bowing_tone4":"1f647-1f3fe-200d-2640-fe0f.svg","woman_bowing_tone5":"1f647-1f3ff-200d-2640-fe0f.svg","woman_cartwheeling":"1f938-200d-2640-fe0f.svg","woman_cartwheeling_tone1":"1f938-1f3fb-200d-2640-fe0f.svg","woman_cartwheeling_tone2":"1f938-1f3fc-200d-2640-fe0f.svg","woman_cartwheeling_tone3":"1f938-1f3fd-200d-2640-fe0f.svg","woman_cartwheeling_tone4":"1f938-1f3fe-200d-2640-fe0f.svg","woman_cartwheeling_tone5":"1f938-1f3ff-200d-2640-fe0f.svg","woman_climbing":"1f9d7-200d-2640-fe0f.svg","woman_climbing_tone1":"1f9d7-1f3fb-200d-2640-fe0f.svg","woman_climbing_tone2":"1f9d7-1f3fc-200d-2640-fe0f.svg","woman_climbing_tone3":"1f9d7-1f3fd-200d-2640-fe0f.svg","woman_climbing_tone4":"1f9d7-1f3fe-200d-2640-fe0f.svg","woman_climbing_tone5":"1f9d7-1f3ff-200d-2640-fe0f.svg","woman_construction_worker":"1f477-200d-2640-fe0f.svg","woman_construction_worker_tone1":"1f477-1f3fb-200d-2640-fe0f.svg","woman_construction_worker_tone2":"1f477-1f3fc-200d-2640-fe0f.svg","woman_construction_worker_tone3":"1f477-1f3fd-200d-2640-fe0f.svg","woman_construction_worker_tone4":"1f477-1f3fe-200d-2640-fe0f.svg","woman_construction_worker_tone5":"1f477-1f3ff-200d-2640-fe0f.svg","woman_cook":"1f469-200d-1f373.svg","woman_cook_tone1":"1f469-1f3fb-200d-1f373.svg","woman_cook_tone2":"1f469-1f3fc-200d-1f373.svg","woman_cook_tone3":"1f469-1f3fd-200d-1f373.svg","woman_cook_tone4":"1f469-1f3fe-200d-1f373.svg","woman_cook_tone5":"1f469-1f3ff-200d-1f373.svg","woman_curly_haired":"1f469-200d-1f9b1.svg","woman_curly_haired_tone1":"1f469-1f3fb-200d-1f9b1.svg","woman_curly_haired_tone2":"1f469-1f3fc-200d-1f9b1.svg","woman_curly_haired_tone3":"1f469-1f3fd-200d-1f9b1.svg","woman_curly_haired_tone4":"1f469-1f3fe-200d-1f9b1.svg","woman_curly_haired_tone5":"1f469-1f3ff-200d-1f9b1.svg","woman_detective":"1f575-fe0f-200d-2640-fe0f.svg","woman_detective_tone1":"1f575-1f3fb-200d-2640-fe0f.svg","woman_detective_tone2":"1f575-1f3fc-200d-2640-fe0f.svg","woman_detective_tone3":"1f575-1f3fd-200d-2640-fe0f.svg","woman_detective_tone4":"1f575-1f3fe-200d-2640-fe0f.svg","woman_detective_tone5":"1f575-1f3ff-200d-2640-fe0f.svg","woman_elf":"1f9dd-200d-2640-fe0f.svg","woman_elf_tone1":"1f9dd-1f3fb-200d-2640-fe0f.svg","woman_elf_tone2":"1f9dd-1f3fc-200d-2640-fe0f.svg","woman_elf_tone3":"1f9dd-1f3fd-200d-2640-fe0f.svg","woman_elf_tone4":"1f9dd-1f3fe-200d-2640-fe0f.svg","woman_elf_tone5":"1f9dd-1f3ff-200d-2640-fe0f.svg","woman_facepalming":"1f926-200d-2640-fe0f.svg","woman_facepalming_tone1":"1f926-1f3fb-200d-2640-fe0f.svg","woman_facepalming_tone2":"1f926-1f3fc-200d-2640-fe0f.svg","woman_facepalming_tone3":"1f926-1f3fd-200d-2640-fe0f.svg","woman_facepalming_tone4":"1f926-1f3fe-200d-2640-fe0f.svg","woman_facepalming_tone5":"1f926-1f3ff-200d-2640-fe0f.svg","woman_factory_worker":"1f469-200d-1f3ed.svg","woman_factory_worker_tone1":"1f469-1f3fb-200d-1f3ed.svg","woman_factory_worker_tone2":"1f469-1f3fc-200d-1f3ed.svg","woman_factory_worker_tone3":"1f469-1f3fd-200d-1f3ed.svg","woman_factory_worker_tone4":"1f469-1f3fe-200d-1f3ed.svg","woman_factory_worker_tone5":"1f469-1f3ff-200d-1f3ed.svg","woman_fairy":"1f9da-200d-2640-fe0f.svg","woman_fairy_tone1":"1f9da-1f3fb-200d-2640-fe0f.svg","woman_fairy_tone2":"1f9da-1f3fc-200d-2640-fe0f.svg","woman_fairy_tone3":"1f9da-1f3fd-200d-2640-fe0f.svg","woman_fairy_tone4":"1f9da-1f3fe-200d-2640-fe0f.svg","woman_fairy_tone5":"1f9da-1f3ff-200d-2640-fe0f.svg","woman_farmer":"1f469-200d-1f33e.svg","woman_farmer_tone1":"1f469-1f3fb-200d-1f33e.svg","woman_farmer_tone2":"1f469-1f3fc-200d-1f33e.svg","woman_farmer_tone3":"1f469-1f3fd-200d-1f33e.svg","woman_farmer_tone4":"1f469-1f3fe-200d-1f33e.svg","woman_farmer_tone5":"1f469-1f3ff-200d-1f33e.svg","woman_feeding_baby":"1f469-200d-1f37c.svg","woman_feeding_baby_tone1":"1f469-1f3fb-200d-1f37c.svg","woman_feeding_baby_tone2":"1f469-1f3fc-200d-1f37c.svg","woman_feeding_baby_tone3":"1f469-1f3fd-200d-1f37c.svg","woman_feeding_baby_tone4":"1f469-1f3fe-200d-1f37c.svg","woman_feeding_baby_tone5":"1f469-1f3ff-200d-1f37c.svg","woman_firefighter":"1f469-200d-1f692.svg","woman_firefighter_tone1":"1f469-1f3fb-200d-1f692.svg","woman_firefighter_tone2":"1f469-1f3fc-200d-1f692.svg","woman_firefighter_tone3":"1f469-1f3fd-200d-1f692.svg","woman_firefighter_tone4":"1f469-1f3fe-200d-1f692.svg","woman_firefighter_tone5":"1f469-1f3ff-200d-1f692.svg","woman_frowning":"1f64d-200d-2640-fe0f.svg","woman_frowning_tone1":"1f64d-1f3fb-200d-2640-fe0f.svg","woman_frowning_tone2":"1f64d-1f3fc-200d-2640-fe0f.svg","woman_frowning_tone3":"1f64d-1f3fd-200d-2640-fe0f.svg","woman_frowning_tone4":"1f64d-1f3fe-200d-2640-fe0f.svg","woman_frowning_tone5":"1f64d-1f3ff-200d-2640-fe0f.svg","woman_genie":"1f9de-200d-2640-fe0f.svg","woman_gesturing_no":"1f645-200d-2640-fe0f.svg","woman_gesturing_no_tone1":"1f645-1f3fb-200d-2640-fe0f.svg","woman_gesturing_no_tone2":"1f645-1f3fc-200d-2640-fe0f.svg","woman_gesturing_no_tone3":"1f645-1f3fd-200d-2640-fe0f.svg","woman_gesturing_no_tone4":"1f645-1f3fe-200d-2640-fe0f.svg","woman_gesturing_no_tone5":"1f645-1f3ff-200d-2640-fe0f.svg","woman_gesturing_ok":"1f646-200d-2640-fe0f.svg","woman_gesturing_ok_tone1":"1f646-1f3fb-200d-2640-fe0f.svg","woman_gesturing_ok_tone2":"1f646-1f3fc-200d-2640-fe0f.svg","woman_gesturing_ok_tone3":"1f646-1f3fd-200d-2640-fe0f.svg","woman_gesturing_ok_tone4":"1f646-1f3fe-200d-2640-fe0f.svg","woman_gesturing_ok_tone5":"1f646-1f3ff-200d-2640-fe0f.svg","woman_getting_face_massage":"1f486-200d-2640-fe0f.svg","woman_getting_face_massage_tone1":"1f486-1f3fb-200d-2640-fe0f.svg","woman_getting_face_massage_tone2":"1f486-1f3fc-200d-2640-fe0f.svg","woman_getting_face_massage_tone3":"1f486-1f3fd-200d-2640-fe0f.svg","woman_getting_face_massage_tone4":"1f486-1f3fe-200d-2640-fe0f.svg","woman_getting_face_massage_tone5":"1f486-1f3ff-200d-2640-fe0f.svg","woman_getting_haircut":"1f487-200d-2640-fe0f.svg","woman_getting_haircut_tone1":"1f487-1f3fb-200d-2640-fe0f.svg","woman_getting_haircut_tone2":"1f487-1f3fc-200d-2640-fe0f.svg","woman_getting_haircut_tone3":"1f487-1f3fd-200d-2640-fe0f.svg","woman_getting_haircut_tone4":"1f487-1f3fe-200d-2640-fe0f.svg","woman_getting_haircut_tone5":"1f487-1f3ff-200d-2640-fe0f.svg","woman_golfing":"1f3cc-fe0f-200d-2640-fe0f.svg","woman_golfing_tone1":"1f3cc-1f3fb-200d-2640-fe0f.svg","woman_golfing_tone2":"1f3cc-1f3fc-200d-2640-fe0f.svg","woman_golfing_tone3":"1f3cc-1f3fd-200d-2640-fe0f.svg","woman_golfing_tone4":"1f3cc-1f3fe-200d-2640-fe0f.svg","woman_golfing_tone5":"1f3cc-1f3ff-200d-2640-fe0f.svg","woman_guard":"1f482-200d-2640-fe0f.svg","woman_guard_tone1":"1f482-1f3fb-200d-2640-fe0f.svg","woman_guard_tone2":"1f482-1f3fc-200d-2640-fe0f.svg","woman_guard_tone3":"1f482-1f3fd-200d-2640-fe0f.svg","woman_guard_tone4":"1f482-1f3fe-200d-2640-fe0f.svg","woman_guard_tone5":"1f482-1f3ff-200d-2640-fe0f.svg","woman_health_worker":"1f469-200d-2695-fe0f.svg","woman_health_worker_tone1":"1f469-1f3fb-200d-2695-fe0f.svg","woman_health_worker_tone2":"1f469-1f3fc-200d-2695-fe0f.svg","woman_health_worker_tone3":"1f469-1f3fd-200d-2695-fe0f.svg","woman_health_worker_tone4":"1f469-1f3fe-200d-2695-fe0f.svg","woman_health_worker_tone5":"1f469-1f3ff-200d-2695-fe0f.svg","woman_in_lotus_position":"1f9d8-200d-2640-fe0f.svg","woman_in_lotus_position_tone1":"1f9d8-1f3fb-200d-2640-fe0f.svg","woman_in_lotus_position_tone2":"1f9d8-1f3fc-200d-2640-fe0f.svg","woman_in_lotus_position_tone3":"1f9d8-1f3fd-200d-2640-fe0f.svg","woman_in_lotus_position_tone4":"1f9d8-1f3fe-200d-2640-fe0f.svg","woman_in_lotus_position_tone5":"1f9d8-1f3ff-200d-2640-fe0f.svg","woman_in_manual_wheelchair":"1f469-200d-1f9bd.svg","woman_in_manual_wheelchair_tone1":"1f469-1f3fb-200d-1f9bd.svg","woman_in_manual_wheelchair_tone2":"1f469-1f3fc-200d-1f9bd.svg","woman_in_manual_wheelchair_tone3":"1f469-1f3fd-200d-1f9bd.svg","woman_in_manual_wheelchair_tone4":"1f469-1f3fe-200d-1f9bd.svg","woman_in_manual_wheelchair_tone5":"1f469-1f3ff-200d-1f9bd.svg","woman_in_motorized_wheelchair":"1f469-200d-1f9bc.svg","woman_in_motorized_wheelchair_tone1":"1f469-1f3fb-200d-1f9bc.svg","woman_in_motorized_wheelchair_tone2":"1f469-1f3fc-200d-1f9bc.svg","woman_in_motorized_wheelchair_tone3":"1f469-1f3fd-200d-1f9bc.svg","woman_in_motorized_wheelchair_tone4":"1f469-1f3fe-200d-1f9bc.svg","woman_in_motorized_wheelchair_tone5":"1f469-1f3ff-200d-1f9bc.svg","woman_in_santa_hat":"1f469-200d-1f384.svg","woman_in_santa_hat_tone1":"1f469-1f3fb-200d-1f384.svg","woman_in_santa_hat_tone2":"1f468-1f3ff-200d-1f384.svg","woman_in_santa_hat_tone3":"1f469-1f3fe-200d-1f384.svg","woman_in_santa_hat_tone4":"1f469-1f3fd-200d-1f384.svg","woman_in_santa_hat_tone5":"1f469-1f3fc-200d-1f384.svg","woman_in_steamy_room":"1f9d6-200d-2640-fe0f.svg","woman_in_steamy_room_tone1":"1f9d6-1f3fb-200d-2640-fe0f.svg","woman_in_steamy_room_tone2":"1f9d6-1f3fc-200d-2640-fe0f.svg","woman_in_steamy_room_tone3":"1f9d6-1f3fd-200d-2640-fe0f.svg","woman_in_steamy_room_tone4":"1f9d6-1f3fe-200d-2640-fe0f.svg","woman_in_steamy_room_tone5":"1f9d6-1f3ff-200d-2640-fe0f.svg","woman_in_tuxedo":"1f935-200d-2640-fe0f.svg","woman_in_tuxedo_tone1":"1f935-1f3fb-200d-2640-fe0f.svg","woman_in_tuxedo_tone2":"1f935-1f3fc-200d-2640-fe0f.svg","woman_in_tuxedo_tone3":"1f935-1f3fd-200d-2640-fe0f.svg","woman_in_tuxedo_tone4":"1f935-1f3fe-200d-2640-fe0f.svg","woman_in_tuxedo_tone5":"1f935-1f3ff-200d-2640-fe0f.svg","woman_judge":"1f469-200d-2696-fe0f.svg","woman_judge_tone1":"1f469-1f3fb-200d-2696-fe0f.svg","woman_judge_tone2":"1f469-1f3fc-200d-2696-fe0f.svg","woman_judge_tone3":"1f469-1f3fd-200d-2696-fe0f.svg","woman_judge_tone4":"1f469-1f3fe-200d-2696-fe0f.svg","woman_judge_tone5":"1f469-1f3ff-200d-2696-fe0f.svg","woman_juggling":"1f939-200d-2640-fe0f.svg","woman_juggling_tone1":"1f939-1f3fb-200d-2640-fe0f.svg","woman_juggling_tone2":"1f939-1f3fc-200d-2640-fe0f.svg","woman_juggling_tone3":"1f939-1f3fd-200d-2640-fe0f.svg","woman_juggling_tone4":"1f939-1f3fe-200d-2640-fe0f.svg","woman_juggling_tone5":"1f939-1f3ff-200d-2640-fe0f.svg","woman_kneeling":"1f9ce-200d-2640-fe0f.svg","woman_kneeling_tone1":"1f9ce-1f3fb-200d-2640-fe0f.svg","woman_kneeling_tone2":"1f9ce-1f3fc-200d-2640-fe0f.svg","woman_kneeling_tone3":"1f9ce-1f3fd-200d-2640-fe0f.svg","woman_kneeling_tone4":"1f9ce-1f3fe-200d-2640-fe0f.svg","woman_kneeling_tone5":"1f9ce-1f3ff-200d-2640-fe0f.svg","woman_leviate_tone2":"1f574-1f3fc-200d-2640-fe0f.svg","woman_leviate_tone3":"1f574-1f3fd-200d-2640-fe0f.svg","woman_leviate_tone4":"1f574-1f3fe-200d-2640-fe0f.svg","woman_leviate_tone5":"1f574-1f3ff-200d-2640-fe0f.svg","woman_levitate":"1f574-fe0f-200d-2640-fe0f.svg","woman_levitate_tone1":"1f574-1f3fb-200d-2640-fe0f.svg","woman_lifting_weights":"1f3cb-fe0f-200d-2640-fe0f.svg","woman_lifting_weights_tone1":"1f3cb-1f3fb-200d-2640-fe0f.svg","woman_lifting_weights_tone2":"1f3cb-1f3fc-200d-2640-fe0f.svg","woman_lifting_weights_tone3":"1f3cb-1f3fd-200d-2640-fe0f.svg","woman_lifting_weights_tone4":"1f3cb-1f3fe-200d-2640-fe0f.svg","woman_lifting_weights_tone5":"1f3cb-1f3ff-200d-2640-fe0f.svg","woman_mage":"1f9d9-200d-2640-fe0f.svg","woman_mage_tone1":"1f9d9-1f3fb-200d-2640-fe0f.svg","woman_mage_tone2":"1f9d9-1f3fc-200d-2640-fe0f.svg","woman_mage_tone3":"1f9d9-1f3fd-200d-2640-fe0f.svg","woman_mage_tone4":"1f9d9-1f3fe-200d-2640-fe0f.svg","woman_mage_tone5":"1f9d9-1f3ff-200d-2640-fe0f.svg","woman_mechanic":"1f469-200d-1f527.svg","woman_mechanic_tone1":"1f469-1f3fb-200d-1f527.svg","woman_mechanic_tone2":"1f469-1f3fc-200d-1f527.svg","woman_mechanic_tone3":"1f469-1f3fd-200d-1f527.svg","woman_mechanic_tone4":"1f469-1f3fe-200d-1f527.svg","woman_mechanic_tone5":"1f469-1f3ff-200d-1f527.svg","woman_mountain_biking":"1f6b5-200d-2640-fe0f.svg","woman_mountain_biking_tone1":"1f6b5-1f3fb-200d-2640-fe0f.svg","woman_mountain_biking_tone2":"1f6b5-1f3fc-200d-2640-fe0f.svg","woman_mountain_biking_tone3":"1f6b5-1f3fd-200d-2640-fe0f.svg","woman_mountain_biking_tone4":"1f6b5-1f3fe-200d-2640-fe0f.svg","woman_mountain_biking_tone5":"1f6b5-1f3ff-200d-2640-fe0f.svg","woman_office_worker":"1f469-200d-1f4bc.svg","woman_office_worker_tone1":"1f469-1f3fb-200d-1f4bc.svg","woman_office_worker_tone2":"1f469-1f3fc-200d-1f4bc.svg","woman_office_worker_tone3":"1f469-1f3fd-200d-1f4bc.svg","woman_office_worker_tone4":"1f469-1f3fe-200d-1f4bc.svg","woman_office_worker_tone5":"1f469-1f3ff-200d-1f4bc.svg","woman_pilot":"1f469-200d-2708-fe0f.svg","woman_pilot_tone1":"1f469-1f3fb-200d-2708-fe0f.svg","woman_pilot_tone2":"1f469-1f3fc-200d-2708-fe0f.svg","woman_pilot_tone3":"1f469-1f3fd-200d-2708-fe0f.svg","woman_pilot_tone4":"1f469-1f3fe-200d-2708-fe0f.svg","woman_pilot_tone5":"1f469-1f3ff-200d-2708-fe0f.svg","woman_playing_handball":"1f93e-200d-2640-fe0f.svg","woman_playing_handball_tone1":"1f93e-1f3fb-200d-2640-fe0f.svg","woman_playing_handball_tone2":"1f93e-1f3fc-200d-2640-fe0f.svg","woman_playing_handball_tone3":"1f93e-1f3fd-200d-2640-fe0f.svg","woman_playing_handball_tone4":"1f93e-1f3fe-200d-2640-fe0f.svg","woman_playing_handball_tone5":"1f93e-1f3ff-200d-2640-fe0f.svg","woman_playing_water_polo":"1f93d-200d-2640-fe0f.svg","woman_playing_water_polo_tone1":"1f93d-1f3fb-200d-2640-fe0f.svg","woman_playing_water_polo_tone2":"1f93d-1f3fc-200d-2640-fe0f.svg","woman_playing_water_polo_tone3":"1f93d-1f3fd-200d-2640-fe0f.svg","woman_playing_water_polo_tone4":"1f93d-1f3fe-200d-2640-fe0f.svg","woman_playing_water_polo_tone5":"1f93d-1f3ff-200d-2640-fe0f.svg","woman_police_officer":"1f46e-200d-2640-fe0f.svg","woman_police_officer_tone1":"1f46e-1f3fb-200d-2640-fe0f.svg","woman_police_officer_tone2":"1f46e-1f3fc-200d-2640-fe0f.svg","woman_police_officer_tone3":"1f46e-1f3fd-200d-2640-fe0f.svg","woman_police_officer_tone4":"1f46e-1f3fe-200d-2640-fe0f.svg","woman_police_officer_tone5":"1f46e-1f3ff-200d-2640-fe0f.svg","woman_pouting":"1f64e-200d-2640-fe0f.svg","woman_pouting_tone1":"1f64e-1f3fb-200d-2640-fe0f.svg","woman_pouting_tone2":"1f64e-1f3fc-200d-2640-fe0f.svg","woman_pouting_tone3":"1f64e-1f3fd-200d-2640-fe0f.svg","woman_pouting_tone4":"1f64e-1f3fe-200d-2640-fe0f.svg","woman_pouting_tone5":"1f64e-1f3ff-200d-2640-fe0f.svg","woman_raising_hand":"1f64b-200d-2640-fe0f.svg","woman_raising_hand_tone1":"1f64b-1f3fb-200d-2640-fe0f.svg","woman_raising_hand_tone2":"1f64b-1f3fc-200d-2640-fe0f.svg","woman_raising_hand_tone3":"1f64b-1f3fd-200d-2640-fe0f.svg","woman_raising_hand_tone4":"1f64b-1f3fe-200d-2640-fe0f.svg","woman_raising_hand_tone5":"1f64b-1f3ff-200d-2640-fe0f.svg","woman_red_haired":"1f469-200d-1f9b0.svg","woman_red_haired_tone1":"1f469-1f3fb-200d-1f9b0.svg","woman_red_haired_tone2":"1f469-1f3fc-200d-1f9b0.svg","woman_red_haired_tone3":"1f469-1f3fd-200d-1f9b0.svg","woman_red_haired_tone4":"1f469-1f3fe-200d-1f9b0.svg","woman_red_haired_tone5":"1f469-1f3ff-200d-1f9b0.svg","woman_rowing_boat":"1f6a3-200d-2640-fe0f.svg","woman_rowing_boat_tone1":"1f6a3-1f3fb-200d-2640-fe0f.svg","woman_rowing_boat_tone2":"1f6a3-1f3fc-200d-2640-fe0f.svg","woman_rowing_boat_tone3":"1f6a3-1f3fd-200d-2640-fe0f.svg","woman_rowing_boat_tone4":"1f6a3-1f3fe-200d-2640-fe0f.svg","woman_rowing_boat_tone5":"1f6a3-1f3ff-200d-2640-fe0f.svg","woman_running":"1f3c3-200d-2640-fe0f.svg","woman_running_tone1":"1f3c3-1f3fb-200d-2640-fe0f.svg","woman_running_tone2":"1f3c3-1f3fc-200d-2640-fe0f.svg","woman_running_tone3":"1f3c3-1f3fd-200d-2640-fe0f.svg","woman_running_tone4":"1f3c3-1f3fe-200d-2640-fe0f.svg","woman_running_tone5":"1f3c3-1f3ff-200d-2640-fe0f.svg","woman_scientist":"1f469-200d-1f52c.svg","woman_scientist_tone1":"1f469-1f3fb-200d-1f52c.svg","woman_scientist_tone2":"1f469-1f3fc-200d-1f52c.svg","woman_scientist_tone3":"1f469-1f3fd-200d-1f52c.svg","woman_scientist_tone4":"1f469-1f3fe-200d-1f52c.svg","woman_scientist_tone5":"1f469-1f3ff-200d-1f52c.svg","woman_shrugging":"1f937-200d-2640-fe0f.svg","woman_shrugging_tone1":"1f937-1f3fb-200d-2640-fe0f.svg","woman_shrugging_tone2":"1f937-1f3fc-200d-2640-fe0f.svg","woman_shrugging_tone3":"1f937-1f3fd-200d-2640-fe0f.svg","woman_shrugging_tone4":"1f937-1f3fe-200d-2640-fe0f.svg","woman_shrugging_tone5":"1f937-1f3ff-200d-2640-fe0f.svg","woman_singer":"1f469-200d-1f3a4.svg","woman_singer_tone1":"1f469-1f3fb-200d-1f3a4.svg","woman_singer_tone2":"1f469-1f3fc-200d-1f3a4.svg","woman_singer_tone3":"1f469-1f3fd-200d-1f3a4.svg","woman_singer_tone4":"1f469-1f3fe-200d-1f3a4.svg","woman_singer_tone5":"1f469-1f3ff-200d-1f3a4.svg","woman_standing":"1f9cd-200d-2640-fe0f.svg","woman_standing_tone1":"1f9cd-1f3fb-200d-2640-fe0f.svg","woman_standing_tone2":"1f9cd-1f3fc-200d-2640-fe0f.svg","woman_standing_tone3":"1f9cd-1f3fd-200d-2640-fe0f.svg","woman_standing_tone4":"1f9cd-1f3fe-200d-2640-fe0f.svg","woman_standing_tone5":"1f9cd-1f3ff-200d-2640-fe0f.svg","woman_student":"1f469-200d-1f393.svg","woman_student_tone1":"1f469-1f3fb-200d-1f393.svg","woman_student_tone2":"1f469-1f3fc-200d-1f393.svg","woman_student_tone3":"1f469-1f3fd-200d-1f393.svg","woman_student_tone4":"1f469-1f3fe-200d-1f393.svg","woman_student_tone5":"1f469-1f3ff-200d-1f393.svg","woman_superhero":"1f9b8-200d-2640-fe0f.svg","woman_superhero_tone1":"1f9b8-1f3fb-200d-2640-fe0f.svg","woman_superhero_tone2":"1f9b8-1f3fc-200d-2640-fe0f.svg","woman_superhero_tone3":"1f9b8-1f3fd-200d-2640-fe0f.svg","woman_superhero_tone4":"1f9b8-1f3fe-200d-2640-fe0f.svg","woman_superhero_tone5":"1f9b8-1f3ff-200d-2640-fe0f.svg","woman_supervillain":"1f9b9-200d-2640-fe0f.svg","woman_supervillain_tone1":"1f9b9-1f3fb-200d-2640-fe0f.svg","woman_supervillain_tone2":"1f9b9-1f3fc-200d-2640-fe0f.svg","woman_supervillain_tone3":"1f9b9-1f3fd-200d-2640-fe0f.svg","woman_supervillain_tone4":"1f9b9-1f3fe-200d-2640-fe0f.svg","woman_supervillain_tone5":"1f9b9-1f3ff-200d-2640-fe0f.svg","woman_surfing":"1f3c4-200d-2640-fe0f.svg","woman_surfing_tone1":"1f3c4-1f3fb-200d-2640-fe0f.svg","woman_surfing_tone2":"1f3c4-1f3fc-200d-2640-fe0f.svg","woman_surfing_tone3":"1f3c4-1f3fd-200d-2640-fe0f.svg","woman_surfing_tone4":"1f3c4-1f3fe-200d-2640-fe0f.svg","woman_surfing_tone5":"1f3c4-1f3ff-200d-2640-fe0f.svg","woman_swimming":"1f3ca-200d-2640-fe0f.svg","woman_swimming_tone1":"1f3ca-1f3fb-200d-2640-fe0f.svg","woman_swimming_tone2":"1f3ca-1f3fc-200d-2640-fe0f.svg","woman_swimming_tone3":"1f3ca-1f3fd-200d-2640-fe0f.svg","woman_swimming_tone4":"1f3ca-1f3fe-200d-2640-fe0f.svg","woman_swimming_tone5":"1f3ca-1f3ff-200d-2640-fe0f.svg","woman_teacher":"1f469-200d-1f3eb.svg","woman_teacher_tone1":"1f469-1f3fb-200d-1f3eb.svg","woman_teacher_tone2":"1f469-1f3fc-200d-1f3eb.svg","woman_teacher_tone3":"1f469-1f3fd-200d-1f3eb.svg","woman_teacher_tone4":"1f469-1f3fe-200d-1f3eb.svg","woman_teacher_tone5":"1f469-1f3ff-200d-1f3eb.svg","woman_technologist":"1f469-200d-1f4bb.svg","woman_technologist_tone1":"1f469-1f3fb-200d-1f4bb.svg","woman_technologist_tone2":"1f469-1f3fc-200d-1f4bb.svg","woman_technologist_tone3":"1f469-1f3fd-200d-1f4bb.svg","woman_technologist_tone4":"1f469-1f3fe-200d-1f4bb.svg","woman_technologist_tone5":"1f469-1f3ff-200d-1f4bb.svg","woman_tipping_hand":"1f481-200d-2640-fe0f.svg","woman_tipping_hand_tone1":"1f481-1f3fb-200d-2640-fe0f.svg","woman_tipping_hand_tone2":"1f481-1f3fc-200d-2640-fe0f.svg","woman_tipping_hand_tone3":"1f481-1f3fd-200d-2640-fe0f.svg","woman_tipping_hand_tone4":"1f481-1f3fe-200d-2640-fe0f.svg","woman_tipping_hand_tone5":"1f481-1f3ff-200d-2640-fe0f.svg","woman_tone1":"1f469-1f3fb.svg","woman_tone1_beard":"1f9d4-1f3fb-200d-2640-fe0f.svg","woman_tone2":"1f469-1f3fc.svg","woman_tone2_beard":"1f9d4-1f3fc-200d-2640-fe0f.svg","woman_tone3":"1f469-1f3fd.svg","woman_tone3_beard":"1f9d4-1f3fd-200d-2640-fe0f.svg","woman_tone4":"1f469-1f3fe.svg","woman_tone4_beard":"1f9d4-1f3fe-200d-2640-fe0f.svg","woman_tone5":"1f469-1f3ff.svg","woman_tone5_beard":"1f9d4-1f3ff-200d-2640-fe0f.svg","woman_vampire":"1f9db-200d-2640-fe0f.svg","woman_vampire_tone1":"1f9db-1f3fb-200d-2640-fe0f.svg","woman_vampire_tone2":"1f9db-1f3fc-200d-2640-fe0f.svg","woman_vampire_tone3":"1f9db-1f3fd-200d-2640-fe0f.svg","woman_vampire_tone4":"1f9db-1f3fe-200d-2640-fe0f.svg","woman_vampire_tone5":"1f9db-1f3ff-200d-2640-fe0f.svg","woman_walking":"1f6b6-200d-2640-fe0f.svg","woman_walking_tone1":"1f6b6-1f3fb-200d-2640-fe0f.svg","woman_walking_tone2":"1f6b6-1f3fc-200d-2640-fe0f.svg","woman_walking_tone3":"1f6b6-1f3fd-200d-2640-fe0f.svg","woman_walking_tone4":"1f6b6-1f3fe-200d-2640-fe0f.svg","woman_walking_tone5":"1f6b6-1f3ff-200d-2640-fe0f.svg","woman_wearing_turban":"1f473-200d-2640-fe0f.svg","woman_wearing_turban_tone1":"1f473-1f3fb-200d-2640-fe0f.svg","woman_wearing_turban_tone2":"1f473-1f3fc-200d-2640-fe0f.svg","woman_wearing_turban_tone3":"1f473-1f3fd-200d-2640-fe0f.svg","woman_wearing_turban_tone4":"1f473-1f3fe-200d-2640-fe0f.svg","woman_wearing_turban_tone5":"1f473-1f3ff-200d-2640-fe0f.svg","woman_white_haired":"1f469-200d-1f9b3.svg","woman_white_haired_tone1":"1f469-1f3fb-200d-1f9b3.svg","woman_white_haired_tone2":"1f469-1f3fc-200d-1f9b3.svg","woman_white_haired_tone3":"1f469-1f3fd-200d-1f9b3.svg","woman_white_haired_tone4":"1f469-1f3fe-200d-1f9b3.svg","woman_white_haired_tone5":"1f469-1f3ff-200d-1f9b3.svg","woman_with_headscarf":"1f9d5.svg","woman_with_headscarf_tone1":"1f9d5-1f3fb.svg","woman_with_headscarf_tone2":"1f9d5-1f3fc.svg","woman_with_headscarf_tone3":"1f9d5-1f3fd.svg","woman_with_headscarf_tone4":"1f9d5-1f3fe.svg","woman_with_headscarf_tone5":"1f9d5-1f3ff.svg","woman_with_probing_cane":"1f469-200d-1f9af.svg","woman_with_probing_cane_tone1":"1f469-1f3fb-200d-1f9af.svg","woman_with_probing_cane_tone2":"1f469-1f3fc-200d-1f9af.svg","woman_with_probing_cane_tone3":"1f469-1f3fd-200d-1f9af.svg","woman_with_probing_cane_tone4":"1f469-1f3fe-200d-1f9af.svg","woman_with_probing_cane_tone5":"1f469-1f3ff-200d-1f9af.svg","woman_with_veil":"1f470-200d-2640-fe0f.svg","woman_with_veil_tone1":"1f470-1f3fb-200d-2640-fe0f.svg","woman_with_veil_tone2":"1f470-1f3fc-200d-2640-fe0f.svg","woman_with_veil_tone3":"1f470-1f3fd-200d-2640-fe0f.svg","woman_with_veil_tone4":"1f470-1f3fe-200d-2640-fe0f.svg","woman_with_veil_tone5":"1f470-1f3ff-200d-2640-fe0f.svg","woman_zombie":"1f9df-200d-2640-fe0f.svg","womans_clothes":"1f45a.svg","womans_flat_shoe":"1f97f.svg","womans_hat":"1f452.svg","women_holding_hands_tone1":"1f46d-1f3fb.svg","women_holding_hands_tone1_tone2":"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc.svg","women_holding_hands_tone1_tone3":"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd.svg","women_holding_hands_tone1_tone4":"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe.svg","women_holding_hands_tone1_tone5":"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff.svg","women_holding_hands_tone2":"1f46d-1f3fc.svg","women_holding_hands_tone2_tone1":"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb.svg","women_holding_hands_tone2_tone3":"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd.svg","women_holding_hands_tone2_tone4":"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe.svg","women_holding_hands_tone2_tone5":"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff.svg","women_holding_hands_tone3":"1f46d-1f3fd.svg","women_holding_hands_tone3_tone1":"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb.svg","women_holding_hands_tone3_tone2":"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc.svg","women_holding_hands_tone3_tone4":"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe.svg","women_holding_hands_tone3_tone5":"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff.svg","women_holding_hands_tone4":"1f46d-1f3fe.svg","women_holding_hands_tone4_tone1":"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb.svg","women_holding_hands_tone4_tone2":"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc.svg","women_holding_hands_tone4_tone3":"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd.svg","women_holding_hands_tone4_tone5":"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff.svg","women_holding_hands_tone5":"1f46d-1f3ff.svg","women_holding_hands_tone5_tone1":"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb.svg","women_holding_hands_tone5_tone2":"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc.svg","women_holding_hands_tone5_tone3":"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd.svg","women_holding_hands_tone5_tone4":"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe.svg","women_with_bunny_ears_partying":"1f46f-200d-2640-fe0f.svg","women_wrestling":"1f93c-200d-2640-fe0f.svg","womens":"1f6ba.svg","wood":"1fab5.svg","woozy_face":"1f974.svg","worm":"1fab1.svg","worried":"1f61f.svg","wrench":"1f527.svg","writing_hand":"270d.svg","writing_hand_tone1":"270d-1f3fb.svg","writing_hand_tone2":"270d-1f3fc.svg","writing_hand_tone3":"270d-1f3fd.svg","writing_hand_tone4":"270d-1f3fe.svg","writing_hand_tone5":"270d-1f3ff.svg","x":"274c.svg","yarn":"1f9f6.svg","yawning_face":"1f971.svg","yellow_circle":"1f7e1.svg","yellow_heart":"1f49b.svg","yellow_square":"1f7e8.svg","yen":"1f4b4.svg","yin_yang":"262f.svg","yo_yo":"1fa80.svg","yum":"1f60b.svg","zany_face":"1f92a.svg","zap":"26a1.svg","zebra":"1f993.svg","zero":"30-20e3.svg","zipper_mouth":"1f910.svg","zombie":"1f9df.svg","zzz":"1f4a4.svg"}}} \ No newline at end of file diff --git a/overrides/assets/stylesheets/main.82a244a8.min.css b/overrides/assets/stylesheets/main.82a244a8.min.css new file mode 100644 index 00000000..80b19530 --- /dev/null +++ b/overrides/assets/stylesheets/main.82a244a8.min.css @@ -0,0 +1 @@ +@-webkit-keyframes heart{0%,40%,80%,to{transform:scale(1)}20%,60%{transform:scale(1.15)}}@keyframes heart{0%,40%,80%,to{transform:scale(1)}20%,60%{transform:scale(1.15)}}.md-typeset .twitter{color:#00acee}.md-typeset .mdx-video{width:auto}.md-typeset .mdx-video__inner{height:0;padding-bottom:56.138%;position:relative;width:100%}.md-typeset .mdx-video iframe{border:none;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.md-typeset .mdx-heart{-webkit-animation:heart 1s infinite;animation:heart 1s infinite}.md-typeset .mdx-insiders{color:#e91e63}.md-typeset .mdx-switch button{cursor:pointer;transition:opacity .25s}.md-typeset .mdx-switch button:focus,.md-typeset .mdx-switch button:hover{opacity:.75}.md-typeset .mdx-switch button>code{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block}.md-typeset .mdx-deprecated{opacity:.5;transition:opacity .25s}.md-typeset .mdx-deprecated:focus-within,.md-typeset .mdx-deprecated:hover{opacity:1}.md-typeset .mdx-columns ol,.md-typeset .mdx-columns ul{column-count:2}@media screen and (max-width:29.9375em){.md-typeset .mdx-columns ol,.md-typeset .mdx-columns ul{columns:initial}}.md-typeset .mdx-columns li{break-inside:avoid}.md-typeset .mdx-author{display:flex;font-size:.68rem}.md-typeset .mdx-author img{border-radius:100%;height:2rem}.md-typeset .mdx-author p:first-child{flex-shrink:0;margin-right:.8rem}.md-typeset .mdx-author p>span{display:block}.md-banner a,.md-banner a:focus,.md-banner a:hover{color:currentcolor}.md-banner strong{white-space:nowrap}[dir=ltr] .md-banner .twitter{margin-left:.2em}[dir=rtl] .md-banner .twitter{margin-right:.2em}.mdx-container{background:url("data:image/svg+xml;utf8,") no-repeat bottom,linear-gradient(to bottom,var(--md-primary-fg-color),#a63fd9 99%,var(--md-default-bg-color) 99%);padding-top:1rem}[data-md-color-scheme=slate] .mdx-container{background:url("data:image/svg+xml;utf8,") no-repeat bottom,linear-gradient(to bottom,var(--md-primary-fg-color),#a63fd9 99%,var(--md-default-bg-color) 99%)}.mdx-hero{color:var(--md-primary-bg-color);margin:0 .8rem}.mdx-hero h1{color:currentcolor;font-weight:700;margin-bottom:1rem}@media screen and (max-width:29.9375em){.mdx-hero h1{font-size:1.4rem}}.mdx-hero__content{padding-bottom:6rem}@media screen and (min-width:60em){.mdx-hero{align-items:stretch;display:flex}.mdx-hero__content{margin-top:3.5rem;max-width:19rem;padding-bottom:14vw}.mdx-hero__image{order:1;transform:translateX(4rem);width:38rem}}@media screen and (min-width:76.25em){.mdx-hero__image{transform:translateX(8rem)}}.mdx-hero .md-button{color:var(--md-primary-bg-color);margin-right:.5rem;margin-top:.5rem}.mdx-hero .md-button:focus,.mdx-hero .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.mdx-hero .md-button--primary{background-color:var(--md-primary-bg-color);border-color:var(--md-primary-bg-color);color:#894da8}.md-typeset .mdx-iconsearch{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z1);position:relative;transition:box-shadow 125ms}.md-typeset .mdx-iconsearch:focus-within,.md-typeset .mdx-iconsearch:hover{box-shadow:var(--md-shadow-z2)}.md-typeset .mdx-iconsearch .md-input{background:var(--md-default-bg-color);box-shadow:none}[data-md-color-scheme=slate] .md-typeset .mdx-iconsearch .md-input{background:var(--md-code-bg-color)}.md-typeset .mdx-iconsearch-result{-webkit-backface-visibility:hidden;backface-visibility:hidden;max-height:50vh;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) transparent;scrollbar-width:thin;touch-action:pan-y}.md-tooltip .md-typeset .mdx-iconsearch-result{max-height:10.25rem}.md-typeset .mdx-iconsearch-result::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset .mdx-iconsearch-result::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset .mdx-iconsearch-result::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset .mdx-iconsearch-result__meta{color:var(--md-default-fg-color--lighter);font-size:.64rem;position:absolute;right:.6rem;top:.4rem}[dir=ltr] .md-typeset .mdx-iconsearch-result__list{margin-left:0}[dir=rtl] .md-typeset .mdx-iconsearch-result__list{margin-right:0}.md-typeset .mdx-iconsearch-result__list{list-style:none;margin:0;padding:0}[dir=ltr] .md-typeset .mdx-iconsearch-result__item{margin-left:0}[dir=rtl] .md-typeset .mdx-iconsearch-result__item{margin-right:0}.md-typeset .mdx-iconsearch-result__item{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin:0;padding:.2rem .6rem}.md-typeset .mdx-iconsearch-result__item:last-child{border-bottom:none}.md-typeset .mdx-iconsearch-result__item>*{margin-right:.6rem}.md-typeset .mdx-iconsearch-result__item img{height:.9rem;width:.9rem}[data-md-color-scheme=slate] .md-typeset .mdx-iconsearch-result__item img[src*=squidfunk]{filter:invert(1)}.md-typeset .mdx-premium p{margin:2em 0;text-align:center}.md-typeset .mdx-premium img{height:3.25rem}.md-typeset .mdx-premium p:last-child{display:flex;flex-wrap:wrap;justify-content:center}.md-typeset .mdx-premium p:last-child>a{display:block;flex-shrink:0}.md-typeset .mdx-sponsorship__list{margin:2em 0}.md-typeset .mdx-sponsorship__list:after{clear:both;content:"";display:block}.md-typeset .mdx-sponsorship__item{border-radius:100%;display:block;float:left;height:1.6rem;margin:.2rem;overflow:hidden;transform:scale(1);transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .mdx-sponsorship__item:focus,.md-typeset .mdx-sponsorship__item:hover{transform:scale(1.1)}.md-typeset .mdx-sponsorship__item:focus img,.md-typeset .mdx-sponsorship__item:hover img{filter:grayscale(0)}.md-typeset .mdx-sponsorship__item--private{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .mdx-sponsorship__item img{display:block;filter:grayscale(100%) opacity(75%);height:auto;transition:filter 125ms;width:100%}.md-typeset .mdx-sponsorship-button{font-weight:400}.md-typeset .mdx-sponsorship-count,.md-typeset .mdx-sponsorship-total{font-weight:700} \ No newline at end of file diff --git a/overrides/assets/stylesheets/main.82a244a8.min.css.map b/overrides/assets/stylesheets/main.82a244a8.min.css.map new file mode 100644 index 00000000..a1f0f161 --- /dev/null +++ b/overrides/assets/stylesheets/main.82a244a8.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/overrides/assets/stylesheets/main/_typeset.scss","../../../../src/overrides/assets/stylesheets/main.scss","src/assets/stylesheets/utilities/_break.scss","src/overrides/assets/stylesheets/main/layout/_banner.scss","src/overrides/assets/stylesheets/main/layout/_hero.scss","src/overrides/assets/stylesheets/main/layout/_iconsearch.scss","src/overrides/assets/stylesheets/main/layout/_sponsorship.scss"],"names":[],"mappings":"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","file":"main.css"} \ No newline at end of file diff --git a/projetos/0.Cloud_Intro/index.html b/projetos/0.Cloud_Intro/index.html new file mode 100644 index 00000000..3d1424aa --- /dev/null +++ b/projetos/0.Cloud_Intro/index.html @@ -0,0 +1,45 @@ + Computação em Nuvem - Computação em Nuvem - 2024/1

    Primeiros Passos

    Objetivos

    1. Introduzir os conceitos básicos sobre cloud computing.
    2. Entender os conceitos básicos sobre IaaS.

    Pré-requisitos:

    1. Realizar leitura prévia:

      Produtos da AWS

      Public vs Private Cloud, AWS compared to Openstack

    2. Realizar a leitura sobre Cloud Computing. [Kavis - cap. 2 e Earl et al - cap. 4]

    Primeira Instância

    Vamos começar conhecendo o ferramental básico da AWS para virtual machines.

    • Acessar o dashboard do EC2 de North Virginia (us-east-1).
    • Criar uma instância t2.micro com Ubuntu 18.04 LTS server e 8Gb de disco.
    • Renomear a máquina com o seu nome (Tag).
    • Verifique se o security group liberou a conexão SSH externa.
    • Importar em Key Pair a sua public key gerada na primeira aula. Coloque o seu nome na chave.
      • Endereço IP público da máquina:
    • Teste a conexão SSH (não se esqueça da chave privada).

    . Você criou uma policy para seu usuário. O que são Policies? Por que elas são importantes e devem ser bem definidas? . Dentro do contexto de Cloud Computing, defina os termos: instance, image, region, VPC, subnet, security-group. . O poder computacional das instâncias é medido em vCPU. O que é vCPU?

    Primeiro Deploy - Ghost Blog Platform

    Vamos fazer um deploy completo e rápido com poucos comandos. Acesse o terminal da instância criada e execute os seguintes comandos:

    • Atualize o S.O.
      • $ sudo apt update
    • Instale o conjure-up usando o snap
      • $ sudo snap install conjure-up --classic
    • Agora instale a plataforma Ghost
      • $ juju add-credential aws
      • Insira um nome e a região correspondente: us-east-1
      • Entre com o par Access Key ID/Secret Access Key
      • $ conjure-up battlemidget/ghost aws/us-east-1
      • Aguarde.
    • Teste o deploy
      • $ juju status
      • Anote o IP da aplicação HAProxy.
      • Acesse a plataforma: https://[IP Público]/admin
    • Destrua tudo:
      • Anote o nome do controller no juju status
      • $ juju kill-controller [controller-name]
      • Aguarde e destrua a instância que você criou na AWS

    . Quantas instâncias foram criadas automaticamente? Criar instâncias automaticamente é um atributo positivo ou negativo? . Quanto custou o protótipo? Assuma que usou uma semana de cada instância. . Dada a quantidade de computadores apontada na questão anterior, descreva como você montaria um ambiente Ghost em um Datacenter próprio. Assuma que você ainda não possui nenhum hardware disponível, apenas um orçamento aprovado. . Agora, somando o fato de que hardware deprecia com o tempo e possui um custo mensal de manutenção, compare em termos de custo uma Public Cloud e um Datacenter próprio.

    Como podem perceber a infraestrutura acima não custa barato ao longo do tempo. Talvez o uso do conjure-up/juju não seja o mais adequado para pequenos projetos. Outras alternativas para realizar provisionamento/implantação:

    Escalabilidade

    Conforme visto na Aula 01, vamos agora fazer uso de uma das mais poderosas características da nuvem.

    • Crie uma instância t2.micro com Ubuntu 18.04 LTS:
    • Renomeie a instância para Webserver
    • $ sudo apt update; sudo apt install nodejs build-essential -y
    • Edite um arquivo server.js:

      #!/usr/bin/env nodejs
      +var http = require('http');
      +var os = require('os');
      +var crypto = require('crypto');
      +
      +http.createServer(function (req, res) {
      +  res.writeHead(200, {'Content-Type': 'text/plain'});
      +  var nonce = 1;
      +  var seed = Math.random();
      +  var h = crypto.createHash('sha256');
      +
      +  h.update(new Buffer(nonce + " Hello World " + seed));
      +  while (h.digest("hex").substr(0,3)!='000') {
      +    h = crypto.createHash('sha256');
      +    nonce++;
      +    h.update(new Buffer(nonce + " Hello World " + seed));
      +  }
      +
      +  res.end('{ "host": ' + os.hostname() + ', "nonce": ' + nonce + '}');
      +}).listen(8080, '');
      +console.log('Server running at http://localhost:8080/');
      +
    • Execute o serviço:

    • $ chmod +x ./server.js
    • $ ./server.js
    • Libere a porta no security group correspondente. Teste o serviço no browser.
    • Ajustando o final:
    • $ crontab -e\ @reboot /home/ubuntu/server.js
    • $ sudo reboot
    • Teste novamente no browser.

    💡 Pesquise o que faz o crontab?

    Simulando carga no servidor

    Uma das grande dúvidas de quem utiliza nuvem diz respeito a capacidade das instâncias utilizadas e se elas estão dimensiondas corretamente. Nessa etapa vamos estimar essa capacidade.

    • Crie duas novas instâncias t2.micro com Ubuntu 18.04
    • Renomeie como: Locust-master e Locust-worker
    • Em ambas as máquinas:
    • $ sudo apt update && sudo apt install python3-pip -y
    • $ pip3 install locust
    • crie um arquivo locustfile.py no home: \vspace{0.3cm}

      from locust import HttpUser, task, between
    +
    +  class QuickstartUser(HttpUser):
    +
    +      @task
    +      def index_page(self):
    +          self.client.get("/")
    +
    \vspace{0.3cm} * no master: * liberar no security group as portas 8089 e 5557 * $ python3 -m locust -f /home/ubuntu/locustfile.py --master * No worker: * ajuste o número de conexões no Linux:\ $ sudo nano /etc/sysctl.conf * adicione a linha:\ fs.file-max = 5000000 * aplique as alterações:\ $ sudo sysctl -p * acerte o crontab para rodar na inicialização:\ python3 -m locust -f /home/ubuntu/locustfile.py --worker --master-host=[IP do master] * $ sudo reboot

    • Realizando a simulação:
    • acesse o locust master via browser
    • aguarde o worker se conectar no master
    • inicie um teste 300/10 - 300 usuários e hatch rate de 10 novos usuários por segundo.
    • Não caiu! - Talvez haja algumas poucas falhas.
    • verifique que essa aplicação suporta cerca de 100 rps (requisições por segundo).

    • Multiplicando os usuários:

    • crie uma imagem do locust-worker. Café.
    • crie mais 2 instâncias dessa AMI,
    • Execute um teste 600/20 - observe que há algumas falhas mas ainda em um percentual baixo.
    • Agora execute um teste 1000/50 - agora complicou.

    Escalando Verticalmente

    • pare a máquina com o servidor http.
    • troque para t2.2xlarge.
    • atualize o IP no locust master, reinicie os workers e repita o teste 1000/50.

    Escalando Horizontalmente

    • Crie uma imagem do servidor web. Café.
    • Rebaixe a máquina para t2.micro de novo.
    • Crie mais 2 instâncias a partir da AMI criada. Não esqueça de reutilizar o security group.
    • Crie um Application LoadBalancer que mapeia instâncias:8080 para loadbalancer:80.
    • Marcar todas as Availability Zones.
    • Adicione as 3 instâncias no Target Group.
    • Teste o acesso ao LoadBalancer:\vspace{0.5cm}
    • Endereço DNS:\vspace{0.5cm}
    • Verifique no navegador que há uma alternância do servidor.
    • Execute novamente o teste 1000/50.
    • Voilà!

    Agora vamos ativar a elasticidade da nuvem.

    • Remova as instâncias do LoadBalancer. Destrue-as.
    • Crie um Autoscalling Group:
    • Criar um Launch Configuration da mesma configuração em que foi criada a instância original. Reutilizar o Security Group com as devidas liberações.
    • Começar com 1 instância.
    • Selecionar todas as subnets.
    • Anexar o Target Group criado anteriormente.
    • Selecionar: Use scaling policies to adjust the capacity of this group. Usar Request Count Per Target em 3000 (50 rps x 60 segundos)
    • Aguarde a primeira instância subir e teste o LoadBalancer de novo.

    Execute o teste 1000/50 novamente. Em 3 minutos ele se ajustará sozinho à demanda. Encerre o teste e em 15 minutos irá desativar a capacidade ociosa automaticamente. Remova tudo e não deixe nada rodando (Cuidado com os recursos do seu colega).

    \ No newline at end of file diff --git a/projetos/1.ELB/index.html b/projetos/1.ELB/index.html new file mode 100644 index 00000000..ab3224d2 --- /dev/null +++ b/projetos/1.ELB/index.html @@ -0,0 +1 @@ + 1. Elastic Load Balancer - Computação em Nuvem - 2024/1

    Elastic Load Balancer

    O Elastic Load Balancer (ELB) da AWS é um serviço que distribui o tráfego de entrada de aplicativos em vários destinos, como instâncias do Amazon EC2, contêineres e endereços IP. Ele aumenta a escalabilidade, a disponibilidade e a capacidade de gerenciamento de seus aplicativos.

    Tipos de ELBs

    A AWS oferece três tipos de ELBs:

    Classic Load Balancer

    O Classic Load Balancer é o tipo original de ELB da AWS. Ele fornece balanceamento de carga para aplicativos que foram criados em apenas uma única região da AWS.

    Application Load Balancer

    O Application Load Balancer (ALB) é um balanceador de carga de camada 7 que direciona o tráfego para aplicativos baseados em HTTP/HTTPS. Ele fornece recursos avançados de roteamento, como a capacidade de rotear tráfego para diferentes destinos com base no conteúdo da solicitação.

    Network Load Balancer

    O Network Load Balancer (NLB) é um balanceador de carga de camada 4 que é capaz de lidar com milhões de solicitações por segundo. Ele é projetado para aplicativos que exigem latência ultra baixa e alto desempenho.

    Recursos do ELB

    O ELB oferece vários recursos, incluindo:

    • Balanceamento de carga: Distribui o tráfego de entrada entre vários destinos para garantir que seus aplicativos estejam sempre disponíveis.
    • Auto Scaling: O ELB pode ser integrado com o serviço de Auto Scaling da AWS para aumentar ou diminuir a capacidade de seus aplicativos com base nas demandas do tráfego.
    • Monitoramento: O ELB fornece métricas detalhadas sobre o tráfego e o desempenho do aplicativo para ajudá-lo a solucionar problemas rapidamente.
    • Certificados SSL/TLS: O ELB suporta a criptografia SSL/TLS para garantir a segurança dos dados transmitidos pelos seus aplicativos.

    Conclusão

    O Elastic Load Balancer é um serviço fundamental para garantir a disponibilidade, escalabilidade e confiabilidade de seus aplicativos. Com sua ampla gama de recursos e opções de configuração, o ELB é uma excelente escolha para qualquer aplicativo que precise lidar com alto volume de tráfego.

    \ No newline at end of file diff --git a/projetos/10.EKS/index.html b/projetos/10.EKS/index.html new file mode 100644 index 00000000..ef75d5a8 --- /dev/null +++ b/projetos/10.EKS/index.html @@ -0,0 +1 @@ + 10. EKS - Computação em Nuvem - 2024/1

    Serviço AWS EKS

    O Amazon Elastic Kubernetes Service (EKS) é um serviço gerenciado que permite executar aplicativos em contêineres Kubernetes na nuvem da AWS. Ele ajuda a implantar e gerenciar aplicativos em contêineres com facilidade e segurança, usando um ambiente escalável e flexível.

    Características do AWS EKS

    Algumas das principais características do AWS EKS são:

    • Gerenciamento de contêineres escalável: O EKS é um serviço altamente escalável que permite executar milhares de contêineres Kubernetes em uma única instância.

    • Alta disponibilidade: O EKS é projetado para oferecer alta disponibilidade, reduzindo a possibilidade de interrupções de serviço.

    • Integração com outros serviços da AWS: O EKS é integrado com outros serviços da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC.

    • Suporte a vários tipos de contêineres: O EKS oferece suporte a vários tipos de contêineres, incluindo Docker e containerd.

    • Integração com o AWS Fargate: O EKS é integrado com o AWS Fargate, o que permite executar contêineres sem precisar gerenciar instâncias EC2.

    Como funciona o AWS EKS

    O AWS EKS é composto de vários componentes, incluindo clusters, worker nodes e serviços Kubernetes. O EKS usa o Amazon EC2 ou o AWS Fargate para executar worker nodes que executam os contêineres Kubernetes.

    Para usar o AWS EKS, siga estes passos simples:

    1. Crie um cluster: Crie um cluster EKS para executar seus aplicativos em contêineres Kubernetes. Os clusters são criados usando o console do EKS ou a API do EKS.

    2. Crie worker nodes: Crie um ou mais worker nodes que executem os contêineres Kubernetes.

    3. Implante aplicativos: Implantar aplicativos em contêineres Kubernetes no cluster EKS usando serviços Kubernetes.

    4. Gerencie os serviços: Gerencie os serviços implantados para garantir que eles estejam sempre em execução e disponíveis.

    Conclusão

    O Amazon Elastic Kubernetes Service (EKS) é uma plataforma eficiente para executar e gerenciar aplicativos em contêineres Kubernetes na nuvem da AWS. Com sua alta escalabilidade e flexibilidade, o EKS é uma solução ideal para empresas que buscam uma forma segura e confiável de executar aplicativos em contêineres Kubernetes.

    Ao integrar-se com outros serviços da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC, o EKS permite que você crie uma infraestrutura de aplicativos em contêineres Kubernetes altamente personalizada que atenda às suas necessidades específicas. Além disso, a integração com o AWS Fargate torna o EKS ainda mais flexível, permitindo que você execute contêineres sem precisar gerenciar instâncias EC2.

    \ No newline at end of file diff --git a/projetos/11.KMS/index.html b/projetos/11.KMS/index.html new file mode 100644 index 00000000..43b2ab12 --- /dev/null +++ b/projetos/11.KMS/index.html @@ -0,0 +1 @@ + 11. KMS - Computação em Nuvem - 2024/1

    AWS KMS

    O AWS Key Management Service (KMS) é um serviço gerenciado que ajuda a criar e controlar o acesso a chaves criptográficas para proteger dados confidenciais na nuvem da AWS. Com o KMS, é possível gerenciar suas próprias chaves criptográficas e controlar quem pode usá-las.

    Características do AWS KMS

    Algumas das principais características do AWS KMS são:

    • Gerenciamento de chaves criptográficas: O KMS permite criar, gerenciar e usar suas próprias chaves criptográficas, além de oferecer integração com outras ferramentas da AWS.

    • Segurança de dados: O KMS ajuda a proteger seus dados confidenciais por meio do uso de criptografia avançada e controles de acesso granulares.

    • Conformidade com regulamentações: O KMS é compatível com uma variedade de regulamentações de segurança, como PCI DSS, HIPAA, FedRAMP e outras.

    • Integração com outros serviços da AWS: O KMS é integrado com outros serviços da AWS, como o Amazon S3, o Amazon EBS e o Amazon Redshift.

    • Controles de acesso granulares: O KMS oferece controle de acesso granular para suas chaves criptográficas, permitindo que você gerencie quem pode usá-las e como elas são usadas.

    Como funciona o AWS KMS

    O AWS KMS funciona através da criação, gerenciamento e uso de chaves criptográficas. Para usar o KMS, siga estes passos:

    1. Crie uma chave criptográfica: Crie uma chave criptográfica no console do KMS ou usando a API do KMS. É possível criar chaves simétricas ou assimétricas.

    2. Configure permissões de chave: Configure permissões de chave para controlar quem pode usar a chave criptográfica e como ela pode ser usada.

    3. Criptografe e descriptografe dados: Use a chave criptográfica para criptografar e descriptografar dados.

    4. Rotacione as chaves criptográficas: Rotacione as chaves criptográficas regularmente para garantir a segurança dos dados.

    Conclusão

    O AWS Key Management Service (KMS) é uma solução eficiente para gerenciar chaves criptográficas na nuvem da AWS. Com sua segurança avançada e controle de acesso granular, o KMS ajuda a proteger seus dados confidenciais contra ameaças de segurança.

    Ao integrar-se com outros serviços da AWS, como o Amazon S3, o Amazon EBS e o Amazon Redshift, o KMS permite que você proteja seus dados em trânsito e em repouso, garantindo a conformidade com regulamentações de segurança. Se você precisa de uma solução robusta de gerenciamento de chaves criptográficas, o AWS KMS é uma excelente escolha.

    \ No newline at end of file diff --git a/projetos/12.Lambda/index.html b/projetos/12.Lambda/index.html new file mode 100644 index 00000000..3562e770 --- /dev/null +++ b/projetos/12.Lambda/index.html @@ -0,0 +1,25 @@ + 12. AWS Lambda - Computação em Nuvem - 2024/1

    AWS Lambda

    AWS Lambda é um serviço de computação sem servidor oferecido pela Amazon Web Services (AWS) que executa código em resposta a eventos e gerencia automaticamente os recursos necessários para executar esse código.

    Como funciona

    Com o AWS Lambda, você pode escrever e carregar seu próprio código em uma variedade de linguagens de programação suportadas pela AWS, como Python, Node.js, Java, C# e Go. Em seguida, você pode criar funções que são acionadas por eventos, como alterações em dados armazenados no Amazon S3, novas mensagens em um tópico do Amazon SNS ou novos registros em um stream do Amazon Kinesis.

    Quando uma função é acionada, o serviço AWS Lambda cria um contêiner efêmero, carrega o código da função e executa o código em resposta ao evento. Quando a função é concluída, o contêiner é desativado e seus recursos são liberados.

    Benefícios

    • Escala automática: O AWS Lambda escala automaticamente a capacidade de execução de suas funções com base na frequência dos eventos que acionam suas funções. Não é necessário gerenciar a capacidade de execução manualmente.
    • Pagamento por uso: Você paga apenas pelo tempo de execução da sua função, sem taxas mínimas ou compromissos de longo prazo.
    • Conectividade com outros serviços AWS: O AWS Lambda pode ser facilmente conectado a outros serviços da AWS, como Amazon S3, Amazon DynamoDB, Amazon Kinesis e Amazon SNS, permitindo que você crie aplicativos altamente escaláveis e integrados.
    • Integração com ferramentas de desenvolvimento: O AWS Lambda é facilmente integrado com ferramentas de desenvolvimento populares, como o AWS Toolkit for Visual Studio, o AWS Toolkit para JetBrains, o AWS CLI e o AWS CloudFormation.

    Limitações

    • Tempo limite de execução: Cada execução da função do Lambda tem um tempo máximo de duração de 900 segundos (15 minutos).
    • Restrições de tamanho do pacote: O tamanho máximo do pacote de código da função é de 50 MB, incluindo todas as dependências.
    • Limites de recursos: O AWS Lambda tem limites de recursos, como o número máximo de contêineres em execução, a quantidade máxima de memória alocada por função e o número máximo de solicitações simultâneas por função.

    Exemplo de código

    Aqui está um exemplo simples de uma função do AWS Lambda escrita em Python que responde a eventos do Amazon S3:

    import json
    +import boto3
    +
    +def lambda_handler(event, context):
    +    # Obtém o nome do bucket S3 e a chave do objeto que acionou o evento
    +    bucket = event['Records'][0]['s3']['bucket']['name']
    +    key = event['Records'][0]['s3']['object']['key']
    +
    +    # Obtém o objeto S3
    +    s3 = boto3.resource('s3')
    +    obj = s3.Object(bucket, key)
    +
    +    # Lê o conteúdo do objeto
    +    body = obj.get()['Body'].read()
    +
    +    # Imprime o conteúdo do objeto
    +    print("Conteúdo do objeto:")
    +    print(body.decode('utf-8'))
    +
    +    # Retorna uma resposta
    +    return {
    +        'statusCode': 200,
    +        'body': json.dumps('Hello from Cloudinho Nuvem!')
    +    }
    +

    Conclusão

    O AWS Lambda é uma solução sem servidor poderosa para criar aplicativos escaláveis e altamente integrados na AWS. Ele oferece escala automática, pagamento por uso, conectividade com outros serviços da AWS e integração com ferramentas de desenvolvimento populares. No entanto, ele também tem algumas limitações, como tempo máximo de execução, restrições de tamanho de pacote e limites de recursos.

    Em resumo, o AWS Lambda é uma ferramenta poderosa para desenvolvedores que procuram criar aplicativos escaláveis sem se preocupar com a infraestrutura subjacente. Com sua facilidade de uso e integração com outras ferramentas da AWS, o Lambda permite que os desenvolvedores se concentrem na lógica de negócios em vez de gerenciar a infraestrutura. Se você ainda não experimentou o AWS Lambda, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.

    \ No newline at end of file diff --git a/projetos/13.Fargate/index.html b/projetos/13.Fargate/index.html new file mode 100644 index 00000000..034c37a1 --- /dev/null +++ b/projetos/13.Fargate/index.html @@ -0,0 +1,16 @@ + 13. AWS Fargate - Computação em Nuvem - 2024/1

    AWS Fargate

    O AWS Fargate é um serviço de computação sem servidor para contêineres que permite executar contêineres do Docker no Amazon Elastic Container Service (ECS) e no Amazon Elastic Kubernetes Service (EKS) sem a necessidade de gerenciar a infraestrutura subjacente.

    Como funciona

    Com o AWS Fargate, você pode executar contêineres do Docker em um ambiente completamente gerenciado. Você só precisa criar um cluster do ECS ou do EKS, definir suas tarefas de contêiner e o Fargate gerenciará a infraestrutura subjacente necessária para executar essas tarefas. Isso inclui recursos como instâncias do Amazon EC2, escalabilidade, patching de segurança e muito mais.

    Benefícios

    • Sem infraestrutura para gerenciar: O AWS Fargate gerencia toda a infraestrutura necessária para executar suas tarefas de contêiner, permitindo que você se concentre em desenvolver seu aplicativo.
    • Escala automática: O Fargate escalona automaticamente seus contêineres com base na demanda do aplicativo.
    • Segurança: O Fargate usa instâncias EC2 dedicadas e isoladas para executar suas tarefas de contêiner, garantindo um alto nível de segurança.
    • Flexibilidade: O Fargate é compatível com todas as ferramentas e serviços do ecossistema do Docker, permitindo que você use suas ferramentas e configurações favoritas para criar e implantar contêineres.

    Limitações

    • Limitações de tamanho do contêiner: O tamanho máximo do contêiner é de 4 GB.
    • Restrições de recursos: O AWS Fargate tem limites de recursos, como a quantidade máxima de vCPUs e memória alocados por tarefa de contêiner.

    Exemplo de uso

    Aqui está um exemplo simples de como executar um contêiner do Docker usando o AWS Fargate no Amazon ECS:

    1. Crie um cluster do Amazon ECS.
    2. Defina sua tarefa de contêiner, que inclui informações sobre a imagem do contêiner, a porta exposta e outras configurações.
    3. Crie um serviço do ECS que usa o Fargate como plataforma de computação.
    version: "3"
    +services:
    +  myapp:
    +    image: mydockerimage
    +    ports:
    +      - "80:80"
    +    logging:
    +      driver: awslogs
    +      options:
    +        awslogs-group: "my-logs-group"
    +        awslogs-region: "us-east-1"
    +    cpu: 256
    +    memory: 512
    +    network_mode: awsvpc
    +    execution_role_arn: arn:aws:iam::25072000:role/ecsTaskExecutionRole
    +
    1. Inicie o serviço e o Fargate gerenciará a execução dos contêineres para você.

    Conclusão

    O AWS Fargate é uma solução ideal para desenvolvedores que desejam executar contêineres do Docker sem ter que gerenciar a infraestrutura subjacente. Ele oferece escalabilidade automática, segurança e compatibilidade com todas as ferramentas e serviços do ecossistema do Docker. No entanto, ele também tem algumas limitações, como tamanho máximo do contêiner e limites de recursos.

    Em resumo, o AWS Fargate é uma ferramenta poderosa para desenvolvedores que procuram uma maneira simples e fácil de executar contêineres do Docker sem ter que lidar com a infraestrutura. Com sua escalabilidade automática, gerenciamento de segurança e compatibilidade com o ecossistema do Docker, o Fargate é uma solução atraente para equipes de desenvolvimento que buscam aumentar a eficiência e a produtividade. Se você ainda não experimentou o AWS Fargate, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.

    \ No newline at end of file diff --git a/projetos/14.S3/index.html b/projetos/14.S3/index.html new file mode 100644 index 00000000..891a3ee8 --- /dev/null +++ b/projetos/14.S3/index.html @@ -0,0 +1 @@ + 14. AWS S3 - Computação em Nuvem - 2024/1

    AWS S3

    O Amazon Simple Storage Service (S3) é um serviço de armazenamento de objetos na nuvem projetado para armazenar e recuperar qualquer quantidade de dados de qualquer lugar da web.

    Como funciona

    Com o AWS S3, você pode armazenar e recuperar arquivos de qualquer tamanho de qualquer lugar do mundo. Você só precisa criar um bucket do S3, carregar seus arquivos e definir as configurações de permissões e segurança, e o S3 gerenciará o restante para você. O AWS S3 é altamente escalável e durável, com redundância em várias zonas de disponibilidade.

    Benefícios

    • Escalabilidade: O S3 é altamente escalável e pode ser usado para armazenar qualquer quantidade de dados.
    • Durabilidade: O S3 tem redundância em várias zonas de disponibilidade, garantindo que seus dados estejam protegidos contra falhas de hardware.
    • Segurança: O S3 oferece recursos de segurança avançados, como controle de acesso baseado em políticas, criptografia e muito mais.
    • Acessibilidade: O S3 pode ser acessado de qualquer lugar do mundo com uma conexão à Internet.

    Limitações

    • Custo: O custo do armazenamento no S3 pode variar dependendo da quantidade de dados armazenados e dos acessos aos dados.
    • Desempenho: O desempenho do S3 pode ser afetado por diversos fatores, como a região em que o bucket está localizado e o tipo de acesso aos dados.

    Exemplo de uso

    Aqui está um exemplo simples de como usar o AWS S3:

    1. Crie um bucket do S3 na região desejada.
    2. Carregue seus arquivos no bucket do S3.
    3. Defina as configurações de permissões e segurança para o bucket do S3.
    4. Acesse seus arquivos de qualquer lugar do mundo com uma conexão à Internet.

    Conclusão

    O AWS S3 é uma ferramenta essencial para empresas que precisam armazenar e recuperar grandes quantidades de dados de maneira segura e escalável. Com recursos de segurança avançados, escalabilidade e durabilidade, o S3 é uma solução atraente para empresas de todos os tamanhos. No entanto, é importante estar ciente das limitações, como o custo e o desempenho, ao planejar o uso do S3. Se você ainda não experimentou o AWS S3, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.

    \ No newline at end of file diff --git a/projetos/15.CloudWatch/index.html b/projetos/15.CloudWatch/index.html new file mode 100644 index 00000000..6b67aa3d --- /dev/null +++ b/projetos/15.CloudWatch/index.html @@ -0,0 +1 @@ + 15. AWS CloudWatch - Computação em Nuvem - 2024/1

    AWS CloudWatch

    O Amazon CloudWatch é um serviço de monitoramento e observabilidade da AWS que permite monitorar e coletar métricas, logs e eventos de seus recursos e aplicativos na nuvem. Com o CloudWatch, você pode monitorar e analisar o desempenho de seus aplicativos, identificar e solucionar problemas e garantir a conformidade e a segurança.

    Como funciona

    O CloudWatch coleta e armazena métricas, logs e eventos de seus recursos e aplicativos na nuvem, como instâncias do Amazon EC2, grupos de autoescalabilidade, aplicativos da web e muito mais. Você pode usar esses dados para monitorar o desempenho de seus aplicativos, identificar problemas e solucioná-los. O CloudWatch também pode ser usado para criar alarmes que disparam ações automatizadas em resposta a eventos específicos.

    Benefícios

    • Monitoramento: O CloudWatch permite monitorar e analisar o desempenho de seus aplicativos e recursos na nuvem.
    • Identificação de problemas: Com o CloudWatch, você pode identificar problemas e solucioná-los antes que afetem seus usuários.
    • Conformidade e segurança: O CloudWatch permite monitorar a conformidade e a segurança de seus aplicativos e recursos na nuvem.
    • Automação: O CloudWatch permite criar alarmes que disparam ações automatizadas em resposta a eventos específicos.

    Limitações

    • Custo: O custo do CloudWatch pode variar dependendo da quantidade de métricas, logs e eventos coletados.
    • Complexidade: O CloudWatch pode ser complexo de configurar e gerenciar, especialmente para aplicativos e recursos mais complexos.

    Exemplo de uso

    Aqui está um exemplo simples de como usar o CloudWatch:

    1. Crie um grupo de autoescalabilidade do Amazon EC2.
    2. Configure o CloudWatch para coletar métricas, logs e eventos do grupo de autoescalabilidade.
    3. Crie um painel do CloudWatch para monitorar as métricas coletadas.
    4. Crie um alarme no CloudWatch que dispara uma ação automatizada quando um evento específico ocorre.

    Conclusão

    O Amazon CloudWatch é uma ferramenta essencial para empresas que precisam monitorar e analisar o desempenho de seus aplicativos e recursos na nuvem. Com recursos avançados de monitoramento, identificação de problemas, conformidade e segurança, o CloudWatch é uma solução atraente para empresas de todos os tamanhos. No entanto, é importante estar ciente das limitações, como o custo e a complexidade, ao planejar o uso do CloudWatch. Se você ainda não experimentou o Amazon CloudWatch, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.

    \ No newline at end of file diff --git a/projetos/2.RDS/index.html b/projetos/2.RDS/index.html new file mode 100644 index 00000000..064e3bf6 --- /dev/null +++ b/projetos/2.RDS/index.html @@ -0,0 +1 @@ + 2. Relational Database Service (RDS) - Computação em Nuvem - 2024/1

    Relational Database Service (RDS)

    O Amazon RDS (Relational Database Service) é um serviço de banco de dados relacional gerenciado pela Amazon Web Services (AWS). Ele oferece suporte para vários mecanismos de banco de dados, incluindo MySQL, PostgreSQL, Oracle e SQL Server.

    Vantagens do Amazon RDS

    • Gerenciamento fácil: O Amazon RDS permite gerenciar facilmente os bancos de dados relacionais na nuvem, sem precisar se preocupar com o gerenciamento de hardware e software subjacente.

    • Escalabilidade automática: O RDS da AWS facilita a escalabilidade horizontal do banco de dados, permitindo aumentar ou diminuir a capacidade do banco de dados de acordo com a demanda.

    • Backup e recuperação: O Amazon RDS faz backups automáticos do banco de dados, permitindo a recuperação rápida em caso de falha ou erro.

    • Segurança: O RDS da AWS oferece recursos de segurança robustos, incluindo criptografia de dados em repouso e em trânsito, controle de acesso baseado em funções e conformidade com várias normas de segurança.

    Mecanismos de banco de dados suportados pelo Amazon RDS

    O Amazon RDS oferece suporte para os seguintes mecanismos de banco de dados:

    • MySQL
    • PostgreSQL
    • Oracle
    • SQL Server
    • MariaDB

    Preços do Amazon RDS

    O Amazon RDS é oferecido em vários planos de preços, dependendo do tipo de mecanismo de banco de dados, do tamanho do banco de dados e da capacidade de computação. Os preços variam de acordo com a região da AWS em que o banco de dados é implantado.

    Conclusão

    O Amazon RDS é uma solução conveniente e confiável para gerenciamento de banco de dados relacional na nuvem. Com recursos avançados de escalabilidade, backup e segurança, o RDS da AWS é uma excelente escolha para empresas que desejam uma solução de banco de dados gerenciada.

    \ No newline at end of file diff --git a/projetos/2023-2_projeto/index.html b/projetos/2023-2_projeto/index.html new file mode 100644 index 00000000..496681ab --- /dev/null +++ b/projetos/2023-2_projeto/index.html @@ -0,0 +1 @@ + **Escopo do Projeto:** - Computação em Nuvem - 2024/1

    Escopo do Projeto:

    Implementação de Arquitetura Cloud na AWS com Terraform

    Objetivo: Provisionar uma arquitetura na AWS utilizando o Terraform, que englobe o uso de um Application Load Balancer (ALB), instâncias EC2 com Auto Scaling e um banco de dados RDS. Atencao: A escolha da região de implantacao deve ser baseada em custos e desempenho, isso deve aparecer no seu relatório.

    Rubricas do projeto para tirar C+

    Requisitos Técnicos do Projeto:

    1. Infraestrutura como Código (IaC) com Terraform:

    • Utilizar o Terraform para criar e gerenciar todos os recursos na AWS.
    • Estruturar o código Terraform utilizando módulos para separar responsabilidades (ex: módulo para EC2, módulo para RDS, etc.).
    • Armazenar o estado do Terraform em um bucket S3 para o lock do estado.
    • O script deve ser capaz de criar a infraestrutura completa sem a intervenção manual do usuário (comando único).
    • O script deve ser capaz de destruir a infraestrutura completa sem a intervenção manual do usuário (comando único).

    2. Application Load Balancer (ALB):

    • Provisionar um ALB para distribuir o tráfego entre as instâncias EC2.
    • Configurar Target Groups para gerenciar as instâncias EC2.
    • Implementar Health Checks para garantir que o tráfego seja direcionado apenas para instâncias saudáveis.

    3. EC2 com Auto Scaling:

    • Criar um Launch Configuration com uma AMI que tenha a aplicação pré-instalada.
    • Provisionar um Auto Scaling Group (ASG) utilizando o Launch Configuration criado.
    • Definir políticas de escalabilidade baseadas em CloudWatch Alarms (ex: CPU Utilization > 70%).
    • Garantir a integração do ASG com o ALB através do Target Group.

    4. Banco de Dados RDS:

    • Provisionar uma instância RDS MySQL ou PostgreSQL com a configuração db.t2.micro (a menor disponível).
    • Habilitar backups automáticos e definir uma janela de manutenção.
    • Configurar Security Groups para garantir que apenas as instâncias EC2 possam se conectar ao RDS.
    • Habilitar o Multi-AZ para alta disponibilidade.

    5. Aplicação:

    • A aplicação deve ser uma API RESTful ou uma aplicação web simples.
    • Deve ser capaz de se conectar ao banco de dados RDS e realizar operações CRUD.
    • Implementar métricas e logs utilizando o CloudWatch.

    6. Análise de Custo com a Calculadora AWS:

    • Utilizar a Calculadora de Custo da AWS para estimar os custos mensais da arquitetura proposta.
    • Considerar os custos de todos os recursos utilizados (EC2, ALB, RDS, etc.).
    • Elaborar um relatório detalhado com a previsão de custos, destacando os principais gastos e possíveis otimizações.

    7. Documentação:

    • Criar uma documentação técnica que inclua um diagrama da arquitetura AWS.
    • Documentar todas as decisões técnicas tomadas e justificá-las.
    • Incluir um guia passo a passo para executar os scripts Terraform e validar a infraestrutura.

    Com estes requisitos, os alunos terão uma visão mais completa não apenas da implementação técnica, mas também dos custos associados, o que é crucial em ambientes de produção reais.

    Rubricas do projeto para tirar B+

    8. Analise de carga:

    • Implementar uma analise de carga e desempenho da arquitetura. (escolher a ferramenta que julgar a mais apropriada para o seu projeto)
    • O Locust é uma ferramenta popular para testes de carga e desempenho, permitindo simular milhares de usuários simultâneos para testar a resistência de sistemas. Existem várias outras ferramentas que oferecem funcionalidades semelhantes. Aqui estão algumas das mais conhecidas:

    Apache JMeter: Uma das ferramentas de teste de carga mais populares e amplamente utilizadas. Interface gráfica para configuração de testes. Suporta vários protocolos, incluindo HTTP, JDBC, FTP e mais. Extensível através de plugins. Gatling: Ferramenta de teste de carga de código aberto escrita em Scala. Focado em testes de carga para aplicações web. Oferece relatórios detalhados e é conhecido por sua alta performance. Artillery: Ferramenta moderna, leve e poderosa para testes de carga. Escrita em Node.js. Suporta testes de carga para WebSocket, Socket.io, AWS Kinesis e mais. LoadRunner: Ferramenta comercial da Micro Focus. Uma das ferramentas de teste de carga mais antigas e estabelecidas do mercado. Oferece uma ampla variedade de recursos e suporte para vários protocolos. Taurus: Ferramenta de automação de testes de carga de código aberto. Permite executar testes escritos em JMeter, Gatling, Locust, Selenium e outras ferramentas sob uma interface comum. Focado em simplificar a configuração e execução de testes.

    9. Documentação:

    • Adicionar a documentação anterior a Análise de Custo real com a utilização dos testes de carga na infraestrutura criada na AWS.

    Rubricas do projeto para tirar A

    10. Banco de Dados e VPN:

    • O script (terraform) deve implementar o banco de dados na Nuvem privada do seu Kit (OpenStack) e a aplicação deve ser conectada a ele via VPN.
    \ No newline at end of file diff --git a/projetos/3.EC2/index.html b/projetos/3.EC2/index.html new file mode 100644 index 00000000..5f176569 --- /dev/null +++ b/projetos/3.EC2/index.html @@ -0,0 +1 @@ + 3. EC2 - Computação em Nuvem - 2024/1

    EC2 - Elastic Compute Cloud

    O Amazon Elastic Compute Cloud (EC2) é um serviço da AWS que fornece capacidade de computação escalável na nuvem. É um dos serviços mais populares da AWS, permitindo que os usuários criem e gerenciem instâncias de servidores virtuais na nuvem.

    Características do EC2

    O EC2 oferece as seguintes características:

    • Escalabilidade: O EC2 permite que os usuários aumentem ou diminuam a capacidade de computação conforme necessário, sem a necessidade de investir em hardware adicional.

    • Flexibilidade: Os usuários podem escolher entre diferentes tipos de instâncias de acordo com suas necessidades de processamento, armazenamento e memória.

    • Segurança: O EC2 oferece vários recursos de segurança, incluindo criptografia de dados em trânsito e em repouso, gerenciamento de chaves e controle de acesso.

    • Gerenciamento fácil: O EC2 é fácil de usar e gerenciar, com recursos como o console da AWS, APIs e ferramentas de linha de comando.

    Como funciona o EC2

    O EC2 funciona da seguinte maneira:

    1. Os usuários criam uma ou mais instâncias de servidor virtual.

    2. Eles selecionam um tipo de instância com base em suas necessidades de processamento, memória e armazenamento.

    3. Eles podem configurar o sistema operacional, o armazenamento, a rede e outros recursos da instância.

    4. Eles iniciam a instância e se conectam a ela usando um cliente SSH ou uma conexão de área de trabalho remota.

    5. Eles podem instalar aplicativos e serviços na instância e usá-la como um servidor ou como parte de uma arquitetura de aplicativo distribuído.

    Preços do EC2

    Os preços do EC2 são baseados no tipo de instância, na região em que ela é executada e na quantidade de tempo em que a instância é executada. Os usuários podem escolher entre modelos de pagamento sob demanda, onde eles pagam por hora de uso, ou modelos de instância reservada, onde eles fazem um compromisso a longo prazo e recebem um desconto significativo nos preços de instância.

    Conclusão

    O EC2 é um serviço poderoso e flexível da AWS que permite que os usuários criem e gerenciem facilmente instâncias de servidor virtual na nuvem. Com recursos de segurança, escalabilidade e flexibilidade, o EC2 é uma escolha popular para empresas de todos os tamanhos que desejam aproveitar os benefícios da nuvem.

    \ No newline at end of file diff --git a/projetos/4.Auto_Scaling/index.html b/projetos/4.Auto_Scaling/index.html new file mode 100644 index 00000000..20f8046d --- /dev/null +++ b/projetos/4.Auto_Scaling/index.html @@ -0,0 +1 @@ + 4. Auto Scaling - Computação em Nuvem - 2024/1

    Auto Scaling na AWS

    O Auto Scaling é um recurso da Amazon Web Services (AWS) que permite dimensionar automaticamente os recursos da sua aplicação de acordo com a demanda do usuário. Com o Auto Scaling, você pode manter o desempenho da aplicação, economizar custos e garantir que seus usuários recebam a melhor experiência possível.

    Como funciona o Auto Scaling?

    O Auto Scaling monitora as métricas de utilização dos recursos da sua aplicação, como CPU, memória e tráfego de rede. Com base nessas métricas, ele pode aumentar ou diminuir automaticamente o número de instâncias de recursos da sua aplicação.

    Por exemplo, se a demanda do usuário aumentar, o Auto Scaling pode adicionar mais instâncias para lidar com o aumento de tráfego. Quando a demanda diminuir, o Auto Scaling pode reduzir o número de instâncias para economizar custos.

    O Auto Scaling também permite definir políticas de escalonamento personalizadas com base em suas necessidades específicas. Você pode definir uma política de escalonamento para aumentar as instâncias quando a utilização da CPU atingir um determinado nível ou para diminuir as instâncias quando a utilização da memória estiver abaixo de um determinado nível.

    Benefícios do Auto Scaling

    Existem vários benefícios em usar o Auto Scaling na AWS, incluindo:

    • Maior disponibilidade: o Auto Scaling ajuda a garantir que sua aplicação esteja sempre disponível, mesmo em momentos de pico de tráfego.
    • Economia de custos: o Auto Scaling permite que você aumente ou diminua automaticamente o número de instâncias de recursos da sua aplicação com base na demanda do usuário, o que pode ajudar a economizar custos de infraestrutura.
    • Melhor desempenho: o Auto Scaling pode ajudar a manter o desempenho da sua aplicação, garantindo que haja sempre recursos suficientes para lidar com a demanda do usuário.

    Conclusão

    O Auto Scaling é uma ferramenta essencial para garantir a escalabilidade, disponibilidade e desempenho da sua aplicação na AWS. Com o Auto Scaling, você pode automatizar o processo de escalonamento dos recursos da sua aplicação, economizar custos e garantir a melhor experiência possível para seus usuários.

    \ No newline at end of file diff --git a/projetos/5.VPC/index.html b/projetos/5.VPC/index.html new file mode 100644 index 00000000..a8843098 --- /dev/null +++ b/projetos/5.VPC/index.html @@ -0,0 +1 @@ + 5. VPC - Computação em Nuvem - 2024/1

    Serviço de VPC na AWS

    O Amazon Virtual Private Cloud (VPC) é um serviço que permite que você crie uma rede virtual isolada na nuvem da AWS. Com o VPC, você pode personalizar a sua própria rede virtual em termos de sub-redes, roteamento e gateways de internet, e conectar a sua rede local ao seu ambiente de nuvem da AWS.

    Características do VPC

    Algumas das principais características do VPC são:

    • Isolamento: O VPC permite que você crie uma rede isolada na nuvem da AWS, onde você pode executar recursos sem o risco de interferência de outras redes na nuvem.

    • Personalização: Com o VPC, você pode personalizar a sua rede virtual de acordo com as suas necessidades, criando sub-redes públicas e privadas, definindo as suas próprias tabelas de roteamento e configurando gateways de internet.

    • Segurança: O VPC oferece recursos de segurança avançados, incluindo grupos de segurança e listas de controle de acesso (ACLs), para controlar o acesso aos recursos na sua rede.

    • Conectividade: O VPC permite que você conecte a sua rede local ao ambiente de nuvem da AWS por meio de uma conexão VPN ou uma conexão direta.

    Componentes do VPC

    O VPC é composto por vários componentes, incluindo:

    • Sub-redes: As sub-redes são segmentos da rede que permitem que você agrupe recursos com base em suas funcionalidades e requisitos de segurança. Você pode criar sub-redes públicas ou privadas e definir as suas próprias faixas de endereços IP.

    • Tabelas de roteamento: As tabelas de roteamento são usadas para determinar como o tráfego é encaminhado entre as sub-redes e para a internet. Você pode criar tabelas de roteamento personalizadas para cada sub-rede ou usar as tabelas de roteamento padrão.

    • Gateways de internet: Os gateways de internet são usados para permitir que o tráfego da internet chegue às sub-redes públicas do VPC. Você pode criar e anexar um gateway de internet a uma sub-rede pública para permitir o acesso à internet.

    • Grupos de segurança: Os grupos de segurança são usados para controlar o tráfego de entrada e saída para instâncias do Amazon EC2 na sua rede. Você pode criar grupos de segurança personalizados e especificar as regras de acesso para cada grupo.

    • Listas de controle de acesso: As listas de controle de acesso (ACLs) são usadas para controlar o tráfego de entrada e saída para as sub-redes do VPC. Você pode criar ACLs personalizadas e especificar as regras de acesso para cada ACL.

    Conclusão

    O Amazon Virtual Private Cloud (VPC) é um serviço essencial para aqueles que desejam criar e personalizar a sua própria rede virtual na nuvem da AWS. Com o VPC, você pode criar uma rede isolada e segura, definir as suas próprias sub-redes e tabelas de roteamento, configurar gateways de internet e controlar o acesso aos recursos na sua rede.

    Compreender os componentes do VPC é fundamental para criar uma rede virtual eficaz e segura na nuvem da AWS. Ao utilizar o VPC, você pode garantir que a sua rede esteja configurada corretamente para atender às necessidades da sua empresa, além de garantir a segurança e a privacidade dos dados e dos recursos na nuvem da AWS.

    Além disso, o VPC pode ser integrado com outros serviços da AWS, como o Amazon EC2, o Amazon RDS e o Amazon S3, para criar soluções avançadas e escaláveis na nuvem. Com a sua flexibilidade e escalabilidade, o VPC é uma ferramenta poderosa para aqueles que desejam aproveitar ao máximo a nuvem da AWS.

    Resumo do resumo

    Em resumo, o Amazon Virtual Private Cloud (VPC) é um serviço fundamental para criar uma rede virtual isolada e personalizada na nuvem da AWS. Com o VPC, você pode personalizar a sua rede virtual de acordo com as suas necessidades, controlar o acesso aos recursos e integrá-lo com outros serviços da AWS para criar soluções avançadas e escaláveis.

    \ No newline at end of file diff --git a/projetos/6.Elastic_BeanStalk/index.html b/projetos/6.Elastic_BeanStalk/index.html new file mode 100644 index 00000000..81118ac8 --- /dev/null +++ b/projetos/6.Elastic_BeanStalk/index.html @@ -0,0 +1 @@ + 6. Elastic BeanStalk - Computação em Nuvem - 2024/1

    Elastic BeanStalk

    O Elastic Beanstalk é um serviço da AWS que facilita a implantação e a escalabilidade de aplicativos da web. O serviço é projetado para lidar com toda a complexidade da implantação de aplicativos, incluindo a configuração de recursos de infraestrutura e o provisionamento de capacidade.

    Características do Elastic Beanstalk

    Algumas das principais características do Elastic Beanstalk são:

    • Facilidade de uso: O Elastic Beanstalk permite que você implante e gerencie aplicativos da web e serviços com facilidade, sem a necessidade de gerenciar a infraestrutura subjacente. Você pode usar várias linguagens de programação, plataformas e serviços da AWS para implantar o seu aplicativo.

    • Autoscaling: O Elastic Beanstalk suporta o dimensionamento automático, permitindo que você aumente ou diminua a capacidade de processamento do seu aplicativo com base na demanda do usuário.

    • Integração: O Elastic Beanstalk integra-se com outros serviços da AWS, como o Amazon RDS, o Amazon S3 e o Amazon CloudWatch, para fornecer uma solução completa para a implantação de aplicativos.

    • Visibilidade: O Elastic Beanstalk oferece visibilidade sobre o estado do seu aplicativo, com logs e métricas que ajudam a detectar e solucionar problemas rapidamente.

    Como funciona o Elastic Beanstalk

    O Elastic Beanstalk automatiza o processo de implantação e gerenciamento de aplicativos da web e serviços na AWS. Para usar o Elastic Beanstalk, basta seguir alguns passos simples:

    • Crie um aplicativo: Crie um aplicativo na AWS que você deseja implantar usando o Elastic Beanstalk.

    • Configure as opções do aplicativo: Escolha as opções de linguagem de programação, plataforma e ambiente de tempo de execução do seu aplicativo.

    • Implante o aplicativo: Implante o aplicativo na plataforma Elastic Beanstalk e deixe que o serviço gerencie a implantação.

    • Gerencie o aplicativo: Gerencie e monitore o estado do aplicativo por meio do console do Elastic Beanstalk ou por meio de ferramentas de linha de comando.

    Conclusão

    O AWS Elastic Beanstalk é um serviço poderoso para aqueles que desejam implantar e gerenciar aplicativos da web e serviços na nuvem da AWS. Com o Elastic Beanstalk, você pode implantar aplicativos com facilidade, escalar automaticamente a capacidade de processamento do seu aplicativo, integrá-lo com outros serviços da AWS e obter visibilidade sobre o estado do seu aplicativo.

    Ao automatizar o processo de implantação e gerenciamento de aplicativos, o Elastic Beanstalk permite que desenvolvedores se concentrem no desenvolvimento de aplicativos e na criação de recursos de valor para os usuários finais. Em resumo, o AWS Elastic Beanstalk é uma ferramenta essencial para aqueles que desejam aproveitar ao máximo a nuvem da AWS.

    \ No newline at end of file diff --git a/projetos/7.IAM/index.html b/projetos/7.IAM/index.html new file mode 100644 index 00000000..538e9468 --- /dev/null +++ b/projetos/7.IAM/index.html @@ -0,0 +1 @@ + 7. AWS IAM - Computação em Nuvem - 2024/1

    Serviço AWS IAM

    O AWS Identity and Access Management (IAM) é um serviço que permite que você gerencie com segurança o acesso aos recursos da AWS. Com o IAM, você pode criar e gerenciar usuários e grupos, conceder e revogar permissões e definir políticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS.

    Características do AWS IAM

    Algumas das principais características do AWS IAM são:

    • Gerenciamento de usuários e grupos: O IAM permite que você crie e gerencie usuários e grupos na sua conta da AWS. Você pode conceder e revogar permissões para usuários individuais ou grupos de usuários.

    • Políticas de acesso: O IAM permite que você crie políticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS. Você pode definir políticas para usuários individuais, grupos de usuários ou para toda a sua conta da AWS.

    • Autenticação de usuários: O IAM fornece opções de autenticação de usuários, incluindo autenticação baseada em senha e autenticação de dois fatores.

    • Monitoramento de atividade de usuários: O IAM registra todas as atividades dos usuários na sua conta da AWS, permitindo que você monitore quem está acessando seus recursos e o que eles estão fazendo.

    Como funciona o AWS IAM

    O AWS IAM funciona permitindo que você crie e gerencie usuários e grupos na sua conta da AWS. Você pode conceder e revogar permissões para usuários individuais ou grupos de usuários e definir políticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS.

    Para usar o AWS IAM, basta seguir alguns passos simples:

    1. Crie usuários e grupos: Crie usuários e grupos na sua conta da AWS usando o console do IAM ou a API do IAM.

    2. Defina políticas de acesso: Defina políticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS. Você pode definir políticas para usuários individuais, grupos de usuários ou para toda a sua conta da AWS.

    3. Conceda permissões: Conceda permissões para usuários individuais ou grupos de usuários para permitir que eles acessem recursos na sua conta da AWS.

    4. Monitore a atividade de usuários: Monitore a atividade dos usuários na sua conta da AWS usando o console do IAM ou o AWS CloudTrail.

    Conclusão

    O AWS Identity and Access Management (IAM) é um serviço essencial para aqueles que desejam gerenciar com segurança o acesso aos recursos da AWS. Com o IAM, você pode criar e gerenciar usuários e grupos, conceder e revogar permissões e definir políticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS.

    Ao permitir que você crie e gerencie usuários e grupos e defina políticas de acesso, o IAM ajuda a garantir que seus recursos da AWS estejam protegidos contra acessos não autorizados e fornece a você o controle necessário para gerenciar sua conta da AWS com segurança.

    \ No newline at end of file diff --git a/projetos/8.Pipeline/index.html b/projetos/8.Pipeline/index.html new file mode 100644 index 00000000..9de45c33 --- /dev/null +++ b/projetos/8.Pipeline/index.html @@ -0,0 +1 @@ + 8. Pipeline CI/CD - Computação em Nuvem - 2024/1

    Serviço AWS Pipeline

    O AWS Pipeline é um serviço gerenciado de integração e entrega contínua (CI/CD) que permite automatizar o processo de implantação de software na AWS. Com o AWS Pipeline, é possível criar pipelines de implantação que automatizam as etapas de compilação, teste e implantação de software.

    Características do AWS Pipeline

    Algumas das principais características do AWS Pipeline são:

    • Automação do processo de implantação: O AWS Pipeline automatiza o processo de implantação de software na AWS, permitindo que você crie pipelines de implantação que incluem compilação, teste e implantação.

    • Suporte a várias fontes de código: O AWS Pipeline oferece suporte a várias fontes de código, incluindo repositórios Git, repositórios S3 e repositórios do AWS CodeCommit.

    • Integração com outros serviços da AWS: O AWS Pipeline se integra com outros serviços da AWS, como o AWS CodeBuild, AWS CodeDeploy e AWS CloudFormation, permitindo que você crie pipelines de implantação mais complexos.

    • Visualização do progresso do pipeline: O AWS Pipeline oferece uma interface visual que permite que você visualize o progresso do pipeline de implantação e identifique rapidamente quaisquer problemas que possam ocorrer durante o processo de implantação.

    Como funciona o AWS Pipeline

    O AWS Pipeline funciona criando pipelines de implantação que automatizam as etapas de compilação, teste e implantação de software. Para usar o AWS Pipeline, basta seguir alguns passos simples:

    1. Criar um pipeline: Crie um pipeline de implantação no console do AWS Pipeline ou usando a API do AWS Pipeline.

    2. Configurar a origem do código: Escolha a fonte do código para o pipeline, como um repositório Git ou S3.

    3. Configurar a compilação: Configure a compilação do código usando o AWS CodeBuild ou outro serviço de compilação.

    4. Configurar o teste: Configure o teste do código usando ferramentas de teste, como o AWS CodeBuild.

    5. Configurar a implantação: Configure a implantação do código usando o AWS CodeDeploy ou outro serviço de implantação.

    6. Executar o pipeline: Execute o pipeline de implantação e monitore o progresso usando a interface visual do AWS Pipeline.

    Conclusão

    O AWS Pipeline é uma solução eficiente e escalável para a automação do processo de implantação de software na AWS. Com o AWS Pipeline, é possível criar pipelines de implantação que automatizam as etapas de compilação, teste e implantação de software, permitindo que você implante seu software com mais rapidez e segurança.

    Ao oferecer suporte a várias fontes de código e integrar-se com outros serviços da AWS, como o AWS CodeBuild, AWS CodeDeploy e AWS CloudFormation, o AWS Pipeline permite que você crie pipelines de implantação mais complexos para atender às suas necessidades específicas de implantação de software.

    \ No newline at end of file diff --git a/projetos/9.ECS/index.html b/projetos/9.ECS/index.html new file mode 100644 index 00000000..4e03985e --- /dev/null +++ b/projetos/9.ECS/index.html @@ -0,0 +1 @@ + 9. ECS - Computação em Nuvem - 2024/1

    Serviço AWS ECS

    O Amazon Elastic Container Service (ECS) é um serviço gerenciado que permite executar aplicativos em contêineres na nuvem da AWS. Ele ajuda a implantar e gerenciar aplicativos em contêineres com facilidade e segurança, usando um ambiente escalável e flexível.

    Características do AWS ECS

    Algumas das principais características do AWS ECS são:

    • Gerenciamento de contêineres escalável: O ECS é um serviço altamente escalável que permite executar milhares de contêineres em uma única instância.

    • Alta disponibilidade: O ECS é projetado para oferecer alta disponibilidade, reduzindo a possibilidade de interrupções de serviço.

    • Integração com outros serviços da AWS: O ECS é integrado com outros serviços da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC.

    • Suporte a vários tipos de contêineres: O ECS oferece suporte a vários tipos de contêineres, incluindo Docker e containerd.

    Como funciona o AWS ECS

    O AWS ECS é composto de vários componentes, incluindo clusters, serviços e tarefas. O ECS usa o Amazon EC2 para executar contêineres em instâncias EC2, ou o AWS Fargate para executar contêineres sem precisar gerenciar instâncias EC2.

    Para usar o AWS ECS, siga estes passos simples:

    1. Crie um cluster: Crie um cluster ECS para executar seus aplicativos em contêineres. Os clusters são criados usando o console do ECS ou a API do ECS.

    2. Defina tarefas: Crie uma ou mais tarefas que descrevam como executar um ou mais contêineres.

    3. Crie serviços: Crie um ou mais serviços que usem as tarefas definidas para gerenciar a execução de contêineres.

    4. Inicie a execução: Inicie a execução de seus serviços para implantar seus aplicativos em contêineres.

    5. Gerencie os serviços: Gerencie os serviços implantados para garantir que eles estejam sempre em execução e disponíveis.

    Conclusão

    O Amazon Elastic Container Service (ECS) é uma plataforma eficiente para executar e gerenciar aplicativos em contêineres na nuvem da AWS. Com sua alta escalabilidade e flexibilidade, o ECS é uma solução ideal para empresas que buscam uma forma segura e confiável de executar aplicativos em contêineres.

    Ao integrar-se com outros serviços da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC, o ECS permite que você crie uma infraestrutura de aplicativos em contêineres altamente personalizada que atenda às suas necessidades específicas.

    \ No newline at end of file diff --git a/projetos/changelog/index.html b/projetos/changelog/index.html new file mode 100644 index 00000000..dc592a76 --- /dev/null +++ b/projetos/changelog/index.html @@ -0,0 +1 @@ + Changelog - Computação em Nuvem - 2024/1

    Changelog

    Material for MkDocs Insiders

    4.21.1 _ August 13, 2022

    • Fixed #4176: Broken image when avatar is served by Gravatar
    • Fixed #4212: Deferred search initialization for file:// locations

    4.21.0 _ July 17, 2022

    • Added meta plugin: set front matter for all pages in a folder
    • Fixed #4114: Tags plugin fails if only tags_extra_files is set

    4.20.1 _ July 11, 2022

    • Fixed #4105: Tags plugin fails if tags_file is not set (4.20.0 regression)

    4.20.0 _ July 7, 2022

    • Added support for additional tags indexes
    • Fixed #4100: Tag icons not shown in tags index

    4.19.2 _ July 4, 2022

    • Fixed #4051: Privacy plugin fails if symlinking isn't allowed on Windows

    4.19.1 _ June 25, 2022

    • Added mkdocs-git-committers-plugin to Dockerfile
    • Added mkdocs-git-revision-date-localized-plugin to Dockerfile

    4.19.0 _ June 24, 2022

    • Added support for document contributors
    • Updated French translations for cookie consent

    4.18.2 _ June 16, 2022

    • Fixed #4026: Fixed tooltips not mounted for nested navigation links

    4.18.1 _ June 14, 2022

    • Fixed #3990: Chinese search highlighting not working on non-boundaries

    4.18.0 _ June 11, 2022

    • Added support for automatic dark/light mode
    • Fixed #4009: Privacy plugin uses invalid paths for file cache on Windows

    4.17.2 _ June 5, 2022

    • Added support for custom jieba dictionaries (Chinese search)

    4.17.1 _ June 5, 2022

    • Added support for cookie consent reject button
    • Added support for cookie consent custom button ordering
    • Fixed #3988: Content tab not focused after alternating anchor links

    4.17.0 _ June 4, 2022

    • Added support for content tabs anchor links (deep linking)
    • Fixed #3975: Detect composition events in search interface (Chinese)
    • Fixed #3980: Search plugin doesn't use title set via front matter

    4.16.2 _ May 29, 2022

    • Fixed #3961: Nested sections triggered build error for navigation tabs

    4.16.1 _ May 28, 2022

    • Switched feedback widget rating titles to tooltips
    • Improved contrast of link colors for light/dark color schemes
    • Fixed #3950: Sticky navigation tabs rendering broken (4.15.2 regression)
    • Fixed #3958: Links invisible when using white primary color

    4.16.0 _ May 25, 2022

    • Added support for navigation pruning
    • Fixed search results for non-segmented characters (4.15.2 regression)

    4.15.2 _ May 22, 2022

    • Removed workaround for abbr on touch devices (superseded by tooltips)
    • Fixed #3915: Improved Chinese search query segmentation
    • Fixed #3938: Fixed tooltips position for navigation titles with ellipsis

    4.15.1 _ May 14, 2022

    • Improved performance of element focus obervables
    • Fixed #3531: Added prev/next buttons to content tabs
    • Fixed tooltip positioning when host element is hidden

    4.15.0 _ May 8, 2022

    • Added support for improved tooltips
    • Fixed #3785: Show tooltip on hover for overflowing navigation link

    4.14.0 _ May 5, 2022

    • Added Chinese language support to built-in search plugin
    • Fixed all-numeric page titles raising error in social plugin

    4.13.2 _ April 30, 2022

    • Improved caching of downloaded resources in privacy plugin
    • Fixed #3851: External images not downloaded by privacy plugin

    4.13.1 _ April 25, 2022

    • Fixed #3839: Tags plugin breaks without icons (4.13.0 regression)

    4.13.0 _ April 24, 2022

    • Added support for tag icons

    4.12.0 _ March 27, 2022

    • Added support for card grids and grid layouts
    • Fixed #3685: Annotations sometimes broken when using instant loading
    • Fixed #3742: Automatically add Mermaid.js when building for offline usage

    4.11.0 _ March 6, 2022

    • Added support for excluding external assets from privacy plugin

    4.10.1 _ March 2, 2022

    • Added missing build dependencies to Dockerfile
    • Fixed encoding issues in privacy plugin, now forcing UTF-8 encoding
    • Fixed #3624: Scroll to active navigation item unreliable in Firefox
    • Fixed #3642: Privacy plugin errors when font setting was omitted

    4.10.0 _ February 27, 2022

    • Added support for offline plugin (supersedes offline search support)
    • Improved built-in privacy plugin to download nested JavaScript assets
    • Refactored configuration of built-in privacy plugin

    4.9.1 _ February 21, 2022

    • Fixed #3610: missing lxml dependency for privacy plugin
    • Fixed error when charset is missing in content-type header

    4.9.0 _ February 20, 2022

    • Added privacy plugin: automatic downloading of external assets

    4.8.3 _ February 13, 2022

    • Fixed #3560: Mermaid diagrams don't render for file:// locations

    4.8.2 _ February 10, 2022

    • Fixed #3559: Mermaid diagrams don't render inside closed details

    4.8.1 _ February 6, 2022

    • Fixed jump back to top on mobile when using anchor following

    4.8.0 _ February 6, 2022

    • Added support for anchor following table of contents (= auto scroll)

    4.7.2 _ February 2, 2022

    • Fixed #3526: Transparent sidebar title due to Safari bug
    • Fixed #3528: Firefox sometimes clips text in flow chart diagrams

    4.7.1 _ January 30, 2022

    • Fixed #3506: Tags index not respecting title set via front matter

    4.7.0 _ January 25, 2022

    • Added native support for offline search

    4.6.1 _ January 16, 2022

    • Fixed #3459: Section index pages picking up wrong title

    4.6.0 _ January 11, 2022

    • Added support for annotations (outside of code blocks)

    4.5.2 _ January 8, 2022

    • Fixed #3440: Content tab indicator not moving when using linking
    • Fixed #3445: Content tab switch flickers/jitters when using linking

    4.5.1 _ January 2, 2022

    • Added support for setting initial state of cookie consent
    • Fixed #3396: Disappearing link in navigation due to Safari bug

    4.5.0 _ December 16, 2021

    • Added support for navigation icons

    4.4.0 _ December 10, 2021

    • Added support for code annotation anchor links (deep linking)
    • Added new code annotation syntax modifier to strip comment
    • Updated German translations for cookie consent

    4.3.0 _ December 5, 2021

    • Added support for custom fonts in social cards
    • Fixed #3300: Announcement bar reappearing when using instant loading

    4.2.0 _ December 2, 2021

    • Added support for dismissable announcement bar
    • Added support for named placeholders in feedback widget

    4.1.0 _ November 30, 2021

    • Added support for passing page title to feedback forms

    4.0.0 _ November 28, 2021

    • Removed deprecated content tabs legacy implementation
    • Removed deprecated seealso admonition type
    • Removed deprecated site_keywords setting (unsupported by MkDocs)
    • Removed deprecated prebuilt search index support
    • Removed deprecated web app manifest – use customization
    • Removed extracopyright variable – use new copyright partial
    • Removed Disqus integation – use customization
    • Switched to :is() selectors for simple selector lists
    • Switched autoprefixer from last 4 years to last 2 years
    • Improved CSS overall to match modern standards
    • Improved CSS variable semantics for fonts
    • Improved extensibility by restructuring partials
    • Improved handling of details when printing
    • Improved keyboard navigation for footnotes
    • Fixed #3214: Search highlighting breaks site when empty

    3.2.3 _ November 20, 2021

    • Updated Swedish and French translations
    • Removed support for .mermaid-experimental class (now .mermaid)
    • Fixed #3202: Cookie consent not dismissable on file:// locations
    • Fixed #3216: Cookie consent not dismissed when invoked via anchor
    • Fixed #3232: Mermaid.js sometimes runs twice (race condition)

    3.2.2 _ November 6, 2021

    • Fixed always last feedback rating being sent
    • Fixed #3145: Code annotations eat whole comment lines
    • Fixed #3170: Feedback widget doesn't send data to GA4

    3.2.1 _ November 4, 2021

    • Added support for custom Mermaid.js version via additional JavaScript
    • Fixed some configuration edge cases for tags plugin (3.1.5 regression)
    • Fixed feedback widget title not being centered in Firefox
    • Fixed #3179: Safari doesn't send request for feedback widget

    3.2.0 _ October 31, 2021

    • Added support for feedback widget (Was this page helpful?)

    3.1.5 _ October 28, 2021

    • Fixed #3144: Rogue link when using tags with auto-populated navigation
    • Fixed #3147: Code block line numbers appear in search results
    • Fixed #3158: Social cards do not strip HTML tags from title

    3.1.4 _ October 17, 2021

    • Fixed #2974: Text cropped with other fonts than Roboto in social plugin
    • Fixed #3099: Encoding problems with non-latin character in social plugin
    • Fixed #3112: Japanese segmenter not executed as part of new tokenizer
    • Fixed tags (front matter) appearing in search with disabled tags plugin

    3.1.3 _ October 12, 2021

    • Added warnings to search plugin for unsupported options and syntax
    • Fixed #3503: Search sometimes returns entire page
    • Fixed #3089: Single-line code annotations disappear when printing

    3.1.2 _ October 6, 2021

    • Fixed incorrect path separators for social cards on Windows

    3.1.1 _ September 26, 2021

    • Fixed ordering bug in search exclusion logic

    3.1.0 _ September 26, 2021

    • Added support for excluding pages, sections, and elements from search
    • Fixed #2803: Code block annotations not visible when printing

    3.0.1 _ September 19, 2021

    • Added support for using literal h1-6 tags for search plugin
    • Fixed search plugin breaking on void elements without slashes
    • Fixed search plugin filtering link contents from headlines
    • Fixed search plugin handling of multiple h1 headlines
    • Fixed search plugin handling of missing h1 headlines

    3.0.0 _ September 13, 2021

    • Rewrite of MkDocs' search plugin
    • Added support for rich search previews
    • Added support for tokenizer with lookahead
    • Improved search indexing performance (twice as fast)
    • Improved search highlighting

    2.13.3 _ September 1, 2021

    • Added support for disabling social card generation

    2.13.2 _ August 25, 2021

    • Fixed #2965: Social plugin error when primary color is not defined

    2.13.1 _ August 21, 2021

    • Fixed #2948: Social cards are not cached
    • Fixed #2953: Mermaid.js diagrams can't be centered anymore

    2.13.0 _ August 7, 2021

    • Added support for custom colors in social cards

    2.12.2 _ August 4, 2021

    • Fixed #2891: Division by zero error in social plugin

    2.12.1 _ July 26, 2021

    • Fixed error in social plugin when site_description was not set
    • Fixed error in social plugin for non-ASCII characters

    2.12.0 _ July 25, 2021

    • Added support for social cards

    2.11.1 _ July 20, 2021

    • Fixed order of tags index, now sorted alphabetically

    2.11.0 _ July 18, 2021

    • Improved Mermaid.js intergration, now stable
    • Added support for sequence diagrams
    • Added support for entity relationship diagrams
    • Added support for cookie consent configuration
    • Added feature flag to always enable annotations

    2.10.0 _ July 10, 2021

    • Added support for cookie consent
    • Fixed #2807: Back-to-top button not hidden when using sticky tabs

    2.9.2 _ May 30, 2021

    • Moved tags to partial for easier customization
    • Added support for hiding tags on any page

    2.9.1 _ May 24, 2021

    • Added missing guard for linking of content tabs

    2.9.0 _ May 23, 2021

    • Added support for linking of content tabs

    2.8.0 _ May 12, 2021

    • Added support for boosting pages in search

    2.7.2 _ May 8, 2021

    • Fixed #2638: Warnings shown when using tags plugin without directory URLs

    2.7.1 _ May 3, 2021

    • Fixed git-revision-date-localized plugin integration (2.7.0 regression)

    2.7.0 _ May 1, 2021

    • Added support for tags (with search integration)

    2.6.0 _ April 11, 2021

    • Stay on page when switching versions

    2.5.0 _ March 28, 2021

    • Added support for version warning

    2.4.0 _ March 20, 2021

    • Added support for custom admonition icons
    • Fixed #2444: Code block annotations with extra comments have wrong index

    2.3.1 _ March 14, 2021

    • Fixed anchor offset for permalinks when using sticky navigation tabs

    2.3.0 _ March 13, 2021

    • Added support for back-to-top button

    2.2.1 _ March 4, 2021

    • Fixed #2382: Repository stats failing when no release tag is present

    2.2.0 _ February 28, 2021

    • Added support for code block annotations

    2.1.0 _ February 26, 2021

    • Added support for anchor tracking

    2.0.0 _ February 24, 2021

    • Migrated Insiders to the new architecture
    • Swapped color palette toggle configuration

    1.17.0 _ January 31, 2021

    • Added support for section index pages

    1.16.1 _ January 26, 2021

    • Fixed #2249: Instant loading + sticky tabs result in invalid links
    • Fixed #2248: Search highlighting URL parameter always added
    • Fixed #2235: Version selector doesn't select current version for aliases

    1.16.0 _ January 7, 2021

    • Added latest release to repository info (GitHub)
    • Slight facelift of repository info (lighter fonts, spacing and icons)

    1.15.0 _ January 2, 2021

    • Added support for native Mermaid.js integration

    1.14.0 _ December 30, 2020

    • Added support for sharing searches

    1.13.2 _ December 22, 2020

    • Fixed version selector + sticky tabs navigation rendering issues
    • Fixed version selector wrapping

    1.13.1 _ December 20, 2020

    • Removed horizontal scrollbars on language and version selector
    • Fixed type conversion in JavaScript config

    1.13.0 _ December 13, 2020

    • Refactored navigation tabs to simplify grouping behavior
    • Added support for sticky navigation tabs
    • Added support for arbitrary links in navigation tabs
    • Fixed #2098: Subsequent active subsection not highlighted correctly

    1.12.1 _ December 8, 2020

    • Fixed empty language selector being shown

    1.12.0 _ December 6, 2020

    • Added support for adding a language selector

    1.11.2 _ November 29, 2020

    • Fixed #2068: Search highlight interprets code blocks as JavaScript

    1.11.1 _ November 29, 2020

    • Refactored styling to be more stable and easier to adjust
    • Fixed some styling regressions from latest features

    1.11.0 _ November 22, 2020

    • Added support for rendering admonitions as inline blocks

    1.10.0 _ November 15, 2020

    • Added support for integrating table of contents into navigation

    1.9.0 _ November 7, 2020

    • Added support for hiding navigation and table of contents on any page
    • Removed autohiding table of contents when empty

    1.8.0 _ November 1, 2020

    • Added support for navigation sections
    • Fixed appearance of inactive search suggestions

    1.7.0 _ October 25, 2020

    • Added support for deploying multiple versions
    • Fixed alignment of sidebar when content area is too small

    1.6.0 _ October 11, 2020

    • Added support for search suggestions to save keystrokes
    • Added support for removing Made with Material for MkDocs from footer
    • Fixed #1915: search should go to first result by pressing Enter

    1.5.1 _ September 21, 2020

    • Fixed content area stretching to whole width for long code blocks

    1.5.0 _ September 19, 2020

    • Added support for autohiding table of contents when empty

    1.4.1 _ September 6, 2020

    • Improved typeahead and search result relevance and scoring

    1.4.0 _ August 30, 2020

    • Added support for autohiding header on scroll

    1.3.0 _ August 26, 2020

    • Added support for user-selectable color palettes

    1.2.0 _ August 11, 2020

    • Added feature to expand navigation by default

    1.1.0 _ August 3, 2020

    • Added highlighting of search results

    1.0.0 _ July 14, 2020

    • Added grouping of search results
    • Added missing query terms to search result
    • Improved search result relevance and scoring
    \ No newline at end of file diff --git a/projetos/construcao/index.html b/projetos/construcao/index.html new file mode 100644 index 00000000..29c5d384 --- /dev/null +++ b/projetos/construcao/index.html @@ -0,0 +1 @@ + Construção - Computação em Nuvem - 2024/1

    Em Contrução

    Visualização do Processo de Contrução

    Em Construção

    \ No newline at end of file diff --git a/projetos/projeto_2022/index.html b/projetos/projeto_2022/index.html new file mode 100644 index 00000000..133fdff9 --- /dev/null +++ b/projetos/projeto_2022/index.html @@ -0,0 +1 @@ + Computação em Nuvem - Computação em Nuvem - 2024/1

    Projeto Cloud 2022

    Infraestrutura como código é o processo de gerenciamento de infraestrutura em um arquivo ou arquivos, em vez de configurar recursos manualmente em uma dashboard. Partindo deste conceito, você deverá:

    Desenvolver uma aplicação capaz de provisionar uma infraestrutura por meio de uma interface amigável(livre escolha) para gerenciar e administrá-la (construir, alterar e deletar recursos).

    A rubrica abaixo pressupõe que para alcançar o Conceito "B" você tenha feito o Conceito "C" por completo. Assim, para ter "A" precisa que os conceitos anteriores tenham sido alcançados.

    Sua aplicação deverá seguir as funções (descrição) abaixo e a tabela completa para alcançar o conceito base.

    Conceito C+ Descrição
    CRIAR VPC criação de uma VPC e sub-rede; instâncias: esta funcionalidade deverá permitir a escolha de pelo menos 2 tipos de configuração de hosts; ainda deverá ser possível aumentar e diminuir a quantidade de instâncias; security group: criação e a associação de grupos de segurança com instâncias; Usuário no IAM.
    DELETAR Instâncias, grupos de segurança e usuário.
    LISTAR Aplicação deverá listar todas instâncias e suas regiões, usuários, grupos de segurança e suas regras.
    Conceito B Descrição
    CRIAR Regras em security group; Instância em mais de uma região; Associar algum tipo de restrição de acesso a um usuário;
    DELETAR Regras de security group; recursos implantados na Região;
    Conceito A Descrição
    CRIAR Criar um HA de servidores web.

    Warning

    OBS: Será descontado meio conceito na nota do projeto caso algum incidente ou publicação (vazamento) de sua chave AWS for identificada no git hub.

    ENTREGA

    • Os projetos deverão ser entregues até às 23h59 do dia 25/11/2022.
    • A entrega será feita via blackboard por meio da associação de seu github.
    • Todos os projetos deverão estar acompanhados de um roteiro (tutorial) de instalação e operação.
    • Serão sorteados/escolhidos 16 projetos para apresentação no dia 01/12/2022.
    • A publicação dos projetos que realizarão a apresentação será no dia 28/11/2022.
    • A apresentação será realizada em um tempo máximo de 15 minutos a partir do roteiro entregue.

    ⚡⚡⚡ Falta pouco para terminar o semestre, foquem em terminar os roteiros 3 e 4 em sala e desenvolva o projeto fora do horário de aula. ⚡⚡⚡

    Dica

    Sugerimos que você estude a partir de documentações oficiais e tutoriais técnicos. * terraform.io * terraform-aws-get-started

    \ No newline at end of file diff --git a/projetos_2022/DaviReisVieira/index.html b/projetos_2022/DaviReisVieira/index.html new file mode 100644 index 00000000..fdc2a45a --- /dev/null +++ b/projetos_2022/DaviReisVieira/index.html @@ -0,0 +1,58 @@ + Davi Reis - Computação em Nuvem - 2024/1

    Infraestrutura por Código

    Aplicação Front-end para gerenciar infraestrutura construída com Terraform.

    AWS Core Management

    index

    Description

    This project is a simple example of how to use Terraform to manage AWS resources.

    Technologies

    Terraform Python Flask React Next.js

    Requirements

    Usage

    Execute the install.sh script to install the dependencies and configure the infrastructure.

    $ ./install.sh
    +

    Open your browser and go to the URL http://localhost:3000. You should see the following page:

    Tutorial

    1. Register in the plataform with username, password, AWS Access Key ID and AWS Secret Access Key. Tutorial 1
    2. After registering, you will be redirected to the login page. Log in with the username and password you registered. Tutorial 2
    3. After logging in, you will be redirected to the home page. Here you can see the AWS regions. Create a new region by clicking on the Create button after selecting the region you want to create. Tutorial 3
    4. You can select a specific region by clicking on the region name. Here you can see the AWS resources. Tutorial 4
    5. Create a new resource by clicking on the Create button after selecting the resource you want to create. Tutorial 5
    6. Update the region configuration by clicking on the Update Region. Tutorial 6

    Concepts

    Conceito C+

    Criar:

    • VPC criação de uma VPC e sub-rede; instâncias: esta funcionalidade deverá permitir a escolha de pelo menos 2 tipos de configuração de hosts; ainda deverá ser possível aumentar e diminuir a quantidade de instâncias; security group: criação e a associação de grupos de segurança com instâncias; Usuário no IAM.

    Deletar:

    • Instâncias, grupos de segurança e usuário.

    Listar:

    • Aplicação deverá listar todas instâncias e suas regiões, usuários, grupos de segurança e suas regras.

    Conceito B

    Criar:

    • Regras em security group; Instância em mais de uma região; Associar algum tipo de restrição de acesso a um usuário;

    Deletar:

    • Regras de security group; recursos implantados na Região;

    Conceito A

    Criar:

    • Criar um HA de servidores web.

    Format of variables in Terraform JSON

    • Security Group
    {
    +  "id": "sg-0a1b2c3d",
    +  "name": "sg-tcp/udp-22 - davirvs",
    +  "description": "Security Group for EC2",
    +  "ingress": [
    +    {
    +      "description": "SSH",
    +      "from_port": 22,
    +      "to_port": 22,
    +      "protocol": "tcp",
    +      "cidr_blocks": ["0.0.0.0/0"]
    +    }
    +  ],
    +  "egress": [
    +    {
    +      "description": "All",
    +      "from_port": 0,
    +      "to_port": 0,
    +      "protocol": "-1",
    +      "cidr_blocks": ["0.0.0.0/0"]
    +    }
    +  ]
    +}
    +
    • EC2
    {
    +  "name": "davirvs1_ubuntu2204",
    +  "ami": "ami-08c40ec9ead489470",
    +  "instance_type": "t2.micro",
    +  "security_groups_ids": ["sg-0a1b2c3d"]
    +}
    +
    • User
    {
    +  "name": "davirvsTeste1",
    +  "policies": {
    +    "name": "davirvsTeste1Restrictions",
    +    "description": "Estas são as restrições do usuário davirvsTeste1",
    +    "actions": ["ec2:DescribeInstances", "ec2:DescribeSecurityGroups"],
    +    "resources": ["*"]
    +  }
    +}
    +
    • Group
    {
    +  "id": "ug-0a1b2c3d",
    +  "name": "davirvsGroups1",
    +  "description": "davirvsGroups1 description",
    +  "policies": {
    +    "name": "davirvsGroups1Restrictions",
    +    "description": "Estas são as restrições do grupo de usuários davirvsGroups1",
    +    "actions": ["ec2:DescribeInstances", "ec2:DescribeSecurityGroups"],
    +    "resources": ["*"]
    +  }
    +}
    +

    Format of JSON variable file

    {
    +  "aws-region": "us-east-2",
    +  "security_groups": [],
    +  "instances": [],
    +  "users": [],
    +  "users_groups": []
    +}
    +
    \ No newline at end of file diff --git a/projetos_2022/fran-janela/index.html b/projetos_2022/fran-janela/index.html new file mode 100644 index 00000000..31bed094 --- /dev/null +++ b/projetos_2022/fran-janela/index.html @@ -0,0 +1,192 @@ + Francisco Janela - Computação em Nuvem - 2024/1

    Infraestrutura por Código

    Aplicação em Python para gerenciar infraestrutura construída com Terraform.

    Como Operar com o meu programa:

    Warning

    O programa foi desenvolvido por uma única pessoa, e existem algumas falhas na robustez da utilização, ou seja, é da responsabilidade do usuário configurar adequadamente os campos durante a utilização para que a montagem não falhe. Ademais, aproveito para lembrar a importância da proteção de suas chaves de acesso, utilize-as apenas em variáveis de ambiente. Esta aplicação utiliza a criação de um arquivo .env para armazená-las. Mais sobre isso na aba de Pré-Requisitos.

    Pré-requisitos

    Para começar a operar com o meu programa, sigam o passo a passo indicado no readme do meu repositório no github.

    Como usar

    Ao iniciar o programa pela primeira vez, o usuário se depara com a escolha entre a configuração das regiões, podendo, nesse caminho, gerenciar instâncias, gerenciar security groups e levantar aplicações em HA (High Availability), e a configuração do ambiente do IAM, onde o usuário pode gerenciar usuários e políticas(restrições).

    Para facilitar, a árvore de navegação abaixo, pode trazer mais facilidade para o usuário se encontrar pelo programa:

    ├── Configuração de Regiões
    +│   ├── Criar, deletar ou escolher uma região
    +│   ├── Gerenciar Instâncias
    +│   │   ├── Listar Instâncias
    +│   │   ├── Criar Instância
    +│   │   ├── Deletar Instância
    +│   │   ├── Atualizar Configuração de uma Instância
    +│   │   └── Voltar
    +│   ├── Gerenciar Security Groups
    +│   │   ├── Listar Security Groups
    +│   │   ├── Criar Security Group
    +│   │   ├── Deletar Security Group
    +│   │   ├── Adicionar Regras a um Security Group
    +│   │   ├── Deletar Regras de um Security Group
    +│   │   └── Voltar
    +│   └── Gerenciar Aplicação em HA
    +│       ├── Listar Aplicação em HA
    +│       ├── Criar Aplicação em HA
    +│       ├── Deletar Aplicação em HA
    +│       └── Voltar
    +├── Configuração do IAM
    +│   ├── Limpar ou Restaurar a Infraestrutura do IAM
    +│   ├── Gerenciar Usuários
    +│   │   ├── Listar Usuários
    +│   │   ├── Criar Usuário
    +│   │   ├── Deletar Usuário
    +│   │   ├── Adicionar Políticas a um Usuário
    +│   │   ├── Deletar Políticas de um Usuário
    +│   │   └── Voltar
    +│   └── Gerenciar Políticas
    +│       ├── Listar Políticas
    +│       ├── Importar Política
    +│       └── Voltar
    +├── Listar todas as Instâncias
    +└── Sair
    +

    Em sua maioria, as instruções de uso de cada uma das funcionalidades está autocontida no próprio programa, mas existem algumas considerações que podem ser feitas:

    Configuração de Regiões

    Criar, deletar ou escolher uma região

    • Ao criar uma região em um uma daquelas disponíveis no programa, garanta que a sua conta possua permissões para fazê-lo, pois isso pode gerar um problema para o bom funcionamento da aplicação. Ao criar uma nova região, automáticamente a infraestrutura básica é copiada da pasta de sample para uma com o nome da região, com a adição do prefixo tf-.

    • Ao escolher a opção de deletar uma região, não existe confirmação necessária, e se o comando for executado, a região será deletada, ou seja, irá perder todos os recursos criados naquela região de uma vez. Portanto, é importante que o usuário tenha certeza de que deseja deletar a região.

    Gerenciar Instâncias

    • Ao Listar as Instâncias, o usuário deve escolher pelo número mostrado na tela aquela que quer visualizar mais informações.

    • Ao Criar uma Instância, o usuário deve escolher o tipo de instância que deseja criar, e o nome da instância que deseja criar. O nome da instância deve ser único, ou seja, não pode haver duas instâncias com o mesmo nome na mesma região. Além disso, o número de instâncias olocado é a quantidade de réplicas aquelas configurações que irão ser criadas. Por fim, o Sistema Operacional pré definido é o Ubuntu Server 18.04 LTS.

    Warning

    O usuário deve ter criado previamente seu par de chaves na AWS para poder indicá-lo na criação de uma instância e, por sua vez, poder acessá-lo via ssh posteriormente.

    • Ao atualizar a configuração de uma instância estará mudando todas as réplicas criadas. Quando for feita a mudança de número de instâncias, será sempre a com índice maior que será deletada. Ao mudar os ids dos security groups, deverá passar novamente todos aqueles que desejar aplicar à instância, configurações antigas serão perdidas.

    Gerenciar Security Groups

    • Ao Listar os Security Groups, o usuário deve escolher pelo número mostrado na tela aquele que quer visualizar mais informações.

    • Ao Criar um Security Group, o usuário deve escolher o nome do Security Group que deseja criar. O nome do Security Group deve ser único, ou seja, não pode haver dois Security Groups com o mesmo nome na mesma região. Além disso, poderá ser criado quantas regras de Ingress e Egress que o usuário desejar, se atentando somente à liberação de todas as portas para não correr riscos de segurança.

    • Só será possível deletar um Security Group se ele não estiver sendo usado, ou seja, se quiser deletá-lo, deve remover todas as dependências dele nas instâncias da região.

    Gerenciar Aplicação em HA

    Em primeiro lugar, a Aplicação em HA é uma demo com funcionamento limitado, que permite a criação de uma aplicação predefinida e utiliza sistemas de Auto Scalling e Load Balancing disponíveis na AWS. Só é possível criar em duas regiões: us-east-1 e us-east-2.

    • Só pode ser criada uma aplicação em HA por região, ou seja, se já houver uma aplicação em HA criada na região, não será possível criar outra.

    • Para pegar a URL da aplicação e poder acessá-la, basta listar a aplicação no programa.

    Configuração do IAM

    Limpar ou Restaurar a Infraestrutura do IAM

    • Limpar a infraestrutura do IAM significa apagar todas as configurações pré criadas para usuários, mas todos as políticas importadas continuarão sendo criadas quando for restaurada a infraestrutura.

    • A Infraestrutura vem configurada com 4 políticas de teste: AdministratorAccess, AdminNorthVirginia, AdminOregon e AdminOhio. Essas políticas são criadas automaticamente quando a infraestrutura é restaurada, e não podem ser deletadas.

    Gerenciar Usuários

    • Ao Listar os Usuários, desta vez o usuário não precisa escolher pelo número mostrado na tela, pois o programa já irá mostrar as informações de todos os usuários e todas as políticas atreladas a eles.

    • Ao Criar um Usuário, o usuário deve escolher o nome do Usuário que deseja criar. O nome do Usuário deve ser único, ou seja, não pode haver dois Usuários com o mesmo nome na mesma região. Além disso, a senha aparecerá somente na criação deste, então guarde-a em um local seguro antes de continuar. Atrelar uma política (restrição) ao usuário, deve ser feita posteriormente com a função de adicionar políticas.

    • Ao deletar um Usuário, o usuário não poderá ser recuperado, e todas as configurações de políticas atreladas também serão descartadas, mas as políticas em si ainda continuarão existindo.

    Gerenciar Políticas

    • Ao Listar as Políticas, o usuário deve escolher pelo número mostrado na tela aquela que quer visualizar mais informações.

    • Para importar uma política, o usuário deve passar o path completo do arquivo .json. Caso seja um arquivo válido, a regra será criada e permanentemente adicionada ao seu repositório de políticas. Para deletá-la, deve apagar o arquivo .json criado em iam/policies/. O nome da política será o nome do arquivo, sem a extensão.

    • Para facilitar a criação, construa a política pela dashboard da AWS e copie o conteúdo do arquivo .json gerado.


    Roteiro DIY

    Começando

    Para seguir esse tutorial é necessário:

    • Tecnologias: Terraform, Python
    • Documentos: Terraform AWS Docs
    • Pré-Requisitos: aqueles anteriormente destacados para o funcionamento do programa e uma conta na AWS com permissões de administrador e suas credenciais.

    Danger

    ATENÇÃO: Estas próximas etapas serão feitas para vias de estudo, não é recomendado que sejam feitas em um ambiente de produção. Além disso, as chaves que serão utilizadas são extremamente sensíveis, então não as compartilhe com ninguém, muito menos disponibilize-as no GitHub ou similares. Daqui em diante é por sua conta e risco.

    O que é Terraform?

    Terraform é uma ferramenta de infraestrutura por código, desenvolvida pela HashiCorp, que te permite definir, tanto para Cloud Pública, quanto para Cloud Privada, recursos de infraestrutura em código possível de ser lido pelo ser humano e pelo computador, podendo ser versionado, reutilizádo e compartilhado.

    Terraform e AWS

    A HashiCorp disponibiliza uma série de módulos para os recursos na aws que podem ser copiados e reconfigurados para construir a sua infraestrutura. Para facilitar a sua pesquisa, a documentação no link acima é de grande utilidade.

    Existem 4 grandes tipos de módulos que serão explorados neste roteiro, são eles:

    • Provider: é o módulo que permite a comunicação com a AWS, e é o primeiro módulo que deve ser importado. Ele é responsável por definir a região que será utilizada, e também as credenciais de acesso.

    • Resource: é o módulo que define os recursos que serão utilizados na AWS. Por exemplo, se você deseja criar uma instância EC2, você deve importar o módulo aws_instance e configurar os parâmetros necessários para a criação da instância.

    • Data: é o módulo que permite a consulta de informações de recursos já existentes na AWS. Por exemplo, se você deseja consultar o ID de uma instância EC2, você deve importar o módulo aws_instance e configurar os parâmetros necessários para a consulta da instância.

    • Output: é o módulo que permite a visualização de informações de recursos já existentes na AWS. Por exemplo, se você deseja visualizar o ID de uma instância EC2, você deve importar o módulo aws_instance e configurar os parâmetros necessários para a visualização da instância.

    Criando a Infraestrutura Básica para o roteiro

    Em primeiro lugar, defina um diretório(pasta) para o seu projeto. Isso vai ser importante para posteriormente replicar o que foi feito e poder escalar para a construção de uma infraestrutura maior com o auxílio de uma aplicação em python. Dê o nome de sample para o diretório, pois ele será a amostra replicada para cada região. Para este tutorial iremos utilizar somente a região us-east-1 (Norte da Virgínia).

    Dentro deste diretório, crie um arquivo chamado main.tf e outro chamado variables.tf. O primeiro será responsável por definir os providers necessários e iniciar a estrutura do terraform, e o segundo será responsável por definir as variáveis que serão utilizadas para a criação dos recursos.

    • Dentro do arquivo main.tf, insira o seguinte código:
    terraform {
    +  required_providers {
    +    aws = {
    +      source  = "hashicorp/aws"
    +      version = "~> 4.16"
    +    }
    +  }
    +
    +  required_version = ">= 1.2.0"
    +}
    +

    Este Snipet de código é responsável, então, por definir a versão do terraform que será utilizada e também a versão do provider aws que será necessário.

    Além disso, é necessário definir, em si, a região do provider e passar a ele as credenciais para poder acessar a sua AWS.

    • Em um novo arquivo provider.tf, insira o seguinte código:
    provider "aws" {
    +  region = var.region
    +  access_key = var.AWS_ACCESS_KEY_ID
    +  secret_key = var.AWS_SECRET_ACCESS_KEY
    +}
    +
    • E no arquivo já criado variables.tf, insira o seguinte código:
    variable "region" {
    +  type = string
    +  default = "us-east-1"
    +}
    +
    +variable "AWS_ACCESS_KEY_ID" {
    +  type = string
    +  sensitive = true
    +}
    +
    +variable "AWS_SECRET_ACCESS_KEY" {
    +  type = string
    +  sensitive = true
    +}
    +

    Info

    O arquivo variables.tf é responsável por definir as variáveis que serão utilizadas na infraestrutura do Terraform. O parâmetro sensitive = true é responsável por ocultar a variável quando for executado o comando terraform plan ou terraform apply.

    • Agora, execute o comando terraform init para que o terraform baixe os providers necessários para a criação da infraestrutura.
    terraform init
    +

    Definindo as variáveis para o código:

    Anteriormente foi falado da importância de manter o sigilo quanto às chaves de acesso à AWS, e, portanto, iremos precisar de um arquivo que as contenha, e ao mesmo tempo, não seja enviado para nenhum repositório aberto.

    O Terraform consegue ler um arquivo e dele extrair as variáveis que serão utilizadas na infraestrutura. Para isso, crie um arquivo chamado config.tfvars.json dentro de uma pasta config. É importante que estes estejam descritos no seu arquivo .gitignore ou similares.

    • Adicione o conteúdo a esse arquivo:
    {
    +  "region": "us-east-1",
    +  "AWS_ACCESS_KEY_ID": ["SEU_ID_CHAVE"],
    +  "AWS_SECRET_ACCESS_KEY": ["SUA_SECRET_KEY"]
    +}
    +

    O arquivo variables.tf será responsável por informar ao terraform quais as variáveis que serão necessárias e quais os seus tipos. O arquivo config.tfvars.json será responsável por informar ao terraform quais os valores que serão utilizados para as variáveis.

    Agora, podemos aplicar a nossa infraestrutura. Para isso, execute o comando terraform apply e informe o arquivo config.tfvars.json como variável de entrada.

    terraform apply -var-file=config/config.tfvars.json
    +

    Criando a Infraestrutura de Rede

    Agora que já temos a infraestrutura básica criada, podemos começar a criar a infraestrutura de rede. Para isso, iremos criar um arquivo chamado network.tf e nele iremos definir os recursos que serão utilizados para a criação da infraestrutura de rede.

    Para a criação de rede, vamos começar a exercitar a pesquisa na documentação do terraform. Crie um recurso para cada uma das seguintes funcionalidades e adicione os parâmetros também descritos:

    • VPC: cidr_block, instance_tenancy, enable_dns_support, enable_dns_hostnames e tags={Name}
    • Subnet: vpc_id, cidr_block, map_public_ip_on_launch e tags={Name}
    • Internet Gateway: vpc_id e tags={Name}
    • Route Table: vpc_id e tags={Name}
    • Route: route_table_id, destination_cidr_block e gateway_id
    • Route Table Association: subnet_id e route_table_id

    Para as configurações de rede, adicione ao arquivo variables.tf as seguintes variáveis:

    variable "network_configurations" {
    +  type = object({
    +    vpcCIDRblock = string
    +    instanceTenancy = string
    +    dnsSupport = bool
    +    dnsHostNames = bool
    +    publicsCIDRblock = string
    +    mapPublicIP = bool
    +    publicdestCIDRblock = string
    +  })
    +}
    +

    E como exemplo, adicione ao arquivo config.tfvars.json as seguintes configurações:

    "network_configurations": {
    +        "vpcCIDRblock": "172.16.0.0/16",
    +        "instanceTenancy": "default",
    +        "dnsSupport": true,
    +        "dnsHostNames": true,
    +        "publicsCIDRblock": "172.16.10.0/24",
    +        "mapPublicIP": true,
    +        "publicdestCIDRblock": "0.0.0.0/0"
    +}
    +

    O restante das variáveis, associe diretamente no arquivo network.tf, utilizando a seguinte estrutura:

    variavel = [recurso].[nome_do_recurso].[variável_desejada]
    +
    +# Exemplo:
    +vpc_id = aws_vpc.VPC.id
    +

    Criando Instâncias EC2

    A criação de instâncias vai nos trazer alguns conceitos extremamente interessantes para a escalabilidade da nossa aplicação no terraform, são estes: count, for_each, e locals. Vamos começar pelo básico.

    • Crie uma instância usando o recurso aws_instance no arquivo instances.tf.

    • Realize o Apply da infraestrutura e veja sua instância sendo criada.

    • Utilizando a módulo de output do terraform, crie um output para a instância criada. O output deve conter o id da instância e o DNS público e estará localizado no arquivo gerado automáticamente terraform.tfstate.

    Escalando com o count

    • Com o argumento count dentro da definição do recurso, crie 3 instâncias EC2.

    • Execute o terraform apply e veja as 3 instâncias sendo criadas.

    O count é um sistema de criação em massa de instâncias com as mesmas configurações, e deve ser usado para rapidamente construir um grupo de máquinas com as mesmas configurações para provavelmente a mesma aplicação. Para possuir maior controle sobre o múltiplo deploy de instâncias, é mais recomendado usar o for_each.

    Escalando com o for_each

    Em primeiro lugar, o for_each irá utilizar da configuração de variáveis no formato de list ou map para criar múltiplas instâncias com configurações diferentes. Para isso, vamos criar uma variável no arquivo variables.tf:

    variable "instances_configuration" {
    +  type = list(object({
    +    instance_name = string
    +    instance_type = string
    +    ami           = string
    +    key_name      = string
    +  }))
    +}
    +

    O tipo list indica ao terraform que a variável é uma lista e deve ser percorrida pelo for_each. Já o tipo object indica que a variável é um objeto, ou seja, um conjunto de variáveis definidas, que podem ser acessadas pela sua chave. No arquivo de variàveis .json, deve ser construido os valores da forma descrita acima.

    • O recurso da instância com a construção do for_each deve ser similar a:
    resource "aws_instance" "web" {
    +  for_each = {for instance in var.instances_configuration: instance.instance_name =>  instance}
    +  ami           = each.value.ami
    +  instance_type = each.value.instance_type
    +  subnet_id     = aws_subnet.Subnet.id
    +  key_name      = each.value.key_name
    +
    +  tags = {
    +    Name = "${each.value.instance_name}"
    +  }
    +}
    +

    OBS.: Note que para indicar o valor de cada instância é usado o complemento each.value

    • Crie 3 instâncias diferentes com este método.

    Escalando com o for_each e count

    É de certo que não é possível usar ambas as configurações for_each e count no mesmo recurso, mas podemos contornar essa situação. Para isso, adicione uma variàvel ao conjunto de variáveis de configuração das instâncias que indicará a quantidade delas a serem criadas.

    Em seguida vamos utilizar as variáveis locais, com o argumento locals. Construindo baseado na ideia de replicar a configuração definida para a quantidade de instâncias, basta criar um for que atenda a essa quantidade e adicione várias vezes a mesma configuração mudando apenas o nome, com o acréscimo de um número que indique indíce, por exemplo. Além disso, para aplicar tais configurações locais, as informações devem ser passadas pela função de flatten.

    No final, a sua instância deve possuir o seguinte formato:

    locals {
    +  serverconfig = [
    +    for srv in var.instances_configuration : [
    +      for i in range(1, srv.no_of_instances+1) : {
    +        instance_name = "${srv.instance_name}-${i}"
    +        instance_type = srv.instance_type
    +        ami = srv.ami
    +        security_groups_ids = srv.security_groups_ids
    +        key_name = srv.key_name
    +      }
    +    ]
    +  ]
    +}
    +
    +locals {
    +  instances = flatten(local.serverconfig)
    +}
    +
    +resource "aws_instance" "web" {
    +  for_each = {for server in local.instances: server.instance_name =>  server}
    +  ami           = each.value.ami
    +  instance_type = each.value.instance_type
    +  subnet_id = aws_subnet.Subnet.id
    +  vpc_security_group_ids = each.value.security_groups_ids
    +  key_name = each.value.key_name
    +
    +  tags = {
    +    Name = "${each.value.instance_name}"
    +  }
    +}
    +
    +output "instances" {
    +  value       = [for instance in aws_instance.web : instance]
    +  description = "All Machine details"
    +}
    +

    Criando Security Groups

    Para a criação dos security groups, vamos utilizar o método do for_each pensando na escalabilidade da solução. Além disso, na AWS é possível adicionar várias regras tanto de Ingress (Inbound) quanto de Egress (Outbound) ao mesmo tempo, portanto, nossa aplicação também deve conseguir fazê-lo.

    • Crie o arquivo security_groups.tf e construa as suas configurações.
    Dica

    Para criar múltiplas regras de Ingress e Egress, utilize variáveis do tipo dynamic.

    • Teste criando 2 grupos de segurança, um com uma regra de Ingress e duas regras de Egress e outro com duas regras de Ingress e uma regra de Egress.

    Aplicando o security group nas instâncias

    Utilizando a função de output, é possível coletar o ID do Security Group definido automáticamente pela AWS.

    Para atrelá-lo a uma instância use a variável do recurso aws_instance chamada vpc_security_group_ids e passe uma lista de IDs de Security Groups como valor.

    • Crie um Security Group que libere a conexão SSH e associe-o a uma instância

    • Junto com o par de chaves criado e associado a key_name, teste o acesso à instância.

    Criando Infraestrutura para o IAM

    Para a criação da estrutura no IAM, serão necessários 2 recursos principais: o usuário em si e as policies(políticas ou restrições) de acesso. Além disso, são necessários recursos que criem o usuário e atrelem a ele uma senha automática (que pode ser exportada como output), um recurso que crie o documento da política, para facilitar a implementação, e recursos que criem a conexão entre o usuário e a política.

    • Crie o arquivo policies.tf e construa as suas configurações.
    Dica

    Para atrelar um documento a uma política, use a seguinte variável e sua configuração: terraform policy = data.aws_iam_policy_document.ec2_policy[each.value.name].json

    • Crie o arquivo users.tf e construa as suas configurações.

    • Associe uma política criada a um usuário através do recurso aws_iam_user_policy_attachment.

    Dica

    Crie uma variàvel para cada uma das configurações acima, ou seja, uma variável para a configuração de políticas, outra para a configuração de usuários e outra para a configuração de atrelamento de políticas a usuários.

    • Teste a criação de um usuário com a restrição de acesso à região da North Virginia. A política criada para isso está abaixo:
    {
    +  "Version": "2012-10-17",
    +  "Statement": [
    +    {
    +      "Effect": "Allow",
    +      "Action": "*",
    +      "Resource": "*",
    +      "Condition": {
    +        "StringEquals": {
    +          "aws:RequestedRegion": "us-east-1"
    +        }
    +      }
    +    }
    +  ]
    +}
    +

    Criando múltiplas Regiões

    Como os usuários são globais, não vamos nos preocupar com suas configurações para cada instância, eles podem receber sua pasta separada para gerenciamento de infraestrutura. Pensando, então, nos outros arquivos, ou seja,main.tf, provider.tf, network.tf, instances.tf, security_groups.tf, para criar uma nova região, basta replicar todo o diretório, mudando apenas no arquivo de configurações .json a região do provider.

    • Crie duas pastas com essa infraestrutura, uma para a região da North Virginia e outra para a região de Ohio.

    • Teste a criação de uma instância em cada região.

    OBS.: Aplique o comando de init e apply em cada uma das pastas criadas.

    Criando um HA de servidores web

    Configurando uma Imagem Base

    Para a criação de um HA de servidores web, é necessário primeiro criar uma imagem(ami) que funcionará como template para a criação de instâncias caso as máquinas base estejam ficando sobre-lotadas.

    • Crie uma instância com o sistema operacional Ubuntu Server 18.04 LTS.

    • Aplique:

    sudo apt update; sudo apt install nodejs build-essential -y
    +
    • Edite um arquivo server.js:
    #!/usr/bin/env nodejs
    +var http = require("http");
    +var os = require("os");
    +var crypto = require("crypto");
    +
    +http
    +  .createServer(function (req, res) {
    +    res.writeHead(200, { "Content-Type": "text/plain" });
    +    var nonce = 1;
    +    var seed = Math.random();
    +    var h = crypto.createHash("sha256");
    +
    +    h.update(new Buffer(nonce + " Hello World " + seed));
    +    while (h.digest("hex").substr(0, 3) != "000") {
    +      h = crypto.createHash("sha256");
    +      nonce++;
    +      h.update(new Buffer(nonce + " Hello World " + seed));
    +    }
    +
    +    res.end('{ "host": ' + os.hostname() + ', "nonce": ' + nonce + "}");
    +  })
    +  .listen(8080, "");
    +console.log("Server running at http://localhost:8080/");
    +
    • Torne o arquivo executável:
    chmod +x ./server.js
    +
    • Execute e teste o servidor(lembre-se de liberar a porta no security group):

    • Configure a máquina para iniciar o servidor automaticamente após reboot:

    crontab -e\ @reboot /home/ubuntu/server.js
    +
    • reboot e teste o acesso ao servidor novamente.
    Copywright

    O procedimento foi retirado do site oficial da matéria.

    Com o template de instância criado, gere uma imagem dele pela dashboard da AWS e salve a ami gerada para uso no próximos passos.

    Criando os recursos para o HA

    Para construir o HA, vamos utilizar o recurso aws_autoscaling_group, emparelhado com aws_launch_configuration e também aws_lb (Load Balence). Para isso, construa a infraestrutura baseada neste tutorial: Tutorial de HA. Ele foi produzido pela Hashicorp, empresa que desenvolve o Terraform, mas em caso de dúvida, o resultado esperado se encontra dentro da pasta sample-HA no repositório do meu programa.

    ??? Dicas - Crie Security Groups diferentes para o Load Balencer e para configuração das instâncias.

    - São necessárias 3 *Subnets* para a criação do *Load Balencer*.
    +

    Crie seu Próprio Programa.

    Com toda a experiência adquirida na formatação, construção e manipulação da infraestrutura por meio do terraform, agora você é capaz de criar o seu prórpio programa.

    Eu criei, utilizando Python, uma ferramenta que roda no terminal e executa as operações descritas acima, de forma automatizada. Para isso, a aplicação copia os arquivos de base, armazenados na pasta sample para uma nova pasta com o nome da região, configura o arquivo .tvars.json com as informações descritas pelo usuário e executa o terraform para a criação da infraestrutura.

    O seu programa pode ser criado via Python ou qualquer outra linguagem que você se sinta confortável para manipulação de arquivos e execução de comandos. É possível, também, que essas configurações sejam feitas via backend e toda a interface de usuário seja feita via frontend em outra linguagem, uma vez que toda a configuração da infraestrutura pode ser enviada via .json para o backend.

    Aqui o céu é o limite! Use a sua criatividade!

    Motivação

    Minha motivação para a criação desta aplicação e, consequentemente, este tutorial veio da crescente vontade de aprender sobre infraestrutura e Computação Nuvem, o que me motivou a tentar produzir algo robusto e confiável, que pudesse ser utilizado por pessoas com algum conhecimento em infraestrutura, assim como eu, mas com a vontade de aprender.

    \ No newline at end of file diff --git a/projetos_2022/public/foto1.png b/projetos_2022/public/foto1.png new file mode 100644 index 00000000..c32652a4 Binary files /dev/null and b/projetos_2022/public/foto1.png differ diff --git a/projetos_2022/public/tutorial1.png b/projetos_2022/public/tutorial1.png new file mode 100644 index 00000000..6906475d Binary files /dev/null and b/projetos_2022/public/tutorial1.png differ diff --git a/projetos_2022/public/tutorial2.png b/projetos_2022/public/tutorial2.png new file mode 100644 index 00000000..f0fc6034 Binary files /dev/null and b/projetos_2022/public/tutorial2.png differ diff --git a/projetos_2022/public/tutorial3.png b/projetos_2022/public/tutorial3.png new file mode 100644 index 00000000..94edbc12 Binary files /dev/null and b/projetos_2022/public/tutorial3.png differ diff --git a/projetos_2022/public/tutorial4.png b/projetos_2022/public/tutorial4.png new file mode 100644 index 00000000..7561f8fc Binary files /dev/null and b/projetos_2022/public/tutorial4.png differ diff --git a/projetos_2022/public/tutorial5.png b/projetos_2022/public/tutorial5.png new file mode 100644 index 00000000..63611045 Binary files /dev/null and b/projetos_2022/public/tutorial5.png differ diff --git a/projetos_2022/public/tutorial6.png b/projetos_2022/public/tutorial6.png new file mode 100644 index 00000000..1aec41d4 Binary files /dev/null and b/projetos_2022/public/tutorial6.png differ diff --git a/reference/variables/index.html b/reference/variables/index.html new file mode 100644 index 00000000..a8b1e80a --- /dev/null +++ b/reference/variables/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/roteiros/0.Cabeamento/index.html b/roteiros/0.Cabeamento/index.html new file mode 100644 index 00000000..bbf0bce8 --- /dev/null +++ b/roteiros/0.Cabeamento/index.html @@ -0,0 +1 @@ + Computação em Nuvem - Computação em Nuvem - 2024/1

    Laboratório de Cabeamento - 1 Aula

    Objetivos:

    Conhecer os padrões mais utilizados para o cabeamento de rede e a confecção de um cabo de rede. Ainda neste laboratório deverão ser configurados todos os equipamentos que compõem o kit de trabalho de cloud computing.

    Pré-requisitos:

    • Ethernet . [Tanenbaum - seções 2.2.2 Par trançado, 4.3.1 Cabeamento Ethernet, 4.3.8 Ethernet de gigabit].

    Cloud Computing

    O kit contém os seguintes itens:

    • Roteador TP-LINK TL-R470T+
    • Switch DLink DSG-1210-28 de 28 portas
    • 6 hosts

    OBS: A senha do roteador está no inventário do seu kit e a do switch está no manual oficial.

    Imagem-Topologia

    Passo 1 – Cabo de rede (Patch cord)

    Primeiro exercício

    É a confecção do cabo de rede para a conexão de seu computador pessoal ao ambiente do seu kit. O padrão que será utilizado é o ANSI/TIA/EIA 568 que foi desenvolvido em 1991 pela EIA (Electronics Industries Alliance) e pela TIA (Telecommunications Industry Association), para normatizar as ligações elétricas/eletrônicas de cabos de rede e sua conectorização. Em 1995 uma revisão é publicada a ANSI/TIA/EIA 568A.

    Iremos utilizar o cat6

    Topologia

    Um resumo das diferenças entre as categorias de cabos Ethernet:

    • Categoria 4 (Cat 4):

    Suporta velocidades de até 16 Mbps. Pouco comum e geralmente substituído por cabos de categoria superior devido à sua limitada largura de banda.

    • Categoria 5 (Cat 5):

    Introduziu melhorias significativas na capacidade de transmissão de dados. Suporta velocidades de até 100 Mbps (Ethernet 100BASE-TX). Utilizado amplamente para redes Ethernet 100BASE-TX e também para redes de telefonia e vídeo.

    • Categoria 5e (Cat 5e):

    "E" significa "Enhanced" (Aprimorado). Melhorias adicionais na capacidade de transmissão e redução da interferência. Suporta velocidades de até 1 Gbps (Gigabit Ethernet) até 100 metros.

    • Categoria 6 (Cat 6):

    Oferece melhor desempenho e largura de banda em comparação com Cat 5e. Suporta velocidades de até 10 Gbps em curtas distâncias (até 55 metros) e até 1 Gbps em distâncias de até 100 metros. Categoria 6a (Cat 6a):

    "A" significa "Augmented" (Aumentado). Melhorias adicionais na capacidade de transmissão e redução da interferência em comparação com Cat 6. Suporta velocidades de até 10 Gbps em distâncias de até 100 metros.

    • Categoria 7 (Cat 7):

    Introduzido para suportar o padrão 10GBASE-T. Oferece maior largura de banda e imunidade a interferências. Suporta velocidades de até 10 Gbps em distâncias de até 100 metros.

    • Categoria 8 (Cat 8):

    Projetado para atender às demandas de redes de alta velocidade, como data centers e backbone de rede. Suporta velocidades de até 40 Gbps e 100 Gbps em curtas distâncias (até 30 metros).

    Topologia

    O protocolo Ethernet é um dos protocolos mais comuns e amplamente utilizados em redes de computadores. Ele define as regras para a comunicação de dados entre dispositivos em uma rede local (LAN - Local Area Network).

    Aqui estão alguns pontos-chave sobre o protocolo Ethernet:

    Meio de Transmissão: O Ethernet pode ser usado em diferentes tipos de mídia de transmissão, incluindo cabos de cobre (como o Ethernet de par trançado) e fibra óptica. Isso proporciona flexibilidade na implementação de redes Ethernet em diversos ambientes.

    Quadro Ethernet: Os dados são transmitidos em unidades chamadas de "quadros Ethernet". Cada quadro possui um cabeçalho e um trailer, além dos dados propriamente ditos. O cabeçalho contém informações importantes, como endereços MAC de origem e destino, tipo de protocolo e verificação de erros.

    Endereços MAC: Cada dispositivo em uma rede Ethernet possui um endereço MAC (Media Access Control) único, que é gravado na placa de rede do dispositivo. Esses endereços são utilizados para identificar os dispositivos na rede e determinar para qual dispositivo os quadros Ethernet são destinados.

    Acesso ao Meio: O protocolo Ethernet utiliza um método de acesso ao meio chamado CSMA/CD (Carrier Sense Multiple Access with Collision Detection). Isso significa que os dispositivos verificam o meio de transmissão para detectar a presença de sinais de outros dispositivos antes de iniciar a transmissão. Se ocorrer uma colisão (ou seja, dois dispositivos tentam transmitir simultaneamente), o CSMA/CD é usado para lidar com a situação e tentar retransmitir os dados de forma eficiente.

    Padrões Ethernet: O Ethernet evoluiu ao longo do tempo, com diferentes padrões que especificam velocidades de transmissão de dados, tipos de cabos, e outras características. Alguns dos padrões mais comuns incluem Ethernet de 10 Mbps (10BASE-T), Fast Ethernet de 100 Mbps (100BASE-TX), Gigabit Ethernet de 1 Gbps (1000BASE-T), e 10 Gigabit Ethernet de 10 Gbps (10GBASE-T).

    Topologia

    Lapidando o projeto

    Antes de iniciar você deve "resetar" o switch e o roteador do seu KIT !!!!!!!

    Agora com o cabo que você acabou de fazer, realize as seguinte modificações (se preciso, leia os manuais): Lembre-se da aula teorica, com um certo nivel de abstracão, dispositivos so se comunicão se estiverem na mesma rede.

    • Altere o IP do Roteador para 172.16.0.1/20.
    • Altere o IP do Switch para 172.16.0.2/20.

    Passo 2 - anotando informacoes necessárias!!!

    Na parte de baixo de cada uma de suas NUCs voce terá a informacao do Mac Address, anote cada um deles (você ira precisar mais para frente)

    Conforme a imagem abaixo as maquinas serão chamadas a partir de agora (da esquerda para a direita).

    • Main Server
    • Server1
    • Server2
    • Server3
    • Server4
    • Server5

    Passo 3 – conexão dos hosts e roteador

    • De Acordo com a imagem da topologia (primeira imagem), conecte os cabos de rede presentes em seu kit no switch, hosts e roteador;
    • Utilize o cabo que você montou para interligar o seu notebook com o kit (conecte ele no switch);
    \ No newline at end of file diff --git a/roteiros/1.Bare_metal/index.html b/roteiros/1.Bare_metal/index.html new file mode 100644 index 00000000..3c4ee3e3 --- /dev/null +++ b/roteiros/1.Bare_metal/index.html @@ -0,0 +1,68 @@ + Computação em Nuvem - Computação em Nuvem - 2024/1

    Bare Metal

    Objetivos:

    • Entender os conceitos básicos sobre uma plataforma de gerenciamento de hardware.
    • Introduzir conceitos básicos sobre redes de computadores.

    Pré-requisitos:

    Info

    DIVISÃO DO ROTEIRO

    O Roteiro é dividido em 2 partes principais.

    • Criando a Infraestrutura (Nuvem Bare-metal)
    • Usando a infraestrutura: Django em Nuvem Bare-Metal

    Material

    O grupo irá contar com os seguintes itens no kit:

    • 1 NUC (main) com 10Gb e 1 SSD (120Gb)
    • 1 NUC (server1) com 12Gb e 1 SSD (120Gb)
    • 1 NUC (server2) com 16Gb e 2 SSD (120Gb+120Gb)
    • 3 NUCs (server3, server4 e server5) com 32Gb e 2 SSD (120Gb+120Gb)
    • 1 Switch DLink DSG-1210-28 de 24 portas
    • 1 Roteador TP-Link TL-R470T+

    Rede

    Atencao as modificacoes necessárias apresentadas nos requisitos de projeto citados abaixo, modifique o que for necessário.

    Cada grupo tem a disposição um ponto de rede (cabo preto) com saída para a rede interna da faculdade.

    Requisitos de projeto:

    • Sua rede deverá estar segregada fisicamente da rede do Insper.
    • Todos os equipamentos estarão conectados e possuem acesso à Internet.
    • As NUCs server2, server3, server4 e server5 estarão conectados à rede com 2 (duas) interfaces de rede, uma interna e uma externa USB (NIC).
    • A NUC main e a server1 estarão conectadas à rede com uma interface de rede interna, a padrão do hardware.

    Tarefa: Confirme se as conexões de rede feitas anteriormente estão corretas. Utilize o diagrama fornecido no roteiro de cabeamento e as informacoes acima.

    Cada kit possui um IP de entrada, fornecido no inventário do kit.

    Senhas - IMPORTANTE

    Todas as senhas do seu sistema devem seguir o seguinte critério:

    • utilizar a palavra 'cloud' + a letra do kit minúscula.
    • Por exemplo: 'cloudz' é a senha padrão do kit Z.
    • Usar a mesma senha para todos os serviços que exigem cadastramento
    • NÃO alterar nenhuma senha que já esteja pré-cadastrada.

    Criando a Infraestrutura (Nuvem Bare-metal)

    • Consulte o diagrama abaixo "H1 - Diagrama"

    Instalando o Ubuntu

    Procure tutoriais de como instalar o Sistema Operacional Ubuntu server, utilize um pen drive para baixart a imagem e criar um pendrive para boot da instalacao.

    • Instale o Ubuntu Server 22.04 LTS na NUC main:
      • hostname: main
      • login: cloud
      • senha: (cloud + letra do kit)
      • IP fixo: 172.16.0.3

    Instalando o MaaS

    • Verifique se consegue pingar '8.8.8.8'. Se não conseguir, descubra como rotear os pacotes corretamente.
    • Verifique se consegue pingar 'www.google.com'. Se não conseguir, descubra como resolver as urls corretamente.
    • $ sudo apt update && sudo apt upgrade -y
    • Vá tomar um café. ☕
    • $ sudo snap install maas
    • Tenho certeza que você não leu os pré-requisitos, ao invés do café ☕ dá uma lida na documentacao pedida no comeco do roteiro 📖
    • $ sudo snap install maas-test-db

    Acessando sua maquina remotamente.

    ❗ ❗ ❗ faca o acesso utilizando SSH

    Dentro da rede Local

    ssh cloud@172.16.0.3

    Configurando o MaaS

    • Inicializando o MaaS:
      • $ sudo maas init region+rack
      • $ sudo maas createadmin
      • use o login cloud
      • use a senha padrão da disciplina
      • deixe a chave vazia
    • Gerando um par de chaves para autenticação.
      • $ ssh-keygen -t rsa
      • use senha vazia dessa vez
      • $ cat ./.ssh/id_rsa.pub
      • copie a chave gerada
    • Agora vamos acessar o Dashboard do MaaS:
      • ele estará disponível em http://172.16.0.3:5240/MAAS.
      • Entenda onde o serviço esta rodando e faça o login
      • configure um DNS Forwarder com o DNS do Insper (DNS Externo que o seu roteador enxerga).
      • Importe as imagens do Ubuntu 22.04LTS, Ubuntu 20.04 LTS e Ubuntu 18.04 LTS.
      • Faça o upload da chave copiada no terminal SSH.
      • Em Settings | General:
      • Global Kernel Parameters: net.ifnames=0 (sem espaços)

    Chaveando o DHCP

    • Explore as configurações do MaaS. Habilite o DHCP na subrede pelo MaaS Controller.
      • ALTERE o Reserved Range para iniciar em 172.16.11.1 e acabar em 172.16.14.255.
    • Deixe o DNS da subnet apontando para o DNS do Insper!
    • Desabilitar o DHCP no roteador.

    Comissionando servidores

    Cadastre os hosts (machines) disponíveis. Server1 ate Server5

    • Altere a opção Power Type para Intel AMT e preencha segundo as informacoes abaixo:
      1. MacAddress que voce anotou (Se nao anotou, desmonta os cabos e faz tudo de novo!!!)
      2. A senha é = CloudComp6s!
      3. IP do AMT = 172.16.15.X (sendo X o id do server, por exemplo server1 = 172.16.15.1)
    • As NUCs irão comissionar automaticamente, realizando o boot via PXE na rede.
    • 🍵 hora do Chá, só aliviar o estômago um pouco. Chá também tem cafeína.
    • Todos os nós devem aparecer com o status Ready. Verificar se as características de hardware (cpu, memória, SSD e rede) foram detectados com sucesso.
    • Adicionar o Roteador como devices no Dashboard do MaaS

    Atenção: verificar se as interfaces de rede se chamam eth0 (placa rede padrão com PXE) e eth1 (NIC usb). Verificar o Global Kernel Parameters, apagar o nó e reiniciar o processo caso algo esteja errado.

    Fazendo Acesso Remoto ao seu KIT

    De acordo com as aulas teóricas, vamos realizar um NAT para permitir o acesso externo "Rede Wi-fi Insper" do seu computador ao servidor MAIN.

    A meta é conseguir conectar no servidor principal "main" utilizando a porta 22.

    Libere tambem o acesso ao gerenciamento remoto do seu roteador criando uma regra de gestão para a rede 0.0.0.0/0

    Se não lembrar das aulas teóricas, pesquise por como fazer NAT no Roteador do seu KIT.

    LINK-documentacao

    Usando a infraestrutura:

    Django em Nuvem Bare-Metal

    Primeiro Deploy

    Vamos realizar um deploy manual de uma aplicação simples em Django em nossa nuvem MaaS.

    Antes de começar, realize um pequeno ajuste no DNS server:

    • Dentro da aba Subnets, clicar na subnet 172.16.0.0/20 e editar a Subnet summary colocando o DNS do Insper - 172.20.129.131

    Primeira parte: Banco de Dados

    Postgres é um servidor de banco de dados versátil e de fácil manejo. Muito usado em projetos Opensource.

    • Acesse o Dashboard do MaaS e realize o deploy do Ubuntu 22.04 no server1.
    • Acesse o terminal do server1 via SSH:
    • $ sudo apt update
    • $ sudo apt install postgresql postgresql-contrib -y
    • Ainda no terminal do server1, crie agora um usuário para a aplicação:
    • $ sudo su - postgres
    • $ createuser -s cloud -W
    • Usar a senha: cloud
    • Crie um database para a aplicação:
    • $ createdb -O cloud tasks
    • Exponha o serviço para acesso:
    • $ nano /etc/postgresql/12/main/postgresql.conf
    • Remova o comentário e substitua a string da linha para aceitar conexões remotas:
        listen_addresses = '*'
      +
    • $ nano /etc/postgresql/12/main/pg_hba.conf
    • Adicione a linha que libera qualquer máquina dentro da subnet do kit:
        host    all             all             172.16.0.0/20          trust
      +
    • Saia do usuário postgres
    • Libere o firewall:
    • $ sudo ufw allow 5432/tcp
    • Reinicie o serviço:
    • $ sudo systemctl restart postgresql

    🤖 Será que é possível automatizar esse processo ❓

    Parte II: Aplicação Django

    De volta ao maas, vamos subir uma aplicação ORM Django pré produzida. No lugar de [login], utilize o usuário criado para administrar o MaaS.

    • Peça uma máquina direto do cli no terminal agora:
    • $ maas login [login] http://172.16.0.3:5240/MAAS/
    • Buscar o token no dashboard dentro das configurações do usuário.
    • Solicite a reserva da máquina para o MaaS:
    • $ maas [login] machines allocate name=server2
    • Anote o campo system_id do json resultante.
    • Realize o deploy via linha de comando, usando o cli:
    • $ maas [login] machine deploy [system_id]
    • Café ☕ ... Aguarde a máquina finalizar e entre via ssh nela.
    • No SSH do server2:
    • $ git clone https://github.com/raulikeda/tasks.git
    • Entre no diretorio tasks.
    • $ ./install.sh
    • reboot e aguarde
    • Teste acessando o serviço na porta 8080 no terminal do maas:
    • $ wget http://[IP server2]:8080/admin/

    Para acessar o serviço no seu browser seria necessário fazer um NAT no roteador. Porém podemos considerar esse serviço como sendo temporário e podemos usar uma outra forma de expor o serviço para fora do kit usando SSH tunnel:

    • Desconecte do SSH do maas
    • Reconecte novamente usando:
    • $ ssh cloud@10.103.0.X -L 8001:[IP server2]:8080
    • O comando acima irá criar um tunel do serviço do server2 na porta 8080 para o seu localhost na porta 8001 usando a conexão SSH.
    • Note que é importante que a porta 8001 não esteja sendo usada no seu computado.
    • Acesse então o endereço no browser: http://localhost:8001/admin/
    • Login Django: cloud
    • Senha Django: cloud

    Tome um tempo olhando o conteúdo do arquivo install.sh. Ele automatiza as tarefas de instalação usando shell script.

    Note que a utilização do maas-cli no terminal substitui a utilização do dashboard. Tome um tempo explorando:

    • $ maas [login] help commands

    Caso tenha interesse na aplicação django: https://docs.djangoproject.com/pt-br/3.1/intro/tutorial01/

    Exercise

    CheckPoint-1

    De um print das Telas abaixo:

    1. Do Dashboard do **MAAS** com as máquinas.
    +1. Da aba images, com as imagens sincronizadas.
    +1. Da Aba de cada maquina(5x) mostrando os testes de hardware e commissioning com Status "OK"
    +

    Finalizando

    Entre no Site e responda as questoes da plataforma PrairieLearn, você deve fazer no minimo de 70 pontos, para poder seguir para o Roteiro 2.

    LINK da plataforma de questões

    Acessar com seu usuário de login do INSPER. e-mail institucional

    As imagens abaixo são da plataforma.

    • Clicar em Enroll Course
    • Procurar o Curso -> NCCC 101: Network concepts for cloud construction
    • Se cadastrar.
    • Responder as questões

    Conclusão: SOMENTE PARA PENSAR ❗ ❗ ❗

     Descreva como o MaaS poderia ser utilizado em um datacenter real (com muitos servidores) e como seria um processo alternativo sem essa ferramenta. Ainda, é possível e *SIMPLES* realizar a implantação de uma aplicação usando o MaaS?
    +
    \ No newline at end of file diff --git a/roteiros/2.Deployment/index.html b/roteiros/2.Deployment/index.html new file mode 100644 index 00000000..1b489991 --- /dev/null +++ b/roteiros/2.Deployment/index.html @@ -0,0 +1,40 @@ + Computação em Nuvem - Computação em Nuvem - 2024/1

    Deployment Orchestration

    Objetivos:

    1. Entender os conceitos básicos sobre uma plataforma de gerenciamento de aplicações distribuídas.
    2. Entender os conceitos básicos de comunicação entre aplicações e serviços.

    Pré-requisitos:

    1. Terminar o capítulo anterior (Bare metal)
    2. Realizar a leitura sobre o Juju. [https://jaas.ai/how-it-works].
    3. Realizar a leitura sobre redes de computadores. [Kavis - Cap. 6. Tanenbaum & Steen - Cap. 1 e Cap. 12]
    Info

    DIVISÃO DO ROTEIRO O Roteiro é dividido em 3 partes principais.

    • Entender a automacão do Deploy - Utilizando ferramenta Ansible no Bare-metal
    • Criando Infraestrutura para deploy com Juju (Deployment Orchestration)
    • Utilizando a infraestrutura Bare Metal com o Juju - exemplo de deploy Wordpress

    Utilizando o Ansible - deploy automatizado de aplicação

    Exercise

    Check-point1:

    1. De um print da tela do Dashboard do MAAS com as 2 Maquinas e seus respectivos IPs.
    2. De um print da aplicacao Django, provando que voce está conectado ao server 2.
    3. Explique como foi feita a implementacao manual da aplicacao Django e banco de dados.

    Agora teremos 2 aplicações django (server2 e server3) compartilhando o mesmo banco de dados (server1). Os motivos para fazermos isso são dois:

    • Alta disponibilidade: se um node cair o outro está no ar, para que nosso cliente acesse.
    • Load Balancing: podemos dividir a carga de acesso entre os nós.

    Vamos realizar a instalação da mesma aplicação de forma automática, por exemplo podemos efetuar a instalação em diversos servers. Vamos então utilizar novos conceitos e ferramentas: Exemplo - gerenciador de deploy Ansible (https://www.ansible.com/)

    Características:

    • Idempotente no sentido de conseguir repetir todos os procedimentos sem afetar os estados intermediários da instação.
    • Fácil de se lidar com um pool de máquinas simultaneamente.
    • Consegue realizar o provisionamento automático de VMs e Containers (mas não metal).

    Tarefas:

    Exercise

    Check-point2:

    1. Teste o acesso, caso esteja tudo certo, faça a tarefa abaixo
    2. De um print da tela do Dashboard do MAAS com as 3 Maquinas e seus respectivos IPs.
    3. De um print da aplicacao Django, provando que voce está conectado ao server 2.
    4. De um print da aplicacao Django, provando que voce está conectado ao server 3.
    5. Explique qual diferenca entre instalar manualmente a aplicacao Django e utilizando o Ansible.

    📪 Contudo seria ideal que tivéssemos apenas um ponto de entrada, ao invés de escolher manualmente ou chavear os IPs dos nós.

    Balancamento de carga usando Proxy Reverso

    Para montar o ponto único de entrada, utilizaremos uma aplicação de proxy reverso como load balancer.

    Vocês conseguem instalar o NGINX no nó server4 como loadbalancer? ... Então monte este proxy.

    Dicas

    No arquivo de tasks/views.py de cada Django modifique a mensagem "Hello World ..." para conseguir identificar cada server (coloque uma mensagem diferente em cada)

    Código:

    from django.shortcuts import render
    +
    +from django.http import HttpResponse
    +
    +def index(request):
    +
    +  return HttpResponse("Hello, world. You're at the tasks index.")
    +

    No arquivo de urls.py customize o seu path no urlpatterns:

    urlpatterns = [path( ' ', views.index, name='index'),]

    Exercise

    Check-point3:

    1. Teste o acesso, caso esteja tudo certo, faça a tarefa abaixo
    2. De um print da tela do Dashboard do MAAS com as 4 Maquinas e seus respectivos IPs.
    3. Altere o conteúdo da mensagem contida na função index do arquivo tasks/views.py de cada server para distinguir ambos os servers.
    4. Faça um GET request para o path que voce criou em urls.py para o Nginx e tire 2 prints das respostas de cada request, provando que voce está conectado ao server 4, que é o Proxy Reverso e que ele bate cada vez em um server diferente Server2 e Server3.

    Agora que você utilizou um gerenciador de deploy, vamos retormar a criação de nuvem utilizando este novo conceito. Remova o deploy (release) de todos nós no kit.

    Criando Infraestrutura para deploy com Juju

    Ansible é um gerenciador de deploy que consegue lidar com a instalação e configuração de um conjunto de nós pré reservados, mas não consegue realizar o provisionamento direto com o MaaS (gerenciador de Bare-metal). Para montar a nossa Cloud Privada, vamos utilizar outro orquestrador de deploy que integra com o MaaS.

    • Antes de continuar, verifique se todas máquinas (server1, server2, server3, server4 e server5) estão Ready no MAAS. Faça o release das máquinas Django e Postgres caso necessário.
    • Acesse o main via SSH e instale o Juju
    • $ sudo snap install juju --classic --channel=2.9/stable
    • Verifique se o Juju enxerga o MaaS como um provedor de recursos
    • $ juju clouds
    • Caso não possua o MaaS como opção, deve adicioná-lo
    • Criar um arquivo de configuração: maas-juju.yaml (atenção com a formatação)
        clouds:
      +    maas:
      +      type: maas
      +      auth-types: [oauth1]
      +      endpoint: http://192.168.0.3:5240/MAAS/
      +
    • $ juju add-cloud maas maas-juju.yaml
    • $ juju add-credential maas
    • Obs: OAuth é o API KEY gerado no MaaS (dentro do menu do usuário)
    • Vamos criar agora o juju controller:
    • $ juju bootstrap --bootstrap-series=jammy maas main --to server1
    • Para verificar o status do controller utilize:
    • $ juju status
    • Para acessar o Dashboard (via browser):
    • $ juju gui
    • Crie novamente um tunel SSH:
    • $ ssh cloud@[IP Roteador] -L 8080:[IP do Juju GUI]:17070
    • Acesse do seu browser a url indicada no terminal, adaptando o endereço IP.

    Ao contrário do Ansible, Juju necessita de uma máquina exclusiva para controlar todo o deploy. Essa máquina é alocada automaticamente durante o bootstrap e controlará todo o deploy que faremos no próximo roteiro. Ainda, assim como você usou o maas-cli na primeira implantação, você usou o juju-cli para interagir com o serviço.

    Utilizando a infraestrutura Bare Metal com o Juju

    Vamos utilizar o Juju para deploy de uma das arquiteturas abaixo.

    As aplicações que vamos utilizar são:

    Faca o deploy da Aplicacao Grafana e Prometheus!!!

    Deploy Grafana e Prometheus

    O Grafana é uma plataforma de código aberto que simplifica a apresentação visual de dados, como gráficos e painéis, facilitando a compreensão em tempo real de sistemas e informações.

    Para funcionar, o Grafana requer um banco de dados para armazenar configurações, metadados e informações relacionadas à exibição de dados em seus painéis e gráficos. Ele é compatível com vários bancos de dados, como Prometheus, MySQL, PostgreSQL, InfluxDB, SQLite3 e outros. Neste contexto, estamos utilizando o Prometheus como banco de dados, mas você tem a flexibilidade de escolher outro se preferir.

    • Instale a aplicação charm para utilizarmos, vamos baixar o charm do Grafana do repositório charm-hub.
    Charm

    O charm é como um pacote que contém instruções sobre como instalar e configurar um aplicativo, como o Grafana. Você simplesmente escolhe o charm do Grafana, define algumas configurações e o Juju cuida do restante, tornando o processo de implantação mais fácil e consistente em ambientes de nuvem. Entenda melhor sobre o que é o charm lendo a sua documentação charm-hub.

    $ sudo snap install charm --channel=2.x/stable --classic

    Agora é só fazer o Deploy com o auxilio do JUJU ❗

    • Faça o deploy do charm prometheus2, para fazer deploy do charm local, use juju deploy ./pasta

    Deploy do charm grafana

    • Ao realizar o Deploy do grafana, acompanhe o processo utilizando o comando juju status

    Caso ocorra um erro durante a instalação (hook failed: install): - Devemos acessar o log da aplicação via o comando juju debug-log --replay --include grafana/2 * Nos logs voce encontrará mais informações da causa do erro NO_PUBKEY * Ele ocorre, pois a chave GPG do repositório do grafana não está no seu servidor, quando o juju tenta fazer apt-get update o sistema não consegue verificar a autenticidade do repositório. * Para consertar devemos acessar o servidor do grafana e instalar a chave manualmente: * juju ssh grafana/2 * wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - * sudo apt-get update

    Ao rodar os comandos acima, a chave será instalada no sistema. Aguarde alguns instantes e o processo de instalação do grafana seguirá normalmente. Acompanhe o andamento usando o comando juju status.

    Integrando Grafana com Prometheus

    • Utilize a documentação encontrada no README do charm do grafana.

    • Acesse o dashboard do Grafana do seu computador e verifique o funcionamento do sistema.

    • Verifique se a integração foi feita corretamente. Para isso crie um dashboard dentro do grafana e adicione uma visualização (deve aparecer o prometheus como source).

    Exercise

    Apenas se escolheu fazer o deploy do grafana Checkpoint-4

    1. De um print da tela do Dashboard do MAAS com as Maquinas e seus respectivos IPs.
    2. De um print de tela do comando "juju status" depois que o Grafana estiver "active".
    3. De um print da tela do Dashboard do Grafana com o Prometheus aparecendo como source.

    OPCIONAL - Deploy Wordpress e MySQL

    O Wordpress é uma plataforma de gerenciamento de conteúdo (CMS) de código aberto, baseada em PHP e MySQL. Ele é usado por mais de 60 milhões de sites, incluindo 33,6% dos 10 milhões de sites mais bem classificados. Ele oferece ferramentas poderosas que permitem aos usuários criar, editar e publicar conteúdo na web sem a necessidade de conhecimentos avançados em programação.

    Para funcionar, o Wordpress requer um banco de dados para armazenar informações relacionadas ao conteúdo do site. Ele é compatível com vários bancos de dados, como MySQL, MariaDB, PostgreSQL, SQLite e outros. Neste contexto, estamos utilizando o MySQL como banco de dados, mas você tem a flexibilidade de escolher outro se preferir.

    • Instale a aplicação charm para utilizarmos, vamos baixar o charm do Wordpress do repositório charm-hub.
    Charm

    O charm é como um pacote que contém instruções sobre como instalar e configurar um aplicativo, como o Grafana. Você simplesmente escolhe o charm do Grafana, define algumas configurações e o Juju cuida do restante, tornando o processo de implantação mais fácil e consistente em ambientes de nuvem. Entenda melhor sobre o que é o charm lendo a sua documentação charm-hub.

    $ sudo snap install charm --channel=2.x/stable --classic

    • Baixe o charm do https://charmhub.io/wordpress usando o comando charm pull.
    • $ charm pull wordpress

    • Também vamos utilizar um charm previamente modificado do MYSQL...Faça o clone do repositório GIT.

    • $ git clone https://github.com/TiagoDemay/charm-mysql.git

    Agora é só fazer o Deploy com o auxilio do JUJU ❗

    • Faça o deploy do charm charm-mysql, para fazer deploy do charm local, use juju deploy ./pasta

    Modifique o charm wordpress

    • Dentro do diretório criado, edite o arquivo metadata.yaml:
    • modifique para utilizar apenas Ubuntu Bionic

    • Faça o deploy do charm wordpress alterado localmente, utilize a documentação encontrada no README do charm do wordpress que vocês baixaram, pare antes do capitulo Scaled Down Usage for Personal Use

    • Acompanhe o andamento usando o comando juju status, após terminado, acesse o Wordpress do seu computador, e verifique o funcionamento do sistema

    Limpeza de ambiente ⚡ ⚡ ⚡

    • Limpe o deploy do Juju usando o command: juju destroy-controller main

    Voce fará um seminário sobre um tema pré definido, para completar a entrega deste roteiro ... peca o tema para o professor.

    Conclusão: SOMENTE PARA PENSAR ❗ ❗ ❗

    O Ansible utilizou indiretamente o MaaS como provedor de recursos físicos. O MaaS por sua vez forneceu o que havia disponível no rack. Você acha que seria necessária uma máquina de 32Gb para rodar um Webserver ou um Load Balancer? Extrapole a resposta para um Datacenter real, onde as máquinas possuem configurações muito superiores. Como resolver esse problema?

    \ No newline at end of file diff --git a/roteiros/3.Private_Cloud_Stack/index.html b/roteiros/3.Private_Cloud_Stack/index.html new file mode 100644 index 00000000..e9d03c31 --- /dev/null +++ b/roteiros/3.Private_Cloud_Stack/index.html @@ -0,0 +1,23 @@ + Computação em Nuvem - Computação em Nuvem - 2024/1

    Private cloud

    Objetivos

    1. Entender os conceitos básicos de Private Cloud.
    2. Aprofundar conceitos sobre redes virtuais SDN.

    Pré-requisitos:

    1. Terminar o capítulo anterior (Juju)
    2. Realizar a leitura sobre o Openstack. [https://www.openstack.org/].
    3. Realizar a leitura sobre o Openstack. [Jackson et al - Cap. 1 até Cap. 5]
    Info

    DIVISÃO DO ROTEIRO O Roteiro é dividido em 2 partes principais.

    • Criando a Infraestrutura (Nuvem VM) - Servidor Virtual Privado (VPS)
    • Uso da Infraestrutura: Django na Nuvem VM criada

    Criando a Infraestrutura (Nuvem VM) - Servidor Virtual Privado (VPS)

    Nesse roteiro vamos instalar um conjunto de aplicações denominado Openstack que vai permitir distribuirmos virtual machines usando os nós disponíveis no kit.

    Até o momento usamos o mass para orquestrar o bare metal e o juju para cuidar do deployment de aplicacoes (exemplo Wordpress). E agora vamos utilizar o Openstack para criar VMs e distribuir os serviços em todas as máquinas kit com maior eficiencia.

    Instalando - Openstack Canonical Distro

    • Faça o download do charm Openstack Base no maas:
    • $ charm pull cs:openstack-base
    • Dentro do diretório criado, edite o arquivo bundle.yaml:

    • identifique quantas máquinas serão alocadas.

    • verifique cada um dos serviços que serão instalados e em quais máquinas.
    • sete o nome do adaptador de rede, br-ex:eth1 na variável data-port. Cuidado para não errar (seguir https://charmhub.io/openstack-base)
    variables:
    +  openstack-origin:    &openstack-origin     cloud:focal-yoga
    +  data-port:           &data-port            br-ex:eth1
    +  worker-multiplier:   &worker-multiplier    0.25
    +  osd-devices:         &osd-devices          /dev/sdb /dev/vdb
    +  expected-osd-count:  &expected-osd-count   3
    +  expected-mon-count:  &expected-mon-count   3
    +
    • Reservar (Allocate) a máquina "server2" no maas.
    • Instale o bundle customizado:
    • $ juju deploy ./bundle.yaml
    • Hora da leitura na documentacao pedida no comeco do roteiro 📖 📖 📖

    Warning

    Provavelmente ocorreu um erro no deploy. ??? Conceito importante: Ao contrário do Ansible, Juju necessita de uma máquina exclusiva para controlar todo o deploy. Essa máquina é alocada automaticamente durante o bootstrap e controlará todo o deploy. Logo você precisa fazer o bootstrap de um novo controlador no server1.

    • Vocês já sabem o que fazer agora: utilizar o comando abaixo para ficar de olho no status do Juju:
    • $ watch -n 2 -c "juju status --color"

    🕰 ⏲ Enquanto aguarda a instação até a indicação 'certificates' awaiting server certificate data e até que o serviço Vault esteja bloqueado. Responda abaixo:

    Exercise

    QUESTOES-1

    1. Conforme visto no arquivo de instalação, os serviços são instalados usando LXD nos nodes. O que é LXD?
    2. O que é o bundle.yaml?
    3. Vault é um servidor de secrets. Como ele funciona e para o que ele é usado?

    Abrindo o cofre

    Para dar prosseguimento, precisamos instalar um certificado válido dentro do Vault, para isso precisamos fazer uma operação de unseal:

    • Instalando o cli do Vault e configurando-o:
    • $ sudo snap install vault
    • $ export VAULT_ADDR="http://<IP of vault unit>:8200"
    • Gerando :
    • $ vault operator init -key-shares=5 -key-threshold=3
    • Vocês receberão 5 Unseal Keys e 1 Initial Root Token. Copie e reserve.
    • Removendo o selo, repita a operação com 3 keys diferentes:
    • $ vault operator unseal <Unseal Key>
    • Autorizando o charm (esse passo precisa ser feito em 10 minutos):
    • $ export VAULT_TOKEN=<Initial Root Token>
    • $ vault token create -ttl=10m
    • anote o token gerado pelo comando e use abaixo.
    • $ juju run-action --wait vault/leader authorize-charm token=<token>
    • Finalmente, gerando o certificado:
    • $ juju run-action --wait vault/leader generate-root-ca

    Espere até TODOS os servicos ficarem com o Status "active".

    Configurando o Openstack

    Chegou a hora de configurar o serviço que controla as VMs (Nova), os volumes de disco (Cinder) e a estrutura de rede virtual (Neutron). O primeiro passo é carregar as variáveis de ambiente e autenticar (Keystone) no sistema.

    Ainda, montaremos o nosso servidor de imagens (Glance), que utiliza o Object Storage (Ceph) para armazenamento. O sistema ainda conta com um dashboard (Horizon), um cluster de banco de dados (Mysql Inno Cluster) e um servidor de filas (RabbitMQ) como apoio.

    Usando como base a página do charm instalado (https://jaas.ai/openstack-base/), LEIA O DOCUMENTO INTEIRO ANTES DE INICIAR OS COMANDOS.

    Acesse o Horizon (dashboard) como administrador, e mantenha ele aberto durante todo o setup do openstack (para ver as mudanças acontecendo!)

    Dica

    O Domain name é : admin_domain

    Exercise

    CheckPoint-1

    1. De um print das Telas abaixo:
    2. Do Dashboard do MAAS com as máquinas.
    3. Da aba compute overview no OpenStack.
    4. Da aba compute instances no OpenStack.
    5. Da aba network topology no OpenStack.

    Pense na estrutura de rede do seu KIT (Altere os Ips dos exemplos de comandos caso necessário)

    • Prestem muita atenção nos passos! Não copie e cole comandos sem verificar os argumentos. Começe a partir da seção Install the OpenStack clients
    • Instale o client do Openstack no maas via snap.
    • Carregue as credenciais em openrc e verifique os serviços:
    • $ openstack service list
    • Faça pequenos ajustes na rede:
      • $ juju config neutron-api enable-ml2-dns="true"
      • $ juju config neutron-api-plugin-ovn dns-servers="X.X.0.1"
    • Importe a imagem do Ubuntu Jammy. Você precisará procurar esta imagem.
    • Configure a rede externa. Usar uma faixa de alocação entre X.X.7.0 e X.X.8.255.

    A partir de agora você criara uma rede interna na sua núvem privada, use os valores dados abaixo.

    • Crie a rede interna e o roteador. Usar a subnet 192.169.0.0/24. Não use DNS.
    • Analise o comando:
      • $ openstack flavor create --help
    • Crie os flavors (instance type) - SEM ephemeral disk:
      • m1.tiny: 1 vcpu/1Gb RAM/20Gb disk
      • m1.small: 1 vcpus/2Gb RAM/20Gb disk
      • m1.medium: 2 vcpus/4Gb RAM/20Gb disk
      • m1.large: 4 vcpus/8Gb RAM/20Gb disk
    • Importe (upload) um key-pair, usando public key (id_rsa.pub) do próprio MaaS.
    • Acesse o Horizon (dashboard) como administrador:
    • Adicione a liberação do SSH e ALL ICMP no security group default.
    • Verifique se a topologia de rede faz sentido. Ela deve ser semelhante ao projeto da sua rede física, porém com mais um nível dentro. Essa rede não existe fisicamente, é tudo virtual.
    • Dispare uma instância m1.tiny com o nome client e sem Novo Volume.
    • Aloque um floating IP para a instância.
    • Teste a conexão SSH! Em caso de erro, volte e verifique se as etapas anteriores estão corretas.

    Exercise

    CheckPoint-2

    1. De um print das Telas abaixo:
    2. Do Dashboard do MAAS com as máquinas.
    3. Da aba compute overview no OpenStack.
    4. Da aba compute instances no OpenStack.
    5. Da aba network topology no OpenStack.
    6. Enumere as diferencas encontradas entre os prints das telas no Checkpoint1 e o Checkpoint-2.
    7. Explique como cada recurso foi criado.

    Escalando os nós

    Vamos adicionar o openstack no cluster como nó de computing e block storage.

    • Verfique no Dashboard do MaaS se ainda há uma máquina disponível (máquina que reservamos/allocated). Faça o release da máquina que está ALLOCATED (cuidado para não errar!)
    • Instale o hypervisor, realizando o deploy na máquina: $ juju add-unit nova-compute
    • Anote o número da máquina adicionada no status e instale o block storage: $ juju add-unit --to <machine-id> ceph-osd

    Exercise

    QUESTOES-2

    1. Faça um desenho de como é a sua arquitetura de rede, desde a sua conexão com o Insper até a instância alocada.

    Uso da Infraestrutura: Django na Nuvem VM criada

    Agora conseguimos corrigir o erro apontado na conclusão do H2, levantando a mesma aplicação django mas sem precisar sacrificar 4 máquinas inteiras.

    Tarefa: Levantar a aplicação -> 2 instancias com django 1 com banco de dados e 1 com Nginx em cima das maquinas virtuais do Openstack.

    TOPOLOGIA:

    Imagem-Topologia

    Exercise

    1. Escreva um relatório dos passos utilizados.(pode ser digitado no word!!!!!!!)
    2. Anexe fotos e/ou diagramas contendo: arquitetura de rede do Django dentro do Openstack (Dica: use o dashboard do Openstack), lista de VMs utilizadas com nome e IPs alocados, foto do Dashboard Django conectado na máquina Nginx/LB.
    \ No newline at end of file diff --git a/roteiros/4.IaC/index.html b/roteiros/4.IaC/index.html new file mode 100644 index 00000000..189d1177 --- /dev/null +++ b/roteiros/4.IaC/index.html @@ -0,0 +1,64 @@ + Computação em Nuvem - Computação em Nuvem - 2024/1

    SLA, DR e IaC

    Objetivos

    1. Entender os conceitos básicos Infraestrutura como código.
    2. Entender os conceitos básicos sobre SLA e DR.

    Pré-requisitos:

    Terminar o capítulo anterior (Openstack) Realizar a leitura [Kavis - Cap 11 e Cap 13]

    Info

    DIVISÃO DO ROTEIRO O Roteiro é dividido em 3 partes principais.

    • Entendendo IaC - Visão Geral
    • Criando a Infraestrutura utilizando IaC
    • Criando um plano de Disaster Recovery e SLA (QUESTOES)

    IaC Visão geral

    Infraestrutura como código (IaC) é o gerenciamento e provisionamento de infraestrutura por meio de código, em vez de processos manuais.

    Utilizando o IaC, é possível criar arquivos de configuração que contenham especificações de infraestrutura, o que facilita a edição e distribuição das configurações. Também garante que você sempre forneça o mesmo ambiente. Ao codificar e documentar suas especificações de configuração, o IaC auxilia no gerenciamento de configuração e ajuda a evitar alterações de configuração não documentadas. O IaC evoluiu para lidar com a deriva ambiental em dutos de liberação. Sem o IaC, as equipes teriam que manter as configurações do ambiente de implantação separadamente. Com o tempo, cada ambiente se torna um "floco de neve", uma configuração única que não pode ser replicada automaticamente. Inconsistências entre ambientes podem causar problemas de implantação. O gerenciamento e a manutenção da infraestrutura envolvem processos manuais que são propensos a erros e difíceis de rastrear.

    Imagem-Topologia

    Reforçando

    O IaC evita a configuração manual e garante consistência ao expressar o estado desejado do ambiente por meio de código bem documentado em formatos como por exemplo o JSON. A implantação de infraestrutura com IaC é repetível e evita problemas de tempo de execução causados ​​por configurações quebradas ou dependências ausentes.

    Para fazer alterações, você precisa editar a origem, não o destino.

    A idempotência (a capacidade de uma determinada operação produzir sempre o mesmo resultado) é um princípio fundamental da IaC. O comando deploy sempre define o ambiente de destino com a mesma configuração, independentemente do estado inicial do ambiente. A idempotência é alcançada configurando automaticamente os destinos existentes ou excluindo os destinos existentes e recriando novos ambientes.

    O que é Terraform em Infraestrutura como Código?

    É uma das possiveis ferramentas para IaC.

    O mercado de Infraestrutura como Código amadureceu ao longo dos anos. Há uma grande variedade de ferramentas, oferecendo diferentes recursos.

    Imagem-Topologia

    Terraform é a infraestrutura da HashiCorp como ferramenta de código. Ele permite que você defina recursos e infraestrutura em arquivos de configuração declarativos legíveis por humanos e gerencie o ciclo de vida de sua infraestrutura. O uso do Terraform tem várias vantagens em relação ao gerenciamento manual de sua infraestrutura:

    1. O Terraform pode gerenciar a infraestrutura em várias plataformas de nuvem.
    2. A linguagem de configuração legível por humanos ajuda você a escrever código de infraestrutura rapidamente.
    3. O estado do Terraform permite rastrear alterações de recursos em todas as suas implantações.
    4. Você pode confirmar suas configurações no controle de versão para colaborar com segurança na infraestrutura.

    ⚡ ⚡ ⚡ Para implantar infraestrutura com o Terraform:

    * Scope         - Identifique a infraestrutura para o seu projeto.
    +* Author        - Escreva a configuração para sua infraestrutura.
    +* Initialize    - Instale os plugins que o Terraform precisa para gerenciar a infraestrutura.
    +* Plan          - Visualize as alterações que o Terraform fará para corresponder à sua configuração.
    +* Apply         - Faça as alterações planejadas.
    +

    Instalar Terraform

    • wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
    • gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint
    • echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
    • sudo apt update && sudo apt install terraform
    • sudo yum install -y yum-utils
    • sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
    • sudo yum -y install terraform
    • Ir na pagina oficial e baixar o pacote binário
    • https://www.terraform.io/downloads
    • brew tap hashicorp/tap
    • brew install hashicorp/tap/terraform

    Criando a Infraestrutura utilizando IaC

    Agora vamos ver como isso funciona. Até agora você acessou o dashboard ou utilizou a interface de linha de comando (CLI) para criar rede, subrede, instancia, roteador e outros recursos.

    • Vamos criar a topologia abaixo via código.

    Imagem-Topologia

    O Terraform conta com arquivos .tf, que definem a infraestrutura.

    O Terraform sabe o que é implantado por meio do arquivo de estado. Este estado é armazenado por padrão em um arquivo local chamado “terraform.tfstate”. Também pode ser armazenado remotamente, o que funciona melhor em um ambiente de equipe.

    O Terraform permite vários provedores, normalmente inicializados em um arquivo chamado provider.tf.

    A estrutura de pastas ficará conforme figura abaixo:

    Imagem-Topologia

    • Crie a estrutura ❗ ❗

    • Dentro da pasta terraform crie os arquivos abaixo:

    provider.tf

    # Terraform Openstack deployment
    +# Author: Tiago Demay - tiagoaodc@insper.edu.br
    +
    +
    +# Define required providers
    +terraform {
    +required_version = ">= 0.14.0"
    +  required_providers {
    +    openstack = {
    +      source  = "terraform-provider-openstack/openstack"
    +      version = "~> 1.35.0"
    +    }
    +  }
    +}
    +
    +
    +# Configure the OpenStack Provider
    +
    +provider "openstack" {
    +  cacert_file         ="/home/cloud/snap/openstackclients/common/root-ca.crt"
    +  auth_url            = "https://192.168.0.120:5000/v3"
    +  region              = "RegionOne"
    +  user_name           = "admin"
    +#  password            = "PASSWORD_USER"
    +}
    +

    instance.tf

    resource "openstack_compute_instance_v2" "instancia" {
    +  name            = "basic"
    +  image_name      = "bionic-amd64"
    +  flavor_name     = "m1.small"
    +  key_pair        = "mykey"
    +  security_groups = ["default"]
    +
    +  network {
    +    name = "network_1"
    +  }
    +
    +  depends_on = [openstack_networking_network_v2.network_1]
    +
    +}
    +

    network.tf

    resource "openstack_networking_network_v2" "network_1" {
    +  name           = "network_1"
    +  admin_state_up = "true"
    +}
    +
    +resource "openstack_networking_subnet_v2" "subnet_1" {
    +  network_id = "${openstack_networking_network_v2.network_1.id}"
    +  cidr       = "192.167.199.0/24"
    +}
    +

    Info

    Alterar a variavel external_network_id = <"ID_EXT_NETWORK"> para o ID da sua rede externa, você pode encontrar esta informacão, acessando o Dashboard do Openstack ou via CLI openstack

    router.tf

    resource "openstack_networking_router_v2" "router_1" {
    +  name                = "my_router"
    +  admin_state_up      = true
    +  external_network_id = <"ID_EXT_NETWORK">
    +}
    +
    +resource "openstack_networking_router_interface_v2" "int_1" {
    +  router_id = "${openstack_networking_router_v2.router_1.id}"
    +  subnet_id = "${openstack_networking_subnet_v2.subnet_1.id}"
    +}
    +

    Para testar a implementação da infraestrutura, execute os comandos abaixo:

    terraform plan

    • Este comando é utilizado para criar um plano de execução. Ele mostra quais ações o Terraform executará quando você aplicar suas configurações.

    terraform apply

    • O comando terraform apply aplica as mudanças necessárias para alcançar o estado desejado da sua configuração. Ele cria, atualiza ou destrói os recursos conforme necessário.

    Utlize a CLI do openstack para verificar que a instancia foi criada.

    Para deletar os recursos, execute o comando:

    terraform destroy

    Criando um plano de Disaster Recovery e SLA (QUESTOES)

    Pode ser no Word!!!

    Exercise

    QUESTOES

    1. Qual o conceito por trás de Edge Computing? (Obs: Não é a rede de celular 2G)
    2. Você é o CTO (Chief Technology Officer) de uma grande empresa com sede em várias capitais no Brasil e precisa implantar um sistema crítico, de baixo custo e com dados sigilosos para a área operacional.
      1. Você escolheria Public Cloud ou Private Cloud?
      2. Agora explique para ao RH por que você precisa de um time de DevOps.
      3. Considerando o mesmo sistema crítico, agora sua equipe deverá planejar e implementar um ambiente resiliente e capaz de mitigar possíveis interrupções/indisponibilidades. Para isso, identifiquem quais são as principais ameaças que podem colocar sua infraestrutura em risco, e descreva as principais ações que possibilitem o restabelecimento de todas as aplicações de forma rápida e organizada caso algum evento cause uma interrupção ou incidente de segurança. Para isso monte um plano de DR e HA que considere entre as ações:
        • Mapeamento das principais ameaças que podem colocar em riscos o seu ambiente.
        • Elenque e priorize as ações para a recuperação de seu ambiente em uma possível interrupção/desastre.
        • Como sua equipe irá tratar a política de backup?
        • Considerando possíveis instabilidades e problemas, descreva como alta disponibilidade será implementada em sua infraestrutura.
    \ No newline at end of file diff --git a/roteiros/5.K8s/index.html b/roteiros/5.K8s/index.html new file mode 100644 index 00000000..d9fd5ac5 --- /dev/null +++ b/roteiros/5.K8s/index.html @@ -0,0 +1,80 @@ + Computação em Nuvem - Computação em Nuvem - 2024/1

    Containers e K8s

    Objetivos

    1. Entender os conceitos básicos sobre Contêineres e seus Orquestradores.
    2. Instalar o Octavia no Openstack
    3. Integrar o Openstack e o Kubernetes

    Pré-requisitos:

    1. Terminar o capítulo anterior (SLA,DR e IaC)
    2. Realizar a leitura sobre o Docker. [https://docs.docker.com/engine/docker-overview/].
    3. Realizar a leitura sobre o Kubernetes. [https://kubernetes.io/docs/concepts/].
    4. Realizar a leitura do Octavia. [https://docs.openstack.org/octavia/latest/].
    5. Realizar a leitura do Barbican. [https://docs.openstack.org/barbican/latest/].
    6. Realizar a leitura dos Charms. [https://jaas.ai/vault, https://jaas.ai/octavia, https://jaas.ai/barbican].
    Info

    DIVISÃO DO ROTEIRO O Roteiro é dividido em 3 partes principais.

    • Entendendo tipos de implantacoes - Visão Geral
    • Adicionando Octavia (Load Balancer) na Nuvem privada(Openstack)
    • Utilizando Docker e Kubernetes

    Voce chegou a um roteiro avancado, este Roteiro envolve a resolucao de problemas de implantacao, esperamos que você esteja preparado, este roteiro é prototipado por você!!!! (se não estiver, nem comece)

    TARGET

    DO INICIO DO ROTEIRO 1 ATE ONDE CHEGAMOS NO FIM DESTE ROTEIRO

    Imagem-Topologia

    Tipo de implantacoes

    Tradicional

    Inicialmente, as organizações executavam aplicativos em servidores físicos. Os limites de recursos não podem ser definidos para aplicativos em servidores físicos, o que causa problemas de alocação de recursos. Por exemplo, se vários aplicativos estiverem sendo executados em um servidor físico, pode haver uma situação em que um aplicativo consuma mais recursos, resultando em um desempenho insatisfatório de outros aplicativos. A solução para isso é executar cada aplicativo em um servidor físico diferente. Mas isso não aumentou porque os recursos são subutilizados e é caro para as organizações manter muitos servidores físicos.

    Virtualizada

    Como solução, a virtualização foi introduzida. Ele permite que você execute várias máquinas virtuais (VMs) na CPU de um único servidor físico. A virtualização permite que os aplicativos sejam isolados entre VMs e fornece um nível de segurança que as informações de um aplicativo não podem ser acessadas livremente por outro aplicativo. A virtualização permite uma melhor utilização dos recursos em servidores físicos e uma melhor escalabilidade, pois os aplicativos podem ser facilmente adicionados ou atualizados, os custos de hardware são reduzidos e muito mais. Com a virtualização, você pode apresentar um conjunto de recursos físicos como um cluster de máquinas virtuais descartáveis. Cada VM é uma máquina completa, executando todos os componentes, incluindo seu próprio sistema operacional, sobre hardware virtualizado.

    Conteinerizada

    Os contêineres são pacotes leves do código do seu aplicativo, juntamente com dependências, como versões específicas de tempos de execução de linguagem de programação e bibliotecas necessárias para executar seus serviços de software. Os contêineres facilitam o compartilhamento de recursos de CPU, memória, armazenamento e rede no nível dos sistemas operacionais e oferecem um mecanismo de empacotamento lógico no qual os aplicativos podem ser abstraídos do ambiente em que realmente são executados.

    Os contêineres virtualizam no nível do sistema operacional enquanto as VMs virtualizam no nível do hardware

    Imagem-Topologia

    Instalando e Configurando o Octavia (Loadbalancer para Openstack)

    • No servidor Main:

    Faça o download do arquivo loadbalancer-octavia.yaml no Github openstack-charmers/openstack-bundles

    Entre na pasta openstack

    Vamos pedir pro juju aplicar as modificacoes do bundle customizado com o overlay.

    juju deploy ./bundle.yaml --overlay loadbalancer-octavia.yaml

    Vocês já sabem o que fazer agora, Ler a documentacao sobre K8S e Docker, mas de olho no status do Juju.

    Agora vamos criar os certificados necessários.

    mkdir -p demoCA/newcerts
    +touch demoCA/index.txt
    +touch demoCA/index.txt.attr
    +
    +openssl genpkey -algorithm RSA -aes256 -pass pass:foobar -out issuing_ca_key.pem
    +openssl req -x509 -passin pass:foobar -new -nodes -key issuing_ca_key.pem \
    +    -config /etc/ssl/openssl.cnf \
    +    -subj "/C=US/ST=Somestate/O=Org/CN=www.example.com" \
    +    -days 30 \
    +    -out issuing_ca.pem
    +
    +openssl genpkey -algorithm RSA -aes256 -pass pass:foobar -out controller_ca_key.pem
    +openssl req -x509 -passin pass:foobar -new -nodes \
    +        -key controller_ca_key.pem \
    +    -config /etc/ssl/openssl.cnf \
    +    -subj "/C=US/ST=Somestate/O=Org/CN=www.example.com" \
    +    -days 30 \
    +    -out controller_ca.pem
    +openssl req \
    +    -newkey rsa:2048 -nodes -keyout controller_key.pem \
    +    -subj "/C=US/ST=Somestate/O=Org/CN=www.example.com" \
    +    -out controller.csr
    +openssl ca -passin pass:foobar -config /etc/ssl/openssl.cnf \
    +    -cert controller_ca.pem -keyfile controller_ca_key.pem \
    +    -create_serial -batch \
    +    -in controller.csr -days 30 -out controller_cert.pem
    +cat controller_cert.pem controller_key.pem > controller_cert_bundle.pem
    +

    Abra o cofre VAULT novamente...

    Adicionando variavel de ambiente VAULT:

    export VAULT_ADDR="http://<IP of vault unit>:8200"

    Removendo o selo, repita a operação com 3 keys diferentes:

    vault operator unseal <Unseal Key>

    Autorizando o charm:

    export VAULT_TOKEN=<Initial Root Token>

    vault token create -ttl=10m

    Anote o token gerado pelo comando e use abaixo:

    juju run-action --wait vault/leader authorize-charm token=<token>

    juju run-action --wait vault/leader generate-root-ca

    Ainda no Servidor main, vamos aumentar alguns limites:

    openstack quota set --cores 100 [ID do Projeto]

    openstack quota set --instances 100 [ID do Projeto]

    Configurando o Octavia com as alteracoes

    • Passo1
    juju config octavia \
    +    lb-mgmt-issuing-cacert="$(base64 issuing_ca.pem)" \
    +    lb-mgmt-issuing-ca-private-key="$(base64 issuing_ca_key.pem)" \
    +    lb-mgmt-issuing-ca-key-passphrase=foobar \
    +    lb-mgmt-controller-cacert="$(base64 controller_ca.pem)" \
    +    lb-mgmt-controller-cert="$(base64 controller_cert_bundle.pem)"
    +
    • Passo2
    juju config octavia loadbalancer-topology=ACTIVE_STANDBY spare-pool-size=4
    +juju run-action --wait glance-simplestreams-sync/0 sync-images
    +

    ☕ 📖

    Hold your breath!

    Criando imagem

    • Passo1
    juju run-action --wait octavia-diskimage-retrofit/leader retrofit-image
    +

    ☕ 📖 🕰

    • Passo2
    openstack image list
    +openstack image set --tag octavia-diskimage-retrofit --tag octavia-amphora [id amphora image]
    +juju run-action --wait octavia/0 configure-resources
    +

    No capítulo 3, foi realizada a implantação do Openstack no hardware disponível. Além de VMs, o Openstack consegue também manipular containers, tal qual o MaaS e o Juju. Contudo o grande problema é que não basta apenas criar e destruir um container, é preciso administrar uma complexa arquitetura, monitorando e controlando um conjunto de containers que representam uma implantação de um sistema.

    WebServer

    • Criar uma instância m1.small com IP público no Openstack, nomea-la como juju-openstack
    • Acessar a instancia criada
    • Vamos criar um WebServer em NodeJS
    • Criar o arquivo ~/hello-node/server.js
    #!/usr/bin/env nodejs
    +
    +var http = require('http');
    +var os = require('os');
    +
    +var handleRequest = function(request, response) {
    +    console.log('Received request for URL: ' + request.url);
    +    response.writeHead(200);
    +    response.end('{ "host": ' + os.hostname() + ', "message": "Hello World!"}');
    +};
    +
    +var www = http.createServer(handleRequest);
    +www.listen(8080);
    +console.log('Server running at http://localhost:8080/');
    +
    • Testar o WebServer rodando localmente no terminal.
    sudo apt install nodejs
    +./server.js
    +

    Exercise

    CheckPoint-1 WebServer

    1. De um print das Telas abaixo:
    2. Da aba network topology no OpenStack.
    3. Das regras do Security Group utilizado
    4. Da Aba do navegador com o WebServer Rodando.

    Instalar o Docker

    Arquitetura Docker ❗

    Imagem-Topologia

    sudo apt-get update
    +sudo apt install build-essential apt-transport-https curl
    +curl -fsSL https://get.docker.com | sh -
    +sudo usermod -aG docker $USER
    +newgrp docker
    +docker version
    +docker run hello-world
    +
    • Criar uma um arquivo ~/hello-node/Dockerfile que dará origem ao container
    FROM node:6.9.2
    +EXPOSE 8080
    +COPY server.js .
    +CMD node server.js
    +
    • Montar a imagem local (Cria um container com esta aplicacao webserver)

    docker build -t hello-node:v1 ./hello-node/

    • Rodar o container com a imagem criada.

    docker container run hello-node:v1

    Exercise

    CheckPoint-2 Docker

    1. De um print das Telas abaixo:
    2. WebServer Rodando no navegador.

    Docker Hub

    • Fazer o login no Docker • Aplicar a tag na imagem e dar o push do Docker Hub • Para mais detalhes docker --help

    Exercise

    QUESTOES-1

    1. O que é Docker Swarm?
    2. O que é Docker Registry?
    3. O que é Docker Engine?

    Kubernetes aka k8s

    Imagem-Topologia

    • Para facilitar o deploy do Kubernetes vamos utilizar uma "velha conhecida".

    Deja-vu (Juju Reborn)

    O Dashboard do Openstack possui alguns termos (region, instance type, security group, etc) que são semelhantes ao da AWS. Como visto anteriormente, Juju consegue operar sobre Public Cloud, Private Cloud, Bare-metal e Container. Para o setup ficar completo, agora vamos utilizar o Juju sobre o Openstack.

    Dicas

    Documentacao - adicionar Openstack como cloud
    Documentacao - adicionar integrador obrigatório
    Bundle modificado do Kubernetes-core

    • Acesse a instância m1.tiny criada no início do roteiro.
    • Fazer a instalação do Juju.
    • Adicione o Openstack como Cloud Provider no Juju.
    • Fazer o deploy do Kubernetes-core

    • Instalar kubectl no cliente via snap. sudo snap install kubectl --classic

    • Verificar a configuração do Kubernetes via kubectl kubectl cluster-info

    • Caso tenha problemas ver: documentacao-kubernetes

    • Configurar o kubectl proxy para utilização externa na porta 8080.
    • Acessar o Dashboard.

    Fazendo um Deploy

    • Fazer o deploy da imagem docker criada na sessão anterior

    kubectl run hello-node --image=[user]/hello-node:v1 --port=8080

    • Verificar no terminal: kubectl get all
    • Verificar o deploy status no Dashboard
    • Expandir o deploy para 5 réplicas do pod

    Exercise

    CheckPoint-3 Dashboard Kubernetes

    1. De um print das Telas abaixo:
    2. Do dashboard Kubernetes com as 5 replicas

    Acessando o Deploy

    Criar um serviço que irá expor o deploy

    Alternativa I - ClusterIP com Ingress

    kubectl expose deployment hello-node --type=ClusterIP

    • Criar o arquivo ingress.yaml

    apiVersion: extensions/v1beta1
    +kind: Ingress
    +metadata:
    +  name: hello-node-ingress
    +spec:
    +  rules:
    +  - host: hello-node.[ip do kubernetes-worker].xip.io
    +    http:
    +      paths:
    +      - path: /
    +        backend:
    +          serviceName: hello-node
    +          servicePort: 8080
    +
    * Aplicar arquivo ingress ao K8s

    kubectl create -f ingress.yaml

    Exercise

    CheckPoint-4 Expose Service

    1. De um print das Telas abaixo:
    2. Do comando -> kubectl get all

    Alternativa II - NodePort

    kubectl expose deployment hello-node --type=NodePort

    • Verificar qual porta foi designada e liberar o security group do worker

    juju run --unit kubernetes-worker/[# worker] "open-port [porta]"

    Exercise

    CheckPoint-4 Acessar o deploy

    1. De um print das Telas abaixo:
    2. Do comando -> kubectl get all
    3. WebServer Rodando no navegador utilizando a porta aberta.

    Alterando o deploy

    • Alterar o arquivo server.js
    • Montar uma nova imagem com tag v2 e faça um push
    • Fazer um deploy de um pod de testes
    • Testar as alterações
    • Fazer a implantação imediata em produção:

    kubectl set image deployment/hello-node hello-node=[user]/hello-node:v2

    Exercise

    CheckPoint-5 Modificacao

    1. De um print das Telas abaixo:
    2. Do comando -> kubectl get all
    3. WebServer modificado Rodando no navegador utilizando a porta aberta.

    Conclusão: SOMENTE PARA PENSAR ❗ ❗ ❗

    Você desempenhou uma implantação em tempo real usando Kubernetes e DockerHub. Como seria uma arquitetura de Continuous Integration/Continuous Delivery (CI/CD) real utilizando Kubernetes?

    \ No newline at end of file diff --git a/roteiros/README-openstackBase/index.html b/roteiros/README-openstackBase/index.html new file mode 100644 index 00000000..05d3af33 --- /dev/null +++ b/roteiros/README-openstackBase/index.html @@ -0,0 +1,68 @@ + Basic OpenStack cloud - Computação em Nuvem - 2024/1

    Basic OpenStack cloud

    This openstack-base bundle deploys a base OpenStack cloud. Its major elements include:

    • Ubuntu 20.04 LTS (Focal)
    • OpenStack Yoga
    • Ceph Quincy

    Cloud services consist of Compute, Network, Block Storage, Object Storage, Identity, Image, and Dashboard.

    Note: Modifications will typically need to be made to this bundle for it to work in your environment.

    Requirements

    The bundle is primarily designed to work with MAAS as a backing cloud for Juju.

    The MAAS cluster must have a minimum of four nodes:

    • one for the Juju controller, with at least 1 CPU and 4 GiB memory

    • three (ideally identical) for the actual cloud, with minimum resources being:

      • 8 GiB memory
      • enough CPU cores to support your workload
      • two disks
      • two cabled network interfaces

    The first disk is used for the node's operating system, and the second is for Ceph storage.

    The first network interface is used for communication between cloud services (East/West traffic), and the second is for network traffic between the cloud and all external networks (North/South traffic).

    Pro tip: A single network interface will suffice if an Open vSwitch bridge is used on each of the nodes (MAAS v.2.9.2 required).

    Note: The smaller controller node can be targeted via Juju constraints at controller-creation time.

    Topology

    • 3 MAAS nodes, with each hosting one of the following:

      • Ceph storage
      • Nova Compute
      • NTP
    • LXD containers for the following (distributed among the 3 MAAS nodes):

      • Ceph monitors (x3)
      • Ceph RADOS Gateway
      • Cinder
      • Glance
      • Horizon
      • Keystone
      • MySQL8 (x3)
      • Neutron
      • Nova Cloud Controller
      • OVN (x3)
      • Placement
      • RabbitMQ
      • Vault

    Download the bundle

    If not already done, clone the openstack-bundles repository:

    git clone https://github.com/openstack-charmers/openstack-bundles
    +

    The stable and development bundles are found under the stable/openstack-base and development directories respectively.

    Overlay bundles are available under stable/overlays. See the Juju documentation on overlay bundles.

    Modify the bundle

    If using the stable openstack-base bundle, the file to modify is stable/openstack-base/bundle.yaml.

    Tip: Keep the master branch of the repository pristine and create a working branch to contain your modifications.

    A variables: section is used for conveniently setting values in one place. The third column contains the actual values.

    variables:
    +  openstack-origin:    &openstack-origin     cloud:focal-yoga
    +  data-port:           &data-port            br-ex:eno2
    +  worker-multiplier:   &worker-multiplier    0.25
    +  osd-devices:         &osd-devices          /dev/sdb /dev/vdb
    +  expected-osd-count:  &expected-osd-count   3
    +  expected-mon-count:  &expected-mon-count   3
    +

    See the Install OpenStack page in the OpenStack Charms Deployment Guide for help on understanding the variables (the first column).

    Network spaces

    If you're using MAAS and it contains network spaces you will need to bind them to the applications being deployed. One way of doing this is with the openstack-base-spaces-overlay.yaml overlay bundle. Like the main bundle file, it will likely require tailoring:

    variables:
    +  public-space:        &public-space         public-space
    +

    See the Juju documentation on network spaces.

    Containerless

    If you do not want to run containers you will need to undo the placement directives that point to containers. One way of doing this is with the openstack-base-virt-overlay.yaml overlay bundle.

    MAAS cloud, Juju controller, and model

    Ensure that the MAAS cluster has been added to Juju as a cloud and that a Juju controller has been created for that cloud. See the Juju documentation for guidance: Using MAAS with Juju.

    Assuming the controller is called 'maas-controller', create a model called, say, 'openstack' and give it the appropriate default series (e.g. focal):

    juju add-model -c maas-controller --config default-series=focal openstack
    +

    Now ensure that the new model is the current model:

    juju switch maas-controller:openstack
    +

    Deploy the cloud

    To install OpenStack, if you're using the spaces overlay:

    juju deploy ./bundle.yaml --overlay ./openstack-base-spaces-overlay.yaml
    +

    Otherwise, simply do:

    juju deploy ./bundle.yaml
    +

    If you're using a custom overlay (to override elements in earlier bundles) simply append it to the command:

    juju deploy ./bundle.yaml --overlay ./custom-overlay.yaml
    +juju deploy ./bundle.yaml --overlay ./openstack-base-spaces-overlay.yaml --overlay ./custom-overlay.yaml
    +

    Note: Here it is assumed, for the sake of brevity, that the YAML files are in the current working directory.

    Issue TLS certificates

    This bundle uses Vault to issue TLS certificates to services, and some post-deployment steps are needed in order for it to work. Failure to complete them, for example, will leave the OVN deployment with the following message (in juju status):

    'ovsdb-*' incomplete, 'certificates' awaiting server certificate data
    +

    See to the Vault charm README for instructions.

    Install the OpenStack clients

    You'll need the OpenStack clients in order to manage your cloud from the command line. Install them now:

    sudo snap install openstackclients
    +

    Access the cloud

    Confirm that you can access the cloud from the command line:

    source ~/openstack-bundles/stable/openstack-base/openrc
    +openstack service list
    +

    You should get a listing of all registered cloud services.

    Import an image

    You'll need to import an image into Glance in order to create instances.

    First download a boot image, like Focal amd64:

    curl http://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img \
    +   --output ~/cloud-images/focal-amd64.img
    +

    Now import the image and call it 'focal-amd64':

    openstack image create --public --container-format bare \
    +   --disk-format qcow2 --file ~/cloud-images/focal-amd64.img \
    +   focal-amd64
    +

    Images for other Ubuntu releases and architectures can be obtained in a similar way.

    For the ARM 64-bit (arm64) architecture you will need to configure the image to boot in UEFI mode:

    curl http://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img \
    +   --output ~/cloud-images/focal-arm64.img
    +
    +openstack image create --public --container-format bare \
    +   --disk-format qcow2 --property hw_firmware_type=uefi \
    +   --file ~/cloud-images/focal-arm64.img \
    +   focal-arm64
    +

    Configure networking

    For the purposes of a quick test, we'll set up an external network and a shared router ('provider-router') that will be used by all tenants for public access to instances.

    For an example private cloud, create a network ('ext_net'):

    openstack network create --external \
    +   --provider-network-type flat --provider-physical-network physnet1 \
    +   ext_net
    +

    When creating the external subnet ('ext_subnet') the actual values used will depend on the environment that the second network interface (on all nodes) is connected to:

    openstack subnet create --network ext_net --no-dhcp \
    +   --gateway 10.0.0.1 --subnet-range 10.0.0.0/21 \
    +   --allocation-pool start=10.0.0.10,end=10.0.0.200 \
    +   ext_subnet
    +

    Note: For a public cloud the ports would be connected to a publicly addressable part of the internet.

    We'll also need an internal network ('int_net'), subnet ('int_subnet'), and router ('provider-router'):

    openstack network create int_net
    +
    +openstack subnet create --network int_net --dns-nameserver 8.8.8.8 \
    +   --gateway 192.168.0.1 --subnet-range 192.168.0.0/24 \
    +   --allocation-pool start=192.168.0.10,end=192.168.0.200 \
    +   int_subnet
    +
    +openstack router create provider-router
    +openstack router set --external-gateway ext_net provider-router
    +openstack router add subnet provider-router int_subnet
    +

    See the Neutron documentation for more information.

    Create a flavor

    Create at least one flavor to define a hardware profile for new instances. Here we create one called 'm1.small':

    openstack flavor create --ram 2048 --disk 20 --ephemeral 20 m1.small
    +

    Make sure that your MAAS nodes can accommodate the flavor's resources.

    Import an SSH keypair

    An SSH keypair needs to be imported into the cloud in order to access your instances.

    Generate one first if you do not yet have one. This command creates a passphraseless keypair (remove the -N option to avoid that):

    ssh-keygen -q -N '' -f ~/cloud-keys/id_mykey
    +

    To import a keypair:

    openstack keypair create --public-key ~/cloud-keys/id_mykey.pub mykey
    +

    Configure security groups

    To allow ICMP (ping) and SSH traffic to flow to cloud instances create corresponding rules for each existing security group:

    for i in $(openstack security group list | awk '/default/{ print $2 }'); do
    +   openstack security group rule create $i --protocol icmp --remote-ip 0.0.0.0/0;
    +   openstack security group rule create $i --protocol tcp --remote-ip 0.0.0.0/0 --dst-port 22;
    +done
    +

    You only need to perform this step once.

    Create an instance

    Create a Focal amd64 instance called 'focal-1':

    openstack server create --image focal-amd64 --flavor m1.small \
    +   --key-name mykey --network int_net \
    +    focal-1
    +

    Assign a floating IP address

    Request and assign a floating IP address to the new instance:

    FLOATING_IP=$(openstack floating ip create -f value -c floating_ip_address ext_net)
    +openstack server add floating ip focal-1 $FLOATING_IP
    +

    Log in to an instance

    Log in to the new instance:

    ssh -i ~/cloud-keys/id_mykey ubuntu@$FLOATING_IP
    +

    The below commands are a good start to troubleshooting if something goes wrong:

    openstack console log show focal-1
    +openstack server show focal-1
    +

    Access the cloud dashboard

    To access the dashboard (Horizon) first obtain its IP address:

    juju status --format=yaml openstack-dashboard | grep public-address | awk '{print $2}' | head -1
    +

    In this example, the address is '10.0.0.30'.

    The password can be queried from Keystone:

    juju run --unit keystone/leader leader-get admin_passwd
    +

    The dashboard URL then becomes:

    http://10.0.0.30/horizon

    The final credentials needed to log in are:

    User Name: admin
    Password: ***************
    Domain: admin_domain

    VM consoles

    Enable a remote access protocol such as novnc (or spice) if you want to connect to VM consoles from within the dashboard:

    juju config nova-cloud-controller console-access-protocol=novnc
    +

    Further reading

    The below resources are recommended for further reading:

    \ No newline at end of file diff --git a/schema.json b/schema.json new file mode 100644 index 00000000..668d7304 --- /dev/null +++ b/schema.json @@ -0,0 +1,147 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Material for MkDocs", + "markdownDescription": "Configuration", + "type": "object", + "properties": { + "INHERIT": { + "title": "Inherit from configuration", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#configuration-inheritance", + "pattern": "\\.yml$" + }, + "site_name": { + "title": "Site name, used in header, title and drawer", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_name", + "type": "string" + }, + "site_url": { + "title": "Site URL", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_url", + "type": "string" + }, + "site_author": { + "title": "Site author, used in document head", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_author", + "type": "string" + }, + "site_description": { + "title": "Site description, used in document head and in social cards", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_description", + "type": "string" + }, + "repo_name": { + "title": "Repository name, used in header", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#repository-name", + "type": "string" + }, + "repo_url": { + "title": "Repository URL", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#repository", + "type": "string" + }, + "edit_uri": { + "title": "Path from repository root to directory containing Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#edit-button", + "type": "string" + }, + "copyright": { + "title": "Copyright, used in footer", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#copyright-notice", + "type": "string" + }, + "docs_dir": { + "title": "Directory containing the Markdown sources", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#docs_dir", + "type": "string", + "default": "docs" + }, + "site_dir": { + "title": "Directory containing the HTML output", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_dir", + "type": "string", + "default": "site" + }, + "use_directory_urls": { + "title": "Pages are located in their own directories", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#use_directory_urls", + "type": "boolean", + "default": false + }, + "extra_templates": { + "title": "Additional HTML files to include", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#extra_templates", + "type": "array", + "items": { + "title": "Path to HTML file", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#extra_templates", + "pattern": "\\.html$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "extra_css": { + "title": "Additional CSS files to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-css", + "type": "array", + "items": { + "title": "Path to CSS file", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-css", + "pattern": "\\.css($|\\?)" + }, + "uniqueItems": true, + "minItems": 1 + }, + "extra_javascript": { + "title": "Additional JavaScript files to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-javascript", + "type": "array", + "items": { + "title": "Path to JavaScript file", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-javascript", + "pattern": "\\.js($|\\?)" + }, + "uniqueItems": true, + "minItems": 1 + }, + "strict": { + "title": "Strict mode", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#strict", + "type": "boolean", + "default": false + }, + "dev_addr": { + "title": "Development IP Address", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#dev_addr", + "type": "string", + "default": "127.0.0.1:8000" + }, + "remote_branch": { + "title": "Remote branch to deploy to", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#remote_branch", + "type": "string", + "default": "gh-pages" + }, + "remote_name": { + "title": "Remote origin to deploy to", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#remote_name", + "type": "string", + "default": "origin" + }, + "theme": { + "$ref": "schema/theme.json" + }, + "plugins": { + "$ref": "schema/plugins.json" + }, + "markdown_extensions": { + "$ref": "schema/extensions.json" + }, + "extra": { + "$ref": "schema/extra.json" + }, + "nav": { + "$ref": "schema/nav.json" + } + }, + "additionalProperties": false +} diff --git a/schema/assets/fonts.json b/schema/assets/fonts.json new file mode 100644 index 00000000..7953c29b --- /dev/null +++ b/schema/assets/fonts.json @@ -0,0 +1,7050 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Google Fonts", + "markdownDescription": "https://fonts.google.com/", + "type": "string", + "oneOf": [ + { + "title": "ABeeZee", + "markdownDescription": "https://fonts.google.com/specimen/ABeeZee", + "enum": [ + "ABeeZee" + ] + }, + { + "title": "Abel", + "markdownDescription": "https://fonts.google.com/specimen/Abel", + "enum": [ + "Abel" + ] + }, + { + "title": "Abhaya Libre", + "markdownDescription": "https://fonts.google.com/specimen/Abhaya+Libre", + "enum": [ + "Abhaya Libre" + ] + }, + { + "title": "Abril Fatface", + "markdownDescription": "https://fonts.google.com/specimen/Abril+Fatface", + "enum": [ + "Abril Fatface" + ] + }, + { + "title": "Aclonica", + "markdownDescription": "https://fonts.google.com/specimen/Aclonica", + "enum": [ + "Aclonica" + ] + }, + { + "title": "Acme", + "markdownDescription": "https://fonts.google.com/specimen/Acme", + "enum": [ + "Acme" + ] + }, + { + "title": "Actor", + "markdownDescription": "https://fonts.google.com/specimen/Actor", + "enum": [ + "Actor" + ] + }, + { + "title": "Adamina", + "markdownDescription": "https://fonts.google.com/specimen/Adamina", + "enum": [ + "Adamina" + ] + }, + { + "title": "Advent Pro", + "markdownDescription": "https://fonts.google.com/specimen/Advent+Pro", + "enum": [ + "Advent Pro" + ] + }, + { + "title": "Aguafina Script", + "markdownDescription": "https://fonts.google.com/specimen/Aguafina+Script", + "enum": [ + "Aguafina Script" + ] + }, + { + "title": "Akronim", + "markdownDescription": "https://fonts.google.com/specimen/Akronim", + "enum": [ + "Akronim" + ] + }, + { + "title": "Aladin", + "markdownDescription": "https://fonts.google.com/specimen/Aladin", + "enum": [ + "Aladin" + ] + }, + { + "title": "Alata", + "markdownDescription": "https://fonts.google.com/specimen/Alata", + "enum": [ + "Alata" + ] + }, + { + "title": "Alatsi", + "markdownDescription": "https://fonts.google.com/specimen/Alatsi", + "enum": [ + "Alatsi" + ] + }, + { + "title": "Aldrich", + "markdownDescription": "https://fonts.google.com/specimen/Aldrich", + "enum": [ + "Aldrich" + ] + }, + { + "title": "Alef", + "markdownDescription": "https://fonts.google.com/specimen/Alef", + "enum": [ + "Alef" + ] + }, + { + "title": "Alegreya", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya", + "enum": [ + "Alegreya" + ] + }, + { + "title": "Alegreya SC", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya+SC", + "enum": [ + "Alegreya SC" + ] + }, + { + "title": "Alegreya Sans", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya+Sans", + "enum": [ + "Alegreya Sans" + ] + }, + { + "title": "Alegreya Sans SC", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya+Sans+SC", + "enum": [ + "Alegreya Sans SC" + ] + }, + { + "title": "Aleo", + "markdownDescription": "https://fonts.google.com/specimen/Aleo", + "enum": [ + "Aleo" + ] + }, + { + "title": "Alex Brush", + "markdownDescription": "https://fonts.google.com/specimen/Alex+Brush", + "enum": [ + "Alex Brush" + ] + }, + { + "title": "Alfa Slab One", + "markdownDescription": "https://fonts.google.com/specimen/Alfa+Slab+One", + "enum": [ + "Alfa Slab One" + ] + }, + { + "title": "Alice", + "markdownDescription": "https://fonts.google.com/specimen/Alice", + "enum": [ + "Alice" + ] + }, + { + "title": "Alike", + "markdownDescription": "https://fonts.google.com/specimen/Alike", + "enum": [ + "Alike" + ] + }, + { + "title": "Alike Angular", + "markdownDescription": "https://fonts.google.com/specimen/Alike+Angular", + "enum": [ + "Alike Angular" + ] + }, + { + "title": "Allan", + "markdownDescription": "https://fonts.google.com/specimen/Allan", + "enum": [ + "Allan" + ] + }, + { + "title": "Allerta", + "markdownDescription": "https://fonts.google.com/specimen/Allerta", + "enum": [ + "Allerta" + ] + }, + { + "title": "Allerta Stencil", + "markdownDescription": "https://fonts.google.com/specimen/Allerta+Stencil", + "enum": [ + "Allerta Stencil" + ] + }, + { + "title": "Allura", + "markdownDescription": "https://fonts.google.com/specimen/Allura", + "enum": [ + "Allura" + ] + }, + { + "title": "Almarai", + "markdownDescription": "https://fonts.google.com/specimen/Almarai", + "enum": [ + "Almarai" + ] + }, + { + "title": "Almendra", + "markdownDescription": "https://fonts.google.com/specimen/Almendra", + "enum": [ + "Almendra" + ] + }, + { + "title": "Almendra Display", + "markdownDescription": "https://fonts.google.com/specimen/Almendra+Display", + "enum": [ + "Almendra Display" + ] + }, + { + "title": "Almendra SC", + "markdownDescription": "https://fonts.google.com/specimen/Almendra+SC", + "enum": [ + "Almendra SC" + ] + }, + { + "title": "Amarante", + "markdownDescription": "https://fonts.google.com/specimen/Amarante", + "enum": [ + "Amarante" + ] + }, + { + "title": "Amaranth", + "markdownDescription": "https://fonts.google.com/specimen/Amaranth", + "enum": [ + "Amaranth" + ] + }, + { + "title": "Amatic SC", + "markdownDescription": "https://fonts.google.com/specimen/Amatic+SC", + "enum": [ + "Amatic SC" + ] + }, + { + "title": "Amethysta", + "markdownDescription": "https://fonts.google.com/specimen/Amethysta", + "enum": [ + "Amethysta" + ] + }, + { + "title": "Amiko", + "markdownDescription": "https://fonts.google.com/specimen/Amiko", + "enum": [ + "Amiko" + ] + }, + { + "title": "Amiri", + "markdownDescription": "https://fonts.google.com/specimen/Amiri", + "enum": [ + "Amiri" + ] + }, + { + "title": "Amita", + "markdownDescription": "https://fonts.google.com/specimen/Amita", + "enum": [ + "Amita" + ] + }, + { + "title": "Anaheim", + "markdownDescription": "https://fonts.google.com/specimen/Anaheim", + "enum": [ + "Anaheim" + ] + }, + { + "title": "Andada", + "markdownDescription": "https://fonts.google.com/specimen/Andada", + "enum": [ + "Andada" + ] + }, + { + "title": "Andika", + "markdownDescription": "https://fonts.google.com/specimen/Andika", + "enum": [ + "Andika" + ] + }, + { + "title": "Angkor", + "markdownDescription": "https://fonts.google.com/specimen/Angkor", + "enum": [ + "Angkor" + ] + }, + { + "title": "Annie Use Your Telescope", + "markdownDescription": "https://fonts.google.com/specimen/Annie+Use+Your+Telescope", + "enum": [ + "Annie Use Your Telescope" + ] + }, + { + "title": "Anonymous Pro", + "markdownDescription": "https://fonts.google.com/specimen/Anonymous+Pro", + "enum": [ + "Anonymous Pro" + ] + }, + { + "title": "Antic", + "markdownDescription": "https://fonts.google.com/specimen/Antic", + "enum": [ + "Antic" + ] + }, + { + "title": "Antic Didone", + "markdownDescription": "https://fonts.google.com/specimen/Antic+Didone", + "enum": [ + "Antic Didone" + ] + }, + { + "title": "Antic Slab", + "markdownDescription": "https://fonts.google.com/specimen/Antic+Slab", + "enum": [ + "Antic Slab" + ] + }, + { + "title": "Anton", + "markdownDescription": "https://fonts.google.com/specimen/Anton", + "enum": [ + "Anton" + ] + }, + { + "title": "Arapey", + "markdownDescription": "https://fonts.google.com/specimen/Arapey", + "enum": [ + "Arapey" + ] + }, + { + "title": "Arbutus", + "markdownDescription": "https://fonts.google.com/specimen/Arbutus", + "enum": [ + "Arbutus" + ] + }, + { + "title": "Arbutus Slab", + "markdownDescription": "https://fonts.google.com/specimen/Arbutus+Slab", + "enum": [ + "Arbutus Slab" + ] + }, + { + "title": "Architects Daughter", + "markdownDescription": "https://fonts.google.com/specimen/Architects+Daughter", + "enum": [ + "Architects Daughter" + ] + }, + { + "title": "Archivo", + "markdownDescription": "https://fonts.google.com/specimen/Archivo", + "enum": [ + "Archivo" + ] + }, + { + "title": "Archivo Black", + "markdownDescription": "https://fonts.google.com/specimen/Archivo+Black", + "enum": [ + "Archivo Black" + ] + }, + { + "title": "Archivo Narrow", + "markdownDescription": "https://fonts.google.com/specimen/Archivo+Narrow", + "enum": [ + "Archivo Narrow" + ] + }, + { + "title": "Aref Ruqaa", + "markdownDescription": "https://fonts.google.com/specimen/Aref+Ruqaa", + "enum": [ + "Aref Ruqaa" + ] + }, + { + "title": "Arima Madurai", + "markdownDescription": "https://fonts.google.com/specimen/Arima+Madurai", + "enum": [ + "Arima Madurai" + ] + }, + { + "title": "Arimo", + "markdownDescription": "https://fonts.google.com/specimen/Arimo", + "enum": [ + "Arimo" + ] + }, + { + "title": "Arizonia", + "markdownDescription": "https://fonts.google.com/specimen/Arizonia", + "enum": [ + "Arizonia" + ] + }, + { + "title": "Armata", + "markdownDescription": "https://fonts.google.com/specimen/Armata", + "enum": [ + "Armata" + ] + }, + { + "title": "Arsenal", + "markdownDescription": "https://fonts.google.com/specimen/Arsenal", + "enum": [ + "Arsenal" + ] + }, + { + "title": "Artifika", + "markdownDescription": "https://fonts.google.com/specimen/Artifika", + "enum": [ + "Artifika" + ] + }, + { + "title": "Arvo", + "markdownDescription": "https://fonts.google.com/specimen/Arvo", + "enum": [ + "Arvo" + ] + }, + { + "title": "Arya", + "markdownDescription": "https://fonts.google.com/specimen/Arya", + "enum": [ + "Arya" + ] + }, + { + "title": "Asap", + "markdownDescription": "https://fonts.google.com/specimen/Asap", + "enum": [ + "Asap" + ] + }, + { + "title": "Asap Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Asap+Condensed", + "enum": [ + "Asap Condensed" + ] + }, + { + "title": "Asar", + "markdownDescription": "https://fonts.google.com/specimen/Asar", + "enum": [ + "Asar" + ] + }, + { + "title": "Asset", + "markdownDescription": "https://fonts.google.com/specimen/Asset", + "enum": [ + "Asset" + ] + }, + { + "title": "Assistant", + "markdownDescription": "https://fonts.google.com/specimen/Assistant", + "enum": [ + "Assistant" + ] + }, + { + "title": "Astloch", + "markdownDescription": "https://fonts.google.com/specimen/Astloch", + "enum": [ + "Astloch" + ] + }, + { + "title": "Asul", + "markdownDescription": "https://fonts.google.com/specimen/Asul", + "enum": [ + "Asul" + ] + }, + { + "title": "Athiti", + "markdownDescription": "https://fonts.google.com/specimen/Athiti", + "enum": [ + "Athiti" + ] + }, + { + "title": "Atma", + "markdownDescription": "https://fonts.google.com/specimen/Atma", + "enum": [ + "Atma" + ] + }, + { + "title": "Atomic Age", + "markdownDescription": "https://fonts.google.com/specimen/Atomic+Age", + "enum": [ + "Atomic Age" + ] + }, + { + "title": "Aubrey", + "markdownDescription": "https://fonts.google.com/specimen/Aubrey", + "enum": [ + "Aubrey" + ] + }, + { + "title": "Audiowide", + "markdownDescription": "https://fonts.google.com/specimen/Audiowide", + "enum": [ + "Audiowide" + ] + }, + { + "title": "Autour One", + "markdownDescription": "https://fonts.google.com/specimen/Autour+One", + "enum": [ + "Autour One" + ] + }, + { + "title": "Average", + "markdownDescription": "https://fonts.google.com/specimen/Average", + "enum": [ + "Average" + ] + }, + { + "title": "Average Sans", + "markdownDescription": "https://fonts.google.com/specimen/Average+Sans", + "enum": [ + "Average Sans" + ] + }, + { + "title": "Averia Gruesa Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Gruesa+Libre", + "enum": [ + "Averia Gruesa Libre" + ] + }, + { + "title": "Averia Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Libre", + "enum": [ + "Averia Libre" + ] + }, + { + "title": "Averia Sans Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Sans+Libre", + "enum": [ + "Averia Sans Libre" + ] + }, + { + "title": "Averia Serif Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Serif+Libre", + "enum": [ + "Averia Serif Libre" + ] + }, + { + "title": "B612", + "markdownDescription": "https://fonts.google.com/specimen/B612", + "enum": [ + "B612" + ] + }, + { + "title": "B612 Mono", + "markdownDescription": "https://fonts.google.com/specimen/B612+Mono", + "enum": [ + "B612 Mono" + ] + }, + { + "title": "Bad Script", + "markdownDescription": "https://fonts.google.com/specimen/Bad+Script", + "enum": [ + "Bad Script" + ] + }, + { + "title": "Bahiana", + "markdownDescription": "https://fonts.google.com/specimen/Bahiana", + "enum": [ + "Bahiana" + ] + }, + { + "title": "Bahianita", + "markdownDescription": "https://fonts.google.com/specimen/Bahianita", + "enum": [ + "Bahianita" + ] + }, + { + "title": "Bai Jamjuree", + "markdownDescription": "https://fonts.google.com/specimen/Bai+Jamjuree", + "enum": [ + "Bai Jamjuree" + ] + }, + { + "title": "Baloo 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+2", + "enum": [ + "Baloo 2" + ] + }, + { + "title": "Baloo Bhai 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Bhai+2", + "enum": [ + "Baloo Bhai 2" + ] + }, + { + "title": "Baloo Bhaina 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Bhaina+2", + "enum": [ + "Baloo Bhaina 2" + ] + }, + { + "title": "Baloo Chettan 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Chettan+2", + "enum": [ + "Baloo Chettan 2" + ] + }, + { + "title": "Baloo Da 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Da+2", + "enum": [ + "Baloo Da 2" + ] + }, + { + "title": "Baloo Paaji 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Paaji+2", + "enum": [ + "Baloo Paaji 2" + ] + }, + { + "title": "Baloo Tamma 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Tamma+2", + "enum": [ + "Baloo Tamma 2" + ] + }, + { + "title": "Baloo Tammudu 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Tammudu+2", + "enum": [ + "Baloo Tammudu 2" + ] + }, + { + "title": "Baloo Thambi 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Thambi+2", + "enum": [ + "Baloo Thambi 2" + ] + }, + { + "title": "Balsamiq Sans", + "markdownDescription": "https://fonts.google.com/specimen/Balsamiq+Sans", + "enum": [ + "Balsamiq Sans" + ] + }, + { + "title": "Balthazar", + "markdownDescription": "https://fonts.google.com/specimen/Balthazar", + "enum": [ + "Balthazar" + ] + }, + { + "title": "Bangers", + "markdownDescription": "https://fonts.google.com/specimen/Bangers", + "enum": [ + "Bangers" + ] + }, + { + "title": "Barlow", + "markdownDescription": "https://fonts.google.com/specimen/Barlow", + "enum": [ + "Barlow" + ] + }, + { + "title": "Barlow Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Barlow+Condensed", + "enum": [ + "Barlow Condensed" + ] + }, + { + "title": "Barlow Semi Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Barlow+Semi+Condensed", + "enum": [ + "Barlow Semi Condensed" + ] + }, + { + "title": "Barriecito", + "markdownDescription": "https://fonts.google.com/specimen/Barriecito", + "enum": [ + "Barriecito" + ] + }, + { + "title": "Barrio", + "markdownDescription": "https://fonts.google.com/specimen/Barrio", + "enum": [ + "Barrio" + ] + }, + { + "title": "Basic", + "markdownDescription": "https://fonts.google.com/specimen/Basic", + "enum": [ + "Basic" + ] + }, + { + "title": "Baskervville", + "markdownDescription": "https://fonts.google.com/specimen/Baskervville", + "enum": [ + "Baskervville" + ] + }, + { + "title": "Battambang", + "markdownDescription": "https://fonts.google.com/specimen/Battambang", + "enum": [ + "Battambang" + ] + }, + { + "title": "Baumans", + "markdownDescription": "https://fonts.google.com/specimen/Baumans", + "enum": [ + "Baumans" + ] + }, + { + "title": "Bayon", + "markdownDescription": "https://fonts.google.com/specimen/Bayon", + "enum": [ + "Bayon" + ] + }, + { + "title": "Be Vietnam", + "markdownDescription": "https://fonts.google.com/specimen/Be+Vietnam", + "enum": [ + "Be Vietnam" + ] + }, + { + "title": "Bebas Neue", + "markdownDescription": "https://fonts.google.com/specimen/Bebas+Neue", + "enum": [ + "Bebas Neue" + ] + }, + { + "title": "Belgrano", + "markdownDescription": "https://fonts.google.com/specimen/Belgrano", + "enum": [ + "Belgrano" + ] + }, + { + "title": "Bellefair", + "markdownDescription": "https://fonts.google.com/specimen/Bellefair", + "enum": [ + "Bellefair" + ] + }, + { + "title": "Belleza", + "markdownDescription": "https://fonts.google.com/specimen/Belleza", + "enum": [ + "Belleza" + ] + }, + { + "title": "Bellota", + "markdownDescription": "https://fonts.google.com/specimen/Bellota", + "enum": [ + "Bellota" + ] + }, + { + "title": "Bellota Text", + "markdownDescription": "https://fonts.google.com/specimen/Bellota+Text", + "enum": [ + "Bellota Text" + ] + }, + { + "title": "BenchNine", + "markdownDescription": "https://fonts.google.com/specimen/BenchNine", + "enum": [ + "BenchNine" + ] + }, + { + "title": "Bentham", + "markdownDescription": "https://fonts.google.com/specimen/Bentham", + "enum": [ + "Bentham" + ] + }, + { + "title": "Berkshire Swash", + "markdownDescription": "https://fonts.google.com/specimen/Berkshire+Swash", + "enum": [ + "Berkshire Swash" + ] + }, + { + "title": "Beth Ellen", + "markdownDescription": "https://fonts.google.com/specimen/Beth+Ellen", + "enum": [ + "Beth Ellen" + ] + }, + { + "title": "Bevan", + "markdownDescription": "https://fonts.google.com/specimen/Bevan", + "enum": [ + "Bevan" + ] + }, + { + "title": "Big Shoulders Display", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Display", + "enum": [ + "Big Shoulders Display" + ] + }, + { + "title": "Big Shoulders Text", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Text", + "enum": [ + "Big Shoulders Text" + ] + }, + { + "title": "Bigelow Rules", + "markdownDescription": "https://fonts.google.com/specimen/Bigelow+Rules", + "enum": [ + "Bigelow Rules" + ] + }, + { + "title": "Bigshot One", + "markdownDescription": "https://fonts.google.com/specimen/Bigshot+One", + "enum": [ + "Bigshot One" + ] + }, + { + "title": "Bilbo", + "markdownDescription": "https://fonts.google.com/specimen/Bilbo", + "enum": [ + "Bilbo" + ] + }, + { + "title": "Bilbo Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Bilbo+Swash+Caps", + "enum": [ + "Bilbo Swash Caps" + ] + }, + { + "title": "BioRhyme", + "markdownDescription": "https://fonts.google.com/specimen/BioRhyme", + "enum": [ + "BioRhyme" + ] + }, + { + "title": "BioRhyme Expanded", + "markdownDescription": "https://fonts.google.com/specimen/BioRhyme+Expanded", + "enum": [ + "BioRhyme Expanded" + ] + }, + { + "title": "Biryani", + "markdownDescription": "https://fonts.google.com/specimen/Biryani", + "enum": [ + "Biryani" + ] + }, + { + "title": "Bitter", + "markdownDescription": "https://fonts.google.com/specimen/Bitter", + "enum": [ + "Bitter" + ] + }, + { + "title": "Black And White Picture", + "markdownDescription": "https://fonts.google.com/specimen/Black+And+White+Picture", + "enum": [ + "Black And White Picture" + ] + }, + { + "title": "Black Han Sans", + "markdownDescription": "https://fonts.google.com/specimen/Black+Han+Sans", + "enum": [ + "Black Han Sans" + ] + }, + { + "title": "Black Ops One", + "markdownDescription": "https://fonts.google.com/specimen/Black+Ops+One", + "enum": [ + "Black Ops One" + ] + }, + { + "title": "Blinker", + "markdownDescription": "https://fonts.google.com/specimen/Blinker", + "enum": [ + "Blinker" + ] + }, + { + "title": "Bokor", + "markdownDescription": "https://fonts.google.com/specimen/Bokor", + "enum": [ + "Bokor" + ] + }, + { + "title": "Bonbon", + "markdownDescription": "https://fonts.google.com/specimen/Bonbon", + "enum": [ + "Bonbon" + ] + }, + { + "title": "Boogaloo", + "markdownDescription": "https://fonts.google.com/specimen/Boogaloo", + "enum": [ + "Boogaloo" + ] + }, + { + "title": "Bowlby One", + "markdownDescription": "https://fonts.google.com/specimen/Bowlby+One", + "enum": [ + "Bowlby One" + ] + }, + { + "title": "Bowlby One SC", + "markdownDescription": "https://fonts.google.com/specimen/Bowlby+One+SC", + "enum": [ + "Bowlby One SC" + ] + }, + { + "title": "Brawler", + "markdownDescription": "https://fonts.google.com/specimen/Brawler", + "enum": [ + "Brawler" + ] + }, + { + "title": "Bree Serif", + "markdownDescription": "https://fonts.google.com/specimen/Bree+Serif", + "enum": [ + "Bree Serif" + ] + }, + { + "title": "Bubblegum Sans", + "markdownDescription": "https://fonts.google.com/specimen/Bubblegum+Sans", + "enum": [ + "Bubblegum Sans" + ] + }, + { + "title": "Bubbler One", + "markdownDescription": "https://fonts.google.com/specimen/Bubbler+One", + "enum": [ + "Bubbler One" + ] + }, + { + "title": "Buda", + "markdownDescription": "https://fonts.google.com/specimen/Buda", + "enum": [ + "Buda" + ] + }, + { + "title": "Buenard", + "markdownDescription": "https://fonts.google.com/specimen/Buenard", + "enum": [ + "Buenard" + ] + }, + { + "title": "Bungee", + "markdownDescription": "https://fonts.google.com/specimen/Bungee", + "enum": [ + "Bungee" + ] + }, + { + "title": "Bungee Hairline", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Hairline", + "enum": [ + "Bungee Hairline" + ] + }, + { + "title": "Bungee Inline", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Inline", + "enum": [ + "Bungee Inline" + ] + }, + { + "title": "Bungee Outline", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Outline", + "enum": [ + "Bungee Outline" + ] + }, + { + "title": "Bungee Shade", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Shade", + "enum": [ + "Bungee Shade" + ] + }, + { + "title": "Butcherman", + "markdownDescription": "https://fonts.google.com/specimen/Butcherman", + "enum": [ + "Butcherman" + ] + }, + { + "title": "Butterfly Kids", + "markdownDescription": "https://fonts.google.com/specimen/Butterfly+Kids", + "enum": [ + "Butterfly Kids" + ] + }, + { + "title": "Cabin", + "markdownDescription": "https://fonts.google.com/specimen/Cabin", + "enum": [ + "Cabin" + ] + }, + { + "title": "Cabin Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Cabin+Condensed", + "enum": [ + "Cabin Condensed" + ] + }, + { + "title": "Cabin Sketch", + "markdownDescription": "https://fonts.google.com/specimen/Cabin+Sketch", + "enum": [ + "Cabin Sketch" + ] + }, + { + "title": "Caesar Dressing", + "markdownDescription": "https://fonts.google.com/specimen/Caesar+Dressing", + "enum": [ + "Caesar Dressing" + ] + }, + { + "title": "Cagliostro", + "markdownDescription": "https://fonts.google.com/specimen/Cagliostro", + "enum": [ + "Cagliostro" + ] + }, + { + "title": "Cairo", + "markdownDescription": "https://fonts.google.com/specimen/Cairo", + "enum": [ + "Cairo" + ] + }, + { + "title": "Caladea", + "markdownDescription": "https://fonts.google.com/specimen/Caladea", + "enum": [ + "Caladea" + ] + }, + { + "title": "Calistoga", + "markdownDescription": "https://fonts.google.com/specimen/Calistoga", + "enum": [ + "Calistoga" + ] + }, + { + "title": "Calligraffitti", + "markdownDescription": "https://fonts.google.com/specimen/Calligraffitti", + "enum": [ + "Calligraffitti" + ] + }, + { + "title": "Cambay", + "markdownDescription": "https://fonts.google.com/specimen/Cambay", + "enum": [ + "Cambay" + ] + }, + { + "title": "Cambo", + "markdownDescription": "https://fonts.google.com/specimen/Cambo", + "enum": [ + "Cambo" + ] + }, + { + "title": "Candal", + "markdownDescription": "https://fonts.google.com/specimen/Candal", + "enum": [ + "Candal" + ] + }, + { + "title": "Cantarell", + "markdownDescription": "https://fonts.google.com/specimen/Cantarell", + "enum": [ + "Cantarell" + ] + }, + { + "title": "Cantata One", + "markdownDescription": "https://fonts.google.com/specimen/Cantata+One", + "enum": [ + "Cantata One" + ] + }, + { + "title": "Cantora One", + "markdownDescription": "https://fonts.google.com/specimen/Cantora+One", + "enum": [ + "Cantora One" + ] + }, + { + "title": "Capriola", + "markdownDescription": "https://fonts.google.com/specimen/Capriola", + "enum": [ + "Capriola" + ] + }, + { + "title": "Cardo", + "markdownDescription": "https://fonts.google.com/specimen/Cardo", + "enum": [ + "Cardo" + ] + }, + { + "title": "Carme", + "markdownDescription": "https://fonts.google.com/specimen/Carme", + "enum": [ + "Carme" + ] + }, + { + "title": "Carrois Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Carrois+Gothic", + "enum": [ + "Carrois Gothic" + ] + }, + { + "title": "Carrois Gothic SC", + "markdownDescription": "https://fonts.google.com/specimen/Carrois+Gothic+SC", + "enum": [ + "Carrois Gothic SC" + ] + }, + { + "title": "Carter One", + "markdownDescription": "https://fonts.google.com/specimen/Carter+One", + "enum": [ + "Carter One" + ] + }, + { + "title": "Catamaran", + "markdownDescription": "https://fonts.google.com/specimen/Catamaran", + "enum": [ + "Catamaran" + ] + }, + { + "title": "Caudex", + "markdownDescription": "https://fonts.google.com/specimen/Caudex", + "enum": [ + "Caudex" + ] + }, + { + "title": "Caveat", + "markdownDescription": "https://fonts.google.com/specimen/Caveat", + "enum": [ + "Caveat" + ] + }, + { + "title": "Caveat Brush", + "markdownDescription": "https://fonts.google.com/specimen/Caveat+Brush", + "enum": [ + "Caveat Brush" + ] + }, + { + "title": "Cedarville Cursive", + "markdownDescription": "https://fonts.google.com/specimen/Cedarville+Cursive", + "enum": [ + "Cedarville Cursive" + ] + }, + { + "title": "Ceviche One", + "markdownDescription": "https://fonts.google.com/specimen/Ceviche+One", + "enum": [ + "Ceviche One" + ] + }, + { + "title": "Chakra Petch", + "markdownDescription": "https://fonts.google.com/specimen/Chakra+Petch", + "enum": [ + "Chakra Petch" + ] + }, + { + "title": "Changa", + "markdownDescription": "https://fonts.google.com/specimen/Changa", + "enum": [ + "Changa" + ] + }, + { + "title": "Changa One", + "markdownDescription": "https://fonts.google.com/specimen/Changa+One", + "enum": [ + "Changa One" + ] + }, + { + "title": "Chango", + "markdownDescription": "https://fonts.google.com/specimen/Chango", + "enum": [ + "Chango" + ] + }, + { + "title": "Charm", + "markdownDescription": "https://fonts.google.com/specimen/Charm", + "enum": [ + "Charm" + ] + }, + { + "title": "Charmonman", + "markdownDescription": "https://fonts.google.com/specimen/Charmonman", + "enum": [ + "Charmonman" + ] + }, + { + "title": "Chathura", + "markdownDescription": "https://fonts.google.com/specimen/Chathura", + "enum": [ + "Chathura" + ] + }, + { + "title": "Chau Philomene One", + "markdownDescription": "https://fonts.google.com/specimen/Chau+Philomene+One", + "enum": [ + "Chau Philomene One" + ] + }, + { + "title": "Chela One", + "markdownDescription": "https://fonts.google.com/specimen/Chela+One", + "enum": [ + "Chela One" + ] + }, + { + "title": "Chelsea Market", + "markdownDescription": "https://fonts.google.com/specimen/Chelsea+Market", + "enum": [ + "Chelsea Market" + ] + }, + { + "title": "Chenla", + "markdownDescription": "https://fonts.google.com/specimen/Chenla", + "enum": [ + "Chenla" + ] + }, + { + "title": "Cherry Cream Soda", + "markdownDescription": "https://fonts.google.com/specimen/Cherry+Cream+Soda", + "enum": [ + "Cherry Cream Soda" + ] + }, + { + "title": "Cherry Swash", + "markdownDescription": "https://fonts.google.com/specimen/Cherry+Swash", + "enum": [ + "Cherry Swash" + ] + }, + { + "title": "Chewy", + "markdownDescription": "https://fonts.google.com/specimen/Chewy", + "enum": [ + "Chewy" + ] + }, + { + "title": "Chicle", + "markdownDescription": "https://fonts.google.com/specimen/Chicle", + "enum": [ + "Chicle" + ] + }, + { + "title": "Chilanka", + "markdownDescription": "https://fonts.google.com/specimen/Chilanka", + "enum": [ + "Chilanka" + ] + }, + { + "title": "Chivo", + "markdownDescription": "https://fonts.google.com/specimen/Chivo", + "enum": [ + "Chivo" + ] + }, + { + "title": "Chonburi", + "markdownDescription": "https://fonts.google.com/specimen/Chonburi", + "enum": [ + "Chonburi" + ] + }, + { + "title": "Cinzel", + "markdownDescription": "https://fonts.google.com/specimen/Cinzel", + "enum": [ + "Cinzel" + ] + }, + { + "title": "Cinzel Decorative", + "markdownDescription": "https://fonts.google.com/specimen/Cinzel+Decorative", + "enum": [ + "Cinzel Decorative" + ] + }, + { + "title": "Clicker Script", + "markdownDescription": "https://fonts.google.com/specimen/Clicker+Script", + "enum": [ + "Clicker Script" + ] + }, + { + "title": "Coda", + "markdownDescription": "https://fonts.google.com/specimen/Coda", + "enum": [ + "Coda" + ] + }, + { + "title": "Coda Caption", + "markdownDescription": "https://fonts.google.com/specimen/Coda+Caption", + "enum": [ + "Coda Caption" + ] + }, + { + "title": "Codystar", + "markdownDescription": "https://fonts.google.com/specimen/Codystar", + "enum": [ + "Codystar" + ] + }, + { + "title": "Coiny", + "markdownDescription": "https://fonts.google.com/specimen/Coiny", + "enum": [ + "Coiny" + ] + }, + { + "title": "Combo", + "markdownDescription": "https://fonts.google.com/specimen/Combo", + "enum": [ + "Combo" + ] + }, + { + "title": "Comfortaa", + "markdownDescription": "https://fonts.google.com/specimen/Comfortaa", + "enum": [ + "Comfortaa" + ] + }, + { + "title": "Comic Neue", + "markdownDescription": "https://fonts.google.com/specimen/Comic+Neue", + "enum": [ + "Comic Neue" + ] + }, + { + "title": "Coming Soon", + "markdownDescription": "https://fonts.google.com/specimen/Coming+Soon", + "enum": [ + "Coming Soon" + ] + }, + { + "title": "Concert One", + "markdownDescription": "https://fonts.google.com/specimen/Concert+One", + "enum": [ + "Concert One" + ] + }, + { + "title": "Condiment", + "markdownDescription": "https://fonts.google.com/specimen/Condiment", + "enum": [ + "Condiment" + ] + }, + { + "title": "Content", + "markdownDescription": "https://fonts.google.com/specimen/Content", + "enum": [ + "Content" + ] + }, + { + "title": "Contrail One", + "markdownDescription": "https://fonts.google.com/specimen/Contrail+One", + "enum": [ + "Contrail One" + ] + }, + { + "title": "Convergence", + "markdownDescription": "https://fonts.google.com/specimen/Convergence", + "enum": [ + "Convergence" + ] + }, + { + "title": "Cookie", + "markdownDescription": "https://fonts.google.com/specimen/Cookie", + "enum": [ + "Cookie" + ] + }, + { + "title": "Copse", + "markdownDescription": "https://fonts.google.com/specimen/Copse", + "enum": [ + "Copse" + ] + }, + { + "title": "Corben", + "markdownDescription": "https://fonts.google.com/specimen/Corben", + "enum": [ + "Corben" + ] + }, + { + "title": "Cormorant", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant", + "enum": [ + "Cormorant" + ] + }, + { + "title": "Cormorant Garamond", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Garamond", + "enum": [ + "Cormorant Garamond" + ] + }, + { + "title": "Cormorant Infant", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Infant", + "enum": [ + "Cormorant Infant" + ] + }, + { + "title": "Cormorant SC", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+SC", + "enum": [ + "Cormorant SC" + ] + }, + { + "title": "Cormorant Unicase", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Unicase", + "enum": [ + "Cormorant Unicase" + ] + }, + { + "title": "Cormorant Upright", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Upright", + "enum": [ + "Cormorant Upright" + ] + }, + { + "title": "Courgette", + "markdownDescription": "https://fonts.google.com/specimen/Courgette", + "enum": [ + "Courgette" + ] + }, + { + "title": "Courier Prime", + "markdownDescription": "https://fonts.google.com/specimen/Courier+Prime", + "enum": [ + "Courier Prime" + ] + }, + { + "title": "Cousine", + "markdownDescription": "https://fonts.google.com/specimen/Cousine", + "enum": [ + "Cousine" + ] + }, + { + "title": "Coustard", + "markdownDescription": "https://fonts.google.com/specimen/Coustard", + "enum": [ + "Coustard" + ] + }, + { + "title": "Covered By Your Grace", + "markdownDescription": "https://fonts.google.com/specimen/Covered+By+Your+Grace", + "enum": [ + "Covered By Your Grace" + ] + }, + { + "title": "Crafty Girls", + "markdownDescription": "https://fonts.google.com/specimen/Crafty+Girls", + "enum": [ + "Crafty Girls" + ] + }, + { + "title": "Creepster", + "markdownDescription": "https://fonts.google.com/specimen/Creepster", + "enum": [ + "Creepster" + ] + }, + { + "title": "Crete Round", + "markdownDescription": "https://fonts.google.com/specimen/Crete+Round", + "enum": [ + "Crete Round" + ] + }, + { + "title": "Crimson Pro", + "markdownDescription": "https://fonts.google.com/specimen/Crimson+Pro", + "enum": [ + "Crimson Pro" + ] + }, + { + "title": "Crimson Text", + "markdownDescription": "https://fonts.google.com/specimen/Crimson+Text", + "enum": [ + "Crimson Text" + ] + }, + { + "title": "Croissant One", + "markdownDescription": "https://fonts.google.com/specimen/Croissant+One", + "enum": [ + "Croissant One" + ] + }, + { + "title": "Crushed", + "markdownDescription": "https://fonts.google.com/specimen/Crushed", + "enum": [ + "Crushed" + ] + }, + { + "title": "Cuprum", + "markdownDescription": "https://fonts.google.com/specimen/Cuprum", + "enum": [ + "Cuprum" + ] + }, + { + "title": "Cute Font", + "markdownDescription": "https://fonts.google.com/specimen/Cute+Font", + "enum": [ + "Cute Font" + ] + }, + { + "title": "Cutive", + "markdownDescription": "https://fonts.google.com/specimen/Cutive", + "enum": [ + "Cutive" + ] + }, + { + "title": "Cutive Mono", + "markdownDescription": "https://fonts.google.com/specimen/Cutive+Mono", + "enum": [ + "Cutive Mono" + ] + }, + { + "title": "DM Mono", + "markdownDescription": "https://fonts.google.com/specimen/DM+Mono", + "enum": [ + "DM Mono" + ] + }, + { + "title": "DM Sans", + "markdownDescription": "https://fonts.google.com/specimen/DM+Sans", + "enum": [ + "DM Sans" + ] + }, + { + "title": "DM Serif Display", + "markdownDescription": "https://fonts.google.com/specimen/DM+Serif+Display", + "enum": [ + "DM Serif Display" + ] + }, + { + "title": "DM Serif Text", + "markdownDescription": "https://fonts.google.com/specimen/DM+Serif+Text", + "enum": [ + "DM Serif Text" + ] + }, + { + "title": "Damion", + "markdownDescription": "https://fonts.google.com/specimen/Damion", + "enum": [ + "Damion" + ] + }, + { + "title": "Dancing Script", + "markdownDescription": "https://fonts.google.com/specimen/Dancing+Script", + "enum": [ + "Dancing Script" + ] + }, + { + "title": "Dangrek", + "markdownDescription": "https://fonts.google.com/specimen/Dangrek", + "enum": [ + "Dangrek" + ] + }, + { + "title": "Darker Grotesque", + "markdownDescription": "https://fonts.google.com/specimen/Darker+Grotesque", + "enum": [ + "Darker Grotesque" + ] + }, + { + "title": "David Libre", + "markdownDescription": "https://fonts.google.com/specimen/David+Libre", + "enum": [ + "David Libre" + ] + }, + { + "title": "Dawning of a New Day", + "markdownDescription": "https://fonts.google.com/specimen/Dawning+of+a+New+Day", + "enum": [ + "Dawning of a New Day" + ] + }, + { + "title": "Days One", + "markdownDescription": "https://fonts.google.com/specimen/Days+One", + "enum": [ + "Days One" + ] + }, + { + "title": "Dekko", + "markdownDescription": "https://fonts.google.com/specimen/Dekko", + "enum": [ + "Dekko" + ] + }, + { + "title": "Delius", + "markdownDescription": "https://fonts.google.com/specimen/Delius", + "enum": [ + "Delius" + ] + }, + { + "title": "Delius Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Delius+Swash+Caps", + "enum": [ + "Delius Swash Caps" + ] + }, + { + "title": "Delius Unicase", + "markdownDescription": "https://fonts.google.com/specimen/Delius+Unicase", + "enum": [ + "Delius Unicase" + ] + }, + { + "title": "Della Respira", + "markdownDescription": "https://fonts.google.com/specimen/Della+Respira", + "enum": [ + "Della Respira" + ] + }, + { + "title": "Denk One", + "markdownDescription": "https://fonts.google.com/specimen/Denk+One", + "enum": [ + "Denk One" + ] + }, + { + "title": "Devonshire", + "markdownDescription": "https://fonts.google.com/specimen/Devonshire", + "enum": [ + "Devonshire" + ] + }, + { + "title": "Dhurjati", + "markdownDescription": "https://fonts.google.com/specimen/Dhurjati", + "enum": [ + "Dhurjati" + ] + }, + { + "title": "Didact Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Didact+Gothic", + "enum": [ + "Didact Gothic" + ] + }, + { + "title": "Diplomata", + "markdownDescription": "https://fonts.google.com/specimen/Diplomata", + "enum": [ + "Diplomata" + ] + }, + { + "title": "Diplomata SC", + "markdownDescription": "https://fonts.google.com/specimen/Diplomata+SC", + "enum": [ + "Diplomata SC" + ] + }, + { + "title": "Do Hyeon", + "markdownDescription": "https://fonts.google.com/specimen/Do+Hyeon", + "enum": [ + "Do Hyeon" + ] + }, + { + "title": "Dokdo", + "markdownDescription": "https://fonts.google.com/specimen/Dokdo", + "enum": [ + "Dokdo" + ] + }, + { + "title": "Domine", + "markdownDescription": "https://fonts.google.com/specimen/Domine", + "enum": [ + "Domine" + ] + }, + { + "title": "Donegal One", + "markdownDescription": "https://fonts.google.com/specimen/Donegal+One", + "enum": [ + "Donegal One" + ] + }, + { + "title": "Doppio One", + "markdownDescription": "https://fonts.google.com/specimen/Doppio+One", + "enum": [ + "Doppio One" + ] + }, + { + "title": "Dorsa", + "markdownDescription": "https://fonts.google.com/specimen/Dorsa", + "enum": [ + "Dorsa" + ] + }, + { + "title": "Dosis", + "markdownDescription": "https://fonts.google.com/specimen/Dosis", + "enum": [ + "Dosis" + ] + }, + { + "title": "Dr Sugiyama", + "markdownDescription": "https://fonts.google.com/specimen/Dr+Sugiyama", + "enum": [ + "Dr Sugiyama" + ] + }, + { + "title": "Duru Sans", + "markdownDescription": "https://fonts.google.com/specimen/Duru+Sans", + "enum": [ + "Duru Sans" + ] + }, + { + "title": "Dynalight", + "markdownDescription": "https://fonts.google.com/specimen/Dynalight", + "enum": [ + "Dynalight" + ] + }, + { + "title": "EB Garamond", + "markdownDescription": "https://fonts.google.com/specimen/EB+Garamond", + "enum": [ + "EB Garamond" + ] + }, + { + "title": "Eagle Lake", + "markdownDescription": "https://fonts.google.com/specimen/Eagle+Lake", + "enum": [ + "Eagle Lake" + ] + }, + { + "title": "East Sea Dokdo", + "markdownDescription": "https://fonts.google.com/specimen/East+Sea+Dokdo", + "enum": [ + "East Sea Dokdo" + ] + }, + { + "title": "Eater", + "markdownDescription": "https://fonts.google.com/specimen/Eater", + "enum": [ + "Eater" + ] + }, + { + "title": "Economica", + "markdownDescription": "https://fonts.google.com/specimen/Economica", + "enum": [ + "Economica" + ] + }, + { + "title": "Eczar", + "markdownDescription": "https://fonts.google.com/specimen/Eczar", + "enum": [ + "Eczar" + ] + }, + { + "title": "El Messiri", + "markdownDescription": "https://fonts.google.com/specimen/El+Messiri", + "enum": [ + "El Messiri" + ] + }, + { + "title": "Electrolize", + "markdownDescription": "https://fonts.google.com/specimen/Electrolize", + "enum": [ + "Electrolize" + ] + }, + { + "title": "Elsie", + "markdownDescription": "https://fonts.google.com/specimen/Elsie", + "enum": [ + "Elsie" + ] + }, + { + "title": "Elsie Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Elsie+Swash+Caps", + "enum": [ + "Elsie Swash Caps" + ] + }, + { + "title": "Emblema One", + "markdownDescription": "https://fonts.google.com/specimen/Emblema+One", + "enum": [ + "Emblema One" + ] + }, + { + "title": "Emilys Candy", + "markdownDescription": "https://fonts.google.com/specimen/Emilys+Candy", + "enum": [ + "Emilys Candy" + ] + }, + { + "title": "Encode Sans", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans", + "enum": [ + "Encode Sans" + ] + }, + { + "title": "Encode Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Condensed", + "enum": [ + "Encode Sans Condensed" + ] + }, + { + "title": "Encode Sans Expanded", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Expanded", + "enum": [ + "Encode Sans Expanded" + ] + }, + { + "title": "Encode Sans Semi Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Semi+Condensed", + "enum": [ + "Encode Sans Semi Condensed" + ] + }, + { + "title": "Encode Sans Semi Expanded", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Semi+Expanded", + "enum": [ + "Encode Sans Semi Expanded" + ] + }, + { + "title": "Engagement", + "markdownDescription": "https://fonts.google.com/specimen/Engagement", + "enum": [ + "Engagement" + ] + }, + { + "title": "Englebert", + "markdownDescription": "https://fonts.google.com/specimen/Englebert", + "enum": [ + "Englebert" + ] + }, + { + "title": "Enriqueta", + "markdownDescription": "https://fonts.google.com/specimen/Enriqueta", + "enum": [ + "Enriqueta" + ] + }, + { + "title": "Epilogue", + "markdownDescription": "https://fonts.google.com/specimen/Epilogue", + "enum": [ + "Epilogue" + ] + }, + { + "title": "Erica One", + "markdownDescription": "https://fonts.google.com/specimen/Erica+One", + "enum": [ + "Erica One" + ] + }, + { + "title": "Esteban", + "markdownDescription": "https://fonts.google.com/specimen/Esteban", + "enum": [ + "Esteban" + ] + }, + { + "title": "Euphoria Script", + "markdownDescription": "https://fonts.google.com/specimen/Euphoria+Script", + "enum": [ + "Euphoria Script" + ] + }, + { + "title": "Ewert", + "markdownDescription": "https://fonts.google.com/specimen/Ewert", + "enum": [ + "Ewert" + ] + }, + { + "title": "Exo", + "markdownDescription": "https://fonts.google.com/specimen/Exo", + "enum": [ + "Exo" + ] + }, + { + "title": "Exo 2", + "markdownDescription": "https://fonts.google.com/specimen/Exo+2", + "enum": [ + "Exo 2" + ] + }, + { + "title": "Expletus Sans", + "markdownDescription": "https://fonts.google.com/specimen/Expletus+Sans", + "enum": [ + "Expletus Sans" + ] + }, + { + "title": "Fahkwang", + "markdownDescription": "https://fonts.google.com/specimen/Fahkwang", + "enum": [ + "Fahkwang" + ] + }, + { + "title": "Fanwood Text", + "markdownDescription": "https://fonts.google.com/specimen/Fanwood+Text", + "enum": [ + "Fanwood Text" + ] + }, + { + "title": "Farro", + "markdownDescription": "https://fonts.google.com/specimen/Farro", + "enum": [ + "Farro" + ] + }, + { + "title": "Farsan", + "markdownDescription": "https://fonts.google.com/specimen/Farsan", + "enum": [ + "Farsan" + ] + }, + { + "title": "Fascinate", + "markdownDescription": "https://fonts.google.com/specimen/Fascinate", + "enum": [ + "Fascinate" + ] + }, + { + "title": "Fascinate Inline", + "markdownDescription": "https://fonts.google.com/specimen/Fascinate+Inline", + "enum": [ + "Fascinate Inline" + ] + }, + { + "title": "Faster One", + "markdownDescription": "https://fonts.google.com/specimen/Faster+One", + "enum": [ + "Faster One" + ] + }, + { + "title": "Fasthand", + "markdownDescription": "https://fonts.google.com/specimen/Fasthand", + "enum": [ + "Fasthand" + ] + }, + { + "title": "Fauna One", + "markdownDescription": "https://fonts.google.com/specimen/Fauna+One", + "enum": [ + "Fauna One" + ] + }, + { + "title": "Faustina", + "markdownDescription": "https://fonts.google.com/specimen/Faustina", + "enum": [ + "Faustina" + ] + }, + { + "title": "Federant", + "markdownDescription": "https://fonts.google.com/specimen/Federant", + "enum": [ + "Federant" + ] + }, + { + "title": "Federo", + "markdownDescription": "https://fonts.google.com/specimen/Federo", + "enum": [ + "Federo" + ] + }, + { + "title": "Felipa", + "markdownDescription": "https://fonts.google.com/specimen/Felipa", + "enum": [ + "Felipa" + ] + }, + { + "title": "Fenix", + "markdownDescription": "https://fonts.google.com/specimen/Fenix", + "enum": [ + "Fenix" + ] + }, + { + "title": "Finger Paint", + "markdownDescription": "https://fonts.google.com/specimen/Finger+Paint", + "enum": [ + "Finger Paint" + ] + }, + { + "title": "Fira Code", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Code", + "enum": [ + "Fira Code" + ] + }, + { + "title": "Fira Mono", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Mono", + "enum": [ + "Fira Mono" + ] + }, + { + "title": "Fira Sans", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Sans", + "enum": [ + "Fira Sans" + ] + }, + { + "title": "Fira Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Sans+Condensed", + "enum": [ + "Fira Sans Condensed" + ] + }, + { + "title": "Fira Sans Extra Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Sans+Extra+Condensed", + "enum": [ + "Fira Sans Extra Condensed" + ] + }, + { + "title": "Fjalla One", + "markdownDescription": "https://fonts.google.com/specimen/Fjalla+One", + "enum": [ + "Fjalla One" + ] + }, + { + "title": "Fjord One", + "markdownDescription": "https://fonts.google.com/specimen/Fjord+One", + "enum": [ + "Fjord One" + ] + }, + { + "title": "Flamenco", + "markdownDescription": "https://fonts.google.com/specimen/Flamenco", + "enum": [ + "Flamenco" + ] + }, + { + "title": "Flavors", + "markdownDescription": "https://fonts.google.com/specimen/Flavors", + "enum": [ + "Flavors" + ] + }, + { + "title": "Fondamento", + "markdownDescription": "https://fonts.google.com/specimen/Fondamento", + "enum": [ + "Fondamento" + ] + }, + { + "title": "Fontdiner Swanky", + "markdownDescription": "https://fonts.google.com/specimen/Fontdiner+Swanky", + "enum": [ + "Fontdiner Swanky" + ] + }, + { + "title": "Forum", + "markdownDescription": "https://fonts.google.com/specimen/Forum", + "enum": [ + "Forum" + ] + }, + { + "title": "Francois One", + "markdownDescription": "https://fonts.google.com/specimen/Francois+One", + "enum": [ + "Francois One" + ] + }, + { + "title": "Frank Ruhl Libre", + "markdownDescription": "https://fonts.google.com/specimen/Frank+Ruhl+Libre", + "enum": [ + "Frank Ruhl Libre" + ] + }, + { + "title": "Freckle Face", + "markdownDescription": "https://fonts.google.com/specimen/Freckle+Face", + "enum": [ + "Freckle Face" + ] + }, + { + "title": "Fredericka the Great", + "markdownDescription": "https://fonts.google.com/specimen/Fredericka+the+Great", + "enum": [ + "Fredericka the Great" + ] + }, + { + "title": "Fredoka One", + "markdownDescription": "https://fonts.google.com/specimen/Fredoka+One", + "enum": [ + "Fredoka One" + ] + }, + { + "title": "Freehand", + "markdownDescription": "https://fonts.google.com/specimen/Freehand", + "enum": [ + "Freehand" + ] + }, + { + "title": "Fresca", + "markdownDescription": "https://fonts.google.com/specimen/Fresca", + "enum": [ + "Fresca" + ] + }, + { + "title": "Frijole", + "markdownDescription": "https://fonts.google.com/specimen/Frijole", + "enum": [ + "Frijole" + ] + }, + { + "title": "Fruktur", + "markdownDescription": "https://fonts.google.com/specimen/Fruktur", + "enum": [ + "Fruktur" + ] + }, + { + "title": "Fugaz One", + "markdownDescription": "https://fonts.google.com/specimen/Fugaz+One", + "enum": [ + "Fugaz One" + ] + }, + { + "title": "GFS Didot", + "markdownDescription": "https://fonts.google.com/specimen/GFS+Didot", + "enum": [ + "GFS Didot" + ] + }, + { + "title": "GFS Neohellenic", + "markdownDescription": "https://fonts.google.com/specimen/GFS+Neohellenic", + "enum": [ + "GFS Neohellenic" + ] + }, + { + "title": "Gabriela", + "markdownDescription": "https://fonts.google.com/specimen/Gabriela", + "enum": [ + "Gabriela" + ] + }, + { + "title": "Gaegu", + "markdownDescription": "https://fonts.google.com/specimen/Gaegu", + "enum": [ + "Gaegu" + ] + }, + { + "title": "Gafata", + "markdownDescription": "https://fonts.google.com/specimen/Gafata", + "enum": [ + "Gafata" + ] + }, + { + "title": "Galada", + "markdownDescription": "https://fonts.google.com/specimen/Galada", + "enum": [ + "Galada" + ] + }, + { + "title": "Galdeano", + "markdownDescription": "https://fonts.google.com/specimen/Galdeano", + "enum": [ + "Galdeano" + ] + }, + { + "title": "Galindo", + "markdownDescription": "https://fonts.google.com/specimen/Galindo", + "enum": [ + "Galindo" + ] + }, + { + "title": "Gamja Flower", + "markdownDescription": "https://fonts.google.com/specimen/Gamja+Flower", + "enum": [ + "Gamja Flower" + ] + }, + { + "title": "Gayathri", + "markdownDescription": "https://fonts.google.com/specimen/Gayathri", + "enum": [ + "Gayathri" + ] + }, + { + "title": "Gelasio", + "markdownDescription": "https://fonts.google.com/specimen/Gelasio", + "enum": [ + "Gelasio" + ] + }, + { + "title": "Gentium Basic", + "markdownDescription": "https://fonts.google.com/specimen/Gentium+Basic", + "enum": [ + "Gentium Basic" + ] + }, + { + "title": "Gentium Book Basic", + "markdownDescription": "https://fonts.google.com/specimen/Gentium+Book+Basic", + "enum": [ + "Gentium Book Basic" + ] + }, + { + "title": "Geo", + "markdownDescription": "https://fonts.google.com/specimen/Geo", + "enum": [ + "Geo" + ] + }, + { + "title": "Geostar", + "markdownDescription": "https://fonts.google.com/specimen/Geostar", + "enum": [ + "Geostar" + ] + }, + { + "title": "Geostar Fill", + "markdownDescription": "https://fonts.google.com/specimen/Geostar+Fill", + "enum": [ + "Geostar Fill" + ] + }, + { + "title": "Germania One", + "markdownDescription": "https://fonts.google.com/specimen/Germania+One", + "enum": [ + "Germania One" + ] + }, + { + "title": "Gidugu", + "markdownDescription": "https://fonts.google.com/specimen/Gidugu", + "enum": [ + "Gidugu" + ] + }, + { + "title": "Gilda Display", + "markdownDescription": "https://fonts.google.com/specimen/Gilda+Display", + "enum": [ + "Gilda Display" + ] + }, + { + "title": "Girassol", + "markdownDescription": "https://fonts.google.com/specimen/Girassol", + "enum": [ + "Girassol" + ] + }, + { + "title": "Give You Glory", + "markdownDescription": "https://fonts.google.com/specimen/Give+You+Glory", + "enum": [ + "Give You Glory" + ] + }, + { + "title": "Glass Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Glass+Antiqua", + "enum": [ + "Glass Antiqua" + ] + }, + { + "title": "Glegoo", + "markdownDescription": "https://fonts.google.com/specimen/Glegoo", + "enum": [ + "Glegoo" + ] + }, + { + "title": "Gloria Hallelujah", + "markdownDescription": "https://fonts.google.com/specimen/Gloria+Hallelujah", + "enum": [ + "Gloria Hallelujah" + ] + }, + { + "title": "Goblin One", + "markdownDescription": "https://fonts.google.com/specimen/Goblin+One", + "enum": [ + "Goblin One" + ] + }, + { + "title": "Gochi Hand", + "markdownDescription": "https://fonts.google.com/specimen/Gochi+Hand", + "enum": [ + "Gochi Hand" + ] + }, + { + "title": "Gorditas", + "markdownDescription": "https://fonts.google.com/specimen/Gorditas", + "enum": [ + "Gorditas" + ] + }, + { + "title": "Gothic A1", + "markdownDescription": "https://fonts.google.com/specimen/Gothic+A1", + "enum": [ + "Gothic A1" + ] + }, + { + "title": "Gotu", + "markdownDescription": "https://fonts.google.com/specimen/Gotu", + "enum": [ + "Gotu" + ] + }, + { + "title": "Goudy Bookletter 1911", + "markdownDescription": "https://fonts.google.com/specimen/Goudy+Bookletter+1911", + "enum": [ + "Goudy Bookletter 1911" + ] + }, + { + "title": "Graduate", + "markdownDescription": "https://fonts.google.com/specimen/Graduate", + "enum": [ + "Graduate" + ] + }, + { + "title": "Grand Hotel", + "markdownDescription": "https://fonts.google.com/specimen/Grand+Hotel", + "enum": [ + "Grand Hotel" + ] + }, + { + "title": "Grandstander", + "markdownDescription": "https://fonts.google.com/specimen/Grandstander", + "enum": [ + "Grandstander" + ] + }, + { + "title": "Gravitas One", + "markdownDescription": "https://fonts.google.com/specimen/Gravitas+One", + "enum": [ + "Gravitas One" + ] + }, + { + "title": "Great Vibes", + "markdownDescription": "https://fonts.google.com/specimen/Great+Vibes", + "enum": [ + "Great Vibes" + ] + }, + { + "title": "Grenze", + "markdownDescription": "https://fonts.google.com/specimen/Grenze", + "enum": [ + "Grenze" + ] + }, + { + "title": "Grenze Gotisch", + "markdownDescription": "https://fonts.google.com/specimen/Grenze+Gotisch", + "enum": [ + "Grenze Gotisch" + ] + }, + { + "title": "Griffy", + "markdownDescription": "https://fonts.google.com/specimen/Griffy", + "enum": [ + "Griffy" + ] + }, + { + "title": "Gruppo", + "markdownDescription": "https://fonts.google.com/specimen/Gruppo", + "enum": [ + "Gruppo" + ] + }, + { + "title": "Gudea", + "markdownDescription": "https://fonts.google.com/specimen/Gudea", + "enum": [ + "Gudea" + ] + }, + { + "title": "Gugi", + "markdownDescription": "https://fonts.google.com/specimen/Gugi", + "enum": [ + "Gugi" + ] + }, + { + "title": "Gupter", + "markdownDescription": "https://fonts.google.com/specimen/Gupter", + "enum": [ + "Gupter" + ] + }, + { + "title": "Gurajada", + "markdownDescription": "https://fonts.google.com/specimen/Gurajada", + "enum": [ + "Gurajada" + ] + }, + { + "title": "Habibi", + "markdownDescription": "https://fonts.google.com/specimen/Habibi", + "enum": [ + "Habibi" + ] + }, + { + "title": "Halant", + "markdownDescription": "https://fonts.google.com/specimen/Halant", + "enum": [ + "Halant" + ] + }, + { + "title": "Hammersmith One", + "markdownDescription": "https://fonts.google.com/specimen/Hammersmith+One", + "enum": [ + "Hammersmith One" + ] + }, + { + "title": "Hanalei", + "markdownDescription": "https://fonts.google.com/specimen/Hanalei", + "enum": [ + "Hanalei" + ] + }, + { + "title": "Hanalei Fill", + "markdownDescription": "https://fonts.google.com/specimen/Hanalei+Fill", + "enum": [ + "Hanalei Fill" + ] + }, + { + "title": "Handlee", + "markdownDescription": "https://fonts.google.com/specimen/Handlee", + "enum": [ + "Handlee" + ] + }, + { + "title": "Hanuman", + "markdownDescription": "https://fonts.google.com/specimen/Hanuman", + "enum": [ + "Hanuman" + ] + }, + { + "title": "Happy Monkey", + "markdownDescription": "https://fonts.google.com/specimen/Happy+Monkey", + "enum": [ + "Happy Monkey" + ] + }, + { + "title": "Harmattan", + "markdownDescription": "https://fonts.google.com/specimen/Harmattan", + "enum": [ + "Harmattan" + ] + }, + { + "title": "Headland One", + "markdownDescription": "https://fonts.google.com/specimen/Headland+One", + "enum": [ + "Headland One" + ] + }, + { + "title": "Heebo", + "markdownDescription": "https://fonts.google.com/specimen/Heebo", + "enum": [ + "Heebo" + ] + }, + { + "title": "Henny Penny", + "markdownDescription": "https://fonts.google.com/specimen/Henny+Penny", + "enum": [ + "Henny Penny" + ] + }, + { + "title": "Hepta Slab", + "markdownDescription": "https://fonts.google.com/specimen/Hepta+Slab", + "enum": [ + "Hepta Slab" + ] + }, + { + "title": "Herr Von Muellerhoff", + "markdownDescription": "https://fonts.google.com/specimen/Herr+Von+Muellerhoff", + "enum": [ + "Herr Von Muellerhoff" + ] + }, + { + "title": "Hi Melody", + "markdownDescription": "https://fonts.google.com/specimen/Hi+Melody", + "enum": [ + "Hi Melody" + ] + }, + { + "title": "Hind", + "markdownDescription": "https://fonts.google.com/specimen/Hind", + "enum": [ + "Hind" + ] + }, + { + "title": "Hind Guntur", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Guntur", + "enum": [ + "Hind Guntur" + ] + }, + { + "title": "Hind Madurai", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Madurai", + "enum": [ + "Hind Madurai" + ] + }, + { + "title": "Hind Siliguri", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Siliguri", + "enum": [ + "Hind Siliguri" + ] + }, + { + "title": "Hind Vadodara", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Vadodara", + "enum": [ + "Hind Vadodara" + ] + }, + { + "title": "Holtwood One SC", + "markdownDescription": "https://fonts.google.com/specimen/Holtwood+One+SC", + "enum": [ + "Holtwood One SC" + ] + }, + { + "title": "Homemade Apple", + "markdownDescription": "https://fonts.google.com/specimen/Homemade+Apple", + "enum": [ + "Homemade Apple" + ] + }, + { + "title": "Homenaje", + "markdownDescription": "https://fonts.google.com/specimen/Homenaje", + "enum": [ + "Homenaje" + ] + }, + { + "title": "IBM Plex Mono", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Mono", + "enum": [ + "IBM Plex Mono" + ] + }, + { + "title": "IBM Plex Sans", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans", + "enum": [ + "IBM Plex Sans" + ] + }, + { + "title": "IBM Plex Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Condensed", + "enum": [ + "IBM Plex Sans Condensed" + ] + }, + { + "title": "IBM Plex Serif", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Serif", + "enum": [ + "IBM Plex Serif" + ] + }, + { + "title": "IM Fell DW Pica", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+DW+Pica", + "enum": [ + "IM Fell DW Pica" + ] + }, + { + "title": "IM Fell DW Pica SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+DW+Pica+SC", + "enum": [ + "IM Fell DW Pica SC" + ] + }, + { + "title": "IM Fell Double Pica", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Double+Pica", + "enum": [ + "IM Fell Double Pica" + ] + }, + { + "title": "IM Fell Double Pica SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Double+Pica+SC", + "enum": [ + "IM Fell Double Pica SC" + ] + }, + { + "title": "IM Fell English", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+English", + "enum": [ + "IM Fell English" + ] + }, + { + "title": "IM Fell English SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+English+SC", + "enum": [ + "IM Fell English SC" + ] + }, + { + "title": "IM Fell French Canon", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+French+Canon", + "enum": [ + "IM Fell French Canon" + ] + }, + { + "title": "IM Fell French Canon SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+French+Canon+SC", + "enum": [ + "IM Fell French Canon SC" + ] + }, + { + "title": "IM Fell Great Primer", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Great+Primer", + "enum": [ + "IM Fell Great Primer" + ] + }, + { + "title": "IM Fell Great Primer SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Great+Primer+SC", + "enum": [ + "IM Fell Great Primer SC" + ] + }, + { + "title": "Ibarra Real Nova", + "markdownDescription": "https://fonts.google.com/specimen/Ibarra+Real+Nova", + "enum": [ + "Ibarra Real Nova" + ] + }, + { + "title": "Iceberg", + "markdownDescription": "https://fonts.google.com/specimen/Iceberg", + "enum": [ + "Iceberg" + ] + }, + { + "title": "Iceland", + "markdownDescription": "https://fonts.google.com/specimen/Iceland", + "enum": [ + "Iceland" + ] + }, + { + "title": "Imprima", + "markdownDescription": "https://fonts.google.com/specimen/Imprima", + "enum": [ + "Imprima" + ] + }, + { + "title": "Inconsolata", + "markdownDescription": "https://fonts.google.com/specimen/Inconsolata", + "enum": [ + "Inconsolata" + ] + }, + { + "title": "Inder", + "markdownDescription": "https://fonts.google.com/specimen/Inder", + "enum": [ + "Inder" + ] + }, + { + "title": "Indie Flower", + "markdownDescription": "https://fonts.google.com/specimen/Indie+Flower", + "enum": [ + "Indie Flower" + ] + }, + { + "title": "Inika", + "markdownDescription": "https://fonts.google.com/specimen/Inika", + "enum": [ + "Inika" + ] + }, + { + "title": "Inknut Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Inknut+Antiqua", + "enum": [ + "Inknut Antiqua" + ] + }, + { + "title": "Inria Sans", + "markdownDescription": "https://fonts.google.com/specimen/Inria+Sans", + "enum": [ + "Inria Sans" + ] + }, + { + "title": "Inria Serif", + "markdownDescription": "https://fonts.google.com/specimen/Inria+Serif", + "enum": [ + "Inria Serif" + ] + }, + { + "title": "Inter", + "markdownDescription": "https://fonts.google.com/specimen/Inter", + "enum": [ + "Inter" + ] + }, + { + "title": "Irish Grover", + "markdownDescription": "https://fonts.google.com/specimen/Irish+Grover", + "enum": [ + "Irish Grover" + ] + }, + { + "title": "Istok Web", + "markdownDescription": "https://fonts.google.com/specimen/Istok+Web", + "enum": [ + "Istok Web" + ] + }, + { + "title": "Italiana", + "markdownDescription": "https://fonts.google.com/specimen/Italiana", + "enum": [ + "Italiana" + ] + }, + { + "title": "Italianno", + "markdownDescription": "https://fonts.google.com/specimen/Italianno", + "enum": [ + "Italianno" + ] + }, + { + "title": "Itim", + "markdownDescription": "https://fonts.google.com/specimen/Itim", + "enum": [ + "Itim" + ] + }, + { + "title": "Jacques Francois", + "markdownDescription": "https://fonts.google.com/specimen/Jacques+Francois", + "enum": [ + "Jacques Francois" + ] + }, + { + "title": "Jacques Francois Shadow", + "markdownDescription": "https://fonts.google.com/specimen/Jacques+Francois+Shadow", + "enum": [ + "Jacques Francois Shadow" + ] + }, + { + "title": "Jaldi", + "markdownDescription": "https://fonts.google.com/specimen/Jaldi", + "enum": [ + "Jaldi" + ] + }, + { + "title": "Jim Nightshade", + "markdownDescription": "https://fonts.google.com/specimen/Jim+Nightshade", + "enum": [ + "Jim Nightshade" + ] + }, + { + "title": "Jockey One", + "markdownDescription": "https://fonts.google.com/specimen/Jockey+One", + "enum": [ + "Jockey One" + ] + }, + { + "title": "Jolly Lodger", + "markdownDescription": "https://fonts.google.com/specimen/Jolly+Lodger", + "enum": [ + "Jolly Lodger" + ] + }, + { + "title": "Jomhuria", + "markdownDescription": "https://fonts.google.com/specimen/Jomhuria", + "enum": [ + "Jomhuria" + ] + }, + { + "title": "Jomolhari", + "markdownDescription": "https://fonts.google.com/specimen/Jomolhari", + "enum": [ + "Jomolhari" + ] + }, + { + "title": "Josefin Sans", + "markdownDescription": "https://fonts.google.com/specimen/Josefin+Sans", + "enum": [ + "Josefin Sans" + ] + }, + { + "title": "Josefin Slab", + "markdownDescription": "https://fonts.google.com/specimen/Josefin+Slab", + "enum": [ + "Josefin Slab" + ] + }, + { + "title": "Jost", + "markdownDescription": "https://fonts.google.com/specimen/Jost", + "enum": [ + "Jost" + ] + }, + { + "title": "Joti One", + "markdownDescription": "https://fonts.google.com/specimen/Joti+One", + "enum": [ + "Joti One" + ] + }, + { + "title": "Jua", + "markdownDescription": "https://fonts.google.com/specimen/Jua", + "enum": [ + "Jua" + ] + }, + { + "title": "Judson", + "markdownDescription": "https://fonts.google.com/specimen/Judson", + "enum": [ + "Judson" + ] + }, + { + "title": "Julee", + "markdownDescription": "https://fonts.google.com/specimen/Julee", + "enum": [ + "Julee" + ] + }, + { + "title": "Julius Sans One", + "markdownDescription": "https://fonts.google.com/specimen/Julius+Sans+One", + "enum": [ + "Julius Sans One" + ] + }, + { + "title": "Junge", + "markdownDescription": "https://fonts.google.com/specimen/Junge", + "enum": [ + "Junge" + ] + }, + { + "title": "Jura", + "markdownDescription": "https://fonts.google.com/specimen/Jura", + "enum": [ + "Jura" + ] + }, + { + "title": "Just Another Hand", + "markdownDescription": "https://fonts.google.com/specimen/Just+Another+Hand", + "enum": [ + "Just Another Hand" + ] + }, + { + "title": "Just Me Again Down Here", + "markdownDescription": "https://fonts.google.com/specimen/Just+Me+Again+Down+Here", + "enum": [ + "Just Me Again Down Here" + ] + }, + { + "title": "K2D", + "markdownDescription": "https://fonts.google.com/specimen/K2D", + "enum": [ + "K2D" + ] + }, + { + "title": "Kadwa", + "markdownDescription": "https://fonts.google.com/specimen/Kadwa", + "enum": [ + "Kadwa" + ] + }, + { + "title": "Kalam", + "markdownDescription": "https://fonts.google.com/specimen/Kalam", + "enum": [ + "Kalam" + ] + }, + { + "title": "Kameron", + "markdownDescription": "https://fonts.google.com/specimen/Kameron", + "enum": [ + "Kameron" + ] + }, + { + "title": "Kanit", + "markdownDescription": "https://fonts.google.com/specimen/Kanit", + "enum": [ + "Kanit" + ] + }, + { + "title": "Kantumruy", + "markdownDescription": "https://fonts.google.com/specimen/Kantumruy", + "enum": [ + "Kantumruy" + ] + }, + { + "title": "Karla", + "markdownDescription": "https://fonts.google.com/specimen/Karla", + "enum": [ + "Karla" + ] + }, + { + "title": "Karma", + "markdownDescription": "https://fonts.google.com/specimen/Karma", + "enum": [ + "Karma" + ] + }, + { + "title": "Katibeh", + "markdownDescription": "https://fonts.google.com/specimen/Katibeh", + "enum": [ + "Katibeh" + ] + }, + { + "title": "Kaushan Script", + "markdownDescription": "https://fonts.google.com/specimen/Kaushan+Script", + "enum": [ + "Kaushan Script" + ] + }, + { + "title": "Kavivanar", + "markdownDescription": "https://fonts.google.com/specimen/Kavivanar", + "enum": [ + "Kavivanar" + ] + }, + { + "title": "Kavoon", + "markdownDescription": "https://fonts.google.com/specimen/Kavoon", + "enum": [ + "Kavoon" + ] + }, + { + "title": "Kdam Thmor", + "markdownDescription": "https://fonts.google.com/specimen/Kdam+Thmor", + "enum": [ + "Kdam Thmor" + ] + }, + { + "title": "Keania One", + "markdownDescription": "https://fonts.google.com/specimen/Keania+One", + "enum": [ + "Keania One" + ] + }, + { + "title": "Kelly Slab", + "markdownDescription": "https://fonts.google.com/specimen/Kelly+Slab", + "enum": [ + "Kelly Slab" + ] + }, + { + "title": "Kenia", + "markdownDescription": "https://fonts.google.com/specimen/Kenia", + "enum": [ + "Kenia" + ] + }, + { + "title": "Khand", + "markdownDescription": "https://fonts.google.com/specimen/Khand", + "enum": [ + "Khand" + ] + }, + { + "title": "Khmer", + "markdownDescription": "https://fonts.google.com/specimen/Khmer", + "enum": [ + "Khmer" + ] + }, + { + "title": "Khula", + "markdownDescription": "https://fonts.google.com/specimen/Khula", + "enum": [ + "Khula" + ] + }, + { + "title": "Kirang Haerang", + "markdownDescription": "https://fonts.google.com/specimen/Kirang+Haerang", + "enum": [ + "Kirang Haerang" + ] + }, + { + "title": "Kite One", + "markdownDescription": "https://fonts.google.com/specimen/Kite+One", + "enum": [ + "Kite One" + ] + }, + { + "title": "Knewave", + "markdownDescription": "https://fonts.google.com/specimen/Knewave", + "enum": [ + "Knewave" + ] + }, + { + "title": "KoHo", + "markdownDescription": "https://fonts.google.com/specimen/KoHo", + "enum": [ + "KoHo" + ] + }, + { + "title": "Kodchasan", + "markdownDescription": "https://fonts.google.com/specimen/Kodchasan", + "enum": [ + "Kodchasan" + ] + }, + { + "title": "Kosugi", + "markdownDescription": "https://fonts.google.com/specimen/Kosugi", + "enum": [ + "Kosugi" + ] + }, + { + "title": "Kosugi Maru", + "markdownDescription": "https://fonts.google.com/specimen/Kosugi+Maru", + "enum": [ + "Kosugi Maru" + ] + }, + { + "title": "Kotta One", + "markdownDescription": "https://fonts.google.com/specimen/Kotta+One", + "enum": [ + "Kotta One" + ] + }, + { + "title": "Koulen", + "markdownDescription": "https://fonts.google.com/specimen/Koulen", + "enum": [ + "Koulen" + ] + }, + { + "title": "Kranky", + "markdownDescription": "https://fonts.google.com/specimen/Kranky", + "enum": [ + "Kranky" + ] + }, + { + "title": "Kreon", + "markdownDescription": "https://fonts.google.com/specimen/Kreon", + "enum": [ + "Kreon" + ] + }, + { + "title": "Kristi", + "markdownDescription": "https://fonts.google.com/specimen/Kristi", + "enum": [ + "Kristi" + ] + }, + { + "title": "Krona One", + "markdownDescription": "https://fonts.google.com/specimen/Krona+One", + "enum": [ + "Krona One" + ] + }, + { + "title": "Krub", + "markdownDescription": "https://fonts.google.com/specimen/Krub", + "enum": [ + "Krub" + ] + }, + { + "title": "Kufam", + "markdownDescription": "https://fonts.google.com/specimen/Kufam", + "enum": [ + "Kufam" + ] + }, + { + "title": "Kulim Park", + "markdownDescription": "https://fonts.google.com/specimen/Kulim+Park", + "enum": [ + "Kulim Park" + ] + }, + { + "title": "Kumar One", + "markdownDescription": "https://fonts.google.com/specimen/Kumar+One", + "enum": [ + "Kumar One" + ] + }, + { + "title": "Kumar One Outline", + "markdownDescription": "https://fonts.google.com/specimen/Kumar+One+Outline", + "enum": [ + "Kumar One Outline" + ] + }, + { + "title": "Kumbh Sans", + "markdownDescription": "https://fonts.google.com/specimen/Kumbh+Sans", + "enum": [ + "Kumbh Sans" + ] + }, + { + "title": "Kurale", + "markdownDescription": "https://fonts.google.com/specimen/Kurale", + "enum": [ + "Kurale" + ] + }, + { + "title": "La Belle Aurore", + "markdownDescription": "https://fonts.google.com/specimen/La+Belle+Aurore", + "enum": [ + "La Belle Aurore" + ] + }, + { + "title": "Lacquer", + "markdownDescription": "https://fonts.google.com/specimen/Lacquer", + "enum": [ + "Lacquer" + ] + }, + { + "title": "Laila", + "markdownDescription": "https://fonts.google.com/specimen/Laila", + "enum": [ + "Laila" + ] + }, + { + "title": "Lakki Reddy", + "markdownDescription": "https://fonts.google.com/specimen/Lakki+Reddy", + "enum": [ + "Lakki Reddy" + ] + }, + { + "title": "Lalezar", + "markdownDescription": "https://fonts.google.com/specimen/Lalezar", + "enum": [ + "Lalezar" + ] + }, + { + "title": "Lancelot", + "markdownDescription": "https://fonts.google.com/specimen/Lancelot", + "enum": [ + "Lancelot" + ] + }, + { + "title": "Lateef", + "markdownDescription": "https://fonts.google.com/specimen/Lateef", + "enum": [ + "Lateef" + ] + }, + { + "title": "Lato", + "markdownDescription": "https://fonts.google.com/specimen/Lato", + "enum": [ + "Lato" + ] + }, + { + "title": "League Script", + "markdownDescription": "https://fonts.google.com/specimen/League+Script", + "enum": [ + "League Script" + ] + }, + { + "title": "Leckerli One", + "markdownDescription": "https://fonts.google.com/specimen/Leckerli+One", + "enum": [ + "Leckerli One" + ] + }, + { + "title": "Ledger", + "markdownDescription": "https://fonts.google.com/specimen/Ledger", + "enum": [ + "Ledger" + ] + }, + { + "title": "Lekton", + "markdownDescription": "https://fonts.google.com/specimen/Lekton", + "enum": [ + "Lekton" + ] + }, + { + "title": "Lemon", + "markdownDescription": "https://fonts.google.com/specimen/Lemon", + "enum": [ + "Lemon" + ] + }, + { + "title": "Lemonada", + "markdownDescription": "https://fonts.google.com/specimen/Lemonada", + "enum": [ + "Lemonada" + ] + }, + { + "title": "Lexend Deca", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Deca", + "enum": [ + "Lexend Deca" + ] + }, + { + "title": "Lexend Exa", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Exa", + "enum": [ + "Lexend Exa" + ] + }, + { + "title": "Lexend Giga", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Giga", + "enum": [ + "Lexend Giga" + ] + }, + { + "title": "Lexend Mega", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Mega", + "enum": [ + "Lexend Mega" + ] + }, + { + "title": "Lexend Peta", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Peta", + "enum": [ + "Lexend Peta" + ] + }, + { + "title": "Lexend Tera", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Tera", + "enum": [ + "Lexend Tera" + ] + }, + { + "title": "Lexend Zetta", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Zetta", + "enum": [ + "Lexend Zetta" + ] + }, + { + "title": "Libre Barcode 128", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+128", + "enum": [ + "Libre Barcode 128" + ] + }, + { + "title": "Libre Barcode 128 Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+128+Text", + "enum": [ + "Libre Barcode 128 Text" + ] + }, + { + "title": "Libre Barcode 39", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39", + "enum": [ + "Libre Barcode 39" + ] + }, + { + "title": "Libre Barcode 39 Extended", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39+Extended", + "enum": [ + "Libre Barcode 39 Extended" + ] + }, + { + "title": "Libre Barcode 39 Extended Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39+Extended+Text", + "enum": [ + "Libre Barcode 39 Extended Text" + ] + }, + { + "title": "Libre Barcode 39 Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39+Text", + "enum": [ + "Libre Barcode 39 Text" + ] + }, + { + "title": "Libre Baskerville", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Baskerville", + "enum": [ + "Libre Baskerville" + ] + }, + { + "title": "Libre Caslon Display", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Caslon+Display", + "enum": [ + "Libre Caslon Display" + ] + }, + { + "title": "Libre Caslon Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Caslon+Text", + "enum": [ + "Libre Caslon Text" + ] + }, + { + "title": "Libre Franklin", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Franklin", + "enum": [ + "Libre Franklin" + ] + }, + { + "title": "Life Savers", + "markdownDescription": "https://fonts.google.com/specimen/Life+Savers", + "enum": [ + "Life Savers" + ] + }, + { + "title": "Lilita One", + "markdownDescription": "https://fonts.google.com/specimen/Lilita+One", + "enum": [ + "Lilita One" + ] + }, + { + "title": "Lily Script One", + "markdownDescription": "https://fonts.google.com/specimen/Lily+Script+One", + "enum": [ + "Lily Script One" + ] + }, + { + "title": "Limelight", + "markdownDescription": "https://fonts.google.com/specimen/Limelight", + "enum": [ + "Limelight" + ] + }, + { + "title": "Linden Hill", + "markdownDescription": "https://fonts.google.com/specimen/Linden+Hill", + "enum": [ + "Linden Hill" + ] + }, + { + "title": "Literata", + "markdownDescription": "https://fonts.google.com/specimen/Literata", + "enum": [ + "Literata" + ] + }, + { + "title": "Liu Jian Mao Cao", + "markdownDescription": "https://fonts.google.com/specimen/Liu+Jian+Mao+Cao", + "enum": [ + "Liu Jian Mao Cao" + ] + }, + { + "title": "Livvic", + "markdownDescription": "https://fonts.google.com/specimen/Livvic", + "enum": [ + "Livvic" + ] + }, + { + "title": "Lobster", + "markdownDescription": "https://fonts.google.com/specimen/Lobster", + "enum": [ + "Lobster" + ] + }, + { + "title": "Lobster Two", + "markdownDescription": "https://fonts.google.com/specimen/Lobster+Two", + "enum": [ + "Lobster Two" + ] + }, + { + "title": "Londrina Outline", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Outline", + "enum": [ + "Londrina Outline" + ] + }, + { + "title": "Londrina Shadow", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Shadow", + "enum": [ + "Londrina Shadow" + ] + }, + { + "title": "Londrina Sketch", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Sketch", + "enum": [ + "Londrina Sketch" + ] + }, + { + "title": "Londrina Solid", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Solid", + "enum": [ + "Londrina Solid" + ] + }, + { + "title": "Long Cang", + "markdownDescription": "https://fonts.google.com/specimen/Long+Cang", + "enum": [ + "Long Cang" + ] + }, + { + "title": "Lora", + "markdownDescription": "https://fonts.google.com/specimen/Lora", + "enum": [ + "Lora" + ] + }, + { + "title": "Love Ya Like A Sister", + "markdownDescription": "https://fonts.google.com/specimen/Love+Ya+Like+A+Sister", + "enum": [ + "Love Ya Like A Sister" + ] + }, + { + "title": "Loved by the King", + "markdownDescription": "https://fonts.google.com/specimen/Loved+by+the+King", + "enum": [ + "Loved by the King" + ] + }, + { + "title": "Lovers Quarrel", + "markdownDescription": "https://fonts.google.com/specimen/Lovers+Quarrel", + "enum": [ + "Lovers Quarrel" + ] + }, + { + "title": "Luckiest Guy", + "markdownDescription": "https://fonts.google.com/specimen/Luckiest+Guy", + "enum": [ + "Luckiest Guy" + ] + }, + { + "title": "Lusitana", + "markdownDescription": "https://fonts.google.com/specimen/Lusitana", + "enum": [ + "Lusitana" + ] + }, + { + "title": "Lustria", + "markdownDescription": "https://fonts.google.com/specimen/Lustria", + "enum": [ + "Lustria" + ] + }, + { + "title": "M PLUS 1p", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+1p", + "enum": [ + "M PLUS 1p" + ] + }, + { + "title": "M PLUS Rounded 1c", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+Rounded+1c", + "enum": [ + "M PLUS Rounded 1c" + ] + }, + { + "title": "Ma Shan Zheng", + "markdownDescription": "https://fonts.google.com/specimen/Ma+Shan+Zheng", + "enum": [ + "Ma Shan Zheng" + ] + }, + { + "title": "Macondo", + "markdownDescription": "https://fonts.google.com/specimen/Macondo", + "enum": [ + "Macondo" + ] + }, + { + "title": "Macondo Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Macondo+Swash+Caps", + "enum": [ + "Macondo Swash Caps" + ] + }, + { + "title": "Mada", + "markdownDescription": "https://fonts.google.com/specimen/Mada", + "enum": [ + "Mada" + ] + }, + { + "title": "Magra", + "markdownDescription": "https://fonts.google.com/specimen/Magra", + "enum": [ + "Magra" + ] + }, + { + "title": "Maiden Orange", + "markdownDescription": "https://fonts.google.com/specimen/Maiden+Orange", + "enum": [ + "Maiden Orange" + ] + }, + { + "title": "Maitree", + "markdownDescription": "https://fonts.google.com/specimen/Maitree", + "enum": [ + "Maitree" + ] + }, + { + "title": "Major Mono Display", + "markdownDescription": "https://fonts.google.com/specimen/Major+Mono+Display", + "enum": [ + "Major Mono Display" + ] + }, + { + "title": "Mako", + "markdownDescription": "https://fonts.google.com/specimen/Mako", + "enum": [ + "Mako" + ] + }, + { + "title": "Mali", + "markdownDescription": "https://fonts.google.com/specimen/Mali", + "enum": [ + "Mali" + ] + }, + { + "title": "Mallanna", + "markdownDescription": "https://fonts.google.com/specimen/Mallanna", + "enum": [ + "Mallanna" + ] + }, + { + "title": "Mandali", + "markdownDescription": "https://fonts.google.com/specimen/Mandali", + "enum": [ + "Mandali" + ] + }, + { + "title": "Manjari", + "markdownDescription": "https://fonts.google.com/specimen/Manjari", + "enum": [ + "Manjari" + ] + }, + { + "title": "Manrope", + "markdownDescription": "https://fonts.google.com/specimen/Manrope", + "enum": [ + "Manrope" + ] + }, + { + "title": "Mansalva", + "markdownDescription": "https://fonts.google.com/specimen/Mansalva", + "enum": [ + "Mansalva" + ] + }, + { + "title": "Manuale", + "markdownDescription": "https://fonts.google.com/specimen/Manuale", + "enum": [ + "Manuale" + ] + }, + { + "title": "Marcellus", + "markdownDescription": "https://fonts.google.com/specimen/Marcellus", + "enum": [ + "Marcellus" + ] + }, + { + "title": "Marcellus SC", + "markdownDescription": "https://fonts.google.com/specimen/Marcellus+SC", + "enum": [ + "Marcellus SC" + ] + }, + { + "title": "Marck Script", + "markdownDescription": "https://fonts.google.com/specimen/Marck+Script", + "enum": [ + "Marck Script" + ] + }, + { + "title": "Margarine", + "markdownDescription": "https://fonts.google.com/specimen/Margarine", + "enum": [ + "Margarine" + ] + }, + { + "title": "Markazi Text", + "markdownDescription": "https://fonts.google.com/specimen/Markazi+Text", + "enum": [ + "Markazi Text" + ] + }, + { + "title": "Marko One", + "markdownDescription": "https://fonts.google.com/specimen/Marko+One", + "enum": [ + "Marko One" + ] + }, + { + "title": "Marmelad", + "markdownDescription": "https://fonts.google.com/specimen/Marmelad", + "enum": [ + "Marmelad" + ] + }, + { + "title": "Martel", + "markdownDescription": "https://fonts.google.com/specimen/Martel", + "enum": [ + "Martel" + ] + }, + { + "title": "Martel Sans", + "markdownDescription": "https://fonts.google.com/specimen/Martel+Sans", + "enum": [ + "Martel Sans" + ] + }, + { + "title": "Marvel", + "markdownDescription": "https://fonts.google.com/specimen/Marvel", + "enum": [ + "Marvel" + ] + }, + { + "title": "Mate", + "markdownDescription": "https://fonts.google.com/specimen/Mate", + "enum": [ + "Mate" + ] + }, + { + "title": "Mate SC", + "markdownDescription": "https://fonts.google.com/specimen/Mate+SC", + "enum": [ + "Mate SC" + ] + }, + { + "title": "Material Icons", + "markdownDescription": "https://fonts.google.com/specimen/Material+Icons", + "enum": [ + "Material Icons" + ] + }, + { + "title": "Maven Pro", + "markdownDescription": "https://fonts.google.com/specimen/Maven+Pro", + "enum": [ + "Maven Pro" + ] + }, + { + "title": "McLaren", + "markdownDescription": "https://fonts.google.com/specimen/McLaren", + "enum": [ + "McLaren" + ] + }, + { + "title": "Meddon", + "markdownDescription": "https://fonts.google.com/specimen/Meddon", + "enum": [ + "Meddon" + ] + }, + { + "title": "MedievalSharp", + "markdownDescription": "https://fonts.google.com/specimen/MedievalSharp", + "enum": [ + "MedievalSharp" + ] + }, + { + "title": "Medula One", + "markdownDescription": "https://fonts.google.com/specimen/Medula+One", + "enum": [ + "Medula One" + ] + }, + { + "title": "Meera Inimai", + "markdownDescription": "https://fonts.google.com/specimen/Meera+Inimai", + "enum": [ + "Meera Inimai" + ] + }, + { + "title": "Megrim", + "markdownDescription": "https://fonts.google.com/specimen/Megrim", + "enum": [ + "Megrim" + ] + }, + { + "title": "Meie Script", + "markdownDescription": "https://fonts.google.com/specimen/Meie+Script", + "enum": [ + "Meie Script" + ] + }, + { + "title": "Merienda", + "markdownDescription": "https://fonts.google.com/specimen/Merienda", + "enum": [ + "Merienda" + ] + }, + { + "title": "Merienda One", + "markdownDescription": "https://fonts.google.com/specimen/Merienda+One", + "enum": [ + "Merienda One" + ] + }, + { + "title": "Merriweather", + "markdownDescription": "https://fonts.google.com/specimen/Merriweather", + "enum": [ + "Merriweather" + ] + }, + { + "title": "Merriweather Sans", + "markdownDescription": "https://fonts.google.com/specimen/Merriweather+Sans", + "enum": [ + "Merriweather Sans" + ] + }, + { + "title": "Metal", + "markdownDescription": "https://fonts.google.com/specimen/Metal", + "enum": [ + "Metal" + ] + }, + { + "title": "Metal Mania", + "markdownDescription": "https://fonts.google.com/specimen/Metal+Mania", + "enum": [ + "Metal Mania" + ] + }, + { + "title": "Metamorphous", + "markdownDescription": "https://fonts.google.com/specimen/Metamorphous", + "enum": [ + "Metamorphous" + ] + }, + { + "title": "Metrophobic", + "markdownDescription": "https://fonts.google.com/specimen/Metrophobic", + "enum": [ + "Metrophobic" + ] + }, + { + "title": "Michroma", + "markdownDescription": "https://fonts.google.com/specimen/Michroma", + "enum": [ + "Michroma" + ] + }, + { + "title": "Milonga", + "markdownDescription": "https://fonts.google.com/specimen/Milonga", + "enum": [ + "Milonga" + ] + }, + { + "title": "Miltonian", + "markdownDescription": "https://fonts.google.com/specimen/Miltonian", + "enum": [ + "Miltonian" + ] + }, + { + "title": "Miltonian Tattoo", + "markdownDescription": "https://fonts.google.com/specimen/Miltonian+Tattoo", + "enum": [ + "Miltonian Tattoo" + ] + }, + { + "title": "Mina", + "markdownDescription": "https://fonts.google.com/specimen/Mina", + "enum": [ + "Mina" + ] + }, + { + "title": "Miniver", + "markdownDescription": "https://fonts.google.com/specimen/Miniver", + "enum": [ + "Miniver" + ] + }, + { + "title": "Miriam Libre", + "markdownDescription": "https://fonts.google.com/specimen/Miriam+Libre", + "enum": [ + "Miriam Libre" + ] + }, + { + "title": "Mirza", + "markdownDescription": "https://fonts.google.com/specimen/Mirza", + "enum": [ + "Mirza" + ] + }, + { + "title": "Miss Fajardose", + "markdownDescription": "https://fonts.google.com/specimen/Miss+Fajardose", + "enum": [ + "Miss Fajardose" + ] + }, + { + "title": "Mitr", + "markdownDescription": "https://fonts.google.com/specimen/Mitr", + "enum": [ + "Mitr" + ] + }, + { + "title": "Modak", + "markdownDescription": "https://fonts.google.com/specimen/Modak", + "enum": [ + "Modak" + ] + }, + { + "title": "Modern Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Modern+Antiqua", + "enum": [ + "Modern Antiqua" + ] + }, + { + "title": "Mogra", + "markdownDescription": "https://fonts.google.com/specimen/Mogra", + "enum": [ + "Mogra" + ] + }, + { + "title": "Molengo", + "markdownDescription": "https://fonts.google.com/specimen/Molengo", + "enum": [ + "Molengo" + ] + }, + { + "title": "Molle", + "markdownDescription": "https://fonts.google.com/specimen/Molle", + "enum": [ + "Molle" + ] + }, + { + "title": "Monda", + "markdownDescription": "https://fonts.google.com/specimen/Monda", + "enum": [ + "Monda" + ] + }, + { + "title": "Monofett", + "markdownDescription": "https://fonts.google.com/specimen/Monofett", + "enum": [ + "Monofett" + ] + }, + { + "title": "Monoton", + "markdownDescription": "https://fonts.google.com/specimen/Monoton", + "enum": [ + "Monoton" + ] + }, + { + "title": "Monsieur La Doulaise", + "markdownDescription": "https://fonts.google.com/specimen/Monsieur+La+Doulaise", + "enum": [ + "Monsieur La Doulaise" + ] + }, + { + "title": "Montaga", + "markdownDescription": "https://fonts.google.com/specimen/Montaga", + "enum": [ + "Montaga" + ] + }, + { + "title": "Montez", + "markdownDescription": "https://fonts.google.com/specimen/Montez", + "enum": [ + "Montez" + ] + }, + { + "title": "Montserrat", + "markdownDescription": "https://fonts.google.com/specimen/Montserrat", + "enum": [ + "Montserrat" + ] + }, + { + "title": "Montserrat Alternates", + "markdownDescription": "https://fonts.google.com/specimen/Montserrat+Alternates", + "enum": [ + "Montserrat Alternates" + ] + }, + { + "title": "Montserrat Subrayada", + "markdownDescription": "https://fonts.google.com/specimen/Montserrat+Subrayada", + "enum": [ + "Montserrat Subrayada" + ] + }, + { + "title": "Moul", + "markdownDescription": "https://fonts.google.com/specimen/Moul", + "enum": [ + "Moul" + ] + }, + { + "title": "Moulpali", + "markdownDescription": "https://fonts.google.com/specimen/Moulpali", + "enum": [ + "Moulpali" + ] + }, + { + "title": "Mountains of Christmas", + "markdownDescription": "https://fonts.google.com/specimen/Mountains+of+Christmas", + "enum": [ + "Mountains of Christmas" + ] + }, + { + "title": "Mouse Memoirs", + "markdownDescription": "https://fonts.google.com/specimen/Mouse+Memoirs", + "enum": [ + "Mouse Memoirs" + ] + }, + { + "title": "Mr Bedfort", + "markdownDescription": "https://fonts.google.com/specimen/Mr+Bedfort", + "enum": [ + "Mr Bedfort" + ] + }, + { + "title": "Mr Dafoe", + "markdownDescription": "https://fonts.google.com/specimen/Mr+Dafoe", + "enum": [ + "Mr Dafoe" + ] + }, + { + "title": "Mr De Haviland", + "markdownDescription": "https://fonts.google.com/specimen/Mr+De+Haviland", + "enum": [ + "Mr De Haviland" + ] + }, + { + "title": "Mrs Saint Delafield", + "markdownDescription": "https://fonts.google.com/specimen/Mrs+Saint+Delafield", + "enum": [ + "Mrs Saint Delafield" + ] + }, + { + "title": "Mrs Sheppards", + "markdownDescription": "https://fonts.google.com/specimen/Mrs+Sheppards", + "enum": [ + "Mrs Sheppards" + ] + }, + { + "title": "Mukta", + "markdownDescription": "https://fonts.google.com/specimen/Mukta", + "enum": [ + "Mukta" + ] + }, + { + "title": "Mukta Mahee", + "markdownDescription": "https://fonts.google.com/specimen/Mukta+Mahee", + "enum": [ + "Mukta Mahee" + ] + }, + { + "title": "Mukta Malar", + "markdownDescription": "https://fonts.google.com/specimen/Mukta+Malar", + "enum": [ + "Mukta Malar" + ] + }, + { + "title": "Mukta Vaani", + "markdownDescription": "https://fonts.google.com/specimen/Mukta+Vaani", + "enum": [ + "Mukta Vaani" + ] + }, + { + "title": "Mulish", + "markdownDescription": "https://fonts.google.com/specimen/Mulish", + "enum": [ + "Mulish" + ] + }, + { + "title": "MuseoModerno", + "markdownDescription": "https://fonts.google.com/specimen/MuseoModerno", + "enum": [ + "MuseoModerno" + ] + }, + { + "title": "Mystery Quest", + "markdownDescription": "https://fonts.google.com/specimen/Mystery+Quest", + "enum": [ + "Mystery Quest" + ] + }, + { + "title": "NTR", + "markdownDescription": "https://fonts.google.com/specimen/NTR", + "enum": [ + "NTR" + ] + }, + { + "title": "Nanum Brush Script", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Brush+Script", + "enum": [ + "Nanum Brush Script" + ] + }, + { + "title": "Nanum Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Gothic", + "enum": [ + "Nanum Gothic" + ] + }, + { + "title": "Nanum Gothic Coding", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Gothic+Coding", + "enum": [ + "Nanum Gothic Coding" + ] + }, + { + "title": "Nanum Myeongjo", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Myeongjo", + "enum": [ + "Nanum Myeongjo" + ] + }, + { + "title": "Nanum Pen Script", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Pen+Script", + "enum": [ + "Nanum Pen Script" + ] + }, + { + "title": "Neucha", + "markdownDescription": "https://fonts.google.com/specimen/Neucha", + "enum": [ + "Neucha" + ] + }, + { + "title": "Neuton", + "markdownDescription": "https://fonts.google.com/specimen/Neuton", + "enum": [ + "Neuton" + ] + }, + { + "title": "New Rocker", + "markdownDescription": "https://fonts.google.com/specimen/New+Rocker", + "enum": [ + "New Rocker" + ] + }, + { + "title": "News Cycle", + "markdownDescription": "https://fonts.google.com/specimen/News+Cycle", + "enum": [ + "News Cycle" + ] + }, + { + "title": "Niconne", + "markdownDescription": "https://fonts.google.com/specimen/Niconne", + "enum": [ + "Niconne" + ] + }, + { + "title": "Niramit", + "markdownDescription": "https://fonts.google.com/specimen/Niramit", + "enum": [ + "Niramit" + ] + }, + { + "title": "Nixie One", + "markdownDescription": "https://fonts.google.com/specimen/Nixie+One", + "enum": [ + "Nixie One" + ] + }, + { + "title": "Nobile", + "markdownDescription": "https://fonts.google.com/specimen/Nobile", + "enum": [ + "Nobile" + ] + }, + { + "title": "Nokora", + "markdownDescription": "https://fonts.google.com/specimen/Nokora", + "enum": [ + "Nokora" + ] + }, + { + "title": "Norican", + "markdownDescription": "https://fonts.google.com/specimen/Norican", + "enum": [ + "Norican" + ] + }, + { + "title": "Nosifer", + "markdownDescription": "https://fonts.google.com/specimen/Nosifer", + "enum": [ + "Nosifer" + ] + }, + { + "title": "Notable", + "markdownDescription": "https://fonts.google.com/specimen/Notable", + "enum": [ + "Notable" + ] + }, + { + "title": "Nothing You Could Do", + "markdownDescription": "https://fonts.google.com/specimen/Nothing+You+Could+Do", + "enum": [ + "Nothing You Could Do" + ] + }, + { + "title": "Noticia Text", + "markdownDescription": "https://fonts.google.com/specimen/Noticia+Text", + "enum": [ + "Noticia Text" + ] + }, + { + "title": "Noto Sans", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans", + "enum": [ + "Noto Sans" + ] + }, + { + "title": "Noto Sans HK", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+HK", + "enum": [ + "Noto Sans HK" + ] + }, + { + "title": "Noto Sans JP", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+JP", + "enum": [ + "Noto Sans JP" + ] + }, + { + "title": "Noto Sans KR", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+KR", + "enum": [ + "Noto Sans KR" + ] + }, + { + "title": "Noto Sans SC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+SC", + "enum": [ + "Noto Sans SC" + ] + }, + { + "title": "Noto Sans TC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+TC", + "enum": [ + "Noto Sans TC" + ] + }, + { + "title": "Noto Serif", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif", + "enum": [ + "Noto Serif" + ] + }, + { + "title": "Noto Serif JP", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+JP", + "enum": [ + "Noto Serif JP" + ] + }, + { + "title": "Noto Serif KR", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+KR", + "enum": [ + "Noto Serif KR" + ] + }, + { + "title": "Noto Serif SC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+SC", + "enum": [ + "Noto Serif SC" + ] + }, + { + "title": "Noto Serif TC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+TC", + "enum": [ + "Noto Serif TC" + ] + }, + { + "title": "Nova Cut", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Cut", + "enum": [ + "Nova Cut" + ] + }, + { + "title": "Nova Flat", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Flat", + "enum": [ + "Nova Flat" + ] + }, + { + "title": "Nova Mono", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Mono", + "enum": [ + "Nova Mono" + ] + }, + { + "title": "Nova Oval", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Oval", + "enum": [ + "Nova Oval" + ] + }, + { + "title": "Nova Round", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Round", + "enum": [ + "Nova Round" + ] + }, + { + "title": "Nova Script", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Script", + "enum": [ + "Nova Script" + ] + }, + { + "title": "Nova Slim", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Slim", + "enum": [ + "Nova Slim" + ] + }, + { + "title": "Nova Square", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Square", + "enum": [ + "Nova Square" + ] + }, + { + "title": "Numans", + "markdownDescription": "https://fonts.google.com/specimen/Numans", + "enum": [ + "Numans" + ] + }, + { + "title": "Nunito", + "markdownDescription": "https://fonts.google.com/specimen/Nunito", + "enum": [ + "Nunito" + ] + }, + { + "title": "Nunito Sans", + "markdownDescription": "https://fonts.google.com/specimen/Nunito+Sans", + "enum": [ + "Nunito Sans" + ] + }, + { + "title": "Odibee Sans", + "markdownDescription": "https://fonts.google.com/specimen/Odibee+Sans", + "enum": [ + "Odibee Sans" + ] + }, + { + "title": "Odor Mean Chey", + "markdownDescription": "https://fonts.google.com/specimen/Odor+Mean+Chey", + "enum": [ + "Odor Mean Chey" + ] + }, + { + "title": "Offside", + "markdownDescription": "https://fonts.google.com/specimen/Offside", + "enum": [ + "Offside" + ] + }, + { + "title": "Old Standard TT", + "markdownDescription": "https://fonts.google.com/specimen/Old+Standard+TT", + "enum": [ + "Old Standard TT" + ] + }, + { + "title": "Oldenburg", + "markdownDescription": "https://fonts.google.com/specimen/Oldenburg", + "enum": [ + "Oldenburg" + ] + }, + { + "title": "Oleo Script", + "markdownDescription": "https://fonts.google.com/specimen/Oleo+Script", + "enum": [ + "Oleo Script" + ] + }, + { + "title": "Oleo Script Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Oleo+Script+Swash+Caps", + "enum": [ + "Oleo Script Swash Caps" + ] + }, + { + "title": "Open Sans", + "markdownDescription": "https://fonts.google.com/specimen/Open+Sans", + "enum": [ + "Open Sans" + ] + }, + { + "title": "Open Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Open+Sans+Condensed", + "enum": [ + "Open Sans Condensed" + ] + }, + { + "title": "Oranienbaum", + "markdownDescription": "https://fonts.google.com/specimen/Oranienbaum", + "enum": [ + "Oranienbaum" + ] + }, + { + "title": "Orbitron", + "markdownDescription": "https://fonts.google.com/specimen/Orbitron", + "enum": [ + "Orbitron" + ] + }, + { + "title": "Oregano", + "markdownDescription": "https://fonts.google.com/specimen/Oregano", + "enum": [ + "Oregano" + ] + }, + { + "title": "Orienta", + "markdownDescription": "https://fonts.google.com/specimen/Orienta", + "enum": [ + "Orienta" + ] + }, + { + "title": "Original Surfer", + "markdownDescription": "https://fonts.google.com/specimen/Original+Surfer", + "enum": [ + "Original Surfer" + ] + }, + { + "title": "Oswald", + "markdownDescription": "https://fonts.google.com/specimen/Oswald", + "enum": [ + "Oswald" + ] + }, + { + "title": "Over the Rainbow", + "markdownDescription": "https://fonts.google.com/specimen/Over+the+Rainbow", + "enum": [ + "Over the Rainbow" + ] + }, + { + "title": "Overlock", + "markdownDescription": "https://fonts.google.com/specimen/Overlock", + "enum": [ + "Overlock" + ] + }, + { + "title": "Overlock SC", + "markdownDescription": "https://fonts.google.com/specimen/Overlock+SC", + "enum": [ + "Overlock SC" + ] + }, + { + "title": "Overpass", + "markdownDescription": "https://fonts.google.com/specimen/Overpass", + "enum": [ + "Overpass" + ] + }, + { + "title": "Overpass Mono", + "markdownDescription": "https://fonts.google.com/specimen/Overpass+Mono", + "enum": [ + "Overpass Mono" + ] + }, + { + "title": "Ovo", + "markdownDescription": "https://fonts.google.com/specimen/Ovo", + "enum": [ + "Ovo" + ] + }, + { + "title": "Oxanium", + "markdownDescription": "https://fonts.google.com/specimen/Oxanium", + "enum": [ + "Oxanium" + ] + }, + { + "title": "Oxygen", + "markdownDescription": "https://fonts.google.com/specimen/Oxygen", + "enum": [ + "Oxygen" + ] + }, + { + "title": "Oxygen Mono", + "markdownDescription": "https://fonts.google.com/specimen/Oxygen+Mono", + "enum": [ + "Oxygen Mono" + ] + }, + { + "title": "PT Mono", + "markdownDescription": "https://fonts.google.com/specimen/PT+Mono", + "enum": [ + "PT Mono" + ] + }, + { + "title": "PT Sans", + "markdownDescription": "https://fonts.google.com/specimen/PT+Sans", + "enum": [ + "PT Sans" + ] + }, + { + "title": "PT Sans Caption", + "markdownDescription": "https://fonts.google.com/specimen/PT+Sans+Caption", + "enum": [ + "PT Sans Caption" + ] + }, + { + "title": "PT Sans Narrow", + "markdownDescription": "https://fonts.google.com/specimen/PT+Sans+Narrow", + "enum": [ + "PT Sans Narrow" + ] + }, + { + "title": "PT Serif", + "markdownDescription": "https://fonts.google.com/specimen/PT+Serif", + "enum": [ + "PT Serif" + ] + }, + { + "title": "PT Serif Caption", + "markdownDescription": "https://fonts.google.com/specimen/PT+Serif+Caption", + "enum": [ + "PT Serif Caption" + ] + }, + { + "title": "Pacifico", + "markdownDescription": "https://fonts.google.com/specimen/Pacifico", + "enum": [ + "Pacifico" + ] + }, + { + "title": "Padauk", + "markdownDescription": "https://fonts.google.com/specimen/Padauk", + "enum": [ + "Padauk" + ] + }, + { + "title": "Palanquin", + "markdownDescription": "https://fonts.google.com/specimen/Palanquin", + "enum": [ + "Palanquin" + ] + }, + { + "title": "Palanquin Dark", + "markdownDescription": "https://fonts.google.com/specimen/Palanquin+Dark", + "enum": [ + "Palanquin Dark" + ] + }, + { + "title": "Pangolin", + "markdownDescription": "https://fonts.google.com/specimen/Pangolin", + "enum": [ + "Pangolin" + ] + }, + { + "title": "Paprika", + "markdownDescription": "https://fonts.google.com/specimen/Paprika", + "enum": [ + "Paprika" + ] + }, + { + "title": "Parisienne", + "markdownDescription": "https://fonts.google.com/specimen/Parisienne", + "enum": [ + "Parisienne" + ] + }, + { + "title": "Passero One", + "markdownDescription": "https://fonts.google.com/specimen/Passero+One", + "enum": [ + "Passero One" + ] + }, + { + "title": "Passion One", + "markdownDescription": "https://fonts.google.com/specimen/Passion+One", + "enum": [ + "Passion One" + ] + }, + { + "title": "Pathway Gothic One", + "markdownDescription": "https://fonts.google.com/specimen/Pathway+Gothic+One", + "enum": [ + "Pathway Gothic One" + ] + }, + { + "title": "Patrick Hand", + "markdownDescription": "https://fonts.google.com/specimen/Patrick+Hand", + "enum": [ + "Patrick Hand" + ] + }, + { + "title": "Patrick Hand SC", + "markdownDescription": "https://fonts.google.com/specimen/Patrick+Hand+SC", + "enum": [ + "Patrick Hand SC" + ] + }, + { + "title": "Pattaya", + "markdownDescription": "https://fonts.google.com/specimen/Pattaya", + "enum": [ + "Pattaya" + ] + }, + { + "title": "Patua One", + "markdownDescription": "https://fonts.google.com/specimen/Patua+One", + "enum": [ + "Patua One" + ] + }, + { + "title": "Pavanam", + "markdownDescription": "https://fonts.google.com/specimen/Pavanam", + "enum": [ + "Pavanam" + ] + }, + { + "title": "Paytone One", + "markdownDescription": "https://fonts.google.com/specimen/Paytone+One", + "enum": [ + "Paytone One" + ] + }, + { + "title": "Peddana", + "markdownDescription": "https://fonts.google.com/specimen/Peddana", + "enum": [ + "Peddana" + ] + }, + { + "title": "Peralta", + "markdownDescription": "https://fonts.google.com/specimen/Peralta", + "enum": [ + "Peralta" + ] + }, + { + "title": "Permanent Marker", + "markdownDescription": "https://fonts.google.com/specimen/Permanent+Marker", + "enum": [ + "Permanent Marker" + ] + }, + { + "title": "Petit Formal Script", + "markdownDescription": "https://fonts.google.com/specimen/Petit+Formal+Script", + "enum": [ + "Petit Formal Script" + ] + }, + { + "title": "Petrona", + "markdownDescription": "https://fonts.google.com/specimen/Petrona", + "enum": [ + "Petrona" + ] + }, + { + "title": "Philosopher", + "markdownDescription": "https://fonts.google.com/specimen/Philosopher", + "enum": [ + "Philosopher" + ] + }, + { + "title": "Piazzolla", + "markdownDescription": "https://fonts.google.com/specimen/Piazzolla", + "enum": [ + "Piazzolla" + ] + }, + { + "title": "Piedra", + "markdownDescription": "https://fonts.google.com/specimen/Piedra", + "enum": [ + "Piedra" + ] + }, + { + "title": "Pinyon Script", + "markdownDescription": "https://fonts.google.com/specimen/Pinyon+Script", + "enum": [ + "Pinyon Script" + ] + }, + { + "title": "Pirata One", + "markdownDescription": "https://fonts.google.com/specimen/Pirata+One", + "enum": [ + "Pirata One" + ] + }, + { + "title": "Plaster", + "markdownDescription": "https://fonts.google.com/specimen/Plaster", + "enum": [ + "Plaster" + ] + }, + { + "title": "Play", + "markdownDescription": "https://fonts.google.com/specimen/Play", + "enum": [ + "Play" + ] + }, + { + "title": "Playball", + "markdownDescription": "https://fonts.google.com/specimen/Playball", + "enum": [ + "Playball" + ] + }, + { + "title": "Playfair Display", + "markdownDescription": "https://fonts.google.com/specimen/Playfair+Display", + "enum": [ + "Playfair Display" + ] + }, + { + "title": "Playfair Display SC", + "markdownDescription": "https://fonts.google.com/specimen/Playfair+Display+SC", + "enum": [ + "Playfair Display SC" + ] + }, + { + "title": "Podkova", + "markdownDescription": "https://fonts.google.com/specimen/Podkova", + "enum": [ + "Podkova" + ] + }, + { + "title": "Poiret One", + "markdownDescription": "https://fonts.google.com/specimen/Poiret+One", + "enum": [ + "Poiret One" + ] + }, + { + "title": "Poller One", + "markdownDescription": "https://fonts.google.com/specimen/Poller+One", + "enum": [ + "Poller One" + ] + }, + { + "title": "Poly", + "markdownDescription": "https://fonts.google.com/specimen/Poly", + "enum": [ + "Poly" + ] + }, + { + "title": "Pompiere", + "markdownDescription": "https://fonts.google.com/specimen/Pompiere", + "enum": [ + "Pompiere" + ] + }, + { + "title": "Pontano Sans", + "markdownDescription": "https://fonts.google.com/specimen/Pontano+Sans", + "enum": [ + "Pontano Sans" + ] + }, + { + "title": "Poor Story", + "markdownDescription": "https://fonts.google.com/specimen/Poor+Story", + "enum": [ + "Poor Story" + ] + }, + { + "title": "Poppins", + "markdownDescription": "https://fonts.google.com/specimen/Poppins", + "enum": [ + "Poppins" + ] + }, + { + "title": "Port Lligat Sans", + "markdownDescription": "https://fonts.google.com/specimen/Port+Lligat+Sans", + "enum": [ + "Port Lligat Sans" + ] + }, + { + "title": "Port Lligat Slab", + "markdownDescription": "https://fonts.google.com/specimen/Port+Lligat+Slab", + "enum": [ + "Port Lligat Slab" + ] + }, + { + "title": "Pragati Narrow", + "markdownDescription": "https://fonts.google.com/specimen/Pragati+Narrow", + "enum": [ + "Pragati Narrow" + ] + }, + { + "title": "Prata", + "markdownDescription": "https://fonts.google.com/specimen/Prata", + "enum": [ + "Prata" + ] + }, + { + "title": "Preahvihear", + "markdownDescription": "https://fonts.google.com/specimen/Preahvihear", + "enum": [ + "Preahvihear" + ] + }, + { + "title": "Press Start 2P", + "markdownDescription": "https://fonts.google.com/specimen/Press+Start+2P", + "enum": [ + "Press Start 2P" + ] + }, + { + "title": "Pridi", + "markdownDescription": "https://fonts.google.com/specimen/Pridi", + "enum": [ + "Pridi" + ] + }, + { + "title": "Princess Sofia", + "markdownDescription": "https://fonts.google.com/specimen/Princess+Sofia", + "enum": [ + "Princess Sofia" + ] + }, + { + "title": "Prociono", + "markdownDescription": "https://fonts.google.com/specimen/Prociono", + "enum": [ + "Prociono" + ] + }, + { + "title": "Prompt", + "markdownDescription": "https://fonts.google.com/specimen/Prompt", + "enum": [ + "Prompt" + ] + }, + { + "title": "Prosto One", + "markdownDescription": "https://fonts.google.com/specimen/Prosto+One", + "enum": [ + "Prosto One" + ] + }, + { + "title": "Proza Libre", + "markdownDescription": "https://fonts.google.com/specimen/Proza+Libre", + "enum": [ + "Proza Libre" + ] + }, + { + "title": "Public Sans", + "markdownDescription": "https://fonts.google.com/specimen/Public+Sans", + "enum": [ + "Public Sans" + ] + }, + { + "title": "Puritan", + "markdownDescription": "https://fonts.google.com/specimen/Puritan", + "enum": [ + "Puritan" + ] + }, + { + "title": "Purple Purse", + "markdownDescription": "https://fonts.google.com/specimen/Purple+Purse", + "enum": [ + "Purple Purse" + ] + }, + { + "title": "Quando", + "markdownDescription": "https://fonts.google.com/specimen/Quando", + "enum": [ + "Quando" + ] + }, + { + "title": "Quantico", + "markdownDescription": "https://fonts.google.com/specimen/Quantico", + "enum": [ + "Quantico" + ] + }, + { + "title": "Quattrocento", + "markdownDescription": "https://fonts.google.com/specimen/Quattrocento", + "enum": [ + "Quattrocento" + ] + }, + { + "title": "Quattrocento Sans", + "markdownDescription": "https://fonts.google.com/specimen/Quattrocento+Sans", + "enum": [ + "Quattrocento Sans" + ] + }, + { + "title": "Questrial", + "markdownDescription": "https://fonts.google.com/specimen/Questrial", + "enum": [ + "Questrial" + ] + }, + { + "title": "Quicksand", + "markdownDescription": "https://fonts.google.com/specimen/Quicksand", + "enum": [ + "Quicksand" + ] + }, + { + "title": "Quintessential", + "markdownDescription": "https://fonts.google.com/specimen/Quintessential", + "enum": [ + "Quintessential" + ] + }, + { + "title": "Qwigley", + "markdownDescription": "https://fonts.google.com/specimen/Qwigley", + "enum": [ + "Qwigley" + ] + }, + { + "title": "Racing Sans One", + "markdownDescription": "https://fonts.google.com/specimen/Racing+Sans+One", + "enum": [ + "Racing Sans One" + ] + }, + { + "title": "Radley", + "markdownDescription": "https://fonts.google.com/specimen/Radley", + "enum": [ + "Radley" + ] + }, + { + "title": "Rajdhani", + "markdownDescription": "https://fonts.google.com/specimen/Rajdhani", + "enum": [ + "Rajdhani" + ] + }, + { + "title": "Rakkas", + "markdownDescription": "https://fonts.google.com/specimen/Rakkas", + "enum": [ + "Rakkas" + ] + }, + { + "title": "Raleway", + "markdownDescription": "https://fonts.google.com/specimen/Raleway", + "enum": [ + "Raleway" + ] + }, + { + "title": "Raleway Dots", + "markdownDescription": "https://fonts.google.com/specimen/Raleway+Dots", + "enum": [ + "Raleway Dots" + ] + }, + { + "title": "Ramabhadra", + "markdownDescription": "https://fonts.google.com/specimen/Ramabhadra", + "enum": [ + "Ramabhadra" + ] + }, + { + "title": "Ramaraja", + "markdownDescription": "https://fonts.google.com/specimen/Ramaraja", + "enum": [ + "Ramaraja" + ] + }, + { + "title": "Rambla", + "markdownDescription": "https://fonts.google.com/specimen/Rambla", + "enum": [ + "Rambla" + ] + }, + { + "title": "Rammetto One", + "markdownDescription": "https://fonts.google.com/specimen/Rammetto+One", + "enum": [ + "Rammetto One" + ] + }, + { + "title": "Ranchers", + "markdownDescription": "https://fonts.google.com/specimen/Ranchers", + "enum": [ + "Ranchers" + ] + }, + { + "title": "Rancho", + "markdownDescription": "https://fonts.google.com/specimen/Rancho", + "enum": [ + "Rancho" + ] + }, + { + "title": "Ranga", + "markdownDescription": "https://fonts.google.com/specimen/Ranga", + "enum": [ + "Ranga" + ] + }, + { + "title": "Rasa", + "markdownDescription": "https://fonts.google.com/specimen/Rasa", + "enum": [ + "Rasa" + ] + }, + { + "title": "Rationale", + "markdownDescription": "https://fonts.google.com/specimen/Rationale", + "enum": [ + "Rationale" + ] + }, + { + "title": "Ravi Prakash", + "markdownDescription": "https://fonts.google.com/specimen/Ravi+Prakash", + "enum": [ + "Ravi Prakash" + ] + }, + { + "title": "Recursive", + "markdownDescription": "https://fonts.google.com/specimen/Recursive", + "enum": [ + "Recursive" + ] + }, + { + "title": "Red Hat Display", + "markdownDescription": "https://fonts.google.com/specimen/Red+Hat+Display", + "enum": [ + "Red Hat Display" + ] + }, + { + "title": "Red Hat Text", + "markdownDescription": "https://fonts.google.com/specimen/Red+Hat+Text", + "enum": [ + "Red Hat Text" + ] + }, + { + "title": "Red Rose", + "markdownDescription": "https://fonts.google.com/specimen/Red+Rose", + "enum": [ + "Red Rose" + ] + }, + { + "title": "Redressed", + "markdownDescription": "https://fonts.google.com/specimen/Redressed", + "enum": [ + "Redressed" + ] + }, + { + "title": "Reem Kufi", + "markdownDescription": "https://fonts.google.com/specimen/Reem+Kufi", + "enum": [ + "Reem Kufi" + ] + }, + { + "title": "Reenie Beanie", + "markdownDescription": "https://fonts.google.com/specimen/Reenie+Beanie", + "enum": [ + "Reenie Beanie" + ] + }, + { + "title": "Revalia", + "markdownDescription": "https://fonts.google.com/specimen/Revalia", + "enum": [ + "Revalia" + ] + }, + { + "title": "Rhodium Libre", + "markdownDescription": "https://fonts.google.com/specimen/Rhodium+Libre", + "enum": [ + "Rhodium Libre" + ] + }, + { + "title": "Ribeye", + "markdownDescription": "https://fonts.google.com/specimen/Ribeye", + "enum": [ + "Ribeye" + ] + }, + { + "title": "Ribeye Marrow", + "markdownDescription": "https://fonts.google.com/specimen/Ribeye+Marrow", + "enum": [ + "Ribeye Marrow" + ] + }, + { + "title": "Righteous", + "markdownDescription": "https://fonts.google.com/specimen/Righteous", + "enum": [ + "Righteous" + ] + }, + { + "title": "Risque", + "markdownDescription": "https://fonts.google.com/specimen/Risque", + "enum": [ + "Risque" + ] + }, + { + "title": "Roboto", + "markdownDescription": "https://fonts.google.com/specimen/Roboto", + "enum": [ + "Roboto" + ] + }, + { + "title": "Roboto Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Condensed", + "enum": [ + "Roboto Condensed" + ] + }, + { + "title": "Roboto Mono", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Mono", + "enum": [ + "Roboto Mono" + ] + }, + { + "title": "Roboto Slab", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Slab", + "enum": [ + "Roboto Slab" + ] + }, + { + "title": "Rochester", + "markdownDescription": "https://fonts.google.com/specimen/Rochester", + "enum": [ + "Rochester" + ] + }, + { + "title": "Rock Salt", + "markdownDescription": "https://fonts.google.com/specimen/Rock+Salt", + "enum": [ + "Rock Salt" + ] + }, + { + "title": "Rokkitt", + "markdownDescription": "https://fonts.google.com/specimen/Rokkitt", + "enum": [ + "Rokkitt" + ] + }, + { + "title": "Romanesco", + "markdownDescription": "https://fonts.google.com/specimen/Romanesco", + "enum": [ + "Romanesco" + ] + }, + { + "title": "Ropa Sans", + "markdownDescription": "https://fonts.google.com/specimen/Ropa+Sans", + "enum": [ + "Ropa Sans" + ] + }, + { + "title": "Rosario", + "markdownDescription": "https://fonts.google.com/specimen/Rosario", + "enum": [ + "Rosario" + ] + }, + { + "title": "Rosarivo", + "markdownDescription": "https://fonts.google.com/specimen/Rosarivo", + "enum": [ + "Rosarivo" + ] + }, + { + "title": "Rouge Script", + "markdownDescription": "https://fonts.google.com/specimen/Rouge+Script", + "enum": [ + "Rouge Script" + ] + }, + { + "title": "Rowdies", + "markdownDescription": "https://fonts.google.com/specimen/Rowdies", + "enum": [ + "Rowdies" + ] + }, + { + "title": "Rozha One", + "markdownDescription": "https://fonts.google.com/specimen/Rozha+One", + "enum": [ + "Rozha One" + ] + }, + { + "title": "Rubik", + "markdownDescription": "https://fonts.google.com/specimen/Rubik", + "enum": [ + "Rubik" + ] + }, + { + "title": "Rubik Mono One", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Mono+One", + "enum": [ + "Rubik Mono One" + ] + }, + { + "title": "Ruda", + "markdownDescription": "https://fonts.google.com/specimen/Ruda", + "enum": [ + "Ruda" + ] + }, + { + "title": "Rufina", + "markdownDescription": "https://fonts.google.com/specimen/Rufina", + "enum": [ + "Rufina" + ] + }, + { + "title": "Ruge Boogie", + "markdownDescription": "https://fonts.google.com/specimen/Ruge+Boogie", + "enum": [ + "Ruge Boogie" + ] + }, + { + "title": "Ruluko", + "markdownDescription": "https://fonts.google.com/specimen/Ruluko", + "enum": [ + "Ruluko" + ] + }, + { + "title": "Rum Raisin", + "markdownDescription": "https://fonts.google.com/specimen/Rum+Raisin", + "enum": [ + "Rum Raisin" + ] + }, + { + "title": "Ruslan Display", + "markdownDescription": "https://fonts.google.com/specimen/Ruslan+Display", + "enum": [ + "Ruslan Display" + ] + }, + { + "title": "Russo One", + "markdownDescription": "https://fonts.google.com/specimen/Russo+One", + "enum": [ + "Russo One" + ] + }, + { + "title": "Ruthie", + "markdownDescription": "https://fonts.google.com/specimen/Ruthie", + "enum": [ + "Ruthie" + ] + }, + { + "title": "Rye", + "markdownDescription": "https://fonts.google.com/specimen/Rye", + "enum": [ + "Rye" + ] + }, + { + "title": "Sacramento", + "markdownDescription": "https://fonts.google.com/specimen/Sacramento", + "enum": [ + "Sacramento" + ] + }, + { + "title": "Sahitya", + "markdownDescription": "https://fonts.google.com/specimen/Sahitya", + "enum": [ + "Sahitya" + ] + }, + { + "title": "Sail", + "markdownDescription": "https://fonts.google.com/specimen/Sail", + "enum": [ + "Sail" + ] + }, + { + "title": "Saira", + "markdownDescription": "https://fonts.google.com/specimen/Saira", + "enum": [ + "Saira" + ] + }, + { + "title": "Saira Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Condensed", + "enum": [ + "Saira Condensed" + ] + }, + { + "title": "Saira Extra Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Extra+Condensed", + "enum": [ + "Saira Extra Condensed" + ] + }, + { + "title": "Saira Semi Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Semi+Condensed", + "enum": [ + "Saira Semi Condensed" + ] + }, + { + "title": "Saira Stencil One", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Stencil+One", + "enum": [ + "Saira Stencil One" + ] + }, + { + "title": "Salsa", + "markdownDescription": "https://fonts.google.com/specimen/Salsa", + "enum": [ + "Salsa" + ] + }, + { + "title": "Sanchez", + "markdownDescription": "https://fonts.google.com/specimen/Sanchez", + "enum": [ + "Sanchez" + ] + }, + { + "title": "Sancreek", + "markdownDescription": "https://fonts.google.com/specimen/Sancreek", + "enum": [ + "Sancreek" + ] + }, + { + "title": "Sansita", + "markdownDescription": "https://fonts.google.com/specimen/Sansita", + "enum": [ + "Sansita" + ] + }, + { + "title": "Sansita Swashed", + "markdownDescription": "https://fonts.google.com/specimen/Sansita+Swashed", + "enum": [ + "Sansita Swashed" + ] + }, + { + "title": "Sarabun", + "markdownDescription": "https://fonts.google.com/specimen/Sarabun", + "enum": [ + "Sarabun" + ] + }, + { + "title": "Sarala", + "markdownDescription": "https://fonts.google.com/specimen/Sarala", + "enum": [ + "Sarala" + ] + }, + { + "title": "Sarina", + "markdownDescription": "https://fonts.google.com/specimen/Sarina", + "enum": [ + "Sarina" + ] + }, + { + "title": "Sarpanch", + "markdownDescription": "https://fonts.google.com/specimen/Sarpanch", + "enum": [ + "Sarpanch" + ] + }, + { + "title": "Satisfy", + "markdownDescription": "https://fonts.google.com/specimen/Satisfy", + "enum": [ + "Satisfy" + ] + }, + { + "title": "Sawarabi Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Sawarabi+Gothic", + "enum": [ + "Sawarabi Gothic" + ] + }, + { + "title": "Sawarabi Mincho", + "markdownDescription": "https://fonts.google.com/specimen/Sawarabi+Mincho", + "enum": [ + "Sawarabi Mincho" + ] + }, + { + "title": "Scada", + "markdownDescription": "https://fonts.google.com/specimen/Scada", + "enum": [ + "Scada" + ] + }, + { + "title": "Scheherazade", + "markdownDescription": "https://fonts.google.com/specimen/Scheherazade", + "enum": [ + "Scheherazade" + ] + }, + { + "title": "Schoolbell", + "markdownDescription": "https://fonts.google.com/specimen/Schoolbell", + "enum": [ + "Schoolbell" + ] + }, + { + "title": "Scope One", + "markdownDescription": "https://fonts.google.com/specimen/Scope+One", + "enum": [ + "Scope One" + ] + }, + { + "title": "Seaweed Script", + "markdownDescription": "https://fonts.google.com/specimen/Seaweed+Script", + "enum": [ + "Seaweed Script" + ] + }, + { + "title": "Secular One", + "markdownDescription": "https://fonts.google.com/specimen/Secular+One", + "enum": [ + "Secular One" + ] + }, + { + "title": "Sedgwick Ave", + "markdownDescription": "https://fonts.google.com/specimen/Sedgwick+Ave", + "enum": [ + "Sedgwick Ave" + ] + }, + { + "title": "Sedgwick Ave Display", + "markdownDescription": "https://fonts.google.com/specimen/Sedgwick+Ave+Display", + "enum": [ + "Sedgwick Ave Display" + ] + }, + { + "title": "Sen", + "markdownDescription": "https://fonts.google.com/specimen/Sen", + "enum": [ + "Sen" + ] + }, + { + "title": "Sevillana", + "markdownDescription": "https://fonts.google.com/specimen/Sevillana", + "enum": [ + "Sevillana" + ] + }, + { + "title": "Seymour One", + "markdownDescription": "https://fonts.google.com/specimen/Seymour+One", + "enum": [ + "Seymour One" + ] + }, + { + "title": "Shadows Into Light", + "markdownDescription": "https://fonts.google.com/specimen/Shadows+Into+Light", + "enum": [ + "Shadows Into Light" + ] + }, + { + "title": "Shadows Into Light Two", + "markdownDescription": "https://fonts.google.com/specimen/Shadows+Into+Light+Two", + "enum": [ + "Shadows Into Light Two" + ] + }, + { + "title": "Shanti", + "markdownDescription": "https://fonts.google.com/specimen/Shanti", + "enum": [ + "Shanti" + ] + }, + { + "title": "Share", + "markdownDescription": "https://fonts.google.com/specimen/Share", + "enum": [ + "Share" + ] + }, + { + "title": "Share Tech", + "markdownDescription": "https://fonts.google.com/specimen/Share+Tech", + "enum": [ + "Share Tech" + ] + }, + { + "title": "Share Tech Mono", + "markdownDescription": "https://fonts.google.com/specimen/Share+Tech+Mono", + "enum": [ + "Share Tech Mono" + ] + }, + { + "title": "Shojumaru", + "markdownDescription": "https://fonts.google.com/specimen/Shojumaru", + "enum": [ + "Shojumaru" + ] + }, + { + "title": "Short Stack", + "markdownDescription": "https://fonts.google.com/specimen/Short+Stack", + "enum": [ + "Short Stack" + ] + }, + { + "title": "Shrikhand", + "markdownDescription": "https://fonts.google.com/specimen/Shrikhand", + "enum": [ + "Shrikhand" + ] + }, + { + "title": "Siemreap", + "markdownDescription": "https://fonts.google.com/specimen/Siemreap", + "enum": [ + "Siemreap" + ] + }, + { + "title": "Sigmar One", + "markdownDescription": "https://fonts.google.com/specimen/Sigmar+One", + "enum": [ + "Sigmar One" + ] + }, + { + "title": "Signika", + "markdownDescription": "https://fonts.google.com/specimen/Signika", + "enum": [ + "Signika" + ] + }, + { + "title": "Signika Negative", + "markdownDescription": "https://fonts.google.com/specimen/Signika+Negative", + "enum": [ + "Signika Negative" + ] + }, + { + "title": "Simonetta", + "markdownDescription": "https://fonts.google.com/specimen/Simonetta", + "enum": [ + "Simonetta" + ] + }, + { + "title": "Single Day", + "markdownDescription": "https://fonts.google.com/specimen/Single+Day", + "enum": [ + "Single Day" + ] + }, + { + "title": "Sintony", + "markdownDescription": "https://fonts.google.com/specimen/Sintony", + "enum": [ + "Sintony" + ] + }, + { + "title": "Sirin Stencil", + "markdownDescription": "https://fonts.google.com/specimen/Sirin+Stencil", + "enum": [ + "Sirin Stencil" + ] + }, + { + "title": "Six Caps", + "markdownDescription": "https://fonts.google.com/specimen/Six+Caps", + "enum": [ + "Six Caps" + ] + }, + { + "title": "Skranji", + "markdownDescription": "https://fonts.google.com/specimen/Skranji", + "enum": [ + "Skranji" + ] + }, + { + "title": "Slabo 13px", + "markdownDescription": "https://fonts.google.com/specimen/Slabo+13px", + "enum": [ + "Slabo 13px" + ] + }, + { + "title": "Slabo 27px", + "markdownDescription": "https://fonts.google.com/specimen/Slabo+27px", + "enum": [ + "Slabo 27px" + ] + }, + { + "title": "Slackey", + "markdownDescription": "https://fonts.google.com/specimen/Slackey", + "enum": [ + "Slackey" + ] + }, + { + "title": "Smokum", + "markdownDescription": "https://fonts.google.com/specimen/Smokum", + "enum": [ + "Smokum" + ] + }, + { + "title": "Smythe", + "markdownDescription": "https://fonts.google.com/specimen/Smythe", + "enum": [ + "Smythe" + ] + }, + { + "title": "Sniglet", + "markdownDescription": "https://fonts.google.com/specimen/Sniglet", + "enum": [ + "Sniglet" + ] + }, + { + "title": "Snippet", + "markdownDescription": "https://fonts.google.com/specimen/Snippet", + "enum": [ + "Snippet" + ] + }, + { + "title": "Snowburst One", + "markdownDescription": "https://fonts.google.com/specimen/Snowburst+One", + "enum": [ + "Snowburst One" + ] + }, + { + "title": "Sofadi One", + "markdownDescription": "https://fonts.google.com/specimen/Sofadi+One", + "enum": [ + "Sofadi One" + ] + }, + { + "title": "Sofia", + "markdownDescription": "https://fonts.google.com/specimen/Sofia", + "enum": [ + "Sofia" + ] + }, + { + "title": "Solway", + "markdownDescription": "https://fonts.google.com/specimen/Solway", + "enum": [ + "Solway" + ] + }, + { + "title": "Song Myung", + "markdownDescription": "https://fonts.google.com/specimen/Song+Myung", + "enum": [ + "Song Myung" + ] + }, + { + "title": "Sonsie One", + "markdownDescription": "https://fonts.google.com/specimen/Sonsie+One", + "enum": [ + "Sonsie One" + ] + }, + { + "title": "Sora", + "markdownDescription": "https://fonts.google.com/specimen/Sora", + "enum": [ + "Sora" + ] + }, + { + "title": "Sorts Mill Goudy", + "markdownDescription": "https://fonts.google.com/specimen/Sorts+Mill+Goudy", + "enum": [ + "Sorts Mill Goudy" + ] + }, + { + "title": "Source Code Pro", + "markdownDescription": "https://fonts.google.com/specimen/Source+Code+Pro", + "enum": [ + "Source Code Pro" + ] + }, + { + "title": "Source Sans Pro", + "markdownDescription": "https://fonts.google.com/specimen/Source+Sans+Pro", + "enum": [ + "Source Sans Pro" + ] + }, + { + "title": "Source Serif Pro", + "markdownDescription": "https://fonts.google.com/specimen/Source+Serif+Pro", + "enum": [ + "Source Serif Pro" + ] + }, + { + "title": "Space Mono", + "markdownDescription": "https://fonts.google.com/specimen/Space+Mono", + "enum": [ + "Space Mono" + ] + }, + { + "title": "Spartan", + "markdownDescription": "https://fonts.google.com/specimen/Spartan", + "enum": [ + "Spartan" + ] + }, + { + "title": "Special Elite", + "markdownDescription": "https://fonts.google.com/specimen/Special+Elite", + "enum": [ + "Special Elite" + ] + }, + { + "title": "Spectral", + "markdownDescription": "https://fonts.google.com/specimen/Spectral", + "enum": [ + "Spectral" + ] + }, + { + "title": "Spectral SC", + "markdownDescription": "https://fonts.google.com/specimen/Spectral+SC", + "enum": [ + "Spectral SC" + ] + }, + { + "title": "Spicy Rice", + "markdownDescription": "https://fonts.google.com/specimen/Spicy+Rice", + "enum": [ + "Spicy Rice" + ] + }, + { + "title": "Spinnaker", + "markdownDescription": "https://fonts.google.com/specimen/Spinnaker", + "enum": [ + "Spinnaker" + ] + }, + { + "title": "Spirax", + "markdownDescription": "https://fonts.google.com/specimen/Spirax", + "enum": [ + "Spirax" + ] + }, + { + "title": "Squada One", + "markdownDescription": "https://fonts.google.com/specimen/Squada+One", + "enum": [ + "Squada One" + ] + }, + { + "title": "Sree Krushnadevaraya", + "markdownDescription": "https://fonts.google.com/specimen/Sree+Krushnadevaraya", + "enum": [ + "Sree Krushnadevaraya" + ] + }, + { + "title": "Sriracha", + "markdownDescription": "https://fonts.google.com/specimen/Sriracha", + "enum": [ + "Sriracha" + ] + }, + { + "title": "Srisakdi", + "markdownDescription": "https://fonts.google.com/specimen/Srisakdi", + "enum": [ + "Srisakdi" + ] + }, + { + "title": "Staatliches", + "markdownDescription": "https://fonts.google.com/specimen/Staatliches", + "enum": [ + "Staatliches" + ] + }, + { + "title": "Stalemate", + "markdownDescription": "https://fonts.google.com/specimen/Stalemate", + "enum": [ + "Stalemate" + ] + }, + { + "title": "Stalinist One", + "markdownDescription": "https://fonts.google.com/specimen/Stalinist+One", + "enum": [ + "Stalinist One" + ] + }, + { + "title": "Stardos Stencil", + "markdownDescription": "https://fonts.google.com/specimen/Stardos+Stencil", + "enum": [ + "Stardos Stencil" + ] + }, + { + "title": "Stint Ultra Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Stint+Ultra+Condensed", + "enum": [ + "Stint Ultra Condensed" + ] + }, + { + "title": "Stint Ultra Expanded", + "markdownDescription": "https://fonts.google.com/specimen/Stint+Ultra+Expanded", + "enum": [ + "Stint Ultra Expanded" + ] + }, + { + "title": "Stoke", + "markdownDescription": "https://fonts.google.com/specimen/Stoke", + "enum": [ + "Stoke" + ] + }, + { + "title": "Strait", + "markdownDescription": "https://fonts.google.com/specimen/Strait", + "enum": [ + "Strait" + ] + }, + { + "title": "Stylish", + "markdownDescription": "https://fonts.google.com/specimen/Stylish", + "enum": [ + "Stylish" + ] + }, + { + "title": "Sue Ellen Francisco", + "markdownDescription": "https://fonts.google.com/specimen/Sue+Ellen+Francisco", + "enum": [ + "Sue Ellen Francisco" + ] + }, + { + "title": "Suez One", + "markdownDescription": "https://fonts.google.com/specimen/Suez+One", + "enum": [ + "Suez One" + ] + }, + { + "title": "Sulphur Point", + "markdownDescription": "https://fonts.google.com/specimen/Sulphur+Point", + "enum": [ + "Sulphur Point" + ] + }, + { + "title": "Sumana", + "markdownDescription": "https://fonts.google.com/specimen/Sumana", + "enum": [ + "Sumana" + ] + }, + { + "title": "Sunflower", + "markdownDescription": "https://fonts.google.com/specimen/Sunflower", + "enum": [ + "Sunflower" + ] + }, + { + "title": "Sunshiney", + "markdownDescription": "https://fonts.google.com/specimen/Sunshiney", + "enum": [ + "Sunshiney" + ] + }, + { + "title": "Supermercado One", + "markdownDescription": "https://fonts.google.com/specimen/Supermercado+One", + "enum": [ + "Supermercado One" + ] + }, + { + "title": "Sura", + "markdownDescription": "https://fonts.google.com/specimen/Sura", + "enum": [ + "Sura" + ] + }, + { + "title": "Suranna", + "markdownDescription": "https://fonts.google.com/specimen/Suranna", + "enum": [ + "Suranna" + ] + }, + { + "title": "Suravaram", + "markdownDescription": "https://fonts.google.com/specimen/Suravaram", + "enum": [ + "Suravaram" + ] + }, + { + "title": "Suwannaphum", + "markdownDescription": "https://fonts.google.com/specimen/Suwannaphum", + "enum": [ + "Suwannaphum" + ] + }, + { + "title": "Swanky and Moo Moo", + "markdownDescription": "https://fonts.google.com/specimen/Swanky+and+Moo+Moo", + "enum": [ + "Swanky and Moo Moo" + ] + }, + { + "title": "Syncopate", + "markdownDescription": "https://fonts.google.com/specimen/Syncopate", + "enum": [ + "Syncopate" + ] + }, + { + "title": "Syne", + "markdownDescription": "https://fonts.google.com/specimen/Syne", + "enum": [ + "Syne" + ] + }, + { + "title": "Tajawal", + "markdownDescription": "https://fonts.google.com/specimen/Tajawal", + "enum": [ + "Tajawal" + ] + }, + { + "title": "Tangerine", + "markdownDescription": "https://fonts.google.com/specimen/Tangerine", + "enum": [ + "Tangerine" + ] + }, + { + "title": "Taprom", + "markdownDescription": "https://fonts.google.com/specimen/Taprom", + "enum": [ + "Taprom" + ] + }, + { + "title": "Tauri", + "markdownDescription": "https://fonts.google.com/specimen/Tauri", + "enum": [ + "Tauri" + ] + }, + { + "title": "Taviraj", + "markdownDescription": "https://fonts.google.com/specimen/Taviraj", + "enum": [ + "Taviraj" + ] + }, + { + "title": "Teko", + "markdownDescription": "https://fonts.google.com/specimen/Teko", + "enum": [ + "Teko" + ] + }, + { + "title": "Telex", + "markdownDescription": "https://fonts.google.com/specimen/Telex", + "enum": [ + "Telex" + ] + }, + { + "title": "Tenali Ramakrishna", + "markdownDescription": "https://fonts.google.com/specimen/Tenali+Ramakrishna", + "enum": [ + "Tenali Ramakrishna" + ] + }, + { + "title": "Tenor Sans", + "markdownDescription": "https://fonts.google.com/specimen/Tenor+Sans", + "enum": [ + "Tenor Sans" + ] + }, + { + "title": "Text Me One", + "markdownDescription": "https://fonts.google.com/specimen/Text+Me+One", + "enum": [ + "Text Me One" + ] + }, + { + "title": "Thasadith", + "markdownDescription": "https://fonts.google.com/specimen/Thasadith", + "enum": [ + "Thasadith" + ] + }, + { + "title": "The Girl Next Door", + "markdownDescription": "https://fonts.google.com/specimen/The+Girl+Next+Door", + "enum": [ + "The Girl Next Door" + ] + }, + { + "title": "Tienne", + "markdownDescription": "https://fonts.google.com/specimen/Tienne", + "enum": [ + "Tienne" + ] + }, + { + "title": "Tillana", + "markdownDescription": "https://fonts.google.com/specimen/Tillana", + "enum": [ + "Tillana" + ] + }, + { + "title": "Timmana", + "markdownDescription": "https://fonts.google.com/specimen/Timmana", + "enum": [ + "Timmana" + ] + }, + { + "title": "Tinos", + "markdownDescription": "https://fonts.google.com/specimen/Tinos", + "enum": [ + "Tinos" + ] + }, + { + "title": "Titan One", + "markdownDescription": "https://fonts.google.com/specimen/Titan+One", + "enum": [ + "Titan One" + ] + }, + { + "title": "Titillium Web", + "markdownDescription": "https://fonts.google.com/specimen/Titillium+Web", + "enum": [ + "Titillium Web" + ] + }, + { + "title": "Tomorrow", + "markdownDescription": "https://fonts.google.com/specimen/Tomorrow", + "enum": [ + "Tomorrow" + ] + }, + { + "title": "Trade Winds", + "markdownDescription": "https://fonts.google.com/specimen/Trade+Winds", + "enum": [ + "Trade Winds" + ] + }, + { + "title": "Trirong", + "markdownDescription": "https://fonts.google.com/specimen/Trirong", + "enum": [ + "Trirong" + ] + }, + { + "title": "Trocchi", + "markdownDescription": "https://fonts.google.com/specimen/Trocchi", + "enum": [ + "Trocchi" + ] + }, + { + "title": "Trochut", + "markdownDescription": "https://fonts.google.com/specimen/Trochut", + "enum": [ + "Trochut" + ] + }, + { + "title": "Trykker", + "markdownDescription": "https://fonts.google.com/specimen/Trykker", + "enum": [ + "Trykker" + ] + }, + { + "title": "Tulpen One", + "markdownDescription": "https://fonts.google.com/specimen/Tulpen+One", + "enum": [ + "Tulpen One" + ] + }, + { + "title": "Turret Road", + "markdownDescription": "https://fonts.google.com/specimen/Turret+Road", + "enum": [ + "Turret Road" + ] + }, + { + "title": "Ubuntu", + "markdownDescription": "https://fonts.google.com/specimen/Ubuntu", + "enum": [ + "Ubuntu" + ] + }, + { + "title": "Ubuntu Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Ubuntu+Condensed", + "enum": [ + "Ubuntu Condensed" + ] + }, + { + "title": "Ubuntu Mono", + "markdownDescription": "https://fonts.google.com/specimen/Ubuntu+Mono", + "enum": [ + "Ubuntu Mono" + ] + }, + { + "title": "Ultra", + "markdownDescription": "https://fonts.google.com/specimen/Ultra", + "enum": [ + "Ultra" + ] + }, + { + "title": "Uncial Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Uncial+Antiqua", + "enum": [ + "Uncial Antiqua" + ] + }, + { + "title": "Underdog", + "markdownDescription": "https://fonts.google.com/specimen/Underdog", + "enum": [ + "Underdog" + ] + }, + { + "title": "Unica One", + "markdownDescription": "https://fonts.google.com/specimen/Unica+One", + "enum": [ + "Unica One" + ] + }, + { + "title": "UnifrakturCook", + "markdownDescription": "https://fonts.google.com/specimen/UnifrakturCook", + "enum": [ + "UnifrakturCook" + ] + }, + { + "title": "UnifrakturMaguntia", + "markdownDescription": "https://fonts.google.com/specimen/UnifrakturMaguntia", + "enum": [ + "UnifrakturMaguntia" + ] + }, + { + "title": "Unkempt", + "markdownDescription": "https://fonts.google.com/specimen/Unkempt", + "enum": [ + "Unkempt" + ] + }, + { + "title": "Unlock", + "markdownDescription": "https://fonts.google.com/specimen/Unlock", + "enum": [ + "Unlock" + ] + }, + { + "title": "Unna", + "markdownDescription": "https://fonts.google.com/specimen/Unna", + "enum": [ + "Unna" + ] + }, + { + "title": "VT323", + "markdownDescription": "https://fonts.google.com/specimen/VT323", + "enum": [ + "VT323" + ] + }, + { + "title": "Vampiro One", + "markdownDescription": "https://fonts.google.com/specimen/Vampiro+One", + "enum": [ + "Vampiro One" + ] + }, + { + "title": "Varela", + "markdownDescription": "https://fonts.google.com/specimen/Varela", + "enum": [ + "Varela" + ] + }, + { + "title": "Varela Round", + "markdownDescription": "https://fonts.google.com/specimen/Varela+Round", + "enum": [ + "Varela Round" + ] + }, + { + "title": "Varta", + "markdownDescription": "https://fonts.google.com/specimen/Varta", + "enum": [ + "Varta" + ] + }, + { + "title": "Vast Shadow", + "markdownDescription": "https://fonts.google.com/specimen/Vast+Shadow", + "enum": [ + "Vast Shadow" + ] + }, + { + "title": "Vesper Libre", + "markdownDescription": "https://fonts.google.com/specimen/Vesper+Libre", + "enum": [ + "Vesper Libre" + ] + }, + { + "title": "Viaoda Libre", + "markdownDescription": "https://fonts.google.com/specimen/Viaoda+Libre", + "enum": [ + "Viaoda Libre" + ] + }, + { + "title": "Vibes", + "markdownDescription": "https://fonts.google.com/specimen/Vibes", + "enum": [ + "Vibes" + ] + }, + { + "title": "Vibur", + "markdownDescription": "https://fonts.google.com/specimen/Vibur", + "enum": [ + "Vibur" + ] + }, + { + "title": "Vidaloka", + "markdownDescription": "https://fonts.google.com/specimen/Vidaloka", + "enum": [ + "Vidaloka" + ] + }, + { + "title": "Viga", + "markdownDescription": "https://fonts.google.com/specimen/Viga", + "enum": [ + "Viga" + ] + }, + { + "title": "Voces", + "markdownDescription": "https://fonts.google.com/specimen/Voces", + "enum": [ + "Voces" + ] + }, + { + "title": "Volkhov", + "markdownDescription": "https://fonts.google.com/specimen/Volkhov", + "enum": [ + "Volkhov" + ] + }, + { + "title": "Vollkorn", + "markdownDescription": "https://fonts.google.com/specimen/Vollkorn", + "enum": [ + "Vollkorn" + ] + }, + { + "title": "Vollkorn SC", + "markdownDescription": "https://fonts.google.com/specimen/Vollkorn+SC", + "enum": [ + "Vollkorn SC" + ] + }, + { + "title": "Voltaire", + "markdownDescription": "https://fonts.google.com/specimen/Voltaire", + "enum": [ + "Voltaire" + ] + }, + { + "title": "Waiting for the Sunrise", + "markdownDescription": "https://fonts.google.com/specimen/Waiting+for+the+Sunrise", + "enum": [ + "Waiting for the Sunrise" + ] + }, + { + "title": "Wallpoet", + "markdownDescription": "https://fonts.google.com/specimen/Wallpoet", + "enum": [ + "Wallpoet" + ] + }, + { + "title": "Walter Turncoat", + "markdownDescription": "https://fonts.google.com/specimen/Walter+Turncoat", + "enum": [ + "Walter Turncoat" + ] + }, + { + "title": "Warnes", + "markdownDescription": "https://fonts.google.com/specimen/Warnes", + "enum": [ + "Warnes" + ] + }, + { + "title": "Wellfleet", + "markdownDescription": "https://fonts.google.com/specimen/Wellfleet", + "enum": [ + "Wellfleet" + ] + }, + { + "title": "Wendy One", + "markdownDescription": "https://fonts.google.com/specimen/Wendy+One", + "enum": [ + "Wendy One" + ] + }, + { + "title": "Wire One", + "markdownDescription": "https://fonts.google.com/specimen/Wire+One", + "enum": [ + "Wire One" + ] + }, + { + "title": "Work Sans", + "markdownDescription": "https://fonts.google.com/specimen/Work+Sans", + "enum": [ + "Work Sans" + ] + }, + { + "title": "Yanone Kaffeesatz", + "markdownDescription": "https://fonts.google.com/specimen/Yanone+Kaffeesatz", + "enum": [ + "Yanone Kaffeesatz" + ] + }, + { + "title": "Yantramanav", + "markdownDescription": "https://fonts.google.com/specimen/Yantramanav", + "enum": [ + "Yantramanav" + ] + }, + { + "title": "Yatra One", + "markdownDescription": "https://fonts.google.com/specimen/Yatra+One", + "enum": [ + "Yatra One" + ] + }, + { + "title": "Yellowtail", + "markdownDescription": "https://fonts.google.com/specimen/Yellowtail", + "enum": [ + "Yellowtail" + ] + }, + { + "title": "Yeon Sung", + "markdownDescription": "https://fonts.google.com/specimen/Yeon+Sung", + "enum": [ + "Yeon Sung" + ] + }, + { + "title": "Yeseva One", + "markdownDescription": "https://fonts.google.com/specimen/Yeseva+One", + "enum": [ + "Yeseva One" + ] + }, + { + "title": "Yesteryear", + "markdownDescription": "https://fonts.google.com/specimen/Yesteryear", + "enum": [ + "Yesteryear" + ] + }, + { + "title": "Yrsa", + "markdownDescription": "https://fonts.google.com/specimen/Yrsa", + "enum": [ + "Yrsa" + ] + }, + { + "title": "ZCOOL KuaiLe", + "markdownDescription": "https://fonts.google.com/specimen/ZCOOL+KuaiLe", + "enum": [ + "ZCOOL KuaiLe" + ] + }, + { + "title": "ZCOOL QingKe HuangYou", + "markdownDescription": "https://fonts.google.com/specimen/ZCOOL+QingKe+HuangYou", + "enum": [ + "ZCOOL QingKe HuangYou" + ] + }, + { + "title": "ZCOOL XiaoWei", + "markdownDescription": "https://fonts.google.com/specimen/ZCOOL+XiaoWei", + "enum": [ + "ZCOOL XiaoWei" + ] + }, + { + "title": "Zeyada", + "markdownDescription": "https://fonts.google.com/specimen/Zeyada", + "enum": [ + "Zeyada" + ] + }, + { + "title": "Zhi Mang Xing", + "markdownDescription": "https://fonts.google.com/specimen/Zhi+Mang+Xing", + "enum": [ + "Zhi Mang Xing" + ] + }, + { + "title": "Zilla Slab", + "markdownDescription": "https://fonts.google.com/specimen/Zilla+Slab", + "enum": [ + "Zilla Slab" + ] + }, + { + "title": "Zilla Slab Highlight", + "markdownDescription": "https://fonts.google.com/specimen/Zilla+Slab+Highlight", + "enum": [ + "Zilla Slab Highlight" + ] + } + ] +} \ No newline at end of file diff --git a/schema/assets/icons.json b/schema/assets/icons.json new file mode 100644 index 00000000..39fe4abf --- /dev/null +++ b/schema/assets/icons.json @@ -0,0 +1,9637 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Icon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/#search", + "type": "string", + "enum": [ + "fontawesome/brands/42-group", + "fontawesome/brands/500px", + "fontawesome/brands/accessible-icon", + "fontawesome/brands/accusoft", + "fontawesome/brands/adn", + "fontawesome/brands/adversal", + "fontawesome/brands/affiliatetheme", + "fontawesome/brands/airbnb", + "fontawesome/brands/algolia", + "fontawesome/brands/alipay", + "fontawesome/brands/amazon-pay", + "fontawesome/brands/amazon", + "fontawesome/brands/amilia", + "fontawesome/brands/android", + "fontawesome/brands/angellist", + "fontawesome/brands/angrycreative", + "fontawesome/brands/angular", + "fontawesome/brands/app-store-ios", + "fontawesome/brands/app-store", + "fontawesome/brands/apper", + "fontawesome/brands/apple-pay", + "fontawesome/brands/apple", + "fontawesome/brands/artstation", + "fontawesome/brands/asymmetrik", + "fontawesome/brands/atlassian", + "fontawesome/brands/audible", + "fontawesome/brands/autoprefixer", + "fontawesome/brands/avianex", + "fontawesome/brands/aviato", + "fontawesome/brands/aws", + "fontawesome/brands/bandcamp", + "fontawesome/brands/battle-net", + "fontawesome/brands/behance", + "fontawesome/brands/bilibili", + "fontawesome/brands/bimobject", + "fontawesome/brands/bitbucket", + "fontawesome/brands/bitcoin", + "fontawesome/brands/bity", + "fontawesome/brands/black-tie", + "fontawesome/brands/blackberry", + "fontawesome/brands/blogger-b", + "fontawesome/brands/blogger", + "fontawesome/brands/bluetooth-b", + "fontawesome/brands/bluetooth", + "fontawesome/brands/bootstrap", + "fontawesome/brands/bots", + "fontawesome/brands/btc", + "fontawesome/brands/buffer", + "fontawesome/brands/buromobelexperte", + "fontawesome/brands/buy-n-large", + "fontawesome/brands/buysellads", + "fontawesome/brands/canadian-maple-leaf", + "fontawesome/brands/cc-amazon-pay", + "fontawesome/brands/cc-amex", + "fontawesome/brands/cc-apple-pay", + "fontawesome/brands/cc-diners-club", + "fontawesome/brands/cc-discover", + "fontawesome/brands/cc-jcb", + "fontawesome/brands/cc-mastercard", + "fontawesome/brands/cc-paypal", + "fontawesome/brands/cc-stripe", + "fontawesome/brands/cc-visa", + "fontawesome/brands/centercode", + "fontawesome/brands/centos", + "fontawesome/brands/chrome", + "fontawesome/brands/chromecast", + "fontawesome/brands/cloudflare", + "fontawesome/brands/cloudscale", + "fontawesome/brands/cloudsmith", + "fontawesome/brands/cloudversify", + "fontawesome/brands/cmplid", + "fontawesome/brands/codepen", + "fontawesome/brands/codiepie", + "fontawesome/brands/confluence", + "fontawesome/brands/connectdevelop", + "fontawesome/brands/contao", + "fontawesome/brands/cotton-bureau", + "fontawesome/brands/cpanel", + "fontawesome/brands/creative-commons-by", + "fontawesome/brands/creative-commons-nc-eu", + "fontawesome/brands/creative-commons-nc-jp", + "fontawesome/brands/creative-commons-nc", + "fontawesome/brands/creative-commons-nd", + "fontawesome/brands/creative-commons-pd-alt", + "fontawesome/brands/creative-commons-pd", + "fontawesome/brands/creative-commons-remix", + "fontawesome/brands/creative-commons-sa", + "fontawesome/brands/creative-commons-sampling-plus", + "fontawesome/brands/creative-commons-sampling", + "fontawesome/brands/creative-commons-share", + "fontawesome/brands/creative-commons-zero", + "fontawesome/brands/creative-commons", + "fontawesome/brands/critical-role", + "fontawesome/brands/css3-alt", + "fontawesome/brands/css3", + "fontawesome/brands/cuttlefish", + "fontawesome/brands/d-and-d-beyond", + "fontawesome/brands/d-and-d", + "fontawesome/brands/dailymotion", + "fontawesome/brands/dashcube", + "fontawesome/brands/deezer", + "fontawesome/brands/delicious", + "fontawesome/brands/deploydog", + "fontawesome/brands/deskpro", + "fontawesome/brands/dev", + "fontawesome/brands/deviantart", + "fontawesome/brands/dhl", + "fontawesome/brands/diaspora", + "fontawesome/brands/digg", + "fontawesome/brands/digital-ocean", + "fontawesome/brands/discord", + "fontawesome/brands/discourse", + "fontawesome/brands/dochub", + "fontawesome/brands/docker", + "fontawesome/brands/draft2digital", + "fontawesome/brands/dribbble", + "fontawesome/brands/dropbox", + "fontawesome/brands/drupal", + "fontawesome/brands/dyalog", + "fontawesome/brands/earlybirds", + "fontawesome/brands/ebay", + "fontawesome/brands/edge-legacy", + "fontawesome/brands/edge", + "fontawesome/brands/elementor", + "fontawesome/brands/ello", + "fontawesome/brands/ember", + "fontawesome/brands/empire", + "fontawesome/brands/envira", + "fontawesome/brands/erlang", + "fontawesome/brands/ethereum", + "fontawesome/brands/etsy", + "fontawesome/brands/evernote", + "fontawesome/brands/expeditedssl", + "fontawesome/brands/facebook-f", + "fontawesome/brands/facebook-messenger", + "fontawesome/brands/facebook", + "fontawesome/brands/fantasy-flight-games", + "fontawesome/brands/fedex", + "fontawesome/brands/fedora", + "fontawesome/brands/figma", + "fontawesome/brands/firefox-browser", + "fontawesome/brands/firefox", + "fontawesome/brands/first-order-alt", + "fontawesome/brands/first-order", + "fontawesome/brands/firstdraft", + "fontawesome/brands/flickr", + "fontawesome/brands/flipboard", + "fontawesome/brands/fly", + "fontawesome/brands/font-awesome", + "fontawesome/brands/fonticons-fi", + "fontawesome/brands/fonticons", + "fontawesome/brands/fort-awesome-alt", + "fontawesome/brands/fort-awesome", + "fontawesome/brands/forumbee", + "fontawesome/brands/foursquare", + "fontawesome/brands/free-code-camp", + "fontawesome/brands/freebsd", + "fontawesome/brands/fulcrum", + "fontawesome/brands/galactic-republic", + "fontawesome/brands/galactic-senate", + "fontawesome/brands/get-pocket", + "fontawesome/brands/gg-circle", + "fontawesome/brands/gg", + "fontawesome/brands/git-alt", + "fontawesome/brands/git", + "fontawesome/brands/github-alt", + "fontawesome/brands/github", + "fontawesome/brands/gitkraken", + "fontawesome/brands/gitlab", + "fontawesome/brands/gitter", + "fontawesome/brands/glide-g", + "fontawesome/brands/glide", + "fontawesome/brands/gofore", + "fontawesome/brands/golang", + "fontawesome/brands/goodreads-g", + "fontawesome/brands/goodreads", + "fontawesome/brands/google-drive", + "fontawesome/brands/google-pay", + "fontawesome/brands/google-play", + "fontawesome/brands/google-plus-g", + "fontawesome/brands/google-plus", + "fontawesome/brands/google-wallet", + "fontawesome/brands/google", + "fontawesome/brands/gratipay", + "fontawesome/brands/grav", + "fontawesome/brands/gripfire", + "fontawesome/brands/grunt", + "fontawesome/brands/guilded", + "fontawesome/brands/gulp", + "fontawesome/brands/hacker-news", + "fontawesome/brands/hackerrank", + "fontawesome/brands/hashnode", + "fontawesome/brands/hips", + "fontawesome/brands/hire-a-helper", + "fontawesome/brands/hive", + "fontawesome/brands/hooli", + "fontawesome/brands/hornbill", + "fontawesome/brands/hotjar", + "fontawesome/brands/houzz", + "fontawesome/brands/html5", + "fontawesome/brands/hubspot", + "fontawesome/brands/ideal", + "fontawesome/brands/imdb", + "fontawesome/brands/instagram", + "fontawesome/brands/instalod", + "fontawesome/brands/intercom", + "fontawesome/brands/internet-explorer", + "fontawesome/brands/invision", + "fontawesome/brands/ioxhost", + "fontawesome/brands/itch-io", + "fontawesome/brands/itunes-note", + "fontawesome/brands/itunes", + "fontawesome/brands/java", + "fontawesome/brands/jedi-order", + "fontawesome/brands/jenkins", + "fontawesome/brands/jira", + "fontawesome/brands/joget", + "fontawesome/brands/joomla", + "fontawesome/brands/js", + "fontawesome/brands/jsfiddle", + "fontawesome/brands/kaggle", + "fontawesome/brands/keybase", + "fontawesome/brands/keycdn", + "fontawesome/brands/kickstarter-k", + "fontawesome/brands/kickstarter", + "fontawesome/brands/korvue", + "fontawesome/brands/laravel", + "fontawesome/brands/lastfm", + "fontawesome/brands/leanpub", + "fontawesome/brands/less", + "fontawesome/brands/line", + "fontawesome/brands/linkedin-in", + "fontawesome/brands/linkedin", + "fontawesome/brands/linode", + "fontawesome/brands/linux", + "fontawesome/brands/lyft", + "fontawesome/brands/magento", + "fontawesome/brands/mailchimp", + "fontawesome/brands/mandalorian", + "fontawesome/brands/markdown", + "fontawesome/brands/mastodon", + "fontawesome/brands/maxcdn", + "fontawesome/brands/mdb", + "fontawesome/brands/medapps", + "fontawesome/brands/medium", + "fontawesome/brands/medrt", + "fontawesome/brands/meetup", + "fontawesome/brands/megaport", + "fontawesome/brands/mendeley", + "fontawesome/brands/meta", + "fontawesome/brands/microblog", + "fontawesome/brands/microsoft", + "fontawesome/brands/mix", + "fontawesome/brands/mixcloud", + "fontawesome/brands/mixer", + "fontawesome/brands/mizuni", + "fontawesome/brands/modx", + "fontawesome/brands/monero", + "fontawesome/brands/napster", + "fontawesome/brands/neos", + "fontawesome/brands/nfc-directional", + "fontawesome/brands/nfc-symbol", + "fontawesome/brands/nimblr", + "fontawesome/brands/node-js", + "fontawesome/brands/node", + "fontawesome/brands/npm", + "fontawesome/brands/ns8", + "fontawesome/brands/nutritionix", + "fontawesome/brands/octopus-deploy", + "fontawesome/brands/odnoklassniki", + "fontawesome/brands/old-republic", + "fontawesome/brands/opencart", + "fontawesome/brands/openid", + "fontawesome/brands/opera", + "fontawesome/brands/optin-monster", + "fontawesome/brands/orcid", + "fontawesome/brands/osi", + "fontawesome/brands/padlet", + "fontawesome/brands/page4", + "fontawesome/brands/pagelines", + "fontawesome/brands/palfed", + "fontawesome/brands/patreon", + "fontawesome/brands/paypal", + "fontawesome/brands/perbyte", + "fontawesome/brands/periscope", + "fontawesome/brands/phabricator", + "fontawesome/brands/phoenix-framework", + "fontawesome/brands/phoenix-squadron", + "fontawesome/brands/php", + "fontawesome/brands/pied-piper-alt", + "fontawesome/brands/pied-piper-hat", + "fontawesome/brands/pied-piper-pp", + "fontawesome/brands/pied-piper", + "fontawesome/brands/pinterest-p", + "fontawesome/brands/pinterest", + "fontawesome/brands/pix", + "fontawesome/brands/playstation", + "fontawesome/brands/product-hunt", + "fontawesome/brands/pushed", + "fontawesome/brands/python", + "fontawesome/brands/qq", + "fontawesome/brands/quinscape", + "fontawesome/brands/quora", + "fontawesome/brands/r-project", + "fontawesome/brands/raspberry-pi", + "fontawesome/brands/ravelry", + "fontawesome/brands/react", + "fontawesome/brands/reacteurope", + "fontawesome/brands/readme", + "fontawesome/brands/rebel", + "fontawesome/brands/red-river", + "fontawesome/brands/reddit-alien", + "fontawesome/brands/reddit", + "fontawesome/brands/redhat", + "fontawesome/brands/renren", + "fontawesome/brands/replyd", + "fontawesome/brands/researchgate", + "fontawesome/brands/resolving", + "fontawesome/brands/rev", + "fontawesome/brands/rocketchat", + "fontawesome/brands/rockrms", + "fontawesome/brands/rust", + "fontawesome/brands/safari", + "fontawesome/brands/salesforce", + "fontawesome/brands/sass", + "fontawesome/brands/schlix", + "fontawesome/brands/screenpal", + "fontawesome/brands/scribd", + "fontawesome/brands/searchengin", + "fontawesome/brands/sellcast", + "fontawesome/brands/sellsy", + "fontawesome/brands/servicestack", + "fontawesome/brands/shirtsinbulk", + "fontawesome/brands/shopify", + "fontawesome/brands/shopware", + "fontawesome/brands/simplybuilt", + "fontawesome/brands/sistrix", + "fontawesome/brands/sith", + "fontawesome/brands/sitrox", + "fontawesome/brands/sketch", + "fontawesome/brands/skyatlas", + "fontawesome/brands/skype", + "fontawesome/brands/slack", + "fontawesome/brands/slideshare", + "fontawesome/brands/snapchat", + "fontawesome/brands/soundcloud", + "fontawesome/brands/sourcetree", + "fontawesome/brands/space-awesome", + "fontawesome/brands/speakap", + "fontawesome/brands/speaker-deck", + "fontawesome/brands/spotify", + "fontawesome/brands/square-behance", + "fontawesome/brands/square-dribbble", + "fontawesome/brands/square-facebook", + "fontawesome/brands/square-font-awesome-stroke", + "fontawesome/brands/square-font-awesome", + "fontawesome/brands/square-git", + "fontawesome/brands/square-github", + "fontawesome/brands/square-gitlab", + "fontawesome/brands/square-google-plus", + "fontawesome/brands/square-hacker-news", + "fontawesome/brands/square-instagram", + "fontawesome/brands/square-js", + "fontawesome/brands/square-lastfm", + "fontawesome/brands/square-odnoklassniki", + "fontawesome/brands/square-pied-piper", + "fontawesome/brands/square-pinterest", + "fontawesome/brands/square-reddit", + "fontawesome/brands/square-snapchat", + "fontawesome/brands/square-steam", + "fontawesome/brands/square-tumblr", + "fontawesome/brands/square-twitter", + "fontawesome/brands/square-viadeo", + "fontawesome/brands/square-vimeo", + "fontawesome/brands/square-whatsapp", + "fontawesome/brands/square-xing", + "fontawesome/brands/square-youtube", + "fontawesome/brands/squarespace", + "fontawesome/brands/stack-exchange", + "fontawesome/brands/stack-overflow", + "fontawesome/brands/stackpath", + "fontawesome/brands/staylinked", + "fontawesome/brands/steam-symbol", + "fontawesome/brands/steam", + "fontawesome/brands/sticker-mule", + "fontawesome/brands/strava", + "fontawesome/brands/stripe-s", + "fontawesome/brands/stripe", + "fontawesome/brands/studiovinari", + "fontawesome/brands/stumbleupon-circle", + "fontawesome/brands/stumbleupon", + "fontawesome/brands/superpowers", + "fontawesome/brands/supple", + "fontawesome/brands/suse", + "fontawesome/brands/swift", + "fontawesome/brands/symfony", + "fontawesome/brands/teamspeak", + "fontawesome/brands/telegram", + "fontawesome/brands/tencent-weibo", + "fontawesome/brands/the-red-yeti", + "fontawesome/brands/themeco", + "fontawesome/brands/themeisle", + "fontawesome/brands/think-peaks", + "fontawesome/brands/tiktok", + "fontawesome/brands/trade-federation", + "fontawesome/brands/trello", + "fontawesome/brands/tumblr", + "fontawesome/brands/twitch", + "fontawesome/brands/twitter", + "fontawesome/brands/typo3", + "fontawesome/brands/uber", + "fontawesome/brands/ubuntu", + "fontawesome/brands/uikit", + "fontawesome/brands/umbraco", + "fontawesome/brands/uncharted", + "fontawesome/brands/uniregistry", + "fontawesome/brands/unity", + "fontawesome/brands/unsplash", + "fontawesome/brands/untappd", + "fontawesome/brands/ups", + "fontawesome/brands/usb", + "fontawesome/brands/usps", + "fontawesome/brands/ussunnah", + "fontawesome/brands/vaadin", + "fontawesome/brands/viacoin", + "fontawesome/brands/viadeo", + "fontawesome/brands/viber", + "fontawesome/brands/vimeo-v", + "fontawesome/brands/vimeo", + "fontawesome/brands/vine", + "fontawesome/brands/vk", + "fontawesome/brands/vnv", + "fontawesome/brands/vuejs", + "fontawesome/brands/watchman-monitoring", + "fontawesome/brands/waze", + "fontawesome/brands/weebly", + "fontawesome/brands/weibo", + "fontawesome/brands/weixin", + "fontawesome/brands/whatsapp", + "fontawesome/brands/whmcs", + "fontawesome/brands/wikipedia-w", + "fontawesome/brands/windows", + "fontawesome/brands/wirsindhandwerk", + "fontawesome/brands/wix", + "fontawesome/brands/wizards-of-the-coast", + "fontawesome/brands/wodu", + "fontawesome/brands/wolf-pack-battalion", + "fontawesome/brands/wordpress-simple", + "fontawesome/brands/wordpress", + "fontawesome/brands/wpbeginner", + "fontawesome/brands/wpexplorer", + "fontawesome/brands/wpforms", + "fontawesome/brands/wpressr", + "fontawesome/brands/xbox", + "fontawesome/brands/xing", + "fontawesome/brands/y-combinator", + "fontawesome/brands/yahoo", + "fontawesome/brands/yammer", + "fontawesome/brands/yandex-international", + "fontawesome/brands/yandex", + "fontawesome/brands/yarn", + "fontawesome/brands/yelp", + "fontawesome/brands/yoast", + "fontawesome/brands/youtube", + "fontawesome/brands/zhihu", + "fontawesome/regular/address-book", + "fontawesome/regular/address-card", + "fontawesome/regular/bell-slash", + "fontawesome/regular/bell", + "fontawesome/regular/bookmark", + "fontawesome/regular/building", + "fontawesome/regular/calendar-check", + "fontawesome/regular/calendar-days", + "fontawesome/regular/calendar-minus", + "fontawesome/regular/calendar-plus", + "fontawesome/regular/calendar-xmark", + "fontawesome/regular/calendar", + "fontawesome/regular/chart-bar", + "fontawesome/regular/chess-bishop", + "fontawesome/regular/chess-king", + "fontawesome/regular/chess-knight", + "fontawesome/regular/chess-pawn", + "fontawesome/regular/chess-queen", + "fontawesome/regular/chess-rook", + "fontawesome/regular/circle-check", + "fontawesome/regular/circle-dot", + "fontawesome/regular/circle-down", + "fontawesome/regular/circle-left", + "fontawesome/regular/circle-pause", + "fontawesome/regular/circle-play", + "fontawesome/regular/circle-question", + "fontawesome/regular/circle-right", + "fontawesome/regular/circle-stop", + "fontawesome/regular/circle-up", + "fontawesome/regular/circle-user", + "fontawesome/regular/circle-xmark", + "fontawesome/regular/circle", + "fontawesome/regular/clipboard", + "fontawesome/regular/clock", + "fontawesome/regular/clone", + "fontawesome/regular/closed-captioning", + "fontawesome/regular/comment-dots", + "fontawesome/regular/comment", + "fontawesome/regular/comments", + "fontawesome/regular/compass", + "fontawesome/regular/copy", + "fontawesome/regular/copyright", + "fontawesome/regular/credit-card", + "fontawesome/regular/envelope-open", + "fontawesome/regular/envelope", + "fontawesome/regular/eye-slash", + "fontawesome/regular/eye", + "fontawesome/regular/face-angry", + "fontawesome/regular/face-dizzy", + "fontawesome/regular/face-flushed", + "fontawesome/regular/face-frown-open", + "fontawesome/regular/face-frown", + "fontawesome/regular/face-grimace", + "fontawesome/regular/face-grin-beam-sweat", + "fontawesome/regular/face-grin-beam", + "fontawesome/regular/face-grin-hearts", + "fontawesome/regular/face-grin-squint-tears", + "fontawesome/regular/face-grin-squint", + "fontawesome/regular/face-grin-stars", + "fontawesome/regular/face-grin-tears", + "fontawesome/regular/face-grin-tongue-squint", + "fontawesome/regular/face-grin-tongue-wink", + "fontawesome/regular/face-grin-tongue", + "fontawesome/regular/face-grin-wide", + "fontawesome/regular/face-grin-wink", + "fontawesome/regular/face-grin", + "fontawesome/regular/face-kiss-beam", + "fontawesome/regular/face-kiss-wink-heart", + "fontawesome/regular/face-kiss", + "fontawesome/regular/face-laugh-beam", + "fontawesome/regular/face-laugh-squint", + "fontawesome/regular/face-laugh-wink", + "fontawesome/regular/face-laugh", + "fontawesome/regular/face-meh-blank", + "fontawesome/regular/face-meh", + "fontawesome/regular/face-rolling-eyes", + "fontawesome/regular/face-sad-cry", + "fontawesome/regular/face-sad-tear", + "fontawesome/regular/face-smile-beam", + "fontawesome/regular/face-smile-wink", + "fontawesome/regular/face-smile", + "fontawesome/regular/face-surprise", + "fontawesome/regular/face-tired", + "fontawesome/regular/file-audio", + "fontawesome/regular/file-code", + "fontawesome/regular/file-excel", + "fontawesome/regular/file-image", + "fontawesome/regular/file-lines", + "fontawesome/regular/file-pdf", + "fontawesome/regular/file-powerpoint", + "fontawesome/regular/file-video", + "fontawesome/regular/file-word", + "fontawesome/regular/file-zipper", + "fontawesome/regular/file", + "fontawesome/regular/flag", + "fontawesome/regular/floppy-disk", + "fontawesome/regular/folder-closed", + "fontawesome/regular/folder-open", + "fontawesome/regular/folder", + "fontawesome/regular/font-awesome", + "fontawesome/regular/futbol", + "fontawesome/regular/gem", + "fontawesome/regular/hand-back-fist", + "fontawesome/regular/hand-lizard", + "fontawesome/regular/hand-peace", + "fontawesome/regular/hand-point-down", + "fontawesome/regular/hand-point-left", + "fontawesome/regular/hand-point-right", + "fontawesome/regular/hand-point-up", + "fontawesome/regular/hand-pointer", + "fontawesome/regular/hand-scissors", + "fontawesome/regular/hand-spock", + "fontawesome/regular/hand", + "fontawesome/regular/handshake", + "fontawesome/regular/hard-drive", + "fontawesome/regular/heart", + "fontawesome/regular/hospital", + "fontawesome/regular/hourglass-half", + "fontawesome/regular/hourglass", + "fontawesome/regular/id-badge", + "fontawesome/regular/id-card", + "fontawesome/regular/image", + "fontawesome/regular/images", + "fontawesome/regular/keyboard", + "fontawesome/regular/lemon", + "fontawesome/regular/life-ring", + "fontawesome/regular/lightbulb", + "fontawesome/regular/map", + "fontawesome/regular/message", + "fontawesome/regular/money-bill-1", + "fontawesome/regular/moon", + "fontawesome/regular/newspaper", + "fontawesome/regular/notdef", + "fontawesome/regular/note-sticky", + "fontawesome/regular/object-group", + "fontawesome/regular/object-ungroup", + "fontawesome/regular/paper-plane", + "fontawesome/regular/paste", + "fontawesome/regular/pen-to-square", + "fontawesome/regular/rectangle-list", + "fontawesome/regular/rectangle-xmark", + "fontawesome/regular/registered", + "fontawesome/regular/share-from-square", + "fontawesome/regular/snowflake", + "fontawesome/regular/square-caret-down", + "fontawesome/regular/square-caret-left", + "fontawesome/regular/square-caret-right", + "fontawesome/regular/square-caret-up", + "fontawesome/regular/square-check", + "fontawesome/regular/square-full", + "fontawesome/regular/square-minus", + "fontawesome/regular/square-plus", + "fontawesome/regular/square", + "fontawesome/regular/star-half-stroke", + "fontawesome/regular/star-half", + "fontawesome/regular/star", + "fontawesome/regular/sun", + "fontawesome/regular/thumbs-down", + "fontawesome/regular/thumbs-up", + "fontawesome/regular/trash-can", + "fontawesome/regular/user", + "fontawesome/regular/window-maximize", + "fontawesome/regular/window-minimize", + "fontawesome/regular/window-restore", + "fontawesome/solid/0", + "fontawesome/solid/1", + "fontawesome/solid/2", + "fontawesome/solid/3", + "fontawesome/solid/4", + "fontawesome/solid/5", + "fontawesome/solid/6", + "fontawesome/solid/7", + "fontawesome/solid/8", + "fontawesome/solid/9", + "fontawesome/solid/a", + "fontawesome/solid/address-book", + "fontawesome/solid/address-card", + "fontawesome/solid/align-center", + "fontawesome/solid/align-justify", + "fontawesome/solid/align-left", + "fontawesome/solid/align-right", + "fontawesome/solid/anchor-circle-check", + "fontawesome/solid/anchor-circle-exclamation", + "fontawesome/solid/anchor-circle-xmark", + "fontawesome/solid/anchor-lock", + "fontawesome/solid/anchor", + "fontawesome/solid/angle-down", + "fontawesome/solid/angle-left", + "fontawesome/solid/angle-right", + "fontawesome/solid/angle-up", + "fontawesome/solid/angles-down", + "fontawesome/solid/angles-left", + "fontawesome/solid/angles-right", + "fontawesome/solid/angles-up", + "fontawesome/solid/ankh", + "fontawesome/solid/apple-whole", + "fontawesome/solid/archway", + "fontawesome/solid/arrow-down-1-9", + "fontawesome/solid/arrow-down-9-1", + "fontawesome/solid/arrow-down-a-z", + "fontawesome/solid/arrow-down-long", + "fontawesome/solid/arrow-down-short-wide", + "fontawesome/solid/arrow-down-up-across-line", + "fontawesome/solid/arrow-down-up-lock", + "fontawesome/solid/arrow-down-wide-short", + "fontawesome/solid/arrow-down-z-a", + "fontawesome/solid/arrow-down", + "fontawesome/solid/arrow-left-long", + "fontawesome/solid/arrow-left", + "fontawesome/solid/arrow-pointer", + "fontawesome/solid/arrow-right-arrow-left", + "fontawesome/solid/arrow-right-from-bracket", + "fontawesome/solid/arrow-right-long", + "fontawesome/solid/arrow-right-to-bracket", + "fontawesome/solid/arrow-right-to-city", + "fontawesome/solid/arrow-right", + "fontawesome/solid/arrow-rotate-left", + "fontawesome/solid/arrow-rotate-right", + "fontawesome/solid/arrow-trend-down", + "fontawesome/solid/arrow-trend-up", + "fontawesome/solid/arrow-turn-down", + "fontawesome/solid/arrow-turn-up", + "fontawesome/solid/arrow-up-1-9", + "fontawesome/solid/arrow-up-9-1", + "fontawesome/solid/arrow-up-a-z", + "fontawesome/solid/arrow-up-from-bracket", + "fontawesome/solid/arrow-up-from-ground-water", + "fontawesome/solid/arrow-up-from-water-pump", + "fontawesome/solid/arrow-up-long", + "fontawesome/solid/arrow-up-right-dots", + "fontawesome/solid/arrow-up-right-from-square", + "fontawesome/solid/arrow-up-short-wide", + "fontawesome/solid/arrow-up-wide-short", + "fontawesome/solid/arrow-up-z-a", + "fontawesome/solid/arrow-up", + "fontawesome/solid/arrows-down-to-line", + "fontawesome/solid/arrows-down-to-people", + "fontawesome/solid/arrows-left-right-to-line", + "fontawesome/solid/arrows-left-right", + "fontawesome/solid/arrows-rotate", + "fontawesome/solid/arrows-spin", + "fontawesome/solid/arrows-split-up-and-left", + "fontawesome/solid/arrows-to-circle", + "fontawesome/solid/arrows-to-dot", + "fontawesome/solid/arrows-to-eye", + "fontawesome/solid/arrows-turn-right", + "fontawesome/solid/arrows-turn-to-dots", + "fontawesome/solid/arrows-up-down-left-right", + "fontawesome/solid/arrows-up-down", + "fontawesome/solid/arrows-up-to-line", + "fontawesome/solid/asterisk", + "fontawesome/solid/at", + "fontawesome/solid/atom", + "fontawesome/solid/audio-description", + "fontawesome/solid/austral-sign", + "fontawesome/solid/award", + "fontawesome/solid/b", + "fontawesome/solid/baby-carriage", + "fontawesome/solid/baby", + "fontawesome/solid/backward-fast", + "fontawesome/solid/backward-step", + "fontawesome/solid/backward", + "fontawesome/solid/bacon", + "fontawesome/solid/bacteria", + "fontawesome/solid/bacterium", + "fontawesome/solid/bag-shopping", + "fontawesome/solid/bahai", + "fontawesome/solid/baht-sign", + "fontawesome/solid/ban-smoking", + "fontawesome/solid/ban", + "fontawesome/solid/bandage", + "fontawesome/solid/barcode", + "fontawesome/solid/bars-progress", + "fontawesome/solid/bars-staggered", + "fontawesome/solid/bars", + "fontawesome/solid/baseball-bat-ball", + "fontawesome/solid/baseball", + "fontawesome/solid/basket-shopping", + "fontawesome/solid/basketball", + "fontawesome/solid/bath", + "fontawesome/solid/battery-empty", + "fontawesome/solid/battery-full", + "fontawesome/solid/battery-half", + "fontawesome/solid/battery-quarter", + "fontawesome/solid/battery-three-quarters", + "fontawesome/solid/bed-pulse", + "fontawesome/solid/bed", + "fontawesome/solid/beer-mug-empty", + "fontawesome/solid/bell-concierge", + "fontawesome/solid/bell-slash", + "fontawesome/solid/bell", + "fontawesome/solid/bezier-curve", + "fontawesome/solid/bicycle", + "fontawesome/solid/binoculars", + "fontawesome/solid/biohazard", + "fontawesome/solid/bitcoin-sign", + "fontawesome/solid/blender-phone", + "fontawesome/solid/blender", + "fontawesome/solid/blog", + "fontawesome/solid/bold", + "fontawesome/solid/bolt-lightning", + "fontawesome/solid/bolt", + "fontawesome/solid/bomb", + "fontawesome/solid/bone", + "fontawesome/solid/bong", + "fontawesome/solid/book-atlas", + "fontawesome/solid/book-bible", + "fontawesome/solid/book-bookmark", + "fontawesome/solid/book-journal-whills", + "fontawesome/solid/book-medical", + "fontawesome/solid/book-open-reader", + "fontawesome/solid/book-open", + "fontawesome/solid/book-quran", + "fontawesome/solid/book-skull", + "fontawesome/solid/book-tanakh", + "fontawesome/solid/book", + "fontawesome/solid/bookmark", + "fontawesome/solid/border-all", + "fontawesome/solid/border-none", + "fontawesome/solid/border-top-left", + "fontawesome/solid/bore-hole", + "fontawesome/solid/bottle-droplet", + "fontawesome/solid/bottle-water", + "fontawesome/solid/bowl-food", + "fontawesome/solid/bowl-rice", + "fontawesome/solid/bowling-ball", + "fontawesome/solid/box-archive", + "fontawesome/solid/box-open", + "fontawesome/solid/box-tissue", + "fontawesome/solid/box", + "fontawesome/solid/boxes-packing", + "fontawesome/solid/boxes-stacked", + "fontawesome/solid/braille", + "fontawesome/solid/brain", + "fontawesome/solid/brazilian-real-sign", + "fontawesome/solid/bread-slice", + "fontawesome/solid/bridge-circle-check", + "fontawesome/solid/bridge-circle-exclamation", + "fontawesome/solid/bridge-circle-xmark", + "fontawesome/solid/bridge-lock", + "fontawesome/solid/bridge-water", + "fontawesome/solid/bridge", + "fontawesome/solid/briefcase-medical", + "fontawesome/solid/briefcase", + "fontawesome/solid/broom-ball", + "fontawesome/solid/broom", + "fontawesome/solid/brush", + "fontawesome/solid/bucket", + "fontawesome/solid/bug-slash", + "fontawesome/solid/bug", + "fontawesome/solid/bugs", + "fontawesome/solid/building-circle-arrow-right", + "fontawesome/solid/building-circle-check", + "fontawesome/solid/building-circle-exclamation", + "fontawesome/solid/building-circle-xmark", + "fontawesome/solid/building-columns", + "fontawesome/solid/building-flag", + "fontawesome/solid/building-lock", + "fontawesome/solid/building-ngo", + "fontawesome/solid/building-shield", + "fontawesome/solid/building-un", + "fontawesome/solid/building-user", + "fontawesome/solid/building-wheat", + "fontawesome/solid/building", + "fontawesome/solid/bullhorn", + "fontawesome/solid/bullseye", + "fontawesome/solid/burger", + "fontawesome/solid/burst", + "fontawesome/solid/bus-simple", + "fontawesome/solid/bus", + "fontawesome/solid/business-time", + "fontawesome/solid/c", + "fontawesome/solid/cable-car", + "fontawesome/solid/cake-candles", + "fontawesome/solid/calculator", + "fontawesome/solid/calendar-check", + "fontawesome/solid/calendar-day", + "fontawesome/solid/calendar-days", + "fontawesome/solid/calendar-minus", + "fontawesome/solid/calendar-plus", + "fontawesome/solid/calendar-week", + "fontawesome/solid/calendar-xmark", + "fontawesome/solid/calendar", + "fontawesome/solid/camera-retro", + "fontawesome/solid/camera-rotate", + "fontawesome/solid/camera", + "fontawesome/solid/campground", + "fontawesome/solid/candy-cane", + "fontawesome/solid/cannabis", + "fontawesome/solid/capsules", + "fontawesome/solid/car-battery", + "fontawesome/solid/car-burst", + "fontawesome/solid/car-on", + "fontawesome/solid/car-rear", + "fontawesome/solid/car-side", + "fontawesome/solid/car-tunnel", + "fontawesome/solid/car", + "fontawesome/solid/caravan", + "fontawesome/solid/caret-down", + "fontawesome/solid/caret-left", + "fontawesome/solid/caret-right", + "fontawesome/solid/caret-up", + "fontawesome/solid/carrot", + "fontawesome/solid/cart-arrow-down", + "fontawesome/solid/cart-flatbed-suitcase", + "fontawesome/solid/cart-flatbed", + "fontawesome/solid/cart-plus", + "fontawesome/solid/cart-shopping", + "fontawesome/solid/cash-register", + "fontawesome/solid/cat", + "fontawesome/solid/cedi-sign", + "fontawesome/solid/cent-sign", + "fontawesome/solid/certificate", + "fontawesome/solid/chair", + "fontawesome/solid/chalkboard-user", + "fontawesome/solid/chalkboard", + "fontawesome/solid/champagne-glasses", + "fontawesome/solid/charging-station", + "fontawesome/solid/chart-area", + "fontawesome/solid/chart-bar", + "fontawesome/solid/chart-column", + "fontawesome/solid/chart-gantt", + "fontawesome/solid/chart-line", + "fontawesome/solid/chart-pie", + "fontawesome/solid/chart-simple", + "fontawesome/solid/check-double", + "fontawesome/solid/check-to-slot", + "fontawesome/solid/check", + "fontawesome/solid/cheese", + "fontawesome/solid/chess-bishop", + "fontawesome/solid/chess-board", + "fontawesome/solid/chess-king", + "fontawesome/solid/chess-knight", + "fontawesome/solid/chess-pawn", + "fontawesome/solid/chess-queen", + "fontawesome/solid/chess-rook", + "fontawesome/solid/chess", + "fontawesome/solid/chevron-down", + "fontawesome/solid/chevron-left", + "fontawesome/solid/chevron-right", + "fontawesome/solid/chevron-up", + "fontawesome/solid/child-dress", + "fontawesome/solid/child-reaching", + "fontawesome/solid/child-rifle", + "fontawesome/solid/child", + "fontawesome/solid/children", + "fontawesome/solid/church", + "fontawesome/solid/circle-arrow-down", + "fontawesome/solid/circle-arrow-left", + "fontawesome/solid/circle-arrow-right", + "fontawesome/solid/circle-arrow-up", + "fontawesome/solid/circle-check", + "fontawesome/solid/circle-chevron-down", + "fontawesome/solid/circle-chevron-left", + "fontawesome/solid/circle-chevron-right", + "fontawesome/solid/circle-chevron-up", + "fontawesome/solid/circle-dollar-to-slot", + "fontawesome/solid/circle-dot", + "fontawesome/solid/circle-down", + "fontawesome/solid/circle-exclamation", + "fontawesome/solid/circle-h", + "fontawesome/solid/circle-half-stroke", + "fontawesome/solid/circle-info", + "fontawesome/solid/circle-left", + "fontawesome/solid/circle-minus", + "fontawesome/solid/circle-nodes", + "fontawesome/solid/circle-notch", + "fontawesome/solid/circle-pause", + "fontawesome/solid/circle-play", + "fontawesome/solid/circle-plus", + "fontawesome/solid/circle-question", + "fontawesome/solid/circle-radiation", + "fontawesome/solid/circle-right", + "fontawesome/solid/circle-stop", + "fontawesome/solid/circle-up", + "fontawesome/solid/circle-user", + "fontawesome/solid/circle-xmark", + "fontawesome/solid/circle", + "fontawesome/solid/city", + "fontawesome/solid/clapperboard", + "fontawesome/solid/clipboard-check", + "fontawesome/solid/clipboard-list", + "fontawesome/solid/clipboard-question", + "fontawesome/solid/clipboard-user", + "fontawesome/solid/clipboard", + "fontawesome/solid/clock-rotate-left", + "fontawesome/solid/clock", + "fontawesome/solid/clone", + "fontawesome/solid/closed-captioning", + "fontawesome/solid/cloud-arrow-down", + "fontawesome/solid/cloud-arrow-up", + "fontawesome/solid/cloud-bolt", + "fontawesome/solid/cloud-meatball", + "fontawesome/solid/cloud-moon-rain", + "fontawesome/solid/cloud-moon", + "fontawesome/solid/cloud-rain", + "fontawesome/solid/cloud-showers-heavy", + "fontawesome/solid/cloud-showers-water", + "fontawesome/solid/cloud-sun-rain", + "fontawesome/solid/cloud-sun", + "fontawesome/solid/cloud", + "fontawesome/solid/clover", + "fontawesome/solid/code-branch", + "fontawesome/solid/code-commit", + "fontawesome/solid/code-compare", + "fontawesome/solid/code-fork", + "fontawesome/solid/code-merge", + "fontawesome/solid/code-pull-request", + "fontawesome/solid/code", + "fontawesome/solid/coins", + "fontawesome/solid/colon-sign", + "fontawesome/solid/comment-dollar", + "fontawesome/solid/comment-dots", + "fontawesome/solid/comment-medical", + "fontawesome/solid/comment-slash", + "fontawesome/solid/comment-sms", + "fontawesome/solid/comment", + "fontawesome/solid/comments-dollar", + "fontawesome/solid/comments", + "fontawesome/solid/compact-disc", + "fontawesome/solid/compass-drafting", + "fontawesome/solid/compass", + "fontawesome/solid/compress", + "fontawesome/solid/computer-mouse", + "fontawesome/solid/computer", + "fontawesome/solid/cookie-bite", + "fontawesome/solid/cookie", + "fontawesome/solid/copy", + "fontawesome/solid/copyright", + "fontawesome/solid/couch", + "fontawesome/solid/cow", + "fontawesome/solid/credit-card", + "fontawesome/solid/crop-simple", + "fontawesome/solid/crop", + "fontawesome/solid/cross", + "fontawesome/solid/crosshairs", + "fontawesome/solid/crow", + "fontawesome/solid/crown", + "fontawesome/solid/crutch", + "fontawesome/solid/cruzeiro-sign", + "fontawesome/solid/cube", + "fontawesome/solid/cubes-stacked", + "fontawesome/solid/cubes", + "fontawesome/solid/d", + "fontawesome/solid/database", + "fontawesome/solid/delete-left", + "fontawesome/solid/democrat", + "fontawesome/solid/desktop", + "fontawesome/solid/dharmachakra", + "fontawesome/solid/diagram-next", + "fontawesome/solid/diagram-predecessor", + "fontawesome/solid/diagram-project", + "fontawesome/solid/diagram-successor", + "fontawesome/solid/diamond-turn-right", + "fontawesome/solid/diamond", + "fontawesome/solid/dice-d20", + "fontawesome/solid/dice-d6", + "fontawesome/solid/dice-five", + "fontawesome/solid/dice-four", + "fontawesome/solid/dice-one", + "fontawesome/solid/dice-six", + "fontawesome/solid/dice-three", + "fontawesome/solid/dice-two", + "fontawesome/solid/dice", + "fontawesome/solid/disease", + "fontawesome/solid/display", + "fontawesome/solid/divide", + "fontawesome/solid/dna", + "fontawesome/solid/dog", + "fontawesome/solid/dollar-sign", + "fontawesome/solid/dolly", + "fontawesome/solid/dong-sign", + "fontawesome/solid/door-closed", + "fontawesome/solid/door-open", + "fontawesome/solid/dove", + "fontawesome/solid/down-left-and-up-right-to-center", + "fontawesome/solid/down-long", + "fontawesome/solid/download", + "fontawesome/solid/dragon", + "fontawesome/solid/draw-polygon", + "fontawesome/solid/droplet-slash", + "fontawesome/solid/droplet", + "fontawesome/solid/drum-steelpan", + "fontawesome/solid/drum", + "fontawesome/solid/drumstick-bite", + "fontawesome/solid/dumbbell", + "fontawesome/solid/dumpster-fire", + "fontawesome/solid/dumpster", + "fontawesome/solid/dungeon", + "fontawesome/solid/e", + "fontawesome/solid/ear-deaf", + "fontawesome/solid/ear-listen", + "fontawesome/solid/earth-africa", + "fontawesome/solid/earth-americas", + "fontawesome/solid/earth-asia", + "fontawesome/solid/earth-europe", + "fontawesome/solid/earth-oceania", + "fontawesome/solid/egg", + "fontawesome/solid/eject", + "fontawesome/solid/elevator", + "fontawesome/solid/ellipsis-vertical", + "fontawesome/solid/ellipsis", + "fontawesome/solid/envelope-circle-check", + "fontawesome/solid/envelope-open-text", + "fontawesome/solid/envelope-open", + "fontawesome/solid/envelope", + "fontawesome/solid/envelopes-bulk", + "fontawesome/solid/equals", + "fontawesome/solid/eraser", + "fontawesome/solid/ethernet", + "fontawesome/solid/euro-sign", + "fontawesome/solid/exclamation", + "fontawesome/solid/expand", + "fontawesome/solid/explosion", + "fontawesome/solid/eye-dropper", + "fontawesome/solid/eye-low-vision", + "fontawesome/solid/eye-slash", + "fontawesome/solid/eye", + "fontawesome/solid/f", + "fontawesome/solid/face-angry", + "fontawesome/solid/face-dizzy", + "fontawesome/solid/face-flushed", + "fontawesome/solid/face-frown-open", + "fontawesome/solid/face-frown", + "fontawesome/solid/face-grimace", + "fontawesome/solid/face-grin-beam-sweat", + "fontawesome/solid/face-grin-beam", + "fontawesome/solid/face-grin-hearts", + "fontawesome/solid/face-grin-squint-tears", + "fontawesome/solid/face-grin-squint", + "fontawesome/solid/face-grin-stars", + "fontawesome/solid/face-grin-tears", + "fontawesome/solid/face-grin-tongue-squint", + "fontawesome/solid/face-grin-tongue-wink", + "fontawesome/solid/face-grin-tongue", + "fontawesome/solid/face-grin-wide", + "fontawesome/solid/face-grin-wink", + "fontawesome/solid/face-grin", + "fontawesome/solid/face-kiss-beam", + "fontawesome/solid/face-kiss-wink-heart", + "fontawesome/solid/face-kiss", + "fontawesome/solid/face-laugh-beam", + "fontawesome/solid/face-laugh-squint", + "fontawesome/solid/face-laugh-wink", + "fontawesome/solid/face-laugh", + "fontawesome/solid/face-meh-blank", + "fontawesome/solid/face-meh", + "fontawesome/solid/face-rolling-eyes", + "fontawesome/solid/face-sad-cry", + "fontawesome/solid/face-sad-tear", + "fontawesome/solid/face-smile-beam", + "fontawesome/solid/face-smile-wink", + "fontawesome/solid/face-smile", + "fontawesome/solid/face-surprise", + "fontawesome/solid/face-tired", + "fontawesome/solid/fan", + "fontawesome/solid/faucet-drip", + "fontawesome/solid/faucet", + "fontawesome/solid/fax", + "fontawesome/solid/feather-pointed", + "fontawesome/solid/feather", + "fontawesome/solid/ferry", + "fontawesome/solid/file-arrow-down", + "fontawesome/solid/file-arrow-up", + "fontawesome/solid/file-audio", + "fontawesome/solid/file-circle-check", + "fontawesome/solid/file-circle-exclamation", + "fontawesome/solid/file-circle-minus", + "fontawesome/solid/file-circle-plus", + "fontawesome/solid/file-circle-question", + "fontawesome/solid/file-circle-xmark", + "fontawesome/solid/file-code", + "fontawesome/solid/file-contract", + "fontawesome/solid/file-csv", + "fontawesome/solid/file-excel", + "fontawesome/solid/file-export", + "fontawesome/solid/file-image", + "fontawesome/solid/file-import", + "fontawesome/solid/file-invoice-dollar", + "fontawesome/solid/file-invoice", + "fontawesome/solid/file-lines", + "fontawesome/solid/file-medical", + "fontawesome/solid/file-pdf", + "fontawesome/solid/file-pen", + "fontawesome/solid/file-powerpoint", + "fontawesome/solid/file-prescription", + "fontawesome/solid/file-shield", + "fontawesome/solid/file-signature", + "fontawesome/solid/file-video", + "fontawesome/solid/file-waveform", + "fontawesome/solid/file-word", + "fontawesome/solid/file-zipper", + "fontawesome/solid/file", + "fontawesome/solid/fill-drip", + "fontawesome/solid/fill", + "fontawesome/solid/film", + "fontawesome/solid/filter-circle-dollar", + "fontawesome/solid/filter-circle-xmark", + "fontawesome/solid/filter", + "fontawesome/solid/fingerprint", + "fontawesome/solid/fire-burner", + "fontawesome/solid/fire-extinguisher", + "fontawesome/solid/fire-flame-curved", + "fontawesome/solid/fire-flame-simple", + "fontawesome/solid/fire", + "fontawesome/solid/fish-fins", + "fontawesome/solid/fish", + "fontawesome/solid/flag-checkered", + "fontawesome/solid/flag-usa", + "fontawesome/solid/flag", + "fontawesome/solid/flask-vial", + "fontawesome/solid/flask", + "fontawesome/solid/floppy-disk", + "fontawesome/solid/florin-sign", + "fontawesome/solid/folder-closed", + "fontawesome/solid/folder-minus", + "fontawesome/solid/folder-open", + "fontawesome/solid/folder-plus", + "fontawesome/solid/folder-tree", + "fontawesome/solid/folder", + "fontawesome/solid/font-awesome", + "fontawesome/solid/font", + "fontawesome/solid/football", + "fontawesome/solid/forward-fast", + "fontawesome/solid/forward-step", + "fontawesome/solid/forward", + "fontawesome/solid/franc-sign", + "fontawesome/solid/frog", + "fontawesome/solid/futbol", + "fontawesome/solid/g", + "fontawesome/solid/gamepad", + "fontawesome/solid/gas-pump", + "fontawesome/solid/gauge-high", + "fontawesome/solid/gauge-simple-high", + "fontawesome/solid/gauge-simple", + "fontawesome/solid/gauge", + "fontawesome/solid/gavel", + "fontawesome/solid/gear", + "fontawesome/solid/gears", + "fontawesome/solid/gem", + "fontawesome/solid/genderless", + "fontawesome/solid/ghost", + "fontawesome/solid/gift", + "fontawesome/solid/gifts", + "fontawesome/solid/glass-water-droplet", + "fontawesome/solid/glass-water", + "fontawesome/solid/glasses", + "fontawesome/solid/globe", + "fontawesome/solid/golf-ball-tee", + "fontawesome/solid/gopuram", + "fontawesome/solid/graduation-cap", + "fontawesome/solid/greater-than-equal", + "fontawesome/solid/greater-than", + "fontawesome/solid/grip-lines-vertical", + "fontawesome/solid/grip-lines", + "fontawesome/solid/grip-vertical", + "fontawesome/solid/grip", + "fontawesome/solid/group-arrows-rotate", + "fontawesome/solid/guarani-sign", + "fontawesome/solid/guitar", + "fontawesome/solid/gun", + "fontawesome/solid/h", + "fontawesome/solid/hammer", + "fontawesome/solid/hamsa", + "fontawesome/solid/hand-back-fist", + "fontawesome/solid/hand-dots", + "fontawesome/solid/hand-fist", + "fontawesome/solid/hand-holding-dollar", + "fontawesome/solid/hand-holding-droplet", + "fontawesome/solid/hand-holding-hand", + "fontawesome/solid/hand-holding-heart", + "fontawesome/solid/hand-holding-medical", + "fontawesome/solid/hand-holding", + "fontawesome/solid/hand-lizard", + "fontawesome/solid/hand-middle-finger", + "fontawesome/solid/hand-peace", + "fontawesome/solid/hand-point-down", + "fontawesome/solid/hand-point-left", + "fontawesome/solid/hand-point-right", + "fontawesome/solid/hand-point-up", + "fontawesome/solid/hand-pointer", + "fontawesome/solid/hand-scissors", + "fontawesome/solid/hand-sparkles", + "fontawesome/solid/hand-spock", + "fontawesome/solid/hand", + "fontawesome/solid/handcuffs", + "fontawesome/solid/hands-asl-interpreting", + "fontawesome/solid/hands-bound", + "fontawesome/solid/hands-bubbles", + "fontawesome/solid/hands-clapping", + "fontawesome/solid/hands-holding-child", + "fontawesome/solid/hands-holding-circle", + "fontawesome/solid/hands-holding", + "fontawesome/solid/hands-praying", + "fontawesome/solid/hands", + "fontawesome/solid/handshake-angle", + "fontawesome/solid/handshake-simple-slash", + "fontawesome/solid/handshake-simple", + "fontawesome/solid/handshake-slash", + "fontawesome/solid/handshake", + "fontawesome/solid/hanukiah", + "fontawesome/solid/hard-drive", + "fontawesome/solid/hashtag", + "fontawesome/solid/hat-cowboy-side", + "fontawesome/solid/hat-cowboy", + "fontawesome/solid/hat-wizard", + "fontawesome/solid/head-side-cough-slash", + "fontawesome/solid/head-side-cough", + "fontawesome/solid/head-side-mask", + "fontawesome/solid/head-side-virus", + "fontawesome/solid/heading", + "fontawesome/solid/headphones-simple", + "fontawesome/solid/headphones", + "fontawesome/solid/headset", + "fontawesome/solid/heart-circle-bolt", + "fontawesome/solid/heart-circle-check", + "fontawesome/solid/heart-circle-exclamation", + "fontawesome/solid/heart-circle-minus", + "fontawesome/solid/heart-circle-plus", + "fontawesome/solid/heart-circle-xmark", + "fontawesome/solid/heart-crack", + "fontawesome/solid/heart-pulse", + "fontawesome/solid/heart", + "fontawesome/solid/helicopter-symbol", + "fontawesome/solid/helicopter", + "fontawesome/solid/helmet-safety", + "fontawesome/solid/helmet-un", + "fontawesome/solid/highlighter", + "fontawesome/solid/hill-avalanche", + "fontawesome/solid/hill-rockslide", + "fontawesome/solid/hippo", + "fontawesome/solid/hockey-puck", + "fontawesome/solid/holly-berry", + "fontawesome/solid/horse-head", + "fontawesome/solid/horse", + "fontawesome/solid/hospital-user", + "fontawesome/solid/hospital", + "fontawesome/solid/hot-tub-person", + "fontawesome/solid/hotdog", + "fontawesome/solid/hotel", + "fontawesome/solid/hourglass-end", + "fontawesome/solid/hourglass-half", + "fontawesome/solid/hourglass-start", + "fontawesome/solid/hourglass", + "fontawesome/solid/house-chimney-crack", + "fontawesome/solid/house-chimney-medical", + "fontawesome/solid/house-chimney-user", + "fontawesome/solid/house-chimney-window", + "fontawesome/solid/house-chimney", + "fontawesome/solid/house-circle-check", + "fontawesome/solid/house-circle-exclamation", + "fontawesome/solid/house-circle-xmark", + "fontawesome/solid/house-crack", + "fontawesome/solid/house-fire", + "fontawesome/solid/house-flag", + "fontawesome/solid/house-flood-water-circle-arrow-right", + "fontawesome/solid/house-flood-water", + "fontawesome/solid/house-laptop", + "fontawesome/solid/house-lock", + "fontawesome/solid/house-medical-circle-check", + "fontawesome/solid/house-medical-circle-exclamation", + "fontawesome/solid/house-medical-circle-xmark", + "fontawesome/solid/house-medical-flag", + "fontawesome/solid/house-medical", + "fontawesome/solid/house-signal", + "fontawesome/solid/house-tsunami", + "fontawesome/solid/house-user", + "fontawesome/solid/house", + "fontawesome/solid/hryvnia-sign", + "fontawesome/solid/hurricane", + "fontawesome/solid/i-cursor", + "fontawesome/solid/i", + "fontawesome/solid/ice-cream", + "fontawesome/solid/icicles", + "fontawesome/solid/icons", + "fontawesome/solid/id-badge", + "fontawesome/solid/id-card-clip", + "fontawesome/solid/id-card", + "fontawesome/solid/igloo", + "fontawesome/solid/image-portrait", + "fontawesome/solid/image", + "fontawesome/solid/images", + "fontawesome/solid/inbox", + "fontawesome/solid/indent", + "fontawesome/solid/indian-rupee-sign", + "fontawesome/solid/industry", + "fontawesome/solid/infinity", + "fontawesome/solid/info", + "fontawesome/solid/italic", + "fontawesome/solid/j", + "fontawesome/solid/jar-wheat", + "fontawesome/solid/jar", + "fontawesome/solid/jedi", + "fontawesome/solid/jet-fighter-up", + "fontawesome/solid/jet-fighter", + "fontawesome/solid/joint", + "fontawesome/solid/jug-detergent", + "fontawesome/solid/k", + "fontawesome/solid/kaaba", + "fontawesome/solid/key", + "fontawesome/solid/keyboard", + "fontawesome/solid/khanda", + "fontawesome/solid/kip-sign", + "fontawesome/solid/kit-medical", + "fontawesome/solid/kitchen-set", + "fontawesome/solid/kiwi-bird", + "fontawesome/solid/l", + "fontawesome/solid/land-mine-on", + "fontawesome/solid/landmark-dome", + "fontawesome/solid/landmark-flag", + "fontawesome/solid/landmark", + "fontawesome/solid/language", + "fontawesome/solid/laptop-code", + "fontawesome/solid/laptop-file", + "fontawesome/solid/laptop-medical", + "fontawesome/solid/laptop", + "fontawesome/solid/lari-sign", + "fontawesome/solid/layer-group", + "fontawesome/solid/leaf", + "fontawesome/solid/left-long", + "fontawesome/solid/left-right", + "fontawesome/solid/lemon", + "fontawesome/solid/less-than-equal", + "fontawesome/solid/less-than", + "fontawesome/solid/life-ring", + "fontawesome/solid/lightbulb", + "fontawesome/solid/lines-leaning", + "fontawesome/solid/link-slash", + "fontawesome/solid/link", + "fontawesome/solid/lira-sign", + "fontawesome/solid/list-check", + "fontawesome/solid/list-ol", + "fontawesome/solid/list-ul", + "fontawesome/solid/list", + "fontawesome/solid/litecoin-sign", + "fontawesome/solid/location-arrow", + "fontawesome/solid/location-crosshairs", + "fontawesome/solid/location-dot", + "fontawesome/solid/location-pin-lock", + "fontawesome/solid/location-pin", + "fontawesome/solid/lock-open", + "fontawesome/solid/lock", + "fontawesome/solid/locust", + "fontawesome/solid/lungs-virus", + "fontawesome/solid/lungs", + "fontawesome/solid/m", + "fontawesome/solid/magnet", + "fontawesome/solid/magnifying-glass-arrow-right", + "fontawesome/solid/magnifying-glass-chart", + "fontawesome/solid/magnifying-glass-dollar", + "fontawesome/solid/magnifying-glass-location", + "fontawesome/solid/magnifying-glass-minus", + "fontawesome/solid/magnifying-glass-plus", + "fontawesome/solid/magnifying-glass", + "fontawesome/solid/manat-sign", + "fontawesome/solid/map-location-dot", + "fontawesome/solid/map-location", + "fontawesome/solid/map-pin", + "fontawesome/solid/map", + "fontawesome/solid/marker", + "fontawesome/solid/mars-and-venus-burst", + "fontawesome/solid/mars-and-venus", + "fontawesome/solid/mars-double", + "fontawesome/solid/mars-stroke-right", + "fontawesome/solid/mars-stroke-up", + "fontawesome/solid/mars-stroke", + "fontawesome/solid/mars", + "fontawesome/solid/martini-glass-citrus", + "fontawesome/solid/martini-glass-empty", + "fontawesome/solid/martini-glass", + "fontawesome/solid/mask-face", + "fontawesome/solid/mask-ventilator", + "fontawesome/solid/mask", + "fontawesome/solid/masks-theater", + "fontawesome/solid/mattress-pillow", + "fontawesome/solid/maximize", + "fontawesome/solid/medal", + "fontawesome/solid/memory", + "fontawesome/solid/menorah", + "fontawesome/solid/mercury", + "fontawesome/solid/message", + "fontawesome/solid/meteor", + "fontawesome/solid/microchip", + "fontawesome/solid/microphone-lines-slash", + "fontawesome/solid/microphone-lines", + "fontawesome/solid/microphone-slash", + "fontawesome/solid/microphone", + "fontawesome/solid/microscope", + "fontawesome/solid/mill-sign", + "fontawesome/solid/minimize", + "fontawesome/solid/minus", + "fontawesome/solid/mitten", + "fontawesome/solid/mobile-button", + "fontawesome/solid/mobile-retro", + "fontawesome/solid/mobile-screen-button", + "fontawesome/solid/mobile-screen", + "fontawesome/solid/mobile", + "fontawesome/solid/money-bill-1-wave", + "fontawesome/solid/money-bill-1", + "fontawesome/solid/money-bill-transfer", + "fontawesome/solid/money-bill-trend-up", + "fontawesome/solid/money-bill-wave", + "fontawesome/solid/money-bill-wheat", + "fontawesome/solid/money-bill", + "fontawesome/solid/money-bills", + "fontawesome/solid/money-check-dollar", + "fontawesome/solid/money-check", + "fontawesome/solid/monument", + "fontawesome/solid/moon", + "fontawesome/solid/mortar-pestle", + "fontawesome/solid/mosque", + "fontawesome/solid/mosquito-net", + "fontawesome/solid/mosquito", + "fontawesome/solid/motorcycle", + "fontawesome/solid/mound", + "fontawesome/solid/mountain-city", + "fontawesome/solid/mountain-sun", + "fontawesome/solid/mountain", + "fontawesome/solid/mug-hot", + "fontawesome/solid/mug-saucer", + "fontawesome/solid/music", + "fontawesome/solid/n", + "fontawesome/solid/naira-sign", + "fontawesome/solid/network-wired", + "fontawesome/solid/neuter", + "fontawesome/solid/newspaper", + "fontawesome/solid/not-equal", + "fontawesome/solid/notdef", + "fontawesome/solid/note-sticky", + "fontawesome/solid/notes-medical", + "fontawesome/solid/o", + "fontawesome/solid/object-group", + "fontawesome/solid/object-ungroup", + "fontawesome/solid/oil-can", + "fontawesome/solid/oil-well", + "fontawesome/solid/om", + "fontawesome/solid/otter", + "fontawesome/solid/outdent", + "fontawesome/solid/p", + "fontawesome/solid/pager", + "fontawesome/solid/paint-roller", + "fontawesome/solid/paintbrush", + "fontawesome/solid/palette", + "fontawesome/solid/pallet", + "fontawesome/solid/panorama", + "fontawesome/solid/paper-plane", + "fontawesome/solid/paperclip", + "fontawesome/solid/parachute-box", + "fontawesome/solid/paragraph", + "fontawesome/solid/passport", + "fontawesome/solid/paste", + "fontawesome/solid/pause", + "fontawesome/solid/paw", + "fontawesome/solid/peace", + "fontawesome/solid/pen-clip", + "fontawesome/solid/pen-fancy", + "fontawesome/solid/pen-nib", + "fontawesome/solid/pen-ruler", + "fontawesome/solid/pen-to-square", + "fontawesome/solid/pen", + "fontawesome/solid/pencil", + "fontawesome/solid/people-arrows", + "fontawesome/solid/people-carry-box", + "fontawesome/solid/people-group", + "fontawesome/solid/people-line", + "fontawesome/solid/people-pulling", + "fontawesome/solid/people-robbery", + "fontawesome/solid/people-roof", + "fontawesome/solid/pepper-hot", + "fontawesome/solid/percent", + "fontawesome/solid/person-arrow-down-to-line", + "fontawesome/solid/person-arrow-up-from-line", + "fontawesome/solid/person-biking", + "fontawesome/solid/person-booth", + "fontawesome/solid/person-breastfeeding", + "fontawesome/solid/person-burst", + "fontawesome/solid/person-cane", + "fontawesome/solid/person-chalkboard", + "fontawesome/solid/person-circle-check", + "fontawesome/solid/person-circle-exclamation", + "fontawesome/solid/person-circle-minus", + "fontawesome/solid/person-circle-plus", + "fontawesome/solid/person-circle-question", + "fontawesome/solid/person-circle-xmark", + "fontawesome/solid/person-digging", + "fontawesome/solid/person-dots-from-line", + "fontawesome/solid/person-dress-burst", + "fontawesome/solid/person-dress", + "fontawesome/solid/person-drowning", + "fontawesome/solid/person-falling-burst", + "fontawesome/solid/person-falling", + "fontawesome/solid/person-half-dress", + "fontawesome/solid/person-harassing", + "fontawesome/solid/person-hiking", + "fontawesome/solid/person-military-pointing", + "fontawesome/solid/person-military-rifle", + "fontawesome/solid/person-military-to-person", + "fontawesome/solid/person-praying", + "fontawesome/solid/person-pregnant", + "fontawesome/solid/person-rays", + "fontawesome/solid/person-rifle", + "fontawesome/solid/person-running", + "fontawesome/solid/person-shelter", + "fontawesome/solid/person-skating", + "fontawesome/solid/person-skiing-nordic", + "fontawesome/solid/person-skiing", + "fontawesome/solid/person-snowboarding", + "fontawesome/solid/person-swimming", + "fontawesome/solid/person-through-window", + "fontawesome/solid/person-walking-arrow-loop-left", + "fontawesome/solid/person-walking-arrow-right", + "fontawesome/solid/person-walking-dashed-line-arrow-right", + "fontawesome/solid/person-walking-luggage", + "fontawesome/solid/person-walking-with-cane", + "fontawesome/solid/person-walking", + "fontawesome/solid/person", + "fontawesome/solid/peseta-sign", + "fontawesome/solid/peso-sign", + "fontawesome/solid/phone-flip", + "fontawesome/solid/phone-slash", + "fontawesome/solid/phone-volume", + "fontawesome/solid/phone", + "fontawesome/solid/photo-film", + "fontawesome/solid/piggy-bank", + "fontawesome/solid/pills", + "fontawesome/solid/pizza-slice", + "fontawesome/solid/place-of-worship", + "fontawesome/solid/plane-arrival", + "fontawesome/solid/plane-circle-check", + "fontawesome/solid/plane-circle-exclamation", + "fontawesome/solid/plane-circle-xmark", + "fontawesome/solid/plane-departure", + "fontawesome/solid/plane-lock", + "fontawesome/solid/plane-slash", + "fontawesome/solid/plane-up", + "fontawesome/solid/plane", + "fontawesome/solid/plant-wilt", + "fontawesome/solid/plate-wheat", + "fontawesome/solid/play", + "fontawesome/solid/plug-circle-bolt", + "fontawesome/solid/plug-circle-check", + "fontawesome/solid/plug-circle-exclamation", + "fontawesome/solid/plug-circle-minus", + "fontawesome/solid/plug-circle-plus", + "fontawesome/solid/plug-circle-xmark", + "fontawesome/solid/plug", + "fontawesome/solid/plus-minus", + "fontawesome/solid/plus", + "fontawesome/solid/podcast", + "fontawesome/solid/poo-storm", + "fontawesome/solid/poo", + "fontawesome/solid/poop", + "fontawesome/solid/power-off", + "fontawesome/solid/prescription-bottle-medical", + "fontawesome/solid/prescription-bottle", + "fontawesome/solid/prescription", + "fontawesome/solid/print", + "fontawesome/solid/pump-medical", + "fontawesome/solid/pump-soap", + "fontawesome/solid/puzzle-piece", + "fontawesome/solid/q", + "fontawesome/solid/qrcode", + "fontawesome/solid/question", + "fontawesome/solid/quote-left", + "fontawesome/solid/quote-right", + "fontawesome/solid/r", + "fontawesome/solid/radiation", + "fontawesome/solid/radio", + "fontawesome/solid/rainbow", + "fontawesome/solid/ranking-star", + "fontawesome/solid/receipt", + "fontawesome/solid/record-vinyl", + "fontawesome/solid/rectangle-ad", + "fontawesome/solid/rectangle-list", + "fontawesome/solid/rectangle-xmark", + "fontawesome/solid/recycle", + "fontawesome/solid/registered", + "fontawesome/solid/repeat", + "fontawesome/solid/reply-all", + "fontawesome/solid/reply", + "fontawesome/solid/republican", + "fontawesome/solid/restroom", + "fontawesome/solid/retweet", + "fontawesome/solid/ribbon", + "fontawesome/solid/right-from-bracket", + "fontawesome/solid/right-left", + "fontawesome/solid/right-long", + "fontawesome/solid/right-to-bracket", + "fontawesome/solid/ring", + "fontawesome/solid/road-barrier", + "fontawesome/solid/road-bridge", + "fontawesome/solid/road-circle-check", + "fontawesome/solid/road-circle-exclamation", + "fontawesome/solid/road-circle-xmark", + "fontawesome/solid/road-lock", + "fontawesome/solid/road-spikes", + "fontawesome/solid/road", + "fontawesome/solid/robot", + "fontawesome/solid/rocket", + "fontawesome/solid/rotate-left", + "fontawesome/solid/rotate-right", + "fontawesome/solid/rotate", + "fontawesome/solid/route", + "fontawesome/solid/rss", + "fontawesome/solid/ruble-sign", + "fontawesome/solid/rug", + "fontawesome/solid/ruler-combined", + "fontawesome/solid/ruler-horizontal", + "fontawesome/solid/ruler-vertical", + "fontawesome/solid/ruler", + "fontawesome/solid/rupee-sign", + "fontawesome/solid/rupiah-sign", + "fontawesome/solid/s", + "fontawesome/solid/sack-dollar", + "fontawesome/solid/sack-xmark", + "fontawesome/solid/sailboat", + "fontawesome/solid/satellite-dish", + "fontawesome/solid/satellite", + "fontawesome/solid/scale-balanced", + "fontawesome/solid/scale-unbalanced-flip", + "fontawesome/solid/scale-unbalanced", + "fontawesome/solid/school-circle-check", + "fontawesome/solid/school-circle-exclamation", + "fontawesome/solid/school-circle-xmark", + "fontawesome/solid/school-flag", + "fontawesome/solid/school-lock", + "fontawesome/solid/school", + "fontawesome/solid/scissors", + "fontawesome/solid/screwdriver-wrench", + "fontawesome/solid/screwdriver", + "fontawesome/solid/scroll-torah", + "fontawesome/solid/scroll", + "fontawesome/solid/sd-card", + "fontawesome/solid/section", + "fontawesome/solid/seedling", + "fontawesome/solid/server", + "fontawesome/solid/shapes", + "fontawesome/solid/share-from-square", + "fontawesome/solid/share-nodes", + "fontawesome/solid/share", + "fontawesome/solid/sheet-plastic", + "fontawesome/solid/shekel-sign", + "fontawesome/solid/shield-cat", + "fontawesome/solid/shield-dog", + "fontawesome/solid/shield-halved", + "fontawesome/solid/shield-heart", + "fontawesome/solid/shield-virus", + "fontawesome/solid/shield", + "fontawesome/solid/ship", + "fontawesome/solid/shirt", + "fontawesome/solid/shoe-prints", + "fontawesome/solid/shop-lock", + "fontawesome/solid/shop-slash", + "fontawesome/solid/shop", + "fontawesome/solid/shower", + "fontawesome/solid/shrimp", + "fontawesome/solid/shuffle", + "fontawesome/solid/shuttle-space", + "fontawesome/solid/sign-hanging", + "fontawesome/solid/signal", + "fontawesome/solid/signature", + "fontawesome/solid/signs-post", + "fontawesome/solid/sim-card", + "fontawesome/solid/sink", + "fontawesome/solid/sitemap", + "fontawesome/solid/skull-crossbones", + "fontawesome/solid/skull", + "fontawesome/solid/slash", + "fontawesome/solid/sleigh", + "fontawesome/solid/sliders", + "fontawesome/solid/smog", + "fontawesome/solid/smoking", + "fontawesome/solid/snowflake", + "fontawesome/solid/snowman", + "fontawesome/solid/snowplow", + "fontawesome/solid/soap", + "fontawesome/solid/socks", + "fontawesome/solid/solar-panel", + "fontawesome/solid/sort-down", + "fontawesome/solid/sort-up", + "fontawesome/solid/sort", + "fontawesome/solid/spa", + "fontawesome/solid/spaghetti-monster-flying", + "fontawesome/solid/spell-check", + "fontawesome/solid/spider", + "fontawesome/solid/spinner", + "fontawesome/solid/splotch", + "fontawesome/solid/spoon", + "fontawesome/solid/spray-can-sparkles", + "fontawesome/solid/spray-can", + "fontawesome/solid/square-arrow-up-right", + "fontawesome/solid/square-caret-down", + "fontawesome/solid/square-caret-left", + "fontawesome/solid/square-caret-right", + "fontawesome/solid/square-caret-up", + "fontawesome/solid/square-check", + "fontawesome/solid/square-envelope", + "fontawesome/solid/square-full", + "fontawesome/solid/square-h", + "fontawesome/solid/square-minus", + "fontawesome/solid/square-nfi", + "fontawesome/solid/square-parking", + "fontawesome/solid/square-pen", + "fontawesome/solid/square-person-confined", + "fontawesome/solid/square-phone-flip", + "fontawesome/solid/square-phone", + "fontawesome/solid/square-plus", + "fontawesome/solid/square-poll-horizontal", + "fontawesome/solid/square-poll-vertical", + "fontawesome/solid/square-root-variable", + "fontawesome/solid/square-rss", + "fontawesome/solid/square-share-nodes", + "fontawesome/solid/square-up-right", + "fontawesome/solid/square-virus", + "fontawesome/solid/square-xmark", + "fontawesome/solid/square", + "fontawesome/solid/staff-snake", + "fontawesome/solid/stairs", + "fontawesome/solid/stamp", + "fontawesome/solid/stapler", + "fontawesome/solid/star-and-crescent", + "fontawesome/solid/star-half-stroke", + "fontawesome/solid/star-half", + "fontawesome/solid/star-of-david", + "fontawesome/solid/star-of-life", + "fontawesome/solid/star", + "fontawesome/solid/sterling-sign", + "fontawesome/solid/stethoscope", + "fontawesome/solid/stop", + "fontawesome/solid/stopwatch-20", + "fontawesome/solid/stopwatch", + "fontawesome/solid/store-slash", + "fontawesome/solid/store", + "fontawesome/solid/street-view", + "fontawesome/solid/strikethrough", + "fontawesome/solid/stroopwafel", + "fontawesome/solid/subscript", + "fontawesome/solid/suitcase-medical", + "fontawesome/solid/suitcase-rolling", + "fontawesome/solid/suitcase", + "fontawesome/solid/sun-plant-wilt", + "fontawesome/solid/sun", + "fontawesome/solid/superscript", + "fontawesome/solid/swatchbook", + "fontawesome/solid/synagogue", + "fontawesome/solid/syringe", + "fontawesome/solid/t", + "fontawesome/solid/table-cells-large", + "fontawesome/solid/table-cells", + "fontawesome/solid/table-columns", + "fontawesome/solid/table-list", + "fontawesome/solid/table-tennis-paddle-ball", + "fontawesome/solid/table", + "fontawesome/solid/tablet-button", + "fontawesome/solid/tablet-screen-button", + "fontawesome/solid/tablet", + "fontawesome/solid/tablets", + "fontawesome/solid/tachograph-digital", + "fontawesome/solid/tag", + "fontawesome/solid/tags", + "fontawesome/solid/tape", + "fontawesome/solid/tarp-droplet", + "fontawesome/solid/tarp", + "fontawesome/solid/taxi", + "fontawesome/solid/teeth-open", + "fontawesome/solid/teeth", + "fontawesome/solid/temperature-arrow-down", + "fontawesome/solid/temperature-arrow-up", + "fontawesome/solid/temperature-empty", + "fontawesome/solid/temperature-full", + "fontawesome/solid/temperature-half", + "fontawesome/solid/temperature-high", + "fontawesome/solid/temperature-low", + "fontawesome/solid/temperature-quarter", + "fontawesome/solid/temperature-three-quarters", + "fontawesome/solid/tenge-sign", + "fontawesome/solid/tent-arrow-down-to-line", + "fontawesome/solid/tent-arrow-left-right", + "fontawesome/solid/tent-arrow-turn-left", + "fontawesome/solid/tent-arrows-down", + "fontawesome/solid/tent", + "fontawesome/solid/tents", + "fontawesome/solid/terminal", + "fontawesome/solid/text-height", + "fontawesome/solid/text-slash", + "fontawesome/solid/text-width", + "fontawesome/solid/thermometer", + "fontawesome/solid/thumbs-down", + "fontawesome/solid/thumbs-up", + "fontawesome/solid/thumbtack", + "fontawesome/solid/ticket-simple", + "fontawesome/solid/ticket", + "fontawesome/solid/timeline", + "fontawesome/solid/toggle-off", + "fontawesome/solid/toggle-on", + "fontawesome/solid/toilet-paper-slash", + "fontawesome/solid/toilet-paper", + "fontawesome/solid/toilet-portable", + "fontawesome/solid/toilet", + "fontawesome/solid/toilets-portable", + "fontawesome/solid/toolbox", + "fontawesome/solid/tooth", + "fontawesome/solid/torii-gate", + "fontawesome/solid/tornado", + "fontawesome/solid/tower-broadcast", + "fontawesome/solid/tower-cell", + "fontawesome/solid/tower-observation", + "fontawesome/solid/tractor", + "fontawesome/solid/trademark", + "fontawesome/solid/traffic-light", + "fontawesome/solid/trailer", + "fontawesome/solid/train-subway", + "fontawesome/solid/train-tram", + "fontawesome/solid/train", + "fontawesome/solid/transgender", + "fontawesome/solid/trash-arrow-up", + "fontawesome/solid/trash-can-arrow-up", + "fontawesome/solid/trash-can", + "fontawesome/solid/trash", + "fontawesome/solid/tree-city", + "fontawesome/solid/tree", + "fontawesome/solid/triangle-exclamation", + "fontawesome/solid/trophy", + "fontawesome/solid/trowel-bricks", + "fontawesome/solid/trowel", + "fontawesome/solid/truck-arrow-right", + "fontawesome/solid/truck-droplet", + "fontawesome/solid/truck-fast", + "fontawesome/solid/truck-field-un", + "fontawesome/solid/truck-field", + "fontawesome/solid/truck-front", + "fontawesome/solid/truck-medical", + "fontawesome/solid/truck-monster", + "fontawesome/solid/truck-moving", + "fontawesome/solid/truck-pickup", + "fontawesome/solid/truck-plane", + "fontawesome/solid/truck-ramp-box", + "fontawesome/solid/truck", + "fontawesome/solid/tty", + "fontawesome/solid/turkish-lira-sign", + "fontawesome/solid/turn-down", + "fontawesome/solid/turn-up", + "fontawesome/solid/tv", + "fontawesome/solid/u", + "fontawesome/solid/umbrella-beach", + "fontawesome/solid/umbrella", + "fontawesome/solid/underline", + "fontawesome/solid/universal-access", + "fontawesome/solid/unlock-keyhole", + "fontawesome/solid/unlock", + "fontawesome/solid/up-down-left-right", + "fontawesome/solid/up-down", + "fontawesome/solid/up-long", + "fontawesome/solid/up-right-and-down-left-from-center", + "fontawesome/solid/up-right-from-square", + "fontawesome/solid/upload", + "fontawesome/solid/user-astronaut", + "fontawesome/solid/user-check", + "fontawesome/solid/user-clock", + "fontawesome/solid/user-doctor", + "fontawesome/solid/user-gear", + "fontawesome/solid/user-graduate", + "fontawesome/solid/user-group", + "fontawesome/solid/user-injured", + "fontawesome/solid/user-large-slash", + "fontawesome/solid/user-large", + "fontawesome/solid/user-lock", + "fontawesome/solid/user-minus", + "fontawesome/solid/user-ninja", + "fontawesome/solid/user-nurse", + "fontawesome/solid/user-pen", + "fontawesome/solid/user-plus", + "fontawesome/solid/user-secret", + "fontawesome/solid/user-shield", + "fontawesome/solid/user-slash", + "fontawesome/solid/user-tag", + "fontawesome/solid/user-tie", + "fontawesome/solid/user-xmark", + "fontawesome/solid/user", + "fontawesome/solid/users-between-lines", + "fontawesome/solid/users-gear", + "fontawesome/solid/users-line", + "fontawesome/solid/users-rays", + "fontawesome/solid/users-rectangle", + "fontawesome/solid/users-slash", + "fontawesome/solid/users-viewfinder", + "fontawesome/solid/users", + "fontawesome/solid/utensils", + "fontawesome/solid/v", + "fontawesome/solid/van-shuttle", + "fontawesome/solid/vault", + "fontawesome/solid/vector-square", + "fontawesome/solid/venus-double", + "fontawesome/solid/venus-mars", + "fontawesome/solid/venus", + "fontawesome/solid/vest-patches", + "fontawesome/solid/vest", + "fontawesome/solid/vial-circle-check", + "fontawesome/solid/vial-virus", + "fontawesome/solid/vial", + "fontawesome/solid/vials", + "fontawesome/solid/video-slash", + "fontawesome/solid/video", + "fontawesome/solid/vihara", + "fontawesome/solid/virus-covid-slash", + "fontawesome/solid/virus-covid", + "fontawesome/solid/virus-slash", + "fontawesome/solid/virus", + "fontawesome/solid/viruses", + "fontawesome/solid/voicemail", + "fontawesome/solid/volcano", + "fontawesome/solid/volleyball", + "fontawesome/solid/volume-high", + "fontawesome/solid/volume-low", + "fontawesome/solid/volume-off", + "fontawesome/solid/volume-xmark", + "fontawesome/solid/vr-cardboard", + "fontawesome/solid/w", + "fontawesome/solid/walkie-talkie", + "fontawesome/solid/wallet", + "fontawesome/solid/wand-magic-sparkles", + "fontawesome/solid/wand-magic", + "fontawesome/solid/wand-sparkles", + "fontawesome/solid/warehouse", + "fontawesome/solid/water-ladder", + "fontawesome/solid/water", + "fontawesome/solid/wave-square", + "fontawesome/solid/weight-hanging", + "fontawesome/solid/weight-scale", + "fontawesome/solid/wheat-awn-circle-exclamation", + "fontawesome/solid/wheat-awn", + "fontawesome/solid/wheelchair-move", + "fontawesome/solid/wheelchair", + "fontawesome/solid/whiskey-glass", + "fontawesome/solid/wifi", + "fontawesome/solid/wind", + "fontawesome/solid/window-maximize", + "fontawesome/solid/window-minimize", + "fontawesome/solid/window-restore", + "fontawesome/solid/wine-bottle", + "fontawesome/solid/wine-glass-empty", + "fontawesome/solid/wine-glass", + "fontawesome/solid/won-sign", + "fontawesome/solid/worm", + "fontawesome/solid/wrench", + "fontawesome/solid/x-ray", + "fontawesome/solid/x", + "fontawesome/solid/xmark", + "fontawesome/solid/xmarks-lines", + "fontawesome/solid/y", + "fontawesome/solid/yen-sign", + "fontawesome/solid/yin-yang", + "fontawesome/solid/z", + "logo", + "material/ab-testing", + "material/abacus", + "material/abjad-arabic", + "material/abjad-hebrew", + "material/abugida-devanagari", + "material/abugida-thai", + "material/access-point-check", + "material/access-point-minus", + "material/access-point-network-off", + "material/access-point-network", + "material/access-point-off", + "material/access-point-plus", + "material/access-point-remove", + "material/access-point", + "material/account-alert-outline", + "material/account-alert", + "material/account-arrow-down-outline", + "material/account-arrow-down", + "material/account-arrow-left-outline", + "material/account-arrow-left", + "material/account-arrow-right-outline", + "material/account-arrow-right", + "material/account-arrow-up-outline", + "material/account-arrow-up", + "material/account-badge-outline", + "material/account-badge", + "material/account-box-multiple-outline", + "material/account-box-multiple", + "material/account-box-outline", + "material/account-box", + "material/account-cancel-outline", + "material/account-cancel", + "material/account-card-outline", + "material/account-card", + "material/account-cash-outline", + "material/account-cash", + "material/account-check-outline", + "material/account-check", + "material/account-child-circle", + "material/account-child-outline", + "material/account-child", + "material/account-circle-outline", + "material/account-circle", + "material/account-clock-outline", + "material/account-clock", + "material/account-cog-outline", + "material/account-cog", + "material/account-convert-outline", + "material/account-convert", + "material/account-cowboy-hat-outline", + "material/account-cowboy-hat", + "material/account-credit-card-outline", + "material/account-credit-card", + "material/account-details-outline", + "material/account-details", + "material/account-edit-outline", + "material/account-edit", + "material/account-eye-outline", + "material/account-eye", + "material/account-filter-outline", + "material/account-filter", + "material/account-group-outline", + "material/account-group", + "material/account-hard-hat-outline", + "material/account-hard-hat", + "material/account-heart-outline", + "material/account-heart", + "material/account-injury-outline", + "material/account-injury", + "material/account-key-outline", + "material/account-key", + "material/account-lock-open-outline", + "material/account-lock-open", + "material/account-lock-outline", + "material/account-lock", + "material/account-minus-outline", + "material/account-minus", + "material/account-multiple-check-outline", + "material/account-multiple-check", + "material/account-multiple-minus-outline", + "material/account-multiple-minus", + "material/account-multiple-outline", + "material/account-multiple-plus-outline", + "material/account-multiple-plus", + "material/account-multiple-remove-outline", + "material/account-multiple-remove", + "material/account-multiple", + "material/account-music-outline", + "material/account-music", + "material/account-network-off-outline", + "material/account-network-off", + "material/account-network-outline", + "material/account-network", + "material/account-off-outline", + "material/account-off", + "material/account-outline", + "material/account-plus-outline", + "material/account-plus", + "material/account-question-outline", + "material/account-question", + "material/account-reactivate-outline", + "material/account-reactivate", + "material/account-remove-outline", + "material/account-remove", + "material/account-school-outline", + "material/account-school", + "material/account-search-outline", + "material/account-search", + "material/account-settings-outline", + "material/account-settings", + "material/account-star-outline", + "material/account-star", + "material/account-supervisor-circle-outline", + "material/account-supervisor-circle", + "material/account-supervisor-outline", + "material/account-supervisor", + "material/account-switch-outline", + "material/account-switch", + "material/account-sync-outline", + "material/account-sync", + "material/account-tie-hat-outline", + "material/account-tie-hat", + "material/account-tie-outline", + "material/account-tie-voice-off-outline", + "material/account-tie-voice-off", + "material/account-tie-voice-outline", + "material/account-tie-voice", + "material/account-tie-woman", + "material/account-tie", + "material/account-voice-off", + "material/account-voice", + "material/account-wrench-outline", + "material/account-wrench", + "material/account", + "material/adjust", + "material/advertisements-off", + "material/advertisements", + "material/air-conditioner", + "material/air-filter", + "material/air-horn", + "material/air-humidifier-off", + "material/air-humidifier", + "material/air-purifier-off", + "material/air-purifier", + "material/airbag", + "material/airballoon-outline", + "material/airballoon", + "material/airplane-alert", + "material/airplane-check", + "material/airplane-clock", + "material/airplane-cog", + "material/airplane-edit", + "material/airplane-landing", + "material/airplane-marker", + "material/airplane-minus", + "material/airplane-off", + "material/airplane-plus", + "material/airplane-remove", + "material/airplane-search", + "material/airplane-settings", + "material/airplane-takeoff", + "material/airplane", + "material/airport", + "material/alarm-bell", + "material/alarm-check", + "material/alarm-light-off-outline", + "material/alarm-light-off", + "material/alarm-light-outline", + "material/alarm-light", + "material/alarm-multiple", + "material/alarm-note-off", + "material/alarm-note", + "material/alarm-off", + "material/alarm-panel-outline", + "material/alarm-panel", + "material/alarm-plus", + "material/alarm-snooze", + "material/alarm", + "material/album", + "material/alert-box-outline", + "material/alert-box", + "material/alert-circle-check-outline", + "material/alert-circle-check", + "material/alert-circle-outline", + "material/alert-circle", + "material/alert-decagram-outline", + "material/alert-decagram", + "material/alert-minus-outline", + "material/alert-minus", + "material/alert-octagon-outline", + "material/alert-octagon", + "material/alert-octagram-outline", + "material/alert-octagram", + "material/alert-outline", + "material/alert-plus-outline", + "material/alert-plus", + "material/alert-remove-outline", + "material/alert-remove", + "material/alert-rhombus-outline", + "material/alert-rhombus", + "material/alert", + "material/alien-outline", + "material/alien", + "material/align-horizontal-center", + "material/align-horizontal-distribute", + "material/align-horizontal-left", + "material/align-horizontal-right", + "material/align-vertical-bottom", + "material/align-vertical-center", + "material/align-vertical-distribute", + "material/align-vertical-top", + "material/all-inclusive-box-outline", + "material/all-inclusive-box", + "material/all-inclusive", + "material/allergy", + "material/alpha-a-box-outline", + "material/alpha-a-box", + "material/alpha-a-circle-outline", + "material/alpha-a-circle", + "material/alpha-a", + "material/alpha-b-box-outline", + "material/alpha-b-box", + "material/alpha-b-circle-outline", + "material/alpha-b-circle", + "material/alpha-b", + "material/alpha-c-box-outline", + "material/alpha-c-box", + "material/alpha-c-circle-outline", + "material/alpha-c-circle", + "material/alpha-c", + "material/alpha-d-box-outline", + "material/alpha-d-box", + "material/alpha-d-circle-outline", + "material/alpha-d-circle", + "material/alpha-d", + "material/alpha-e-box-outline", + "material/alpha-e-box", + "material/alpha-e-circle-outline", + "material/alpha-e-circle", + "material/alpha-e", + "material/alpha-f-box-outline", + "material/alpha-f-box", + "material/alpha-f-circle-outline", + "material/alpha-f-circle", + "material/alpha-f", + "material/alpha-g-box-outline", + "material/alpha-g-box", + "material/alpha-g-circle-outline", + "material/alpha-g-circle", + "material/alpha-g", + "material/alpha-h-box-outline", + "material/alpha-h-box", + "material/alpha-h-circle-outline", + "material/alpha-h-circle", + "material/alpha-h", + "material/alpha-i-box-outline", + "material/alpha-i-box", + "material/alpha-i-circle-outline", + "material/alpha-i-circle", + "material/alpha-i", + "material/alpha-j-box-outline", + "material/alpha-j-box", + "material/alpha-j-circle-outline", + "material/alpha-j-circle", + "material/alpha-j", + "material/alpha-k-box-outline", + "material/alpha-k-box", + "material/alpha-k-circle-outline", + "material/alpha-k-circle", + "material/alpha-k", + "material/alpha-l-box-outline", + "material/alpha-l-box", + "material/alpha-l-circle-outline", + "material/alpha-l-circle", + "material/alpha-l", + "material/alpha-m-box-outline", + "material/alpha-m-box", + "material/alpha-m-circle-outline", + "material/alpha-m-circle", + "material/alpha-m", + "material/alpha-n-box-outline", + "material/alpha-n-box", + "material/alpha-n-circle-outline", + "material/alpha-n-circle", + "material/alpha-n", + "material/alpha-o-box-outline", + "material/alpha-o-box", + "material/alpha-o-circle-outline", + "material/alpha-o-circle", + "material/alpha-o", + "material/alpha-p-box-outline", + "material/alpha-p-box", + "material/alpha-p-circle-outline", + "material/alpha-p-circle", + "material/alpha-p", + "material/alpha-q-box-outline", + "material/alpha-q-box", + "material/alpha-q-circle-outline", + "material/alpha-q-circle", + "material/alpha-q", + "material/alpha-r-box-outline", + "material/alpha-r-box", + "material/alpha-r-circle-outline", + "material/alpha-r-circle", + "material/alpha-r", + "material/alpha-s-box-outline", + "material/alpha-s-box", + "material/alpha-s-circle-outline", + "material/alpha-s-circle", + "material/alpha-s", + "material/alpha-t-box-outline", + "material/alpha-t-box", + "material/alpha-t-circle-outline", + "material/alpha-t-circle", + "material/alpha-t", + "material/alpha-u-box-outline", + "material/alpha-u-box", + "material/alpha-u-circle-outline", + "material/alpha-u-circle", + "material/alpha-u", + "material/alpha-v-box-outline", + "material/alpha-v-box", + "material/alpha-v-circle-outline", + "material/alpha-v-circle", + "material/alpha-v", + "material/alpha-w-box-outline", + "material/alpha-w-box", + "material/alpha-w-circle-outline", + "material/alpha-w-circle", + "material/alpha-w", + "material/alpha-x-box-outline", + "material/alpha-x-box", + "material/alpha-x-circle-outline", + "material/alpha-x-circle", + "material/alpha-x", + "material/alpha-y-box-outline", + "material/alpha-y-box", + "material/alpha-y-circle-outline", + "material/alpha-y-circle", + "material/alpha-y", + "material/alpha-z-box-outline", + "material/alpha-z-box", + "material/alpha-z-circle-outline", + "material/alpha-z-circle", + "material/alpha-z", + "material/alpha", + "material/alphabet-aurebesh", + "material/alphabet-cyrillic", + "material/alphabet-greek", + "material/alphabet-latin", + "material/alphabet-piqad", + "material/alphabet-tengwar", + "material/alphabetical-off", + "material/alphabetical-variant-off", + "material/alphabetical-variant", + "material/alphabetical", + "material/altimeter", + "material/ambulance", + "material/ammunition", + "material/ampersand", + "material/amplifier-off", + "material/amplifier", + "material/anchor", + "material/android-studio", + "material/android", + "material/angle-acute", + "material/angle-obtuse", + "material/angle-right", + "material/angular", + "material/angularjs", + "material/animation-outline", + "material/animation-play-outline", + "material/animation-play", + "material/animation", + "material/ansible", + "material/antenna", + "material/anvil", + "material/apache-kafka", + "material/api-off", + "material/api", + "material/apple-finder", + "material/apple-icloud", + "material/apple-ios", + "material/apple-keyboard-caps", + "material/apple-keyboard-command", + "material/apple-keyboard-control", + "material/apple-keyboard-option", + "material/apple-keyboard-shift", + "material/apple-safari", + "material/apple", + "material/application-array-outline", + "material/application-array", + "material/application-braces-outline", + "material/application-braces", + "material/application-brackets-outline", + "material/application-brackets", + "material/application-cog-outline", + "material/application-cog", + "material/application-edit-outline", + "material/application-edit", + "material/application-export", + "material/application-import", + "material/application-outline", + "material/application-parentheses-outline", + "material/application-parentheses", + "material/application-settings-outline", + "material/application-settings", + "material/application-variable-outline", + "material/application-variable", + "material/application", + "material/approximately-equal-box", + "material/approximately-equal", + "material/apps-box", + "material/apps", + "material/arch", + "material/archive-alert-outline", + "material/archive-alert", + "material/archive-arrow-down-outline", + "material/archive-arrow-down", + "material/archive-arrow-up-outline", + "material/archive-arrow-up", + "material/archive-cancel-outline", + "material/archive-cancel", + "material/archive-check-outline", + "material/archive-check", + "material/archive-clock-outline", + "material/archive-clock", + "material/archive-cog-outline", + "material/archive-cog", + "material/archive-edit-outline", + "material/archive-edit", + "material/archive-eye-outline", + "material/archive-eye", + "material/archive-lock-open-outline", + "material/archive-lock-open", + "material/archive-lock-outline", + "material/archive-lock", + "material/archive-marker-outline", + "material/archive-marker", + "material/archive-minus-outline", + "material/archive-minus", + "material/archive-music-outline", + "material/archive-music", + "material/archive-off-outline", + "material/archive-off", + "material/archive-outline", + "material/archive-plus-outline", + "material/archive-plus", + "material/archive-refresh-outline", + "material/archive-refresh", + "material/archive-remove-outline", + "material/archive-remove", + "material/archive-search-outline", + "material/archive-search", + "material/archive-settings-outline", + "material/archive-settings", + "material/archive-star-outline", + "material/archive-star", + "material/archive-sync-outline", + "material/archive-sync", + "material/archive", + "material/arm-flex-outline", + "material/arm-flex", + "material/arrange-bring-forward", + "material/arrange-bring-to-front", + "material/arrange-send-backward", + "material/arrange-send-to-back", + "material/arrow-all", + "material/arrow-bottom-left-bold-box-outline", + "material/arrow-bottom-left-bold-box", + "material/arrow-bottom-left-bold-outline", + "material/arrow-bottom-left-thick", + "material/arrow-bottom-left-thin-circle-outline", + "material/arrow-bottom-left-thin", + "material/arrow-bottom-left", + "material/arrow-bottom-right-bold-box-outline", + "material/arrow-bottom-right-bold-box", + "material/arrow-bottom-right-bold-outline", + "material/arrow-bottom-right-thick", + "material/arrow-bottom-right-thin-circle-outline", + "material/arrow-bottom-right-thin", + "material/arrow-bottom-right", + "material/arrow-collapse-all", + "material/arrow-collapse-down", + "material/arrow-collapse-horizontal", + "material/arrow-collapse-left", + "material/arrow-collapse-right", + "material/arrow-collapse-up", + "material/arrow-collapse-vertical", + "material/arrow-collapse", + "material/arrow-decision-auto-outline", + "material/arrow-decision-auto", + "material/arrow-decision-outline", + "material/arrow-decision", + "material/arrow-down-bold-box-outline", + "material/arrow-down-bold-box", + "material/arrow-down-bold-circle-outline", + "material/arrow-down-bold-circle", + "material/arrow-down-bold-hexagon-outline", + "material/arrow-down-bold-outline", + "material/arrow-down-bold", + "material/arrow-down-box", + "material/arrow-down-circle-outline", + "material/arrow-down-circle", + "material/arrow-down-drop-circle-outline", + "material/arrow-down-drop-circle", + "material/arrow-down-left-bold", + "material/arrow-down-left", + "material/arrow-down-right-bold", + "material/arrow-down-right", + "material/arrow-down-thick", + "material/arrow-down-thin-circle-outline", + "material/arrow-down-thin", + "material/arrow-down", + "material/arrow-expand-all", + "material/arrow-expand-down", + "material/arrow-expand-horizontal", + "material/arrow-expand-left", + "material/arrow-expand-right", + "material/arrow-expand-up", + "material/arrow-expand-vertical", + "material/arrow-expand", + "material/arrow-horizontal-lock", + "material/arrow-left-bold-box-outline", + "material/arrow-left-bold-box", + "material/arrow-left-bold-circle-outline", + "material/arrow-left-bold-circle", + "material/arrow-left-bold-hexagon-outline", + "material/arrow-left-bold-outline", + "material/arrow-left-bold", + "material/arrow-left-bottom-bold", + "material/arrow-left-bottom", + "material/arrow-left-box", + "material/arrow-left-circle-outline", + "material/arrow-left-circle", + "material/arrow-left-drop-circle-outline", + "material/arrow-left-drop-circle", + "material/arrow-left-right-bold-outline", + "material/arrow-left-right-bold", + "material/arrow-left-right", + "material/arrow-left-thick", + "material/arrow-left-thin-circle-outline", + "material/arrow-left-thin", + "material/arrow-left-top-bold", + "material/arrow-left-top", + "material/arrow-left", + "material/arrow-projectile-multiple", + "material/arrow-projectile", + "material/arrow-right-bold-box-outline", + "material/arrow-right-bold-box", + "material/arrow-right-bold-circle-outline", + "material/arrow-right-bold-circle", + "material/arrow-right-bold-hexagon-outline", + "material/arrow-right-bold-outline", + "material/arrow-right-bold", + "material/arrow-right-bottom-bold", + "material/arrow-right-bottom", + "material/arrow-right-box", + "material/arrow-right-circle-outline", + "material/arrow-right-circle", + "material/arrow-right-drop-circle-outline", + "material/arrow-right-drop-circle", + "material/arrow-right-thick", + "material/arrow-right-thin-circle-outline", + "material/arrow-right-thin", + "material/arrow-right-top-bold", + "material/arrow-right-top", + "material/arrow-right", + "material/arrow-split-horizontal", + "material/arrow-split-vertical", + "material/arrow-top-left-bold-box-outline", + "material/arrow-top-left-bold-box", + "material/arrow-top-left-bold-outline", + "material/arrow-top-left-bottom-right-bold", + "material/arrow-top-left-bottom-right", + "material/arrow-top-left-thick", + "material/arrow-top-left-thin-circle-outline", + "material/arrow-top-left-thin", + "material/arrow-top-left", + "material/arrow-top-right-bold-box-outline", + "material/arrow-top-right-bold-box", + "material/arrow-top-right-bold-outline", + "material/arrow-top-right-bottom-left-bold", + "material/arrow-top-right-bottom-left", + "material/arrow-top-right-thick", + "material/arrow-top-right-thin-circle-outline", + "material/arrow-top-right-thin", + "material/arrow-top-right", + "material/arrow-u-down-left-bold", + "material/arrow-u-down-left", + "material/arrow-u-down-right-bold", + "material/arrow-u-down-right", + "material/arrow-u-left-bottom-bold", + "material/arrow-u-left-bottom", + "material/arrow-u-left-top-bold", + "material/arrow-u-left-top", + "material/arrow-u-right-bottom-bold", + "material/arrow-u-right-bottom", + "material/arrow-u-right-top-bold", + "material/arrow-u-right-top", + "material/arrow-u-up-left-bold", + "material/arrow-u-up-left", + "material/arrow-u-up-right-bold", + "material/arrow-u-up-right", + "material/arrow-up-bold-box-outline", + "material/arrow-up-bold-box", + "material/arrow-up-bold-circle-outline", + "material/arrow-up-bold-circle", + "material/arrow-up-bold-hexagon-outline", + "material/arrow-up-bold-outline", + "material/arrow-up-bold", + "material/arrow-up-box", + "material/arrow-up-circle-outline", + "material/arrow-up-circle", + "material/arrow-up-down-bold-outline", + "material/arrow-up-down-bold", + "material/arrow-up-down", + "material/arrow-up-drop-circle-outline", + "material/arrow-up-drop-circle", + "material/arrow-up-left-bold", + "material/arrow-up-left", + "material/arrow-up-right-bold", + "material/arrow-up-right", + "material/arrow-up-thick", + "material/arrow-up-thin-circle-outline", + "material/arrow-up-thin", + "material/arrow-up", + "material/arrow-vertical-lock", + "material/artboard", + "material/artstation", + "material/aspect-ratio", + "material/assistant", + "material/asterisk-circle-outline", + "material/asterisk", + "material/at", + "material/atlassian", + "material/atm", + "material/atom-variant", + "material/atom", + "material/attachment-check", + "material/attachment-lock", + "material/attachment-minus", + "material/attachment-off", + "material/attachment-plus", + "material/attachment-remove", + "material/attachment", + "material/atv", + "material/audio-input-rca", + "material/audio-input-stereo-minijack", + "material/audio-input-xlr", + "material/audio-video-off", + "material/audio-video", + "material/augmented-reality", + "material/auto-download", + "material/auto-fix", + "material/auto-upload", + "material/autorenew-off", + "material/autorenew", + "material/av-timer", + "material/awning-outline", + "material/awning", + "material/aws", + "material/axe-battle", + "material/axe", + "material/axis-arrow-info", + "material/axis-arrow-lock", + "material/axis-arrow", + "material/axis-lock", + "material/axis-x-arrow-lock", + "material/axis-x-arrow", + "material/axis-x-rotate-clockwise", + "material/axis-x-rotate-counterclockwise", + "material/axis-x-y-arrow-lock", + "material/axis-y-arrow-lock", + "material/axis-y-arrow", + "material/axis-y-rotate-clockwise", + "material/axis-y-rotate-counterclockwise", + "material/axis-z-arrow-lock", + "material/axis-z-arrow", + "material/axis-z-rotate-clockwise", + "material/axis-z-rotate-counterclockwise", + "material/axis", + "material/babel", + "material/baby-bottle-outline", + "material/baby-bottle", + "material/baby-buggy-off", + "material/baby-buggy", + "material/baby-carriage-off", + "material/baby-carriage", + "material/baby-face-outline", + "material/baby-face", + "material/baby", + "material/backburger", + "material/backspace-outline", + "material/backspace-reverse-outline", + "material/backspace-reverse", + "material/backspace", + "material/backup-restore", + "material/bacteria-outline", + "material/bacteria", + "material/badge-account-alert-outline", + "material/badge-account-alert", + "material/badge-account-horizontal-outline", + "material/badge-account-horizontal", + "material/badge-account-outline", + "material/badge-account", + "material/badminton", + "material/bag-carry-on-check", + "material/bag-carry-on-off", + "material/bag-carry-on", + "material/bag-checked", + "material/bag-personal-off-outline", + "material/bag-personal-off", + "material/bag-personal-outline", + "material/bag-personal-tag-outline", + "material/bag-personal-tag", + "material/bag-personal", + "material/bag-suitcase-off-outline", + "material/bag-suitcase-off", + "material/bag-suitcase-outline", + "material/bag-suitcase", + "material/baguette", + "material/balcony", + "material/balloon", + "material/ballot-outline", + "material/ballot-recount-outline", + "material/ballot-recount", + "material/ballot", + "material/bandage", + "material/bank-check", + "material/bank-minus", + "material/bank-off-outline", + "material/bank-off", + "material/bank-outline", + "material/bank-plus", + "material/bank-remove", + "material/bank-transfer-in", + "material/bank-transfer-out", + "material/bank-transfer", + "material/bank", + "material/barcode-off", + "material/barcode-scan", + "material/barcode", + "material/barley-off", + "material/barley", + "material/barn", + "material/barrel-outline", + "material/barrel", + "material/baseball-bat", + "material/baseball-diamond-outline", + "material/baseball-diamond", + "material/baseball", + "material/bash", + "material/basket-check-outline", + "material/basket-check", + "material/basket-fill", + "material/basket-minus-outline", + "material/basket-minus", + "material/basket-off-outline", + "material/basket-off", + "material/basket-outline", + "material/basket-plus-outline", + "material/basket-plus", + "material/basket-remove-outline", + "material/basket-remove", + "material/basket-unfill", + "material/basket", + "material/basketball-hoop-outline", + "material/basketball-hoop", + "material/basketball", + "material/bat", + "material/bathtub-outline", + "material/bathtub", + "material/battery-10-bluetooth", + "material/battery-10", + "material/battery-20-bluetooth", + "material/battery-20", + "material/battery-30-bluetooth", + "material/battery-30", + "material/battery-40-bluetooth", + "material/battery-40", + "material/battery-50-bluetooth", + "material/battery-50", + "material/battery-60-bluetooth", + "material/battery-60", + "material/battery-70-bluetooth", + "material/battery-70", + "material/battery-80-bluetooth", + "material/battery-80", + "material/battery-90-bluetooth", + "material/battery-90", + "material/battery-alert-bluetooth", + "material/battery-alert-variant-outline", + "material/battery-alert-variant", + "material/battery-alert", + "material/battery-arrow-down-outline", + "material/battery-arrow-down", + "material/battery-arrow-up-outline", + "material/battery-arrow-up", + "material/battery-bluetooth-variant", + "material/battery-bluetooth", + "material/battery-charging-10", + "material/battery-charging-100", + "material/battery-charging-20", + "material/battery-charging-30", + "material/battery-charging-40", + "material/battery-charging-50", + "material/battery-charging-60", + "material/battery-charging-70", + "material/battery-charging-80", + "material/battery-charging-90", + "material/battery-charging-high", + "material/battery-charging-low", + "material/battery-charging-medium", + "material/battery-charging-outline", + "material/battery-charging-wireless-10", + "material/battery-charging-wireless-20", + "material/battery-charging-wireless-30", + "material/battery-charging-wireless-40", + "material/battery-charging-wireless-50", + "material/battery-charging-wireless-60", + "material/battery-charging-wireless-70", + "material/battery-charging-wireless-80", + "material/battery-charging-wireless-90", + "material/battery-charging-wireless-alert", + "material/battery-charging-wireless-outline", + "material/battery-charging-wireless", + "material/battery-charging", + "material/battery-check-outline", + "material/battery-check", + "material/battery-clock-outline", + "material/battery-clock", + "material/battery-heart-outline", + "material/battery-heart-variant", + "material/battery-heart", + "material/battery-high", + "material/battery-lock-open", + "material/battery-lock", + "material/battery-low", + "material/battery-medium", + "material/battery-minus-outline", + "material/battery-minus-variant", + "material/battery-minus", + "material/battery-negative", + "material/battery-off-outline", + "material/battery-off", + "material/battery-outline", + "material/battery-plus-outline", + "material/battery-plus-variant", + "material/battery-plus", + "material/battery-positive", + "material/battery-remove-outline", + "material/battery-remove", + "material/battery-sync-outline", + "material/battery-sync", + "material/battery-unknown-bluetooth", + "material/battery-unknown", + "material/battery", + "material/beach", + "material/beaker-alert-outline", + "material/beaker-alert", + "material/beaker-check-outline", + "material/beaker-check", + "material/beaker-minus-outline", + "material/beaker-minus", + "material/beaker-outline", + "material/beaker-plus-outline", + "material/beaker-plus", + "material/beaker-question-outline", + "material/beaker-question", + "material/beaker-remove-outline", + "material/beaker-remove", + "material/beaker", + "material/bed-clock", + "material/bed-double-outline", + "material/bed-double", + "material/bed-empty", + "material/bed-king-outline", + "material/bed-king", + "material/bed-outline", + "material/bed-queen-outline", + "material/bed-queen", + "material/bed-single-outline", + "material/bed-single", + "material/bed", + "material/bee-flower", + "material/bee", + "material/beehive-off-outline", + "material/beehive-outline", + "material/beekeeper", + "material/beer-outline", + "material/beer", + "material/bell-alert-outline", + "material/bell-alert", + "material/bell-badge-outline", + "material/bell-badge", + "material/bell-cancel-outline", + "material/bell-cancel", + "material/bell-check-outline", + "material/bell-check", + "material/bell-circle-outline", + "material/bell-circle", + "material/bell-cog-outline", + "material/bell-cog", + "material/bell-minus-outline", + "material/bell-minus", + "material/bell-off-outline", + "material/bell-off", + "material/bell-outline", + "material/bell-plus-outline", + "material/bell-plus", + "material/bell-remove-outline", + "material/bell-remove", + "material/bell-ring-outline", + "material/bell-ring", + "material/bell-sleep-outline", + "material/bell-sleep", + "material/bell", + "material/beta", + "material/betamax", + "material/biathlon", + "material/bicycle-basket", + "material/bicycle-cargo", + "material/bicycle-electric", + "material/bicycle-penny-farthing", + "material/bicycle", + "material/bike-fast", + "material/bike", + "material/billboard", + "material/billiards-rack", + "material/billiards", + "material/binoculars", + "material/bio", + "material/biohazard", + "material/bird", + "material/bitbucket", + "material/bitcoin", + "material/black-mesa", + "material/blender-outline", + "material/blender-software", + "material/blender", + "material/blinds-horizontal-closed", + "material/blinds-horizontal", + "material/blinds-open", + "material/blinds-vertical-closed", + "material/blinds-vertical", + "material/blinds", + "material/block-helper", + "material/blood-bag", + "material/bluetooth-audio", + "material/bluetooth-connect", + "material/bluetooth-off", + "material/bluetooth-settings", + "material/bluetooth-transfer", + "material/bluetooth", + "material/blur-linear", + "material/blur-off", + "material/blur-radial", + "material/blur", + "material/bolt", + "material/bomb-off", + "material/bomb", + "material/bone-off", + "material/bone", + "material/book-account-outline", + "material/book-account", + "material/book-alert-outline", + "material/book-alert", + "material/book-alphabet", + "material/book-arrow-down-outline", + "material/book-arrow-down", + "material/book-arrow-left-outline", + "material/book-arrow-left", + "material/book-arrow-right-outline", + "material/book-arrow-right", + "material/book-arrow-up-outline", + "material/book-arrow-up", + "material/book-cancel-outline", + "material/book-cancel", + "material/book-check-outline", + "material/book-check", + "material/book-clock-outline", + "material/book-clock", + "material/book-cog-outline", + "material/book-cog", + "material/book-cross", + "material/book-edit-outline", + "material/book-edit", + "material/book-education-outline", + "material/book-education", + "material/book-heart-outline", + "material/book-heart", + "material/book-information-variant", + "material/book-lock-open-outline", + "material/book-lock-open", + "material/book-lock-outline", + "material/book-lock", + "material/book-marker-outline", + "material/book-marker", + "material/book-minus-multiple-outline", + "material/book-minus-multiple", + "material/book-minus-outline", + "material/book-minus", + "material/book-multiple-outline", + "material/book-multiple", + "material/book-music-outline", + "material/book-music", + "material/book-off-outline", + "material/book-off", + "material/book-open-blank-variant", + "material/book-open-outline", + "material/book-open-page-variant-outline", + "material/book-open-page-variant", + "material/book-open-variant", + "material/book-open", + "material/book-outline", + "material/book-play-outline", + "material/book-play", + "material/book-plus-multiple-outline", + "material/book-plus-multiple", + "material/book-plus-outline", + "material/book-plus", + "material/book-refresh-outline", + "material/book-refresh", + "material/book-remove-multiple-outline", + "material/book-remove-multiple", + "material/book-remove-outline", + "material/book-remove", + "material/book-search-outline", + "material/book-search", + "material/book-settings-outline", + "material/book-settings", + "material/book-sync-outline", + "material/book-sync", + "material/book-variant", + "material/book", + "material/bookmark-box-multiple-outline", + "material/bookmark-box-multiple", + "material/bookmark-box-outline", + "material/bookmark-box", + "material/bookmark-check-outline", + "material/bookmark-check", + "material/bookmark-minus-outline", + "material/bookmark-minus", + "material/bookmark-multiple-outline", + "material/bookmark-multiple", + "material/bookmark-music-outline", + "material/bookmark-music", + "material/bookmark-off-outline", + "material/bookmark-off", + "material/bookmark-outline", + "material/bookmark-plus-outline", + "material/bookmark-plus", + "material/bookmark-remove-outline", + "material/bookmark-remove", + "material/bookmark", + "material/bookshelf", + "material/boom-gate-alert-outline", + "material/boom-gate-alert", + "material/boom-gate-arrow-down-outline", + "material/boom-gate-arrow-down", + "material/boom-gate-arrow-up-outline", + "material/boom-gate-arrow-up", + "material/boom-gate-outline", + "material/boom-gate-up-outline", + "material/boom-gate-up", + "material/boom-gate", + "material/boombox", + "material/boomerang", + "material/bootstrap", + "material/border-all-variant", + "material/border-all", + "material/border-bottom-variant", + "material/border-bottom", + "material/border-color", + "material/border-horizontal", + "material/border-inside", + "material/border-left-variant", + "material/border-left", + "material/border-none-variant", + "material/border-none", + "material/border-outside", + "material/border-radius", + "material/border-right-variant", + "material/border-right", + "material/border-style", + "material/border-top-variant", + "material/border-top", + "material/border-vertical", + "material/bottle-soda-classic-outline", + "material/bottle-soda-classic", + "material/bottle-soda-outline", + "material/bottle-soda", + "material/bottle-tonic-outline", + "material/bottle-tonic-plus-outline", + "material/bottle-tonic-plus", + "material/bottle-tonic-skull-outline", + "material/bottle-tonic-skull", + "material/bottle-tonic", + "material/bottle-wine-outline", + "material/bottle-wine", + "material/bow-arrow", + "material/bow-tie", + "material/bowl-mix-outline", + "material/bowl-mix", + "material/bowl-outline", + "material/bowl", + "material/bowling", + "material/box-cutter-off", + "material/box-cutter", + "material/box-shadow", + "material/box", + "material/boxing-glove", + "material/braille", + "material/brain", + "material/bread-slice-outline", + "material/bread-slice", + "material/bridge", + "material/briefcase-account-outline", + "material/briefcase-account", + "material/briefcase-arrow-left-right-outline", + "material/briefcase-arrow-left-right", + "material/briefcase-arrow-up-down-outline", + "material/briefcase-arrow-up-down", + "material/briefcase-check-outline", + "material/briefcase-check", + "material/briefcase-clock-outline", + "material/briefcase-clock", + "material/briefcase-download-outline", + "material/briefcase-download", + "material/briefcase-edit-outline", + "material/briefcase-edit", + "material/briefcase-eye-outline", + "material/briefcase-eye", + "material/briefcase-minus-outline", + "material/briefcase-minus", + "material/briefcase-off-outline", + "material/briefcase-off", + "material/briefcase-outline", + "material/briefcase-plus-outline", + "material/briefcase-plus", + "material/briefcase-remove-outline", + "material/briefcase-remove", + "material/briefcase-search-outline", + "material/briefcase-search", + "material/briefcase-upload-outline", + "material/briefcase-upload", + "material/briefcase-variant-off-outline", + "material/briefcase-variant-off", + "material/briefcase-variant-outline", + "material/briefcase-variant", + "material/briefcase", + "material/brightness-1", + "material/brightness-2", + "material/brightness-3", + "material/brightness-4", + "material/brightness-5", + "material/brightness-6", + "material/brightness-7", + "material/brightness-auto", + "material/brightness-percent", + "material/broadcast-off", + "material/broadcast", + "material/broom", + "material/brush-off", + "material/brush-outline", + "material/brush-variant", + "material/brush", + "material/bucket-outline", + "material/bucket", + "material/buffet", + "material/bug-check-outline", + "material/bug-check", + "material/bug-outline", + "material/bug-pause-outline", + "material/bug-pause", + "material/bug-play-outline", + "material/bug-play", + "material/bug-stop-outline", + "material/bug-stop", + "material/bug", + "material/bugle", + "material/bulkhead-light", + "material/bulldozer", + "material/bullet", + "material/bulletin-board", + "material/bullhorn-outline", + "material/bullhorn-variant-outline", + "material/bullhorn-variant", + "material/bullhorn", + "material/bullseye-arrow", + "material/bullseye", + "material/bulma", + "material/bunk-bed-outline", + "material/bunk-bed", + "material/bus-alert", + "material/bus-articulated-end", + "material/bus-articulated-front", + "material/bus-clock", + "material/bus-double-decker", + "material/bus-electric", + "material/bus-marker", + "material/bus-multiple", + "material/bus-school", + "material/bus-side", + "material/bus-stop-covered", + "material/bus-stop-uncovered", + "material/bus-stop", + "material/bus", + "material/butterfly-outline", + "material/butterfly", + "material/button-cursor", + "material/button-pointer", + "material/cabin-a-frame", + "material/cable-data", + "material/cached", + "material/cactus", + "material/cake-layered", + "material/cake-variant-outline", + "material/cake-variant", + "material/cake", + "material/calculator-variant-outline", + "material/calculator-variant", + "material/calculator", + "material/calendar-account-outline", + "material/calendar-account", + "material/calendar-alert-outline", + "material/calendar-alert", + "material/calendar-arrow-left", + "material/calendar-arrow-right", + "material/calendar-badge-outline", + "material/calendar-badge", + "material/calendar-blank-multiple", + "material/calendar-blank-outline", + "material/calendar-blank", + "material/calendar-check-outline", + "material/calendar-check", + "material/calendar-clock-outline", + "material/calendar-clock", + "material/calendar-collapse-horizontal-outline", + "material/calendar-collapse-horizontal", + "material/calendar-cursor-outline", + "material/calendar-cursor", + "material/calendar-edit-outline", + "material/calendar-edit", + "material/calendar-end-outline", + "material/calendar-end", + "material/calendar-expand-horizontal-outline", + "material/calendar-expand-horizontal", + "material/calendar-export-outline", + "material/calendar-export", + "material/calendar-filter-outline", + "material/calendar-filter", + "material/calendar-heart-outline", + "material/calendar-heart", + "material/calendar-import-outline", + "material/calendar-import", + "material/calendar-lock-open-outline", + "material/calendar-lock-open", + "material/calendar-lock-outline", + "material/calendar-lock", + "material/calendar-minus-outline", + "material/calendar-minus", + "material/calendar-month-outline", + "material/calendar-month", + "material/calendar-multiple-check", + "material/calendar-multiple", + "material/calendar-multiselect-outline", + "material/calendar-multiselect", + "material/calendar-outline", + "material/calendar-plus-outline", + "material/calendar-plus", + "material/calendar-question-outline", + "material/calendar-question", + "material/calendar-range-outline", + "material/calendar-range", + "material/calendar-refresh-outline", + "material/calendar-refresh", + "material/calendar-remove-outline", + "material/calendar-remove", + "material/calendar-search-outline", + "material/calendar-search", + "material/calendar-star-outline", + "material/calendar-star", + "material/calendar-start-outline", + "material/calendar-start", + "material/calendar-sync-outline", + "material/calendar-sync", + "material/calendar-text-outline", + "material/calendar-text", + "material/calendar-today-outline", + "material/calendar-today", + "material/calendar-week-begin-outline", + "material/calendar-week-begin", + "material/calendar-week-outline", + "material/calendar-week", + "material/calendar-weekend-outline", + "material/calendar-weekend", + "material/calendar", + "material/call-made", + "material/call-merge", + "material/call-missed", + "material/call-received", + "material/call-split", + "material/camcorder-off", + "material/camcorder", + "material/camera-account", + "material/camera-burst", + "material/camera-control", + "material/camera-document-off", + "material/camera-document", + "material/camera-enhance-outline", + "material/camera-enhance", + "material/camera-flip-outline", + "material/camera-flip", + "material/camera-front-variant", + "material/camera-front", + "material/camera-gopro", + "material/camera-image", + "material/camera-iris", + "material/camera-lock-outline", + "material/camera-lock", + "material/camera-marker-outline", + "material/camera-marker", + "material/camera-metering-center", + "material/camera-metering-matrix", + "material/camera-metering-partial", + "material/camera-metering-spot", + "material/camera-off-outline", + "material/camera-off", + "material/camera-outline", + "material/camera-party-mode", + "material/camera-plus-outline", + "material/camera-plus", + "material/camera-rear-variant", + "material/camera-rear", + "material/camera-retake-outline", + "material/camera-retake", + "material/camera-switch-outline", + "material/camera-switch", + "material/camera-timer", + "material/camera-wireless-outline", + "material/camera-wireless", + "material/camera", + "material/campfire", + "material/cancel", + "material/candelabra-fire", + "material/candelabra", + "material/candle", + "material/candy-off-outline", + "material/candy-off", + "material/candy-outline", + "material/candy", + "material/candycane", + "material/cannabis-off", + "material/cannabis", + "material/caps-lock", + "material/car-2-plus", + "material/car-3-plus", + "material/car-arrow-left", + "material/car-arrow-right", + "material/car-back", + "material/car-battery", + "material/car-brake-abs", + "material/car-brake-alert", + "material/car-brake-fluid-level", + "material/car-brake-hold", + "material/car-brake-low-pressure", + "material/car-brake-parking", + "material/car-brake-retarder", + "material/car-brake-temperature", + "material/car-brake-worn-linings", + "material/car-child-seat", + "material/car-clock", + "material/car-clutch", + "material/car-cog", + "material/car-connected", + "material/car-convertible", + "material/car-coolant-level", + "material/car-cruise-control", + "material/car-defrost-front", + "material/car-defrost-rear", + "material/car-door-lock", + "material/car-door", + "material/car-electric-outline", + "material/car-electric", + "material/car-emergency", + "material/car-esp", + "material/car-estate", + "material/car-hatchback", + "material/car-info", + "material/car-key", + "material/car-lifted-pickup", + "material/car-light-alert", + "material/car-light-dimmed", + "material/car-light-fog", + "material/car-light-high", + "material/car-limousine", + "material/car-multiple", + "material/car-off", + "material/car-outline", + "material/car-parking-lights", + "material/car-pickup", + "material/car-search-outline", + "material/car-search", + "material/car-seat-cooler", + "material/car-seat-heater", + "material/car-seat", + "material/car-select", + "material/car-settings", + "material/car-shift-pattern", + "material/car-side", + "material/car-speed-limiter", + "material/car-sports", + "material/car-tire-alert", + "material/car-traction-control", + "material/car-turbocharger", + "material/car-wash", + "material/car-windshield-outline", + "material/car-windshield", + "material/car-wireless", + "material/car-wrench", + "material/car", + "material/carabiner", + "material/caravan", + "material/card-account-details-outline", + "material/card-account-details-star-outline", + "material/card-account-details-star", + "material/card-account-details", + "material/card-account-mail-outline", + "material/card-account-mail", + "material/card-account-phone-outline", + "material/card-account-phone", + "material/card-bulleted-off-outline", + "material/card-bulleted-off", + "material/card-bulleted-outline", + "material/card-bulleted-settings-outline", + "material/card-bulleted-settings", + "material/card-bulleted", + "material/card-minus-outline", + "material/card-minus", + "material/card-multiple-outline", + "material/card-multiple", + "material/card-off-outline", + "material/card-off", + "material/card-outline", + "material/card-plus-outline", + "material/card-plus", + "material/card-remove-outline", + "material/card-remove", + "material/card-search-outline", + "material/card-search", + "material/card-text-outline", + "material/card-text", + "material/card", + "material/cards-club-outline", + "material/cards-club", + "material/cards-diamond-outline", + "material/cards-diamond", + "material/cards-heart-outline", + "material/cards-heart", + "material/cards-outline", + "material/cards-playing-club-multiple-outline", + "material/cards-playing-club-multiple", + "material/cards-playing-club-outline", + "material/cards-playing-club", + "material/cards-playing-diamond-multiple-outline", + "material/cards-playing-diamond-multiple", + "material/cards-playing-diamond-outline", + "material/cards-playing-diamond", + "material/cards-playing-heart-multiple-outline", + "material/cards-playing-heart-multiple", + "material/cards-playing-heart-outline", + "material/cards-playing-heart", + "material/cards-playing-outline", + "material/cards-playing-spade-multiple-outline", + "material/cards-playing-spade-multiple", + "material/cards-playing-spade-outline", + "material/cards-playing-spade", + "material/cards-playing", + "material/cards-spade-outline", + "material/cards-spade", + "material/cards-variant", + "material/cards", + "material/carrot", + "material/cart-arrow-down", + "material/cart-arrow-right", + "material/cart-arrow-up", + "material/cart-check", + "material/cart-heart", + "material/cart-minus", + "material/cart-off", + "material/cart-outline", + "material/cart-percent", + "material/cart-plus", + "material/cart-remove", + "material/cart-variant", + "material/cart", + "material/case-sensitive-alt", + "material/cash-100", + "material/cash-check", + "material/cash-clock", + "material/cash-fast", + "material/cash-lock-open", + "material/cash-lock", + "material/cash-marker", + "material/cash-minus", + "material/cash-multiple", + "material/cash-plus", + "material/cash-refund", + "material/cash-register", + "material/cash-remove", + "material/cash-sync", + "material/cash", + "material/cassette", + "material/cast-audio-variant", + "material/cast-audio", + "material/cast-connected", + "material/cast-education", + "material/cast-off", + "material/cast-variant", + "material/cast", + "material/castle", + "material/cat", + "material/cctv-off", + "material/cctv", + "material/ceiling-fan-light", + "material/ceiling-fan", + "material/ceiling-light-multiple-outline", + "material/ceiling-light-multiple", + "material/ceiling-light-outline", + "material/ceiling-light", + "material/cellphone-arrow-down-variant", + "material/cellphone-arrow-down", + "material/cellphone-basic", + "material/cellphone-charging", + "material/cellphone-check", + "material/cellphone-cog", + "material/cellphone-dock", + "material/cellphone-information", + "material/cellphone-key", + "material/cellphone-link-off", + "material/cellphone-link", + "material/cellphone-lock", + "material/cellphone-marker", + "material/cellphone-message-off", + "material/cellphone-message", + "material/cellphone-nfc-off", + "material/cellphone-nfc", + "material/cellphone-off", + "material/cellphone-play", + "material/cellphone-remove", + "material/cellphone-screenshot", + "material/cellphone-settings", + "material/cellphone-sound", + "material/cellphone-text", + "material/cellphone-wireless", + "material/cellphone", + "material/centos", + "material/certificate-outline", + "material/certificate", + "material/chair-rolling", + "material/chair-school", + "material/chandelier", + "material/charity", + "material/chart-arc", + "material/chart-areaspline-variant", + "material/chart-areaspline", + "material/chart-bar-stacked", + "material/chart-bar", + "material/chart-bell-curve-cumulative", + "material/chart-bell-curve", + "material/chart-box-outline", + "material/chart-box-plus-outline", + "material/chart-box", + "material/chart-bubble", + "material/chart-donut-variant", + "material/chart-donut", + "material/chart-gantt", + "material/chart-histogram", + "material/chart-line-stacked", + "material/chart-line-variant", + "material/chart-line", + "material/chart-multiline", + "material/chart-multiple", + "material/chart-pie", + "material/chart-ppf", + "material/chart-sankey-variant", + "material/chart-sankey", + "material/chart-scatter-plot-hexbin", + "material/chart-scatter-plot", + "material/chart-timeline-variant-shimmer", + "material/chart-timeline-variant", + "material/chart-timeline", + "material/chart-tree", + "material/chart-waterfall", + "material/chat-alert-outline", + "material/chat-alert", + "material/chat-minus-outline", + "material/chat-minus", + "material/chat-outline", + "material/chat-plus-outline", + "material/chat-plus", + "material/chat-processing-outline", + "material/chat-processing", + "material/chat-question-outline", + "material/chat-question", + "material/chat-remove-outline", + "material/chat-remove", + "material/chat-sleep-outline", + "material/chat-sleep", + "material/chat", + "material/check-all", + "material/check-bold", + "material/check-circle-outline", + "material/check-circle", + "material/check-decagram-outline", + "material/check-decagram", + "material/check-network-outline", + "material/check-network", + "material/check-outline", + "material/check-underline-circle-outline", + "material/check-underline-circle", + "material/check-underline", + "material/check", + "material/checkbook", + "material/checkbox-blank-badge-outline", + "material/checkbox-blank-badge", + "material/checkbox-blank-circle-outline", + "material/checkbox-blank-circle", + "material/checkbox-blank-off-outline", + "material/checkbox-blank-off", + "material/checkbox-blank-outline", + "material/checkbox-blank", + "material/checkbox-intermediate-variant", + "material/checkbox-intermediate", + "material/checkbox-marked-circle-outline", + "material/checkbox-marked-circle-plus-outline", + "material/checkbox-marked-circle", + "material/checkbox-marked-outline", + "material/checkbox-marked", + "material/checkbox-multiple-blank-circle-outline", + "material/checkbox-multiple-blank-circle", + "material/checkbox-multiple-blank-outline", + "material/checkbox-multiple-blank", + "material/checkbox-multiple-marked-circle-outline", + "material/checkbox-multiple-marked-circle", + "material/checkbox-multiple-marked-outline", + "material/checkbox-multiple-marked", + "material/checkbox-multiple-outline", + "material/checkbox-outline", + "material/checkerboard-minus", + "material/checkerboard-plus", + "material/checkerboard-remove", + "material/checkerboard", + "material/cheese-off", + "material/cheese", + "material/chef-hat", + "material/chemical-weapon", + "material/chess-bishop", + "material/chess-king", + "material/chess-knight", + "material/chess-pawn", + "material/chess-queen", + "material/chess-rook", + "material/chevron-double-down", + "material/chevron-double-left", + "material/chevron-double-right", + "material/chevron-double-up", + "material/chevron-down-box-outline", + "material/chevron-down-box", + "material/chevron-down-circle-outline", + "material/chevron-down-circle", + "material/chevron-down", + "material/chevron-left-box-outline", + "material/chevron-left-box", + "material/chevron-left-circle-outline", + "material/chevron-left-circle", + "material/chevron-left", + "material/chevron-right-box-outline", + "material/chevron-right-box", + "material/chevron-right-circle-outline", + "material/chevron-right-circle", + "material/chevron-right", + "material/chevron-triple-down", + "material/chevron-triple-left", + "material/chevron-triple-right", + "material/chevron-triple-up", + "material/chevron-up-box-outline", + "material/chevron-up-box", + "material/chevron-up-circle-outline", + "material/chevron-up-circle", + "material/chevron-up", + "material/chili-alert-outline", + "material/chili-alert", + "material/chili-hot-outline", + "material/chili-hot", + "material/chili-medium-outline", + "material/chili-medium", + "material/chili-mild-outline", + "material/chili-mild", + "material/chili-off-outline", + "material/chili-off", + "material/chip", + "material/church-outline", + "material/church", + "material/cigar-off", + "material/cigar", + "material/circle-box-outline", + "material/circle-box", + "material/circle-double", + "material/circle-edit-outline", + "material/circle-expand", + "material/circle-half-full", + "material/circle-half", + "material/circle-medium", + "material/circle-multiple-outline", + "material/circle-multiple", + "material/circle-off-outline", + "material/circle-opacity", + "material/circle-outline", + "material/circle-slice-1", + "material/circle-slice-2", + "material/circle-slice-3", + "material/circle-slice-4", + "material/circle-slice-5", + "material/circle-slice-6", + "material/circle-slice-7", + "material/circle-slice-8", + "material/circle-small", + "material/circle", + "material/circular-saw", + "material/city-variant-outline", + "material/city-variant", + "material/city", + "material/clipboard-account-outline", + "material/clipboard-account", + "material/clipboard-alert-outline", + "material/clipboard-alert", + "material/clipboard-arrow-down-outline", + "material/clipboard-arrow-down", + "material/clipboard-arrow-left-outline", + "material/clipboard-arrow-left", + "material/clipboard-arrow-right-outline", + "material/clipboard-arrow-right", + "material/clipboard-arrow-up-outline", + "material/clipboard-arrow-up", + "material/clipboard-check-multiple-outline", + "material/clipboard-check-multiple", + "material/clipboard-check-outline", + "material/clipboard-check", + "material/clipboard-clock-outline", + "material/clipboard-clock", + "material/clipboard-edit-outline", + "material/clipboard-edit", + "material/clipboard-file-outline", + "material/clipboard-file", + "material/clipboard-flow-outline", + "material/clipboard-flow", + "material/clipboard-list-outline", + "material/clipboard-list", + "material/clipboard-minus-outline", + "material/clipboard-minus", + "material/clipboard-multiple-outline", + "material/clipboard-multiple", + "material/clipboard-off-outline", + "material/clipboard-off", + "material/clipboard-outline", + "material/clipboard-play-multiple-outline", + "material/clipboard-play-multiple", + "material/clipboard-play-outline", + "material/clipboard-play", + "material/clipboard-plus-outline", + "material/clipboard-plus", + "material/clipboard-pulse-outline", + "material/clipboard-pulse", + "material/clipboard-remove-outline", + "material/clipboard-remove", + "material/clipboard-search-outline", + "material/clipboard-search", + "material/clipboard-text-clock-outline", + "material/clipboard-text-clock", + "material/clipboard-text-multiple-outline", + "material/clipboard-text-multiple", + "material/clipboard-text-off-outline", + "material/clipboard-text-off", + "material/clipboard-text-outline", + "material/clipboard-text-play-outline", + "material/clipboard-text-play", + "material/clipboard-text-search-outline", + "material/clipboard-text-search", + "material/clipboard-text", + "material/clipboard", + "material/clippy", + "material/clock-alert-outline", + "material/clock-alert", + "material/clock-check-outline", + "material/clock-check", + "material/clock-digital", + "material/clock-edit-outline", + "material/clock-edit", + "material/clock-end", + "material/clock-fast", + "material/clock-in", + "material/clock-minus-outline", + "material/clock-minus", + "material/clock-out", + "material/clock-outline", + "material/clock-plus-outline", + "material/clock-plus", + "material/clock-remove-outline", + "material/clock-remove", + "material/clock-start", + "material/clock-time-eight-outline", + "material/clock-time-eight", + "material/clock-time-eleven-outline", + "material/clock-time-eleven", + "material/clock-time-five-outline", + "material/clock-time-five", + "material/clock-time-four-outline", + "material/clock-time-four", + "material/clock-time-nine-outline", + "material/clock-time-nine", + "material/clock-time-one-outline", + "material/clock-time-one", + "material/clock-time-seven-outline", + "material/clock-time-seven", + "material/clock-time-six-outline", + "material/clock-time-six", + "material/clock-time-ten-outline", + "material/clock-time-ten", + "material/clock-time-three-outline", + "material/clock-time-three", + "material/clock-time-twelve-outline", + "material/clock-time-twelve", + "material/clock-time-two-outline", + "material/clock-time-two", + "material/clock", + "material/close-box-multiple-outline", + "material/close-box-multiple", + "material/close-box-outline", + "material/close-box", + "material/close-circle-multiple-outline", + "material/close-circle-multiple", + "material/close-circle-outline", + "material/close-circle", + "material/close-network-outline", + "material/close-network", + "material/close-octagon-outline", + "material/close-octagon", + "material/close-outline", + "material/close-thick", + "material/close", + "material/closed-caption-outline", + "material/closed-caption", + "material/cloud-alert", + "material/cloud-braces", + "material/cloud-check-outline", + "material/cloud-check", + "material/cloud-circle", + "material/cloud-download-outline", + "material/cloud-download", + "material/cloud-lock-outline", + "material/cloud-lock", + "material/cloud-off-outline", + "material/cloud-outline", + "material/cloud-percent-outline", + "material/cloud-percent", + "material/cloud-print-outline", + "material/cloud-print", + "material/cloud-question", + "material/cloud-refresh", + "material/cloud-search-outline", + "material/cloud-search", + "material/cloud-sync-outline", + "material/cloud-sync", + "material/cloud-tags", + "material/cloud-upload-outline", + "material/cloud-upload", + "material/cloud", + "material/clouds", + "material/clover", + "material/coach-lamp-variant", + "material/coach-lamp", + "material/coat-rack", + "material/code-array", + "material/code-braces-box", + "material/code-braces", + "material/code-brackets", + "material/code-equal", + "material/code-greater-than-or-equal", + "material/code-greater-than", + "material/code-json", + "material/code-less-than-or-equal", + "material/code-less-than", + "material/code-not-equal-variant", + "material/code-not-equal", + "material/code-parentheses-box", + "material/code-parentheses", + "material/code-string", + "material/code-tags-check", + "material/code-tags", + "material/codepen", + "material/coffee-maker-check-outline", + "material/coffee-maker-check", + "material/coffee-maker-outline", + "material/coffee-maker", + "material/coffee-off-outline", + "material/coffee-off", + "material/coffee-outline", + "material/coffee-to-go-outline", + "material/coffee-to-go", + "material/coffee", + "material/coffin", + "material/cog-box", + "material/cog-clockwise", + "material/cog-counterclockwise", + "material/cog-off-outline", + "material/cog-off", + "material/cog-outline", + "material/cog-pause-outline", + "material/cog-pause", + "material/cog-play-outline", + "material/cog-play", + "material/cog-refresh-outline", + "material/cog-refresh", + "material/cog-stop-outline", + "material/cog-stop", + "material/cog-sync-outline", + "material/cog-sync", + "material/cog-transfer-outline", + "material/cog-transfer", + "material/cog", + "material/cogs", + "material/collage", + "material/collapse-all-outline", + "material/collapse-all", + "material/color-helper", + "material/comma-box-outline", + "material/comma-box", + "material/comma-circle-outline", + "material/comma-circle", + "material/comma", + "material/comment-account-outline", + "material/comment-account", + "material/comment-alert-outline", + "material/comment-alert", + "material/comment-arrow-left-outline", + "material/comment-arrow-left", + "material/comment-arrow-right-outline", + "material/comment-arrow-right", + "material/comment-bookmark-outline", + "material/comment-bookmark", + "material/comment-check-outline", + "material/comment-check", + "material/comment-edit-outline", + "material/comment-edit", + "material/comment-eye-outline", + "material/comment-eye", + "material/comment-flash-outline", + "material/comment-flash", + "material/comment-minus-outline", + "material/comment-minus", + "material/comment-multiple-outline", + "material/comment-multiple", + "material/comment-off-outline", + "material/comment-off", + "material/comment-outline", + "material/comment-plus-outline", + "material/comment-plus", + "material/comment-processing-outline", + "material/comment-processing", + "material/comment-question-outline", + "material/comment-question", + "material/comment-quote-outline", + "material/comment-quote", + "material/comment-remove-outline", + "material/comment-remove", + "material/comment-search-outline", + "material/comment-search", + "material/comment-text-multiple-outline", + "material/comment-text-multiple", + "material/comment-text-outline", + "material/comment-text", + "material/comment", + "material/compare-horizontal", + "material/compare-remove", + "material/compare-vertical", + "material/compare", + "material/compass-off-outline", + "material/compass-off", + "material/compass-outline", + "material/compass-rose", + "material/compass", + "material/compost", + "material/cone-off", + "material/cone", + "material/connection", + "material/console-line", + "material/console-network-outline", + "material/console-network", + "material/console", + "material/consolidate", + "material/contactless-payment-circle-outline", + "material/contactless-payment-circle", + "material/contactless-payment", + "material/contacts-outline", + "material/contacts", + "material/contain-end", + "material/contain-start", + "material/contain", + "material/content-copy", + "material/content-cut", + "material/content-duplicate", + "material/content-paste", + "material/content-save-alert-outline", + "material/content-save-alert", + "material/content-save-all-outline", + "material/content-save-all", + "material/content-save-check-outline", + "material/content-save-check", + "material/content-save-cog-outline", + "material/content-save-cog", + "material/content-save-edit-outline", + "material/content-save-edit", + "material/content-save-minus-outline", + "material/content-save-minus", + "material/content-save-move-outline", + "material/content-save-move", + "material/content-save-off-outline", + "material/content-save-off", + "material/content-save-outline", + "material/content-save-plus-outline", + "material/content-save-plus", + "material/content-save-settings-outline", + "material/content-save-settings", + "material/content-save", + "material/contrast-box", + "material/contrast-circle", + "material/contrast", + "material/controller-classic-outline", + "material/controller-classic", + "material/controller-off", + "material/controller", + "material/cookie-alert-outline", + "material/cookie-alert", + "material/cookie-check-outline", + "material/cookie-check", + "material/cookie-clock-outline", + "material/cookie-clock", + "material/cookie-cog-outline", + "material/cookie-cog", + "material/cookie-edit-outline", + "material/cookie-edit", + "material/cookie-lock-outline", + "material/cookie-lock", + "material/cookie-minus-outline", + "material/cookie-minus", + "material/cookie-off-outline", + "material/cookie-off", + "material/cookie-outline", + "material/cookie-plus-outline", + "material/cookie-plus", + "material/cookie-refresh-outline", + "material/cookie-refresh", + "material/cookie-remove-outline", + "material/cookie-remove", + "material/cookie-settings-outline", + "material/cookie-settings", + "material/cookie", + "material/coolant-temperature", + "material/copyleft", + "material/copyright", + "material/cordova", + "material/corn-off", + "material/corn", + "material/cosine-wave", + "material/counter", + "material/countertop-outline", + "material/countertop", + "material/cow-off", + "material/cow", + "material/cpu-32-bit", + "material/cpu-64-bit", + "material/cradle-outline", + "material/cradle", + "material/crane", + "material/creation", + "material/creative-commons", + "material/credit-card-check-outline", + "material/credit-card-check", + "material/credit-card-chip-outline", + "material/credit-card-chip", + "material/credit-card-clock-outline", + "material/credit-card-clock", + "material/credit-card-edit-outline", + "material/credit-card-edit", + "material/credit-card-fast-outline", + "material/credit-card-fast", + "material/credit-card-lock-outline", + "material/credit-card-lock", + "material/credit-card-marker-outline", + "material/credit-card-marker", + "material/credit-card-minus-outline", + "material/credit-card-minus", + "material/credit-card-multiple-outline", + "material/credit-card-multiple", + "material/credit-card-off-outline", + "material/credit-card-off", + "material/credit-card-outline", + "material/credit-card-plus-outline", + "material/credit-card-plus", + "material/credit-card-refresh-outline", + "material/credit-card-refresh", + "material/credit-card-refund-outline", + "material/credit-card-refund", + "material/credit-card-remove-outline", + "material/credit-card-remove", + "material/credit-card-scan-outline", + "material/credit-card-scan", + "material/credit-card-search-outline", + "material/credit-card-search", + "material/credit-card-settings-outline", + "material/credit-card-settings", + "material/credit-card-sync-outline", + "material/credit-card-sync", + "material/credit-card-wireless-off-outline", + "material/credit-card-wireless-off", + "material/credit-card-wireless-outline", + "material/credit-card-wireless", + "material/credit-card", + "material/cricket", + "material/crop-free", + "material/crop-landscape", + "material/crop-portrait", + "material/crop-rotate", + "material/crop-square", + "material/crop", + "material/cross-bolnisi", + "material/cross-celtic", + "material/cross-outline", + "material/cross", + "material/crosshairs-gps", + "material/crosshairs-off", + "material/crosshairs-question", + "material/crosshairs", + "material/crowd", + "material/crown-circle-outline", + "material/crown-circle", + "material/crown-outline", + "material/crown", + "material/cryengine", + "material/crystal-ball", + "material/cube-off-outline", + "material/cube-off", + "material/cube-outline", + "material/cube-scan", + "material/cube-send", + "material/cube-unfolded", + "material/cube", + "material/cup-off-outline", + "material/cup-off", + "material/cup-outline", + "material/cup-water", + "material/cup", + "material/cupboard-outline", + "material/cupboard", + "material/cupcake", + "material/curling", + "material/currency-bdt", + "material/currency-brl", + "material/currency-btc", + "material/currency-cny", + "material/currency-eth", + "material/currency-eur-off", + "material/currency-eur", + "material/currency-fra", + "material/currency-gbp", + "material/currency-ils", + "material/currency-inr", + "material/currency-jpy", + "material/currency-krw", + "material/currency-kzt", + "material/currency-mnt", + "material/currency-ngn", + "material/currency-php", + "material/currency-rial", + "material/currency-rub", + "material/currency-rupee", + "material/currency-sign", + "material/currency-try", + "material/currency-twd", + "material/currency-uah", + "material/currency-usd-off", + "material/currency-usd", + "material/current-ac", + "material/current-dc", + "material/cursor-default-click-outline", + "material/cursor-default-click", + "material/cursor-default-gesture-outline", + "material/cursor-default-gesture", + "material/cursor-default-outline", + "material/cursor-default", + "material/cursor-move", + "material/cursor-pointer", + "material/cursor-text", + "material/curtains-closed", + "material/curtains", + "material/cylinder-off", + "material/cylinder", + "material/dance-ballroom", + "material/dance-pole", + "material/data-matrix-edit", + "material/data-matrix-minus", + "material/data-matrix-plus", + "material/data-matrix-remove", + "material/data-matrix-scan", + "material/data-matrix", + "material/database-alert-outline", + "material/database-alert", + "material/database-arrow-down-outline", + "material/database-arrow-down", + "material/database-arrow-left-outline", + "material/database-arrow-left", + "material/database-arrow-right-outline", + "material/database-arrow-right", + "material/database-arrow-up-outline", + "material/database-arrow-up", + "material/database-check-outline", + "material/database-check", + "material/database-clock-outline", + "material/database-clock", + "material/database-cog-outline", + "material/database-cog", + "material/database-edit-outline", + "material/database-edit", + "material/database-export-outline", + "material/database-export", + "material/database-eye-off-outline", + "material/database-eye-off", + "material/database-eye-outline", + "material/database-eye", + "material/database-import-outline", + "material/database-import", + "material/database-lock-outline", + "material/database-lock", + "material/database-marker-outline", + "material/database-marker", + "material/database-minus-outline", + "material/database-minus", + "material/database-off-outline", + "material/database-off", + "material/database-outline", + "material/database-plus-outline", + "material/database-plus", + "material/database-refresh-outline", + "material/database-refresh", + "material/database-remove-outline", + "material/database-remove", + "material/database-search-outline", + "material/database-search", + "material/database-settings-outline", + "material/database-settings", + "material/database-sync-outline", + "material/database-sync", + "material/database", + "material/death-star-variant", + "material/death-star", + "material/deathly-hallows", + "material/debian", + "material/debug-step-into", + "material/debug-step-out", + "material/debug-step-over", + "material/decagram-outline", + "material/decagram", + "material/decimal-comma-decrease", + "material/decimal-comma-increase", + "material/decimal-comma", + "material/decimal-decrease", + "material/decimal-increase", + "material/decimal", + "material/delete-alert-outline", + "material/delete-alert", + "material/delete-circle-outline", + "material/delete-circle", + "material/delete-clock-outline", + "material/delete-clock", + "material/delete-empty-outline", + "material/delete-empty", + "material/delete-forever-outline", + "material/delete-forever", + "material/delete-off-outline", + "material/delete-off", + "material/delete-outline", + "material/delete-restore", + "material/delete-sweep-outline", + "material/delete-sweep", + "material/delete-variant", + "material/delete", + "material/delta", + "material/desk-lamp-off", + "material/desk-lamp-on", + "material/desk-lamp", + "material/desk", + "material/deskphone", + "material/desktop-classic", + "material/desktop-tower-monitor", + "material/desktop-tower", + "material/details", + "material/dev-to", + "material/developer-board", + "material/deviantart", + "material/devices", + "material/dharmachakra", + "material/diabetes", + "material/dialpad", + "material/diameter-outline", + "material/diameter-variant", + "material/diameter", + "material/diamond-outline", + "material/diamond-stone", + "material/diamond", + "material/dice-1-outline", + "material/dice-1", + "material/dice-2-outline", + "material/dice-2", + "material/dice-3-outline", + "material/dice-3", + "material/dice-4-outline", + "material/dice-4", + "material/dice-5-outline", + "material/dice-5", + "material/dice-6-outline", + "material/dice-6", + "material/dice-d10-outline", + "material/dice-d10", + "material/dice-d12-outline", + "material/dice-d12", + "material/dice-d20-outline", + "material/dice-d20", + "material/dice-d4-outline", + "material/dice-d4", + "material/dice-d6-outline", + "material/dice-d6", + "material/dice-d8-outline", + "material/dice-d8", + "material/dice-multiple-outline", + "material/dice-multiple", + "material/digital-ocean", + "material/dip-switch", + "material/directions-fork", + "material/directions", + "material/disc-alert", + "material/disc-player", + "material/disc", + "material/dishwasher-alert", + "material/dishwasher-off", + "material/dishwasher", + "material/disqus", + "material/distribute-horizontal-center", + "material/distribute-horizontal-left", + "material/distribute-horizontal-right", + "material/distribute-vertical-bottom", + "material/distribute-vertical-center", + "material/distribute-vertical-top", + "material/diversify", + "material/diving-flippers", + "material/diving-helmet", + "material/diving-scuba-flag", + "material/diving-scuba-mask", + "material/diving-scuba-tank-multiple", + "material/diving-scuba-tank", + "material/diving-scuba", + "material/diving-snorkel", + "material/diving", + "material/division-box", + "material/division", + "material/dlna", + "material/dna", + "material/dns-outline", + "material/dns", + "material/dock-bottom", + "material/dock-left", + "material/dock-right", + "material/dock-top", + "material/dock-window", + "material/docker", + "material/doctor", + "material/dog-service", + "material/dog-side-off", + "material/dog-side", + "material/dog", + "material/dolby", + "material/dolly", + "material/dolphin", + "material/domain-off", + "material/domain-plus", + "material/domain-remove", + "material/domain", + "material/dome-light", + "material/domino-mask", + "material/donkey", + "material/door-closed-lock", + "material/door-closed", + "material/door-open", + "material/door-sliding-lock", + "material/door-sliding-open", + "material/door-sliding", + "material/door", + "material/doorbell-video", + "material/doorbell", + "material/dot-net", + "material/dots-circle", + "material/dots-grid", + "material/dots-hexagon", + "material/dots-horizontal-circle-outline", + "material/dots-horizontal-circle", + "material/dots-horizontal", + "material/dots-square", + "material/dots-triangle", + "material/dots-vertical-circle-outline", + "material/dots-vertical-circle", + "material/dots-vertical", + "material/download-box-outline", + "material/download-box", + "material/download-circle-outline", + "material/download-circle", + "material/download-lock-outline", + "material/download-lock", + "material/download-multiple", + "material/download-network-outline", + "material/download-network", + "material/download-off-outline", + "material/download-off", + "material/download-outline", + "material/download", + "material/drag-horizontal-variant", + "material/drag-horizontal", + "material/drag-variant", + "material/drag-vertical-variant", + "material/drag-vertical", + "material/drag", + "material/drama-masks", + "material/draw-pen", + "material/draw", + "material/drawing-box", + "material/drawing", + "material/dresser-outline", + "material/dresser", + "material/drone", + "material/dropbox", + "material/drupal", + "material/duck", + "material/dumbbell", + "material/dump-truck", + "material/ear-hearing-loop", + "material/ear-hearing-off", + "material/ear-hearing", + "material/earbuds-off-outline", + "material/earbuds-off", + "material/earbuds-outline", + "material/earbuds", + "material/earth-arrow-right", + "material/earth-box-minus", + "material/earth-box-off", + "material/earth-box-plus", + "material/earth-box-remove", + "material/earth-box", + "material/earth-minus", + "material/earth-off", + "material/earth-plus", + "material/earth-remove", + "material/earth", + "material/egg-easter", + "material/egg-fried", + "material/egg-off-outline", + "material/egg-off", + "material/egg-outline", + "material/egg", + "material/eiffel-tower", + "material/eight-track", + "material/eject-circle-outline", + "material/eject-circle", + "material/eject-outline", + "material/eject", + "material/electric-switch-closed", + "material/electric-switch", + "material/electron-framework", + "material/elephant", + "material/elevation-decline", + "material/elevation-rise", + "material/elevator-down", + "material/elevator-passenger-off-outline", + "material/elevator-passenger-off", + "material/elevator-passenger-outline", + "material/elevator-passenger", + "material/elevator-up", + "material/elevator", + "material/ellipse-outline", + "material/ellipse", + "material/email-alert-outline", + "material/email-alert", + "material/email-arrow-left-outline", + "material/email-arrow-left", + "material/email-arrow-right-outline", + "material/email-arrow-right", + "material/email-box", + "material/email-check-outline", + "material/email-check", + "material/email-edit-outline", + "material/email-edit", + "material/email-fast-outline", + "material/email-fast", + "material/email-lock-outline", + "material/email-lock", + "material/email-mark-as-unread", + "material/email-minus-outline", + "material/email-minus", + "material/email-multiple-outline", + "material/email-multiple", + "material/email-newsletter", + "material/email-off-outline", + "material/email-off", + "material/email-open-multiple-outline", + "material/email-open-multiple", + "material/email-open-outline", + "material/email-open", + "material/email-outline", + "material/email-plus-outline", + "material/email-plus", + "material/email-remove-outline", + "material/email-remove", + "material/email-seal-outline", + "material/email-seal", + "material/email-search-outline", + "material/email-search", + "material/email-sync-outline", + "material/email-sync", + "material/email-variant", + "material/email", + "material/ember", + "material/emby", + "material/emoticon-angry-outline", + "material/emoticon-angry", + "material/emoticon-confused-outline", + "material/emoticon-confused", + "material/emoticon-cool-outline", + "material/emoticon-cool", + "material/emoticon-cry-outline", + "material/emoticon-cry", + "material/emoticon-dead-outline", + "material/emoticon-dead", + "material/emoticon-devil-outline", + "material/emoticon-devil", + "material/emoticon-excited-outline", + "material/emoticon-excited", + "material/emoticon-frown-outline", + "material/emoticon-frown", + "material/emoticon-happy-outline", + "material/emoticon-happy", + "material/emoticon-kiss-outline", + "material/emoticon-kiss", + "material/emoticon-lol-outline", + "material/emoticon-lol", + "material/emoticon-neutral-outline", + "material/emoticon-neutral", + "material/emoticon-outline", + "material/emoticon-poop-outline", + "material/emoticon-poop", + "material/emoticon-sad-outline", + "material/emoticon-sad", + "material/emoticon-sick-outline", + "material/emoticon-sick", + "material/emoticon-tongue-outline", + "material/emoticon-tongue", + "material/emoticon-wink-outline", + "material/emoticon-wink", + "material/emoticon", + "material/engine-off-outline", + "material/engine-off", + "material/engine-outline", + "material/engine", + "material/epsilon", + "material/equal-box", + "material/equal", + "material/equalizer-outline", + "material/equalizer", + "material/eraser-variant", + "material/eraser", + "material/escalator-box", + "material/escalator-down", + "material/escalator-up", + "material/escalator", + "material/eslint", + "material/et", + "material/ethereum", + "material/ethernet-cable-off", + "material/ethernet-cable", + "material/ethernet", + "material/ev-plug-ccs1", + "material/ev-plug-ccs2", + "material/ev-plug-chademo", + "material/ev-plug-tesla", + "material/ev-plug-type1", + "material/ev-plug-type2", + "material/ev-station", + "material/evernote", + "material/excavator", + "material/exclamation-thick", + "material/exclamation", + "material/exit-run", + "material/exit-to-app", + "material/expand-all-outline", + "material/expand-all", + "material/expansion-card-variant", + "material/expansion-card", + "material/exponent-box", + "material/exponent", + "material/export-variant", + "material/export", + "material/eye-arrow-left-outline", + "material/eye-arrow-left", + "material/eye-arrow-right-outline", + "material/eye-arrow-right", + "material/eye-check-outline", + "material/eye-check", + "material/eye-circle-outline", + "material/eye-circle", + "material/eye-minus-outline", + "material/eye-minus", + "material/eye-off-outline", + "material/eye-off", + "material/eye-outline", + "material/eye-plus-outline", + "material/eye-plus", + "material/eye-refresh-outline", + "material/eye-refresh", + "material/eye-remove-outline", + "material/eye-remove", + "material/eye-settings-outline", + "material/eye-settings", + "material/eye", + "material/eyedropper-minus", + "material/eyedropper-off", + "material/eyedropper-plus", + "material/eyedropper-remove", + "material/eyedropper-variant", + "material/eyedropper", + "material/face-agent", + "material/face-man-outline", + "material/face-man-profile", + "material/face-man-shimmer-outline", + "material/face-man-shimmer", + "material/face-man", + "material/face-mask-outline", + "material/face-mask", + "material/face-recognition", + "material/face-woman-outline", + "material/face-woman-profile", + "material/face-woman-shimmer-outline", + "material/face-woman-shimmer", + "material/face-woman", + "material/facebook-gaming", + "material/facebook-messenger", + "material/facebook-workplace", + "material/facebook", + "material/factory", + "material/family-tree", + "material/fan-alert", + "material/fan-auto", + "material/fan-chevron-down", + "material/fan-chevron-up", + "material/fan-clock", + "material/fan-minus", + "material/fan-off", + "material/fan-plus", + "material/fan-remove", + "material/fan-speed-1", + "material/fan-speed-2", + "material/fan-speed-3", + "material/fan", + "material/fast-forward-10", + "material/fast-forward-15", + "material/fast-forward-30", + "material/fast-forward-45", + "material/fast-forward-5", + "material/fast-forward-60", + "material/fast-forward-outline", + "material/fast-forward", + "material/faucet-variant", + "material/faucet", + "material/fax", + "material/feather", + "material/feature-search-outline", + "material/feature-search", + "material/fedora", + "material/fence-electric", + "material/fence", + "material/fencing", + "material/ferris-wheel", + "material/ferry", + "material/file-account-outline", + "material/file-account", + "material/file-alert-outline", + "material/file-alert", + "material/file-arrow-left-right-outline", + "material/file-arrow-left-right", + "material/file-arrow-up-down-outline", + "material/file-arrow-up-down", + "material/file-cabinet", + "material/file-cad-box", + "material/file-cad", + "material/file-cancel-outline", + "material/file-cancel", + "material/file-certificate-outline", + "material/file-certificate", + "material/file-chart-check-outline", + "material/file-chart-check", + "material/file-chart-outline", + "material/file-chart", + "material/file-check-outline", + "material/file-check", + "material/file-clock-outline", + "material/file-clock", + "material/file-cloud-outline", + "material/file-cloud", + "material/file-code-outline", + "material/file-code", + "material/file-cog-outline", + "material/file-cog", + "material/file-compare", + "material/file-delimited-outline", + "material/file-delimited", + "material/file-document-alert-outline", + "material/file-document-alert", + "material/file-document-check-outline", + "material/file-document-check", + "material/file-document-edit-outline", + "material/file-document-edit", + "material/file-document-minus-outline", + "material/file-document-minus", + "material/file-document-multiple-outline", + "material/file-document-multiple", + "material/file-document-outline", + "material/file-document-plus-outline", + "material/file-document-plus", + "material/file-document-remove-outline", + "material/file-document-remove", + "material/file-document", + "material/file-download-outline", + "material/file-download", + "material/file-edit-outline", + "material/file-edit", + "material/file-excel-box-outline", + "material/file-excel-box", + "material/file-excel-outline", + "material/file-excel", + "material/file-export-outline", + "material/file-export", + "material/file-eye-outline", + "material/file-eye", + "material/file-find-outline", + "material/file-find", + "material/file-gif-box", + "material/file-hidden", + "material/file-image-marker-outline", + "material/file-image-marker", + "material/file-image-minus-outline", + "material/file-image-minus", + "material/file-image-outline", + "material/file-image-plus-outline", + "material/file-image-plus", + "material/file-image-remove-outline", + "material/file-image-remove", + "material/file-image", + "material/file-import-outline", + "material/file-import", + "material/file-jpg-box", + "material/file-key-outline", + "material/file-key", + "material/file-link-outline", + "material/file-link", + "material/file-lock-open-outline", + "material/file-lock-open", + "material/file-lock-outline", + "material/file-lock", + "material/file-marker-outline", + "material/file-marker", + "material/file-minus-outline", + "material/file-minus", + "material/file-move-outline", + "material/file-move", + "material/file-multiple-outline", + "material/file-multiple", + "material/file-music-outline", + "material/file-music", + "material/file-outline", + "material/file-pdf-box", + "material/file-percent-outline", + "material/file-percent", + "material/file-phone-outline", + "material/file-phone", + "material/file-plus-outline", + "material/file-plus", + "material/file-png-box", + "material/file-powerpoint-box-outline", + "material/file-powerpoint-box", + "material/file-powerpoint-outline", + "material/file-powerpoint", + "material/file-presentation-box", + "material/file-question-outline", + "material/file-question", + "material/file-refresh-outline", + "material/file-refresh", + "material/file-remove-outline", + "material/file-remove", + "material/file-replace-outline", + "material/file-replace", + "material/file-restore-outline", + "material/file-restore", + "material/file-rotate-left-outline", + "material/file-rotate-left", + "material/file-rotate-right-outline", + "material/file-rotate-right", + "material/file-search-outline", + "material/file-search", + "material/file-send-outline", + "material/file-send", + "material/file-settings-outline", + "material/file-settings", + "material/file-sign", + "material/file-star-outline", + "material/file-star", + "material/file-swap-outline", + "material/file-swap", + "material/file-sync-outline", + "material/file-sync", + "material/file-table-box-multiple-outline", + "material/file-table-box-multiple", + "material/file-table-box-outline", + "material/file-table-box", + "material/file-table-outline", + "material/file-table", + "material/file-tree-outline", + "material/file-tree", + "material/file-undo-outline", + "material/file-undo", + "material/file-upload-outline", + "material/file-upload", + "material/file-video-outline", + "material/file-video", + "material/file-word-box-outline", + "material/file-word-box", + "material/file-word-outline", + "material/file-word", + "material/file-xml-box", + "material/file", + "material/film", + "material/filmstrip-box-multiple", + "material/filmstrip-box", + "material/filmstrip-off", + "material/filmstrip", + "material/filter-check-outline", + "material/filter-check", + "material/filter-cog-outline", + "material/filter-cog", + "material/filter-menu-outline", + "material/filter-menu", + "material/filter-minus-outline", + "material/filter-minus", + "material/filter-multiple-outline", + "material/filter-multiple", + "material/filter-off-outline", + "material/filter-off", + "material/filter-outline", + "material/filter-plus-outline", + "material/filter-plus", + "material/filter-remove-outline", + "material/filter-remove", + "material/filter-settings-outline", + "material/filter-settings", + "material/filter-variant-minus", + "material/filter-variant-plus", + "material/filter-variant-remove", + "material/filter-variant", + "material/filter", + "material/finance", + "material/find-replace", + "material/fingerprint-off", + "material/fingerprint", + "material/fire-alert", + "material/fire-circle", + "material/fire-extinguisher", + "material/fire-hydrant-alert", + "material/fire-hydrant-off", + "material/fire-hydrant", + "material/fire-off", + "material/fire-truck", + "material/fire", + "material/firebase", + "material/firefox", + "material/fireplace-off", + "material/fireplace", + "material/firewire", + "material/firework-off", + "material/firework", + "material/fish-off", + "material/fish", + "material/fishbowl-outline", + "material/fishbowl", + "material/fit-to-page-outline", + "material/fit-to-page", + "material/fit-to-screen-outline", + "material/fit-to-screen", + "material/flag-checkered", + "material/flag-minus-outline", + "material/flag-minus", + "material/flag-off-outline", + "material/flag-off", + "material/flag-outline", + "material/flag-plus-outline", + "material/flag-plus", + "material/flag-remove-outline", + "material/flag-remove", + "material/flag-triangle", + "material/flag-variant-minus-outline", + "material/flag-variant-minus", + "material/flag-variant-off-outline", + "material/flag-variant-off", + "material/flag-variant-outline", + "material/flag-variant-plus-outline", + "material/flag-variant-plus", + "material/flag-variant-remove-outline", + "material/flag-variant-remove", + "material/flag-variant", + "material/flag", + "material/flare", + "material/flash-alert-outline", + "material/flash-alert", + "material/flash-auto", + "material/flash-off-outline", + "material/flash-off", + "material/flash-outline", + "material/flash-red-eye", + "material/flash-triangle-outline", + "material/flash-triangle", + "material/flash", + "material/flashlight-off", + "material/flashlight", + "material/flask-empty-minus-outline", + "material/flask-empty-minus", + "material/flask-empty-off-outline", + "material/flask-empty-off", + "material/flask-empty-outline", + "material/flask-empty-plus-outline", + "material/flask-empty-plus", + "material/flask-empty-remove-outline", + "material/flask-empty-remove", + "material/flask-empty", + "material/flask-minus-outline", + "material/flask-minus", + "material/flask-off-outline", + "material/flask-off", + "material/flask-outline", + "material/flask-plus-outline", + "material/flask-plus", + "material/flask-remove-outline", + "material/flask-remove", + "material/flask-round-bottom-empty-outline", + "material/flask-round-bottom-empty", + "material/flask-round-bottom-outline", + "material/flask-round-bottom", + "material/flask", + "material/fleur-de-lis", + "material/flip-horizontal", + "material/flip-to-back", + "material/flip-to-front", + "material/flip-vertical", + "material/floor-lamp-dual-outline", + "material/floor-lamp-dual", + "material/floor-lamp-outline", + "material/floor-lamp-torchiere-outline", + "material/floor-lamp-torchiere-variant-outline", + "material/floor-lamp-torchiere-variant", + "material/floor-lamp-torchiere", + "material/floor-lamp", + "material/floor-plan", + "material/floppy-variant", + "material/floppy", + "material/flower-outline", + "material/flower-pollen-outline", + "material/flower-pollen", + "material/flower-poppy", + "material/flower-tulip-outline", + "material/flower-tulip", + "material/flower", + "material/focus-auto", + "material/focus-field-horizontal", + "material/focus-field-vertical", + "material/focus-field", + "material/folder-account-outline", + "material/folder-account", + "material/folder-alert-outline", + "material/folder-alert", + "material/folder-arrow-down-outline", + "material/folder-arrow-down", + "material/folder-arrow-left-outline", + "material/folder-arrow-left-right-outline", + "material/folder-arrow-left-right", + "material/folder-arrow-left", + "material/folder-arrow-right-outline", + "material/folder-arrow-right", + "material/folder-arrow-up-down-outline", + "material/folder-arrow-up-down", + "material/folder-arrow-up-outline", + "material/folder-arrow-up", + "material/folder-cancel-outline", + "material/folder-cancel", + "material/folder-check-outline", + "material/folder-check", + "material/folder-clock-outline", + "material/folder-clock", + "material/folder-cog-outline", + "material/folder-cog", + "material/folder-download-outline", + "material/folder-download", + "material/folder-edit-outline", + "material/folder-edit", + "material/folder-eye-outline", + "material/folder-eye", + "material/folder-file-outline", + "material/folder-file", + "material/folder-google-drive", + "material/folder-heart-outline", + "material/folder-heart", + "material/folder-hidden", + "material/folder-home-outline", + "material/folder-home", + "material/folder-image", + "material/folder-information-outline", + "material/folder-information", + "material/folder-key-network-outline", + "material/folder-key-network", + "material/folder-key-outline", + "material/folder-key", + "material/folder-lock-open-outline", + "material/folder-lock-open", + "material/folder-lock-outline", + "material/folder-lock", + "material/folder-marker-outline", + "material/folder-marker", + "material/folder-minus-outline", + "material/folder-minus", + "material/folder-move-outline", + "material/folder-move", + "material/folder-multiple-image", + "material/folder-multiple-outline", + "material/folder-multiple-plus-outline", + "material/folder-multiple-plus", + "material/folder-multiple", + "material/folder-music-outline", + "material/folder-music", + "material/folder-network-outline", + "material/folder-network", + "material/folder-off-outline", + "material/folder-off", + "material/folder-open-outline", + "material/folder-open", + "material/folder-outline", + "material/folder-play-outline", + "material/folder-play", + "material/folder-plus-outline", + "material/folder-plus", + "material/folder-pound-outline", + "material/folder-pound", + "material/folder-question-outline", + "material/folder-question", + "material/folder-refresh-outline", + "material/folder-refresh", + "material/folder-remove-outline", + "material/folder-remove", + "material/folder-search-outline", + "material/folder-search", + "material/folder-settings-outline", + "material/folder-settings", + "material/folder-star-multiple-outline", + "material/folder-star-multiple", + "material/folder-star-outline", + "material/folder-star", + "material/folder-swap-outline", + "material/folder-swap", + "material/folder-sync-outline", + "material/folder-sync", + "material/folder-table-outline", + "material/folder-table", + "material/folder-text-outline", + "material/folder-text", + "material/folder-upload-outline", + "material/folder-upload", + "material/folder-wrench-outline", + "material/folder-wrench", + "material/folder-zip-outline", + "material/folder-zip", + "material/folder", + "material/font-awesome", + "material/food-apple-outline", + "material/food-apple", + "material/food-croissant", + "material/food-drumstick-off-outline", + "material/food-drumstick-off", + "material/food-drumstick-outline", + "material/food-drumstick", + "material/food-fork-drink", + "material/food-halal", + "material/food-hot-dog", + "material/food-kosher", + "material/food-off-outline", + "material/food-off", + "material/food-outline", + "material/food-steak-off", + "material/food-steak", + "material/food-takeout-box-outline", + "material/food-takeout-box", + "material/food-turkey", + "material/food-variant-off", + "material/food-variant", + "material/food", + "material/foot-print", + "material/football-australian", + "material/football-helmet", + "material/football", + "material/forest", + "material/forklift", + "material/form-dropdown", + "material/form-select", + "material/form-textarea", + "material/form-textbox-lock", + "material/form-textbox-password", + "material/form-textbox", + "material/format-align-bottom", + "material/format-align-center", + "material/format-align-justify", + "material/format-align-left", + "material/format-align-middle", + "material/format-align-right", + "material/format-align-top", + "material/format-annotation-minus", + "material/format-annotation-plus", + "material/format-bold", + "material/format-clear", + "material/format-color-fill", + "material/format-color-highlight", + "material/format-color-marker-cancel", + "material/format-color-text", + "material/format-columns", + "material/format-float-center", + "material/format-float-left", + "material/format-float-none", + "material/format-float-right", + "material/format-font-size-decrease", + "material/format-font-size-increase", + "material/format-font", + "material/format-header-1", + "material/format-header-2", + "material/format-header-3", + "material/format-header-4", + "material/format-header-5", + "material/format-header-6", + "material/format-header-decrease", + "material/format-header-equal", + "material/format-header-increase", + "material/format-header-pound", + "material/format-horizontal-align-center", + "material/format-horizontal-align-left", + "material/format-horizontal-align-right", + "material/format-indent-decrease", + "material/format-indent-increase", + "material/format-italic", + "material/format-letter-case-lower", + "material/format-letter-case-upper", + "material/format-letter-case", + "material/format-letter-ends-with", + "material/format-letter-matches", + "material/format-letter-spacing-variant", + "material/format-letter-spacing", + "material/format-letter-starts-with", + "material/format-line-height", + "material/format-line-spacing", + "material/format-line-style", + "material/format-line-weight", + "material/format-list-bulleted-square", + "material/format-list-bulleted-triangle", + "material/format-list-bulleted-type", + "material/format-list-bulleted", + "material/format-list-checkbox", + "material/format-list-checks", + "material/format-list-group-plus", + "material/format-list-group", + "material/format-list-numbered-rtl", + "material/format-list-numbered", + "material/format-list-text", + "material/format-overline", + "material/format-page-break", + "material/format-page-split", + "material/format-paint", + "material/format-paragraph-spacing", + "material/format-paragraph", + "material/format-pilcrow-arrow-left", + "material/format-pilcrow-arrow-right", + "material/format-pilcrow", + "material/format-quote-close-outline", + "material/format-quote-close", + "material/format-quote-open-outline", + "material/format-quote-open", + "material/format-rotate-90", + "material/format-section", + "material/format-size", + "material/format-strikethrough-variant", + "material/format-strikethrough", + "material/format-subscript", + "material/format-superscript", + "material/format-text-rotation-angle-down", + "material/format-text-rotation-angle-up", + "material/format-text-rotation-down-vertical", + "material/format-text-rotation-down", + "material/format-text-rotation-none", + "material/format-text-rotation-up", + "material/format-text-rotation-vertical", + "material/format-text-variant-outline", + "material/format-text-variant", + "material/format-text-wrapping-clip", + "material/format-text-wrapping-overflow", + "material/format-text-wrapping-wrap", + "material/format-text", + "material/format-textbox", + "material/format-title", + "material/format-underline-wavy", + "material/format-underline", + "material/format-vertical-align-bottom", + "material/format-vertical-align-center", + "material/format-vertical-align-top", + "material/format-wrap-inline", + "material/format-wrap-square", + "material/format-wrap-tight", + "material/format-wrap-top-bottom", + "material/forum-minus-outline", + "material/forum-minus", + "material/forum-outline", + "material/forum-plus-outline", + "material/forum-plus", + "material/forum-remove-outline", + "material/forum-remove", + "material/forum", + "material/forward", + "material/forwardburger", + "material/fountain-pen-tip", + "material/fountain-pen", + "material/fountain", + "material/fraction-one-half", + "material/freebsd", + "material/french-fries", + "material/frequently-asked-questions", + "material/fridge-alert-outline", + "material/fridge-alert", + "material/fridge-bottom", + "material/fridge-industrial-alert-outline", + "material/fridge-industrial-alert", + "material/fridge-industrial-off-outline", + "material/fridge-industrial-off", + "material/fridge-industrial-outline", + "material/fridge-industrial", + "material/fridge-off-outline", + "material/fridge-off", + "material/fridge-outline", + "material/fridge-top", + "material/fridge-variant-alert-outline", + "material/fridge-variant-alert", + "material/fridge-variant-off-outline", + "material/fridge-variant-off", + "material/fridge-variant-outline", + "material/fridge-variant", + "material/fridge", + "material/fruit-cherries-off", + "material/fruit-cherries", + "material/fruit-citrus-off", + "material/fruit-citrus", + "material/fruit-grapes-outline", + "material/fruit-grapes", + "material/fruit-pear", + "material/fruit-pineapple", + "material/fruit-watermelon", + "material/fuel-cell", + "material/fuel", + "material/fullscreen-exit", + "material/fullscreen", + "material/function-variant", + "material/function", + "material/furigana-horizontal", + "material/furigana-vertical", + "material/fuse-alert", + "material/fuse-blade", + "material/fuse-off", + "material/fuse", + "material/gamepad-circle-down", + "material/gamepad-circle-left", + "material/gamepad-circle-outline", + "material/gamepad-circle-right", + "material/gamepad-circle-up", + "material/gamepad-circle", + "material/gamepad-down", + "material/gamepad-left", + "material/gamepad-outline", + "material/gamepad-right", + "material/gamepad-round-down", + "material/gamepad-round-left", + "material/gamepad-round-outline", + "material/gamepad-round-right", + "material/gamepad-round-up", + "material/gamepad-round", + "material/gamepad-square-outline", + "material/gamepad-square", + "material/gamepad-up", + "material/gamepad-variant-outline", + "material/gamepad-variant", + "material/gamepad", + "material/gamma", + "material/gantry-crane", + "material/garage-alert-variant", + "material/garage-alert", + "material/garage-lock", + "material/garage-open-variant", + "material/garage-open", + "material/garage-variant-lock", + "material/garage-variant", + "material/garage", + "material/gas-burner", + "material/gas-cylinder", + "material/gas-station-off-outline", + "material/gas-station-off", + "material/gas-station-outline", + "material/gas-station", + "material/gate-alert", + "material/gate-and", + "material/gate-arrow-left", + "material/gate-arrow-right", + "material/gate-buffer", + "material/gate-nand", + "material/gate-nor", + "material/gate-not", + "material/gate-open", + "material/gate-or", + "material/gate-xnor", + "material/gate-xor", + "material/gate", + "material/gatsby", + "material/gauge-empty", + "material/gauge-full", + "material/gauge-low", + "material/gauge", + "material/gavel", + "material/gender-female", + "material/gender-male-female-variant", + "material/gender-male-female", + "material/gender-male", + "material/gender-non-binary", + "material/gender-transgender", + "material/gentoo", + "material/gesture-double-tap", + "material/gesture-pinch", + "material/gesture-spread", + "material/gesture-swipe-down", + "material/gesture-swipe-horizontal", + "material/gesture-swipe-left", + "material/gesture-swipe-right", + "material/gesture-swipe-up", + "material/gesture-swipe-vertical", + "material/gesture-swipe", + "material/gesture-tap-box", + "material/gesture-tap-button", + "material/gesture-tap-hold", + "material/gesture-tap", + "material/gesture-two-double-tap", + "material/gesture-two-tap", + "material/gesture", + "material/ghost-off-outline", + "material/ghost-off", + "material/ghost-outline", + "material/ghost", + "material/gift-off-outline", + "material/gift-off", + "material/gift-open-outline", + "material/gift-open", + "material/gift-outline", + "material/gift", + "material/git", + "material/github", + "material/gitlab", + "material/glass-cocktail-off", + "material/glass-cocktail", + "material/glass-flute", + "material/glass-fragile", + "material/glass-mug-off", + "material/glass-mug-variant-off", + "material/glass-mug-variant", + "material/glass-mug", + "material/glass-pint-outline", + "material/glass-stange", + "material/glass-tulip", + "material/glass-wine", + "material/glasses", + "material/globe-light-outline", + "material/globe-light", + "material/globe-model", + "material/gmail", + "material/gnome", + "material/go-kart-track", + "material/go-kart", + "material/gog", + "material/gold", + "material/golf-cart", + "material/golf-tee", + "material/golf", + "material/gondola", + "material/goodreads", + "material/google-ads", + "material/google-analytics", + "material/google-assistant", + "material/google-cardboard", + "material/google-chrome", + "material/google-circles-communities", + "material/google-circles-extended", + "material/google-circles-group", + "material/google-circles", + "material/google-classroom", + "material/google-cloud", + "material/google-downasaur", + "material/google-drive", + "material/google-earth", + "material/google-fit", + "material/google-glass", + "material/google-hangouts", + "material/google-keep", + "material/google-lens", + "material/google-maps", + "material/google-my-business", + "material/google-nearby", + "material/google-play", + "material/google-plus", + "material/google-podcast", + "material/google-spreadsheet", + "material/google-street-view", + "material/google-translate", + "material/google", + "material/gradient-horizontal", + "material/gradient-vertical", + "material/grain", + "material/graph-outline", + "material/graph", + "material/graphql", + "material/grass", + "material/grave-stone", + "material/grease-pencil", + "material/greater-than-or-equal", + "material/greater-than", + "material/greenhouse", + "material/grid-large", + "material/grid-off", + "material/grid", + "material/grill-outline", + "material/grill", + "material/group", + "material/guitar-acoustic", + "material/guitar-electric", + "material/guitar-pick-outline", + "material/guitar-pick", + "material/guy-fawkes-mask", + "material/gymnastics", + "material/hail", + "material/hair-dryer-outline", + "material/hair-dryer", + "material/halloween", + "material/hamburger-check", + "material/hamburger-minus", + "material/hamburger-off", + "material/hamburger-plus", + "material/hamburger-remove", + "material/hamburger", + "material/hammer-screwdriver", + "material/hammer-sickle", + "material/hammer-wrench", + "material/hammer", + "material/hand-back-left-off-outline", + "material/hand-back-left-off", + "material/hand-back-left-outline", + "material/hand-back-left", + "material/hand-back-right-off-outline", + "material/hand-back-right-off", + "material/hand-back-right-outline", + "material/hand-back-right", + "material/hand-clap-off", + "material/hand-clap", + "material/hand-coin-outline", + "material/hand-coin", + "material/hand-cycle", + "material/hand-extended-outline", + "material/hand-extended", + "material/hand-front-left-outline", + "material/hand-front-left", + "material/hand-front-right-outline", + "material/hand-front-right", + "material/hand-heart-outline", + "material/hand-heart", + "material/hand-okay", + "material/hand-peace-variant", + "material/hand-peace", + "material/hand-pointing-down", + "material/hand-pointing-left", + "material/hand-pointing-right", + "material/hand-pointing-up", + "material/hand-saw", + "material/hand-wash-outline", + "material/hand-wash", + "material/hand-water", + "material/hand-wave-outline", + "material/hand-wave", + "material/handball", + "material/handcuffs", + "material/hands-pray", + "material/handshake-outline", + "material/handshake", + "material/hanger", + "material/hard-hat", + "material/harddisk-plus", + "material/harddisk-remove", + "material/harddisk", + "material/hat-fedora", + "material/hazard-lights", + "material/hdmi-port", + "material/hdr-off", + "material/hdr", + "material/head-alert-outline", + "material/head-alert", + "material/head-check-outline", + "material/head-check", + "material/head-cog-outline", + "material/head-cog", + "material/head-dots-horizontal-outline", + "material/head-dots-horizontal", + "material/head-flash-outline", + "material/head-flash", + "material/head-heart-outline", + "material/head-heart", + "material/head-lightbulb-outline", + "material/head-lightbulb", + "material/head-minus-outline", + "material/head-minus", + "material/head-outline", + "material/head-plus-outline", + "material/head-plus", + "material/head-question-outline", + "material/head-question", + "material/head-remove-outline", + "material/head-remove", + "material/head-snowflake-outline", + "material/head-snowflake", + "material/head-sync-outline", + "material/head-sync", + "material/head", + "material/headphones-bluetooth", + "material/headphones-box", + "material/headphones-off", + "material/headphones-settings", + "material/headphones", + "material/headset-dock", + "material/headset-off", + "material/headset", + "material/heart-box-outline", + "material/heart-box", + "material/heart-broken-outline", + "material/heart-broken", + "material/heart-circle-outline", + "material/heart-circle", + "material/heart-cog-outline", + "material/heart-cog", + "material/heart-flash", + "material/heart-half-full", + "material/heart-half-outline", + "material/heart-half", + "material/heart-minus-outline", + "material/heart-minus", + "material/heart-multiple-outline", + "material/heart-multiple", + "material/heart-off-outline", + "material/heart-off", + "material/heart-outline", + "material/heart-plus-outline", + "material/heart-plus", + "material/heart-pulse", + "material/heart-remove-outline", + "material/heart-remove", + "material/heart-settings-outline", + "material/heart-settings", + "material/heart", + "material/heat-pump-outline", + "material/heat-pump", + "material/heat-wave", + "material/heating-coil", + "material/helicopter", + "material/help-box", + "material/help-circle-outline", + "material/help-circle", + "material/help-network-outline", + "material/help-network", + "material/help-rhombus-outline", + "material/help-rhombus", + "material/help", + "material/hexadecimal", + "material/hexagon-multiple-outline", + "material/hexagon-multiple", + "material/hexagon-outline", + "material/hexagon-slice-1", + "material/hexagon-slice-2", + "material/hexagon-slice-3", + "material/hexagon-slice-4", + "material/hexagon-slice-5", + "material/hexagon-slice-6", + "material/hexagon", + "material/hexagram-outline", + "material/hexagram", + "material/high-definition-box", + "material/high-definition", + "material/highway", + "material/hiking", + "material/history", + "material/hockey-puck", + "material/hockey-sticks", + "material/hololens", + "material/home-account", + "material/home-alert-outline", + "material/home-alert", + "material/home-analytics", + "material/home-assistant", + "material/home-automation", + "material/home-battery-outline", + "material/home-battery", + "material/home-circle-outline", + "material/home-circle", + "material/home-city-outline", + "material/home-city", + "material/home-clock-outline", + "material/home-clock", + "material/home-edit-outline", + "material/home-edit", + "material/home-export-outline", + "material/home-flood", + "material/home-floor-0", + "material/home-floor-1", + "material/home-floor-2", + "material/home-floor-3", + "material/home-floor-a", + "material/home-floor-b", + "material/home-floor-g", + "material/home-floor-l", + "material/home-floor-negative-1", + "material/home-group-minus", + "material/home-group-plus", + "material/home-group-remove", + "material/home-group", + "material/home-heart", + "material/home-import-outline", + "material/home-lightbulb-outline", + "material/home-lightbulb", + "material/home-lightning-bolt-outline", + "material/home-lightning-bolt", + "material/home-lock-open", + "material/home-lock", + "material/home-map-marker", + "material/home-minus-outline", + "material/home-minus", + "material/home-modern", + "material/home-off-outline", + "material/home-off", + "material/home-outline", + "material/home-plus-outline", + "material/home-plus", + "material/home-remove-outline", + "material/home-remove", + "material/home-roof", + "material/home-search-outline", + "material/home-search", + "material/home-silo-outline", + "material/home-silo", + "material/home-switch-outline", + "material/home-switch", + "material/home-thermometer-outline", + "material/home-thermometer", + "material/home-variant-outline", + "material/home-variant", + "material/home", + "material/hook-off", + "material/hook", + "material/hoop-house", + "material/hops", + "material/horizontal-rotate-clockwise", + "material/horizontal-rotate-counterclockwise", + "material/horse-human", + "material/horse-variant-fast", + "material/horse-variant", + "material/horse", + "material/horseshoe", + "material/hospital-box-outline", + "material/hospital-box", + "material/hospital-building", + "material/hospital-marker", + "material/hospital", + "material/hot-tub", + "material/hours-24", + "material/hubspot", + "material/hulu", + "material/human-baby-changing-table", + "material/human-cane", + "material/human-capacity-decrease", + "material/human-capacity-increase", + "material/human-child", + "material/human-dolly", + "material/human-edit", + "material/human-female-boy", + "material/human-female-dance", + "material/human-female-female", + "material/human-female-girl", + "material/human-female", + "material/human-greeting-proximity", + "material/human-greeting-variant", + "material/human-greeting", + "material/human-handsdown", + "material/human-handsup", + "material/human-male-board-poll", + "material/human-male-board", + "material/human-male-boy", + "material/human-male-child", + "material/human-male-female-child", + "material/human-male-female", + "material/human-male-girl", + "material/human-male-height-variant", + "material/human-male-height", + "material/human-male-male", + "material/human-male", + "material/human-non-binary", + "material/human-pregnant", + "material/human-queue", + "material/human-scooter", + "material/human-walker", + "material/human-wheelchair", + "material/human-white-cane", + "material/human", + "material/humble-bundle", + "material/hvac-off", + "material/hvac", + "material/hydraulic-oil-level", + "material/hydraulic-oil-temperature", + "material/hydro-power", + "material/hydrogen-station", + "material/ice-cream-off", + "material/ice-cream", + "material/ice-pop", + "material/id-card", + "material/identifier", + "material/ideogram-cjk-variant", + "material/ideogram-cjk", + "material/image-album", + "material/image-area-close", + "material/image-area", + "material/image-auto-adjust", + "material/image-broken-variant", + "material/image-broken", + "material/image-check-outline", + "material/image-check", + "material/image-edit-outline", + "material/image-edit", + "material/image-filter-black-white", + "material/image-filter-center-focus-strong-outline", + "material/image-filter-center-focus-strong", + "material/image-filter-center-focus-weak", + "material/image-filter-center-focus", + "material/image-filter-drama", + "material/image-filter-frames", + "material/image-filter-hdr", + "material/image-filter-none", + "material/image-filter-tilt-shift", + "material/image-filter-vintage", + "material/image-frame", + "material/image-lock-outline", + "material/image-lock", + "material/image-marker-outline", + "material/image-marker", + "material/image-minus-outline", + "material/image-minus", + "material/image-move", + "material/image-multiple-outline", + "material/image-multiple", + "material/image-off-outline", + "material/image-off", + "material/image-outline", + "material/image-plus-outline", + "material/image-plus", + "material/image-refresh-outline", + "material/image-refresh", + "material/image-remove-outline", + "material/image-remove", + "material/image-search-outline", + "material/image-search", + "material/image-size-select-actual", + "material/image-size-select-large", + "material/image-size-select-small", + "material/image-sync-outline", + "material/image-sync", + "material/image-text", + "material/image", + "material/import", + "material/inbox-arrow-down-outline", + "material/inbox-arrow-down", + "material/inbox-arrow-up-outline", + "material/inbox-arrow-up", + "material/inbox-full-outline", + "material/inbox-full", + "material/inbox-multiple-outline", + "material/inbox-multiple", + "material/inbox-outline", + "material/inbox-remove-outline", + "material/inbox-remove", + "material/inbox", + "material/incognito-circle-off", + "material/incognito-circle", + "material/incognito-off", + "material/incognito", + "material/induction", + "material/infinity", + "material/information-off-outline", + "material/information-off", + "material/information-outline", + "material/information-variant", + "material/information", + "material/instagram", + "material/instrument-triangle", + "material/integrated-circuit-chip", + "material/invert-colors-off", + "material/invert-colors", + "material/iobroker", + "material/ip-network-outline", + "material/ip-network", + "material/ip-outline", + "material/ip", + "material/ipod", + "material/iron-board", + "material/iron-outline", + "material/iron", + "material/island", + "material/iv-bag", + "material/jabber", + "material/jeepney", + "material/jellyfish-outline", + "material/jellyfish", + "material/jira", + "material/jquery", + "material/jsfiddle", + "material/jump-rope", + "material/kabaddi", + "material/kangaroo", + "material/karate", + "material/kayaking", + "material/keg", + "material/kettle-alert-outline", + "material/kettle-alert", + "material/kettle-off-outline", + "material/kettle-off", + "material/kettle-outline", + "material/kettle-pour-over", + "material/kettle-steam-outline", + "material/kettle-steam", + "material/kettle", + "material/kettlebell", + "material/key-alert-outline", + "material/key-alert", + "material/key-arrow-right", + "material/key-chain-variant", + "material/key-chain", + "material/key-change", + "material/key-link", + "material/key-minus", + "material/key-outline", + "material/key-plus", + "material/key-remove", + "material/key-star", + "material/key-variant", + "material/key-wireless", + "material/key", + "material/keyboard-backspace", + "material/keyboard-caps", + "material/keyboard-close", + "material/keyboard-esc", + "material/keyboard-f1", + "material/keyboard-f10", + "material/keyboard-f11", + "material/keyboard-f12", + "material/keyboard-f2", + "material/keyboard-f3", + "material/keyboard-f4", + "material/keyboard-f5", + "material/keyboard-f6", + "material/keyboard-f7", + "material/keyboard-f8", + "material/keyboard-f9", + "material/keyboard-off-outline", + "material/keyboard-off", + "material/keyboard-outline", + "material/keyboard-return", + "material/keyboard-settings-outline", + "material/keyboard-settings", + "material/keyboard-space", + "material/keyboard-tab-reverse", + "material/keyboard-tab", + "material/keyboard-variant", + "material/keyboard", + "material/khanda", + "material/kickstarter", + "material/kite-outline", + "material/kite", + "material/kitesurfing", + "material/klingon", + "material/knife-military", + "material/knife", + "material/knob", + "material/koala", + "material/kodi", + "material/kubernetes", + "material/label-multiple-outline", + "material/label-multiple", + "material/label-off-outline", + "material/label-off", + "material/label-outline", + "material/label-percent-outline", + "material/label-percent", + "material/label-variant-outline", + "material/label-variant", + "material/label", + "material/ladder", + "material/ladybug", + "material/lambda", + "material/lamp-outline", + "material/lamp", + "material/lamps-outline", + "material/lamps", + "material/lan-check", + "material/lan-connect", + "material/lan-disconnect", + "material/lan-pending", + "material/lan", + "material/land-fields", + "material/land-plots-circle-variant", + "material/land-plots-circle", + "material/land-plots", + "material/land-rows-horizontal", + "material/land-rows-vertical", + "material/landslide-outline", + "material/landslide", + "material/language-c", + "material/language-cpp", + "material/language-csharp", + "material/language-css3", + "material/language-fortran", + "material/language-go", + "material/language-haskell", + "material/language-html5", + "material/language-java", + "material/language-javascript", + "material/language-kotlin", + "material/language-lua", + "material/language-markdown-outline", + "material/language-markdown", + "material/language-php", + "material/language-python", + "material/language-r", + "material/language-ruby-on-rails", + "material/language-ruby", + "material/language-rust", + "material/language-swift", + "material/language-typescript", + "material/language-xaml", + "material/laptop-account", + "material/laptop-off", + "material/laptop", + "material/laravel", + "material/laser-pointer", + "material/lasso", + "material/lastpass", + "material/latitude", + "material/launch", + "material/lava-lamp", + "material/layers-edit", + "material/layers-minus", + "material/layers-off-outline", + "material/layers-off", + "material/layers-outline", + "material/layers-plus", + "material/layers-remove", + "material/layers-search-outline", + "material/layers-search", + "material/layers-triple-outline", + "material/layers-triple", + "material/layers", + "material/lead-pencil", + "material/leaf-circle-outline", + "material/leaf-circle", + "material/leaf-maple-off", + "material/leaf-maple", + "material/leaf-off", + "material/leaf", + "material/leak-off", + "material/leak", + "material/lectern", + "material/led-off", + "material/led-on", + "material/led-outline", + "material/led-strip-variant-off", + "material/led-strip-variant", + "material/led-strip", + "material/led-variant-off", + "material/led-variant-on", + "material/led-variant-outline", + "material/leek", + "material/less-than-or-equal", + "material/less-than", + "material/library-outline", + "material/library-shelves", + "material/library", + "material/license", + "material/lifebuoy", + "material/light-flood-down", + "material/light-flood-up", + "material/light-recessed", + "material/light-switch-off", + "material/light-switch", + "material/lightbulb-alert-outline", + "material/lightbulb-alert", + "material/lightbulb-auto-outline", + "material/lightbulb-auto", + "material/lightbulb-cfl-off", + "material/lightbulb-cfl-spiral-off", + "material/lightbulb-cfl-spiral", + "material/lightbulb-cfl", + "material/lightbulb-fluorescent-tube-outline", + "material/lightbulb-fluorescent-tube", + "material/lightbulb-group-off-outline", + "material/lightbulb-group-off", + "material/lightbulb-group-outline", + "material/lightbulb-group", + "material/lightbulb-multiple-off-outline", + "material/lightbulb-multiple-off", + "material/lightbulb-multiple-outline", + "material/lightbulb-multiple", + "material/lightbulb-night-outline", + "material/lightbulb-night", + "material/lightbulb-off-outline", + "material/lightbulb-off", + "material/lightbulb-on-10", + "material/lightbulb-on-20", + "material/lightbulb-on-30", + "material/lightbulb-on-40", + "material/lightbulb-on-50", + "material/lightbulb-on-60", + "material/lightbulb-on-70", + "material/lightbulb-on-80", + "material/lightbulb-on-90", + "material/lightbulb-on-outline", + "material/lightbulb-on", + "material/lightbulb-outline", + "material/lightbulb-question-outline", + "material/lightbulb-question", + "material/lightbulb-spot-off", + "material/lightbulb-spot", + "material/lightbulb-variant-outline", + "material/lightbulb-variant", + "material/lightbulb", + "material/lighthouse-on", + "material/lighthouse", + "material/lightning-bolt-circle", + "material/lightning-bolt-outline", + "material/lightning-bolt", + "material/line-scan", + "material/lingerie", + "material/link-box-outline", + "material/link-box-variant-outline", + "material/link-box-variant", + "material/link-box", + "material/link-lock", + "material/link-off", + "material/link-plus", + "material/link-variant-minus", + "material/link-variant-off", + "material/link-variant-plus", + "material/link-variant-remove", + "material/link-variant", + "material/link", + "material/linkedin", + "material/linux-mint", + "material/linux", + "material/lipstick", + "material/liquid-spot", + "material/liquor", + "material/list-box-outline", + "material/list-box", + "material/list-status", + "material/litecoin", + "material/loading", + "material/location-enter", + "material/location-exit", + "material/lock-alert-outline", + "material/lock-alert", + "material/lock-check-outline", + "material/lock-check", + "material/lock-clock", + "material/lock-minus-outline", + "material/lock-minus", + "material/lock-off-outline", + "material/lock-off", + "material/lock-open-alert-outline", + "material/lock-open-alert", + "material/lock-open-check-outline", + "material/lock-open-check", + "material/lock-open-minus-outline", + "material/lock-open-minus", + "material/lock-open-outline", + "material/lock-open-plus-outline", + "material/lock-open-plus", + "material/lock-open-remove-outline", + "material/lock-open-remove", + "material/lock-open-variant-outline", + "material/lock-open-variant", + "material/lock-open", + "material/lock-outline", + "material/lock-pattern", + "material/lock-plus-outline", + "material/lock-plus", + "material/lock-question", + "material/lock-remove-outline", + "material/lock-remove", + "material/lock-reset", + "material/lock-smart", + "material/lock", + "material/locker-multiple", + "material/locker", + "material/login-variant", + "material/login", + "material/logout-variant", + "material/logout", + "material/longitude", + "material/looks", + "material/lotion-outline", + "material/lotion-plus-outline", + "material/lotion-plus", + "material/lotion", + "material/loupe", + "material/lumx", + "material/lungs", + "material/mace", + "material/magazine-pistol", + "material/magazine-rifle", + "material/magic-staff", + "material/magnet-on", + "material/magnet", + "material/magnify-close", + "material/magnify-expand", + "material/magnify-minus-cursor", + "material/magnify-minus-outline", + "material/magnify-minus", + "material/magnify-plus-cursor", + "material/magnify-plus-outline", + "material/magnify-plus", + "material/magnify-remove-cursor", + "material/magnify-remove-outline", + "material/magnify-scan", + "material/magnify", + "material/mail", + "material/mailbox-open-outline", + "material/mailbox-open-up-outline", + "material/mailbox-open-up", + "material/mailbox-open", + "material/mailbox-outline", + "material/mailbox-up-outline", + "material/mailbox-up", + "material/mailbox", + "material/manjaro", + "material/map-check-outline", + "material/map-check", + "material/map-clock-outline", + "material/map-clock", + "material/map-legend", + "material/map-marker-account-outline", + "material/map-marker-account", + "material/map-marker-alert-outline", + "material/map-marker-alert", + "material/map-marker-check-outline", + "material/map-marker-check", + "material/map-marker-circle", + "material/map-marker-distance", + "material/map-marker-down", + "material/map-marker-left-outline", + "material/map-marker-left", + "material/map-marker-minus-outline", + "material/map-marker-minus", + "material/map-marker-multiple-outline", + "material/map-marker-multiple", + "material/map-marker-off-outline", + "material/map-marker-off", + "material/map-marker-outline", + "material/map-marker-path", + "material/map-marker-plus-outline", + "material/map-marker-plus", + "material/map-marker-question-outline", + "material/map-marker-question", + "material/map-marker-radius-outline", + "material/map-marker-radius", + "material/map-marker-remove-outline", + "material/map-marker-remove-variant", + "material/map-marker-remove", + "material/map-marker-right-outline", + "material/map-marker-right", + "material/map-marker-star-outline", + "material/map-marker-star", + "material/map-marker-up", + "material/map-marker", + "material/map-minus", + "material/map-outline", + "material/map-plus", + "material/map-search-outline", + "material/map-search", + "material/map", + "material/mapbox", + "material/margin", + "material/marker-cancel", + "material/marker-check", + "material/marker", + "material/mastodon", + "material/material-design", + "material/material-ui", + "material/math-compass", + "material/math-cos", + "material/math-integral-box", + "material/math-integral", + "material/math-log", + "material/math-norm-box", + "material/math-norm", + "material/math-sin", + "material/math-tan", + "material/matrix", + "material/medal-outline", + "material/medal", + "material/medical-bag", + "material/medical-cotton-swab", + "material/medication-outline", + "material/medication", + "material/meditation", + "material/memory", + "material/menorah-fire", + "material/menorah", + "material/menu-down-outline", + "material/menu-down", + "material/menu-left-outline", + "material/menu-left", + "material/menu-open", + "material/menu-right-outline", + "material/menu-right", + "material/menu-swap-outline", + "material/menu-swap", + "material/menu-up-outline", + "material/menu-up", + "material/menu", + "material/merge", + "material/message-alert-outline", + "material/message-alert", + "material/message-arrow-left-outline", + "material/message-arrow-left", + "material/message-arrow-right-outline", + "material/message-arrow-right", + "material/message-badge-outline", + "material/message-badge", + "material/message-bookmark-outline", + "material/message-bookmark", + "material/message-bulleted-off", + "material/message-bulleted", + "material/message-check-outline", + "material/message-check", + "material/message-cog-outline", + "material/message-cog", + "material/message-draw", + "material/message-fast-outline", + "material/message-fast", + "material/message-flash-outline", + "material/message-flash", + "material/message-image-outline", + "material/message-image", + "material/message-lock-outline", + "material/message-lock", + "material/message-minus-outline", + "material/message-minus", + "material/message-off-outline", + "material/message-off", + "material/message-outline", + "material/message-plus-outline", + "material/message-plus", + "material/message-processing-outline", + "material/message-processing", + "material/message-question-outline", + "material/message-question", + "material/message-reply-outline", + "material/message-reply-text-outline", + "material/message-reply-text", + "material/message-reply", + "material/message-settings-outline", + "material/message-settings", + "material/message-star-outline", + "material/message-star", + "material/message-text-clock-outline", + "material/message-text-clock", + "material/message-text-fast-outline", + "material/message-text-fast", + "material/message-text-lock-outline", + "material/message-text-lock", + "material/message-text-outline", + "material/message-text", + "material/message-video", + "material/message", + "material/meteor", + "material/meter-electric-outline", + "material/meter-electric", + "material/meter-gas-outline", + "material/meter-gas", + "material/metronome-tick", + "material/metronome", + "material/micro-sd", + "material/microphone-message-off", + "material/microphone-message", + "material/microphone-minus", + "material/microphone-off", + "material/microphone-outline", + "material/microphone-plus", + "material/microphone-question-outline", + "material/microphone-question", + "material/microphone-settings", + "material/microphone-variant-off", + "material/microphone-variant", + "material/microphone", + "material/microscope", + "material/microsoft-access", + "material/microsoft-azure-devops", + "material/microsoft-azure", + "material/microsoft-bing", + "material/microsoft-dynamics-365", + "material/microsoft-edge", + "material/microsoft-excel", + "material/microsoft-internet-explorer", + "material/microsoft-office", + "material/microsoft-onedrive", + "material/microsoft-onenote", + "material/microsoft-outlook", + "material/microsoft-powerpoint", + "material/microsoft-sharepoint", + "material/microsoft-teams", + "material/microsoft-visual-studio-code", + "material/microsoft-visual-studio", + "material/microsoft-windows-classic", + "material/microsoft-windows", + "material/microsoft-word", + "material/microsoft-xbox-controller-battery-alert", + "material/microsoft-xbox-controller-battery-charging", + "material/microsoft-xbox-controller-battery-empty", + "material/microsoft-xbox-controller-battery-full", + "material/microsoft-xbox-controller-battery-low", + "material/microsoft-xbox-controller-battery-medium", + "material/microsoft-xbox-controller-battery-unknown", + "material/microsoft-xbox-controller-menu", + "material/microsoft-xbox-controller-off", + "material/microsoft-xbox-controller-view", + "material/microsoft-xbox-controller", + "material/microsoft-xbox", + "material/microsoft", + "material/microwave-off", + "material/microwave", + "material/middleware-outline", + "material/middleware", + "material/midi-port", + "material/midi", + "material/mine", + "material/minecraft", + "material/mini-sd", + "material/minidisc", + "material/minus-box-multiple-outline", + "material/minus-box-multiple", + "material/minus-box-outline", + "material/minus-box", + "material/minus-circle-multiple-outline", + "material/minus-circle-multiple", + "material/minus-circle-off-outline", + "material/minus-circle-off", + "material/minus-circle-outline", + "material/minus-circle", + "material/minus-network-outline", + "material/minus-network", + "material/minus-thick", + "material/minus", + "material/mirror-rectangle", + "material/mirror-variant", + "material/mirror", + "material/mixed-martial-arts", + "material/mixed-reality", + "material/molecule-co", + "material/molecule-co2", + "material/molecule", + "material/monitor-account", + "material/monitor-arrow-down-variant", + "material/monitor-arrow-down", + "material/monitor-cellphone-star", + "material/monitor-cellphone", + "material/monitor-dashboard", + "material/monitor-edit", + "material/monitor-eye", + "material/monitor-lock", + "material/monitor-multiple", + "material/monitor-off", + "material/monitor-screenshot", + "material/monitor-share", + "material/monitor-shimmer", + "material/monitor-small", + "material/monitor-speaker-off", + "material/monitor-speaker", + "material/monitor-star", + "material/monitor", + "material/moon-first-quarter", + "material/moon-full", + "material/moon-last-quarter", + "material/moon-new", + "material/moon-waning-crescent", + "material/moon-waning-gibbous", + "material/moon-waxing-crescent", + "material/moon-waxing-gibbous", + "material/moped-electric-outline", + "material/moped-electric", + "material/moped-outline", + "material/moped", + "material/more", + "material/mortar-pestle-plus", + "material/mortar-pestle", + "material/mosque-outline", + "material/mosque", + "material/mother-heart", + "material/mother-nurse", + "material/motion-outline", + "material/motion-pause-outline", + "material/motion-pause", + "material/motion-play-outline", + "material/motion-play", + "material/motion-sensor-off", + "material/motion-sensor", + "material/motion", + "material/motorbike-electric", + "material/motorbike-off", + "material/motorbike", + "material/mouse-bluetooth", + "material/mouse-move-down", + "material/mouse-move-up", + "material/mouse-move-vertical", + "material/mouse-off", + "material/mouse-variant-off", + "material/mouse-variant", + "material/mouse", + "material/move-resize-variant", + "material/move-resize", + "material/movie-check-outline", + "material/movie-check", + "material/movie-cog-outline", + "material/movie-cog", + "material/movie-edit-outline", + "material/movie-edit", + "material/movie-filter-outline", + "material/movie-filter", + "material/movie-minus-outline", + "material/movie-minus", + "material/movie-off-outline", + "material/movie-off", + "material/movie-open-check-outline", + "material/movie-open-check", + "material/movie-open-cog-outline", + "material/movie-open-cog", + "material/movie-open-edit-outline", + "material/movie-open-edit", + "material/movie-open-minus-outline", + "material/movie-open-minus", + "material/movie-open-off-outline", + "material/movie-open-off", + "material/movie-open-outline", + "material/movie-open-play-outline", + "material/movie-open-play", + "material/movie-open-plus-outline", + "material/movie-open-plus", + "material/movie-open-remove-outline", + "material/movie-open-remove", + "material/movie-open-settings-outline", + "material/movie-open-settings", + "material/movie-open-star-outline", + "material/movie-open-star", + "material/movie-open", + "material/movie-outline", + "material/movie-play-outline", + "material/movie-play", + "material/movie-plus-outline", + "material/movie-plus", + "material/movie-remove-outline", + "material/movie-remove", + "material/movie-roll", + "material/movie-search-outline", + "material/movie-search", + "material/movie-settings-outline", + "material/movie-settings", + "material/movie-star-outline", + "material/movie-star", + "material/movie", + "material/mower-bag-on", + "material/mower-bag", + "material/mower-on", + "material/mower", + "material/muffin", + "material/multicast", + "material/multimedia", + "material/multiplication-box", + "material/multiplication", + "material/mushroom-off-outline", + "material/mushroom-off", + "material/mushroom-outline", + "material/mushroom", + "material/music-accidental-double-flat", + "material/music-accidental-double-sharp", + "material/music-accidental-flat", + "material/music-accidental-natural", + "material/music-accidental-sharp", + "material/music-box-multiple-outline", + "material/music-box-multiple", + "material/music-box-outline", + "material/music-box", + "material/music-circle-outline", + "material/music-circle", + "material/music-clef-alto", + "material/music-clef-bass", + "material/music-clef-treble", + "material/music-note-bluetooth-off", + "material/music-note-bluetooth", + "material/music-note-eighth-dotted", + "material/music-note-eighth", + "material/music-note-half-dotted", + "material/music-note-half", + "material/music-note-minus", + "material/music-note-off-outline", + "material/music-note-off", + "material/music-note-outline", + "material/music-note-plus", + "material/music-note-quarter-dotted", + "material/music-note-quarter", + "material/music-note-sixteenth-dotted", + "material/music-note-sixteenth", + "material/music-note-whole-dotted", + "material/music-note-whole", + "material/music-note", + "material/music-off", + "material/music-rest-eighth", + "material/music-rest-half", + "material/music-rest-quarter", + "material/music-rest-sixteenth", + "material/music-rest-whole", + "material/music", + "material/mustache", + "material/nail", + "material/nas", + "material/nativescript", + "material/nature-people", + "material/nature", + "material/navigation-outline", + "material/navigation-variant-outline", + "material/navigation-variant", + "material/navigation", + "material/near-me", + "material/necklace", + "material/needle-off", + "material/needle", + "material/netflix", + "material/network-off-outline", + "material/network-off", + "material/network-outline", + "material/network-pos", + "material/network-strength-1-alert", + "material/network-strength-1", + "material/network-strength-2-alert", + "material/network-strength-2", + "material/network-strength-3-alert", + "material/network-strength-3", + "material/network-strength-4-alert", + "material/network-strength-4-cog", + "material/network-strength-4", + "material/network-strength-off-outline", + "material/network-strength-off", + "material/network-strength-outline", + "material/network", + "material/new-box", + "material/newspaper-check", + "material/newspaper-minus", + "material/newspaper-plus", + "material/newspaper-remove", + "material/newspaper-variant-multiple-outline", + "material/newspaper-variant-multiple", + "material/newspaper-variant-outline", + "material/newspaper-variant", + "material/newspaper", + "material/nfc-search-variant", + "material/nfc-tap", + "material/nfc-variant-off", + "material/nfc-variant", + "material/nfc", + "material/ninja", + "material/nintendo-game-boy", + "material/nintendo-switch", + "material/nintendo-wii", + "material/nintendo-wiiu", + "material/nix", + "material/nodejs", + "material/noodles", + "material/not-equal-variant", + "material/not-equal", + "material/note-alert-outline", + "material/note-alert", + "material/note-check-outline", + "material/note-check", + "material/note-edit-outline", + "material/note-edit", + "material/note-minus-outline", + "material/note-minus", + "material/note-multiple-outline", + "material/note-multiple", + "material/note-off-outline", + "material/note-off", + "material/note-outline", + "material/note-plus-outline", + "material/note-plus", + "material/note-remove-outline", + "material/note-remove", + "material/note-search-outline", + "material/note-search", + "material/note-text-outline", + "material/note-text", + "material/note", + "material/notebook-check-outline", + "material/notebook-check", + "material/notebook-edit-outline", + "material/notebook-edit", + "material/notebook-heart-outline", + "material/notebook-heart", + "material/notebook-minus-outline", + "material/notebook-minus", + "material/notebook-multiple", + "material/notebook-outline", + "material/notebook-plus-outline", + "material/notebook-plus", + "material/notebook-remove-outline", + "material/notebook-remove", + "material/notebook", + "material/notification-clear-all", + "material/npm", + "material/nuke", + "material/null", + "material/numeric-0-box-multiple-outline", + "material/numeric-0-box-multiple", + "material/numeric-0-box-outline", + "material/numeric-0-box", + "material/numeric-0-circle-outline", + "material/numeric-0-circle", + "material/numeric-0", + "material/numeric-1-box-multiple-outline", + "material/numeric-1-box-multiple", + "material/numeric-1-box-outline", + "material/numeric-1-box", + "material/numeric-1-circle-outline", + "material/numeric-1-circle", + "material/numeric-1", + "material/numeric-10-box-multiple-outline", + "material/numeric-10-box-multiple", + "material/numeric-10-box-outline", + "material/numeric-10-box", + "material/numeric-10-circle-outline", + "material/numeric-10-circle", + "material/numeric-10", + "material/numeric-2-box-multiple-outline", + "material/numeric-2-box-multiple", + "material/numeric-2-box-outline", + "material/numeric-2-box", + "material/numeric-2-circle-outline", + "material/numeric-2-circle", + "material/numeric-2", + "material/numeric-3-box-multiple-outline", + "material/numeric-3-box-multiple", + "material/numeric-3-box-outline", + "material/numeric-3-box", + "material/numeric-3-circle-outline", + "material/numeric-3-circle", + "material/numeric-3", + "material/numeric-4-box-multiple-outline", + "material/numeric-4-box-multiple", + "material/numeric-4-box-outline", + "material/numeric-4-box", + "material/numeric-4-circle-outline", + "material/numeric-4-circle", + "material/numeric-4", + "material/numeric-5-box-multiple-outline", + "material/numeric-5-box-multiple", + "material/numeric-5-box-outline", + "material/numeric-5-box", + "material/numeric-5-circle-outline", + "material/numeric-5-circle", + "material/numeric-5", + "material/numeric-6-box-multiple-outline", + "material/numeric-6-box-multiple", + "material/numeric-6-box-outline", + "material/numeric-6-box", + "material/numeric-6-circle-outline", + "material/numeric-6-circle", + "material/numeric-6", + "material/numeric-7-box-multiple-outline", + "material/numeric-7-box-multiple", + "material/numeric-7-box-outline", + "material/numeric-7-box", + "material/numeric-7-circle-outline", + "material/numeric-7-circle", + "material/numeric-7", + "material/numeric-8-box-multiple-outline", + "material/numeric-8-box-multiple", + "material/numeric-8-box-outline", + "material/numeric-8-box", + "material/numeric-8-circle-outline", + "material/numeric-8-circle", + "material/numeric-8", + "material/numeric-9-box-multiple-outline", + "material/numeric-9-box-multiple", + "material/numeric-9-box-outline", + "material/numeric-9-box", + "material/numeric-9-circle-outline", + "material/numeric-9-circle", + "material/numeric-9-plus-box-multiple-outline", + "material/numeric-9-plus-box-multiple", + "material/numeric-9-plus-box-outline", + "material/numeric-9-plus-box", + "material/numeric-9-plus-circle-outline", + "material/numeric-9-plus-circle", + "material/numeric-9-plus", + "material/numeric-9", + "material/numeric-negative-1", + "material/numeric-off", + "material/numeric-positive-1", + "material/numeric", + "material/nut", + "material/nutrition", + "material/nuxt", + "material/oar", + "material/ocarina", + "material/oci", + "material/ocr", + "material/octagon-outline", + "material/octagon", + "material/octagram-outline", + "material/octagram", + "material/octahedron-off", + "material/octahedron", + "material/odnoklassniki", + "material/offer", + "material/office-building-cog-outline", + "material/office-building-cog", + "material/office-building-marker-outline", + "material/office-building-marker", + "material/office-building-minus-outline", + "material/office-building-minus", + "material/office-building-outline", + "material/office-building-plus-outline", + "material/office-building-plus", + "material/office-building-remove-outline", + "material/office-building-remove", + "material/office-building", + "material/oil-lamp", + "material/oil-level", + "material/oil-temperature", + "material/oil", + "material/om", + "material/omega", + "material/one-up", + "material/onepassword", + "material/opacity", + "material/open-in-app", + "material/open-in-new", + "material/open-source-initiative", + "material/openid", + "material/opera", + "material/orbit-variant", + "material/orbit", + "material/order-alphabetical-ascending", + "material/order-alphabetical-descending", + "material/order-bool-ascending-variant", + "material/order-bool-ascending", + "material/order-bool-descending-variant", + "material/order-bool-descending", + "material/order-numeric-ascending", + "material/order-numeric-descending", + "material/origin", + "material/ornament-variant", + "material/ornament", + "material/outdoor-lamp", + "material/overscan", + "material/owl", + "material/pac-man", + "material/package-check", + "material/package-down", + "material/package-up", + "material/package-variant-closed-check", + "material/package-variant-closed-minus", + "material/package-variant-closed-plus", + "material/package-variant-closed-remove", + "material/package-variant-closed", + "material/package-variant-minus", + "material/package-variant-plus", + "material/package-variant-remove", + "material/package-variant", + "material/package", + "material/page-first", + "material/page-last", + "material/page-layout-body", + "material/page-layout-footer", + "material/page-layout-header-footer", + "material/page-layout-header", + "material/page-layout-sidebar-left", + "material/page-layout-sidebar-right", + "material/page-next-outline", + "material/page-next", + "material/page-previous-outline", + "material/page-previous", + "material/pail-minus-outline", + "material/pail-minus", + "material/pail-off-outline", + "material/pail-off", + "material/pail-outline", + "material/pail-plus-outline", + "material/pail-plus", + "material/pail-remove-outline", + "material/pail-remove", + "material/pail", + "material/palette-advanced", + "material/palette-outline", + "material/palette-swatch-outline", + "material/palette-swatch-variant", + "material/palette-swatch", + "material/palette", + "material/palm-tree", + "material/pan-bottom-left", + "material/pan-bottom-right", + "material/pan-down", + "material/pan-horizontal", + "material/pan-left", + "material/pan-right", + "material/pan-top-left", + "material/pan-top-right", + "material/pan-up", + "material/pan-vertical", + "material/pan", + "material/panda", + "material/pandora", + "material/panorama-fisheye", + "material/panorama-horizontal-outline", + "material/panorama-horizontal", + "material/panorama-outline", + "material/panorama-sphere-outline", + "material/panorama-sphere", + "material/panorama-variant-outline", + "material/panorama-variant", + "material/panorama-vertical-outline", + "material/panorama-vertical", + "material/panorama-wide-angle-outline", + "material/panorama-wide-angle", + "material/panorama", + "material/paper-cut-vertical", + "material/paper-roll-outline", + "material/paper-roll", + "material/paperclip-check", + "material/paperclip-lock", + "material/paperclip-minus", + "material/paperclip-off", + "material/paperclip-plus", + "material/paperclip-remove", + "material/paperclip", + "material/parachute-outline", + "material/parachute", + "material/paragliding", + "material/parking", + "material/party-popper", + "material/passport-biometric", + "material/passport", + "material/pasta", + "material/patio-heater", + "material/patreon", + "material/pause-box-outline", + "material/pause-box", + "material/pause-circle-outline", + "material/pause-circle", + "material/pause-octagon-outline", + "material/pause-octagon", + "material/pause", + "material/paw-off-outline", + "material/paw-off", + "material/paw-outline", + "material/paw", + "material/peace", + "material/peanut-off-outline", + "material/peanut-off", + "material/peanut-outline", + "material/peanut", + "material/pen-lock", + "material/pen-minus", + "material/pen-off", + "material/pen-plus", + "material/pen-remove", + "material/pen", + "material/pencil-box-multiple-outline", + "material/pencil-box-multiple", + "material/pencil-box-outline", + "material/pencil-box", + "material/pencil-circle-outline", + "material/pencil-circle", + "material/pencil-lock-outline", + "material/pencil-lock", + "material/pencil-minus-outline", + "material/pencil-minus", + "material/pencil-off-outline", + "material/pencil-off", + "material/pencil-outline", + "material/pencil-plus-outline", + "material/pencil-plus", + "material/pencil-remove-outline", + "material/pencil-remove", + "material/pencil-ruler", + "material/pencil", + "material/penguin", + "material/pentagon-outline", + "material/pentagon", + "material/pentagram", + "material/percent-box-outline", + "material/percent-box", + "material/percent-circle-outline", + "material/percent-circle", + "material/percent-outline", + "material/percent", + "material/periodic-table", + "material/perspective-less", + "material/perspective-more", + "material/ph", + "material/phone-alert-outline", + "material/phone-alert", + "material/phone-bluetooth-outline", + "material/phone-bluetooth", + "material/phone-cancel-outline", + "material/phone-cancel", + "material/phone-check-outline", + "material/phone-check", + "material/phone-classic-off", + "material/phone-classic", + "material/phone-clock", + "material/phone-dial-outline", + "material/phone-dial", + "material/phone-forward-outline", + "material/phone-forward", + "material/phone-hangup-outline", + "material/phone-hangup", + "material/phone-in-talk-outline", + "material/phone-in-talk", + "material/phone-incoming-outgoing-outline", + "material/phone-incoming-outgoing", + "material/phone-incoming-outline", + "material/phone-incoming", + "material/phone-lock-outline", + "material/phone-lock", + "material/phone-log-outline", + "material/phone-log", + "material/phone-message-outline", + "material/phone-message", + "material/phone-minus-outline", + "material/phone-minus", + "material/phone-missed-outline", + "material/phone-missed", + "material/phone-off-outline", + "material/phone-off", + "material/phone-outgoing-outline", + "material/phone-outgoing", + "material/phone-outline", + "material/phone-paused-outline", + "material/phone-paused", + "material/phone-plus-outline", + "material/phone-plus", + "material/phone-refresh-outline", + "material/phone-refresh", + "material/phone-remove-outline", + "material/phone-remove", + "material/phone-return-outline", + "material/phone-return", + "material/phone-ring-outline", + "material/phone-ring", + "material/phone-rotate-landscape", + "material/phone-rotate-portrait", + "material/phone-settings-outline", + "material/phone-settings", + "material/phone-sync-outline", + "material/phone-sync", + "material/phone-voip", + "material/phone", + "material/pi-box", + "material/pi-hole", + "material/pi", + "material/piano-off", + "material/piano", + "material/pickaxe", + "material/picture-in-picture-bottom-right-outline", + "material/picture-in-picture-bottom-right", + "material/picture-in-picture-top-right-outline", + "material/picture-in-picture-top-right", + "material/pier-crane", + "material/pier", + "material/pig-variant-outline", + "material/pig-variant", + "material/pig", + "material/piggy-bank-outline", + "material/piggy-bank", + "material/pill-multiple", + "material/pill-off", + "material/pill", + "material/pillar", + "material/pin-off-outline", + "material/pin-off", + "material/pin-outline", + "material/pin", + "material/pine-tree-box", + "material/pine-tree-fire", + "material/pine-tree", + "material/pinterest", + "material/pinwheel-outline", + "material/pinwheel", + "material/pipe-disconnected", + "material/pipe-leak", + "material/pipe-valve", + "material/pipe-wrench", + "material/pipe", + "material/pirate", + "material/pistol", + "material/piston", + "material/pitchfork", + "material/pizza", + "material/plane-car", + "material/plane-train", + "material/play-box-lock-open-outline", + "material/play-box-lock-open", + "material/play-box-lock-outline", + "material/play-box-lock", + "material/play-box-multiple-outline", + "material/play-box-multiple", + "material/play-box-outline", + "material/play-box", + "material/play-circle-outline", + "material/play-circle", + "material/play-network-outline", + "material/play-network", + "material/play-outline", + "material/play-pause", + "material/play-protected-content", + "material/play-speed", + "material/play", + "material/playlist-check", + "material/playlist-edit", + "material/playlist-minus", + "material/playlist-music-outline", + "material/playlist-music", + "material/playlist-play", + "material/playlist-plus", + "material/playlist-remove", + "material/playlist-star", + "material/plex", + "material/pliers", + "material/plus-box-multiple-outline", + "material/plus-box-multiple", + "material/plus-box-outline", + "material/plus-box", + "material/plus-circle-multiple-outline", + "material/plus-circle-multiple", + "material/plus-circle-outline", + "material/plus-circle", + "material/plus-lock-open", + "material/plus-lock", + "material/plus-minus-box", + "material/plus-minus-variant", + "material/plus-minus", + "material/plus-network-outline", + "material/plus-network", + "material/plus-outline", + "material/plus-thick", + "material/plus", + "material/podcast", + "material/podium-bronze", + "material/podium-gold", + "material/podium-silver", + "material/podium", + "material/point-of-sale", + "material/pokeball", + "material/pokemon-go", + "material/poker-chip", + "material/polaroid", + "material/police-badge-outline", + "material/police-badge", + "material/police-station", + "material/poll", + "material/polo", + "material/polymer", + "material/pool-thermometer", + "material/pool", + "material/popcorn", + "material/post-lamp", + "material/post-outline", + "material/post", + "material/postage-stamp", + "material/pot-mix-outline", + "material/pot-mix", + "material/pot-outline", + "material/pot-steam-outline", + "material/pot-steam", + "material/pot", + "material/pound-box-outline", + "material/pound-box", + "material/pound", + "material/power-cycle", + "material/power-off", + "material/power-on", + "material/power-plug-off-outline", + "material/power-plug-off", + "material/power-plug-outline", + "material/power-plug", + "material/power-settings", + "material/power-sleep", + "material/power-socket-au", + "material/power-socket-ch", + "material/power-socket-de", + "material/power-socket-eu", + "material/power-socket-fr", + "material/power-socket-it", + "material/power-socket-jp", + "material/power-socket-uk", + "material/power-socket-us", + "material/power-socket", + "material/power-standby", + "material/power", + "material/powershell", + "material/prescription", + "material/presentation-play", + "material/presentation", + "material/pretzel", + "material/printer-3d-nozzle-alert-outline", + "material/printer-3d-nozzle-alert", + "material/printer-3d-nozzle-heat-outline", + "material/printer-3d-nozzle-heat", + "material/printer-3d-nozzle-off-outline", + "material/printer-3d-nozzle-off", + "material/printer-3d-nozzle-outline", + "material/printer-3d-nozzle", + "material/printer-3d-off", + "material/printer-3d", + "material/printer-alert", + "material/printer-check", + "material/printer-eye", + "material/printer-off-outline", + "material/printer-off", + "material/printer-outline", + "material/printer-pos", + "material/printer-search", + "material/printer-settings", + "material/printer-wireless", + "material/printer", + "material/priority-high", + "material/priority-low", + "material/professional-hexagon", + "material/progress-alert", + "material/progress-check", + "material/progress-clock", + "material/progress-close", + "material/progress-download", + "material/progress-helper", + "material/progress-pencil", + "material/progress-question", + "material/progress-star", + "material/progress-upload", + "material/progress-wrench", + "material/projector-off", + "material/projector-screen-off-outline", + "material/projector-screen-off", + "material/projector-screen-outline", + "material/projector-screen-variant-off-outline", + "material/projector-screen-variant-off", + "material/projector-screen-variant-outline", + "material/projector-screen-variant", + "material/projector-screen", + "material/projector", + "material/propane-tank-outline", + "material/propane-tank", + "material/protocol", + "material/publish-off", + "material/publish", + "material/pulse", + "material/pump-off", + "material/pump", + "material/pumpkin", + "material/purse-outline", + "material/purse", + "material/puzzle-check-outline", + "material/puzzle-check", + "material/puzzle-edit-outline", + "material/puzzle-edit", + "material/puzzle-heart-outline", + "material/puzzle-heart", + "material/puzzle-minus-outline", + "material/puzzle-minus", + "material/puzzle-outline", + "material/puzzle-plus-outline", + "material/puzzle-plus", + "material/puzzle-remove-outline", + "material/puzzle-remove", + "material/puzzle-star-outline", + "material/puzzle-star", + "material/puzzle", + "material/pyramid-off", + "material/pyramid", + "material/qi", + "material/qqchat", + "material/qrcode-edit", + "material/qrcode-minus", + "material/qrcode-plus", + "material/qrcode-remove", + "material/qrcode-scan", + "material/qrcode", + "material/quadcopter", + "material/quality-high", + "material/quality-low", + "material/quality-medium", + "material/quora", + "material/rabbit-variant-outline", + "material/rabbit-variant", + "material/rabbit", + "material/racing-helmet", + "material/racquetball", + "material/radar", + "material/radiator-disabled", + "material/radiator-off", + "material/radiator", + "material/radio-am", + "material/radio-fm", + "material/radio-handheld", + "material/radio-off", + "material/radio-tower", + "material/radio", + "material/radioactive-circle-outline", + "material/radioactive-circle", + "material/radioactive-off", + "material/radioactive", + "material/radiobox-blank", + "material/radiobox-marked", + "material/radiology-box-outline", + "material/radiology-box", + "material/radius-outline", + "material/radius", + "material/railroad-light", + "material/rake", + "material/raspberry-pi", + "material/raw-off", + "material/raw", + "material/ray-end-arrow", + "material/ray-end", + "material/ray-start-arrow", + "material/ray-start-end", + "material/ray-start-vertex-end", + "material/ray-start", + "material/ray-vertex", + "material/razor-double-edge", + "material/razor-single-edge", + "material/react", + "material/read", + "material/receipt-outline", + "material/receipt-text-check-outline", + "material/receipt-text-check", + "material/receipt-text-minus-outline", + "material/receipt-text-minus", + "material/receipt-text-outline", + "material/receipt-text-plus-outline", + "material/receipt-text-plus", + "material/receipt-text-remove-outline", + "material/receipt-text-remove", + "material/receipt-text", + "material/receipt", + "material/record-circle-outline", + "material/record-circle", + "material/record-player", + "material/record-rec", + "material/record", + "material/rectangle-outline", + "material/rectangle", + "material/recycle-variant", + "material/recycle", + "material/reddit", + "material/redhat", + "material/redo-variant", + "material/redo", + "material/reflect-horizontal", + "material/reflect-vertical", + "material/refresh-auto", + "material/refresh-circle", + "material/refresh", + "material/regex", + "material/registered-trademark", + "material/reiterate", + "material/relation-many-to-many", + "material/relation-many-to-one-or-many", + "material/relation-many-to-one", + "material/relation-many-to-only-one", + "material/relation-many-to-zero-or-many", + "material/relation-many-to-zero-or-one", + "material/relation-one-or-many-to-many", + "material/relation-one-or-many-to-one-or-many", + "material/relation-one-or-many-to-one", + "material/relation-one-or-many-to-only-one", + "material/relation-one-or-many-to-zero-or-many", + "material/relation-one-or-many-to-zero-or-one", + "material/relation-one-to-many", + "material/relation-one-to-one-or-many", + "material/relation-one-to-one", + "material/relation-one-to-only-one", + "material/relation-one-to-zero-or-many", + "material/relation-one-to-zero-or-one", + "material/relation-only-one-to-many", + "material/relation-only-one-to-one-or-many", + "material/relation-only-one-to-one", + "material/relation-only-one-to-only-one", + "material/relation-only-one-to-zero-or-many", + "material/relation-only-one-to-zero-or-one", + "material/relation-zero-or-many-to-many", + "material/relation-zero-or-many-to-one-or-many", + "material/relation-zero-or-many-to-one", + "material/relation-zero-or-many-to-only-one", + "material/relation-zero-or-many-to-zero-or-many", + "material/relation-zero-or-many-to-zero-or-one", + "material/relation-zero-or-one-to-many", + "material/relation-zero-or-one-to-one-or-many", + "material/relation-zero-or-one-to-one", + "material/relation-zero-or-one-to-only-one", + "material/relation-zero-or-one-to-zero-or-many", + "material/relation-zero-or-one-to-zero-or-one", + "material/relative-scale", + "material/reload-alert", + "material/reload", + "material/reminder", + "material/remote-desktop", + "material/remote-off", + "material/remote-tv-off", + "material/remote-tv", + "material/remote", + "material/rename-box", + "material/reorder-horizontal", + "material/reorder-vertical", + "material/repeat-off", + "material/repeat-once", + "material/repeat-variant", + "material/repeat", + "material/replay", + "material/reply-all-outline", + "material/reply-all", + "material/reply-circle", + "material/reply-outline", + "material/reply", + "material/reproduction", + "material/resistor-nodes", + "material/resistor", + "material/resize-bottom-right", + "material/resize", + "material/responsive", + "material/restart-alert", + "material/restart-off", + "material/restart", + "material/restore-alert", + "material/restore", + "material/rewind-10", + "material/rewind-15", + "material/rewind-30", + "material/rewind-45", + "material/rewind-5", + "material/rewind-60", + "material/rewind-outline", + "material/rewind", + "material/rhombus-medium-outline", + "material/rhombus-medium", + "material/rhombus-outline", + "material/rhombus-split-outline", + "material/rhombus-split", + "material/rhombus", + "material/ribbon", + "material/rice", + "material/rickshaw-electric", + "material/rickshaw", + "material/ring", + "material/rivet", + "material/road-variant", + "material/road", + "material/robber", + "material/robot-angry-outline", + "material/robot-angry", + "material/robot-confused-outline", + "material/robot-confused", + "material/robot-dead-outline", + "material/robot-dead", + "material/robot-excited-outline", + "material/robot-excited", + "material/robot-happy-outline", + "material/robot-happy", + "material/robot-industrial-outline", + "material/robot-industrial", + "material/robot-love-outline", + "material/robot-love", + "material/robot-mower-outline", + "material/robot-mower", + "material/robot-off-outline", + "material/robot-off", + "material/robot-outline", + "material/robot-vacuum-alert", + "material/robot-vacuum-variant-alert", + "material/robot-vacuum-variant", + "material/robot-vacuum", + "material/robot", + "material/rocket-launch-outline", + "material/rocket-launch", + "material/rocket-outline", + "material/rocket", + "material/rodent", + "material/roller-shade-closed", + "material/roller-shade", + "material/roller-skate-off", + "material/roller-skate", + "material/rollerblade-off", + "material/rollerblade", + "material/rollupjs", + "material/rolodex-outline", + "material/rolodex", + "material/roman-numeral-1", + "material/roman-numeral-10", + "material/roman-numeral-2", + "material/roman-numeral-3", + "material/roman-numeral-4", + "material/roman-numeral-5", + "material/roman-numeral-6", + "material/roman-numeral-7", + "material/roman-numeral-8", + "material/roman-numeral-9", + "material/room-service-outline", + "material/room-service", + "material/rotate-360", + "material/rotate-3d-variant", + "material/rotate-3d", + "material/rotate-left-variant", + "material/rotate-left", + "material/rotate-orbit", + "material/rotate-right-variant", + "material/rotate-right", + "material/rounded-corner", + "material/router-network", + "material/router-wireless-off", + "material/router-wireless-settings", + "material/router-wireless", + "material/router", + "material/routes-clock", + "material/routes", + "material/rowing", + "material/rss-box", + "material/rss-off", + "material/rss", + "material/rug", + "material/rugby", + "material/ruler-square-compass", + "material/ruler-square", + "material/ruler", + "material/run-fast", + "material/run", + "material/rv-truck", + "material/sack-percent", + "material/sack", + "material/safe-square-outline", + "material/safe-square", + "material/safe", + "material/safety-goggles", + "material/sail-boat-sink", + "material/sail-boat", + "material/sale-outline", + "material/sale", + "material/salesforce", + "material/sass", + "material/satellite-uplink", + "material/satellite-variant", + "material/satellite", + "material/sausage-off", + "material/sausage", + "material/saw-blade", + "material/sawtooth-wave", + "material/saxophone", + "material/scale-balance", + "material/scale-bathroom", + "material/scale-off", + "material/scale-unbalanced", + "material/scale", + "material/scan-helper", + "material/scanner-off", + "material/scanner", + "material/scatter-plot-outline", + "material/scatter-plot", + "material/scent-off", + "material/scent", + "material/school-outline", + "material/school", + "material/scissors-cutting", + "material/scooter-electric", + "material/scooter", + "material/scoreboard-outline", + "material/scoreboard", + "material/screen-rotation-lock", + "material/screen-rotation", + "material/screw-flat-top", + "material/screw-lag", + "material/screw-machine-flat-top", + "material/screw-machine-round-top", + "material/screw-round-top", + "material/screwdriver", + "material/script-outline", + "material/script-text-key-outline", + "material/script-text-key", + "material/script-text-outline", + "material/script-text-play-outline", + "material/script-text-play", + "material/script-text", + "material/script", + "material/sd", + "material/seal-variant", + "material/seal", + "material/search-web", + "material/seat-flat-angled", + "material/seat-flat", + "material/seat-individual-suite", + "material/seat-legroom-extra", + "material/seat-legroom-normal", + "material/seat-legroom-reduced", + "material/seat-outline", + "material/seat-passenger", + "material/seat-recline-extra", + "material/seat-recline-normal", + "material/seat", + "material/seatbelt", + "material/security-network", + "material/security", + "material/seed-off-outline", + "material/seed-off", + "material/seed-outline", + "material/seed-plus-outline", + "material/seed-plus", + "material/seed", + "material/seesaw", + "material/segment", + "material/select-all", + "material/select-arrow-down", + "material/select-arrow-up", + "material/select-color", + "material/select-compare", + "material/select-drag", + "material/select-group", + "material/select-inverse", + "material/select-marker", + "material/select-multiple-marker", + "material/select-multiple", + "material/select-off", + "material/select-place", + "material/select-remove", + "material/select-search", + "material/select", + "material/selection-drag", + "material/selection-ellipse-arrow-inside", + "material/selection-ellipse-remove", + "material/selection-ellipse", + "material/selection-marker", + "material/selection-multiple-marker", + "material/selection-multiple", + "material/selection-off", + "material/selection-remove", + "material/selection-search", + "material/selection", + "material/semantic-web", + "material/send-check-outline", + "material/send-check", + "material/send-circle-outline", + "material/send-circle", + "material/send-clock-outline", + "material/send-clock", + "material/send-lock-outline", + "material/send-lock", + "material/send-outline", + "material/send", + "material/serial-port", + "material/server-minus", + "material/server-network-off", + "material/server-network", + "material/server-off", + "material/server-plus", + "material/server-remove", + "material/server-security", + "material/server", + "material/set-all", + "material/set-center-right", + "material/set-center", + "material/set-left-center", + "material/set-left-right", + "material/set-left", + "material/set-merge", + "material/set-none", + "material/set-right", + "material/set-split", + "material/set-square", + "material/set-top-box", + "material/settings-helper", + "material/shaker-outline", + "material/shaker", + "material/shape-circle-plus", + "material/shape-outline", + "material/shape-oval-plus", + "material/shape-plus", + "material/shape-polygon-plus", + "material/shape-rectangle-plus", + "material/shape-square-plus", + "material/shape-square-rounded-plus", + "material/shape", + "material/share-all-outline", + "material/share-all", + "material/share-circle", + "material/share-off-outline", + "material/share-off", + "material/share-outline", + "material/share-variant-outline", + "material/share-variant", + "material/share", + "material/shark-fin-outline", + "material/shark-fin", + "material/shark-off", + "material/shark", + "material/sheep", + "material/shield-account-outline", + "material/shield-account-variant-outline", + "material/shield-account-variant", + "material/shield-account", + "material/shield-airplane-outline", + "material/shield-airplane", + "material/shield-alert-outline", + "material/shield-alert", + "material/shield-bug-outline", + "material/shield-bug", + "material/shield-car", + "material/shield-check-outline", + "material/shield-check", + "material/shield-cross-outline", + "material/shield-cross", + "material/shield-crown-outline", + "material/shield-crown", + "material/shield-edit-outline", + "material/shield-edit", + "material/shield-half-full", + "material/shield-half", + "material/shield-home-outline", + "material/shield-home", + "material/shield-key-outline", + "material/shield-key", + "material/shield-link-variant-outline", + "material/shield-link-variant", + "material/shield-lock-open-outline", + "material/shield-lock-open", + "material/shield-lock-outline", + "material/shield-lock", + "material/shield-moon-outline", + "material/shield-moon", + "material/shield-off-outline", + "material/shield-off", + "material/shield-outline", + "material/shield-plus-outline", + "material/shield-plus", + "material/shield-refresh-outline", + "material/shield-refresh", + "material/shield-remove-outline", + "material/shield-remove", + "material/shield-search", + "material/shield-star-outline", + "material/shield-star", + "material/shield-sun-outline", + "material/shield-sun", + "material/shield-sword-outline", + "material/shield-sword", + "material/shield-sync-outline", + "material/shield-sync", + "material/shield", + "material/shimmer", + "material/ship-wheel", + "material/shipping-pallet", + "material/shoe-ballet", + "material/shoe-cleat", + "material/shoe-formal", + "material/shoe-heel", + "material/shoe-print", + "material/shoe-sneaker", + "material/shopping-music", + "material/shopping-outline", + "material/shopping-search-outline", + "material/shopping-search", + "material/shopping", + "material/shore", + "material/shovel-off", + "material/shovel", + "material/shower-head", + "material/shower", + "material/shredder", + "material/shuffle-disabled", + "material/shuffle-variant", + "material/shuffle", + "material/shuriken", + "material/sickle", + "material/sigma-lower", + "material/sigma", + "material/sign-caution", + "material/sign-direction-minus", + "material/sign-direction-plus", + "material/sign-direction-remove", + "material/sign-direction", + "material/sign-language-outline", + "material/sign-language", + "material/sign-pole", + "material/sign-real-estate", + "material/sign-text", + "material/sign-yield", + "material/signal-2g", + "material/signal-3g", + "material/signal-4g", + "material/signal-5g", + "material/signal-cellular-1", + "material/signal-cellular-2", + "material/signal-cellular-3", + "material/signal-cellular-outline", + "material/signal-distance-variant", + "material/signal-hspa-plus", + "material/signal-hspa", + "material/signal-off", + "material/signal-variant", + "material/signal", + "material/signature-freehand", + "material/signature-image", + "material/signature-text", + "material/signature", + "material/silo-outline", + "material/silo", + "material/silverware-clean", + "material/silverware-fork-knife", + "material/silverware-fork", + "material/silverware-spoon", + "material/silverware-variant", + "material/silverware", + "material/sim-alert-outline", + "material/sim-alert", + "material/sim-off-outline", + "material/sim-off", + "material/sim-outline", + "material/sim", + "material/simple-icons", + "material/sina-weibo", + "material/sine-wave", + "material/sitemap-outline", + "material/sitemap", + "material/size-l", + "material/size-m", + "material/size-s", + "material/size-xl", + "material/size-xs", + "material/size-xxl", + "material/size-xxs", + "material/size-xxxl", + "material/skate-off", + "material/skate", + "material/skateboard", + "material/skateboarding", + "material/skew-less", + "material/skew-more", + "material/ski-cross-country", + "material/ski-water", + "material/ski", + "material/skip-backward-outline", + "material/skip-backward", + "material/skip-forward-outline", + "material/skip-forward", + "material/skip-next-circle-outline", + "material/skip-next-circle", + "material/skip-next-outline", + "material/skip-next", + "material/skip-previous-circle-outline", + "material/skip-previous-circle", + "material/skip-previous-outline", + "material/skip-previous", + "material/skull-crossbones-outline", + "material/skull-crossbones", + "material/skull-outline", + "material/skull-scan-outline", + "material/skull-scan", + "material/skull", + "material/skype-business", + "material/skype", + "material/slack", + "material/slash-forward-box", + "material/slash-forward", + "material/sledding", + "material/sleep-off", + "material/sleep", + "material/slide", + "material/slope-downhill", + "material/slope-uphill", + "material/slot-machine-outline", + "material/slot-machine", + "material/smart-card-off-outline", + "material/smart-card-off", + "material/smart-card-outline", + "material/smart-card-reader-outline", + "material/smart-card-reader", + "material/smart-card", + "material/smog", + "material/smoke-detector-alert-outline", + "material/smoke-detector-alert", + "material/smoke-detector-off-outline", + "material/smoke-detector-off", + "material/smoke-detector-outline", + "material/smoke-detector-variant-alert", + "material/smoke-detector-variant-off", + "material/smoke-detector-variant", + "material/smoke-detector", + "material/smoke", + "material/smoking-off", + "material/smoking-pipe-off", + "material/smoking-pipe", + "material/smoking", + "material/snail", + "material/snake", + "material/snapchat", + "material/snowboard", + "material/snowflake-alert", + "material/snowflake-check", + "material/snowflake-melt", + "material/snowflake-off", + "material/snowflake-thermometer", + "material/snowflake-variant", + "material/snowflake", + "material/snowman", + "material/snowmobile", + "material/snowshoeing", + "material/soccer-field", + "material/soccer", + "material/social-distance-2-meters", + "material/social-distance-6-feet", + "material/sofa-outline", + "material/sofa-single-outline", + "material/sofa-single", + "material/sofa", + "material/solar-panel-large", + "material/solar-panel", + "material/solar-power-variant-outline", + "material/solar-power-variant", + "material/solar-power", + "material/soldering-iron", + "material/solid", + "material/sony-playstation", + "material/sort-alphabetical-ascending-variant", + "material/sort-alphabetical-ascending", + "material/sort-alphabetical-descending-variant", + "material/sort-alphabetical-descending", + "material/sort-alphabetical-variant", + "material/sort-ascending", + "material/sort-bool-ascending-variant", + "material/sort-bool-ascending", + "material/sort-bool-descending-variant", + "material/sort-bool-descending", + "material/sort-calendar-ascending", + "material/sort-calendar-descending", + "material/sort-clock-ascending-outline", + "material/sort-clock-ascending", + "material/sort-clock-descending-outline", + "material/sort-clock-descending", + "material/sort-descending", + "material/sort-numeric-ascending-variant", + "material/sort-numeric-ascending", + "material/sort-numeric-descending-variant", + "material/sort-numeric-descending", + "material/sort-numeric-variant", + "material/sort-reverse-variant", + "material/sort-variant-lock-open", + "material/sort-variant-lock", + "material/sort-variant-off", + "material/sort-variant-remove", + "material/sort-variant", + "material/sort", + "material/soundbar", + "material/soundcloud", + "material/source-branch-check", + "material/source-branch-minus", + "material/source-branch-plus", + "material/source-branch-refresh", + "material/source-branch-remove", + "material/source-branch-sync", + "material/source-branch", + "material/source-commit-end-local", + "material/source-commit-end", + "material/source-commit-local", + "material/source-commit-next-local", + "material/source-commit-start-next-local", + "material/source-commit-start", + "material/source-commit", + "material/source-fork", + "material/source-merge", + "material/source-pull", + "material/source-repository-multiple", + "material/source-repository", + "material/soy-sauce-off", + "material/soy-sauce", + "material/spa-outline", + "material/spa", + "material/space-invaders", + "material/space-station", + "material/spade", + "material/speaker-bluetooth", + "material/speaker-message", + "material/speaker-multiple", + "material/speaker-off", + "material/speaker-pause", + "material/speaker-play", + "material/speaker-stop", + "material/speaker-wireless", + "material/speaker", + "material/spear", + "material/speedometer-medium", + "material/speedometer-slow", + "material/speedometer", + "material/spellcheck", + "material/sphere-off", + "material/sphere", + "material/spider-thread", + "material/spider-web", + "material/spider", + "material/spirit-level", + "material/spoon-sugar", + "material/spotify", + "material/spotlight-beam", + "material/spotlight", + "material/spray-bottle", + "material/spray", + "material/sprinkler-fire", + "material/sprinkler-variant", + "material/sprinkler", + "material/sprout-outline", + "material/sprout", + "material/square-circle", + "material/square-edit-outline", + "material/square-medium-outline", + "material/square-medium", + "material/square-off-outline", + "material/square-off", + "material/square-opacity", + "material/square-outline", + "material/square-root-box", + "material/square-root", + "material/square-rounded-badge-outline", + "material/square-rounded-badge", + "material/square-rounded-outline", + "material/square-rounded", + "material/square-small", + "material/square-wave", + "material/square", + "material/squeegee", + "material/ssh", + "material/stack-exchange", + "material/stack-overflow", + "material/stackpath", + "material/stadium-outline", + "material/stadium-variant", + "material/stadium", + "material/stairs-box", + "material/stairs-down", + "material/stairs-up", + "material/stairs", + "material/stamper", + "material/standard-definition", + "material/star-box-multiple-outline", + "material/star-box-multiple", + "material/star-box-outline", + "material/star-box", + "material/star-check-outline", + "material/star-check", + "material/star-circle-outline", + "material/star-circle", + "material/star-cog-outline", + "material/star-cog", + "material/star-crescent", + "material/star-david", + "material/star-face", + "material/star-four-points-outline", + "material/star-four-points", + "material/star-half-full", + "material/star-half", + "material/star-minus-outline", + "material/star-minus", + "material/star-off-outline", + "material/star-off", + "material/star-outline", + "material/star-plus-outline", + "material/star-plus", + "material/star-remove-outline", + "material/star-remove", + "material/star-settings-outline", + "material/star-settings", + "material/star-shooting-outline", + "material/star-shooting", + "material/star-three-points-outline", + "material/star-three-points", + "material/star", + "material/state-machine", + "material/steam", + "material/steering-off", + "material/steering", + "material/step-backward-2", + "material/step-backward", + "material/step-forward-2", + "material/step-forward", + "material/stethoscope", + "material/sticker-alert-outline", + "material/sticker-alert", + "material/sticker-check-outline", + "material/sticker-check", + "material/sticker-circle-outline", + "material/sticker-emoji", + "material/sticker-minus-outline", + "material/sticker-minus", + "material/sticker-outline", + "material/sticker-plus-outline", + "material/sticker-plus", + "material/sticker-remove-outline", + "material/sticker-remove", + "material/sticker-text-outline", + "material/sticker-text", + "material/sticker", + "material/stocking", + "material/stomach", + "material/stool-outline", + "material/stool", + "material/stop-circle-outline", + "material/stop-circle", + "material/stop", + "material/storage-tank-outline", + "material/storage-tank", + "material/store-24-hour", + "material/store-alert-outline", + "material/store-alert", + "material/store-check-outline", + "material/store-check", + "material/store-clock-outline", + "material/store-clock", + "material/store-cog-outline", + "material/store-cog", + "material/store-edit-outline", + "material/store-edit", + "material/store-marker-outline", + "material/store-marker", + "material/store-minus-outline", + "material/store-minus", + "material/store-off-outline", + "material/store-off", + "material/store-outline", + "material/store-plus-outline", + "material/store-plus", + "material/store-remove-outline", + "material/store-remove", + "material/store-search-outline", + "material/store-search", + "material/store-settings-outline", + "material/store-settings", + "material/store", + "material/storefront-check-outline", + "material/storefront-check", + "material/storefront-edit-outline", + "material/storefront-edit", + "material/storefront-minus-outline", + "material/storefront-minus", + "material/storefront-outline", + "material/storefront-plus-outline", + "material/storefront-plus", + "material/storefront-remove-outline", + "material/storefront-remove", + "material/storefront", + "material/stove", + "material/strategy", + "material/stretch-to-page-outline", + "material/stretch-to-page", + "material/string-lights-off", + "material/string-lights", + "material/subdirectory-arrow-left", + "material/subdirectory-arrow-right", + "material/submarine", + "material/subtitles-outline", + "material/subtitles", + "material/subway-alert-variant", + "material/subway-variant", + "material/subway", + "material/summit", + "material/sun-angle-outline", + "material/sun-angle", + "material/sun-clock-outline", + "material/sun-clock", + "material/sun-compass", + "material/sun-snowflake-variant", + "material/sun-snowflake", + "material/sun-thermometer-outline", + "material/sun-thermometer", + "material/sun-wireless-outline", + "material/sun-wireless", + "material/sunglasses", + "material/surfing", + "material/surround-sound-2-0", + "material/surround-sound-2-1", + "material/surround-sound-3-1", + "material/surround-sound-5-1-2", + "material/surround-sound-5-1", + "material/surround-sound-7-1", + "material/surround-sound", + "material/svg", + "material/swap-horizontal-bold", + "material/swap-horizontal-circle-outline", + "material/swap-horizontal-circle", + "material/swap-horizontal-variant", + "material/swap-horizontal", + "material/swap-vertical-bold", + "material/swap-vertical-circle-outline", + "material/swap-vertical-circle", + "material/swap-vertical-variant", + "material/swap-vertical", + "material/swim", + "material/switch", + "material/sword-cross", + "material/sword", + "material/syllabary-hangul", + "material/syllabary-hiragana", + "material/syllabary-katakana-halfwidth", + "material/syllabary-katakana", + "material/symbol", + "material/symfony", + "material/synagogue-outline", + "material/synagogue", + "material/sync-alert", + "material/sync-circle", + "material/sync-off", + "material/sync", + "material/tab-minus", + "material/tab-plus", + "material/tab-remove", + "material/tab-search", + "material/tab-unselected", + "material/tab", + "material/table-account", + "material/table-alert", + "material/table-arrow-down", + "material/table-arrow-left", + "material/table-arrow-right", + "material/table-arrow-up", + "material/table-border", + "material/table-cancel", + "material/table-chair", + "material/table-check", + "material/table-clock", + "material/table-cog", + "material/table-column-plus-after", + "material/table-column-plus-before", + "material/table-column-remove", + "material/table-column-width", + "material/table-column", + "material/table-edit", + "material/table-eye-off", + "material/table-eye", + "material/table-filter", + "material/table-furniture", + "material/table-headers-eye-off", + "material/table-headers-eye", + "material/table-heart", + "material/table-key", + "material/table-large-plus", + "material/table-large-remove", + "material/table-large", + "material/table-lock", + "material/table-merge-cells", + "material/table-minus", + "material/table-multiple", + "material/table-network", + "material/table-of-contents", + "material/table-off", + "material/table-picnic", + "material/table-pivot", + "material/table-plus", + "material/table-question", + "material/table-refresh", + "material/table-remove", + "material/table-row-height", + "material/table-row-plus-after", + "material/table-row-plus-before", + "material/table-row-remove", + "material/table-row", + "material/table-search", + "material/table-settings", + "material/table-split-cell", + "material/table-star", + "material/table-sync", + "material/table-tennis", + "material/table", + "material/tablet-cellphone", + "material/tablet-dashboard", + "material/tablet", + "material/taco", + "material/tag-arrow-down-outline", + "material/tag-arrow-down", + "material/tag-arrow-left-outline", + "material/tag-arrow-left", + "material/tag-arrow-right-outline", + "material/tag-arrow-right", + "material/tag-arrow-up-outline", + "material/tag-arrow-up", + "material/tag-check-outline", + "material/tag-check", + "material/tag-faces", + "material/tag-heart-outline", + "material/tag-heart", + "material/tag-minus-outline", + "material/tag-minus", + "material/tag-multiple-outline", + "material/tag-multiple", + "material/tag-off-outline", + "material/tag-off", + "material/tag-outline", + "material/tag-plus-outline", + "material/tag-plus", + "material/tag-remove-outline", + "material/tag-remove", + "material/tag-search-outline", + "material/tag-search", + "material/tag-text-outline", + "material/tag-text", + "material/tag", + "material/tailwind", + "material/tally-mark-1", + "material/tally-mark-2", + "material/tally-mark-3", + "material/tally-mark-4", + "material/tally-mark-5", + "material/tangram", + "material/tank", + "material/tanker-truck", + "material/tape-drive", + "material/tape-measure", + "material/target-account", + "material/target-variant", + "material/target", + "material/taxi", + "material/tea-outline", + "material/tea", + "material/teamviewer", + "material/teddy-bear", + "material/telescope", + "material/television-ambient-light", + "material/television-box", + "material/television-classic-off", + "material/television-classic", + "material/television-guide", + "material/television-off", + "material/television-pause", + "material/television-play", + "material/television-shimmer", + "material/television-speaker-off", + "material/television-speaker", + "material/television-stop", + "material/television", + "material/temperature-celsius", + "material/temperature-fahrenheit", + "material/temperature-kelvin", + "material/temple-buddhist-outline", + "material/temple-buddhist", + "material/temple-hindu-outline", + "material/temple-hindu", + "material/tennis-ball", + "material/tennis", + "material/tent", + "material/terraform", + "material/terrain", + "material/test-tube-empty", + "material/test-tube-off", + "material/test-tube", + "material/text-account", + "material/text-box-check-outline", + "material/text-box-check", + "material/text-box-edit-outline", + "material/text-box-edit", + "material/text-box-minus-outline", + "material/text-box-minus", + "material/text-box-multiple-outline", + "material/text-box-multiple", + "material/text-box-outline", + "material/text-box-plus-outline", + "material/text-box-plus", + "material/text-box-remove-outline", + "material/text-box-remove", + "material/text-box-search-outline", + "material/text-box-search", + "material/text-box", + "material/text-long", + "material/text-recognition", + "material/text-search-variant", + "material/text-search", + "material/text-shadow", + "material/text-short", + "material/text", + "material/texture-box", + "material/texture", + "material/theater", + "material/theme-light-dark", + "material/thermometer-alert", + "material/thermometer-auto", + "material/thermometer-bluetooth", + "material/thermometer-check", + "material/thermometer-chevron-down", + "material/thermometer-chevron-up", + "material/thermometer-high", + "material/thermometer-lines", + "material/thermometer-low", + "material/thermometer-minus", + "material/thermometer-off", + "material/thermometer-plus", + "material/thermometer-probe-off", + "material/thermometer-probe", + "material/thermometer-water", + "material/thermometer", + "material/thermostat-auto", + "material/thermostat-box-auto", + "material/thermostat-box", + "material/thermostat", + "material/thought-bubble-outline", + "material/thought-bubble", + "material/thumb-down-outline", + "material/thumb-down", + "material/thumb-up-outline", + "material/thumb-up", + "material/thumbs-up-down-outline", + "material/thumbs-up-down", + "material/ticket-account", + "material/ticket-confirmation-outline", + "material/ticket-confirmation", + "material/ticket-outline", + "material/ticket-percent-outline", + "material/ticket-percent", + "material/ticket", + "material/tie", + "material/tilde-off", + "material/tilde", + "material/timelapse", + "material/timeline-alert-outline", + "material/timeline-alert", + "material/timeline-check-outline", + "material/timeline-check", + "material/timeline-clock-outline", + "material/timeline-clock", + "material/timeline-minus-outline", + "material/timeline-minus", + "material/timeline-outline", + "material/timeline-plus-outline", + "material/timeline-plus", + "material/timeline-question-outline", + "material/timeline-question", + "material/timeline-remove-outline", + "material/timeline-remove", + "material/timeline-text-outline", + "material/timeline-text", + "material/timeline", + "material/timer-10", + "material/timer-3", + "material/timer-alert-outline", + "material/timer-alert", + "material/timer-cancel-outline", + "material/timer-cancel", + "material/timer-check-outline", + "material/timer-check", + "material/timer-cog-outline", + "material/timer-cog", + "material/timer-edit-outline", + "material/timer-edit", + "material/timer-lock-open-outline", + "material/timer-lock-open", + "material/timer-lock-outline", + "material/timer-lock", + "material/timer-marker-outline", + "material/timer-marker", + "material/timer-minus-outline", + "material/timer-minus", + "material/timer-music-outline", + "material/timer-music", + "material/timer-off-outline", + "material/timer-off", + "material/timer-outline", + "material/timer-pause-outline", + "material/timer-pause", + "material/timer-play-outline", + "material/timer-play", + "material/timer-plus-outline", + "material/timer-plus", + "material/timer-refresh-outline", + "material/timer-refresh", + "material/timer-remove-outline", + "material/timer-remove", + "material/timer-sand-complete", + "material/timer-sand-empty", + "material/timer-sand-full", + "material/timer-sand-paused", + "material/timer-sand", + "material/timer-settings-outline", + "material/timer-settings", + "material/timer-star-outline", + "material/timer-star", + "material/timer-stop-outline", + "material/timer-stop", + "material/timer-sync-outline", + "material/timer-sync", + "material/timer", + "material/timetable", + "material/tire", + "material/toaster-off", + "material/toaster-oven", + "material/toaster", + "material/toggle-switch-off-outline", + "material/toggle-switch-off", + "material/toggle-switch-outline", + "material/toggle-switch-variant-off", + "material/toggle-switch-variant", + "material/toggle-switch", + "material/toilet", + "material/toolbox-outline", + "material/toolbox", + "material/tools", + "material/tooltip-account", + "material/tooltip-cellphone", + "material/tooltip-check-outline", + "material/tooltip-check", + "material/tooltip-edit-outline", + "material/tooltip-edit", + "material/tooltip-image-outline", + "material/tooltip-image", + "material/tooltip-minus-outline", + "material/tooltip-minus", + "material/tooltip-outline", + "material/tooltip-plus-outline", + "material/tooltip-plus", + "material/tooltip-remove-outline", + "material/tooltip-remove", + "material/tooltip-text-outline", + "material/tooltip-text", + "material/tooltip", + "material/tooth-outline", + "material/tooth", + "material/toothbrush-electric", + "material/toothbrush-paste", + "material/toothbrush", + "material/torch", + "material/tortoise", + "material/toslink", + "material/tournament", + "material/tow-truck", + "material/tower-beach", + "material/tower-fire", + "material/town-hall", + "material/toy-brick-marker-outline", + "material/toy-brick-marker", + "material/toy-brick-minus-outline", + "material/toy-brick-minus", + "material/toy-brick-outline", + "material/toy-brick-plus-outline", + "material/toy-brick-plus", + "material/toy-brick-remove-outline", + "material/toy-brick-remove", + "material/toy-brick-search-outline", + "material/toy-brick-search", + "material/toy-brick", + "material/track-light-off", + "material/track-light", + "material/trackpad-lock", + "material/trackpad", + "material/tractor-variant", + "material/tractor", + "material/trademark", + "material/traffic-cone", + "material/traffic-light-outline", + "material/traffic-light", + "material/train-car-autorack", + "material/train-car-box-full", + "material/train-car-box-open", + "material/train-car-box", + "material/train-car-caboose", + "material/train-car-centerbeam-full", + "material/train-car-centerbeam", + "material/train-car-container", + "material/train-car-flatbed-car", + "material/train-car-flatbed-tank", + "material/train-car-flatbed", + "material/train-car-gondola-full", + "material/train-car-gondola", + "material/train-car-hopper-covered", + "material/train-car-hopper-full", + "material/train-car-hopper", + "material/train-car-intermodal", + "material/train-car-passenger-door-open", + "material/train-car-passenger-door", + "material/train-car-passenger-variant", + "material/train-car-passenger", + "material/train-car-tank", + "material/train-car", + "material/train-variant", + "material/train", + "material/tram-side", + "material/tram", + "material/transcribe-close", + "material/transcribe", + "material/transfer-down", + "material/transfer-left", + "material/transfer-right", + "material/transfer-up", + "material/transfer", + "material/transit-connection-horizontal", + "material/transit-connection-variant", + "material/transit-connection", + "material/transit-detour", + "material/transit-skip", + "material/transit-transfer", + "material/transition-masked", + "material/transition", + "material/translate-off", + "material/translate-variant", + "material/translate", + "material/transmission-tower-export", + "material/transmission-tower-import", + "material/transmission-tower-off", + "material/transmission-tower", + "material/trash-can-outline", + "material/trash-can", + "material/tray-alert", + "material/tray-arrow-down", + "material/tray-arrow-up", + "material/tray-full", + "material/tray-minus", + "material/tray-plus", + "material/tray-remove", + "material/tray", + "material/treasure-chest", + "material/tree-outline", + "material/tree", + "material/trello", + "material/trending-down", + "material/trending-neutral", + "material/trending-up", + "material/triangle-outline", + "material/triangle-small-down", + "material/triangle-small-up", + "material/triangle-wave", + "material/triangle", + "material/triforce", + "material/trophy-award", + "material/trophy-broken", + "material/trophy-outline", + "material/trophy-variant-outline", + "material/trophy-variant", + "material/trophy", + "material/truck-alert-outline", + "material/truck-alert", + "material/truck-cargo-container", + "material/truck-check-outline", + "material/truck-check", + "material/truck-delivery-outline", + "material/truck-delivery", + "material/truck-fast-outline", + "material/truck-fast", + "material/truck-flatbed", + "material/truck-minus-outline", + "material/truck-minus", + "material/truck-outline", + "material/truck-plus-outline", + "material/truck-plus", + "material/truck-remove-outline", + "material/truck-remove", + "material/truck-snowflake", + "material/truck-trailer", + "material/truck", + "material/trumpet", + "material/tshirt-crew-outline", + "material/tshirt-crew", + "material/tshirt-v-outline", + "material/tshirt-v", + "material/tsunami", + "material/tumble-dryer-alert", + "material/tumble-dryer-off", + "material/tumble-dryer", + "material/tune-variant", + "material/tune-vertical-variant", + "material/tune-vertical", + "material/tune", + "material/tunnel-outline", + "material/tunnel", + "material/turbine", + "material/turkey", + "material/turnstile-outline", + "material/turnstile", + "material/turtle", + "material/twitch", + "material/twitter", + "material/two-factor-authentication", + "material/typewriter", + "material/ubisoft", + "material/ubuntu", + "material/ufo-outline", + "material/ufo", + "material/ultra-high-definition", + "material/umbraco", + "material/umbrella-beach-outline", + "material/umbrella-beach", + "material/umbrella-closed-outline", + "material/umbrella-closed-variant", + "material/umbrella-closed", + "material/umbrella-outline", + "material/umbrella", + "material/undo-variant", + "material/undo", + "material/unfold-less-horizontal", + "material/unfold-less-vertical", + "material/unfold-more-horizontal", + "material/unfold-more-vertical", + "material/ungroup", + "material/unicode", + "material/unicorn-variant", + "material/unicorn", + "material/unicycle", + "material/unity", + "material/unreal", + "material/update", + "material/upload-lock-outline", + "material/upload-lock", + "material/upload-multiple", + "material/upload-network-outline", + "material/upload-network", + "material/upload-off-outline", + "material/upload-off", + "material/upload-outline", + "material/upload", + "material/usb-flash-drive-outline", + "material/usb-flash-drive", + "material/usb-port", + "material/usb", + "material/vacuum-outline", + "material/vacuum", + "material/valve-closed", + "material/valve-open", + "material/valve", + "material/van-passenger", + "material/van-utility", + "material/vanish-quarter", + "material/vanish", + "material/vanity-light", + "material/variable-box", + "material/variable", + "material/vector-arrange-above", + "material/vector-arrange-below", + "material/vector-bezier", + "material/vector-circle-variant", + "material/vector-circle", + "material/vector-combine", + "material/vector-curve", + "material/vector-difference-ab", + "material/vector-difference-ba", + "material/vector-difference", + "material/vector-ellipse", + "material/vector-intersection", + "material/vector-line", + "material/vector-link", + "material/vector-point-edit", + "material/vector-point-minus", + "material/vector-point-plus", + "material/vector-point-select", + "material/vector-point", + "material/vector-polygon-variant", + "material/vector-polygon", + "material/vector-polyline-edit", + "material/vector-polyline-minus", + "material/vector-polyline-plus", + "material/vector-polyline-remove", + "material/vector-polyline", + "material/vector-radius", + "material/vector-rectangle", + "material/vector-selection", + "material/vector-square-close", + "material/vector-square-edit", + "material/vector-square-minus", + "material/vector-square-open", + "material/vector-square-plus", + "material/vector-square-remove", + "material/vector-square", + "material/vector-triangle", + "material/vector-union", + "material/vhs", + "material/vibrate-off", + "material/vibrate", + "material/video-2d", + "material/video-3d-off", + "material/video-3d-variant", + "material/video-3d", + "material/video-4k-box", + "material/video-account", + "material/video-box-off", + "material/video-box", + "material/video-check-outline", + "material/video-check", + "material/video-high-definition", + "material/video-image", + "material/video-input-antenna", + "material/video-input-component", + "material/video-input-hdmi", + "material/video-input-scart", + "material/video-input-svideo", + "material/video-marker-outline", + "material/video-marker", + "material/video-minus-outline", + "material/video-minus", + "material/video-off-outline", + "material/video-off", + "material/video-outline", + "material/video-plus-outline", + "material/video-plus", + "material/video-stabilization", + "material/video-switch-outline", + "material/video-switch", + "material/video-vintage", + "material/video-wireless-outline", + "material/video-wireless", + "material/video", + "material/view-agenda-outline", + "material/view-agenda", + "material/view-array-outline", + "material/view-array", + "material/view-carousel-outline", + "material/view-carousel", + "material/view-column-outline", + "material/view-column", + "material/view-comfy-outline", + "material/view-comfy", + "material/view-compact-outline", + "material/view-compact", + "material/view-dashboard-edit-outline", + "material/view-dashboard-edit", + "material/view-dashboard-outline", + "material/view-dashboard-variant-outline", + "material/view-dashboard-variant", + "material/view-dashboard", + "material/view-day-outline", + "material/view-day", + "material/view-gallery-outline", + "material/view-gallery", + "material/view-grid-outline", + "material/view-grid-plus-outline", + "material/view-grid-plus", + "material/view-grid", + "material/view-headline", + "material/view-list-outline", + "material/view-list", + "material/view-module-outline", + "material/view-module", + "material/view-parallel-outline", + "material/view-parallel", + "material/view-quilt-outline", + "material/view-quilt", + "material/view-sequential-outline", + "material/view-sequential", + "material/view-split-horizontal", + "material/view-split-vertical", + "material/view-stream-outline", + "material/view-stream", + "material/view-week-outline", + "material/view-week", + "material/vimeo", + "material/violin", + "material/virtual-reality", + "material/virus-off-outline", + "material/virus-off", + "material/virus-outline", + "material/virus", + "material/vlc", + "material/voicemail", + "material/volcano-outline", + "material/volcano", + "material/volleyball", + "material/volume-equal", + "material/volume-high", + "material/volume-low", + "material/volume-medium", + "material/volume-minus", + "material/volume-mute", + "material/volume-off", + "material/volume-plus", + "material/volume-source", + "material/volume-variant-off", + "material/volume-vibrate", + "material/vote-outline", + "material/vote", + "material/vpn", + "material/vuejs", + "material/vuetify", + "material/walk", + "material/wall-fire", + "material/wall-sconce-flat-outline", + "material/wall-sconce-flat-variant-outline", + "material/wall-sconce-flat-variant", + "material/wall-sconce-flat", + "material/wall-sconce-outline", + "material/wall-sconce-round-outline", + "material/wall-sconce-round-variant-outline", + "material/wall-sconce-round-variant", + "material/wall-sconce-round", + "material/wall-sconce", + "material/wall", + "material/wallet-giftcard", + "material/wallet-membership", + "material/wallet-outline", + "material/wallet-plus-outline", + "material/wallet-plus", + "material/wallet-travel", + "material/wallet", + "material/wallpaper", + "material/wan", + "material/wardrobe-outline", + "material/wardrobe", + "material/warehouse", + "material/washing-machine-alert", + "material/washing-machine-off", + "material/washing-machine", + "material/watch-export-variant", + "material/watch-export", + "material/watch-import-variant", + "material/watch-import", + "material/watch-variant", + "material/watch-vibrate-off", + "material/watch-vibrate", + "material/watch", + "material/water-alert-outline", + "material/water-alert", + "material/water-boiler-alert", + "material/water-boiler-auto", + "material/water-boiler-off", + "material/water-boiler", + "material/water-check-outline", + "material/water-check", + "material/water-circle", + "material/water-minus-outline", + "material/water-minus", + "material/water-off-outline", + "material/water-off", + "material/water-opacity", + "material/water-outline", + "material/water-percent-alert", + "material/water-percent", + "material/water-plus-outline", + "material/water-plus", + "material/water-polo", + "material/water-pump-off", + "material/water-pump", + "material/water-remove-outline", + "material/water-remove", + "material/water-sync", + "material/water-thermometer-outline", + "material/water-thermometer", + "material/water-well-outline", + "material/water-well", + "material/water", + "material/waterfall", + "material/watering-can-outline", + "material/watering-can", + "material/watermark", + "material/wave", + "material/waveform", + "material/waves-arrow-left", + "material/waves-arrow-right", + "material/waves-arrow-up", + "material/waves", + "material/waze", + "material/weather-cloudy-alert", + "material/weather-cloudy-arrow-right", + "material/weather-cloudy-clock", + "material/weather-cloudy", + "material/weather-dust", + "material/weather-fog", + "material/weather-hail", + "material/weather-hazy", + "material/weather-hurricane", + "material/weather-lightning-rainy", + "material/weather-lightning", + "material/weather-night-partly-cloudy", + "material/weather-night", + "material/weather-partly-cloudy", + "material/weather-partly-lightning", + "material/weather-partly-rainy", + "material/weather-partly-snowy-rainy", + "material/weather-partly-snowy", + "material/weather-pouring", + "material/weather-rainy", + "material/weather-snowy-heavy", + "material/weather-snowy-rainy", + "material/weather-snowy", + "material/weather-sunny-alert", + "material/weather-sunny-off", + "material/weather-sunny", + "material/weather-sunset-down", + "material/weather-sunset-up", + "material/weather-sunset", + "material/weather-tornado", + "material/weather-windy-variant", + "material/weather-windy", + "material/web-box", + "material/web-cancel", + "material/web-check", + "material/web-clock", + "material/web-minus", + "material/web-off", + "material/web-plus", + "material/web-refresh", + "material/web-remove", + "material/web-sync", + "material/web", + "material/webcam-off", + "material/webcam", + "material/webhook", + "material/webpack", + "material/webrtc", + "material/wechat", + "material/weight-gram", + "material/weight-kilogram", + "material/weight-lifter", + "material/weight-pound", + "material/weight", + "material/whatsapp", + "material/wheel-barrow", + "material/wheelchair-accessibility", + "material/wheelchair", + "material/whistle-outline", + "material/whistle", + "material/white-balance-auto", + "material/white-balance-incandescent", + "material/white-balance-iridescent", + "material/white-balance-sunny", + "material/widgets-outline", + "material/widgets", + "material/wifi-alert", + "material/wifi-arrow-down", + "material/wifi-arrow-left-right", + "material/wifi-arrow-left", + "material/wifi-arrow-right", + "material/wifi-arrow-up-down", + "material/wifi-arrow-up", + "material/wifi-cancel", + "material/wifi-check", + "material/wifi-cog", + "material/wifi-lock-open", + "material/wifi-lock", + "material/wifi-marker", + "material/wifi-minus", + "material/wifi-off", + "material/wifi-plus", + "material/wifi-refresh", + "material/wifi-remove", + "material/wifi-settings", + "material/wifi-star", + "material/wifi-strength-1-alert", + "material/wifi-strength-1-lock-open", + "material/wifi-strength-1-lock", + "material/wifi-strength-1", + "material/wifi-strength-2-alert", + "material/wifi-strength-2-lock-open", + "material/wifi-strength-2-lock", + "material/wifi-strength-2", + "material/wifi-strength-3-alert", + "material/wifi-strength-3-lock-open", + "material/wifi-strength-3-lock", + "material/wifi-strength-3", + "material/wifi-strength-4-alert", + "material/wifi-strength-4-lock-open", + "material/wifi-strength-4-lock", + "material/wifi-strength-4", + "material/wifi-strength-alert-outline", + "material/wifi-strength-lock-open-outline", + "material/wifi-strength-lock-outline", + "material/wifi-strength-off-outline", + "material/wifi-strength-off", + "material/wifi-strength-outline", + "material/wifi-sync", + "material/wifi", + "material/wikipedia", + "material/wind-power-outline", + "material/wind-power", + "material/wind-turbine-alert", + "material/wind-turbine-check", + "material/wind-turbine", + "material/window-close", + "material/window-closed-variant", + "material/window-closed", + "material/window-maximize", + "material/window-minimize", + "material/window-open-variant", + "material/window-open", + "material/window-restore", + "material/window-shutter-alert", + "material/window-shutter-auto", + "material/window-shutter-cog", + "material/window-shutter-open", + "material/window-shutter-settings", + "material/window-shutter", + "material/windsock", + "material/wiper-wash-alert", + "material/wiper-wash", + "material/wiper", + "material/wizard-hat", + "material/wordpress", + "material/wrap-disabled", + "material/wrap", + "material/wrench-check-outline", + "material/wrench-check", + "material/wrench-clock-outline", + "material/wrench-clock", + "material/wrench-cog-outline", + "material/wrench-cog", + "material/wrench-outline", + "material/wrench", + "material/xamarin", + "material/xml", + "material/xmpp", + "material/yahoo", + "material/yeast", + "material/yin-yang", + "material/yoga", + "material/youtube-gaming", + "material/youtube-studio", + "material/youtube-subscription", + "material/youtube-tv", + "material/youtube", + "material/yurt", + "material/z-wave", + "material/zend", + "material/zigbee", + "material/zip-box-outline", + "material/zip-box", + "material/zip-disk", + "material/zodiac-aquarius", + "material/zodiac-aries", + "material/zodiac-cancer", + "material/zodiac-capricorn", + "material/zodiac-gemini", + "material/zodiac-leo", + "material/zodiac-libra", + "material/zodiac-pisces", + "material/zodiac-sagittarius", + "material/zodiac-scorpio", + "material/zodiac-taurus", + "material/zodiac-virgo", + "octicons/accessibility-16", + "octicons/alert-16", + "octicons/alert-24", + "octicons/alert-fill-12", + "octicons/apps-16", + "octicons/archive-16", + "octicons/archive-24", + "octicons/arrow-both-16", + "octicons/arrow-both-24", + "octicons/arrow-down-16", + "octicons/arrow-down-24", + "octicons/arrow-down-left-24", + "octicons/arrow-down-right-24", + "octicons/arrow-left-16", + "octicons/arrow-left-24", + "octicons/arrow-right-16", + "octicons/arrow-right-24", + "octicons/arrow-switch-16", + "octicons/arrow-switch-24", + "octicons/arrow-up-16", + "octicons/arrow-up-24", + "octicons/arrow-up-left-24", + "octicons/arrow-up-right-24", + "octicons/beaker-16", + "octicons/beaker-24", + "octicons/bell-16", + "octicons/bell-24", + "octicons/bell-fill-16", + "octicons/bell-fill-24", + "octicons/bell-slash-16", + "octicons/bell-slash-24", + "octicons/blocked-16", + "octicons/blocked-24", + "octicons/bold-16", + "octicons/bold-24", + "octicons/book-16", + "octicons/book-24", + "octicons/bookmark-16", + "octicons/bookmark-24", + "octicons/bookmark-fill-24", + "octicons/bookmark-slash-16", + "octicons/bookmark-slash-24", + "octicons/bookmark-slash-fill-24", + "octicons/briefcase-16", + "octicons/briefcase-24", + "octicons/broadcast-16", + "octicons/broadcast-24", + "octicons/browser-16", + "octicons/browser-24", + "octicons/bug-16", + "octicons/bug-24", + "octicons/cache-16", + "octicons/calendar-16", + "octicons/calendar-24", + "octicons/check-16", + "octicons/check-24", + "octicons/check-circle-16", + "octicons/check-circle-24", + "octicons/check-circle-fill-12", + "octicons/check-circle-fill-16", + "octicons/check-circle-fill-24", + "octicons/checkbox-16", + "octicons/checkbox-24", + "octicons/checklist-16", + "octicons/checklist-24", + "octicons/chevron-down-16", + "octicons/chevron-down-24", + "octicons/chevron-left-16", + "octicons/chevron-left-24", + "octicons/chevron-right-16", + "octicons/chevron-right-24", + "octicons/chevron-up-16", + "octicons/chevron-up-24", + "octicons/circle-16", + "octicons/circle-24", + "octicons/circle-slash-16", + "octicons/circle-slash-24", + "octicons/clock-16", + "octicons/clock-24", + "octicons/cloud-16", + "octicons/cloud-24", + "octicons/cloud-offline-16", + "octicons/cloud-offline-24", + "octicons/code-16", + "octicons/code-24", + "octicons/code-of-conduct-16", + "octicons/code-of-conduct-24", + "octicons/code-review-16", + "octicons/code-review-24", + "octicons/code-square-16", + "octicons/code-square-24", + "octicons/codescan-16", + "octicons/codescan-24", + "octicons/codescan-checkmark-16", + "octicons/codescan-checkmark-24", + "octicons/codespaces-16", + "octicons/codespaces-24", + "octicons/columns-16", + "octicons/columns-24", + "octicons/command-palette-16", + "octicons/command-palette-24", + "octicons/comment-16", + "octicons/comment-24", + "octicons/comment-discussion-16", + "octicons/comment-discussion-24", + "octicons/commit-24", + "octicons/container-16", + "octicons/container-24", + "octicons/copilot-16", + "octicons/copilot-24", + "octicons/copilot-48", + "octicons/copilot-96", + "octicons/copilot-error-16", + "octicons/copilot-warning-16", + "octicons/copy-16", + "octicons/copy-24", + "octicons/cpu-16", + "octicons/cpu-24", + "octicons/credit-card-16", + "octicons/credit-card-24", + "octicons/cross-reference-16", + "octicons/cross-reference-24", + "octicons/dash-16", + "octicons/dash-24", + "octicons/database-16", + "octicons/database-24", + "octicons/dependabot-16", + "octicons/dependabot-24", + "octicons/desktop-download-16", + "octicons/desktop-download-24", + "octicons/device-camera-16", + "octicons/device-camera-video-16", + "octicons/device-camera-video-24", + "octicons/device-desktop-16", + "octicons/device-desktop-24", + "octicons/device-mobile-16", + "octicons/device-mobile-24", + "octicons/diamond-16", + "octicons/diamond-24", + "octicons/diff-16", + "octicons/diff-24", + "octicons/diff-added-16", + "octicons/diff-ignored-16", + "octicons/diff-modified-16", + "octicons/diff-removed-16", + "octicons/diff-renamed-16", + "octicons/dot-16", + "octicons/dot-24", + "octicons/dot-fill-16", + "octicons/dot-fill-24", + "octicons/download-16", + "octicons/download-24", + "octicons/duplicate-16", + "octicons/duplicate-24", + "octicons/ellipsis-16", + "octicons/eye-16", + "octicons/eye-24", + "octicons/eye-closed-16", + "octicons/eye-closed-24", + "octicons/feed-discussion-16", + "octicons/feed-forked-16", + "octicons/feed-heart-16", + "octicons/feed-merged-16", + "octicons/feed-person-16", + "octicons/feed-repo-16", + "octicons/feed-rocket-16", + "octicons/feed-star-16", + "octicons/feed-tag-16", + "octicons/feed-trophy-16", + "octicons/file-16", + "octicons/file-24", + "octicons/file-added-16", + "octicons/file-badge-16", + "octicons/file-binary-16", + "octicons/file-binary-24", + "octicons/file-code-16", + "octicons/file-code-24", + "octicons/file-diff-16", + "octicons/file-diff-24", + "octicons/file-directory-16", + "octicons/file-directory-24", + "octicons/file-directory-fill-16", + "octicons/file-directory-fill-24", + "octicons/file-directory-open-fill-16", + "octicons/file-media-24", + "octicons/file-moved-16", + "octicons/file-removed-16", + "octicons/file-submodule-16", + "octicons/file-submodule-24", + "octicons/file-symlink-file-16", + "octicons/file-symlink-file-24", + "octicons/file-zip-16", + "octicons/file-zip-24", + "octicons/filter-16", + "octicons/filter-24", + "octicons/flame-16", + "octicons/flame-24", + "octicons/fold-16", + "octicons/fold-24", + "octicons/fold-down-16", + "octicons/fold-down-24", + "octicons/fold-up-16", + "octicons/fold-up-24", + "octicons/gear-16", + "octicons/gear-24", + "octicons/gift-16", + "octicons/gift-24", + "octicons/git-branch-16", + "octicons/git-branch-24", + "octicons/git-commit-16", + "octicons/git-commit-24", + "octicons/git-compare-16", + "octicons/git-compare-24", + "octicons/git-merge-16", + "octicons/git-merge-24", + "octicons/git-merge-queue-16", + "octicons/git-pull-request-16", + "octicons/git-pull-request-24", + "octicons/git-pull-request-closed-16", + "octicons/git-pull-request-closed-24", + "octicons/git-pull-request-draft-16", + "octicons/git-pull-request-draft-24", + "octicons/globe-16", + "octicons/globe-24", + "octicons/grabber-16", + "octicons/grabber-24", + "octicons/graph-16", + "octicons/graph-24", + "octicons/hash-16", + "octicons/hash-24", + "octicons/heading-16", + "octicons/heading-24", + "octicons/heart-16", + "octicons/heart-24", + "octicons/heart-fill-16", + "octicons/heart-fill-24", + "octicons/history-16", + "octicons/history-24", + "octicons/home-16", + "octicons/home-24", + "octicons/home-fill-24", + "octicons/horizontal-rule-16", + "octicons/horizontal-rule-24", + "octicons/hourglass-16", + "octicons/hourglass-24", + "octicons/hubot-16", + "octicons/hubot-24", + "octicons/id-badge-16", + "octicons/image-16", + "octicons/image-24", + "octicons/inbox-16", + "octicons/inbox-24", + "octicons/infinity-16", + "octicons/infinity-24", + "octicons/info-16", + "octicons/info-24", + "octicons/issue-closed-16", + "octicons/issue-closed-24", + "octicons/issue-draft-16", + "octicons/issue-draft-24", + "octicons/issue-opened-16", + "octicons/issue-opened-24", + "octicons/issue-reopened-16", + "octicons/issue-reopened-24", + "octicons/italic-16", + "octicons/italic-24", + "octicons/iterations-16", + "octicons/iterations-24", + "octicons/kebab-horizontal-16", + "octicons/kebab-horizontal-24", + "octicons/key-16", + "octicons/key-24", + "octicons/key-asterisk-16", + "octicons/law-16", + "octicons/law-24", + "octicons/light-bulb-16", + "octicons/light-bulb-24", + "octicons/link-16", + "octicons/link-24", + "octicons/link-external-16", + "octicons/link-external-24", + "octicons/list-ordered-16", + "octicons/list-ordered-24", + "octicons/list-unordered-16", + "octicons/list-unordered-24", + "octicons/location-16", + "octicons/location-24", + "octicons/lock-16", + "octicons/lock-24", + "octicons/log-16", + "octicons/logo-gist-16", + "octicons/logo-github-16", + "octicons/mail-16", + "octicons/mail-24", + "octicons/mark-github-16", + "octicons/markdown-16", + "octicons/megaphone-16", + "octicons/megaphone-24", + "octicons/mention-16", + "octicons/mention-24", + "octicons/meter-16", + "octicons/milestone-16", + "octicons/milestone-24", + "octicons/mirror-16", + "octicons/mirror-24", + "octicons/moon-16", + "octicons/moon-24", + "octicons/mortar-board-16", + "octicons/mortar-board-24", + "octicons/multi-select-16", + "octicons/multi-select-24", + "octicons/mute-16", + "octicons/mute-24", + "octicons/no-entry-16", + "octicons/no-entry-24", + "octicons/no-entry-fill-12", + "octicons/north-star-16", + "octicons/north-star-24", + "octicons/note-16", + "octicons/note-24", + "octicons/number-16", + "octicons/number-24", + "octicons/organization-16", + "octicons/organization-24", + "octicons/package-16", + "octicons/package-24", + "octicons/package-dependencies-16", + "octicons/package-dependencies-24", + "octicons/package-dependents-16", + "octicons/package-dependents-24", + "octicons/paintbrush-16", + "octicons/paper-airplane-16", + "octicons/paper-airplane-24", + "octicons/paperclip-16", + "octicons/paperclip-24", + "octicons/paste-16", + "octicons/paste-24", + "octicons/pencil-16", + "octicons/pencil-24", + "octicons/people-16", + "octicons/people-24", + "octicons/person-16", + "octicons/person-24", + "octicons/person-add-16", + "octicons/person-add-24", + "octicons/person-fill-16", + "octicons/person-fill-24", + "octicons/pin-16", + "octicons/pin-24", + "octicons/play-16", + "octicons/play-24", + "octicons/plug-16", + "octicons/plug-24", + "octicons/plus-16", + "octicons/plus-24", + "octicons/plus-circle-16", + "octicons/plus-circle-24", + "octicons/project-16", + "octicons/project-24", + "octicons/pulse-16", + "octicons/pulse-24", + "octicons/question-16", + "octicons/question-24", + "octicons/quote-16", + "octicons/quote-24", + "octicons/reply-16", + "octicons/reply-24", + "octicons/repo-16", + "octicons/repo-24", + "octicons/repo-clone-16", + "octicons/repo-deleted-16", + "octicons/repo-forked-16", + "octicons/repo-forked-24", + "octicons/repo-locked-16", + "octicons/repo-locked-24", + "octicons/repo-pull-16", + "octicons/repo-push-16", + "octicons/repo-push-24", + "octicons/repo-template-16", + "octicons/repo-template-24", + "octicons/report-16", + "octicons/report-24", + "octicons/rocket-16", + "octicons/rocket-24", + "octicons/rows-16", + "octicons/rows-24", + "octicons/rss-16", + "octicons/rss-24", + "octicons/ruby-16", + "octicons/ruby-24", + "octicons/screen-full-16", + "octicons/screen-full-24", + "octicons/screen-normal-16", + "octicons/screen-normal-24", + "octicons/search-16", + "octicons/search-24", + "octicons/server-16", + "octicons/server-24", + "octicons/share-16", + "octicons/share-24", + "octicons/share-android-16", + "octicons/share-android-24", + "octicons/shield-16", + "octicons/shield-24", + "octicons/shield-check-16", + "octicons/shield-check-24", + "octicons/shield-lock-16", + "octicons/shield-lock-24", + "octicons/shield-x-16", + "octicons/shield-x-24", + "octicons/sidebar-collapse-16", + "octicons/sidebar-collapse-24", + "octicons/sidebar-expand-16", + "octicons/sidebar-expand-24", + "octicons/sign-in-16", + "octicons/sign-in-24", + "octicons/sign-out-16", + "octicons/sign-out-24", + "octicons/single-select-16", + "octicons/single-select-24", + "octicons/skip-16", + "octicons/skip-24", + "octicons/sliders-16", + "octicons/smiley-16", + "octicons/smiley-24", + "octicons/sort-asc-16", + "octicons/sort-asc-24", + "octicons/sort-desc-16", + "octicons/sort-desc-24", + "octicons/square-16", + "octicons/square-24", + "octicons/square-fill-16", + "octicons/square-fill-24", + "octicons/squirrel-16", + "octicons/squirrel-24", + "octicons/stack-16", + "octicons/stack-24", + "octicons/star-16", + "octicons/star-24", + "octicons/star-fill-16", + "octicons/star-fill-24", + "octicons/stop-16", + "octicons/stop-24", + "octicons/stopwatch-16", + "octicons/stopwatch-24", + "octicons/strikethrough-16", + "octicons/strikethrough-24", + "octicons/sun-16", + "octicons/sun-24", + "octicons/sync-16", + "octicons/sync-24", + "octicons/tab-24", + "octicons/tab-external-16", + "octicons/table-16", + "octicons/table-24", + "octicons/tag-16", + "octicons/tag-24", + "octicons/tasklist-16", + "octicons/tasklist-24", + "octicons/telescope-16", + "octicons/telescope-24", + "octicons/telescope-fill-16", + "octicons/telescope-fill-24", + "octicons/terminal-16", + "octicons/terminal-24", + "octicons/three-bars-16", + "octicons/thumbsdown-16", + "octicons/thumbsdown-24", + "octicons/thumbsup-16", + "octicons/thumbsup-24", + "octicons/tools-16", + "octicons/tools-24", + "octicons/trash-16", + "octicons/trash-24", + "octicons/triangle-down-16", + "octicons/triangle-down-24", + "octicons/triangle-left-16", + "octicons/triangle-left-24", + "octicons/triangle-right-16", + "octicons/triangle-right-24", + "octicons/triangle-up-16", + "octicons/triangle-up-24", + "octicons/trophy-16", + "octicons/trophy-24", + "octicons/typography-16", + "octicons/typography-24", + "octicons/unfold-16", + "octicons/unfold-24", + "octicons/unlock-16", + "octicons/unlock-24", + "octicons/unmute-16", + "octicons/unmute-24", + "octicons/unverified-16", + "octicons/unverified-24", + "octicons/upload-16", + "octicons/upload-24", + "octicons/verified-16", + "octicons/verified-24", + "octicons/versions-16", + "octicons/versions-24", + "octicons/video-16", + "octicons/video-24", + "octicons/webhook-16", + "octicons/workflow-16", + "octicons/workflow-24", + "octicons/x-16", + "octicons/x-24", + "octicons/x-circle-16", + "octicons/x-circle-24", + "octicons/x-circle-fill-12", + "octicons/x-circle-fill-16", + "octicons/x-circle-fill-24", + "octicons/zap-16", + "octicons/zap-24" + ] +} \ No newline at end of file diff --git a/schema/extensions.json b/schema/extensions.json new file mode 100644 index 00000000..50bb5fc5 --- /dev/null +++ b/schema/extensions.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Markdown extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/", + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "extensions/markdown.json" + }, + { + "$ref": "extensions/pymdownx.json" + } + ] + }, + "uniqueItems": true, + "minItems": 1 +} diff --git a/schema/extensions/markdown.json b/schema/extensions/markdown.json new file mode 100644 index 00000000..99563b0a --- /dev/null +++ b/schema/extensions/markdown.json @@ -0,0 +1,140 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Markdown extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/", + "oneOf": [ + { + "title": "Abbreviations – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#abbreviations", + "enum": [ + "markdown.extensions.abbr", + "abbr" + ] + }, + { + "title": "Admonition – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#admonition", + "enum": [ + "markdown.extensions.admonition", + "admonition" + ] + }, + { + "title": "Attribute Lists – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#attribute-lists", + "enum": [ + "markdown.extensions.attr_list", + "attr_list" + ] + }, + { + "title": "Definition Lists – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#definition-lists", + "enum": [ + "markdown.extensions.def_list", + "def_list" + ] + }, + { + "title": "Footnotes – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#footnotes", + "enum": [ + "markdown.extensions.footnotes", + "footnotes" + ] + }, + { + "title": "Markdown in HTML – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#markdown-in-html", + "enum": [ + "markdown.extensions.md_in_html", + "md_in_html" + ] + }, + { + "title": "Tables – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#tables", + "enum": [ + "markdown.extensions.tables", + "tables" + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "toc": { + "$ref": "#/definitions/toc" + }, + "markdown.extensions.toc": { + "$ref": "#/definitions/toc" + } + }, + "additionalProperties": false + }, + { + "title": "Table Of Contents – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#table-of-contents", + "enum": [ + "markdown.extensions.toc", + "toc" + ] + } + ] + } + ], + "definitions": { + "toc": { + "title": "Table Of Contents – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#table-of-contents", + "type": "object", + "properties": { + "title": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#toc-title", + "type": "string" + }, + "permalink": { + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#toc-permalink", + "type": "boolean" + }, + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#toc-permalink", + "type": "string" + } + ], + "default": true + }, + "anchorlink": { + "markdownDescription": "https://python-markdown.github.io/extensions/toc/#usage", + "type": "boolean", + "default": false + }, + "permalink_title": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#toc-permalink-title", + "type": "string" + }, + "slugify": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#toc-slugify", + "type": "string" + }, + "toc_depth": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#toc-depth", + "type": "number", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ] + } + }, + "additionalProperties": false + } + } +} diff --git a/schema/extensions/pymdownx.json b/schema/extensions/pymdownx.json new file mode 100644 index 00000000..6617b857 --- /dev/null +++ b/schema/extensions/pymdownx.json @@ -0,0 +1,616 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Markdown extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/", + "oneOf": [ + { + "oneOf": [ + { + "type": "object", + "properties": { + "pymdownx.arithmatex": { + "title": "Arithmatex – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#arithmatex", + "type": "object", + "properties": { + "generic": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/arithmatex/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "title": "Arithmatex – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#arithmatex", + "enum": [ + "pymdownx.arithmatex" + ] + } + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "pymdownx.betterem": { + "title": "BetterEm – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#betterem", + "type": "object", + "properties": { + "smart_enable": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/betterem/#options", + "type": "string", + "enum": [ + "all", + "asterisk", + "underscore", + "none" + ], + "default": "all" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "title": "BetterEm – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#betterem", + "enum": [ + "pymdownx.betterem" + ] + } + ] + }, + { + "oneOf": [ + { + "title": "Caret – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "enum": [ + "pymdownx.caret" + ] + }, + { + "type": "object", + "properties": { + "pymdownx.caret": { + "title": "Caret – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "type": "object", + "properties": { + "smart_insert": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/caret/#options", + "type": "boolean", + "default": true + }, + "insert": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/caret/#options", + "type": "boolean", + "default": true + }, + "superscript": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/caret/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "Critic – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#critic", + "enum": [ + "pymdownx.critic" + ] + }, + { + "type": "object", + "properties": { + "pymdownx.critic": { + "title": "Critic – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#critic", + "type": "object", + "properties": { + "mode": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#critic-mode", + "enum": [ + "view", + "accept", + "reject" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "title": "Details – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#details", + "enum": [ + "pymdownx.details" + ] + }, + { + "type": "object", + "properties": { + "pymdownx.emoji": { + "title": "Emoji – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#emoji", + "type": "object", + "properties": { + "emoji_generator": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/emoji/#options", + "type": "string", + "default": "!!python/name:materialx.emoji.to_svg" + }, + "emoji_index": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/emoji/#options", + "type": "string", + "default": "!!python/name:materialx.emoji.twemoji" + }, + "options": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#custom-icons", + "type": "object", + "properties": { + "custom_icons": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#custom-icons", + "type": "array", + "items": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#custom-icons", + "type": "string" + }, + "uniqueItems": true, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": [ + "emoji_generator", + "emoji_index" + ] + } + }, + "additionalProperties": false + }, + { + "oneOf": [ + { + "title": "Highlight – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight", + "enum": [ + "pymdownx.highlight" + ] + }, + { + "type": "object", + "properties": { + "pymdownx.highlight": { + "title": "Highlight – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight", + "type": "object", + "properties": { + "use_pygments": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight-use-pygments", + "type": "boolean" + }, + "auto_title": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight-auto-title", + "type": "boolean" + }, + "auto_title_map": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/highlight/#options", + "type": "object" + }, + "linenums": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight-linenums", + "type": "boolean" + }, + "linenums_style": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight-linenums-style", + "enum": [ + "inline", + "pymdownx-inline", + "table" + ] + }, + "anchor_linenums": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight-anchor-linenums", + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "title": "InlineHilite – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#inlinehilite", + "enum": [ + "pymdownx.inlinehilite" + ] + }, + { + "oneOf": [ + { + "title": "Keys – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#keys", + "enum": [ + "pymdownx.keys" + ] + }, + { + "type": "object", + "properties": { + "pymdownx.keys": { + "title": "Keys – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#keys", + "type": "object", + "properties": { + "separator": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "string", + "default": "+" + }, + "strict": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean", + "default": false + }, + "camel_case": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean", + "default": false + }, + "key_map": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "object" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "MagicLink – Python Markdown Extensions", + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/", + "enum": [ + "pymdownx.magiclink" + ] + }, + { + "type": "object", + "properties": { + "pymdownx.magiclink": { + "title": "MagicLink – Python Markdown Extensions", + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/", + "type": "object", + "properties": { + "user": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "string" + }, + "repo": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "string" + }, + "repo_url_shorthand": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false, + "required": [ + "user", + "repo" + ] + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "Mark – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "enum": [ + "pymdownx.mark" + ] + }, + { + "type": "object", + "properties": { + "pymdownx.mark": { + "title": "Mark – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "type": "object", + "properties": { + "smart_mark": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "SmartSymbols – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#smartsymbols", + "enum": [ + "pymdownx.smartsymbols" + ] + }, + { + "type": "object", + "properties": { + "pymdownx.smartsymbols": { + "title": "SmartSymbols – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#smartsymbols", + "type": "object", + "properties": { + "smart_mark": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean" + }, + "trademark": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean" + }, + "copyright": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean" + }, + "registered": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean" + }, + "care_of": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean" + }, + "plusminus": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean" + }, + "arrows": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean" + }, + "notequal": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean" + }, + "fractions": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean" + }, + "ordinal_numbers": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "pymdownx.snippets": { + "title": "Snippets – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#snippets", + "type": "object", + "properties": { + "base_path": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "string" + }, + "auto_append": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "array", + "items": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "string" + }, + "uniqueItems": true, + "minItems": 1 + }, + "check_paths": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "title": "Snippets – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#snippets", + "enum": [ + "pymdownx.snippets" + ] + } + ] + }, + { + "oneOf": [ + { + "title": "SuperFences – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences", + "enum": [ + "pymdownx.superfences" + ] + }, + { + "type": "object", + "properties": { + "pymdownx.superfences": { + "title": "SuperFences – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences", + "type": "object", + "properties": { + "custom_fences": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences-custom-fences", + "type": "array", + "items": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences-custom-fences", + "type": "object", + "properties": { + "name": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/superfences/#custom-fences", + "type": "string" + }, + "class": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/superfences/#custom-fences", + "type": "string" + }, + "format": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/superfences/#custom-fences", + "type": "string" + } + }, + "additionalProperties": false + }, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "type": "object", + "properties": { + "pymdownx.tabbed": { + "title": "Tabbed – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tabbed", + "type": "object", + "properties": { + "alternate_style": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tabbed-alternate-style", + "type": "boolean", + "enum": [ + true + ], + "default": true + } + }, + "additionalProperties": false, + "required": [ + "alternate_style" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "pymdownx.tasklist": { + "title": "Tasklist – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tasklist", + "type": "object", + "properties": { + "custom_checkbox": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tasklist-custom-checkbox", + "type": "boolean", + "default": true + }, + "clickable_checkbox": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tasklist-clickable-checkbox", + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "oneOf": [ + { + "title": "Tilde – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "enum": [ + "pymdownx.tilde" + ] + }, + { + "type": "object", + "properties": { + "pymdownx.tilde": { + "title": "Tilde – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "type": "object", + "properties": { + "smart_delete": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/tilde/#options", + "type": "boolean" + }, + "delete": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/tilde/#options", + "type": "boolean" + }, + "subscript": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/tilde/#options", + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + } + ] +} diff --git a/schema/extra.json b/schema/extra.json new file mode 100644 index 00000000..118f26fd --- /dev/null +++ b/schema/extra.json @@ -0,0 +1,381 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Extra configuration", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/", + "type": "object", + "properties": { + "homepage": { + "title": "Homepage link (when clicking on logo)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/#logo", + "type": "string" + }, + "analytics": { + "title": "Analytics provider", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "type": "object", + "properties": { + "provider": { + "title": "Analytics provider", + "oneOf": [ + { + "title": "Google Analytics", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "enum": [ + "google" + ] + }, + { + "type": "string" + } + ] + }, + "property": { + "oneOf": [ + { + "title": "Google Analytics 4", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "pattern": "^G-\\w{10}$" + }, + { + "title": "Universal Analytics", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "pattern": "^UA-\\w{9}-\\w$" + }, + { + "title": "Unknown property", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "type": "string" + } + ] + }, + "feedback": { + "title": "Was this page helpful?", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful", + "type": "object", + "properties": { + "title": { + "title": "Feedback widget title", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful", + "type": "string", + "default": "Was this page helpful?" + }, + "ratings": { + "title": "Feedback ratings", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful", + "type": "array", + "items": { + "title": "Feedback rating", + "type": "object", + "properties": { + "icon": { + "$ref": "#/definitions/icon" + }, + "name": { + "title": "Feedback rating name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#feedback-rating-name", + "type": "string" + }, + "data": { + "title": "Feedback rating data", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#feedback-rating-data", + "type": "number" + }, + "note": { + "title": "Feedback rating data", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#feedback-rating-note", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "icon", + "name", + "data", + "note" + ] + } + } + }, + "additionalProperties": false, + "required": [ + "title" + ] + } + }, + "additionalProperties": false, + "required": [ + "provider", + "property" + ], + "defaultSnippets": [ + { + "label": "feedback (default)", + "body": { + "feedback": { + "title": "${1:Was this page helpful}", + "ratings": [ + { + "icon": "${2:material/emoticon-happy-outline}", + "name": "${3:This page was helpful}", + "data": 1, + "note": "${4:Thanks for your feedback!}" + }, + { + "icon": "${5:material/emoticon-sad-outline}", + "name": "${6:This page could be improved}", + "data": 0, + "note": "${7:Thanks for your feedback!}" + } + ] + } + } + } + ] + }, + "consent": { + "title": "Cookie consent", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "object", + "properties": { + "title": { + "title": "Cookie consent title", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "string", + "default": "Cookie consent" + }, + "description": { + "title": "Cookie consent description", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "string" + }, + "cookies": { + "title": "Cookies", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "object", + "properties": { + "analytics": { + "$ref": "#/definitions/cookie" + } + }, + "patternProperties": { + "\\w+": { + "$ref": "#/definitions/cookie" + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "analytics (default)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "body": { + "analytics": { + "name": "Google Analytics", + "checked": true + } + } + } + ] + }, + "actions": { + "title": "Cookie consent actions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "array", + "items": { + "oneOf": [ + { + "title": "Button to accept cookies", + "enum": [ + "accept" + ] + }, + { + "title": "Button to reject cookies", + "enum": [ + "reject" + ] + }, + { + "title": "Button to manage settings", + "enum": [ + "manage" + ] + } + ] + } + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "actions (default)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "body": { + "actions": [ + "accept", + "manage" + ] + } + } + ], + "required": [ + "title", + "description" + ] + }, + "social": { + "title": "Social links", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#social-links", + "type": "array", + "items": { + "title": "Social link", + "type": "object", + "properties": { + "icon": { + "$ref": "#/definitions/icon" + }, + "link": { + "title": "Social link", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#social-link", + "type": "string" + }, + "name": { + "title": "Social link name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#social-name", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "icon", + "link" + ] + } + }, + "alternate": { + "title": "Site language selector", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#site-language-selector", + "type": "array", + "items": { + "title": "Alternate language", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#site-language-selector", + "type": "object", + "properties": { + "name": { + "title": "Alternate language name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#language-name", + "type": "string" + }, + "link": { + "title": "Alternate language link", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#language-link", + "type": "string" + }, + "lang": { + "title": "Alternate language code (ISO 639-1)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#language-lang", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "link", + "lang" + ] + } + }, + "tags": { + "title": "Tag identifiers", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tag-icons", + "type": "object", + "patternProperties": { + ".*": { + "title": "Tag identifier mapping", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tag-icons", + "pattern": "^[\\w-]+$" + } + } + }, + "version": { + "title": "Versioning", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/#versioning", + "type": "object", + "properties": { + "provider": { + "title": "Versioning provider", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/#versioning", + "enum": [ + "mike" + ] + }, + "default": { + "title": "Default version", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/#version-warning", + "default": "stable" + } + } + }, + "generator": { + "title": "Generator notice", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#generator-notice", + "type": "boolean", + "default": true + } + }, + "additionalProperties": true, + "definitions": { + "cookie": { + "title": "Cookie", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "oneOf": [ + { + "type": "object", + "properties": { + "name": { + "title": "Cookie name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "string" + }, + "checked": { + "title": "Initial state", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false, + "required": [ + "name" + ] + }, + { + "title": "Cookie name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "string" + } + ] + }, + "icon": { + "oneOf": [ + { + "$ref": "assets/icons.json" + }, + { + "title": "Unknown icon", + "type": "string" + } + ] + } + }, + "defaultSnippets": [ + { + "label": "analytics (default)", + "body": { + "analytics": { + "provider": "${1:google}", + "property": "${2:UA-XXXXXXXX-X}" + } + } + } + ] +} diff --git a/schema/nav.json b/schema/nav.json new file mode 100644 index 00000000..89cf4fb4 --- /dev/null +++ b/schema/nav.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Navigation tree", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "type": "array", + "items": { + "oneOf": [ + { + "title": "Navigation item", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "pattern": "\\.md$" + }, + { + "type": "object", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "patternProperties": { + ".*": { + "oneOf": [ + { + "title": "Navigation item", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "pattern": "\\.md$" + }, + { + "$ref": "#" + } + ] + } + } + } + ] + }, + "additionalItems": false +} diff --git a/schema/plugins.json b/schema/plugins.json new file mode 100644 index 00000000..adcb7dce --- /dev/null +++ b/schema/plugins.json @@ -0,0 +1,86 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Plugins", + "markdownDescription": "https://www.mkdocs.org/dev-guide/plugins/", + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/definitions/built-in" + }, + { + "$ref": "#/definitions/external" + }, + { + "$ref": "#/definitions/external-community" + } + ] + }, + "uniqueItems": true, + "minItems": 1, + "definitions": { + "built-in": { + "description": "Built-in plugins", + "oneOf": [ + { + "$ref": "plugins/meta.json" + }, + { + "$ref": "plugins/offline.json" + }, + { + "$ref": "plugins/privacy.json" + }, + { + "$ref": "plugins/search.json" + }, + { + "$ref": "plugins/social.json" + }, + { + "$ref": "plugins/tags.json" + } + ] + }, + "external": { + "description": "External plugins, schema provided by us", + "oneOf": [ + { + "$ref": "plugins/external/git-authors.json" + }, + { + "$ref": "plugins/external/git-committers.json" + }, + { + "$ref": "plugins/external/git-revision-date.json" + }, + { + "$ref": "plugins/external/minify.json" + }, + { + "$ref": "plugins/external/redirects.json" + } + ] + }, + "external-community": { + "description": "External plugins, schema provided by the community", + "oneOf": [ + { + "$ref": "https://raw.githubusercontent.com/mondeja/mkdocs-include-markdown-plugin/master/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/mondeja/mkdocs-material-relative-language-selector/master/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/Guts/mkdocs-rss-plugin/main/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/timvink/mkdocs-git-revision-date-localized-plugin/master/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/blueswen/mkdocs-glightbox/main/schema.json" + } + ] + } + } +} diff --git a/schema/plugins/external/git-authors.json b/schema/plugins/external/git-authors.json new file mode 100644 index 00000000..4bf452ab --- /dev/null +++ b/schema/plugins/external/git-authors.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Git authors plugin", + "oneOf": [ + { + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/", + "enum": [ + "git-authors" + ] + }, + { + "type": "object", + "properties": { + "git-authors": { + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/options.html", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/options.html#enabled", + "type": "boolean", + "default": true + }, + "exclude": { + "title": "List of Markdown file patterns", + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/options.html#exclude", + "type": "array", + "items": { + "pattern": "(\\*|\\.md)$" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/external/git-committers.json b/schema/plugins/external/git-committers.json new file mode 100644 index 00000000..c6c43f0a --- /dev/null +++ b/schema/plugins/external/git-committers.json @@ -0,0 +1,44 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Git committers plugin", + "oneOf": [ + { + "markdownDescription": "https://github.com/ojacques/mkdocs-git-committers-plugin-2", + "enum": [ + "git-committers" + ] + }, + { + "type": "object", + "properties": { + "git-committers": { + "markdownDescription": "https://github.com/ojacques/mkdocs-git-committers-plugin-2", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://github.com/ojacques/mkdocs-git-committers-plugin-2#config", + "type": "boolean", + "default": true + }, + "repository": { + "title": "Repository slug", + "markdownDescription": "https://github.com/ojacques/mkdocs-git-committers-plugin-2#config", + "type": "string" + }, + "token": { + "title": "Personal access token", + "markdownDescription": "https://github.com/ojacques/mkdocs-git-committers-plugin-2#config", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "repository" + ] + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/external/git-revision-date.json b/schema/plugins/external/git-revision-date.json new file mode 100644 index 00000000..97d9dbaa --- /dev/null +++ b/schema/plugins/external/git-revision-date.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Git revision date plugin", + "oneOf": [ + { + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin", + "enum": [ + "git-revision-date" + ] + }, + { + "type": "object", + "properties": { + "git-revision-date": { + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin", + "type": "object", + "properties": { + "enable_if_env": { + "title": "Enable plugin when environment variable is set", + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin#options", + "type": "string" + }, + "modify_md": { + "title": "Enable plugin to be used in Markdown files", + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin#options", + "type": "boolean", + "default": true + }, + "as_datetime": { + "title": "Output as Python datetime", + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin#options", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/external/minify.json b/schema/plugins/external/minify.json new file mode 100644 index 00000000..d4bff5da --- /dev/null +++ b/schema/plugins/external/minify.json @@ -0,0 +1,68 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Minify plugin", + "type": "object", + "properties": { + "minify": { + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin", + "type": "object", + "dependencies": { + "minify_js": [ + "js_files" + ], + "minify_css": [ + "css_files" + ] + }, + "properties": { + "minify_html": { + "title": "Minify HTML files", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "boolean", + "default": true + }, + "minify_js": { + "title": "Minify JavaScript files", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "boolean" + }, + "minify_css": { + "title": "Minify CSS files", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "boolean" + }, + "htmlmin_opts": { + "title": "Options for HTML minifier", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "object" + }, + "js_files": { + "title": "JavaScript files to minify", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "array", + "items": { + "title": "Path to JavaScript file", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "pattern": "\\.js$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "css_files": { + "title": "CSS files to minify", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "array", + "items": { + "title": "Path to CSS file", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "pattern": "\\.css$" + }, + "uniqueItems": true, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/schema/plugins/external/redirects.json b/schema/plugins/external/redirects.json new file mode 100644 index 00000000..a473be4b --- /dev/null +++ b/schema/plugins/external/redirects.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Redirects plugin", + "type": "object", + "properties": { + "redirects": { + "markdownDescription": "https://github.com/datarobot/mkdocs-redirects", + "type": "object", + "properties": { + "redirect_maps": { + "title": "Mapping of Markdown files", + "markdownDescription": "https://github.com/datarobot/mkdocs-redirects#using", + "type": "object", + "patternProperties": { + "\\.md$": { + "oneOf": [ + { + "title": "Internal redirect", + "markdownDescription": "https://github.com/datarobot/mkdocs-redirects#using", + "pattern": "\\.md$" + }, + { + "title": "External redirect", + "markdownDescription": "https://github.com/datarobot/mkdocs-redirects#using", + "pattern": "^https?:" + } + ] + } + }, + "defaultSnippets": [ + { + "label": "Internal redirect", + "body": { + "${1:from}.md": "${2:to}.md" + } + }, + { + "label": "External redirect", + "body": { + "${1:from}.md": "https://${2:to.url}" + } + } + ], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/schema/plugins/meta.json b/schema/plugins/meta.json new file mode 100644 index 00000000..d1d9cb1b --- /dev/null +++ b/schema/plugins/meta.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in meta plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/#built-in-meta-plugin", + "enum": [ + "meta" + ] + }, + { + "type": "object", + "properties": { + "meta": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/#built-in-meta-plugin", + "type": "object", + "properties": { + "meta_file": { + "title": "Meta file name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/#meta-file", + "pattern": "\\.yml$", + "default": "\"**/.meta.yml\"" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/offline.json b/schema/plugins/offline.json new file mode 100644 index 00000000..36281cad --- /dev/null +++ b/schema/plugins/offline.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in offline plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/building-for-offline-usage/#built-in-offline-plugin", + "enum": [ + "offline" + ] + }, + { + "type": "object", + "properties": { + "offline": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/building-for-offline-usage/#built-in-offline-plugin", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/building-for-offline-usage/#enabled", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/privacy.json b/schema/plugins/privacy.json new file mode 100644 index 00000000..d229704d --- /dev/null +++ b/schema/plugins/privacy.json @@ -0,0 +1,68 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in privacy plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#built-in-privacy-plugin", + "enum": [ + "privacy" + ] + }, + { + "type": "object", + "properties": { + "privacy": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#built-in-privacy-plugin", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#enabled", + "type": "boolean", + "default": true + }, + "externals": { + "title": "External assets", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#externals", + "oneOf": [ + { + "title": "Bundle external assets", + "enum": [ + "bundle" + ] + }, + { + "title": "Report external assets as warnings", + "enum": [ + "report" + ] + } + ], + "default": "bundle" + }, + "externals_dir": { + "title": "External assets download directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#externals-dir", + "type": "string", + "default": "assets/externals" + }, + "externals_exclude": { + "title": "External assets to be excluded", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#externals-exclude", + "type": "array", + "items": { + "title": "External assets matching this pattern will not be bundled", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#externals-exclude", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/search.json b/schema/plugins/search.json new file mode 100644 index 00000000..ce489209 --- /dev/null +++ b/schema/plugins/search.json @@ -0,0 +1,179 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in search plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#built-in-search-plugin", + "enum": [ + "search" + ] + }, + { + "type": "object", + "properties": { + "search": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#built-in-search-plugin", + "type": "object", + "properties": { + "lang": { + "oneOf": [ + { + "$ref": "#/definitions/lang" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/lang" + }, + "uniqueItems": true, + "minItems": 1 + } + ], + "default": "en" + }, + "separator": { + "title": "Separator for indexing and query tokenization", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-separator", + "type": "string" + }, + "jieba_dict": { + "title": "Jieba dictionary replacement", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#jieba-dict", + "type": "string" + }, + "jieba_dict_user": { + "title": "Jieba dictionary augmentation", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#jieba-dict", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "lang": { + "title": "Site search language", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-lang", + "oneOf": [ + { + "title": "Site search language: Arabic", + "enum": [ + "ar" + ] + }, + { + "title": "Site search language: Danish", + "enum": [ + "da" + ] + }, + { + "title": "Site search language: German", + "enum": [ + "de" + ] + }, + { + "title": "Site search language: Dutch", + "enum": [ + "du" + ] + }, + { + "title": "Site search language: English", + "enum": [ + "en" + ] + }, + { + "title": "Site search language: Spanish", + "enum": [ + "es" + ] + }, + { + "title": "Site search language: Finnish", + "enum": [ + "fi" + ] + }, + { + "title": "Site search language: French", + "enum": [ + "fr" + ] + }, + { + "title": "Site search language: Hungarian", + "enum": [ + "hu" + ] + }, + { + "title": "Site search language: Italian", + "enum": [ + "it" + ] + }, + { + "title": "Site search language: Japanese", + "enum": [ + "ja" + ] + }, + { + "title": "Site search language: Norwegian", + "enum": [ + "no" + ] + }, + { + "title": "Site search language: Portuguese", + "enum": [ + "pt" + ] + }, + { + "title": "Site search language: Romanian", + "enum": [ + "ro" + ] + }, + { + "title": "Site search language: Russian", + "enum": [ + "ru" + ] + }, + { + "title": "Site search language: Swedish", + "enum": [ + "sv" + ] + }, + { + "title": "Site search language: Thai", + "enum": [ + "th" + ] + }, + { + "title": "Site search language: Turkish", + "enum": [ + "tr" + ] + }, + { + "title": "Site search language: Vietnamese", + "enum": [ + "vi" + ] + } + ] + } + } +} + diff --git a/schema/plugins/social.json b/schema/plugins/social.json new file mode 100644 index 00000000..e70c9cc8 --- /dev/null +++ b/schema/plugins/social.json @@ -0,0 +1,68 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in social plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-social-cards/#built-in-social-plugin", + "enum": [ + "social" + ] + }, + { + "type": "object", + "properties": { + "social": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-social-cards/#built-in-social-plugin", + "type": "object", + "properties": { + "cards": { + "title": "Social card generation", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-social-cards/#cards", + "type": "boolean", + "default": true + }, + "cards_color": { + "title": "Social card color palette", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-social-cards/#cards-color", + "type": "object", + "properties": { + "fill": { + "title": "Background fill color", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-social-cards/#cards-color", + "type": "string" + }, + "text": { + "title": "Foreground text color", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-social-cards/#cards-color", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "fill", + "text" + ] + }, + "cards_font": { + "$ref": "../assets/fonts.json" + }, + "cards_dir": { + "title": "Social card directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-social-cards/#cards-dir", + "type": "string", + "default": "assets/images/social" + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "cards_font", + "body": "cards_font: ${1:Roboto}" + } + ] + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/tags.json b/schema/plugins/tags.json new file mode 100644 index 00000000..5a7ab1aa --- /dev/null +++ b/schema/plugins/tags.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in tags plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#built-in-tags-plugin", + "enum": [ + "tags" + ] + }, + { + "type": "object", + "properties": { + "tags": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#built-in-tags-plugin", + "type": "object", + "properties": { + "tags_file": { + "title": "Markdown file to render tags index", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tags-file", + "pattern": "\\.md$", + "default": "tags.md" + }, + "tags_extra_files": { + "title": "Markdown files to render additional tags indexes", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tags-extra-files", + "type": "object", + "patternProperties": { + "\\.md$": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/theme.json b/schema/theme.json new file mode 100644 index 00000000..f8762aab --- /dev/null +++ b/schema/theme.json @@ -0,0 +1,938 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Theme configuration", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/", + "type": "object", + "properties": { + "name": { + "title": "Theme name", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#name", + "oneOf": [ + { + "enum": [ + "material" + ] + }, + { + "type": "null" + } + ], + "default": "material" + }, + "custom_dir": { + "title": "Directory with theme overrides", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#setup-and-theme-structure", + "type": "string", + "defaultSnippets": [ + { + "body": "${1:overrides}" + } + ] + }, + "static_templates": { + "title": "Static templates to render", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#static_templates", + "type": "array", + "items": { + "title": "Path to HTML file", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#static_templates", + "pattern": "\\.html$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "language": { + "title": "Site language", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/", + "oneOf": [ + { + "title": "Site language: Custom", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#custom-translations", + "enum": [ + "custom" + ] + }, + { + "title": "Site language: Afrikaans", + "enum": [ + "af" + ] + }, + { + "title": "Site language: Arabic", + "enum": [ + "ar" + ] + }, + { + "title": "Site language: Bulgarian", + "enum": [ + "bg" + ] + }, + { + "title": "Site language: Bengali (Bangla)", + "enum": [ + "bn" + ] + }, + { + "title": "Site language: Catalan", + "enum": [ + "ca" + ] + }, + { + "title": "Site language: Czech", + "enum": [ + "cs" + ] + }, + { + "title": "Site language: Danish", + "enum": [ + "da" + ] + }, + { + "title": "Site language: German", + "enum": [ + "de" + ] + }, + { + "title": "Site language: Greek", + "enum": [ + "el" + ] + }, + { + "title": "Site language: English", + "enum": [ + "en" + ] + }, + { + "title": "Site language: Esperanto", + "enum": [ + "eo" + ] + }, + { + "title": "Site language: Spanish", + "enum": [ + "es" + ] + }, + { + "title": "Site language: Estonian", + "enum": [ + "et" + ] + }, + { + "title": "Site language: Persian (Farsi)", + "enum": [ + "fa" + ] + }, + { + "title": "Site language: Finnish", + "enum": [ + "fi" + ] + }, + { + "title": "Site language: French", + "enum": [ + "fr" + ] + }, + { + "title": "Site language: Galician", + "enum": [ + "gl" + ] + }, + { + "title": "Site language: Hebrew", + "enum": [ + "he" + ] + }, + { + "title": "Site language: Hindi", + "enum": [ + "hi" + ] + }, + { + "title": "Site language: Croatian", + "enum": [ + "hr" + ] + }, + { + "title": "Site language: Hungarian", + "enum": [ + "hu" + ] + }, + { + "title": "Site language: Armenian", + "enum": [ + "hy" + ] + }, + { + "title": "Site language: Indonesian", + "enum": [ + "id" + ] + }, + { + "title": "Site language: Icelandic", + "enum": [ + "is" + ] + }, + { + "title": "Site language: Italian", + "enum": [ + "it" + ] + }, + { + "title": "Site language: Japanese", + "enum": [ + "ja" + ] + }, + { + "title": "Site language: Georgian", + "enum": [ + "ka" + ] + }, + { + "title": "Site language: Korean", + "enum": [ + "kr" + ] + }, + { + "title": "Site language: Lithuanian", + "enum": [ + "lt" + ] + }, + { + "title": "Site language: Latvian", + "enum": [ + "lv" + ] + }, + { + "title": "Site language: Macedonian", + "enum": [ + "mk" + ] + }, + { + "title": "Site language: Mongolian", + "enum": [ + "mn" + ] + }, + { + "title": "Site language: Bahasa Malaysia", + "enum": [ + "ms" + ] + }, + { + "title": "Site language: Burmese", + "enum": [ + "my" + ] + }, + { + "title": "Site language: Dutch", + "enum": [ + "nl" + ] + }, + { + "title": "Site language: Norwegian (Nynorsk)", + "enum": [ + "nn" + ] + }, + { + "title": "Site language: Norwegian", + "enum": [ + "no" + ] + }, + { + "title": "Site language: Polish", + "enum": [ + "pl" + ] + }, + { + "title": "Site language: Portuguese", + "enum": [ + "pt" + ] + }, + { + "title": "Site language: Portuguese (Brasilian)", + "enum": [ + "pt-BR" + ] + }, + { + "title": "Site language: Romanian", + "enum": [ + "ro" + ] + }, + { + "title": "Site language: Russian", + "enum": [ + "ru" + ] + }, + { + "title": "Site language: Serbo-Croatian", + "enum": [ + "sh" + ] + }, + { + "title": "Site language: Sinhalese", + "enum": [ + "si" + ] + }, + { + "title": "Site language: Slovak", + "enum": [ + "sk" + ] + }, + { + "title": "Site language: Slovenian", + "enum": [ + "sl" + ] + }, + { + "title": "Site language: Serbian", + "enum": [ + "sr" + ] + }, + { + "title": "Site language: Swedish", + "enum": [ + "sv" + ] + }, + { + "title": "Site language: Thai", + "enum": [ + "th" + ] + }, + { + "title": "Site language: Tagalog", + "enum": [ + "tl" + ] + }, + { + "title": "Site language: Turkish", + "enum": [ + "tr" + ] + }, + { + "title": "Site language: Ukrainian", + "enum": [ + "uk" + ] + }, + { + "title": "Site language: Urdu", + "enum": [ + "ur" + ] + }, + { + "title": "Site language: Uzbek", + "enum": [ + "uz" + ] + }, + { + "title": "Site language: Vietnamese", + "enum": [ + "vi" + ] + }, + { + "title": "Site language: Chinese (Simplified)", + "enum": [ + "zh" + ] + }, + { + "title": "Site language: Chinese (Traditional)", + "enum": [ + "zh-Hant" + ] + }, + { + "title": "Site language: Chinese (Taiwanese)", + "enum": [ + "zh-TW" + ] + } + ], + "default": "en" + }, + "direction": { + "title": "Directionality", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#directionality", + "enum": [ + "ltr", + "rtl" + ] + }, + "favicon": { + "title": "Favicon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/#favicon", + "pattern": "\\.(ico|png|svg|jpe?g)$", + "defaultSnippets": [ + { + "body": "${1:path/to/file}.png" + } + ] + }, + "logo": { + "title": "Logo", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/#logo", + "pattern": "\\.(png|svg|jpe?g)$", + "defaultSnippets": [ + { + "body": "${1:path/to/file}.png" + } + ] + }, + "icon": { + "title": "Icons", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/", + "type": "object", + "properties": { + "logo": { + "$ref": "#/definitions/icon" + }, + "repo": { + "$ref": "#/definitions/icon" + }, + "admonition": { + "title": "Admonition icon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/admonitions/#admonition-icons", + "type": "object", + "properties": { + "note": { + "$ref": "#/definitions/icon" + }, + "abstract": { + "$ref": "#/definitions/icon" + }, + "info": { + "$ref": "#/definitions/icon" + }, + "tip": { + "$ref": "#/definitions/icon" + }, + "success": { + "$ref": "#/definitions/icon" + }, + "question": { + "$ref": "#/definitions/icon" + }, + "warning": { + "$ref": "#/definitions/icon" + }, + "failure": { + "$ref": "#/definitions/icon" + }, + "danger": { + "$ref": "#/definitions/icon" + }, + "bug": { + "$ref": "#/definitions/icon" + }, + "example": { + "$ref": "#/definitions/icon" + }, + "quote": { + "$ref": "#/definitions/icon" + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "note", + "body": "note: ${1:material/pencil}" + }, + { + "label": "abstract", + "body": "abstract: ${1:material/clipboard-text}" + }, + { + "label": "info", + "body": "info: ${1:material/information}" + }, + { + "label": "tip", + "body": "tip: ${1:material/fire}" + }, + { + "label": "success", + "body": "success: ${1:material/check-bold}" + }, + { + "label": "question", + "body": "question: ${1:material/help-circle}" + }, + { + "label": "warning", + "body": "warning: ${1:material/alert}" + }, + { + "label": "failure", + "body": "failure: ${1:material/close-thick}" + }, + { + "label": "danger", + "body": "danger: ${1:material/lightning-bolt}" + }, + { + "label": "bug", + "body": "bug: ${1:material/bug}" + }, + { + "label": "example", + "body": "example: ${1:material/format-list-numbered}" + }, + { + "label": "quote", + "body": "quote: ${1:material/format-quote-close}" + } + ] + }, + "tag": { + "title": "Tag icon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tag-icons", + "type": "object", + "patternProperties": { + "^\\w+$": { + "$ref": "#/definitions/icon" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "logo", + "body": "logo: ${1:material/library}" + }, + { + "label": "repo", + "body": "repo: ${1:fontawesome/brands/git-alt}" + } + ] + }, + "features": { + "title": "Feature flags", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/", + "type": "array", + "items": { + "oneOf": [ + { + "title": "Mark as read", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-header/#mark-as-read", + "enum": [ + "announce.dismiss" + ] + }, + { + "title": "Code annotations", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#code-annotations", + "enum": [ + "content.code.annotate" + ] + }, + { + "title": "Linked content tabs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/content-tabs/#linked-content-tabs", + "enum": [ + "content.tabs.link" + ] + }, + { + "title": "Improved tooltips", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/tooltips/#improved-tooltips", + "enum": [ + "content.tooltips" + ] + }, + { + "title": "Header hides automatically when scrolling", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-header/#automatic-hiding", + "enum": [ + "header.autohide" + ] + }, + { + "title": "Navigation expansion", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-expansion", + "enum": [ + "navigation.expand" + ] + }, + { + "title": "Section index pages", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#section-index-pages", + "enum": [ + "navigation.indexes" + ] + }, + { + "title": "Instant loading", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#instant-loading", + "enum": [ + "navigation.instant" + ] + }, + { + "title": "Navigation pruning", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-pruning", + "enum": [ + "navigation.prune" + ] + }, + { + "title": "Navigation sections", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-sections", + "enum": [ + "navigation.sections" + ] + }, + { + "title": "Navigation tabs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-tabs", + "enum": [ + "navigation.tabs" + ] + }, + { + "title": "Sticky navigation tabs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#sticky-navigation-tabs", + "enum": [ + "navigation.tabs.sticky" + ] + }, + { + "title": "Back-to-top button", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#back-to-top-button", + "enum": [ + "navigation.top" + ] + }, + { + "title": "Anchor tracking", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#anchor-tracking", + "enum": [ + "navigation.tracking" + ] + }, + { + "title": "Search higlighting", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-highlighting", + "enum": [ + "search.highlight" + ] + }, + { + "title": "Search sharing", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-sharing", + "enum": [ + "search.share" + ] + }, + { + "title": "Search suggestions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-suggestions", + "enum": [ + "search.suggest" + ] + }, + { + "title": "Integrated table of contents", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#anchor-following", + "enum": [ + "toc.follow" + ] + }, + { + "title": "Integrated table of contents", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-integration", + "enum": [ + "toc.integrate" + ] + } + ] + }, + "uniqueItems": true, + "minItems": 1 + }, + "palette": { + "oneOf": [ + { + "title": "Color palette", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/", + "type": "object", + "properties": { + "scheme": { + "$ref": "#/definitions/scheme" + }, + "primary": { + "$ref": "#/definitions/primary" + }, + "accent": { + "$ref": "#/definitions/accent" + } + }, + "additionalProperties": false + }, + { + "title": "Color palette", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/", + "type": "array", + "items": { + "type": "object", + "properties": { + "scheme": { + "$ref": "#/definitions/scheme" + }, + "primary": { + "$ref": "#/definitions/primary" + }, + "accent": { + "$ref": "#/definitions/accent" + }, + "media": { + "oneOf": [ + { + "title": "System preference", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#system-preference", + "type": "string", + "enum": [ + "\"(prefers-color-scheme: light)\"", + "\"(prefers-color-scheme: dark)\"" + ] + }, + { + "type": "string" + } + ], + "defaultSnippets": [ + { + "label": "\"(prefers-color-scheme: light)\"", + "body": "\"(prefers-color-scheme: ${1:light})\"" + } + ] + }, + "toggle": { + "title": "Color palette toggle", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#color-palette-toggle", + "properties": { + "icon": { + "$ref": "#/definitions/icon" + }, + "name": { + "title": "Color palette toggle name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#toggle-name", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "icon", + "name" + ] + } + }, + "additionalProperties": false, + "required": [ + "toggle" + ] + }, + "uniqueItems": true, + "minItems": 1 + } + ], + "default": { + "scheme": "default", + "primary": "indigo", + "accent": "indigo" + } + }, + "font": { + "oneOf": [ + { + "title": "Google Fonts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-fonts/", + "properties": { + "text": { + "$ref": "assets/fonts.json" + }, + "code": { + "$ref": "assets/fonts.json" + } + }, + "additionalProperties": false + }, + { + "title": "Disable Google Fonts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-fonts/#autoloading", + "enum": [ + false + ] + } + ], + "defaultSnippets": [ + { + "body": { + "text": "${1:Roboto}", + "code": "${2:Roboto Mono}" + } + } + ] + }, + "include_search_page": { + "title": "Only necessary when installing from git", + "markdownDescription": "Must be set to `false`", + "enum": [ + false + ] + }, + "search_index_only": { + "title": "Only necessary when installing from git", + "markdownDescription": "Must be set to `false`", + "enum": [ + true + ] + } + }, + "additionalProperties": false, + "required": [ + "name" + ], + "definitions": { + "scheme": { + "title": "Color scheme", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#color-scheme", + "oneOf": [ + { + "enum": [ + "default", + "slate" + ] + }, + { + "type": "string" + } + ], + "defaultSnippets": [ + { + "label": "default", + "body": "${1:default}" + } + ] + }, + "primary": { + "title": "Primary color", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#primary-color", + "enum": [ + "red", + "pink", + "purple", + "deep purple", + "indigo", + "blue", + "light blue", + "cyan", + "teal", + "green", + "light green", + "lime", + "yellow", + "amber", + "orange", + "deep orange", + "brown", + "grey", + "blue grey", + "black", + "white" + ] + }, + "accent": { + "title": "Accent color", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#accent-color", + "enum": [ + "red", + "pink", + "purple", + "deep purple", + "indigo", + "blue", + "light blue", + "cyan", + "teal", + "green", + "light green", + "lime", + "yellow", + "amber", + "orange", + "deep orange", + "brown", + "grey", + "blue grey", + "black", + "white" + ] + }, + "icon": { + "oneOf": [ + { + "$ref": "assets/icons.json" + }, + { + "title": "Unknown icon", + "type": "string" + } + ] + } + } +} diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..d86fa38b --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"","title":"Home"},{"location":"license/","text":"License \u00b6 MIT License Copyright \u00a9 2016-2022 Martin Donath Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","title":"License"},{"location":"license/#license","text":"MIT License Copyright \u00a9 2016-2022 Martin Donath Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","title":"License"},{"location":"adicional/","text":"Video - Vint Cerf \u00b6 O primeiro passo para trabalharmos com redes \u00e9 compreender o contexto ao qual estamos inseridos e tamb\u00e9m saber o que deve ser protegido e implementado. Neste sentido, seria interessante voc\u00eas acessarem o v\u00eddeo dispon\u00edvel no link abaixo. Nele um dos criadores do TCP/IP Vint Cerf vai abordar os principais acontecimentos tecnol\u00f3gicos para entendermos o que \u00e9 a Internet e as redes de computadores. Video - OpenInfra 2022 \u00b6 OpenStack \u00e9 a plataforma de nuvem de c\u00f3digo aberto l\u00edder mundial. Ele \u00e9 usado por centenas de provedores locais de nuvem p\u00fablica , telcos e milhares de empresas , com mais de 25 milh\u00f5es de n\u00facleos sendo executados em produ\u00e7\u00e3o, de acordo com a OpenStack User Survey 2021. O OpenStack, sem d\u00favida, dominou o mercado e se tornou o padr\u00e3o de fato para c\u00f3digo aberto implementa\u00e7\u00f5es de infraestrutura em nuvem. Sua ado\u00e7\u00e3o continua a crescer e sua participa\u00e7\u00e3o de mercado deve chegar a US$ 8 bilh\u00f5es em 2023.","title":"Governanca Internet"},{"location":"adicional/#video-vint-cerf","text":"O primeiro passo para trabalharmos com redes \u00e9 compreender o contexto ao qual estamos inseridos e tamb\u00e9m saber o que deve ser protegido e implementado. Neste sentido, seria interessante voc\u00eas acessarem o v\u00eddeo dispon\u00edvel no link abaixo. Nele um dos criadores do TCP/IP Vint Cerf vai abordar os principais acontecimentos tecnol\u00f3gicos para entendermos o que \u00e9 a Internet e as redes de computadores.","title":"Video - Vint Cerf"},{"location":"adicional/#video-openinfra-2022","text":"OpenStack \u00e9 a plataforma de nuvem de c\u00f3digo aberto l\u00edder mundial. Ele \u00e9 usado por centenas de provedores locais de nuvem p\u00fablica , telcos e milhares de empresas , com mais de 25 milh\u00f5es de n\u00facleos sendo executados em produ\u00e7\u00e3o, de acordo com a OpenStack User Survey 2021. O OpenStack, sem d\u00favida, dominou o mercado e se tornou o padr\u00e3o de fato para c\u00f3digo aberto implementa\u00e7\u00f5es de infraestrutura em nuvem. Sua ado\u00e7\u00e3o continua a crescer e sua participa\u00e7\u00e3o de mercado deve chegar a US$ 8 bilh\u00f5es em 2023.","title":"Video - OpenInfra 2022"},{"location":"projetos/0.Cloud_Intro/","text":"Objetivos \u00b6 Introduzir os conceitos b\u00e1sicos sobre cloud computing. Entender os conceitos b\u00e1sicos sobre IaaS. Pr\u00e9-requisitos: Realizar leitura pr\u00e9via: Produtos da AWS Public vs Private Cloud, AWS compared to Openstack Realizar a leitura sobre Cloud Computing. [Kavis - cap. 2 e Earl et al - cap. 4] Primeira Inst\u00e2ncia \u00b6 Vamos come\u00e7ar conhecendo o ferramental b\u00e1sico da AWS para virtual machines . Acessar o dashboard do EC2 de North Virginia ( us-east-1 ). Criar uma inst\u00e2ncia t2.micro com Ubuntu 18.04 LTS server e 8Gb de disco. Renomear a m\u00e1quina com o seu nome ( Tag ). Verifique se o security group liberou a conex\u00e3o SSH externa. Importar em Key Pair a sua public key gerada na primeira aula. Coloque o seu nome na chave. Endere\u00e7o IP p\u00fablico da m\u00e1quina: Teste a conex\u00e3o SSH (n\u00e3o se esque\u00e7a da chave privada). . Voc\u00ea criou uma policy para seu usu\u00e1rio. O que s\u00e3o Policies ? Por que elas s\u00e3o importantes e devem ser bem definidas? . Dentro do contexto de Cloud Computing, defina os termos: instance , image , region , VPC , subnet , security-group . . O poder computacional das inst\u00e2ncias \u00e9 medido em vCPU. O que \u00e9 vCPU? Primeiro Deploy - Ghost Blog Platform \u00b6 Vamos fazer um deploy completo e r\u00e1pido com poucos comandos. Acesse o terminal da inst\u00e2ncia criada e execute os seguintes comandos: Atualize o S.O. $ sudo apt update Instale o conjure-up usando o snap $ sudo snap install conjure-up --classic Agora instale a plataforma Ghost $ juju add-credential aws Insira um nome e a regi\u00e3o correspondente: us-east-1 Entre com o par Access Key ID / Secret Access Key $ conjure-up battlemidget/ghost aws/us-east-1 Aguarde. Teste o deploy $ juju status Anote o IP da aplica\u00e7\u00e3o HAProxy. Acesse a plataforma: https://[IP P\u00fablico]/admin Destrua tudo: Anote o nome do controller no juju status $ juju kill-controller [controller-name] Aguarde e destrua a inst\u00e2ncia que voc\u00ea criou na AWS . Quantas inst\u00e2ncias foram criadas automaticamente? Criar inst\u00e2ncias automaticamente \u00e9 um atributo positivo ou negativo? . Quanto custou o prot\u00f3tipo? Assuma que usou uma semana de cada inst\u00e2ncia. . Dada a quantidade de computadores apontada na quest\u00e3o anterior, descreva como voc\u00ea montaria um ambiente Ghost em um Datacenter pr\u00f3prio. Assuma que voc\u00ea ainda n\u00e3o possui nenhum hardware dispon\u00edvel, apenas um or\u00e7amento aprovado. . Agora, somando o fato de que hardware deprecia com o tempo e possui um custo mensal de manuten\u00e7\u00e3o, compare em termos de custo uma Public Cloud e um Datacenter pr\u00f3prio. Como podem perceber a infraestrutura acima n\u00e3o custa barato ao longo do tempo. Talvez o uso do conjure-up/juju n\u00e3o seja o mais adequado para pequenos projetos. Outras alternativas para realizar provisionamento/implanta\u00e7\u00e3o: Terraform: https://www.terraform.io/ Ansible: https://www.ansible.com/ Puppet: https://puppet.com/ Escalabilidade \u00b6 Conforme visto na Aula 01, vamos agora fazer uso de uma das mais poderosas caracter\u00edsticas da nuvem. Crie uma inst\u00e2ncia t2.micro com Ubuntu 18.04 LTS: Renomeie a inst\u00e2ncia para Webserver $ sudo apt update; sudo apt install nodejs build-essential -y Edite um arquivo server.js: #!/usr/bin/env nodejs var http = require ( 'http' ); var os = require ( 'os' ); var crypto = require ( 'crypto' ); http . createServer ( function ( req , res ) { res . writeHead ( 200 , { 'Content-Type' : 'text/plain' }); var nonce = 1 ; var seed = Math . random (); var h = crypto . createHash ( 'sha256' ); h . update ( new Buffer ( nonce + \" Hello World \" + seed )); while ( h . digest ( \"hex\" ). substr ( 0 , 3 ) != '000' ) { h = crypto . createHash ( 'sha256' ); nonce ++ ; h . update ( new Buffer ( nonce + \" Hello World \" + seed )); } res . end ( '{ \"host\": ' + os . hostname () + ', \"nonce\": ' + nonce + '}' ); }). listen ( 8080 , '' ); console . log ( 'Server running at http://localhost:8080/' ); Execute o servi\u00e7o: $ chmod +x ./server.js $ ./server.js Libere a porta no security group correspondente. Teste o servi\u00e7o no browser. Ajustando o final: $ crontab -e\\ @reboot /home/ubuntu/server.js $ sudo reboot Teste novamente no browser. Pesquise o que faz o crontab? Simulando carga no servidor \u00b6 Uma das grande d\u00favidas de quem utiliza nuvem diz respeito a capacidade das inst\u00e2ncias utilizadas e se elas est\u00e3o dimensiondas corretamente. Nessa etapa vamos estimar essa capacidade. Crie duas novas inst\u00e2ncias t2.micro com Ubuntu 18.04 Renomeie como: Locust-master e Locust-worker Em ambas as m\u00e1quinas: $ sudo apt update && sudo apt install python3-pip -y $ pip3 install locust crie um arquivo locustfile.py no home: \\vspace{0.3cm} from locust import HttpUser , task , between class QuickstartUser ( HttpUser ): @task def index_page ( self ): self . client . get ( \"/\" ) \\vspace{0.3cm} * no master: * liberar no security group as portas 8089 e 5557 * $ python3 -m locust -f /home/ubuntu/locustfile.py --master * No worker: * ajuste o n\u00famero de conex\u00f5es no Linux:\\ $ sudo nano /etc/sysctl.conf * adicione a linha:\\ fs.file-max = 5000000 * aplique as altera\u00e7\u00f5es:\\ $ sudo sysctl -p * acerte o crontab para rodar na inicializa\u00e7\u00e3o:\\ python3 -m locust -f /home/ubuntu/locustfile.py --worker --master-host=[IP do master] * $ sudo reboot Realizando a simula\u00e7\u00e3o: acesse o locust master via browser aguarde o worker se conectar no master inicie um teste 300/10 - 300 usu\u00e1rios e hatch rate de 10 novos usu\u00e1rios por segundo. N\u00e3o caiu! - Talvez haja algumas poucas falhas. verifique que essa aplica\u00e7\u00e3o suporta cerca de 100 rps (requisi\u00e7\u00f5es por segundo). Multiplicando os usu\u00e1rios: crie uma imagem do locust-worker. Caf\u00e9. crie mais 2 inst\u00e2ncias dessa AMI, Execute um teste 600/20 - observe que h\u00e1 algumas falhas mas ainda em um percentual baixo. Agora execute um teste 1000/50 - agora complicou. Escalando Verticalmente \u00b6 pare a m\u00e1quina com o servidor http. troque para t2.2xlarge. atualize o IP no locust master, reinicie os workers e repita o teste 1000/50. Escalando Horizontalmente \u00b6 Crie uma imagem do servidor web. Caf\u00e9. Rebaixe a m\u00e1quina para t2.micro de novo. Crie mais 2 inst\u00e2ncias a partir da AMI criada. N\u00e3o esque\u00e7a de reutilizar o security group. Crie um Application LoadBalancer que mapeia inst\u00e2ncias:8080 para loadbalancer:80. Marcar todas as Availability Zones . Adicione as 3 inst\u00e2ncias no Target Group . Teste o acesso ao LoadBalancer :\\vspace{0.5cm} Endere\u00e7o DNS:\\vspace{0.5cm} Verifique no navegador que h\u00e1 uma altern\u00e2ncia do servidor. Execute novamente o teste 1000/50. Voil\u00e0! Agora vamos ativar a elasticidade da nuvem. Remova as inst\u00e2ncias do LoadBalancer. Destrue-as. Crie um Autoscalling Group : Criar um Launch Configuration da mesma configura\u00e7\u00e3o em que foi criada a inst\u00e2ncia original. Reutilizar o Security Group com as devidas libera\u00e7\u00f5es. Come\u00e7ar com 1 inst\u00e2ncia. Selecionar todas as subnets . Anexar o Target Group criado anteriormente. Selecionar: Use scaling policies to adjust the capacity of this group . Usar Request Count Per Target em 3000 (50 rps x 60 segundos) Aguarde a primeira inst\u00e2ncia subir e teste o LoadBalancer de novo. Execute o teste 1000/50 novamente. Em 3 minutos ele se ajustar\u00e1 sozinho \u00e0 demanda. Encerre o teste e em 15 minutos ir\u00e1 desativar a capacidade ociosa automaticamente. Remova tudo e n\u00e3o deixe nada rodando (Cuidado com os recursos do seu colega).","title":"Primeiros Passos"},{"location":"projetos/0.Cloud_Intro/#objetivos","text":"Introduzir os conceitos b\u00e1sicos sobre cloud computing. Entender os conceitos b\u00e1sicos sobre IaaS. Pr\u00e9-requisitos: Realizar leitura pr\u00e9via: Produtos da AWS Public vs Private Cloud, AWS compared to Openstack Realizar a leitura sobre Cloud Computing. [Kavis - cap. 2 e Earl et al - cap. 4]","title":"Objetivos"},{"location":"projetos/0.Cloud_Intro/#primeira-instancia","text":"Vamos come\u00e7ar conhecendo o ferramental b\u00e1sico da AWS para virtual machines . Acessar o dashboard do EC2 de North Virginia ( us-east-1 ). Criar uma inst\u00e2ncia t2.micro com Ubuntu 18.04 LTS server e 8Gb de disco. Renomear a m\u00e1quina com o seu nome ( Tag ). Verifique se o security group liberou a conex\u00e3o SSH externa. Importar em Key Pair a sua public key gerada na primeira aula. Coloque o seu nome na chave. Endere\u00e7o IP p\u00fablico da m\u00e1quina: Teste a conex\u00e3o SSH (n\u00e3o se esque\u00e7a da chave privada). . Voc\u00ea criou uma policy para seu usu\u00e1rio. O que s\u00e3o Policies ? Por que elas s\u00e3o importantes e devem ser bem definidas? . Dentro do contexto de Cloud Computing, defina os termos: instance , image , region , VPC , subnet , security-group . . O poder computacional das inst\u00e2ncias \u00e9 medido em vCPU. O que \u00e9 vCPU?","title":"Primeira Inst\u00e2ncia"},{"location":"projetos/0.Cloud_Intro/#primeiro-deploy-ghost-blog-platform","text":"Vamos fazer um deploy completo e r\u00e1pido com poucos comandos. Acesse o terminal da inst\u00e2ncia criada e execute os seguintes comandos: Atualize o S.O. $ sudo apt update Instale o conjure-up usando o snap $ sudo snap install conjure-up --classic Agora instale a plataforma Ghost $ juju add-credential aws Insira um nome e a regi\u00e3o correspondente: us-east-1 Entre com o par Access Key ID / Secret Access Key $ conjure-up battlemidget/ghost aws/us-east-1 Aguarde. Teste o deploy $ juju status Anote o IP da aplica\u00e7\u00e3o HAProxy. Acesse a plataforma: https://[IP P\u00fablico]/admin Destrua tudo: Anote o nome do controller no juju status $ juju kill-controller [controller-name] Aguarde e destrua a inst\u00e2ncia que voc\u00ea criou na AWS . Quantas inst\u00e2ncias foram criadas automaticamente? Criar inst\u00e2ncias automaticamente \u00e9 um atributo positivo ou negativo? . Quanto custou o prot\u00f3tipo? Assuma que usou uma semana de cada inst\u00e2ncia. . Dada a quantidade de computadores apontada na quest\u00e3o anterior, descreva como voc\u00ea montaria um ambiente Ghost em um Datacenter pr\u00f3prio. Assuma que voc\u00ea ainda n\u00e3o possui nenhum hardware dispon\u00edvel, apenas um or\u00e7amento aprovado. . Agora, somando o fato de que hardware deprecia com o tempo e possui um custo mensal de manuten\u00e7\u00e3o, compare em termos de custo uma Public Cloud e um Datacenter pr\u00f3prio. Como podem perceber a infraestrutura acima n\u00e3o custa barato ao longo do tempo. Talvez o uso do conjure-up/juju n\u00e3o seja o mais adequado para pequenos projetos. Outras alternativas para realizar provisionamento/implanta\u00e7\u00e3o: Terraform: https://www.terraform.io/ Ansible: https://www.ansible.com/ Puppet: https://puppet.com/","title":"Primeiro Deploy - Ghost Blog Platform"},{"location":"projetos/0.Cloud_Intro/#escalabilidade","text":"Conforme visto na Aula 01, vamos agora fazer uso de uma das mais poderosas caracter\u00edsticas da nuvem. Crie uma inst\u00e2ncia t2.micro com Ubuntu 18.04 LTS: Renomeie a inst\u00e2ncia para Webserver $ sudo apt update; sudo apt install nodejs build-essential -y Edite um arquivo server.js: #!/usr/bin/env nodejs var http = require ( 'http' ); var os = require ( 'os' ); var crypto = require ( 'crypto' ); http . createServer ( function ( req , res ) { res . writeHead ( 200 , { 'Content-Type' : 'text/plain' }); var nonce = 1 ; var seed = Math . random (); var h = crypto . createHash ( 'sha256' ); h . update ( new Buffer ( nonce + \" Hello World \" + seed )); while ( h . digest ( \"hex\" ). substr ( 0 , 3 ) != '000' ) { h = crypto . createHash ( 'sha256' ); nonce ++ ; h . update ( new Buffer ( nonce + \" Hello World \" + seed )); } res . end ( '{ \"host\": ' + os . hostname () + ', \"nonce\": ' + nonce + '}' ); }). listen ( 8080 , '' ); console . log ( 'Server running at http://localhost:8080/' ); Execute o servi\u00e7o: $ chmod +x ./server.js $ ./server.js Libere a porta no security group correspondente. Teste o servi\u00e7o no browser. Ajustando o final: $ crontab -e\\ @reboot /home/ubuntu/server.js $ sudo reboot Teste novamente no browser. Pesquise o que faz o crontab?","title":"Escalabilidade"},{"location":"projetos/0.Cloud_Intro/#simulando-carga-no-servidor","text":"Uma das grande d\u00favidas de quem utiliza nuvem diz respeito a capacidade das inst\u00e2ncias utilizadas e se elas est\u00e3o dimensiondas corretamente. Nessa etapa vamos estimar essa capacidade. Crie duas novas inst\u00e2ncias t2.micro com Ubuntu 18.04 Renomeie como: Locust-master e Locust-worker Em ambas as m\u00e1quinas: $ sudo apt update && sudo apt install python3-pip -y $ pip3 install locust crie um arquivo locustfile.py no home: \\vspace{0.3cm} from locust import HttpUser , task , between class QuickstartUser ( HttpUser ): @task def index_page ( self ): self . client . get ( \"/\" ) \\vspace{0.3cm} * no master: * liberar no security group as portas 8089 e 5557 * $ python3 -m locust -f /home/ubuntu/locustfile.py --master * No worker: * ajuste o n\u00famero de conex\u00f5es no Linux:\\ $ sudo nano /etc/sysctl.conf * adicione a linha:\\ fs.file-max = 5000000 * aplique as altera\u00e7\u00f5es:\\ $ sudo sysctl -p * acerte o crontab para rodar na inicializa\u00e7\u00e3o:\\ python3 -m locust -f /home/ubuntu/locustfile.py --worker --master-host=[IP do master] * $ sudo reboot Realizando a simula\u00e7\u00e3o: acesse o locust master via browser aguarde o worker se conectar no master inicie um teste 300/10 - 300 usu\u00e1rios e hatch rate de 10 novos usu\u00e1rios por segundo. N\u00e3o caiu! - Talvez haja algumas poucas falhas. verifique que essa aplica\u00e7\u00e3o suporta cerca de 100 rps (requisi\u00e7\u00f5es por segundo). Multiplicando os usu\u00e1rios: crie uma imagem do locust-worker. Caf\u00e9. crie mais 2 inst\u00e2ncias dessa AMI, Execute um teste 600/20 - observe que h\u00e1 algumas falhas mas ainda em um percentual baixo. Agora execute um teste 1000/50 - agora complicou.","title":"Simulando carga no servidor"},{"location":"projetos/0.Cloud_Intro/#escalando-verticalmente","text":"pare a m\u00e1quina com o servidor http. troque para t2.2xlarge. atualize o IP no locust master, reinicie os workers e repita o teste 1000/50.","title":"Escalando Verticalmente"},{"location":"projetos/0.Cloud_Intro/#escalando-horizontalmente","text":"Crie uma imagem do servidor web. Caf\u00e9. Rebaixe a m\u00e1quina para t2.micro de novo. Crie mais 2 inst\u00e2ncias a partir da AMI criada. N\u00e3o esque\u00e7a de reutilizar o security group. Crie um Application LoadBalancer que mapeia inst\u00e2ncias:8080 para loadbalancer:80. Marcar todas as Availability Zones . Adicione as 3 inst\u00e2ncias no Target Group . Teste o acesso ao LoadBalancer :\\vspace{0.5cm} Endere\u00e7o DNS:\\vspace{0.5cm} Verifique no navegador que h\u00e1 uma altern\u00e2ncia do servidor. Execute novamente o teste 1000/50. Voil\u00e0! Agora vamos ativar a elasticidade da nuvem. Remova as inst\u00e2ncias do LoadBalancer. Destrue-as. Crie um Autoscalling Group : Criar um Launch Configuration da mesma configura\u00e7\u00e3o em que foi criada a inst\u00e2ncia original. Reutilizar o Security Group com as devidas libera\u00e7\u00f5es. Come\u00e7ar com 1 inst\u00e2ncia. Selecionar todas as subnets . Anexar o Target Group criado anteriormente. Selecionar: Use scaling policies to adjust the capacity of this group . Usar Request Count Per Target em 3000 (50 rps x 60 segundos) Aguarde a primeira inst\u00e2ncia subir e teste o LoadBalancer de novo. Execute o teste 1000/50 novamente. Em 3 minutos ele se ajustar\u00e1 sozinho \u00e0 demanda. Encerre o teste e em 15 minutos ir\u00e1 desativar a capacidade ociosa automaticamente. Remova tudo e n\u00e3o deixe nada rodando (Cuidado com os recursos do seu colega).","title":"Escalando Horizontalmente"},{"location":"projetos/1.ELB/","text":"Elastic Load Balancer \u00b6 O Elastic Load Balancer (ELB) da AWS \u00e9 um servi\u00e7o que distribui o tr\u00e1fego de entrada de aplicativos em v\u00e1rios destinos, como inst\u00e2ncias do Amazon EC2, cont\u00eaineres e endere\u00e7os IP. Ele aumenta a escalabilidade, a disponibilidade e a capacidade de gerenciamento de seus aplicativos. Tipos de ELBs \u00b6 A AWS oferece tr\u00eas tipos de ELBs: Classic Load Balancer \u00b6 O Classic Load Balancer \u00e9 o tipo original de ELB da AWS. Ele fornece balanceamento de carga para aplicativos que foram criados em apenas uma \u00fanica regi\u00e3o da AWS. Application Load Balancer \u00b6 O Application Load Balancer (ALB) \u00e9 um balanceador de carga de camada 7 que direciona o tr\u00e1fego para aplicativos baseados em HTTP/HTTPS. Ele fornece recursos avan\u00e7ados de roteamento, como a capacidade de rotear tr\u00e1fego para diferentes destinos com base no conte\u00fado da solicita\u00e7\u00e3o. Network Load Balancer \u00b6 O Network Load Balancer (NLB) \u00e9 um balanceador de carga de camada 4 que \u00e9 capaz de lidar com milh\u00f5es de solicita\u00e7\u00f5es por segundo. Ele \u00e9 projetado para aplicativos que exigem lat\u00eancia ultra baixa e alto desempenho. Recursos do ELB \u00b6 O ELB oferece v\u00e1rios recursos, incluindo: Balanceamento de carga: Distribui o tr\u00e1fego de entrada entre v\u00e1rios destinos para garantir que seus aplicativos estejam sempre dispon\u00edveis. Auto Scaling: O ELB pode ser integrado com o servi\u00e7o de Auto Scaling da AWS para aumentar ou diminuir a capacidade de seus aplicativos com base nas demandas do tr\u00e1fego. Monitoramento: O ELB fornece m\u00e9tricas detalhadas sobre o tr\u00e1fego e o desempenho do aplicativo para ajud\u00e1-lo a solucionar problemas rapidamente. Certificados SSL/TLS: O ELB suporta a criptografia SSL/TLS para garantir a seguran\u00e7a dos dados transmitidos pelos seus aplicativos. Conclus\u00e3o \u00b6 O Elastic Load Balancer \u00e9 um servi\u00e7o fundamental para garantir a disponibilidade, escalabilidade e confiabilidade de seus aplicativos. Com sua ampla gama de recursos e op\u00e7\u00f5es de configura\u00e7\u00e3o, o ELB \u00e9 uma excelente escolha para qualquer aplicativo que precise lidar com alto volume de tr\u00e1fego.","title":"1.1. Sobre"},{"location":"projetos/1.ELB/#elastic-load-balancer","text":"O Elastic Load Balancer (ELB) da AWS \u00e9 um servi\u00e7o que distribui o tr\u00e1fego de entrada de aplicativos em v\u00e1rios destinos, como inst\u00e2ncias do Amazon EC2, cont\u00eaineres e endere\u00e7os IP. Ele aumenta a escalabilidade, a disponibilidade e a capacidade de gerenciamento de seus aplicativos.","title":"Elastic Load Balancer"},{"location":"projetos/1.ELB/#tipos-de-elbs","text":"A AWS oferece tr\u00eas tipos de ELBs:","title":"Tipos de ELBs"},{"location":"projetos/1.ELB/#classic-load-balancer","text":"O Classic Load Balancer \u00e9 o tipo original de ELB da AWS. Ele fornece balanceamento de carga para aplicativos que foram criados em apenas uma \u00fanica regi\u00e3o da AWS.","title":"Classic Load Balancer"},{"location":"projetos/1.ELB/#application-load-balancer","text":"O Application Load Balancer (ALB) \u00e9 um balanceador de carga de camada 7 que direciona o tr\u00e1fego para aplicativos baseados em HTTP/HTTPS. Ele fornece recursos avan\u00e7ados de roteamento, como a capacidade de rotear tr\u00e1fego para diferentes destinos com base no conte\u00fado da solicita\u00e7\u00e3o.","title":"Application Load Balancer"},{"location":"projetos/1.ELB/#network-load-balancer","text":"O Network Load Balancer (NLB) \u00e9 um balanceador de carga de camada 4 que \u00e9 capaz de lidar com milh\u00f5es de solicita\u00e7\u00f5es por segundo. Ele \u00e9 projetado para aplicativos que exigem lat\u00eancia ultra baixa e alto desempenho.","title":"Network Load Balancer"},{"location":"projetos/1.ELB/#recursos-do-elb","text":"O ELB oferece v\u00e1rios recursos, incluindo: Balanceamento de carga: Distribui o tr\u00e1fego de entrada entre v\u00e1rios destinos para garantir que seus aplicativos estejam sempre dispon\u00edveis. Auto Scaling: O ELB pode ser integrado com o servi\u00e7o de Auto Scaling da AWS para aumentar ou diminuir a capacidade de seus aplicativos com base nas demandas do tr\u00e1fego. Monitoramento: O ELB fornece m\u00e9tricas detalhadas sobre o tr\u00e1fego e o desempenho do aplicativo para ajud\u00e1-lo a solucionar problemas rapidamente. Certificados SSL/TLS: O ELB suporta a criptografia SSL/TLS para garantir a seguran\u00e7a dos dados transmitidos pelos seus aplicativos.","title":"Recursos do ELB"},{"location":"projetos/1.ELB/#conclusao","text":"O Elastic Load Balancer \u00e9 um servi\u00e7o fundamental para garantir a disponibilidade, escalabilidade e confiabilidade de seus aplicativos. Com sua ampla gama de recursos e op\u00e7\u00f5es de configura\u00e7\u00e3o, o ELB \u00e9 uma excelente escolha para qualquer aplicativo que precise lidar com alto volume de tr\u00e1fego.","title":"Conclus\u00e3o"},{"location":"projetos/10.EKS/","text":"Servi\u00e7o AWS EKS \u00b6 O Amazon Elastic Kubernetes Service (EKS) \u00e9 um servi\u00e7o gerenciado que permite executar aplicativos em cont\u00eaineres Kubernetes na nuvem da AWS. Ele ajuda a implantar e gerenciar aplicativos em cont\u00eaineres com facilidade e seguran\u00e7a, usando um ambiente escal\u00e1vel e flex\u00edvel. Caracter\u00edsticas do AWS EKS \u00b6 Algumas das principais caracter\u00edsticas do AWS EKS s\u00e3o: Gerenciamento de cont\u00eaineres escal\u00e1vel : O EKS \u00e9 um servi\u00e7o altamente escal\u00e1vel que permite executar milhares de cont\u00eaineres Kubernetes em uma \u00fanica inst\u00e2ncia. Alta disponibilidade : O EKS \u00e9 projetado para oferecer alta disponibilidade, reduzindo a possibilidade de interrup\u00e7\u00f5es de servi\u00e7o. Integra\u00e7\u00e3o com outros servi\u00e7os da AWS : O EKS \u00e9 integrado com outros servi\u00e7os da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC. Suporte a v\u00e1rios tipos de cont\u00eaineres : O EKS oferece suporte a v\u00e1rios tipos de cont\u00eaineres, incluindo Docker e containerd. Integra\u00e7\u00e3o com o AWS Fargate : O EKS \u00e9 integrado com o AWS Fargate, o que permite executar cont\u00eaineres sem precisar gerenciar inst\u00e2ncias EC2. Como funciona o AWS EKS \u00b6 O AWS EKS \u00e9 composto de v\u00e1rios componentes, incluindo clusters, worker nodes e servi\u00e7os Kubernetes. O EKS usa o Amazon EC2 ou o AWS Fargate para executar worker nodes que executam os cont\u00eaineres Kubernetes. Para usar o AWS EKS, siga estes passos simples: Crie um cluster : Crie um cluster EKS para executar seus aplicativos em cont\u00eaineres Kubernetes. Os clusters s\u00e3o criados usando o console do EKS ou a API do EKS. Crie worker nodes : Crie um ou mais worker nodes que executem os cont\u00eaineres Kubernetes. Implante aplicativos : Implantar aplicativos em cont\u00eaineres Kubernetes no cluster EKS usando servi\u00e7os Kubernetes. Gerencie os servi\u00e7os : Gerencie os servi\u00e7os implantados para garantir que eles estejam sempre em execu\u00e7\u00e3o e dispon\u00edveis. Conclus\u00e3o \u00b6 O Amazon Elastic Kubernetes Service (EKS) \u00e9 uma plataforma eficiente para executar e gerenciar aplicativos em cont\u00eaineres Kubernetes na nuvem da AWS. Com sua alta escalabilidade e flexibilidade, o EKS \u00e9 uma solu\u00e7\u00e3o ideal para empresas que buscam uma forma segura e confi\u00e1vel de executar aplicativos em cont\u00eaineres Kubernetes. Ao integrar-se com outros servi\u00e7os da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC, o EKS permite que voc\u00ea crie uma infraestrutura de aplicativos em cont\u00eaineres Kubernetes altamente personalizada que atenda \u00e0s suas necessidades espec\u00edficas. Al\u00e9m disso, a integra\u00e7\u00e3o com o AWS Fargate torna o EKS ainda mais flex\u00edvel, permitindo que voc\u00ea execute cont\u00eaineres sem precisar gerenciar inst\u00e2ncias EC2.","title":"10.1. Sobre"},{"location":"projetos/10.EKS/#servico-aws-eks","text":"O Amazon Elastic Kubernetes Service (EKS) \u00e9 um servi\u00e7o gerenciado que permite executar aplicativos em cont\u00eaineres Kubernetes na nuvem da AWS. Ele ajuda a implantar e gerenciar aplicativos em cont\u00eaineres com facilidade e seguran\u00e7a, usando um ambiente escal\u00e1vel e flex\u00edvel.","title":"Servi\u00e7o AWS EKS"},{"location":"projetos/10.EKS/#caracteristicas-do-aws-eks","text":"Algumas das principais caracter\u00edsticas do AWS EKS s\u00e3o: Gerenciamento de cont\u00eaineres escal\u00e1vel : O EKS \u00e9 um servi\u00e7o altamente escal\u00e1vel que permite executar milhares de cont\u00eaineres Kubernetes em uma \u00fanica inst\u00e2ncia. Alta disponibilidade : O EKS \u00e9 projetado para oferecer alta disponibilidade, reduzindo a possibilidade de interrup\u00e7\u00f5es de servi\u00e7o. Integra\u00e7\u00e3o com outros servi\u00e7os da AWS : O EKS \u00e9 integrado com outros servi\u00e7os da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC. Suporte a v\u00e1rios tipos de cont\u00eaineres : O EKS oferece suporte a v\u00e1rios tipos de cont\u00eaineres, incluindo Docker e containerd. Integra\u00e7\u00e3o com o AWS Fargate : O EKS \u00e9 integrado com o AWS Fargate, o que permite executar cont\u00eaineres sem precisar gerenciar inst\u00e2ncias EC2.","title":"Caracter\u00edsticas do AWS EKS"},{"location":"projetos/10.EKS/#como-funciona-o-aws-eks","text":"O AWS EKS \u00e9 composto de v\u00e1rios componentes, incluindo clusters, worker nodes e servi\u00e7os Kubernetes. O EKS usa o Amazon EC2 ou o AWS Fargate para executar worker nodes que executam os cont\u00eaineres Kubernetes. Para usar o AWS EKS, siga estes passos simples: Crie um cluster : Crie um cluster EKS para executar seus aplicativos em cont\u00eaineres Kubernetes. Os clusters s\u00e3o criados usando o console do EKS ou a API do EKS. Crie worker nodes : Crie um ou mais worker nodes que executem os cont\u00eaineres Kubernetes. Implante aplicativos : Implantar aplicativos em cont\u00eaineres Kubernetes no cluster EKS usando servi\u00e7os Kubernetes. Gerencie os servi\u00e7os : Gerencie os servi\u00e7os implantados para garantir que eles estejam sempre em execu\u00e7\u00e3o e dispon\u00edveis.","title":"Como funciona o AWS EKS"},{"location":"projetos/10.EKS/#conclusao","text":"O Amazon Elastic Kubernetes Service (EKS) \u00e9 uma plataforma eficiente para executar e gerenciar aplicativos em cont\u00eaineres Kubernetes na nuvem da AWS. Com sua alta escalabilidade e flexibilidade, o EKS \u00e9 uma solu\u00e7\u00e3o ideal para empresas que buscam uma forma segura e confi\u00e1vel de executar aplicativos em cont\u00eaineres Kubernetes. Ao integrar-se com outros servi\u00e7os da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC, o EKS permite que voc\u00ea crie uma infraestrutura de aplicativos em cont\u00eaineres Kubernetes altamente personalizada que atenda \u00e0s suas necessidades espec\u00edficas. Al\u00e9m disso, a integra\u00e7\u00e3o com o AWS Fargate torna o EKS ainda mais flex\u00edvel, permitindo que voc\u00ea execute cont\u00eaineres sem precisar gerenciar inst\u00e2ncias EC2.","title":"Conclus\u00e3o"},{"location":"projetos/11.KMS/","text":"AWS KMS \u00b6 O AWS Key Management Service (KMS) \u00e9 um servi\u00e7o gerenciado que ajuda a criar e controlar o acesso a chaves criptogr\u00e1ficas para proteger dados confidenciais na nuvem da AWS. Com o KMS, \u00e9 poss\u00edvel gerenciar suas pr\u00f3prias chaves criptogr\u00e1ficas e controlar quem pode us\u00e1-las. Caracter\u00edsticas do AWS KMS \u00b6 Algumas das principais caracter\u00edsticas do AWS KMS s\u00e3o: Gerenciamento de chaves criptogr\u00e1ficas : O KMS permite criar, gerenciar e usar suas pr\u00f3prias chaves criptogr\u00e1ficas, al\u00e9m de oferecer integra\u00e7\u00e3o com outras ferramentas da AWS. Seguran\u00e7a de dados : O KMS ajuda a proteger seus dados confidenciais por meio do uso de criptografia avan\u00e7ada e controles de acesso granulares. Conformidade com regulamenta\u00e7\u00f5es : O KMS \u00e9 compat\u00edvel com uma variedade de regulamenta\u00e7\u00f5es de seguran\u00e7a, como PCI DSS, HIPAA, FedRAMP e outras. Integra\u00e7\u00e3o com outros servi\u00e7os da AWS : O KMS \u00e9 integrado com outros servi\u00e7os da AWS, como o Amazon S3, o Amazon EBS e o Amazon Redshift. Controles de acesso granulares : O KMS oferece controle de acesso granular para suas chaves criptogr\u00e1ficas, permitindo que voc\u00ea gerencie quem pode us\u00e1-las e como elas s\u00e3o usadas. Como funciona o AWS KMS \u00b6 O AWS KMS funciona atrav\u00e9s da cria\u00e7\u00e3o, gerenciamento e uso de chaves criptogr\u00e1ficas. Para usar o KMS, siga estes passos: Crie uma chave criptogr\u00e1fica : Crie uma chave criptogr\u00e1fica no console do KMS ou usando a API do KMS. \u00c9 poss\u00edvel criar chaves sim\u00e9tricas ou assim\u00e9tricas. Configure permiss\u00f5es de chave : Configure permiss\u00f5es de chave para controlar quem pode usar a chave criptogr\u00e1fica e como ela pode ser usada. Criptografe e descriptografe dados : Use a chave criptogr\u00e1fica para criptografar e descriptografar dados. Rotacione as chaves criptogr\u00e1ficas : Rotacione as chaves criptogr\u00e1ficas regularmente para garantir a seguran\u00e7a dos dados. Conclus\u00e3o \u00b6 O AWS Key Management Service (KMS) \u00e9 uma solu\u00e7\u00e3o eficiente para gerenciar chaves criptogr\u00e1ficas na nuvem da AWS. Com sua seguran\u00e7a avan\u00e7ada e controle de acesso granular, o KMS ajuda a proteger seus dados confidenciais contra amea\u00e7as de seguran\u00e7a. Ao integrar-se com outros servi\u00e7os da AWS, como o Amazon S3, o Amazon EBS e o Amazon Redshift, o KMS permite que voc\u00ea proteja seus dados em tr\u00e2nsito e em repouso, garantindo a conformidade com regulamenta\u00e7\u00f5es de seguran\u00e7a. Se voc\u00ea precisa de uma solu\u00e7\u00e3o robusta de gerenciamento de chaves criptogr\u00e1ficas, o AWS KMS \u00e9 uma excelente escolha.","title":"11.1. Sobre"},{"location":"projetos/11.KMS/#aws-kms","text":"O AWS Key Management Service (KMS) \u00e9 um servi\u00e7o gerenciado que ajuda a criar e controlar o acesso a chaves criptogr\u00e1ficas para proteger dados confidenciais na nuvem da AWS. Com o KMS, \u00e9 poss\u00edvel gerenciar suas pr\u00f3prias chaves criptogr\u00e1ficas e controlar quem pode us\u00e1-las.","title":"AWS KMS"},{"location":"projetos/11.KMS/#caracteristicas-do-aws-kms","text":"Algumas das principais caracter\u00edsticas do AWS KMS s\u00e3o: Gerenciamento de chaves criptogr\u00e1ficas : O KMS permite criar, gerenciar e usar suas pr\u00f3prias chaves criptogr\u00e1ficas, al\u00e9m de oferecer integra\u00e7\u00e3o com outras ferramentas da AWS. Seguran\u00e7a de dados : O KMS ajuda a proteger seus dados confidenciais por meio do uso de criptografia avan\u00e7ada e controles de acesso granulares. Conformidade com regulamenta\u00e7\u00f5es : O KMS \u00e9 compat\u00edvel com uma variedade de regulamenta\u00e7\u00f5es de seguran\u00e7a, como PCI DSS, HIPAA, FedRAMP e outras. Integra\u00e7\u00e3o com outros servi\u00e7os da AWS : O KMS \u00e9 integrado com outros servi\u00e7os da AWS, como o Amazon S3, o Amazon EBS e o Amazon Redshift. Controles de acesso granulares : O KMS oferece controle de acesso granular para suas chaves criptogr\u00e1ficas, permitindo que voc\u00ea gerencie quem pode us\u00e1-las e como elas s\u00e3o usadas.","title":"Caracter\u00edsticas do AWS KMS"},{"location":"projetos/11.KMS/#como-funciona-o-aws-kms","text":"O AWS KMS funciona atrav\u00e9s da cria\u00e7\u00e3o, gerenciamento e uso de chaves criptogr\u00e1ficas. Para usar o KMS, siga estes passos: Crie uma chave criptogr\u00e1fica : Crie uma chave criptogr\u00e1fica no console do KMS ou usando a API do KMS. \u00c9 poss\u00edvel criar chaves sim\u00e9tricas ou assim\u00e9tricas. Configure permiss\u00f5es de chave : Configure permiss\u00f5es de chave para controlar quem pode usar a chave criptogr\u00e1fica e como ela pode ser usada. Criptografe e descriptografe dados : Use a chave criptogr\u00e1fica para criptografar e descriptografar dados. Rotacione as chaves criptogr\u00e1ficas : Rotacione as chaves criptogr\u00e1ficas regularmente para garantir a seguran\u00e7a dos dados.","title":"Como funciona o AWS KMS"},{"location":"projetos/11.KMS/#conclusao","text":"O AWS Key Management Service (KMS) \u00e9 uma solu\u00e7\u00e3o eficiente para gerenciar chaves criptogr\u00e1ficas na nuvem da AWS. Com sua seguran\u00e7a avan\u00e7ada e controle de acesso granular, o KMS ajuda a proteger seus dados confidenciais contra amea\u00e7as de seguran\u00e7a. Ao integrar-se com outros servi\u00e7os da AWS, como o Amazon S3, o Amazon EBS e o Amazon Redshift, o KMS permite que voc\u00ea proteja seus dados em tr\u00e2nsito e em repouso, garantindo a conformidade com regulamenta\u00e7\u00f5es de seguran\u00e7a. Se voc\u00ea precisa de uma solu\u00e7\u00e3o robusta de gerenciamento de chaves criptogr\u00e1ficas, o AWS KMS \u00e9 uma excelente escolha.","title":"Conclus\u00e3o"},{"location":"projetos/12.Lambda/","text":"AWS Lambda \u00b6 AWS Lambda \u00e9 um servi\u00e7o de computa\u00e7\u00e3o sem servidor oferecido pela Amazon Web Services (AWS) que executa c\u00f3digo em resposta a eventos e gerencia automaticamente os recursos necess\u00e1rios para executar esse c\u00f3digo. Como funciona \u00b6 Com o AWS Lambda, voc\u00ea pode escrever e carregar seu pr\u00f3prio c\u00f3digo em uma variedade de linguagens de programa\u00e7\u00e3o suportadas pela AWS, como Python, Node.js, Java, C# e Go. Em seguida, voc\u00ea pode criar fun\u00e7\u00f5es que s\u00e3o acionadas por eventos, como altera\u00e7\u00f5es em dados armazenados no Amazon S3, novas mensagens em um t\u00f3pico do Amazon SNS ou novos registros em um stream do Amazon Kinesis. Quando uma fun\u00e7\u00e3o \u00e9 acionada, o servi\u00e7o AWS Lambda cria um cont\u00eainer ef\u00eamero, carrega o c\u00f3digo da fun\u00e7\u00e3o e executa o c\u00f3digo em resposta ao evento. Quando a fun\u00e7\u00e3o \u00e9 conclu\u00edda, o cont\u00eainer \u00e9 desativado e seus recursos s\u00e3o liberados. Benef\u00edcios \u00b6 Escala autom\u00e1tica : O AWS Lambda escala automaticamente a capacidade de execu\u00e7\u00e3o de suas fun\u00e7\u00f5es com base na frequ\u00eancia dos eventos que acionam suas fun\u00e7\u00f5es. N\u00e3o \u00e9 necess\u00e1rio gerenciar a capacidade de execu\u00e7\u00e3o manualmente. Pagamento por uso : Voc\u00ea paga apenas pelo tempo de execu\u00e7\u00e3o da sua fun\u00e7\u00e3o, sem taxas m\u00ednimas ou compromissos de longo prazo. Conectividade com outros servi\u00e7os AWS : O AWS Lambda pode ser facilmente conectado a outros servi\u00e7os da AWS, como Amazon S3, Amazon DynamoDB, Amazon Kinesis e Amazon SNS, permitindo que voc\u00ea crie aplicativos altamente escal\u00e1veis e integrados. Integra\u00e7\u00e3o com ferramentas de desenvolvimento : O AWS Lambda \u00e9 facilmente integrado com ferramentas de desenvolvimento populares, como o AWS Toolkit for Visual Studio, o AWS Toolkit para JetBrains, o AWS CLI e o AWS CloudFormation. Limita\u00e7\u00f5es \u00b6 Tempo limite de execu\u00e7\u00e3o : Cada execu\u00e7\u00e3o da fun\u00e7\u00e3o do Lambda tem um tempo m\u00e1ximo de dura\u00e7\u00e3o de 900 segundos (15 minutos). Restri\u00e7\u00f5es de tamanho do pacote : O tamanho m\u00e1ximo do pacote de c\u00f3digo da fun\u00e7\u00e3o \u00e9 de 50 MB, incluindo todas as depend\u00eancias. Limites de recursos : O AWS Lambda tem limites de recursos, como o n\u00famero m\u00e1ximo de cont\u00eaineres em execu\u00e7\u00e3o, a quantidade m\u00e1xima de mem\u00f3ria alocada por fun\u00e7\u00e3o e o n\u00famero m\u00e1ximo de solicita\u00e7\u00f5es simult\u00e2neas por fun\u00e7\u00e3o. Exemplo de c\u00f3digo \u00b6 Aqui est\u00e1 um exemplo simples de uma fun\u00e7\u00e3o do AWS Lambda escrita em Python que responde a eventos do Amazon S3: import json import boto3 def lambda_handler ( event , context ): # Obt\u00e9m o nome do bucket S3 e a chave do objeto que acionou o evento bucket = event [ 'Records' ][ 0 ][ 's3' ][ 'bucket' ][ 'name' ] key = event [ 'Records' ][ 0 ][ 's3' ][ 'object' ][ 'key' ] # Obt\u00e9m o objeto S3 s3 = boto3 . resource ( 's3' ) obj = s3 . Object ( bucket , key ) # L\u00ea o conte\u00fado do objeto body = obj . get ()[ 'Body' ] . read () # Imprime o conte\u00fado do objeto print ( \"Conte\u00fado do objeto:\" ) print ( body . decode ( 'utf-8' )) # Retorna uma resposta return { 'statusCode' : 200 , 'body' : json . dumps ( 'Hello from Cloudinho Nuvem!' ) } Conclus\u00e3o \u00b6 O AWS Lambda \u00e9 uma solu\u00e7\u00e3o sem servidor poderosa para criar aplicativos escal\u00e1veis e altamente integrados na AWS. Ele oferece escala autom\u00e1tica, pagamento por uso, conectividade com outros servi\u00e7os da AWS e integra\u00e7\u00e3o com ferramentas de desenvolvimento populares. No entanto, ele tamb\u00e9m tem algumas limita\u00e7\u00f5es, como tempo m\u00e1ximo de execu\u00e7\u00e3o, restri\u00e7\u00f5es de tamanho de pacote e limites de recursos. Em resumo, o AWS Lambda \u00e9 uma ferramenta poderosa para desenvolvedores que procuram criar aplicativos escal\u00e1veis sem se preocupar com a infraestrutura subjacente. Com sua facilidade de uso e integra\u00e7\u00e3o com outras ferramentas da AWS, o Lambda permite que os desenvolvedores se concentrem na l\u00f3gica de neg\u00f3cios em vez de gerenciar a infraestrutura. Se voc\u00ea ainda n\u00e3o experimentou o AWS Lambda, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.","title":"12.1. Sobre"},{"location":"projetos/12.Lambda/#aws-lambda","text":"AWS Lambda \u00e9 um servi\u00e7o de computa\u00e7\u00e3o sem servidor oferecido pela Amazon Web Services (AWS) que executa c\u00f3digo em resposta a eventos e gerencia automaticamente os recursos necess\u00e1rios para executar esse c\u00f3digo.","title":"AWS Lambda"},{"location":"projetos/12.Lambda/#como-funciona","text":"Com o AWS Lambda, voc\u00ea pode escrever e carregar seu pr\u00f3prio c\u00f3digo em uma variedade de linguagens de programa\u00e7\u00e3o suportadas pela AWS, como Python, Node.js, Java, C# e Go. Em seguida, voc\u00ea pode criar fun\u00e7\u00f5es que s\u00e3o acionadas por eventos, como altera\u00e7\u00f5es em dados armazenados no Amazon S3, novas mensagens em um t\u00f3pico do Amazon SNS ou novos registros em um stream do Amazon Kinesis. Quando uma fun\u00e7\u00e3o \u00e9 acionada, o servi\u00e7o AWS Lambda cria um cont\u00eainer ef\u00eamero, carrega o c\u00f3digo da fun\u00e7\u00e3o e executa o c\u00f3digo em resposta ao evento. Quando a fun\u00e7\u00e3o \u00e9 conclu\u00edda, o cont\u00eainer \u00e9 desativado e seus recursos s\u00e3o liberados.","title":"Como funciona"},{"location":"projetos/12.Lambda/#beneficios","text":"Escala autom\u00e1tica : O AWS Lambda escala automaticamente a capacidade de execu\u00e7\u00e3o de suas fun\u00e7\u00f5es com base na frequ\u00eancia dos eventos que acionam suas fun\u00e7\u00f5es. N\u00e3o \u00e9 necess\u00e1rio gerenciar a capacidade de execu\u00e7\u00e3o manualmente. Pagamento por uso : Voc\u00ea paga apenas pelo tempo de execu\u00e7\u00e3o da sua fun\u00e7\u00e3o, sem taxas m\u00ednimas ou compromissos de longo prazo. Conectividade com outros servi\u00e7os AWS : O AWS Lambda pode ser facilmente conectado a outros servi\u00e7os da AWS, como Amazon S3, Amazon DynamoDB, Amazon Kinesis e Amazon SNS, permitindo que voc\u00ea crie aplicativos altamente escal\u00e1veis e integrados. Integra\u00e7\u00e3o com ferramentas de desenvolvimento : O AWS Lambda \u00e9 facilmente integrado com ferramentas de desenvolvimento populares, como o AWS Toolkit for Visual Studio, o AWS Toolkit para JetBrains, o AWS CLI e o AWS CloudFormation.","title":"Benef\u00edcios"},{"location":"projetos/12.Lambda/#limitacoes","text":"Tempo limite de execu\u00e7\u00e3o : Cada execu\u00e7\u00e3o da fun\u00e7\u00e3o do Lambda tem um tempo m\u00e1ximo de dura\u00e7\u00e3o de 900 segundos (15 minutos). Restri\u00e7\u00f5es de tamanho do pacote : O tamanho m\u00e1ximo do pacote de c\u00f3digo da fun\u00e7\u00e3o \u00e9 de 50 MB, incluindo todas as depend\u00eancias. Limites de recursos : O AWS Lambda tem limites de recursos, como o n\u00famero m\u00e1ximo de cont\u00eaineres em execu\u00e7\u00e3o, a quantidade m\u00e1xima de mem\u00f3ria alocada por fun\u00e7\u00e3o e o n\u00famero m\u00e1ximo de solicita\u00e7\u00f5es simult\u00e2neas por fun\u00e7\u00e3o.","title":"Limita\u00e7\u00f5es"},{"location":"projetos/12.Lambda/#exemplo-de-codigo","text":"Aqui est\u00e1 um exemplo simples de uma fun\u00e7\u00e3o do AWS Lambda escrita em Python que responde a eventos do Amazon S3: import json import boto3 def lambda_handler ( event , context ): # Obt\u00e9m o nome do bucket S3 e a chave do objeto que acionou o evento bucket = event [ 'Records' ][ 0 ][ 's3' ][ 'bucket' ][ 'name' ] key = event [ 'Records' ][ 0 ][ 's3' ][ 'object' ][ 'key' ] # Obt\u00e9m o objeto S3 s3 = boto3 . resource ( 's3' ) obj = s3 . Object ( bucket , key ) # L\u00ea o conte\u00fado do objeto body = obj . get ()[ 'Body' ] . read () # Imprime o conte\u00fado do objeto print ( \"Conte\u00fado do objeto:\" ) print ( body . decode ( 'utf-8' )) # Retorna uma resposta return { 'statusCode' : 200 , 'body' : json . dumps ( 'Hello from Cloudinho Nuvem!' ) }","title":"Exemplo de c\u00f3digo"},{"location":"projetos/12.Lambda/#conclusao","text":"O AWS Lambda \u00e9 uma solu\u00e7\u00e3o sem servidor poderosa para criar aplicativos escal\u00e1veis e altamente integrados na AWS. Ele oferece escala autom\u00e1tica, pagamento por uso, conectividade com outros servi\u00e7os da AWS e integra\u00e7\u00e3o com ferramentas de desenvolvimento populares. No entanto, ele tamb\u00e9m tem algumas limita\u00e7\u00f5es, como tempo m\u00e1ximo de execu\u00e7\u00e3o, restri\u00e7\u00f5es de tamanho de pacote e limites de recursos. Em resumo, o AWS Lambda \u00e9 uma ferramenta poderosa para desenvolvedores que procuram criar aplicativos escal\u00e1veis sem se preocupar com a infraestrutura subjacente. Com sua facilidade de uso e integra\u00e7\u00e3o com outras ferramentas da AWS, o Lambda permite que os desenvolvedores se concentrem na l\u00f3gica de neg\u00f3cios em vez de gerenciar a infraestrutura. Se voc\u00ea ainda n\u00e3o experimentou o AWS Lambda, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.","title":"Conclus\u00e3o"},{"location":"projetos/13.Fargate/","text":"AWS Fargate \u00b6 O AWS Fargate \u00e9 um servi\u00e7o de computa\u00e7\u00e3o sem servidor para cont\u00eaineres que permite executar cont\u00eaineres do Docker no Amazon Elastic Container Service (ECS) e no Amazon Elastic Kubernetes Service (EKS) sem a necessidade de gerenciar a infraestrutura subjacente. Como funciona \u00b6 Com o AWS Fargate, voc\u00ea pode executar cont\u00eaineres do Docker em um ambiente completamente gerenciado. Voc\u00ea s\u00f3 precisa criar um cluster do ECS ou do EKS, definir suas tarefas de cont\u00eainer e o Fargate gerenciar\u00e1 a infraestrutura subjacente necess\u00e1ria para executar essas tarefas. Isso inclui recursos como inst\u00e2ncias do Amazon EC2, escalabilidade, patching de seguran\u00e7a e muito mais. Benef\u00edcios \u00b6 Sem infraestrutura para gerenciar : O AWS Fargate gerencia toda a infraestrutura necess\u00e1ria para executar suas tarefas de cont\u00eainer, permitindo que voc\u00ea se concentre em desenvolver seu aplicativo. Escala autom\u00e1tica : O Fargate escalona automaticamente seus cont\u00eaineres com base na demanda do aplicativo. Seguran\u00e7a : O Fargate usa inst\u00e2ncias EC2 dedicadas e isoladas para executar suas tarefas de cont\u00eainer, garantindo um alto n\u00edvel de seguran\u00e7a. Flexibilidade : O Fargate \u00e9 compat\u00edvel com todas as ferramentas e servi\u00e7os do ecossistema do Docker, permitindo que voc\u00ea use suas ferramentas e configura\u00e7\u00f5es favoritas para criar e implantar cont\u00eaineres. Limita\u00e7\u00f5es \u00b6 Limita\u00e7\u00f5es de tamanho do cont\u00eainer : O tamanho m\u00e1ximo do cont\u00eainer \u00e9 de 4 GB. Restri\u00e7\u00f5es de recursos : O AWS Fargate tem limites de recursos, como a quantidade m\u00e1xima de vCPUs e mem\u00f3ria alocados por tarefa de cont\u00eainer. Exemplo de uso \u00b6 Aqui est\u00e1 um exemplo simples de como executar um cont\u00eainer do Docker usando o AWS Fargate no Amazon ECS: Crie um cluster do Amazon ECS. Defina sua tarefa de cont\u00eainer, que inclui informa\u00e7\u00f5es sobre a imagem do cont\u00eainer, a porta exposta e outras configura\u00e7\u00f5es. Crie um servi\u00e7o do ECS que usa o Fargate como plataforma de computa\u00e7\u00e3o. version : \"3\" services : myapp : image : mydockerimage ports : - \"80:80\" logging : driver : awslogs options : awslogs-group : \"my-logs-group\" awslogs-region : \"us-east-1\" cpu : 256 memory : 512 network_mode : awsvpc execution_role_arn : arn:aws:iam::25072000:role/ecsTaskExecutionRole Inicie o servi\u00e7o e o Fargate gerenciar\u00e1 a execu\u00e7\u00e3o dos cont\u00eaineres para voc\u00ea. Conclus\u00e3o \u00b6 O AWS Fargate \u00e9 uma solu\u00e7\u00e3o ideal para desenvolvedores que desejam executar cont\u00eaineres do Docker sem ter que gerenciar a infraestrutura subjacente. Ele oferece escalabilidade autom\u00e1tica, seguran\u00e7a e compatibilidade com todas as ferramentas e servi\u00e7os do ecossistema do Docker. No entanto, ele tamb\u00e9m tem algumas limita\u00e7\u00f5es, como tamanho m\u00e1ximo do cont\u00eainer e limites de recursos. Em resumo, o AWS Fargate \u00e9 uma ferramenta poderosa para desenvolvedores que procuram uma maneira simples e f\u00e1cil de executar cont\u00eaineres do Docker sem ter que lidar com a infraestrutura. Com sua escalabilidade autom\u00e1tica, gerenciamento de seguran\u00e7a e compatibilidade com o ecossistema do Docker, o Fargate \u00e9 uma solu\u00e7\u00e3o atraente para equipes de desenvolvimento que buscam aumentar a efici\u00eancia e a produtividade. Se voc\u00ea ainda n\u00e3o experimentou o AWS Fargate, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.","title":"13.1. Sobre"},{"location":"projetos/13.Fargate/#aws-fargate","text":"O AWS Fargate \u00e9 um servi\u00e7o de computa\u00e7\u00e3o sem servidor para cont\u00eaineres que permite executar cont\u00eaineres do Docker no Amazon Elastic Container Service (ECS) e no Amazon Elastic Kubernetes Service (EKS) sem a necessidade de gerenciar a infraestrutura subjacente.","title":"AWS Fargate"},{"location":"projetos/13.Fargate/#como-funciona","text":"Com o AWS Fargate, voc\u00ea pode executar cont\u00eaineres do Docker em um ambiente completamente gerenciado. Voc\u00ea s\u00f3 precisa criar um cluster do ECS ou do EKS, definir suas tarefas de cont\u00eainer e o Fargate gerenciar\u00e1 a infraestrutura subjacente necess\u00e1ria para executar essas tarefas. Isso inclui recursos como inst\u00e2ncias do Amazon EC2, escalabilidade, patching de seguran\u00e7a e muito mais.","title":"Como funciona"},{"location":"projetos/13.Fargate/#beneficios","text":"Sem infraestrutura para gerenciar : O AWS Fargate gerencia toda a infraestrutura necess\u00e1ria para executar suas tarefas de cont\u00eainer, permitindo que voc\u00ea se concentre em desenvolver seu aplicativo. Escala autom\u00e1tica : O Fargate escalona automaticamente seus cont\u00eaineres com base na demanda do aplicativo. Seguran\u00e7a : O Fargate usa inst\u00e2ncias EC2 dedicadas e isoladas para executar suas tarefas de cont\u00eainer, garantindo um alto n\u00edvel de seguran\u00e7a. Flexibilidade : O Fargate \u00e9 compat\u00edvel com todas as ferramentas e servi\u00e7os do ecossistema do Docker, permitindo que voc\u00ea use suas ferramentas e configura\u00e7\u00f5es favoritas para criar e implantar cont\u00eaineres.","title":"Benef\u00edcios"},{"location":"projetos/13.Fargate/#limitacoes","text":"Limita\u00e7\u00f5es de tamanho do cont\u00eainer : O tamanho m\u00e1ximo do cont\u00eainer \u00e9 de 4 GB. Restri\u00e7\u00f5es de recursos : O AWS Fargate tem limites de recursos, como a quantidade m\u00e1xima de vCPUs e mem\u00f3ria alocados por tarefa de cont\u00eainer.","title":"Limita\u00e7\u00f5es"},{"location":"projetos/13.Fargate/#exemplo-de-uso","text":"Aqui est\u00e1 um exemplo simples de como executar um cont\u00eainer do Docker usando o AWS Fargate no Amazon ECS: Crie um cluster do Amazon ECS. Defina sua tarefa de cont\u00eainer, que inclui informa\u00e7\u00f5es sobre a imagem do cont\u00eainer, a porta exposta e outras configura\u00e7\u00f5es. Crie um servi\u00e7o do ECS que usa o Fargate como plataforma de computa\u00e7\u00e3o. version : \"3\" services : myapp : image : mydockerimage ports : - \"80:80\" logging : driver : awslogs options : awslogs-group : \"my-logs-group\" awslogs-region : \"us-east-1\" cpu : 256 memory : 512 network_mode : awsvpc execution_role_arn : arn:aws:iam::25072000:role/ecsTaskExecutionRole Inicie o servi\u00e7o e o Fargate gerenciar\u00e1 a execu\u00e7\u00e3o dos cont\u00eaineres para voc\u00ea.","title":"Exemplo de uso"},{"location":"projetos/13.Fargate/#conclusao","text":"O AWS Fargate \u00e9 uma solu\u00e7\u00e3o ideal para desenvolvedores que desejam executar cont\u00eaineres do Docker sem ter que gerenciar a infraestrutura subjacente. Ele oferece escalabilidade autom\u00e1tica, seguran\u00e7a e compatibilidade com todas as ferramentas e servi\u00e7os do ecossistema do Docker. No entanto, ele tamb\u00e9m tem algumas limita\u00e7\u00f5es, como tamanho m\u00e1ximo do cont\u00eainer e limites de recursos. Em resumo, o AWS Fargate \u00e9 uma ferramenta poderosa para desenvolvedores que procuram uma maneira simples e f\u00e1cil de executar cont\u00eaineres do Docker sem ter que lidar com a infraestrutura. Com sua escalabilidade autom\u00e1tica, gerenciamento de seguran\u00e7a e compatibilidade com o ecossistema do Docker, o Fargate \u00e9 uma solu\u00e7\u00e3o atraente para equipes de desenvolvimento que buscam aumentar a efici\u00eancia e a produtividade. Se voc\u00ea ainda n\u00e3o experimentou o AWS Fargate, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.","title":"Conclus\u00e3o"},{"location":"projetos/14.S3/","text":"AWS S3 \u00b6 O Amazon Simple Storage Service (S3) \u00e9 um servi\u00e7o de armazenamento de objetos na nuvem projetado para armazenar e recuperar qualquer quantidade de dados de qualquer lugar da web. Como funciona \u00b6 Com o AWS S3, voc\u00ea pode armazenar e recuperar arquivos de qualquer tamanho de qualquer lugar do mundo. Voc\u00ea s\u00f3 precisa criar um bucket do S3, carregar seus arquivos e definir as configura\u00e7\u00f5es de permiss\u00f5es e seguran\u00e7a, e o S3 gerenciar\u00e1 o restante para voc\u00ea. O AWS S3 \u00e9 altamente escal\u00e1vel e dur\u00e1vel, com redund\u00e2ncia em v\u00e1rias zonas de disponibilidade. Benef\u00edcios \u00b6 Escalabilidade : O S3 \u00e9 altamente escal\u00e1vel e pode ser usado para armazenar qualquer quantidade de dados. Durabilidade : O S3 tem redund\u00e2ncia em v\u00e1rias zonas de disponibilidade, garantindo que seus dados estejam protegidos contra falhas de hardware. Seguran\u00e7a : O S3 oferece recursos de seguran\u00e7a avan\u00e7ados, como controle de acesso baseado em pol\u00edticas, criptografia e muito mais. Acessibilidade : O S3 pode ser acessado de qualquer lugar do mundo com uma conex\u00e3o \u00e0 Internet. Limita\u00e7\u00f5es \u00b6 Custo : O custo do armazenamento no S3 pode variar dependendo da quantidade de dados armazenados e dos acessos aos dados. Desempenho : O desempenho do S3 pode ser afetado por diversos fatores, como a regi\u00e3o em que o bucket est\u00e1 localizado e o tipo de acesso aos dados. Exemplo de uso \u00b6 Aqui est\u00e1 um exemplo simples de como usar o AWS S3: Crie um bucket do S3 na regi\u00e3o desejada. Carregue seus arquivos no bucket do S3. Defina as configura\u00e7\u00f5es de permiss\u00f5es e seguran\u00e7a para o bucket do S3. Acesse seus arquivos de qualquer lugar do mundo com uma conex\u00e3o \u00e0 Internet. Conclus\u00e3o \u00b6 O AWS S3 \u00e9 uma ferramenta essencial para empresas que precisam armazenar e recuperar grandes quantidades de dados de maneira segura e escal\u00e1vel. Com recursos de seguran\u00e7a avan\u00e7ados, escalabilidade e durabilidade, o S3 \u00e9 uma solu\u00e7\u00e3o atraente para empresas de todos os tamanhos. No entanto, \u00e9 importante estar ciente das limita\u00e7\u00f5es, como o custo e o desempenho, ao planejar o uso do S3. Se voc\u00ea ainda n\u00e3o experimentou o AWS S3, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.","title":"14.1. Sobre"},{"location":"projetos/14.S3/#aws-s3","text":"O Amazon Simple Storage Service (S3) \u00e9 um servi\u00e7o de armazenamento de objetos na nuvem projetado para armazenar e recuperar qualquer quantidade de dados de qualquer lugar da web.","title":"AWS S3"},{"location":"projetos/14.S3/#como-funciona","text":"Com o AWS S3, voc\u00ea pode armazenar e recuperar arquivos de qualquer tamanho de qualquer lugar do mundo. Voc\u00ea s\u00f3 precisa criar um bucket do S3, carregar seus arquivos e definir as configura\u00e7\u00f5es de permiss\u00f5es e seguran\u00e7a, e o S3 gerenciar\u00e1 o restante para voc\u00ea. O AWS S3 \u00e9 altamente escal\u00e1vel e dur\u00e1vel, com redund\u00e2ncia em v\u00e1rias zonas de disponibilidade.","title":"Como funciona"},{"location":"projetos/14.S3/#beneficios","text":"Escalabilidade : O S3 \u00e9 altamente escal\u00e1vel e pode ser usado para armazenar qualquer quantidade de dados. Durabilidade : O S3 tem redund\u00e2ncia em v\u00e1rias zonas de disponibilidade, garantindo que seus dados estejam protegidos contra falhas de hardware. Seguran\u00e7a : O S3 oferece recursos de seguran\u00e7a avan\u00e7ados, como controle de acesso baseado em pol\u00edticas, criptografia e muito mais. Acessibilidade : O S3 pode ser acessado de qualquer lugar do mundo com uma conex\u00e3o \u00e0 Internet.","title":"Benef\u00edcios"},{"location":"projetos/14.S3/#limitacoes","text":"Custo : O custo do armazenamento no S3 pode variar dependendo da quantidade de dados armazenados e dos acessos aos dados. Desempenho : O desempenho do S3 pode ser afetado por diversos fatores, como a regi\u00e3o em que o bucket est\u00e1 localizado e o tipo de acesso aos dados.","title":"Limita\u00e7\u00f5es"},{"location":"projetos/14.S3/#exemplo-de-uso","text":"Aqui est\u00e1 um exemplo simples de como usar o AWS S3: Crie um bucket do S3 na regi\u00e3o desejada. Carregue seus arquivos no bucket do S3. Defina as configura\u00e7\u00f5es de permiss\u00f5es e seguran\u00e7a para o bucket do S3. Acesse seus arquivos de qualquer lugar do mundo com uma conex\u00e3o \u00e0 Internet.","title":"Exemplo de uso"},{"location":"projetos/14.S3/#conclusao","text":"O AWS S3 \u00e9 uma ferramenta essencial para empresas que precisam armazenar e recuperar grandes quantidades de dados de maneira segura e escal\u00e1vel. Com recursos de seguran\u00e7a avan\u00e7ados, escalabilidade e durabilidade, o S3 \u00e9 uma solu\u00e7\u00e3o atraente para empresas de todos os tamanhos. No entanto, \u00e9 importante estar ciente das limita\u00e7\u00f5es, como o custo e o desempenho, ao planejar o uso do S3. Se voc\u00ea ainda n\u00e3o experimentou o AWS S3, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.","title":"Conclus\u00e3o"},{"location":"projetos/15.CloudWatch/","text":"AWS CloudWatch \u00b6 O Amazon CloudWatch \u00e9 um servi\u00e7o de monitoramento e observabilidade da AWS que permite monitorar e coletar m\u00e9tricas, logs e eventos de seus recursos e aplicativos na nuvem. Com o CloudWatch, voc\u00ea pode monitorar e analisar o desempenho de seus aplicativos, identificar e solucionar problemas e garantir a conformidade e a seguran\u00e7a. Como funciona \u00b6 O CloudWatch coleta e armazena m\u00e9tricas, logs e eventos de seus recursos e aplicativos na nuvem, como inst\u00e2ncias do Amazon EC2, grupos de autoescalabilidade, aplicativos da web e muito mais. Voc\u00ea pode usar esses dados para monitorar o desempenho de seus aplicativos, identificar problemas e solucion\u00e1-los. O CloudWatch tamb\u00e9m pode ser usado para criar alarmes que disparam a\u00e7\u00f5es automatizadas em resposta a eventos espec\u00edficos. Benef\u00edcios \u00b6 Monitoramento : O CloudWatch permite monitorar e analisar o desempenho de seus aplicativos e recursos na nuvem. Identifica\u00e7\u00e3o de problemas : Com o CloudWatch, voc\u00ea pode identificar problemas e solucion\u00e1-los antes que afetem seus usu\u00e1rios. Conformidade e seguran\u00e7a : O CloudWatch permite monitorar a conformidade e a seguran\u00e7a de seus aplicativos e recursos na nuvem. Automa\u00e7\u00e3o : O CloudWatch permite criar alarmes que disparam a\u00e7\u00f5es automatizadas em resposta a eventos espec\u00edficos. Limita\u00e7\u00f5es \u00b6 Custo : O custo do CloudWatch pode variar dependendo da quantidade de m\u00e9tricas, logs e eventos coletados. Complexidade : O CloudWatch pode ser complexo de configurar e gerenciar, especialmente para aplicativos e recursos mais complexos. Exemplo de uso \u00b6 Aqui est\u00e1 um exemplo simples de como usar o CloudWatch: Crie um grupo de autoescalabilidade do Amazon EC2. Configure o CloudWatch para coletar m\u00e9tricas, logs e eventos do grupo de autoescalabilidade. Crie um painel do CloudWatch para monitorar as m\u00e9tricas coletadas. Crie um alarme no CloudWatch que dispara uma a\u00e7\u00e3o automatizada quando um evento espec\u00edfico ocorre. Conclus\u00e3o \u00b6 O Amazon CloudWatch \u00e9 uma ferramenta essencial para empresas que precisam monitorar e analisar o desempenho de seus aplicativos e recursos na nuvem. Com recursos avan\u00e7ados de monitoramento, identifica\u00e7\u00e3o de problemas, conformidade e seguran\u00e7a, o CloudWatch \u00e9 uma solu\u00e7\u00e3o atraente para empresas de todos os tamanhos. No entanto, \u00e9 importante estar ciente das limita\u00e7\u00f5es, como o custo e a complexidade, ao planejar o uso do CloudWatch. Se voc\u00ea ainda n\u00e3o experimentou o Amazon CloudWatch, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.","title":"15.1. Sobre"},{"location":"projetos/15.CloudWatch/#aws-cloudwatch","text":"O Amazon CloudWatch \u00e9 um servi\u00e7o de monitoramento e observabilidade da AWS que permite monitorar e coletar m\u00e9tricas, logs e eventos de seus recursos e aplicativos na nuvem. Com o CloudWatch, voc\u00ea pode monitorar e analisar o desempenho de seus aplicativos, identificar e solucionar problemas e garantir a conformidade e a seguran\u00e7a.","title":"AWS CloudWatch"},{"location":"projetos/15.CloudWatch/#como-funciona","text":"O CloudWatch coleta e armazena m\u00e9tricas, logs e eventos de seus recursos e aplicativos na nuvem, como inst\u00e2ncias do Amazon EC2, grupos de autoescalabilidade, aplicativos da web e muito mais. Voc\u00ea pode usar esses dados para monitorar o desempenho de seus aplicativos, identificar problemas e solucion\u00e1-los. O CloudWatch tamb\u00e9m pode ser usado para criar alarmes que disparam a\u00e7\u00f5es automatizadas em resposta a eventos espec\u00edficos.","title":"Como funciona"},{"location":"projetos/15.CloudWatch/#beneficios","text":"Monitoramento : O CloudWatch permite monitorar e analisar o desempenho de seus aplicativos e recursos na nuvem. Identifica\u00e7\u00e3o de problemas : Com o CloudWatch, voc\u00ea pode identificar problemas e solucion\u00e1-los antes que afetem seus usu\u00e1rios. Conformidade e seguran\u00e7a : O CloudWatch permite monitorar a conformidade e a seguran\u00e7a de seus aplicativos e recursos na nuvem. Automa\u00e7\u00e3o : O CloudWatch permite criar alarmes que disparam a\u00e7\u00f5es automatizadas em resposta a eventos espec\u00edficos.","title":"Benef\u00edcios"},{"location":"projetos/15.CloudWatch/#limitacoes","text":"Custo : O custo do CloudWatch pode variar dependendo da quantidade de m\u00e9tricas, logs e eventos coletados. Complexidade : O CloudWatch pode ser complexo de configurar e gerenciar, especialmente para aplicativos e recursos mais complexos.","title":"Limita\u00e7\u00f5es"},{"location":"projetos/15.CloudWatch/#exemplo-de-uso","text":"Aqui est\u00e1 um exemplo simples de como usar o CloudWatch: Crie um grupo de autoescalabilidade do Amazon EC2. Configure o CloudWatch para coletar m\u00e9tricas, logs e eventos do grupo de autoescalabilidade. Crie um painel do CloudWatch para monitorar as m\u00e9tricas coletadas. Crie um alarme no CloudWatch que dispara uma a\u00e7\u00e3o automatizada quando um evento espec\u00edfico ocorre.","title":"Exemplo de uso"},{"location":"projetos/15.CloudWatch/#conclusao","text":"O Amazon CloudWatch \u00e9 uma ferramenta essencial para empresas que precisam monitorar e analisar o desempenho de seus aplicativos e recursos na nuvem. Com recursos avan\u00e7ados de monitoramento, identifica\u00e7\u00e3o de problemas, conformidade e seguran\u00e7a, o CloudWatch \u00e9 uma solu\u00e7\u00e3o atraente para empresas de todos os tamanhos. No entanto, \u00e9 importante estar ciente das limita\u00e7\u00f5es, como o custo e a complexidade, ao planejar o uso do CloudWatch. Se voc\u00ea ainda n\u00e3o experimentou o Amazon CloudWatch, vale a pena dar uma olhada e descobrir como ele pode ajudar a impulsionar seus aplicativos na nuvem.","title":"Conclus\u00e3o"},{"location":"projetos/2.RDS/","text":"Relational Database Service (RDS) \u00b6 O Amazon RDS (Relational Database Service) \u00e9 um servi\u00e7o de banco de dados relacional gerenciado pela Amazon Web Services (AWS). Ele oferece suporte para v\u00e1rios mecanismos de banco de dados, incluindo MySQL, PostgreSQL, Oracle e SQL Server. Vantagens do Amazon RDS \u00b6 Gerenciamento f\u00e1cil: O Amazon RDS permite gerenciar facilmente os bancos de dados relacionais na nuvem, sem precisar se preocupar com o gerenciamento de hardware e software subjacente. Escalabilidade autom\u00e1tica: O RDS da AWS facilita a escalabilidade horizontal do banco de dados, permitindo aumentar ou diminuir a capacidade do banco de dados de acordo com a demanda. Backup e recupera\u00e7\u00e3o: O Amazon RDS faz backups autom\u00e1ticos do banco de dados, permitindo a recupera\u00e7\u00e3o r\u00e1pida em caso de falha ou erro. Seguran\u00e7a: O RDS da AWS oferece recursos de seguran\u00e7a robustos, incluindo criptografia de dados em repouso e em tr\u00e2nsito, controle de acesso baseado em fun\u00e7\u00f5es e conformidade com v\u00e1rias normas de seguran\u00e7a. Mecanismos de banco de dados suportados pelo Amazon RDS \u00b6 O Amazon RDS oferece suporte para os seguintes mecanismos de banco de dados: MySQL PostgreSQL Oracle SQL Server MariaDB Pre\u00e7os do Amazon RDS \u00b6 O Amazon RDS \u00e9 oferecido em v\u00e1rios planos de pre\u00e7os, dependendo do tipo de mecanismo de banco de dados, do tamanho do banco de dados e da capacidade de computa\u00e7\u00e3o. Os pre\u00e7os variam de acordo com a regi\u00e3o da AWS em que o banco de dados \u00e9 implantado. Conclus\u00e3o \u00b6 O Amazon RDS \u00e9 uma solu\u00e7\u00e3o conveniente e confi\u00e1vel para gerenciamento de banco de dados relacional na nuvem. Com recursos avan\u00e7ados de escalabilidade, backup e seguran\u00e7a, o RDS da AWS \u00e9 uma excelente escolha para empresas que desejam uma solu\u00e7\u00e3o de banco de dados gerenciada.","title":"2.1. Sobre"},{"location":"projetos/2.RDS/#relational-database-service-rds","text":"O Amazon RDS (Relational Database Service) \u00e9 um servi\u00e7o de banco de dados relacional gerenciado pela Amazon Web Services (AWS). Ele oferece suporte para v\u00e1rios mecanismos de banco de dados, incluindo MySQL, PostgreSQL, Oracle e SQL Server.","title":"Relational Database Service (RDS)"},{"location":"projetos/2.RDS/#vantagens-do-amazon-rds","text":"Gerenciamento f\u00e1cil: O Amazon RDS permite gerenciar facilmente os bancos de dados relacionais na nuvem, sem precisar se preocupar com o gerenciamento de hardware e software subjacente. Escalabilidade autom\u00e1tica: O RDS da AWS facilita a escalabilidade horizontal do banco de dados, permitindo aumentar ou diminuir a capacidade do banco de dados de acordo com a demanda. Backup e recupera\u00e7\u00e3o: O Amazon RDS faz backups autom\u00e1ticos do banco de dados, permitindo a recupera\u00e7\u00e3o r\u00e1pida em caso de falha ou erro. Seguran\u00e7a: O RDS da AWS oferece recursos de seguran\u00e7a robustos, incluindo criptografia de dados em repouso e em tr\u00e2nsito, controle de acesso baseado em fun\u00e7\u00f5es e conformidade com v\u00e1rias normas de seguran\u00e7a.","title":"Vantagens do Amazon RDS"},{"location":"projetos/2.RDS/#mecanismos-de-banco-de-dados-suportados-pelo-amazon-rds","text":"O Amazon RDS oferece suporte para os seguintes mecanismos de banco de dados: MySQL PostgreSQL Oracle SQL Server MariaDB","title":"Mecanismos de banco de dados suportados pelo Amazon RDS"},{"location":"projetos/2.RDS/#precos-do-amazon-rds","text":"O Amazon RDS \u00e9 oferecido em v\u00e1rios planos de pre\u00e7os, dependendo do tipo de mecanismo de banco de dados, do tamanho do banco de dados e da capacidade de computa\u00e7\u00e3o. Os pre\u00e7os variam de acordo com a regi\u00e3o da AWS em que o banco de dados \u00e9 implantado.","title":"Pre\u00e7os do Amazon RDS"},{"location":"projetos/2.RDS/#conclusao","text":"O Amazon RDS \u00e9 uma solu\u00e7\u00e3o conveniente e confi\u00e1vel para gerenciamento de banco de dados relacional na nuvem. Com recursos avan\u00e7ados de escalabilidade, backup e seguran\u00e7a, o RDS da AWS \u00e9 uma excelente escolha para empresas que desejam uma solu\u00e7\u00e3o de banco de dados gerenciada.","title":"Conclus\u00e3o"},{"location":"projetos/2023-2_projeto/","text":"Escopo do Projeto: \u00b6 Implementa\u00e7\u00e3o de Arquitetura Cloud na AWS com Terraform \u00b6 Objetivo: Provisionar uma arquitetura na AWS utilizando o Terraform, que englobe o uso de um Application Load Balancer (ALB), inst\u00e2ncias EC2 com Auto Scaling e um banco de dados RDS. Atencao: A escolha da regi\u00e3o de implantacao deve ser baseada em custos e desempenho, isso deve aparecer no seu relat\u00f3rio. Rubricas do projeto para tirar C+ \u00b6 Requisitos T\u00e9cnicos do Projeto: 1. Infraestrutura como C\u00f3digo (IaC) com Terraform: Utilizar o Terraform para criar e gerenciar todos os recursos na AWS. Estruturar o c\u00f3digo Terraform utilizando m\u00f3dulos para separar responsabilidades (ex: m\u00f3dulo para EC2, m\u00f3dulo para RDS, etc.). Armazenar o estado do Terraform em um bucket S3 para o lock do estado. O script deve ser capaz de criar a infraestrutura completa sem a interven\u00e7\u00e3o manual do usu\u00e1rio (comando \u00fanico). O script deve ser capaz de destruir a infraestrutura completa sem a interven\u00e7\u00e3o manual do usu\u00e1rio (comando \u00fanico). 2. Application Load Balancer (ALB): Provisionar um ALB para distribuir o tr\u00e1fego entre as inst\u00e2ncias EC2. Configurar Target Groups para gerenciar as inst\u00e2ncias EC2. Implementar Health Checks para garantir que o tr\u00e1fego seja direcionado apenas para inst\u00e2ncias saud\u00e1veis. 3. EC2 com Auto Scaling: Criar um Launch Configuration com uma AMI que tenha a aplica\u00e7\u00e3o pr\u00e9-instalada. Provisionar um Auto Scaling Group (ASG) utilizando o Launch Configuration criado. Definir pol\u00edticas de escalabilidade baseadas em CloudWatch Alarms (ex: CPU Utilization > 70%). Garantir a integra\u00e7\u00e3o do ASG com o ALB atrav\u00e9s do Target Group. 4. Banco de Dados RDS: Provisionar uma inst\u00e2ncia RDS MySQL ou PostgreSQL com a configura\u00e7\u00e3o db.t2.micro (a menor dispon\u00edvel). Habilitar backups autom\u00e1ticos e definir uma janela de manuten\u00e7\u00e3o. Configurar Security Groups para garantir que apenas as inst\u00e2ncias EC2 possam se conectar ao RDS. Habilitar o Multi-AZ para alta disponibilidade. 5. Aplica\u00e7\u00e3o: A aplica\u00e7\u00e3o deve ser uma API RESTful ou uma aplica\u00e7\u00e3o web simples. Deve ser capaz de se conectar ao banco de dados RDS e realizar opera\u00e7\u00f5es CRUD. Implementar m\u00e9tricas e logs utilizando o CloudWatch. 6. An\u00e1lise de Custo com a Calculadora AWS: Utilizar a Calculadora de Custo da AWS para estimar os custos mensais da arquitetura proposta. Considerar os custos de todos os recursos utilizados (EC2, ALB, RDS, etc.). Elaborar um relat\u00f3rio detalhado com a previs\u00e3o de custos, destacando os principais gastos e poss\u00edveis otimiza\u00e7\u00f5es. 7. Documenta\u00e7\u00e3o: Criar uma documenta\u00e7\u00e3o t\u00e9cnica que inclua um diagrama da arquitetura AWS. Documentar todas as decis\u00f5es t\u00e9cnicas tomadas e justific\u00e1-las. Incluir um guia passo a passo para executar os scripts Terraform e validar a infraestrutura. Com estes requisitos, os alunos ter\u00e3o uma vis\u00e3o mais completa n\u00e3o apenas da implementa\u00e7\u00e3o t\u00e9cnica, mas tamb\u00e9m dos custos associados, o que \u00e9 crucial em ambientes de produ\u00e7\u00e3o reais. Rubricas do projeto para tirar B+ \u00b6 8. Analise de carga: Implementar uma analise de carga e desempenho da arquitetura. (escolher a ferramenta que julgar a mais apropriada para o seu projeto) O Locust \u00e9 uma ferramenta popular para testes de carga e desempenho, permitindo simular milhares de usu\u00e1rios simult\u00e2neos para testar a resist\u00eancia de sistemas. Existem v\u00e1rias outras ferramentas que oferecem funcionalidades semelhantes. Aqui est\u00e3o algumas das mais conhecidas: Apache JMeter: Uma das ferramentas de teste de carga mais populares e amplamente utilizadas. Interface gr\u00e1fica para configura\u00e7\u00e3o de testes. Suporta v\u00e1rios protocolos, incluindo HTTP, JDBC, FTP e mais. Extens\u00edvel atrav\u00e9s de plugins. Gatling: Ferramenta de teste de carga de c\u00f3digo aberto escrita em Scala. Focado em testes de carga para aplica\u00e7\u00f5es web. Oferece relat\u00f3rios detalhados e \u00e9 conhecido por sua alta performance. Artillery: Ferramenta moderna, leve e poderosa para testes de carga. Escrita em Node.js. Suporta testes de carga para WebSocket, Socket.io, AWS Kinesis e mais. LoadRunner: Ferramenta comercial da Micro Focus. Uma das ferramentas de teste de carga mais antigas e estabelecidas do mercado. Oferece uma ampla variedade de recursos e suporte para v\u00e1rios protocolos. Taurus: Ferramenta de automa\u00e7\u00e3o de testes de carga de c\u00f3digo aberto. Permite executar testes escritos em JMeter, Gatling, Locust, Selenium e outras ferramentas sob uma interface comum. Focado em simplificar a configura\u00e7\u00e3o e execu\u00e7\u00e3o de testes. 9. Documenta\u00e7\u00e3o: Adicionar a documenta\u00e7\u00e3o anterior a An\u00e1lise de Custo real com a utiliza\u00e7\u00e3o dos testes de carga na infraestrutura criada na AWS. Rubricas do projeto para tirar A \u00b6 10. Banco de Dados e VPN: O script (terraform) deve implementar o banco de dados na Nuvem privada do seu Kit (OpenStack) e a aplica\u00e7\u00e3o deve ser conectada a ele via VPN.","title":"**Escopo do Projeto:**"},{"location":"projetos/2023-2_projeto/#escopo-do-projeto","text":"","title":"Escopo do Projeto:"},{"location":"projetos/2023-2_projeto/#implementacao-de-arquitetura-cloud-na-aws-com-terraform","text":"Objetivo: Provisionar uma arquitetura na AWS utilizando o Terraform, que englobe o uso de um Application Load Balancer (ALB), inst\u00e2ncias EC2 com Auto Scaling e um banco de dados RDS. Atencao: A escolha da regi\u00e3o de implantacao deve ser baseada em custos e desempenho, isso deve aparecer no seu relat\u00f3rio.","title":"Implementa\u00e7\u00e3o de Arquitetura Cloud na AWS com Terraform"},{"location":"projetos/2023-2_projeto/#rubricas-do-projeto-para-tirar-c","text":"Requisitos T\u00e9cnicos do Projeto: 1. Infraestrutura como C\u00f3digo (IaC) com Terraform: Utilizar o Terraform para criar e gerenciar todos os recursos na AWS. Estruturar o c\u00f3digo Terraform utilizando m\u00f3dulos para separar responsabilidades (ex: m\u00f3dulo para EC2, m\u00f3dulo para RDS, etc.). Armazenar o estado do Terraform em um bucket S3 para o lock do estado. O script deve ser capaz de criar a infraestrutura completa sem a interven\u00e7\u00e3o manual do usu\u00e1rio (comando \u00fanico). O script deve ser capaz de destruir a infraestrutura completa sem a interven\u00e7\u00e3o manual do usu\u00e1rio (comando \u00fanico). 2. Application Load Balancer (ALB): Provisionar um ALB para distribuir o tr\u00e1fego entre as inst\u00e2ncias EC2. Configurar Target Groups para gerenciar as inst\u00e2ncias EC2. Implementar Health Checks para garantir que o tr\u00e1fego seja direcionado apenas para inst\u00e2ncias saud\u00e1veis. 3. EC2 com Auto Scaling: Criar um Launch Configuration com uma AMI que tenha a aplica\u00e7\u00e3o pr\u00e9-instalada. Provisionar um Auto Scaling Group (ASG) utilizando o Launch Configuration criado. Definir pol\u00edticas de escalabilidade baseadas em CloudWatch Alarms (ex: CPU Utilization > 70%). Garantir a integra\u00e7\u00e3o do ASG com o ALB atrav\u00e9s do Target Group. 4. Banco de Dados RDS: Provisionar uma inst\u00e2ncia RDS MySQL ou PostgreSQL com a configura\u00e7\u00e3o db.t2.micro (a menor dispon\u00edvel). Habilitar backups autom\u00e1ticos e definir uma janela de manuten\u00e7\u00e3o. Configurar Security Groups para garantir que apenas as inst\u00e2ncias EC2 possam se conectar ao RDS. Habilitar o Multi-AZ para alta disponibilidade. 5. Aplica\u00e7\u00e3o: A aplica\u00e7\u00e3o deve ser uma API RESTful ou uma aplica\u00e7\u00e3o web simples. Deve ser capaz de se conectar ao banco de dados RDS e realizar opera\u00e7\u00f5es CRUD. Implementar m\u00e9tricas e logs utilizando o CloudWatch. 6. An\u00e1lise de Custo com a Calculadora AWS: Utilizar a Calculadora de Custo da AWS para estimar os custos mensais da arquitetura proposta. Considerar os custos de todos os recursos utilizados (EC2, ALB, RDS, etc.). Elaborar um relat\u00f3rio detalhado com a previs\u00e3o de custos, destacando os principais gastos e poss\u00edveis otimiza\u00e7\u00f5es. 7. Documenta\u00e7\u00e3o: Criar uma documenta\u00e7\u00e3o t\u00e9cnica que inclua um diagrama da arquitetura AWS. Documentar todas as decis\u00f5es t\u00e9cnicas tomadas e justific\u00e1-las. Incluir um guia passo a passo para executar os scripts Terraform e validar a infraestrutura. Com estes requisitos, os alunos ter\u00e3o uma vis\u00e3o mais completa n\u00e3o apenas da implementa\u00e7\u00e3o t\u00e9cnica, mas tamb\u00e9m dos custos associados, o que \u00e9 crucial em ambientes de produ\u00e7\u00e3o reais.","title":"Rubricas do projeto para tirar C+"},{"location":"projetos/2023-2_projeto/#rubricas-do-projeto-para-tirar-b","text":"8. Analise de carga: Implementar uma analise de carga e desempenho da arquitetura. (escolher a ferramenta que julgar a mais apropriada para o seu projeto) O Locust \u00e9 uma ferramenta popular para testes de carga e desempenho, permitindo simular milhares de usu\u00e1rios simult\u00e2neos para testar a resist\u00eancia de sistemas. Existem v\u00e1rias outras ferramentas que oferecem funcionalidades semelhantes. Aqui est\u00e3o algumas das mais conhecidas: Apache JMeter: Uma das ferramentas de teste de carga mais populares e amplamente utilizadas. Interface gr\u00e1fica para configura\u00e7\u00e3o de testes. Suporta v\u00e1rios protocolos, incluindo HTTP, JDBC, FTP e mais. Extens\u00edvel atrav\u00e9s de plugins. Gatling: Ferramenta de teste de carga de c\u00f3digo aberto escrita em Scala. Focado em testes de carga para aplica\u00e7\u00f5es web. Oferece relat\u00f3rios detalhados e \u00e9 conhecido por sua alta performance. Artillery: Ferramenta moderna, leve e poderosa para testes de carga. Escrita em Node.js. Suporta testes de carga para WebSocket, Socket.io, AWS Kinesis e mais. LoadRunner: Ferramenta comercial da Micro Focus. Uma das ferramentas de teste de carga mais antigas e estabelecidas do mercado. Oferece uma ampla variedade de recursos e suporte para v\u00e1rios protocolos. Taurus: Ferramenta de automa\u00e7\u00e3o de testes de carga de c\u00f3digo aberto. Permite executar testes escritos em JMeter, Gatling, Locust, Selenium e outras ferramentas sob uma interface comum. Focado em simplificar a configura\u00e7\u00e3o e execu\u00e7\u00e3o de testes. 9. Documenta\u00e7\u00e3o: Adicionar a documenta\u00e7\u00e3o anterior a An\u00e1lise de Custo real com a utiliza\u00e7\u00e3o dos testes de carga na infraestrutura criada na AWS.","title":"Rubricas do projeto para tirar B+"},{"location":"projetos/2023-2_projeto/#rubricas-do-projeto-para-tirar-a","text":"10. Banco de Dados e VPN: O script (terraform) deve implementar o banco de dados na Nuvem privada do seu Kit (OpenStack) e a aplica\u00e7\u00e3o deve ser conectada a ele via VPN.","title":"Rubricas do projeto para tirar A"},{"location":"projetos/3.EC2/","text":"EC2 - Elastic Compute Cloud \u00b6 O Amazon Elastic Compute Cloud (EC2) \u00e9 um servi\u00e7o da AWS que fornece capacidade de computa\u00e7\u00e3o escal\u00e1vel na nuvem. \u00c9 um dos servi\u00e7os mais populares da AWS, permitindo que os usu\u00e1rios criem e gerenciem inst\u00e2ncias de servidores virtuais na nuvem. Caracter\u00edsticas do EC2 \u00b6 O EC2 oferece as seguintes caracter\u00edsticas: Escalabilidade : O EC2 permite que os usu\u00e1rios aumentem ou diminuam a capacidade de computa\u00e7\u00e3o conforme necess\u00e1rio, sem a necessidade de investir em hardware adicional. Flexibilidade : Os usu\u00e1rios podem escolher entre diferentes tipos de inst\u00e2ncias de acordo com suas necessidades de processamento, armazenamento e mem\u00f3ria. Seguran\u00e7a : O EC2 oferece v\u00e1rios recursos de seguran\u00e7a, incluindo criptografia de dados em tr\u00e2nsito e em repouso, gerenciamento de chaves e controle de acesso. Gerenciamento f\u00e1cil: O EC2 \u00e9 f\u00e1cil de usar e gerenciar, com recursos como o console da AWS, APIs e ferramentas de linha de comando. Como funciona o EC2 \u00b6 O EC2 funciona da seguinte maneira: Os usu\u00e1rios criam uma ou mais inst\u00e2ncias de servidor virtual. Eles selecionam um tipo de inst\u00e2ncia com base em suas necessidades de processamento, mem\u00f3ria e armazenamento. Eles podem configurar o sistema operacional, o armazenamento, a rede e outros recursos da inst\u00e2ncia. Eles iniciam a inst\u00e2ncia e se conectam a ela usando um cliente SSH ou uma conex\u00e3o de \u00e1rea de trabalho remota. Eles podem instalar aplicativos e servi\u00e7os na inst\u00e2ncia e us\u00e1-la como um servidor ou como parte de uma arquitetura de aplicativo distribu\u00eddo. Pre\u00e7os do EC2 \u00b6 Os pre\u00e7os do EC2 s\u00e3o baseados no tipo de inst\u00e2ncia, na regi\u00e3o em que ela \u00e9 executada e na quantidade de tempo em que a inst\u00e2ncia \u00e9 executada. Os usu\u00e1rios podem escolher entre modelos de pagamento sob demanda, onde eles pagam por hora de uso, ou modelos de inst\u00e2ncia reservada, onde eles fazem um compromisso a longo prazo e recebem um desconto significativo nos pre\u00e7os de inst\u00e2ncia. Conclus\u00e3o \u00b6 O EC2 \u00e9 um servi\u00e7o poderoso e flex\u00edvel da AWS que permite que os usu\u00e1rios criem e gerenciem facilmente inst\u00e2ncias de servidor virtual na nuvem. Com recursos de seguran\u00e7a, escalabilidade e flexibilidade, o EC2 \u00e9 uma escolha popular para empresas de todos os tamanhos que desejam aproveitar os benef\u00edcios da nuvem.","title":"3.1. Sobre"},{"location":"projetos/3.EC2/#ec2-elastic-compute-cloud","text":"O Amazon Elastic Compute Cloud (EC2) \u00e9 um servi\u00e7o da AWS que fornece capacidade de computa\u00e7\u00e3o escal\u00e1vel na nuvem. \u00c9 um dos servi\u00e7os mais populares da AWS, permitindo que os usu\u00e1rios criem e gerenciem inst\u00e2ncias de servidores virtuais na nuvem.","title":"EC2 - Elastic Compute Cloud"},{"location":"projetos/3.EC2/#caracteristicas-do-ec2","text":"O EC2 oferece as seguintes caracter\u00edsticas: Escalabilidade : O EC2 permite que os usu\u00e1rios aumentem ou diminuam a capacidade de computa\u00e7\u00e3o conforme necess\u00e1rio, sem a necessidade de investir em hardware adicional. Flexibilidade : Os usu\u00e1rios podem escolher entre diferentes tipos de inst\u00e2ncias de acordo com suas necessidades de processamento, armazenamento e mem\u00f3ria. Seguran\u00e7a : O EC2 oferece v\u00e1rios recursos de seguran\u00e7a, incluindo criptografia de dados em tr\u00e2nsito e em repouso, gerenciamento de chaves e controle de acesso. Gerenciamento f\u00e1cil: O EC2 \u00e9 f\u00e1cil de usar e gerenciar, com recursos como o console da AWS, APIs e ferramentas de linha de comando.","title":"Caracter\u00edsticas do EC2"},{"location":"projetos/3.EC2/#como-funciona-o-ec2","text":"O EC2 funciona da seguinte maneira: Os usu\u00e1rios criam uma ou mais inst\u00e2ncias de servidor virtual. Eles selecionam um tipo de inst\u00e2ncia com base em suas necessidades de processamento, mem\u00f3ria e armazenamento. Eles podem configurar o sistema operacional, o armazenamento, a rede e outros recursos da inst\u00e2ncia. Eles iniciam a inst\u00e2ncia e se conectam a ela usando um cliente SSH ou uma conex\u00e3o de \u00e1rea de trabalho remota. Eles podem instalar aplicativos e servi\u00e7os na inst\u00e2ncia e us\u00e1-la como um servidor ou como parte de uma arquitetura de aplicativo distribu\u00eddo.","title":"Como funciona o EC2"},{"location":"projetos/3.EC2/#precos-do-ec2","text":"Os pre\u00e7os do EC2 s\u00e3o baseados no tipo de inst\u00e2ncia, na regi\u00e3o em que ela \u00e9 executada e na quantidade de tempo em que a inst\u00e2ncia \u00e9 executada. Os usu\u00e1rios podem escolher entre modelos de pagamento sob demanda, onde eles pagam por hora de uso, ou modelos de inst\u00e2ncia reservada, onde eles fazem um compromisso a longo prazo e recebem um desconto significativo nos pre\u00e7os de inst\u00e2ncia.","title":"Pre\u00e7os do EC2"},{"location":"projetos/3.EC2/#conclusao","text":"O EC2 \u00e9 um servi\u00e7o poderoso e flex\u00edvel da AWS que permite que os usu\u00e1rios criem e gerenciem facilmente inst\u00e2ncias de servidor virtual na nuvem. Com recursos de seguran\u00e7a, escalabilidade e flexibilidade, o EC2 \u00e9 uma escolha popular para empresas de todos os tamanhos que desejam aproveitar os benef\u00edcios da nuvem.","title":"Conclus\u00e3o"},{"location":"projetos/4.Auto_Scaling/","text":"Auto Scaling na AWS \u00b6 O Auto Scaling \u00e9 um recurso da Amazon Web Services (AWS) que permite dimensionar automaticamente os recursos da sua aplica\u00e7\u00e3o de acordo com a demanda do usu\u00e1rio. Com o Auto Scaling, voc\u00ea pode manter o desempenho da aplica\u00e7\u00e3o, economizar custos e garantir que seus usu\u00e1rios recebam a melhor experi\u00eancia poss\u00edvel. Como funciona o Auto Scaling? \u00b6 O Auto Scaling monitora as m\u00e9tricas de utiliza\u00e7\u00e3o dos recursos da sua aplica\u00e7\u00e3o, como CPU, mem\u00f3ria e tr\u00e1fego de rede. Com base nessas m\u00e9tricas, ele pode aumentar ou diminuir automaticamente o n\u00famero de inst\u00e2ncias de recursos da sua aplica\u00e7\u00e3o. Por exemplo, se a demanda do usu\u00e1rio aumentar, o Auto Scaling pode adicionar mais inst\u00e2ncias para lidar com o aumento de tr\u00e1fego. Quando a demanda diminuir, o Auto Scaling pode reduzir o n\u00famero de inst\u00e2ncias para economizar custos. O Auto Scaling tamb\u00e9m permite definir pol\u00edticas de escalonamento personalizadas com base em suas necessidades espec\u00edficas. Voc\u00ea pode definir uma pol\u00edtica de escalonamento para aumentar as inst\u00e2ncias quando a utiliza\u00e7\u00e3o da CPU atingir um determinado n\u00edvel ou para diminuir as inst\u00e2ncias quando a utiliza\u00e7\u00e3o da mem\u00f3ria estiver abaixo de um determinado n\u00edvel. Benef\u00edcios do Auto Scaling \u00b6 Existem v\u00e1rios benef\u00edcios em usar o Auto Scaling na AWS, incluindo: Maior disponibilidade : o Auto Scaling ajuda a garantir que sua aplica\u00e7\u00e3o esteja sempre dispon\u00edvel, mesmo em momentos de pico de tr\u00e1fego. Economia de custos : o Auto Scaling permite que voc\u00ea aumente ou diminua automaticamente o n\u00famero de inst\u00e2ncias de recursos da sua aplica\u00e7\u00e3o com base na demanda do usu\u00e1rio, o que pode ajudar a economizar custos de infraestrutura. Melhor desempenho : o Auto Scaling pode ajudar a manter o desempenho da sua aplica\u00e7\u00e3o, garantindo que haja sempre recursos suficientes para lidar com a demanda do usu\u00e1rio. Conclus\u00e3o \u00b6 O Auto Scaling \u00e9 uma ferramenta essencial para garantir a escalabilidade, disponibilidade e desempenho da sua aplica\u00e7\u00e3o na AWS. Com o Auto Scaling, voc\u00ea pode automatizar o processo de escalonamento dos recursos da sua aplica\u00e7\u00e3o, economizar custos e garantir a melhor experi\u00eancia poss\u00edvel para seus usu\u00e1rios.","title":"4.1. Sobre"},{"location":"projetos/4.Auto_Scaling/#auto-scaling-na-aws","text":"O Auto Scaling \u00e9 um recurso da Amazon Web Services (AWS) que permite dimensionar automaticamente os recursos da sua aplica\u00e7\u00e3o de acordo com a demanda do usu\u00e1rio. Com o Auto Scaling, voc\u00ea pode manter o desempenho da aplica\u00e7\u00e3o, economizar custos e garantir que seus usu\u00e1rios recebam a melhor experi\u00eancia poss\u00edvel.","title":"Auto Scaling na AWS"},{"location":"projetos/4.Auto_Scaling/#como-funciona-o-auto-scaling","text":"O Auto Scaling monitora as m\u00e9tricas de utiliza\u00e7\u00e3o dos recursos da sua aplica\u00e7\u00e3o, como CPU, mem\u00f3ria e tr\u00e1fego de rede. Com base nessas m\u00e9tricas, ele pode aumentar ou diminuir automaticamente o n\u00famero de inst\u00e2ncias de recursos da sua aplica\u00e7\u00e3o. Por exemplo, se a demanda do usu\u00e1rio aumentar, o Auto Scaling pode adicionar mais inst\u00e2ncias para lidar com o aumento de tr\u00e1fego. Quando a demanda diminuir, o Auto Scaling pode reduzir o n\u00famero de inst\u00e2ncias para economizar custos. O Auto Scaling tamb\u00e9m permite definir pol\u00edticas de escalonamento personalizadas com base em suas necessidades espec\u00edficas. Voc\u00ea pode definir uma pol\u00edtica de escalonamento para aumentar as inst\u00e2ncias quando a utiliza\u00e7\u00e3o da CPU atingir um determinado n\u00edvel ou para diminuir as inst\u00e2ncias quando a utiliza\u00e7\u00e3o da mem\u00f3ria estiver abaixo de um determinado n\u00edvel.","title":"Como funciona o Auto Scaling?"},{"location":"projetos/4.Auto_Scaling/#beneficios-do-auto-scaling","text":"Existem v\u00e1rios benef\u00edcios em usar o Auto Scaling na AWS, incluindo: Maior disponibilidade : o Auto Scaling ajuda a garantir que sua aplica\u00e7\u00e3o esteja sempre dispon\u00edvel, mesmo em momentos de pico de tr\u00e1fego. Economia de custos : o Auto Scaling permite que voc\u00ea aumente ou diminua automaticamente o n\u00famero de inst\u00e2ncias de recursos da sua aplica\u00e7\u00e3o com base na demanda do usu\u00e1rio, o que pode ajudar a economizar custos de infraestrutura. Melhor desempenho : o Auto Scaling pode ajudar a manter o desempenho da sua aplica\u00e7\u00e3o, garantindo que haja sempre recursos suficientes para lidar com a demanda do usu\u00e1rio.","title":"Benef\u00edcios do Auto Scaling"},{"location":"projetos/4.Auto_Scaling/#conclusao","text":"O Auto Scaling \u00e9 uma ferramenta essencial para garantir a escalabilidade, disponibilidade e desempenho da sua aplica\u00e7\u00e3o na AWS. Com o Auto Scaling, voc\u00ea pode automatizar o processo de escalonamento dos recursos da sua aplica\u00e7\u00e3o, economizar custos e garantir a melhor experi\u00eancia poss\u00edvel para seus usu\u00e1rios.","title":"Conclus\u00e3o"},{"location":"projetos/5.VPC/","text":"Servi\u00e7o de VPC na AWS \u00b6 O Amazon Virtual Private Cloud (VPC) \u00e9 um servi\u00e7o que permite que voc\u00ea crie uma rede virtual isolada na nuvem da AWS. Com o VPC, voc\u00ea pode personalizar a sua pr\u00f3pria rede virtual em termos de sub-redes, roteamento e gateways de internet, e conectar a sua rede local ao seu ambiente de nuvem da AWS. Caracter\u00edsticas do VPC \u00b6 Algumas das principais caracter\u00edsticas do VPC s\u00e3o: Isolamento : O VPC permite que voc\u00ea crie uma rede isolada na nuvem da AWS, onde voc\u00ea pode executar recursos sem o risco de interfer\u00eancia de outras redes na nuvem. Personaliza\u00e7\u00e3o : Com o VPC, voc\u00ea pode personalizar a sua rede virtual de acordo com as suas necessidades, criando sub-redes p\u00fablicas e privadas, definindo as suas pr\u00f3prias tabelas de roteamento e configurando gateways de internet. Seguran\u00e7a : O VPC oferece recursos de seguran\u00e7a avan\u00e7ados, incluindo grupos de seguran\u00e7a e listas de controle de acesso (ACLs), para controlar o acesso aos recursos na sua rede. Conectividade : O VPC permite que voc\u00ea conecte a sua rede local ao ambiente de nuvem da AWS por meio de uma conex\u00e3o VPN ou uma conex\u00e3o direta. Componentes do VPC \u00b6 O VPC \u00e9 composto por v\u00e1rios componentes, incluindo: Sub-redes : As sub-redes s\u00e3o segmentos da rede que permitem que voc\u00ea agrupe recursos com base em suas funcionalidades e requisitos de seguran\u00e7a. Voc\u00ea pode criar sub-redes p\u00fablicas ou privadas e definir as suas pr\u00f3prias faixas de endere\u00e7os IP. Tabelas de roteamento : As tabelas de roteamento s\u00e3o usadas para determinar como o tr\u00e1fego \u00e9 encaminhado entre as sub-redes e para a internet. Voc\u00ea pode criar tabelas de roteamento personalizadas para cada sub-rede ou usar as tabelas de roteamento padr\u00e3o. Gateways de internet : Os gateways de internet s\u00e3o usados para permitir que o tr\u00e1fego da internet chegue \u00e0s sub-redes p\u00fablicas do VPC. Voc\u00ea pode criar e anexar um gateway de internet a uma sub-rede p\u00fablica para permitir o acesso \u00e0 internet. Grupos de seguran\u00e7a : Os grupos de seguran\u00e7a s\u00e3o usados para controlar o tr\u00e1fego de entrada e sa\u00edda para inst\u00e2ncias do Amazon EC2 na sua rede. Voc\u00ea pode criar grupos de seguran\u00e7a personalizados e especificar as regras de acesso para cada grupo. Listas de controle de acesso : As listas de controle de acesso (ACLs) s\u00e3o usadas para controlar o tr\u00e1fego de entrada e sa\u00edda para as sub-redes do VPC. Voc\u00ea pode criar ACLs personalizadas e especificar as regras de acesso para cada ACL. Conclus\u00e3o \u00b6 O Amazon Virtual Private Cloud (VPC) \u00e9 um servi\u00e7o essencial para aqueles que desejam criar e personalizar a sua pr\u00f3pria rede virtual na nuvem da AWS. Com o VPC, voc\u00ea pode criar uma rede isolada e segura, definir as suas pr\u00f3prias sub-redes e tabelas de roteamento, configurar gateways de internet e controlar o acesso aos recursos na sua rede. Compreender os componentes do VPC \u00e9 fundamental para criar uma rede virtual eficaz e segura na nuvem da AWS. Ao utilizar o VPC, voc\u00ea pode garantir que a sua rede esteja configurada corretamente para atender \u00e0s necessidades da sua empresa, al\u00e9m de garantir a seguran\u00e7a e a privacidade dos dados e dos recursos na nuvem da AWS. Al\u00e9m disso, o VPC pode ser integrado com outros servi\u00e7os da AWS, como o Amazon EC2, o Amazon RDS e o Amazon S3, para criar solu\u00e7\u00f5es avan\u00e7adas e escal\u00e1veis na nuvem. Com a sua flexibilidade e escalabilidade, o VPC \u00e9 uma ferramenta poderosa para aqueles que desejam aproveitar ao m\u00e1ximo a nuvem da AWS. Resumo do resumo \u00b6 Em resumo, o Amazon Virtual Private Cloud (VPC) \u00e9 um servi\u00e7o fundamental para criar uma rede virtual isolada e personalizada na nuvem da AWS. Com o VPC, voc\u00ea pode personalizar a sua rede virtual de acordo com as suas necessidades, controlar o acesso aos recursos e integr\u00e1-lo com outros servi\u00e7os da AWS para criar solu\u00e7\u00f5es avan\u00e7adas e escal\u00e1veis.","title":"5.1. Sobre"},{"location":"projetos/5.VPC/#servico-de-vpc-na-aws","text":"O Amazon Virtual Private Cloud (VPC) \u00e9 um servi\u00e7o que permite que voc\u00ea crie uma rede virtual isolada na nuvem da AWS. Com o VPC, voc\u00ea pode personalizar a sua pr\u00f3pria rede virtual em termos de sub-redes, roteamento e gateways de internet, e conectar a sua rede local ao seu ambiente de nuvem da AWS.","title":"Servi\u00e7o de VPC na AWS"},{"location":"projetos/5.VPC/#caracteristicas-do-vpc","text":"Algumas das principais caracter\u00edsticas do VPC s\u00e3o: Isolamento : O VPC permite que voc\u00ea crie uma rede isolada na nuvem da AWS, onde voc\u00ea pode executar recursos sem o risco de interfer\u00eancia de outras redes na nuvem. Personaliza\u00e7\u00e3o : Com o VPC, voc\u00ea pode personalizar a sua rede virtual de acordo com as suas necessidades, criando sub-redes p\u00fablicas e privadas, definindo as suas pr\u00f3prias tabelas de roteamento e configurando gateways de internet. Seguran\u00e7a : O VPC oferece recursos de seguran\u00e7a avan\u00e7ados, incluindo grupos de seguran\u00e7a e listas de controle de acesso (ACLs), para controlar o acesso aos recursos na sua rede. Conectividade : O VPC permite que voc\u00ea conecte a sua rede local ao ambiente de nuvem da AWS por meio de uma conex\u00e3o VPN ou uma conex\u00e3o direta.","title":"Caracter\u00edsticas do VPC"},{"location":"projetos/5.VPC/#componentes-do-vpc","text":"O VPC \u00e9 composto por v\u00e1rios componentes, incluindo: Sub-redes : As sub-redes s\u00e3o segmentos da rede que permitem que voc\u00ea agrupe recursos com base em suas funcionalidades e requisitos de seguran\u00e7a. Voc\u00ea pode criar sub-redes p\u00fablicas ou privadas e definir as suas pr\u00f3prias faixas de endere\u00e7os IP. Tabelas de roteamento : As tabelas de roteamento s\u00e3o usadas para determinar como o tr\u00e1fego \u00e9 encaminhado entre as sub-redes e para a internet. Voc\u00ea pode criar tabelas de roteamento personalizadas para cada sub-rede ou usar as tabelas de roteamento padr\u00e3o. Gateways de internet : Os gateways de internet s\u00e3o usados para permitir que o tr\u00e1fego da internet chegue \u00e0s sub-redes p\u00fablicas do VPC. Voc\u00ea pode criar e anexar um gateway de internet a uma sub-rede p\u00fablica para permitir o acesso \u00e0 internet. Grupos de seguran\u00e7a : Os grupos de seguran\u00e7a s\u00e3o usados para controlar o tr\u00e1fego de entrada e sa\u00edda para inst\u00e2ncias do Amazon EC2 na sua rede. Voc\u00ea pode criar grupos de seguran\u00e7a personalizados e especificar as regras de acesso para cada grupo. Listas de controle de acesso : As listas de controle de acesso (ACLs) s\u00e3o usadas para controlar o tr\u00e1fego de entrada e sa\u00edda para as sub-redes do VPC. Voc\u00ea pode criar ACLs personalizadas e especificar as regras de acesso para cada ACL.","title":"Componentes do VPC"},{"location":"projetos/5.VPC/#conclusao","text":"O Amazon Virtual Private Cloud (VPC) \u00e9 um servi\u00e7o essencial para aqueles que desejam criar e personalizar a sua pr\u00f3pria rede virtual na nuvem da AWS. Com o VPC, voc\u00ea pode criar uma rede isolada e segura, definir as suas pr\u00f3prias sub-redes e tabelas de roteamento, configurar gateways de internet e controlar o acesso aos recursos na sua rede. Compreender os componentes do VPC \u00e9 fundamental para criar uma rede virtual eficaz e segura na nuvem da AWS. Ao utilizar o VPC, voc\u00ea pode garantir que a sua rede esteja configurada corretamente para atender \u00e0s necessidades da sua empresa, al\u00e9m de garantir a seguran\u00e7a e a privacidade dos dados e dos recursos na nuvem da AWS. Al\u00e9m disso, o VPC pode ser integrado com outros servi\u00e7os da AWS, como o Amazon EC2, o Amazon RDS e o Amazon S3, para criar solu\u00e7\u00f5es avan\u00e7adas e escal\u00e1veis na nuvem. Com a sua flexibilidade e escalabilidade, o VPC \u00e9 uma ferramenta poderosa para aqueles que desejam aproveitar ao m\u00e1ximo a nuvem da AWS.","title":"Conclus\u00e3o"},{"location":"projetos/5.VPC/#resumo-do-resumo","text":"Em resumo, o Amazon Virtual Private Cloud (VPC) \u00e9 um servi\u00e7o fundamental para criar uma rede virtual isolada e personalizada na nuvem da AWS. Com o VPC, voc\u00ea pode personalizar a sua rede virtual de acordo com as suas necessidades, controlar o acesso aos recursos e integr\u00e1-lo com outros servi\u00e7os da AWS para criar solu\u00e7\u00f5es avan\u00e7adas e escal\u00e1veis.","title":"Resumo do resumo"},{"location":"projetos/6.Elastic_BeanStalk/","text":"Elastic BeanStalk \u00b6 O Elastic Beanstalk \u00e9 um servi\u00e7o da AWS que facilita a implanta\u00e7\u00e3o e a escalabilidade de aplicativos da web. O servi\u00e7o \u00e9 projetado para lidar com toda a complexidade da implanta\u00e7\u00e3o de aplicativos, incluindo a configura\u00e7\u00e3o de recursos de infraestrutura e o provisionamento de capacidade. Caracter\u00edsticas do Elastic Beanstalk \u00b6 Algumas das principais caracter\u00edsticas do Elastic Beanstalk s\u00e3o: Facilidade de uso : O Elastic Beanstalk permite que voc\u00ea implante e gerencie aplicativos da web e servi\u00e7os com facilidade, sem a necessidade de gerenciar a infraestrutura subjacente. Voc\u00ea pode usar v\u00e1rias linguagens de programa\u00e7\u00e3o, plataformas e servi\u00e7os da AWS para implantar o seu aplicativo. Autoscaling : O Elastic Beanstalk suporta o dimensionamento autom\u00e1tico, permitindo que voc\u00ea aumente ou diminua a capacidade de processamento do seu aplicativo com base na demanda do usu\u00e1rio. Integra\u00e7\u00e3o : O Elastic Beanstalk integra-se com outros servi\u00e7os da AWS, como o Amazon RDS, o Amazon S3 e o Amazon CloudWatch, para fornecer uma solu\u00e7\u00e3o completa para a implanta\u00e7\u00e3o de aplicativos. Visibilidade : O Elastic Beanstalk oferece visibilidade sobre o estado do seu aplicativo, com logs e m\u00e9tricas que ajudam a detectar e solucionar problemas rapidamente. Como funciona o Elastic Beanstalk \u00b6 O Elastic Beanstalk automatiza o processo de implanta\u00e7\u00e3o e gerenciamento de aplicativos da web e servi\u00e7os na AWS. Para usar o Elastic Beanstalk, basta seguir alguns passos simples: Crie um aplicativo : Crie um aplicativo na AWS que voc\u00ea deseja implantar usando o Elastic Beanstalk. Configure as op\u00e7\u00f5es do aplicativo : Escolha as op\u00e7\u00f5es de linguagem de programa\u00e7\u00e3o, plataforma e ambiente de tempo de execu\u00e7\u00e3o do seu aplicativo. Implante o aplicativo : Implante o aplicativo na plataforma Elastic Beanstalk e deixe que o servi\u00e7o gerencie a implanta\u00e7\u00e3o. Gerencie o aplicativo : Gerencie e monitore o estado do aplicativo por meio do console do Elastic Beanstalk ou por meio de ferramentas de linha de comando. Conclus\u00e3o \u00b6 O AWS Elastic Beanstalk \u00e9 um servi\u00e7o poderoso para aqueles que desejam implantar e gerenciar aplicativos da web e servi\u00e7os na nuvem da AWS. Com o Elastic Beanstalk, voc\u00ea pode implantar aplicativos com facilidade, escalar automaticamente a capacidade de processamento do seu aplicativo, integr\u00e1-lo com outros servi\u00e7os da AWS e obter visibilidade sobre o estado do seu aplicativo. Ao automatizar o processo de implanta\u00e7\u00e3o e gerenciamento de aplicativos, o Elastic Beanstalk permite que desenvolvedores se concentrem no desenvolvimento de aplicativos e na cria\u00e7\u00e3o de recursos de valor para os usu\u00e1rios finais. Em resumo, o AWS Elastic Beanstalk \u00e9 uma ferramenta essencial para aqueles que desejam aproveitar ao m\u00e1ximo a nuvem da AWS.","title":"6.1. Sobre"},{"location":"projetos/6.Elastic_BeanStalk/#elastic-beanstalk","text":"O Elastic Beanstalk \u00e9 um servi\u00e7o da AWS que facilita a implanta\u00e7\u00e3o e a escalabilidade de aplicativos da web. O servi\u00e7o \u00e9 projetado para lidar com toda a complexidade da implanta\u00e7\u00e3o de aplicativos, incluindo a configura\u00e7\u00e3o de recursos de infraestrutura e o provisionamento de capacidade.","title":"Elastic BeanStalk"},{"location":"projetos/6.Elastic_BeanStalk/#caracteristicas-do-elastic-beanstalk","text":"Algumas das principais caracter\u00edsticas do Elastic Beanstalk s\u00e3o: Facilidade de uso : O Elastic Beanstalk permite que voc\u00ea implante e gerencie aplicativos da web e servi\u00e7os com facilidade, sem a necessidade de gerenciar a infraestrutura subjacente. Voc\u00ea pode usar v\u00e1rias linguagens de programa\u00e7\u00e3o, plataformas e servi\u00e7os da AWS para implantar o seu aplicativo. Autoscaling : O Elastic Beanstalk suporta o dimensionamento autom\u00e1tico, permitindo que voc\u00ea aumente ou diminua a capacidade de processamento do seu aplicativo com base na demanda do usu\u00e1rio. Integra\u00e7\u00e3o : O Elastic Beanstalk integra-se com outros servi\u00e7os da AWS, como o Amazon RDS, o Amazon S3 e o Amazon CloudWatch, para fornecer uma solu\u00e7\u00e3o completa para a implanta\u00e7\u00e3o de aplicativos. Visibilidade : O Elastic Beanstalk oferece visibilidade sobre o estado do seu aplicativo, com logs e m\u00e9tricas que ajudam a detectar e solucionar problemas rapidamente.","title":"Caracter\u00edsticas do Elastic Beanstalk"},{"location":"projetos/6.Elastic_BeanStalk/#como-funciona-o-elastic-beanstalk","text":"O Elastic Beanstalk automatiza o processo de implanta\u00e7\u00e3o e gerenciamento de aplicativos da web e servi\u00e7os na AWS. Para usar o Elastic Beanstalk, basta seguir alguns passos simples: Crie um aplicativo : Crie um aplicativo na AWS que voc\u00ea deseja implantar usando o Elastic Beanstalk. Configure as op\u00e7\u00f5es do aplicativo : Escolha as op\u00e7\u00f5es de linguagem de programa\u00e7\u00e3o, plataforma e ambiente de tempo de execu\u00e7\u00e3o do seu aplicativo. Implante o aplicativo : Implante o aplicativo na plataforma Elastic Beanstalk e deixe que o servi\u00e7o gerencie a implanta\u00e7\u00e3o. Gerencie o aplicativo : Gerencie e monitore o estado do aplicativo por meio do console do Elastic Beanstalk ou por meio de ferramentas de linha de comando.","title":"Como funciona o Elastic Beanstalk"},{"location":"projetos/6.Elastic_BeanStalk/#conclusao","text":"O AWS Elastic Beanstalk \u00e9 um servi\u00e7o poderoso para aqueles que desejam implantar e gerenciar aplicativos da web e servi\u00e7os na nuvem da AWS. Com o Elastic Beanstalk, voc\u00ea pode implantar aplicativos com facilidade, escalar automaticamente a capacidade de processamento do seu aplicativo, integr\u00e1-lo com outros servi\u00e7os da AWS e obter visibilidade sobre o estado do seu aplicativo. Ao automatizar o processo de implanta\u00e7\u00e3o e gerenciamento de aplicativos, o Elastic Beanstalk permite que desenvolvedores se concentrem no desenvolvimento de aplicativos e na cria\u00e7\u00e3o de recursos de valor para os usu\u00e1rios finais. Em resumo, o AWS Elastic Beanstalk \u00e9 uma ferramenta essencial para aqueles que desejam aproveitar ao m\u00e1ximo a nuvem da AWS.","title":"Conclus\u00e3o"},{"location":"projetos/7.IAM/","text":"Servi\u00e7o AWS IAM \u00b6 O AWS Identity and Access Management (IAM) \u00e9 um servi\u00e7o que permite que voc\u00ea gerencie com seguran\u00e7a o acesso aos recursos da AWS. Com o IAM, voc\u00ea pode criar e gerenciar usu\u00e1rios e grupos, conceder e revogar permiss\u00f5es e definir pol\u00edticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS. Caracter\u00edsticas do AWS IAM \u00b6 Algumas das principais caracter\u00edsticas do AWS IAM s\u00e3o: Gerenciamento de usu\u00e1rios e grupos : O IAM permite que voc\u00ea crie e gerencie usu\u00e1rios e grupos na sua conta da AWS. Voc\u00ea pode conceder e revogar permiss\u00f5es para usu\u00e1rios individuais ou grupos de usu\u00e1rios. Pol\u00edticas de acesso : O IAM permite que voc\u00ea crie pol\u00edticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS. Voc\u00ea pode definir pol\u00edticas para usu\u00e1rios individuais, grupos de usu\u00e1rios ou para toda a sua conta da AWS. Autentica\u00e7\u00e3o de usu\u00e1rios : O IAM fornece op\u00e7\u00f5es de autentica\u00e7\u00e3o de usu\u00e1rios, incluindo autentica\u00e7\u00e3o baseada em senha e autentica\u00e7\u00e3o de dois fatores. Monitoramento de atividade de usu\u00e1rios : O IAM registra todas as atividades dos usu\u00e1rios na sua conta da AWS, permitindo que voc\u00ea monitore quem est\u00e1 acessando seus recursos e o que eles est\u00e3o fazendo. Como funciona o AWS IAM \u00b6 O AWS IAM funciona permitindo que voc\u00ea crie e gerencie usu\u00e1rios e grupos na sua conta da AWS. Voc\u00ea pode conceder e revogar permiss\u00f5es para usu\u00e1rios individuais ou grupos de usu\u00e1rios e definir pol\u00edticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS. Para usar o AWS IAM, basta seguir alguns passos simples: Crie usu\u00e1rios e grupos : Crie usu\u00e1rios e grupos na sua conta da AWS usando o console do IAM ou a API do IAM. Defina pol\u00edticas de acesso : Defina pol\u00edticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS. Voc\u00ea pode definir pol\u00edticas para usu\u00e1rios individuais, grupos de usu\u00e1rios ou para toda a sua conta da AWS. Conceda permiss\u00f5es : Conceda permiss\u00f5es para usu\u00e1rios individuais ou grupos de usu\u00e1rios para permitir que eles acessem recursos na sua conta da AWS. Monitore a atividade de usu\u00e1rios : Monitore a atividade dos usu\u00e1rios na sua conta da AWS usando o console do IAM ou o AWS CloudTrail. Conclus\u00e3o \u00b6 O AWS Identity and Access Management (IAM) \u00e9 um servi\u00e7o essencial para aqueles que desejam gerenciar com seguran\u00e7a o acesso aos recursos da AWS. Com o IAM, voc\u00ea pode criar e gerenciar usu\u00e1rios e grupos, conceder e revogar permiss\u00f5es e definir pol\u00edticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS. Ao permitir que voc\u00ea crie e gerencie usu\u00e1rios e grupos e defina pol\u00edticas de acesso, o IAM ajuda a garantir que seus recursos da AWS estejam protegidos contra acessos n\u00e3o autorizados e fornece a voc\u00ea o controle necess\u00e1rio para gerenciar sua conta da AWS com seguran\u00e7a.","title":"7.1. Sobre"},{"location":"projetos/7.IAM/#servico-aws-iam","text":"O AWS Identity and Access Management (IAM) \u00e9 um servi\u00e7o que permite que voc\u00ea gerencie com seguran\u00e7a o acesso aos recursos da AWS. Com o IAM, voc\u00ea pode criar e gerenciar usu\u00e1rios e grupos, conceder e revogar permiss\u00f5es e definir pol\u00edticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS.","title":"Servi\u00e7o AWS IAM"},{"location":"projetos/7.IAM/#caracteristicas-do-aws-iam","text":"Algumas das principais caracter\u00edsticas do AWS IAM s\u00e3o: Gerenciamento de usu\u00e1rios e grupos : O IAM permite que voc\u00ea crie e gerencie usu\u00e1rios e grupos na sua conta da AWS. Voc\u00ea pode conceder e revogar permiss\u00f5es para usu\u00e1rios individuais ou grupos de usu\u00e1rios. Pol\u00edticas de acesso : O IAM permite que voc\u00ea crie pol\u00edticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS. Voc\u00ea pode definir pol\u00edticas para usu\u00e1rios individuais, grupos de usu\u00e1rios ou para toda a sua conta da AWS. Autentica\u00e7\u00e3o de usu\u00e1rios : O IAM fornece op\u00e7\u00f5es de autentica\u00e7\u00e3o de usu\u00e1rios, incluindo autentica\u00e7\u00e3o baseada em senha e autentica\u00e7\u00e3o de dois fatores. Monitoramento de atividade de usu\u00e1rios : O IAM registra todas as atividades dos usu\u00e1rios na sua conta da AWS, permitindo que voc\u00ea monitore quem est\u00e1 acessando seus recursos e o que eles est\u00e3o fazendo.","title":"Caracter\u00edsticas do AWS IAM"},{"location":"projetos/7.IAM/#como-funciona-o-aws-iam","text":"O AWS IAM funciona permitindo que voc\u00ea crie e gerencie usu\u00e1rios e grupos na sua conta da AWS. Voc\u00ea pode conceder e revogar permiss\u00f5es para usu\u00e1rios individuais ou grupos de usu\u00e1rios e definir pol\u00edticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS. Para usar o AWS IAM, basta seguir alguns passos simples: Crie usu\u00e1rios e grupos : Crie usu\u00e1rios e grupos na sua conta da AWS usando o console do IAM ou a API do IAM. Defina pol\u00edticas de acesso : Defina pol\u00edticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS. Voc\u00ea pode definir pol\u00edticas para usu\u00e1rios individuais, grupos de usu\u00e1rios ou para toda a sua conta da AWS. Conceda permiss\u00f5es : Conceda permiss\u00f5es para usu\u00e1rios individuais ou grupos de usu\u00e1rios para permitir que eles acessem recursos na sua conta da AWS. Monitore a atividade de usu\u00e1rios : Monitore a atividade dos usu\u00e1rios na sua conta da AWS usando o console do IAM ou o AWS CloudTrail.","title":"Como funciona o AWS IAM"},{"location":"projetos/7.IAM/#conclusao","text":"O AWS Identity and Access Management (IAM) \u00e9 um servi\u00e7o essencial para aqueles que desejam gerenciar com seguran\u00e7a o acesso aos recursos da AWS. Com o IAM, voc\u00ea pode criar e gerenciar usu\u00e1rios e grupos, conceder e revogar permiss\u00f5es e definir pol\u00edticas de acesso para controlar quem pode acessar quais recursos na sua conta da AWS. Ao permitir que voc\u00ea crie e gerencie usu\u00e1rios e grupos e defina pol\u00edticas de acesso, o IAM ajuda a garantir que seus recursos da AWS estejam protegidos contra acessos n\u00e3o autorizados e fornece a voc\u00ea o controle necess\u00e1rio para gerenciar sua conta da AWS com seguran\u00e7a.","title":"Conclus\u00e3o"},{"location":"projetos/8.Pipeline/","text":"Servi\u00e7o AWS Pipeline \u00b6 O AWS Pipeline \u00e9 um servi\u00e7o gerenciado de integra\u00e7\u00e3o e entrega cont\u00ednua (CI/CD) que permite automatizar o processo de implanta\u00e7\u00e3o de software na AWS. Com o AWS Pipeline, \u00e9 poss\u00edvel criar pipelines de implanta\u00e7\u00e3o que automatizam as etapas de compila\u00e7\u00e3o, teste e implanta\u00e7\u00e3o de software. Caracter\u00edsticas do AWS Pipeline \u00b6 Algumas das principais caracter\u00edsticas do AWS Pipeline s\u00e3o: Automa\u00e7\u00e3o do processo de implanta\u00e7\u00e3o : O AWS Pipeline automatiza o processo de implanta\u00e7\u00e3o de software na AWS, permitindo que voc\u00ea crie pipelines de implanta\u00e7\u00e3o que incluem compila\u00e7\u00e3o, teste e implanta\u00e7\u00e3o. Suporte a v\u00e1rias fontes de c\u00f3digo : O AWS Pipeline oferece suporte a v\u00e1rias fontes de c\u00f3digo, incluindo reposit\u00f3rios Git, reposit\u00f3rios S3 e reposit\u00f3rios do AWS CodeCommit. Integra\u00e7\u00e3o com outros servi\u00e7os da AWS : O AWS Pipeline se integra com outros servi\u00e7os da AWS, como o AWS CodeBuild, AWS CodeDeploy e AWS CloudFormation, permitindo que voc\u00ea crie pipelines de implanta\u00e7\u00e3o mais complexos. Visualiza\u00e7\u00e3o do progresso do pipeline : O AWS Pipeline oferece uma interface visual que permite que voc\u00ea visualize o progresso do pipeline de implanta\u00e7\u00e3o e identifique rapidamente quaisquer problemas que possam ocorrer durante o processo de implanta\u00e7\u00e3o. Como funciona o AWS Pipeline \u00b6 O AWS Pipeline funciona criando pipelines de implanta\u00e7\u00e3o que automatizam as etapas de compila\u00e7\u00e3o, teste e implanta\u00e7\u00e3o de software. Para usar o AWS Pipeline, basta seguir alguns passos simples: Criar um pipeline : Crie um pipeline de implanta\u00e7\u00e3o no console do AWS Pipeline ou usando a API do AWS Pipeline. Configurar a origem do c\u00f3digo : Escolha a fonte do c\u00f3digo para o pipeline, como um reposit\u00f3rio Git ou S3. Configurar a compila\u00e7\u00e3o : Configure a compila\u00e7\u00e3o do c\u00f3digo usando o AWS CodeBuild ou outro servi\u00e7o de compila\u00e7\u00e3o. Configurar o teste : Configure o teste do c\u00f3digo usando ferramentas de teste, como o AWS CodeBuild. Configurar a implanta\u00e7\u00e3o : Configure a implanta\u00e7\u00e3o do c\u00f3digo usando o AWS CodeDeploy ou outro servi\u00e7o de implanta\u00e7\u00e3o. Executar o pipeline : Execute o pipeline de implanta\u00e7\u00e3o e monitore o progresso usando a interface visual do AWS Pipeline. Conclus\u00e3o \u00b6 O AWS Pipeline \u00e9 uma solu\u00e7\u00e3o eficiente e escal\u00e1vel para a automa\u00e7\u00e3o do processo de implanta\u00e7\u00e3o de software na AWS. Com o AWS Pipeline, \u00e9 poss\u00edvel criar pipelines de implanta\u00e7\u00e3o que automatizam as etapas de compila\u00e7\u00e3o, teste e implanta\u00e7\u00e3o de software, permitindo que voc\u00ea implante seu software com mais rapidez e seguran\u00e7a. Ao oferecer suporte a v\u00e1rias fontes de c\u00f3digo e integrar-se com outros servi\u00e7os da AWS, como o AWS CodeBuild, AWS CodeDeploy e AWS CloudFormation, o AWS Pipeline permite que voc\u00ea crie pipelines de implanta\u00e7\u00e3o mais complexos para atender \u00e0s suas necessidades espec\u00edficas de implanta\u00e7\u00e3o de software.","title":"8.1. Sobre"},{"location":"projetos/8.Pipeline/#servico-aws-pipeline","text":"O AWS Pipeline \u00e9 um servi\u00e7o gerenciado de integra\u00e7\u00e3o e entrega cont\u00ednua (CI/CD) que permite automatizar o processo de implanta\u00e7\u00e3o de software na AWS. Com o AWS Pipeline, \u00e9 poss\u00edvel criar pipelines de implanta\u00e7\u00e3o que automatizam as etapas de compila\u00e7\u00e3o, teste e implanta\u00e7\u00e3o de software.","title":"Servi\u00e7o AWS Pipeline"},{"location":"projetos/8.Pipeline/#caracteristicas-do-aws-pipeline","text":"Algumas das principais caracter\u00edsticas do AWS Pipeline s\u00e3o: Automa\u00e7\u00e3o do processo de implanta\u00e7\u00e3o : O AWS Pipeline automatiza o processo de implanta\u00e7\u00e3o de software na AWS, permitindo que voc\u00ea crie pipelines de implanta\u00e7\u00e3o que incluem compila\u00e7\u00e3o, teste e implanta\u00e7\u00e3o. Suporte a v\u00e1rias fontes de c\u00f3digo : O AWS Pipeline oferece suporte a v\u00e1rias fontes de c\u00f3digo, incluindo reposit\u00f3rios Git, reposit\u00f3rios S3 e reposit\u00f3rios do AWS CodeCommit. Integra\u00e7\u00e3o com outros servi\u00e7os da AWS : O AWS Pipeline se integra com outros servi\u00e7os da AWS, como o AWS CodeBuild, AWS CodeDeploy e AWS CloudFormation, permitindo que voc\u00ea crie pipelines de implanta\u00e7\u00e3o mais complexos. Visualiza\u00e7\u00e3o do progresso do pipeline : O AWS Pipeline oferece uma interface visual que permite que voc\u00ea visualize o progresso do pipeline de implanta\u00e7\u00e3o e identifique rapidamente quaisquer problemas que possam ocorrer durante o processo de implanta\u00e7\u00e3o.","title":"Caracter\u00edsticas do AWS Pipeline"},{"location":"projetos/8.Pipeline/#como-funciona-o-aws-pipeline","text":"O AWS Pipeline funciona criando pipelines de implanta\u00e7\u00e3o que automatizam as etapas de compila\u00e7\u00e3o, teste e implanta\u00e7\u00e3o de software. Para usar o AWS Pipeline, basta seguir alguns passos simples: Criar um pipeline : Crie um pipeline de implanta\u00e7\u00e3o no console do AWS Pipeline ou usando a API do AWS Pipeline. Configurar a origem do c\u00f3digo : Escolha a fonte do c\u00f3digo para o pipeline, como um reposit\u00f3rio Git ou S3. Configurar a compila\u00e7\u00e3o : Configure a compila\u00e7\u00e3o do c\u00f3digo usando o AWS CodeBuild ou outro servi\u00e7o de compila\u00e7\u00e3o. Configurar o teste : Configure o teste do c\u00f3digo usando ferramentas de teste, como o AWS CodeBuild. Configurar a implanta\u00e7\u00e3o : Configure a implanta\u00e7\u00e3o do c\u00f3digo usando o AWS CodeDeploy ou outro servi\u00e7o de implanta\u00e7\u00e3o. Executar o pipeline : Execute o pipeline de implanta\u00e7\u00e3o e monitore o progresso usando a interface visual do AWS Pipeline.","title":"Como funciona o AWS Pipeline"},{"location":"projetos/8.Pipeline/#conclusao","text":"O AWS Pipeline \u00e9 uma solu\u00e7\u00e3o eficiente e escal\u00e1vel para a automa\u00e7\u00e3o do processo de implanta\u00e7\u00e3o de software na AWS. Com o AWS Pipeline, \u00e9 poss\u00edvel criar pipelines de implanta\u00e7\u00e3o que automatizam as etapas de compila\u00e7\u00e3o, teste e implanta\u00e7\u00e3o de software, permitindo que voc\u00ea implante seu software com mais rapidez e seguran\u00e7a. Ao oferecer suporte a v\u00e1rias fontes de c\u00f3digo e integrar-se com outros servi\u00e7os da AWS, como o AWS CodeBuild, AWS CodeDeploy e AWS CloudFormation, o AWS Pipeline permite que voc\u00ea crie pipelines de implanta\u00e7\u00e3o mais complexos para atender \u00e0s suas necessidades espec\u00edficas de implanta\u00e7\u00e3o de software.","title":"Conclus\u00e3o"},{"location":"projetos/9.ECS/","text":"Servi\u00e7o AWS ECS \u00b6 O Amazon Elastic Container Service (ECS) \u00e9 um servi\u00e7o gerenciado que permite executar aplicativos em cont\u00eaineres na nuvem da AWS. Ele ajuda a implantar e gerenciar aplicativos em cont\u00eaineres com facilidade e seguran\u00e7a, usando um ambiente escal\u00e1vel e flex\u00edvel. Caracter\u00edsticas do AWS ECS \u00b6 Algumas das principais caracter\u00edsticas do AWS ECS s\u00e3o: Gerenciamento de cont\u00eaineres escal\u00e1vel : O ECS \u00e9 um servi\u00e7o altamente escal\u00e1vel que permite executar milhares de cont\u00eaineres em uma \u00fanica inst\u00e2ncia. Alta disponibilidade : O ECS \u00e9 projetado para oferecer alta disponibilidade, reduzindo a possibilidade de interrup\u00e7\u00f5es de servi\u00e7o. Integra\u00e7\u00e3o com outros servi\u00e7os da AWS : O ECS \u00e9 integrado com outros servi\u00e7os da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC. Suporte a v\u00e1rios tipos de cont\u00eaineres : O ECS oferece suporte a v\u00e1rios tipos de cont\u00eaineres, incluindo Docker e containerd. Como funciona o AWS ECS \u00b6 O AWS ECS \u00e9 composto de v\u00e1rios componentes, incluindo clusters, servi\u00e7os e tarefas. O ECS usa o Amazon EC2 para executar cont\u00eaineres em inst\u00e2ncias EC2, ou o AWS Fargate para executar cont\u00eaineres sem precisar gerenciar inst\u00e2ncias EC2. Para usar o AWS ECS, siga estes passos simples: Crie um cluster : Crie um cluster ECS para executar seus aplicativos em cont\u00eaineres. Os clusters s\u00e3o criados usando o console do ECS ou a API do ECS. Defina tarefas : Crie uma ou mais tarefas que descrevam como executar um ou mais cont\u00eaineres. Crie servi\u00e7os : Crie um ou mais servi\u00e7os que usem as tarefas definidas para gerenciar a execu\u00e7\u00e3o de cont\u00eaineres. Inicie a execu\u00e7\u00e3o : Inicie a execu\u00e7\u00e3o de seus servi\u00e7os para implantar seus aplicativos em cont\u00eaineres. Gerencie os servi\u00e7os : Gerencie os servi\u00e7os implantados para garantir que eles estejam sempre em execu\u00e7\u00e3o e dispon\u00edveis. Conclus\u00e3o \u00b6 O Amazon Elastic Container Service (ECS) \u00e9 uma plataforma eficiente para executar e gerenciar aplicativos em cont\u00eaineres na nuvem da AWS. Com sua alta escalabilidade e flexibilidade, o ECS \u00e9 uma solu\u00e7\u00e3o ideal para empresas que buscam uma forma segura e confi\u00e1vel de executar aplicativos em cont\u00eaineres. Ao integrar-se com outros servi\u00e7os da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC, o ECS permite que voc\u00ea crie uma infraestrutura de aplicativos em cont\u00eaineres altamente personalizada que atenda \u00e0s suas necessidades espec\u00edficas.","title":"9.1. Sobre"},{"location":"projetos/9.ECS/#servico-aws-ecs","text":"O Amazon Elastic Container Service (ECS) \u00e9 um servi\u00e7o gerenciado que permite executar aplicativos em cont\u00eaineres na nuvem da AWS. Ele ajuda a implantar e gerenciar aplicativos em cont\u00eaineres com facilidade e seguran\u00e7a, usando um ambiente escal\u00e1vel e flex\u00edvel.","title":"Servi\u00e7o AWS ECS"},{"location":"projetos/9.ECS/#caracteristicas-do-aws-ecs","text":"Algumas das principais caracter\u00edsticas do AWS ECS s\u00e3o: Gerenciamento de cont\u00eaineres escal\u00e1vel : O ECS \u00e9 um servi\u00e7o altamente escal\u00e1vel que permite executar milhares de cont\u00eaineres em uma \u00fanica inst\u00e2ncia. Alta disponibilidade : O ECS \u00e9 projetado para oferecer alta disponibilidade, reduzindo a possibilidade de interrup\u00e7\u00f5es de servi\u00e7o. Integra\u00e7\u00e3o com outros servi\u00e7os da AWS : O ECS \u00e9 integrado com outros servi\u00e7os da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC. Suporte a v\u00e1rios tipos de cont\u00eaineres : O ECS oferece suporte a v\u00e1rios tipos de cont\u00eaineres, incluindo Docker e containerd.","title":"Caracter\u00edsticas do AWS ECS"},{"location":"projetos/9.ECS/#como-funciona-o-aws-ecs","text":"O AWS ECS \u00e9 composto de v\u00e1rios componentes, incluindo clusters, servi\u00e7os e tarefas. O ECS usa o Amazon EC2 para executar cont\u00eaineres em inst\u00e2ncias EC2, ou o AWS Fargate para executar cont\u00eaineres sem precisar gerenciar inst\u00e2ncias EC2. Para usar o AWS ECS, siga estes passos simples: Crie um cluster : Crie um cluster ECS para executar seus aplicativos em cont\u00eaineres. Os clusters s\u00e3o criados usando o console do ECS ou a API do ECS. Defina tarefas : Crie uma ou mais tarefas que descrevam como executar um ou mais cont\u00eaineres. Crie servi\u00e7os : Crie um ou mais servi\u00e7os que usem as tarefas definidas para gerenciar a execu\u00e7\u00e3o de cont\u00eaineres. Inicie a execu\u00e7\u00e3o : Inicie a execu\u00e7\u00e3o de seus servi\u00e7os para implantar seus aplicativos em cont\u00eaineres. Gerencie os servi\u00e7os : Gerencie os servi\u00e7os implantados para garantir que eles estejam sempre em execu\u00e7\u00e3o e dispon\u00edveis.","title":"Como funciona o AWS ECS"},{"location":"projetos/9.ECS/#conclusao","text":"O Amazon Elastic Container Service (ECS) \u00e9 uma plataforma eficiente para executar e gerenciar aplicativos em cont\u00eaineres na nuvem da AWS. Com sua alta escalabilidade e flexibilidade, o ECS \u00e9 uma solu\u00e7\u00e3o ideal para empresas que buscam uma forma segura e confi\u00e1vel de executar aplicativos em cont\u00eaineres. Ao integrar-se com outros servi\u00e7os da AWS, como o Elastic Load Balancer, o Amazon S3 e o Amazon VPC, o ECS permite que voc\u00ea crie uma infraestrutura de aplicativos em cont\u00eaineres altamente personalizada que atenda \u00e0s suas necessidades espec\u00edficas.","title":"Conclus\u00e3o"},{"location":"projetos/changelog/","text":"Changelog \u00b6 Material for MkDocs Insiders \u00b6 4.21.1 _ August 13, 2022 \u00b6 Fixed #4176 : Broken image when avatar is served by Gravatar Fixed #4212 : Deferred search initialization for file:// locations 4.21.0 _ July 17, 2022 \u00b6 Added meta plugin: set front matter for all pages in a folder Fixed #4114 : Tags plugin fails if only tags_extra_files is set 4.20.1 _ July 11, 2022 \u00b6 Fixed #4105 : Tags plugin fails if tags_file is not set (4.20.0 regression) 4.20.0 _ July 7, 2022 \u00b6 Added support for additional tags indexes Fixed #4100 : Tag icons not shown in tags index 4.19.2 _ July 4, 2022 \u00b6 Fixed #4051 : Privacy plugin fails if symlinking isn't allowed on Windows 4.19.1 _ June 25, 2022 \u00b6 Added mkdocs-git-committers-plugin to Dockerfile Added mkdocs-git-revision-date-localized-plugin to Dockerfile 4.19.0 _ June 24, 2022 \u00b6 Added support for document contributors Updated French translations for cookie consent 4.18.2 _ June 16, 2022 \u00b6 Fixed #4026 : Fixed tooltips not mounted for nested navigation links 4.18.1 _ June 14, 2022 \u00b6 Fixed #3990 : Chinese search highlighting not working on non-boundaries 4.18.0 _ June 11, 2022 \u00b6 Added support for automatic dark/light mode Fixed #4009 : Privacy plugin uses invalid paths for file cache on Windows 4.17.2 _ June 5, 2022 \u00b6 Added support for custom jieba dictionaries (Chinese search) 4.17.1 _ June 5, 2022 \u00b6 Added support for cookie consent reject button Added support for cookie consent custom button ordering Fixed #3988 : Content tab not focused after alternating anchor links 4.17.0 _ June 4, 2022 \u00b6 Added support for content tabs anchor links (deep linking) Fixed #3975 : Detect composition events in search interface (Chinese) Fixed #3980 : Search plugin doesn't use title set via front matter 4.16.2 _ May 29, 2022 \u00b6 Fixed #3961 : Nested sections triggered build error for navigation tabs 4.16.1 _ May 28, 2022 \u00b6 Switched feedback widget rating titles to tooltips Improved contrast of link colors for light/dark color schemes Fixed #3950 : Sticky navigation tabs rendering broken (4.15.2 regression) Fixed #3958 : Links invisible when using white primary color 4.16.0 _ May 25, 2022 \u00b6 Added support for navigation pruning Fixed search results for non-segmented characters (4.15.2 regression) 4.15.2 _ May 22, 2022 \u00b6 Removed workaround for abbr on touch devices (superseded by tooltips) Fixed #3915 : Improved Chinese search query segmentation Fixed #3938 : Fixed tooltips position for navigation titles with ellipsis 4.15.1 _ May 14, 2022 \u00b6 Improved performance of element focus obervables Fixed #3531 : Added prev/next buttons to content tabs Fixed tooltip positioning when host element is hidden 4.15.0 _ May 8, 2022 \u00b6 Added support for improved tooltips Fixed #3785 : Show tooltip on hover for overflowing navigation link 4.14.0 _ May 5, 2022 \u00b6 Added Chinese language support to built-in search plugin Fixed all-numeric page titles raising error in social plugin 4.13.2 _ April 30, 2022 \u00b6 Improved caching of downloaded resources in privacy plugin Fixed #3851 : External images not downloaded by privacy plugin 4.13.1 _ April 25, 2022 \u00b6 Fixed #3839 : Tags plugin breaks without icons (4.13.0 regression) 4.13.0 _ April 24, 2022 \u00b6 Added support for tag icons 4.12.0 _ March 27, 2022 \u00b6 Added support for card grids and grid layouts Fixed #3685 : Annotations sometimes broken when using instant loading Fixed #3742 : Automatically add Mermaid.js when building for offline usage 4.11.0 _ March 6, 2022 \u00b6 Added support for excluding external assets from privacy plugin 4.10.1 _ March 2, 2022 \u00b6 Added missing build dependencies to Dockerfile Fixed encoding issues in privacy plugin, now forcing UTF-8 encoding Fixed #3624 : Scroll to active navigation item unreliable in Firefox Fixed #3642 : Privacy plugin errors when font setting was omitted 4.10.0 _ February 27, 2022 \u00b6 Added support for offline plugin (supersedes offline search support) Improved built-in privacy plugin to download nested JavaScript assets Refactored configuration of built-in privacy plugin 4.9.1 _ February 21, 2022 \u00b6 Fixed #3610 : missing lxml dependency for privacy plugin Fixed error when charset is missing in content-type header 4.9.0 _ February 20, 2022 \u00b6 Added privacy plugin: automatic downloading of external assets 4.8.3 _ February 13, 2022 \u00b6 Fixed #3560 : Mermaid diagrams don't render for file:// locations 4.8.2 _ February 10, 2022 \u00b6 Fixed #3559 : Mermaid diagrams don't render inside closed details 4.8.1 _ February 6, 2022 \u00b6 Fixed jump back to top on mobile when using anchor following 4.8.0 _ February 6, 2022 \u00b6 Added support for anchor following table of contents (= auto scroll) 4.7.2 _ February 2, 2022 \u00b6 Fixed #3526 : Transparent sidebar title due to Safari bug Fixed #3528 : Firefox sometimes clips text in flow chart diagrams 4.7.1 _ January 30, 2022 \u00b6 Fixed #3506 : Tags index not respecting title set via front matter 4.7.0 _ January 25, 2022 \u00b6 Added native support for offline search 4.6.1 _ January 16, 2022 \u00b6 Fixed #3459 : Section index pages picking up wrong title 4.6.0 _ January 11, 2022 \u00b6 Added support for annotations (outside of code blocks) 4.5.2 _ January 8, 2022 \u00b6 Fixed #3440 : Content tab indicator not moving when using linking Fixed #3445 : Content tab switch flickers/jitters when using linking 4.5.1 _ January 2, 2022 \u00b6 Added support for setting initial state of cookie consent Fixed #3396 : Disappearing link in navigation due to Safari bug 4.5.0 _ December 16, 2021 \u00b6 Added support for navigation icons 4.4.0 _ December 10, 2021 \u00b6 Added support for code annotation anchor links (deep linking) Added new code annotation syntax modifier to strip comment Updated German translations for cookie consent 4.3.0 _ December 5, 2021 \u00b6 Added support for custom fonts in social cards Fixed #3300 : Announcement bar reappearing when using instant loading 4.2.0 _ December 2, 2021 \u00b6 Added support for dismissable announcement bar Added support for named placeholders in feedback widget 4.1.0 _ November 30, 2021 \u00b6 Added support for passing page title to feedback forms 4.0.0 _ November 28, 2021 \u00b6 Removed deprecated content tabs legacy implementation Removed deprecated seealso admonition type Removed deprecated site_keywords setting (unsupported by MkDocs) Removed deprecated prebuilt search index support Removed deprecated web app manifest \u2013 use customization Removed extracopyright variable \u2013 use new copyright partial Removed Disqus integation \u2013 use customization Switched to :is() selectors for simple selector lists Switched autoprefixer from last 4 years to last 2 years Improved CSS overall to match modern standards Improved CSS variable semantics for fonts Improved extensibility by restructuring partials Improved handling of details when printing Improved keyboard navigation for footnotes Fixed #3214 : Search highlighting breaks site when empty 3.2.3 _ November 20, 2021 \u00b6 Updated Swedish and French translations Removed support for .mermaid-experimental class (now .mermaid ) Fixed #3202 : Cookie consent not dismissable on file:// locations Fixed #3216 : Cookie consent not dismissed when invoked via anchor Fixed #3232 : Mermaid.js sometimes runs twice (race condition) 3.2.2 _ November 6, 2021 \u00b6 Fixed always last feedback rating being sent Fixed #3145 : Code annotations eat whole comment lines Fixed #3170 : Feedback widget doesn't send data to GA4 3.2.1 _ November 4, 2021 \u00b6 Added support for custom Mermaid.js version via additional JavaScript Fixed some configuration edge cases for tags plugin (3.1.5 regression) Fixed feedback widget title not being centered in Firefox Fixed #3179 : Safari doesn't send request for feedback widget 3.2.0 _ October 31, 2021 \u00b6 Added support for feedback widget (Was this page helpful?) 3.1.5 _ October 28, 2021 \u00b6 Fixed #3144 : Rogue link when using tags with auto-populated navigation Fixed #3147 : Code block line numbers appear in search results Fixed #3158 : Social cards do not strip HTML tags from title 3.1.4 _ October 17, 2021 \u00b6 Fixed #2974 : Text cropped with other fonts than Roboto in social plugin Fixed #3099 : Encoding problems with non-latin character in social plugin Fixed #3112 : Japanese segmenter not executed as part of new tokenizer Fixed tags (front matter) appearing in search with disabled tags plugin 3.1.3 _ October 12, 2021 \u00b6 Added warnings to search plugin for unsupported options and syntax Fixed #3503 : Search sometimes returns entire page Fixed #3089 : Single-line code annotations disappear when printing 3.1.2 _ October 6, 2021 \u00b6 Fixed incorrect path separators for social cards on Windows 3.1.1 _ September 26, 2021 \u00b6 Fixed ordering bug in search exclusion logic 3.1.0 _ September 26, 2021 \u00b6 Added support for excluding pages, sections, and elements from search Fixed #2803 : Code block annotations not visible when printing 3.0.1 _ September 19, 2021 \u00b6 Added support for using literal h1-6 tags for search plugin Fixed search plugin breaking on void elements without slashes Fixed search plugin filtering link contents from headlines Fixed search plugin handling of multiple h1 headlines Fixed search plugin handling of missing h1 headlines 3.0.0 _ September 13, 2021 \u00b6 Rewrite of MkDocs' search plugin Added support for rich search previews Added support for tokenizer with lookahead Improved search indexing performance (twice as fast) Improved search highlighting 2.13.3 _ September 1, 2021 \u00b6 Added support for disabling social card generation 2.13.2 _ August 25, 2021 \u00b6 Fixed #2965 : Social plugin error when primary color is not defined 2.13.1 _ August 21, 2021 \u00b6 Fixed #2948 : Social cards are not cached Fixed #2953 : Mermaid.js diagrams can't be centered anymore 2.13.0 _ August 7, 2021 \u00b6 Added support for custom colors in social cards 2.12.2 _ August 4, 2021 \u00b6 Fixed #2891 : Division by zero error in social plugin 2.12.1 _ July 26, 2021 \u00b6 Fixed error in social plugin when site_description was not set Fixed error in social plugin for non-ASCII characters 2.12.0 _ July 25, 2021 \u00b6 Added support for social cards 2.11.1 _ July 20, 2021 \u00b6 Fixed order of tags index, now sorted alphabetically 2.11.0 _ July 18, 2021 \u00b6 Improved Mermaid.js intergration, now stable Added support for sequence diagrams Added support for entity relationship diagrams Added support for cookie consent configuration Added feature flag to always enable annotations 2.10.0 _ July 10, 2021 \u00b6 Added support for cookie consent Fixed #2807 : Back-to-top button not hidden when using sticky tabs 2.9.2 _ May 30, 2021 \u00b6 Moved tags to partial for easier customization Added support for hiding tags on any page 2.9.1 _ May 24, 2021 \u00b6 Added missing guard for linking of content tabs 2.9.0 _ May 23, 2021 \u00b6 Added support for linking of content tabs 2.8.0 _ May 12, 2021 \u00b6 Added support for boosting pages in search 2.7.2 _ May 8, 2021 \u00b6 Fixed #2638 : Warnings shown when using tags plugin without directory URLs 2.7.1 _ May 3, 2021 \u00b6 Fixed git-revision-date-localized plugin integration (2.7.0 regression) 2.7.0 _ May 1, 2021 \u00b6 Added support for tags (with search integration) 2.6.0 _ April 11, 2021 \u00b6 Stay on page when switching versions 2.5.0 _ March 28, 2021 \u00b6 Added support for version warning 2.4.0 _ March 20, 2021 \u00b6 Added support for custom admonition icons Fixed #2444 : Code block annotations with extra comments have wrong index 2.3.1 _ March 14, 2021 \u00b6 Fixed anchor offset for permalinks when using sticky navigation tabs 2.3.0 _ March 13, 2021 \u00b6 Added support for back-to-top button 2.2.1 _ March 4, 2021 \u00b6 Fixed #2382 : Repository stats failing when no release tag is present 2.2.0 _ February 28, 2021 \u00b6 Added support for code block annotations 2.1.0 _ February 26, 2021 \u00b6 Added support for anchor tracking 2.0.0 _ February 24, 2021 \u00b6 Migrated Insiders to the new architecture Swapped color palette toggle configuration 1.17.0 _ January 31, 2021 \u00b6 Added support for section index pages 1.16.1 _ January 26, 2021 \u00b6 Fixed #2249 : Instant loading + sticky tabs result in invalid links Fixed #2248 : Search highlighting URL parameter always added Fixed #2235 : Version selector doesn't select current version for aliases 1.16.0 _ January 7, 2021 \u00b6 Added latest release to repository info (GitHub) Slight facelift of repository info (lighter fonts, spacing and icons) 1.15.0 _ January 2, 2021 \u00b6 Added support for native Mermaid.js integration 1.14.0 _ December 30, 2020 \u00b6 Added support for sharing searches 1.13.2 _ December 22, 2020 \u00b6 Fixed version selector + sticky tabs navigation rendering issues Fixed version selector wrapping 1.13.1 _ December 20, 2020 \u00b6 Removed horizontal scrollbars on language and version selector Fixed type conversion in JavaScript config 1.13.0 _ December 13, 2020 \u00b6 Refactored navigation tabs to simplify grouping behavior Added support for sticky navigation tabs Added support for arbitrary links in navigation tabs Fixed #2098 : Subsequent active subsection not highlighted correctly 1.12.1 _ December 8, 2020 \u00b6 Fixed empty language selector being shown 1.12.0 _ December 6, 2020 \u00b6 Added support for adding a language selector 1.11.2 _ November 29, 2020 \u00b6 Fixed #2068 : Search highlight interprets code blocks as JavaScript 1.11.1 _ November 29, 2020 \u00b6 Refactored styling to be more stable and easier to adjust Fixed some styling regressions from latest features 1.11.0 _ November 22, 2020 \u00b6 Added support for rendering admonitions as inline blocks 1.10.0 _ November 15, 2020 \u00b6 Added support for integrating table of contents into navigation 1.9.0 _ November 7, 2020 \u00b6 Added support for hiding navigation and table of contents on any page Removed autohiding table of contents when empty 1.8.0 _ November 1, 2020 \u00b6 Added support for navigation sections Fixed appearance of inactive search suggestions 1.7.0 _ October 25, 2020 \u00b6 Added support for deploying multiple versions Fixed alignment of sidebar when content area is too small 1.6.0 _ October 11, 2020 \u00b6 Added support for search suggestions to save keystrokes Added support for removing Made with Material for MkDocs from footer Fixed #1915 : search should go to first result by pressing Enter 1.5.1 _ September 21, 2020 \u00b6 Fixed content area stretching to whole width for long code blocks 1.5.0 _ September 19, 2020 \u00b6 Added support for autohiding table of contents when empty 1.4.1 _ September 6, 2020 \u00b6 Improved typeahead and search result relevance and scoring 1.4.0 _ August 30, 2020 \u00b6 Added support for autohiding header on scroll 1.3.0 _ August 26, 2020 \u00b6 Added support for user-selectable color palettes 1.2.0 _ August 11, 2020 \u00b6 Added feature to expand navigation by default 1.1.0 _ August 3, 2020 \u00b6 Added highlighting of search results 1.0.0 _ July 14, 2020 \u00b6 Added grouping of search results Added missing query terms to search result Improved search result relevance and scoring","title":"Changelog"},{"location":"projetos/changelog/#changelog","text":"","title":"Changelog"},{"location":"projetos/changelog/#material-for-mkdocs-insiders","text":"","title":"Material for MkDocs Insiders"},{"location":"projetos/changelog/#4.21.1","text":"Fixed #4176 : Broken image when avatar is served by Gravatar Fixed #4212 : Deferred search initialization for file:// locations","title":"4.21.1 _ August 13, 2022"},{"location":"projetos/changelog/#4.21.0","text":"Added meta plugin: set front matter for all pages in a folder Fixed #4114 : Tags plugin fails if only tags_extra_files is set","title":"4.21.0 _ July 17, 2022"},{"location":"projetos/changelog/#4.20.1","text":"Fixed #4105 : Tags plugin fails if tags_file is not set (4.20.0 regression)","title":"4.20.1 _ July 11, 2022"},{"location":"projetos/changelog/#4.20.0","text":"Added support for additional tags indexes Fixed #4100 : Tag icons not shown in tags index","title":"4.20.0 _ July 7, 2022"},{"location":"projetos/changelog/#4.19.2","text":"Fixed #4051 : Privacy plugin fails if symlinking isn't allowed on Windows","title":"4.19.2 _ July 4, 2022"},{"location":"projetos/changelog/#4.19.1","text":"Added mkdocs-git-committers-plugin to Dockerfile Added mkdocs-git-revision-date-localized-plugin to Dockerfile","title":"4.19.1 _ June 25, 2022"},{"location":"projetos/changelog/#4.19.0","text":"Added support for document contributors Updated French translations for cookie consent","title":"4.19.0 _ June 24, 2022"},{"location":"projetos/changelog/#4.18.2","text":"Fixed #4026 : Fixed tooltips not mounted for nested navigation links","title":"4.18.2 _ June 16, 2022"},{"location":"projetos/changelog/#4.18.1","text":"Fixed #3990 : Chinese search highlighting not working on non-boundaries","title":"4.18.1 _ June 14, 2022"},{"location":"projetos/changelog/#4.18.0","text":"Added support for automatic dark/light mode Fixed #4009 : Privacy plugin uses invalid paths for file cache on Windows","title":"4.18.0 _ June 11, 2022"},{"location":"projetos/changelog/#4.17.2","text":"Added support for custom jieba dictionaries (Chinese search)","title":"4.17.2 _ June 5, 2022"},{"location":"projetos/changelog/#4.17.1","text":"Added support for cookie consent reject button Added support for cookie consent custom button ordering Fixed #3988 : Content tab not focused after alternating anchor links","title":"4.17.1 _ June 5, 2022"},{"location":"projetos/changelog/#4.17.0","text":"Added support for content tabs anchor links (deep linking) Fixed #3975 : Detect composition events in search interface (Chinese) Fixed #3980 : Search plugin doesn't use title set via front matter","title":"4.17.0 _ June 4, 2022"},{"location":"projetos/changelog/#4.16.2","text":"Fixed #3961 : Nested sections triggered build error for navigation tabs","title":"4.16.2 _ May 29, 2022"},{"location":"projetos/changelog/#4.16.1","text":"Switched feedback widget rating titles to tooltips Improved contrast of link colors for light/dark color schemes Fixed #3950 : Sticky navigation tabs rendering broken (4.15.2 regression) Fixed #3958 : Links invisible when using white primary color","title":"4.16.1 _ May 28, 2022"},{"location":"projetos/changelog/#4.16.0","text":"Added support for navigation pruning Fixed search results for non-segmented characters (4.15.2 regression)","title":"4.16.0 _ May 25, 2022"},{"location":"projetos/changelog/#4.15.2","text":"Removed workaround for abbr on touch devices (superseded by tooltips) Fixed #3915 : Improved Chinese search query segmentation Fixed #3938 : Fixed tooltips position for navigation titles with ellipsis","title":"4.15.2 _ May 22, 2022"},{"location":"projetos/changelog/#4.15.1","text":"Improved performance of element focus obervables Fixed #3531 : Added prev/next buttons to content tabs Fixed tooltip positioning when host element is hidden","title":"4.15.1 _ May 14, 2022"},{"location":"projetos/changelog/#4.15.0","text":"Added support for improved tooltips Fixed #3785 : Show tooltip on hover for overflowing navigation link","title":"4.15.0 _ May 8, 2022"},{"location":"projetos/changelog/#4.14.0","text":"Added Chinese language support to built-in search plugin Fixed all-numeric page titles raising error in social plugin","title":"4.14.0 _ May 5, 2022"},{"location":"projetos/changelog/#4.13.2","text":"Improved caching of downloaded resources in privacy plugin Fixed #3851 : External images not downloaded by privacy plugin","title":"4.13.2 _ April 30, 2022"},{"location":"projetos/changelog/#4.13.1","text":"Fixed #3839 : Tags plugin breaks without icons (4.13.0 regression)","title":"4.13.1 _ April 25, 2022"},{"location":"projetos/changelog/#4.13.0","text":"Added support for tag icons","title":"4.13.0 _ April 24, 2022"},{"location":"projetos/changelog/#4.12.0","text":"Added support for card grids and grid layouts Fixed #3685 : Annotations sometimes broken when using instant loading Fixed #3742 : Automatically add Mermaid.js when building for offline usage","title":"4.12.0 _ March 27, 2022"},{"location":"projetos/changelog/#4.11.0","text":"Added support for excluding external assets from privacy plugin","title":"4.11.0 _ March 6, 2022"},{"location":"projetos/changelog/#4.10.1","text":"Added missing build dependencies to Dockerfile Fixed encoding issues in privacy plugin, now forcing UTF-8 encoding Fixed #3624 : Scroll to active navigation item unreliable in Firefox Fixed #3642 : Privacy plugin errors when font setting was omitted","title":"4.10.1 _ March 2, 2022"},{"location":"projetos/changelog/#4.10.0","text":"Added support for offline plugin (supersedes offline search support) Improved built-in privacy plugin to download nested JavaScript assets Refactored configuration of built-in privacy plugin","title":"4.10.0 _ February 27, 2022"},{"location":"projetos/changelog/#4.9.1","text":"Fixed #3610 : missing lxml dependency for privacy plugin Fixed error when charset is missing in content-type header","title":"4.9.1 _ February 21, 2022"},{"location":"projetos/changelog/#4.9.0","text":"Added privacy plugin: automatic downloading of external assets","title":"4.9.0 _ February 20, 2022"},{"location":"projetos/changelog/#4.8.3","text":"Fixed #3560 : Mermaid diagrams don't render for file:// locations","title":"4.8.3 _ February 13, 2022"},{"location":"projetos/changelog/#4.8.2","text":"Fixed #3559 : Mermaid diagrams don't render inside closed details","title":"4.8.2 _ February 10, 2022"},{"location":"projetos/changelog/#4.8.1","text":"Fixed jump back to top on mobile when using anchor following","title":"4.8.1 _ February 6, 2022"},{"location":"projetos/changelog/#4.8.0","text":"Added support for anchor following table of contents (= auto scroll)","title":"4.8.0 _ February 6, 2022"},{"location":"projetos/changelog/#4.7.2","text":"Fixed #3526 : Transparent sidebar title due to Safari bug Fixed #3528 : Firefox sometimes clips text in flow chart diagrams","title":"4.7.2 _ February 2, 2022"},{"location":"projetos/changelog/#4.7.1","text":"Fixed #3506 : Tags index not respecting title set via front matter","title":"4.7.1 _ January 30, 2022"},{"location":"projetos/changelog/#4.7.0","text":"Added native support for offline search","title":"4.7.0 _ January 25, 2022"},{"location":"projetos/changelog/#4.6.1","text":"Fixed #3459 : Section index pages picking up wrong title","title":"4.6.1 _ January 16, 2022"},{"location":"projetos/changelog/#4.6.0","text":"Added support for annotations (outside of code blocks)","title":"4.6.0 _ January 11, 2022"},{"location":"projetos/changelog/#4.5.2","text":"Fixed #3440 : Content tab indicator not moving when using linking Fixed #3445 : Content tab switch flickers/jitters when using linking","title":"4.5.2 _ January 8, 2022"},{"location":"projetos/changelog/#4.5.1","text":"Added support for setting initial state of cookie consent Fixed #3396 : Disappearing link in navigation due to Safari bug","title":"4.5.1 _ January 2, 2022"},{"location":"projetos/changelog/#4.5.0","text":"Added support for navigation icons","title":"4.5.0 _ December 16, 2021"},{"location":"projetos/changelog/#4.4.0","text":"Added support for code annotation anchor links (deep linking) Added new code annotation syntax modifier to strip comment Updated German translations for cookie consent","title":"4.4.0 _ December 10, 2021"},{"location":"projetos/changelog/#4.3.0","text":"Added support for custom fonts in social cards Fixed #3300 : Announcement bar reappearing when using instant loading","title":"4.3.0 _ December 5, 2021"},{"location":"projetos/changelog/#4.2.0","text":"Added support for dismissable announcement bar Added support for named placeholders in feedback widget","title":"4.2.0 _ December 2, 2021"},{"location":"projetos/changelog/#4.1.0","text":"Added support for passing page title to feedback forms","title":"4.1.0 _ November 30, 2021"},{"location":"projetos/changelog/#4.0.0","text":"Removed deprecated content tabs legacy implementation Removed deprecated seealso admonition type Removed deprecated site_keywords setting (unsupported by MkDocs) Removed deprecated prebuilt search index support Removed deprecated web app manifest \u2013 use customization Removed extracopyright variable \u2013 use new copyright partial Removed Disqus integation \u2013 use customization Switched to :is() selectors for simple selector lists Switched autoprefixer from last 4 years to last 2 years Improved CSS overall to match modern standards Improved CSS variable semantics for fonts Improved extensibility by restructuring partials Improved handling of details when printing Improved keyboard navigation for footnotes Fixed #3214 : Search highlighting breaks site when empty","title":"4.0.0 _ November 28, 2021"},{"location":"projetos/changelog/#3.2.3","text":"Updated Swedish and French translations Removed support for .mermaid-experimental class (now .mermaid ) Fixed #3202 : Cookie consent not dismissable on file:// locations Fixed #3216 : Cookie consent not dismissed when invoked via anchor Fixed #3232 : Mermaid.js sometimes runs twice (race condition)","title":"3.2.3 _ November 20, 2021"},{"location":"projetos/changelog/#3.2.2","text":"Fixed always last feedback rating being sent Fixed #3145 : Code annotations eat whole comment lines Fixed #3170 : Feedback widget doesn't send data to GA4","title":"3.2.2 _ November 6, 2021"},{"location":"projetos/changelog/#3.2.1","text":"Added support for custom Mermaid.js version via additional JavaScript Fixed some configuration edge cases for tags plugin (3.1.5 regression) Fixed feedback widget title not being centered in Firefox Fixed #3179 : Safari doesn't send request for feedback widget","title":"3.2.1 _ November 4, 2021"},{"location":"projetos/changelog/#3.2.0","text":"Added support for feedback widget (Was this page helpful?)","title":"3.2.0 _ October 31, 2021"},{"location":"projetos/changelog/#3.1.5","text":"Fixed #3144 : Rogue link when using tags with auto-populated navigation Fixed #3147 : Code block line numbers appear in search results Fixed #3158 : Social cards do not strip HTML tags from title","title":"3.1.5 _ October 28, 2021"},{"location":"projetos/changelog/#3.1.4","text":"Fixed #2974 : Text cropped with other fonts than Roboto in social plugin Fixed #3099 : Encoding problems with non-latin character in social plugin Fixed #3112 : Japanese segmenter not executed as part of new tokenizer Fixed tags (front matter) appearing in search with disabled tags plugin","title":"3.1.4 _ October 17, 2021"},{"location":"projetos/changelog/#3.1.3","text":"Added warnings to search plugin for unsupported options and syntax Fixed #3503 : Search sometimes returns entire page Fixed #3089 : Single-line code annotations disappear when printing","title":"3.1.3 _ October 12, 2021"},{"location":"projetos/changelog/#3.1.2","text":"Fixed incorrect path separators for social cards on Windows","title":"3.1.2 _ October 6, 2021"},{"location":"projetos/changelog/#3.1.1","text":"Fixed ordering bug in search exclusion logic","title":"3.1.1 _ September 26, 2021"},{"location":"projetos/changelog/#3.1.0","text":"Added support for excluding pages, sections, and elements from search Fixed #2803 : Code block annotations not visible when printing","title":"3.1.0 _ September 26, 2021"},{"location":"projetos/changelog/#3.0.1","text":"Added support for using literal h1-6 tags for search plugin Fixed search plugin breaking on void elements without slashes Fixed search plugin filtering link contents from headlines Fixed search plugin handling of multiple h1 headlines Fixed search plugin handling of missing h1 headlines","title":"3.0.1 _ September 19, 2021"},{"location":"projetos/changelog/#3.0.0","text":"Rewrite of MkDocs' search plugin Added support for rich search previews Added support for tokenizer with lookahead Improved search indexing performance (twice as fast) Improved search highlighting","title":"3.0.0 _ September 13, 2021"},{"location":"projetos/changelog/#2.13.3","text":"Added support for disabling social card generation","title":"2.13.3 _ September 1, 2021"},{"location":"projetos/changelog/#2.13.2","text":"Fixed #2965 : Social plugin error when primary color is not defined","title":"2.13.2 _ August 25, 2021"},{"location":"projetos/changelog/#2.13.1","text":"Fixed #2948 : Social cards are not cached Fixed #2953 : Mermaid.js diagrams can't be centered anymore","title":"2.13.1 _ August 21, 2021"},{"location":"projetos/changelog/#2.13.0","text":"Added support for custom colors in social cards","title":"2.13.0 _ August 7, 2021"},{"location":"projetos/changelog/#2.12.2","text":"Fixed #2891 : Division by zero error in social plugin","title":"2.12.2 _ August 4, 2021"},{"location":"projetos/changelog/#2.12.1","text":"Fixed error in social plugin when site_description was not set Fixed error in social plugin for non-ASCII characters","title":"2.12.1 _ July 26, 2021"},{"location":"projetos/changelog/#2.12.0","text":"Added support for social cards","title":"2.12.0 _ July 25, 2021"},{"location":"projetos/changelog/#2.11.1","text":"Fixed order of tags index, now sorted alphabetically","title":"2.11.1 _ July 20, 2021"},{"location":"projetos/changelog/#2.11.0","text":"Improved Mermaid.js intergration, now stable Added support for sequence diagrams Added support for entity relationship diagrams Added support for cookie consent configuration Added feature flag to always enable annotations","title":"2.11.0 _ July 18, 2021"},{"location":"projetos/changelog/#2.10.0","text":"Added support for cookie consent Fixed #2807 : Back-to-top button not hidden when using sticky tabs","title":"2.10.0 _ July 10, 2021"},{"location":"projetos/changelog/#2.9.2","text":"Moved tags to partial for easier customization Added support for hiding tags on any page","title":"2.9.2 _ May 30, 2021"},{"location":"projetos/changelog/#2.9.1","text":"Added missing guard for linking of content tabs","title":"2.9.1 _ May 24, 2021"},{"location":"projetos/changelog/#2.9.0","text":"Added support for linking of content tabs","title":"2.9.0 _ May 23, 2021"},{"location":"projetos/changelog/#2.8.0","text":"Added support for boosting pages in search","title":"2.8.0 _ May 12, 2021"},{"location":"projetos/changelog/#2.7.2","text":"Fixed #2638 : Warnings shown when using tags plugin without directory URLs","title":"2.7.2 _ May 8, 2021"},{"location":"projetos/changelog/#2.7.1","text":"Fixed git-revision-date-localized plugin integration (2.7.0 regression)","title":"2.7.1 _ May 3, 2021"},{"location":"projetos/changelog/#2.7.0","text":"Added support for tags (with search integration)","title":"2.7.0 _ May 1, 2021"},{"location":"projetos/changelog/#2.6.0","text":"Stay on page when switching versions","title":"2.6.0 _ April 11, 2021"},{"location":"projetos/changelog/#2.5.0","text":"Added support for version warning","title":"2.5.0 _ March 28, 2021"},{"location":"projetos/changelog/#2.4.0","text":"Added support for custom admonition icons Fixed #2444 : Code block annotations with extra comments have wrong index","title":"2.4.0 _ March 20, 2021"},{"location":"projetos/changelog/#2.3.1","text":"Fixed anchor offset for permalinks when using sticky navigation tabs","title":"2.3.1 _ March 14, 2021"},{"location":"projetos/changelog/#2.3.0","text":"Added support for back-to-top button","title":"2.3.0 _ March 13, 2021"},{"location":"projetos/changelog/#2.2.1","text":"Fixed #2382 : Repository stats failing when no release tag is present","title":"2.2.1 _ March 4, 2021"},{"location":"projetos/changelog/#2.2.0","text":"Added support for code block annotations","title":"2.2.0 _ February 28, 2021"},{"location":"projetos/changelog/#2.1.0","text":"Added support for anchor tracking","title":"2.1.0 _ February 26, 2021"},{"location":"projetos/changelog/#2.0.0","text":"Migrated Insiders to the new architecture Swapped color palette toggle configuration","title":"2.0.0 _ February 24, 2021"},{"location":"projetos/changelog/#1.17.0","text":"Added support for section index pages","title":"1.17.0 _ January 31, 2021"},{"location":"projetos/changelog/#1.16.1","text":"Fixed #2249 : Instant loading + sticky tabs result in invalid links Fixed #2248 : Search highlighting URL parameter always added Fixed #2235 : Version selector doesn't select current version for aliases","title":"1.16.1 _ January 26, 2021"},{"location":"projetos/changelog/#1.16.0","text":"Added latest release to repository info (GitHub) Slight facelift of repository info (lighter fonts, spacing and icons)","title":"1.16.0 _ January 7, 2021"},{"location":"projetos/changelog/#1.15.0","text":"Added support for native Mermaid.js integration","title":"1.15.0 _ January 2, 2021"},{"location":"projetos/changelog/#1.14.0","text":"Added support for sharing searches","title":"1.14.0 _ December 30, 2020"},{"location":"projetos/changelog/#1.13.2","text":"Fixed version selector + sticky tabs navigation rendering issues Fixed version selector wrapping","title":"1.13.2 _ December 22, 2020"},{"location":"projetos/changelog/#1.13.1","text":"Removed horizontal scrollbars on language and version selector Fixed type conversion in JavaScript config","title":"1.13.1 _ December 20, 2020"},{"location":"projetos/changelog/#1.13.0","text":"Refactored navigation tabs to simplify grouping behavior Added support for sticky navigation tabs Added support for arbitrary links in navigation tabs Fixed #2098 : Subsequent active subsection not highlighted correctly","title":"1.13.0 _ December 13, 2020"},{"location":"projetos/changelog/#1.12.1","text":"Fixed empty language selector being shown","title":"1.12.1 _ December 8, 2020"},{"location":"projetos/changelog/#1.12.0","text":"Added support for adding a language selector","title":"1.12.0 _ December 6, 2020"},{"location":"projetos/changelog/#1.11.2","text":"Fixed #2068 : Search highlight interprets code blocks as JavaScript","title":"1.11.2 _ November 29, 2020"},{"location":"projetos/changelog/#1.11.1","text":"Refactored styling to be more stable and easier to adjust Fixed some styling regressions from latest features","title":"1.11.1 _ November 29, 2020"},{"location":"projetos/changelog/#1.11.0","text":"Added support for rendering admonitions as inline blocks","title":"1.11.0 _ November 22, 2020"},{"location":"projetos/changelog/#1.10.0","text":"Added support for integrating table of contents into navigation","title":"1.10.0 _ November 15, 2020"},{"location":"projetos/changelog/#1.9.0","text":"Added support for hiding navigation and table of contents on any page Removed autohiding table of contents when empty","title":"1.9.0 _ November 7, 2020"},{"location":"projetos/changelog/#1.8.0","text":"Added support for navigation sections Fixed appearance of inactive search suggestions","title":"1.8.0 _ November 1, 2020"},{"location":"projetos/changelog/#1.7.0","text":"Added support for deploying multiple versions Fixed alignment of sidebar when content area is too small","title":"1.7.0 _ October 25, 2020"},{"location":"projetos/changelog/#1.6.0","text":"Added support for search suggestions to save keystrokes Added support for removing Made with Material for MkDocs from footer Fixed #1915 : search should go to first result by pressing Enter","title":"1.6.0 _ October 11, 2020"},{"location":"projetos/changelog/#1.5.1","text":"Fixed content area stretching to whole width for long code blocks","title":"1.5.1 _ September 21, 2020"},{"location":"projetos/changelog/#1.5.0","text":"Added support for autohiding table of contents when empty","title":"1.5.0 _ September 19, 2020"},{"location":"projetos/changelog/#1.4.1","text":"Improved typeahead and search result relevance and scoring","title":"1.4.1 _ September 6, 2020"},{"location":"projetos/changelog/#1.4.0","text":"Added support for autohiding header on scroll","title":"1.4.0 _ August 30, 2020"},{"location":"projetos/changelog/#1.3.0","text":"Added support for user-selectable color palettes","title":"1.3.0 _ August 26, 2020"},{"location":"projetos/changelog/#1.2.0","text":"Added feature to expand navigation by default","title":"1.2.0 _ August 11, 2020"},{"location":"projetos/changelog/#1.1.0","text":"Added highlighting of search results","title":"1.1.0 _ August 3, 2020"},{"location":"projetos/changelog/#1.0.0","text":"Added grouping of search results Added missing query terms to search result Improved search result relevance and scoring","title":"1.0.0 _ July 14, 2020"},{"location":"projetos/construcao/","text":"Em Contru\u00e7\u00e3o \u00b6 Visualiza\u00e7\u00e3o do Processo de Contru\u00e7\u00e3o \u00b6","title":"Constru\u00e7\u00e3o"},{"location":"projetos/construcao/#em-contrucao","text":"","title":"Em Contru\u00e7\u00e3o"},{"location":"projetos/construcao/#visualizacao-do-processo-de-contrucao","text":"","title":"Visualiza\u00e7\u00e3o do Processo de Contru\u00e7\u00e3o"},{"location":"projetos/projeto_2022/","text":"Projeto Cloud 2022 \u00b6 Infraestrutura como c\u00f3digo \u00e9 o processo de gerenciamento de infraestrutura em um arquivo ou arquivos, em vez de configurar recursos manualmente em uma dashboard. Partindo deste conceito, voc\u00ea dever\u00e1: Desenvolver uma aplica\u00e7\u00e3o capaz de provisionar uma infraestrutura por meio de uma interface amig\u00e1vel(livre escolha) para gerenciar e administr\u00e1-la (construir, alterar e deletar recursos). A rubrica abaixo pressup\u00f5e que para alcan\u00e7ar o Conceito \"B\" voc\u00ea tenha feito o Conceito \"C\" por completo. Assim, para ter \"A\" precisa que os conceitos anteriores tenham sido alcan\u00e7ados. Sua aplica\u00e7\u00e3o dever\u00e1 seguir as fun\u00e7\u00f5es (descri\u00e7\u00e3o) abaixo e a tabela completa para alcan\u00e7ar o conceito base. Conceito C+ Descri\u00e7\u00e3o CRIAR VPC cria\u00e7\u00e3o de uma VPC e sub-rede; inst\u00e2ncias : esta funcionalidade dever\u00e1 permitir a escolha de pelo menos 2 tipos de configura\u00e7\u00e3o de hosts; ainda dever\u00e1 ser poss\u00edvel aumentar e diminuir a quantidade de inst\u00e2ncias; security group : cria\u00e7\u00e3o e a associa\u00e7\u00e3o de grupos de seguran\u00e7a com inst\u00e2ncias; Usu\u00e1rio no IAM . DELETAR Inst\u00e2ncias, grupos de seguran\u00e7a e usu\u00e1rio. LISTAR Aplica\u00e7\u00e3o dever\u00e1 listar todas inst\u00e2ncias e suas regi\u00f5es, usu\u00e1rios, grupos de seguran\u00e7a e suas regras. Conceito B Descri\u00e7\u00e3o CRIAR Regras em security group; Inst\u00e2ncia em mais de uma regi\u00e3o; Associar algum tipo de restri\u00e7\u00e3o de acesso a um usu\u00e1rio; DELETAR Regras de security group; recursos implantados na Regi\u00e3o; Conceito A Descri\u00e7\u00e3o CRIAR Criar um HA de servidores web. Warning OBS: Ser\u00e1 descontado meio conceito na nota do projeto caso algum incidente ou publica\u00e7\u00e3o (vazamento) de sua chave AWS for identificada no git hub. ENTREGA Os projetos dever\u00e3o ser entregues at\u00e9 \u00e0s 23h59 do dia 25/11/2022. A entrega ser\u00e1 feita via blackboard por meio da associa\u00e7\u00e3o de seu github. Todos os projetos dever\u00e3o estar acompanhados de um roteiro (tutorial) de instala\u00e7\u00e3o e opera\u00e7\u00e3o. Ser\u00e3o sorteados/escolhidos 16 projetos para apresenta\u00e7\u00e3o no dia 01/12/2022. A publica\u00e7\u00e3o dos projetos que realizar\u00e3o a apresenta\u00e7\u00e3o ser\u00e1 no dia 28/11/2022. A apresenta\u00e7\u00e3o ser\u00e1 realizada em um tempo m\u00e1ximo de 15 minutos a partir do roteiro entregue. Falta pouco para terminar o semestre, foquem em terminar os roteiros 3 e 4 em sala e desenvolva o projeto fora do hor\u00e1rio de aula. Dica Sugerimos que voc\u00ea estude a partir de documenta\u00e7\u00f5es oficiais e tutoriais t\u00e9cnicos. * terraform.io * terraform-aws-get-started","title":"Computa\u00e7\u00e3o em Nuvem"},{"location":"projetos/projeto_2022/#projeto-cloud-2022","text":"Infraestrutura como c\u00f3digo \u00e9 o processo de gerenciamento de infraestrutura em um arquivo ou arquivos, em vez de configurar recursos manualmente em uma dashboard. Partindo deste conceito, voc\u00ea dever\u00e1: Desenvolver uma aplica\u00e7\u00e3o capaz de provisionar uma infraestrutura por meio de uma interface amig\u00e1vel(livre escolha) para gerenciar e administr\u00e1-la (construir, alterar e deletar recursos). A rubrica abaixo pressup\u00f5e que para alcan\u00e7ar o Conceito \"B\" voc\u00ea tenha feito o Conceito \"C\" por completo. Assim, para ter \"A\" precisa que os conceitos anteriores tenham sido alcan\u00e7ados. Sua aplica\u00e7\u00e3o dever\u00e1 seguir as fun\u00e7\u00f5es (descri\u00e7\u00e3o) abaixo e a tabela completa para alcan\u00e7ar o conceito base. Conceito C+ Descri\u00e7\u00e3o CRIAR VPC cria\u00e7\u00e3o de uma VPC e sub-rede; inst\u00e2ncias : esta funcionalidade dever\u00e1 permitir a escolha de pelo menos 2 tipos de configura\u00e7\u00e3o de hosts; ainda dever\u00e1 ser poss\u00edvel aumentar e diminuir a quantidade de inst\u00e2ncias; security group : cria\u00e7\u00e3o e a associa\u00e7\u00e3o de grupos de seguran\u00e7a com inst\u00e2ncias; Usu\u00e1rio no IAM . DELETAR Inst\u00e2ncias, grupos de seguran\u00e7a e usu\u00e1rio. LISTAR Aplica\u00e7\u00e3o dever\u00e1 listar todas inst\u00e2ncias e suas regi\u00f5es, usu\u00e1rios, grupos de seguran\u00e7a e suas regras. Conceito B Descri\u00e7\u00e3o CRIAR Regras em security group; Inst\u00e2ncia em mais de uma regi\u00e3o; Associar algum tipo de restri\u00e7\u00e3o de acesso a um usu\u00e1rio; DELETAR Regras de security group; recursos implantados na Regi\u00e3o; Conceito A Descri\u00e7\u00e3o CRIAR Criar um HA de servidores web. Warning OBS: Ser\u00e1 descontado meio conceito na nota do projeto caso algum incidente ou publica\u00e7\u00e3o (vazamento) de sua chave AWS for identificada no git hub. ENTREGA Os projetos dever\u00e3o ser entregues at\u00e9 \u00e0s 23h59 do dia 25/11/2022. A entrega ser\u00e1 feita via blackboard por meio da associa\u00e7\u00e3o de seu github. Todos os projetos dever\u00e3o estar acompanhados de um roteiro (tutorial) de instala\u00e7\u00e3o e opera\u00e7\u00e3o. Ser\u00e3o sorteados/escolhidos 16 projetos para apresenta\u00e7\u00e3o no dia 01/12/2022. A publica\u00e7\u00e3o dos projetos que realizar\u00e3o a apresenta\u00e7\u00e3o ser\u00e1 no dia 28/11/2022. A apresenta\u00e7\u00e3o ser\u00e1 realizada em um tempo m\u00e1ximo de 15 minutos a partir do roteiro entregue. Falta pouco para terminar o semestre, foquem em terminar os roteiros 3 e 4 em sala e desenvolva o projeto fora do hor\u00e1rio de aula. Dica Sugerimos que voc\u00ea estude a partir de documenta\u00e7\u00f5es oficiais e tutoriais t\u00e9cnicos. * terraform.io * terraform-aws-get-started","title":"Projeto Cloud 2022"},{"location":"projetos_2022/DaviReisVieira/","text":"Infraestrutura por C\u00f3digo \u00b6 Aplica\u00e7\u00e3o Front-end para gerenciar infraestrutura constru\u00edda com Terraform. Aluno: Davi Reis Vieira de Souza Curso: Engenharia da Computa\u00e7\u00e3o Semestre: 6 Contato: davirvs@al.insper.edu.br Ano: 2022 GitHub Page : https://github.com/DaviReisVieira/AWS-Core-Management AWS Core Management \u00b6 Description \u00b6 This project is a simple example of how to use Terraform to manage AWS resources. Technologies \u00b6 Requirements \u00b6 Terraform AWS CLI Python 3 Node.js AWS Account AWS IAM User Usage \u00b6 Execute the install.sh script to install the dependencies and configure the infrastructure. $ ./install.sh Open your browser and go to the URL http://localhost:3000 . You should see the following page: Tutorial \u00b6 Register in the plataform with username, password, AWS Access Key ID and AWS Secret Access Key. After registering, you will be redirected to the login page. Log in with the username and password you registered. After logging in, you will be redirected to the home page. Here you can see the AWS regions. Create a new region by clicking on the Create button after selecting the region you want to create. You can select a specific region by clicking on the region name. Here you can see the AWS resources. Create a new resource by clicking on the Create button after selecting the resource you want to create. Update the region configuration by clicking on the Update Region . Concepts \u00b6 Conceito C+ \u00b6 Criar: VPC cria\u00e7\u00e3o de uma VPC e sub-rede; inst\u00e2ncias: esta funcionalidade dever\u00e1 permitir a escolha de pelo menos 2 tipos de configura\u00e7\u00e3o de hosts; ainda dever\u00e1 ser poss\u00edvel aumentar e diminuir a quantidade de inst\u00e2ncias; security group: cria\u00e7\u00e3o e a associa\u00e7\u00e3o de grupos de seguran\u00e7a com inst\u00e2ncias; Usu\u00e1rio no IAM. Deletar: Inst\u00e2ncias, grupos de seguran\u00e7a e usu\u00e1rio. Listar: Aplica\u00e7\u00e3o dever\u00e1 listar todas inst\u00e2ncias e suas regi\u00f5es, usu\u00e1rios, grupos de seguran\u00e7a e suas regras. Conceito B \u00b6 Criar: Regras em security group; Inst\u00e2ncia em mais de uma regi\u00e3o; Associar algum tipo de restri\u00e7\u00e3o de acesso a um usu\u00e1rio; Deletar: Regras de security group; recursos implantados na Regi\u00e3o; Conceito A \u00b6 Criar: Criar um HA de servidores web. Format of variables in Terraform JSON \u00b6 Security Group { \"id\" : \"sg-0a1b2c3d\" , \"name\" : \"sg-tcp/udp-22 - davirvs\" , \"description\" : \"Security Group for EC2\" , \"ingress\" : [ { \"description\" : \"SSH\" , \"from_port\" : 22 , \"to_port\" : 22 , \"protocol\" : \"tcp\" , \"cidr_blocks\" : [ \"0.0.0.0/0\" ] } ], \"egress\" : [ { \"description\" : \"All\" , \"from_port\" : 0 , \"to_port\" : 0 , \"protocol\" : \"-1\" , \"cidr_blocks\" : [ \"0.0.0.0/0\" ] } ] } EC2 { \"name\" : \"davirvs1_ubuntu2204\" , \"ami\" : \"ami-08c40ec9ead489470\" , \"instance_type\" : \"t2.micro\" , \"security_groups_ids\" : [ \"sg-0a1b2c3d\" ] } User { \"name\" : \"davirvsTeste1\" , \"policies\" : { \"name\" : \"davirvsTeste1Restrictions\" , \"description\" : \"Estas s\u00e3o as restri\u00e7\u00f5es do usu\u00e1rio davirvsTeste1\" , \"actions\" : [ \"ec2:DescribeInstances\" , \"ec2:DescribeSecurityGroups\" ], \"resources\" : [ \"*\" ] } } Group { \"id\" : \"ug-0a1b2c3d\" , \"name\" : \"davirvsGroups1\" , \"description\" : \"davirvsGroups1 description\" , \"policies\" : { \"name\" : \"davirvsGroups1Restrictions\" , \"description\" : \"Estas s\u00e3o as restri\u00e7\u00f5es do grupo de usu\u00e1rios davirvsGroups1\" , \"actions\" : [ \"ec2:DescribeInstances\" , \"ec2:DescribeSecurityGroups\" ], \"resources\" : [ \"*\" ] } } Format of JSON variable file \u00b6 { \"aws-region\" : \"us-east-2\" , \"security_groups\" : [], \"instances\" : [], \"users\" : [], \"users_groups\" : [] }","title":"Davi Reis"},{"location":"projetos_2022/DaviReisVieira/#infraestrutura-por-codigo","text":"Aplica\u00e7\u00e3o Front-end para gerenciar infraestrutura constru\u00edda com Terraform. Aluno: Davi Reis Vieira de Souza Curso: Engenharia da Computa\u00e7\u00e3o Semestre: 6 Contato: davirvs@al.insper.edu.br Ano: 2022 GitHub Page : https://github.com/DaviReisVieira/AWS-Core-Management","title":"Infraestrutura por C\u00f3digo"},{"location":"projetos_2022/DaviReisVieira/#aws-core-management","text":"","title":"AWS Core Management"},{"location":"projetos_2022/DaviReisVieira/#description","text":"This project is a simple example of how to use Terraform to manage AWS resources.","title":"Description"},{"location":"projetos_2022/DaviReisVieira/#technologies","text":"","title":"Technologies"},{"location":"projetos_2022/DaviReisVieira/#requirements","text":"Terraform AWS CLI Python 3 Node.js AWS Account AWS IAM User","title":"Requirements"},{"location":"projetos_2022/DaviReisVieira/#usage","text":"Execute the install.sh script to install the dependencies and configure the infrastructure. $ ./install.sh Open your browser and go to the URL http://localhost:3000 . You should see the following page:","title":"Usage"},{"location":"projetos_2022/DaviReisVieira/#tutorial","text":"Register in the plataform with username, password, AWS Access Key ID and AWS Secret Access Key. After registering, you will be redirected to the login page. Log in with the username and password you registered. After logging in, you will be redirected to the home page. Here you can see the AWS regions. Create a new region by clicking on the Create button after selecting the region you want to create. You can select a specific region by clicking on the region name. Here you can see the AWS resources. Create a new resource by clicking on the Create button after selecting the resource you want to create. Update the region configuration by clicking on the Update Region .","title":"Tutorial"},{"location":"projetos_2022/DaviReisVieira/#concepts","text":"","title":"Concepts"},{"location":"projetos_2022/DaviReisVieira/#conceito-c","text":"Criar: VPC cria\u00e7\u00e3o de uma VPC e sub-rede; inst\u00e2ncias: esta funcionalidade dever\u00e1 permitir a escolha de pelo menos 2 tipos de configura\u00e7\u00e3o de hosts; ainda dever\u00e1 ser poss\u00edvel aumentar e diminuir a quantidade de inst\u00e2ncias; security group: cria\u00e7\u00e3o e a associa\u00e7\u00e3o de grupos de seguran\u00e7a com inst\u00e2ncias; Usu\u00e1rio no IAM. Deletar: Inst\u00e2ncias, grupos de seguran\u00e7a e usu\u00e1rio. Listar: Aplica\u00e7\u00e3o dever\u00e1 listar todas inst\u00e2ncias e suas regi\u00f5es, usu\u00e1rios, grupos de seguran\u00e7a e suas regras.","title":"Conceito C+"},{"location":"projetos_2022/DaviReisVieira/#conceito-b","text":"Criar: Regras em security group; Inst\u00e2ncia em mais de uma regi\u00e3o; Associar algum tipo de restri\u00e7\u00e3o de acesso a um usu\u00e1rio; Deletar: Regras de security group; recursos implantados na Regi\u00e3o;","title":"Conceito B"},{"location":"projetos_2022/DaviReisVieira/#conceito-a","text":"Criar: Criar um HA de servidores web.","title":"Conceito A"},{"location":"projetos_2022/DaviReisVieira/#format-of-variables-in-terraform-json","text":"Security Group { \"id\" : \"sg-0a1b2c3d\" , \"name\" : \"sg-tcp/udp-22 - davirvs\" , \"description\" : \"Security Group for EC2\" , \"ingress\" : [ { \"description\" : \"SSH\" , \"from_port\" : 22 , \"to_port\" : 22 , \"protocol\" : \"tcp\" , \"cidr_blocks\" : [ \"0.0.0.0/0\" ] } ], \"egress\" : [ { \"description\" : \"All\" , \"from_port\" : 0 , \"to_port\" : 0 , \"protocol\" : \"-1\" , \"cidr_blocks\" : [ \"0.0.0.0/0\" ] } ] } EC2 { \"name\" : \"davirvs1_ubuntu2204\" , \"ami\" : \"ami-08c40ec9ead489470\" , \"instance_type\" : \"t2.micro\" , \"security_groups_ids\" : [ \"sg-0a1b2c3d\" ] } User { \"name\" : \"davirvsTeste1\" , \"policies\" : { \"name\" : \"davirvsTeste1Restrictions\" , \"description\" : \"Estas s\u00e3o as restri\u00e7\u00f5es do usu\u00e1rio davirvsTeste1\" , \"actions\" : [ \"ec2:DescribeInstances\" , \"ec2:DescribeSecurityGroups\" ], \"resources\" : [ \"*\" ] } } Group { \"id\" : \"ug-0a1b2c3d\" , \"name\" : \"davirvsGroups1\" , \"description\" : \"davirvsGroups1 description\" , \"policies\" : { \"name\" : \"davirvsGroups1Restrictions\" , \"description\" : \"Estas s\u00e3o as restri\u00e7\u00f5es do grupo de usu\u00e1rios davirvsGroups1\" , \"actions\" : [ \"ec2:DescribeInstances\" , \"ec2:DescribeSecurityGroups\" ], \"resources\" : [ \"*\" ] } }","title":"Format of variables in Terraform JSON"},{"location":"projetos_2022/DaviReisVieira/#format-of-json-variable-file","text":"{ \"aws-region\" : \"us-east-2\" , \"security_groups\" : [], \"instances\" : [], \"users\" : [], \"users_groups\" : [] }","title":"Format of JSON variable file"},{"location":"projetos_2022/fran-janela/","text":"Infraestrutura por C\u00f3digo \u00b6 Aplica\u00e7\u00e3o em Python para gerenciar infraestrutura constru\u00edda com Terraform. Aluno: Francisco Pinheiro Janela Curso: Engenharia da Computa\u00e7\u00e3o Semestre: 6 Contato: franciscopj@al.insper.edu.br Ano: 2022 GitHub Page : https://fran-janela.github.io/roteiro-proj-CompNuvem/ Como Operar com o meu programa: \u00b6 Warning O programa foi desenvolvido por uma \u00fanica pessoa, e existem algumas falhas na robustez da utiliza\u00e7\u00e3o, ou seja, \u00e9 da responsabilidade do usu\u00e1rio configurar adequadamente os campos durante a utiliza\u00e7\u00e3o para que a montagem n\u00e3o falhe. Ademais, aproveito para lembrar a import\u00e2ncia da prote\u00e7\u00e3o de suas chaves de acesso , utilize-as apenas em vari\u00e1veis de ambiente. Esta aplica\u00e7\u00e3o utiliza a cria\u00e7\u00e3o de um arquivo .env para armazen\u00e1-las. Mais sobre isso na aba de Pr\u00e9-Requisitos. Pr\u00e9-requisitos \u00b6 Para come\u00e7ar a operar com o meu programa, sigam o passo a passo indicado no readme do meu reposit\u00f3rio no github. Como usar \u00b6 Ao iniciar o programa pela primeira vez, o usu\u00e1rio se depara com a escolha entre a configura\u00e7\u00e3o das regi\u00f5es, podendo, nesse caminho, gerenciar inst\u00e2ncias, gerenciar security groups e levantar aplica\u00e7\u00f5es em HA (High Availability), e a configura\u00e7\u00e3o do ambiente do IAM, onde o usu\u00e1rio pode gerenciar usu\u00e1rios e pol\u00edticas(restri\u00e7\u00f5es). Para facilitar, a \u00e1rvore de navega\u00e7\u00e3o abaixo, pode trazer mais facilidade para o usu\u00e1rio se encontrar pelo programa: \u251c\u2500\u2500 Configura\u00e7\u00e3o de Regi\u00f5es \u2502 \u251c\u2500\u2500 Criar, deletar ou escolher uma regi\u00e3o \u2502 \u251c\u2500\u2500 Gerenciar Inst\u00e2ncias \u2502 \u2502 \u251c\u2500\u2500 Listar Inst\u00e2ncias \u2502 \u2502 \u251c\u2500\u2500 Criar Inst\u00e2ncia \u2502 \u2502 \u251c\u2500\u2500 Deletar Inst\u00e2ncia \u2502 \u2502 \u251c\u2500\u2500 Atualizar Configura\u00e7\u00e3o de uma Inst\u00e2ncia \u2502 \u2502 \u2514\u2500\u2500 Voltar \u2502 \u251c\u2500\u2500 Gerenciar Security Groups \u2502 \u2502 \u251c\u2500\u2500 Listar Security Groups \u2502 \u2502 \u251c\u2500\u2500 Criar Security Group \u2502 \u2502 \u251c\u2500\u2500 Deletar Security Group \u2502 \u2502 \u251c\u2500\u2500 Adicionar Regras a um Security Group \u2502 \u2502 \u251c\u2500\u2500 Deletar Regras de um Security Group \u2502 \u2502 \u2514\u2500\u2500 Voltar \u2502 \u2514\u2500\u2500 Gerenciar Aplica\u00e7\u00e3o em HA \u2502 \u251c\u2500\u2500 Listar Aplica\u00e7\u00e3o em HA \u2502 \u251c\u2500\u2500 Criar Aplica\u00e7\u00e3o em HA \u2502 \u251c\u2500\u2500 Deletar Aplica\u00e7\u00e3o em HA \u2502 \u2514\u2500\u2500 Voltar \u251c\u2500\u2500 Configura\u00e7\u00e3o do IAM \u2502 \u251c\u2500\u2500 Limpar ou Restaurar a Infraestrutura do IAM \u2502 \u251c\u2500\u2500 Gerenciar Usu\u00e1rios \u2502 \u2502 \u251c\u2500\u2500 Listar Usu\u00e1rios \u2502 \u2502 \u251c\u2500\u2500 Criar Usu\u00e1rio \u2502 \u2502 \u251c\u2500\u2500 Deletar Usu\u00e1rio \u2502 \u2502 \u251c\u2500\u2500 Adicionar Pol\u00edticas a um Usu\u00e1rio \u2502 \u2502 \u251c\u2500\u2500 Deletar Pol\u00edticas de um Usu\u00e1rio \u2502 \u2502 \u2514\u2500\u2500 Voltar \u2502 \u2514\u2500\u2500 Gerenciar Pol\u00edticas \u2502 \u251c\u2500\u2500 Listar Pol\u00edticas \u2502 \u251c\u2500\u2500 Importar Pol\u00edtica \u2502 \u2514\u2500\u2500 Voltar \u251c\u2500\u2500 Listar todas as Inst\u00e2ncias \u2514\u2500\u2500 Sair Em sua maioria, as instru\u00e7\u00f5es de uso de cada uma das funcionalidades est\u00e1 autocontida no pr\u00f3prio programa, mas existem algumas considera\u00e7\u00f5es que podem ser feitas: Configura\u00e7\u00e3o de Regi\u00f5es \u00b6 Criar, deletar ou escolher uma regi\u00e3o \u00b6 Ao criar uma regi\u00e3o em um uma daquelas dispon\u00edveis no programa, garanta que a sua conta possua permiss\u00f5es para faz\u00ea-lo, pois isso pode gerar um problema para o bom funcionamento da aplica\u00e7\u00e3o. Ao criar uma nova regi\u00e3o, autom\u00e1ticamente a infraestrutura b\u00e1sica \u00e9 copiada da pasta de sample para uma com o nome da regi\u00e3o, com a adi\u00e7\u00e3o do prefixo tf- . Ao escolher a op\u00e7\u00e3o de deletar uma regi\u00e3o, n\u00e3o existe confirma\u00e7\u00e3o necess\u00e1ria, e se o comando for executado, a regi\u00e3o ser\u00e1 deletada, ou seja, ir\u00e1 perder todos os recursos criados naquela regi\u00e3o de uma vez. Portanto, \u00e9 importante que o usu\u00e1rio tenha certeza de que deseja deletar a regi\u00e3o. Gerenciar Inst\u00e2ncias \u00b6 Ao Listar as Inst\u00e2ncias, o usu\u00e1rio deve escolher pelo n\u00famero mostrado na tela aquela que quer visualizar mais informa\u00e7\u00f5es. Ao Criar uma Inst\u00e2ncia, o usu\u00e1rio deve escolher o tipo de inst\u00e2ncia que deseja criar, e o nome da inst\u00e2ncia que deseja criar. O nome da inst\u00e2ncia deve ser \u00fanico, ou seja, n\u00e3o pode haver duas inst\u00e2ncias com o mesmo nome na mesma regi\u00e3o. Al\u00e9m disso, o n\u00famero de inst\u00e2ncias olocado \u00e9 a quantidade de r\u00e9plicas aquelas configura\u00e7\u00f5es que ir\u00e3o ser criadas. Por fim, o Sistema Operacional pr\u00e9 definido \u00e9 o Ubuntu Server 18.04 LTS . Warning O usu\u00e1rio deve ter criado previamente seu par de chaves na AWS para poder indic\u00e1-lo na cria\u00e7\u00e3o de uma inst\u00e2ncia e, por sua vez, poder acess\u00e1-lo via ssh posteriormente. Ao atualizar a configura\u00e7\u00e3o de uma inst\u00e2ncia estar\u00e1 mudando todas as r\u00e9plicas criadas. Quando for feita a mudan\u00e7a de n\u00famero de inst\u00e2ncias, ser\u00e1 sempre a com \u00edndice maior que ser\u00e1 deletada. Ao mudar os ids dos security groups, dever\u00e1 passar novamente todos aqueles que desejar aplicar \u00e0 inst\u00e2ncia, configura\u00e7\u00f5es antigas ser\u00e3o perdidas. Gerenciar Security Groups \u00b6 Ao Listar os Security Groups, o usu\u00e1rio deve escolher pelo n\u00famero mostrado na tela aquele que quer visualizar mais informa\u00e7\u00f5es. Ao Criar um Security Group, o usu\u00e1rio deve escolher o nome do Security Group que deseja criar. O nome do Security Group deve ser \u00fanico, ou seja, n\u00e3o pode haver dois Security Groups com o mesmo nome na mesma regi\u00e3o. Al\u00e9m disso, poder\u00e1 ser criado quantas regras de Ingress e Egress que o usu\u00e1rio desejar, se atentando somente \u00e0 libera\u00e7\u00e3o de todas as portas para n\u00e3o correr riscos de seguran\u00e7a. S\u00f3 ser\u00e1 poss\u00edvel deletar um Security Group se ele n\u00e3o estiver sendo usado, ou seja, se quiser delet\u00e1-lo, deve remover todas as depend\u00eancias dele nas inst\u00e2ncias da regi\u00e3o. Gerenciar Aplica\u00e7\u00e3o em HA \u00b6 Em primeiro lugar, a Aplica\u00e7\u00e3o em HA \u00e9 uma demo com funcionamento limitado, que permite a cria\u00e7\u00e3o de uma aplica\u00e7\u00e3o predefinida e utiliza sistemas de Auto Scalling e Load Balancing dispon\u00edveis na AWS. S\u00f3 \u00e9 poss\u00edvel criar em duas regi\u00f5es: us-east-1 e us-east-2 . S\u00f3 pode ser criada uma aplica\u00e7\u00e3o em HA por regi\u00e3o, ou seja, se j\u00e1 houver uma aplica\u00e7\u00e3o em HA criada na regi\u00e3o, n\u00e3o ser\u00e1 poss\u00edvel criar outra. Para pegar a URL da aplica\u00e7\u00e3o e poder acess\u00e1-la, basta listar a aplica\u00e7\u00e3o no programa. Configura\u00e7\u00e3o do IAM \u00b6 Limpar ou Restaurar a Infraestrutura do IAM \u00b6 Limpar a infraestrutura do IAM significa apagar todas as configura\u00e7\u00f5es pr\u00e9 criadas para usu\u00e1rios, mas todos as pol\u00edticas importadas continuar\u00e3o sendo criadas quando for restaurada a infraestrutura. A Infraestrutura vem configurada com 4 pol\u00edticas de teste: AdministratorAccess , AdminNorthVirginia , AdminOregon e AdminOhio . Essas pol\u00edticas s\u00e3o criadas automaticamente quando a infraestrutura \u00e9 restaurada, e n\u00e3o podem ser deletadas. Gerenciar Usu\u00e1rios \u00b6 Ao Listar os Usu\u00e1rios, desta vez o usu\u00e1rio n\u00e3o precisa escolher pelo n\u00famero mostrado na tela, pois o programa j\u00e1 ir\u00e1 mostrar as informa\u00e7\u00f5es de todos os usu\u00e1rios e todas as pol\u00edticas atreladas a eles. Ao Criar um Usu\u00e1rio, o usu\u00e1rio deve escolher o nome do Usu\u00e1rio que deseja criar. O nome do Usu\u00e1rio deve ser \u00fanico, ou seja, n\u00e3o pode haver dois Usu\u00e1rios com o mesmo nome na mesma regi\u00e3o. Al\u00e9m disso, a senha aparecer\u00e1 somente na cria\u00e7\u00e3o deste, ent\u00e3o guarde-a em um local seguro antes de continuar. Atrelar uma pol\u00edtica (restri\u00e7\u00e3o) ao usu\u00e1rio, deve ser feita posteriormente com a fun\u00e7\u00e3o de adicionar pol\u00edticas. Ao deletar um Usu\u00e1rio, o usu\u00e1rio n\u00e3o poder\u00e1 ser recuperado, e todas as configura\u00e7\u00f5es de pol\u00edticas atreladas tamb\u00e9m ser\u00e3o descartadas, mas as pol\u00edticas em si ainda continuar\u00e3o existindo. Gerenciar Pol\u00edticas \u00b6 Ao Listar as Pol\u00edticas, o usu\u00e1rio deve escolher pelo n\u00famero mostrado na tela aquela que quer visualizar mais informa\u00e7\u00f5es. Para importar uma pol\u00edtica, o usu\u00e1rio deve passar o path completo do arquivo .json . Caso seja um arquivo v\u00e1lido, a regra ser\u00e1 criada e permanentemente adicionada ao seu reposit\u00f3rio de pol\u00edticas. Para delet\u00e1-la, deve apagar o arquivo .json criado em iam/policies/ . O nome da pol\u00edtica ser\u00e1 o nome do arquivo, sem a extens\u00e3o. Para facilitar a cria\u00e7\u00e3o, construa a pol\u00edtica pela dashboard da AWS e copie o conte\u00fado do arquivo .json gerado. Roteiro DIY \u00b6 Come\u00e7ando \u00b6 Para seguir esse tutorial \u00e9 necess\u00e1rio: Tecnologias: Terraform, Python Documentos: Terraform AWS Docs Pr\u00e9-Requisitos: aqueles anteriormente destacados para o funcionamento do programa e uma conta na AWS com permiss\u00f5es de administrador e suas credenciais. Danger ATEN\u00c7\u00c3O: Estas pr\u00f3ximas etapas ser\u00e3o feitas para vias de estudo, n\u00e3o \u00e9 recomendado que sejam feitas em um ambiente de produ\u00e7\u00e3o. Al\u00e9m disso, as chaves que ser\u00e3o utilizadas s\u00e3o extremamente sens\u00edveis, ent\u00e3o n\u00e3o as compartilhe com ningu\u00e9m, muito menos disponibilize-as no GitHub ou similares. Daqui em diante \u00e9 por sua conta e risco. O que \u00e9 Terraform? \u00b6 Terraform \u00e9 uma ferramenta de infraestrutura por c\u00f3digo, desenvolvida pela HashiCorp , que te permite definir, tanto para Cloud P\u00fablica , quanto para Cloud Privada , recursos de infraestrutura em c\u00f3digo poss\u00edvel de ser lido pelo ser humano e pelo computador, podendo ser versionado, reutiliz\u00e1do e compartilhado. Terraform e AWS \u00b6 A HashiCorp disponibiliza uma s\u00e9rie de m\u00f3dulos para os recursos na aws que podem ser copiados e reconfigurados para construir a sua infraestrutura. Para facilitar a sua pesquisa, a documenta\u00e7\u00e3o no link acima \u00e9 de grande utilidade. Existem 4 grandes tipos de m\u00f3dulos que ser\u00e3o explorados neste roteiro, s\u00e3o eles: Provider: \u00e9 o m\u00f3dulo que permite a comunica\u00e7\u00e3o com a AWS, e \u00e9 o primeiro m\u00f3dulo que deve ser importado. Ele \u00e9 respons\u00e1vel por definir a regi\u00e3o que ser\u00e1 utilizada, e tamb\u00e9m as credenciais de acesso. Resource: \u00e9 o m\u00f3dulo que define os recursos que ser\u00e3o utilizados na AWS. Por exemplo, se voc\u00ea deseja criar uma inst\u00e2ncia EC2, voc\u00ea deve importar o m\u00f3dulo aws_instance e configurar os par\u00e2metros necess\u00e1rios para a cria\u00e7\u00e3o da inst\u00e2ncia. Data: \u00e9 o m\u00f3dulo que permite a consulta de informa\u00e7\u00f5es de recursos j\u00e1 existentes na AWS. Por exemplo, se voc\u00ea deseja consultar o ID de uma inst\u00e2ncia EC2, voc\u00ea deve importar o m\u00f3dulo aws_instance e configurar os par\u00e2metros necess\u00e1rios para a consulta da inst\u00e2ncia. Output: \u00e9 o m\u00f3dulo que permite a visualiza\u00e7\u00e3o de informa\u00e7\u00f5es de recursos j\u00e1 existentes na AWS. Por exemplo, se voc\u00ea deseja visualizar o ID de uma inst\u00e2ncia EC2, voc\u00ea deve importar o m\u00f3dulo aws_instance e configurar os par\u00e2metros necess\u00e1rios para a visualiza\u00e7\u00e3o da inst\u00e2ncia. Criando a Infraestrutura B\u00e1sica para o roteiro \u00b6 Em primeiro lugar, defina um diret\u00f3rio(pasta) para o seu projeto. Isso vai ser importante para posteriormente replicar o que foi feito e poder escalar para a constru\u00e7\u00e3o de uma infraestrutura maior com o aux\u00edlio de uma aplica\u00e7\u00e3o em python . D\u00ea o nome de sample para o diret\u00f3rio, pois ele ser\u00e1 a amostra replicada para cada regi\u00e3o. Para este tutorial iremos utilizar somente a regi\u00e3o us-east-1 (Norte da Virg\u00ednia). Dentro deste diret\u00f3rio, crie um arquivo chamado main.tf e outro chamado variables.tf . O primeiro ser\u00e1 respons\u00e1vel por definir os providers necess\u00e1rios e iniciar a estrutura do terraform, e o segundo ser\u00e1 respons\u00e1vel por definir as vari\u00e1veis que ser\u00e3o utilizadas para a cria\u00e7\u00e3o dos recursos. Dentro do arquivo main.tf , insira o seguinte c\u00f3digo: terraform { required_providers { aws = { source = \"hashicorp/aws\" version = \"~> 4.16\" } } required_version = \">= 1.2.0\" } Este Snipet de c\u00f3digo \u00e9 respons\u00e1vel, ent\u00e3o, por definir a vers\u00e3o do terraform que ser\u00e1 utilizada e tamb\u00e9m a vers\u00e3o do provider aws que ser\u00e1 necess\u00e1rio. Al\u00e9m disso, \u00e9 necess\u00e1rio definir, em si, a regi\u00e3o do provider e passar a ele as credenciais para poder acessar a sua AWS. Em um novo arquivo provider.tf , insira o seguinte c\u00f3digo: provider \"aws\" { region = var.region access_key = var.AWS_ACCESS_KEY_ID secret_key = var.AWS_SECRET_ACCESS_KEY } E no arquivo j\u00e1 criado variables.tf , insira o seguinte c\u00f3digo: variable \"region\" { type = string default = \"us-east-1\" } variable \"AWS_ACCESS_KEY_ID\" { type = string sensitive = true } variable \"AWS_SECRET_ACCESS_KEY\" { type = string sensitive = true } Info O arquivo variables.tf \u00e9 respons\u00e1vel por definir as vari\u00e1veis que ser\u00e3o utilizadas na infraestrutura do Terraform. O par\u00e2metro sensitive = true \u00e9 respons\u00e1vel por ocultar a vari\u00e1vel quando for executado o comando terraform plan ou terraform apply . Agora, execute o comando terraform init para que o terraform baixe os providers necess\u00e1rios para a cria\u00e7\u00e3o da infraestrutura. terraform init Definindo as vari\u00e1veis para o c\u00f3digo: \u00b6 Anteriormente foi falado da import\u00e2ncia de manter o sigilo quanto \u00e0s chaves de acesso \u00e0 AWS , e, portanto, iremos precisar de um arquivo que as contenha, e ao mesmo tempo, n\u00e3o seja enviado para nenhum reposit\u00f3rio aberto. O Terraform consegue ler um arquivo e dele extrair as vari\u00e1veis que ser\u00e3o utilizadas na infraestrutura. Para isso, crie um arquivo chamado config.tfvars.json dentro de uma pasta config . \u00c9 importante que estes estejam descritos no seu arquivo .gitignore ou similares. Adicione o conte\u00fado a esse arquivo: { \"region\" : \"us-east-1\" , \"AWS_ACCESS_KEY_ID\" : [ \"SEU_ID_CHAVE\" ], \"AWS_SECRET_ACCESS_KEY\" : [ \"SUA_SECRET_KEY\" ] } O arquivo variables.tf ser\u00e1 respons\u00e1vel por informar ao terraform quais as vari\u00e1veis que ser\u00e3o necess\u00e1rias e quais os seus tipos. O arquivo config.tfvars.json ser\u00e1 respons\u00e1vel por informar ao terraform quais os valores que ser\u00e3o utilizados para as vari\u00e1veis. Agora, podemos aplicar a nossa infraestrutura. Para isso, execute o comando terraform apply e informe o arquivo config.tfvars.json como vari\u00e1vel de entrada. terraform apply -var-file=config/config.tfvars.json Criando a Infraestrutura de Rede \u00b6 Agora que j\u00e1 temos a infraestrutura b\u00e1sica criada, podemos come\u00e7ar a criar a infraestrutura de rede. Para isso, iremos criar um arquivo chamado network.tf e nele iremos definir os recursos que ser\u00e3o utilizados para a cria\u00e7\u00e3o da infraestrutura de rede. Para a cria\u00e7\u00e3o de rede, vamos come\u00e7ar a exercitar a pesquisa na documenta\u00e7\u00e3o do terraform. Crie um recurso para cada uma das seguintes funcionalidades e adicione os par\u00e2metros tamb\u00e9m descritos: VPC: cidr_block, instance_tenancy, enable_dns_support, enable_dns_hostnames e tags={Name} Subnet: vpc_id, cidr_block, map_public_ip_on_launch e tags={Name} Internet Gateway: vpc_id e tags={Name} Route Table: vpc_id e tags={Name} Route: route_table_id, destination_cidr_block e gateway_id Route Table Association: subnet_id e route_table_id Para as configura\u00e7\u00f5es de rede, adicione ao arquivo variables.tf as seguintes vari\u00e1veis: variable \"network_configurations\" { type = object ({ vpcCIDRblock = string instanceTenancy = string dnsSupport = bool dnsHostNames = bool publicsCIDRblock = string mapPublicIP = bool publicdestCIDRblock = string }) } E como exemplo, adicione ao arquivo config.tfvars.json as seguintes configura\u00e7\u00f5es: \"network_configurations\" : { \"vpcCIDRblock\" : \"172.16.0.0/16\" , \"instanceTenancy\" : \"default\" , \"dnsSupport\" : true , \"dnsHostNames\" : true , \"publicsCIDRblock\" : \"172.16.10.0/24\" , \"mapPublicIP\" : true , \"publicdestCIDRblock\" : \"0.0.0.0/0\" } O restante das vari\u00e1veis, associe diretamente no arquivo network.tf , utilizando a seguinte estrutura: variavel = [ recurso ].[ nome_do_recurso ].[ vari\u00e1vel_desejada ] # Exemplo: vpc_id = aws_vpc.VPC.id Criando Inst\u00e2ncias EC2 \u00b6 A cria\u00e7\u00e3o de inst\u00e2ncias vai nos trazer alguns conceitos extremamente interessantes para a escalabilidade da nossa aplica\u00e7\u00e3o no terraform, s\u00e3o estes: count , for_each , e locals . Vamos come\u00e7ar pelo b\u00e1sico. Crie uma inst\u00e2ncia usando o recurso aws_instance no arquivo instances.tf . Realize o Apply da infraestrutura e veja sua inst\u00e2ncia sendo criada. Utilizando a m\u00f3dulo de output do terraform, crie um output para a inst\u00e2ncia criada. O output deve conter o id da inst\u00e2ncia e o DNS p\u00fablico e estar\u00e1 localizado no arquivo gerado autom\u00e1ticamente terraform.tfstate . Escalando com o count \u00b6 Com o argumento count dentro da defini\u00e7\u00e3o do recurso, crie 3 inst\u00e2ncias EC2. Execute o terraform apply e veja as 3 inst\u00e2ncias sendo criadas. O count \u00e9 um sistema de cria\u00e7\u00e3o em massa de inst\u00e2ncias com as mesmas configura\u00e7\u00f5es, e deve ser usado para rapidamente construir um grupo de m\u00e1quinas com as mesmas configura\u00e7\u00f5es para provavelmente a mesma aplica\u00e7\u00e3o. Para possuir maior controle sobre o m\u00faltiplo deploy de inst\u00e2ncias, \u00e9 mais recomendado usar o for_each . Escalando com o for_each \u00b6 Em primeiro lugar, o for_each ir\u00e1 utilizar da configura\u00e7\u00e3o de vari\u00e1veis no formato de list ou map para criar m\u00faltiplas inst\u00e2ncias com configura\u00e7\u00f5es diferentes. Para isso, vamos criar uma vari\u00e1vel no arquivo variables.tf : variable \"instances_configuration\" { type = list ( object ({ instance_name = string instance_type = string ami = string key_name = string })) } O tipo list indica ao terraform que a vari\u00e1vel \u00e9 uma lista e deve ser percorrida pelo for_each . J\u00e1 o tipo object indica que a vari\u00e1vel \u00e9 um objeto, ou seja, um conjunto de vari\u00e1veis definidas, que podem ser acessadas pela sua chave. No arquivo de vari\u00e0veis .json , deve ser construido os valores da forma descrita acima. O recurso da inst\u00e2ncia com a constru\u00e7\u00e3o do for_each deve ser similar a: resource \"aws_instance\" \"web\" { for_each = { for instance in var.instances_configuration : instance.instance_name = > instance } ami = each.value.ami instance_type = each.value.instance_type subnet_id = aws_subnet.Subnet.id key_name = each.value.key_name tags = { Name = \"${each.value.instance_name}\" } } OBS.: Note que para indicar o valor de cada inst\u00e2ncia \u00e9 usado o complemento each.value Crie 3 inst\u00e2ncias diferentes com este m\u00e9todo. Escalando com o for_each e count \u00b6 \u00c9 de certo que n\u00e3o \u00e9 poss\u00edvel usar ambas as configura\u00e7\u00f5es for_each e count no mesmo recurso, mas podemos contornar essa situa\u00e7\u00e3o. Para isso, adicione uma vari\u00e0vel ao conjunto de vari\u00e1veis de configura\u00e7\u00e3o das inst\u00e2ncias que indicar\u00e1 a quantidade delas a serem criadas. Em seguida vamos utilizar as vari\u00e1veis locais , com o argumento locals . Construindo baseado na ideia de replicar a configura\u00e7\u00e3o definida para a quantidade de inst\u00e2ncias, basta criar um for que atenda a essa quantidade e adicione v\u00e1rias vezes a mesma configura\u00e7\u00e3o mudando apenas o nome, com o acr\u00e9scimo de um n\u00famero que indique ind\u00edce, por exemplo. Al\u00e9m disso, para aplicar tais configura\u00e7\u00f5es locais, as informa\u00e7\u00f5es devem ser passadas pela fun\u00e7\u00e3o de flatten . No final, a sua inst\u00e2ncia deve possuir o seguinte formato: locals { serverconfig = [ for srv in var.instances_configuration : [ for i in range ( 1 , srv.no_of_instances + 1 ) : { instance_name = \"${srv.instance_name}-${i}\" instance_type = srv.instance_type ami = srv.ami security_groups_ids = srv.security_groups_ids key_name = srv.key_name } ] ] } locals { instances = flatten ( local.serverconfig ) } resource \"aws_instance\" \"web\" { for_each = { for server in local.instances : server.instance_name = > server } ami = each.value.ami instance_type = each.value.instance_type subnet_id = aws_subnet.Subnet.id vpc_security_group_ids = each.value.security_groups_ids key_name = each.value.key_name tags = { Name = \"${each.value.instance_name}\" } } output \"instances\" { value = [ for instance in aws_instance.web : instance ] description = \"All Machine details\" } Criando Security Groups \u00b6 Para a cria\u00e7\u00e3o dos security groups, vamos utilizar o m\u00e9todo do for_each pensando na escalabilidade da solu\u00e7\u00e3o. Al\u00e9m disso, na AWS \u00e9 poss\u00edvel adicionar v\u00e1rias regras tanto de Ingress (Inbound) quanto de Egress (Outbound) ao mesmo tempo, portanto, nossa aplica\u00e7\u00e3o tamb\u00e9m deve conseguir faz\u00ea-lo. Crie o arquivo security_groups.tf e construa as suas configura\u00e7\u00f5es. Dica Para criar m\u00faltiplas regras de Ingress e Egress , utilize vari\u00e1veis do tipo dynamic . Teste criando 2 grupos de seguran\u00e7a, um com uma regra de Ingress e duas regras de Egress e outro com duas regras de Ingress e uma regra de Egress . Aplicando o security group nas inst\u00e2ncias \u00b6 Utilizando a fun\u00e7\u00e3o de output , \u00e9 poss\u00edvel coletar o ID do Security Group definido autom\u00e1ticamente pela AWS. Para atrel\u00e1-lo a uma inst\u00e2ncia use a vari\u00e1vel do recurso aws_instance chamada vpc_security_group_ids e passe uma lista de IDs de Security Groups como valor. Crie um Security Group que libere a conex\u00e3o SSH e associe-o a uma inst\u00e2ncia Junto com o par de chaves criado e associado a key_name , teste o acesso \u00e0 inst\u00e2ncia. Criando Infraestrutura para o IAM \u00b6 Para a cria\u00e7\u00e3o da estrutura no IAM, ser\u00e3o necess\u00e1rios 2 recursos principais: o usu\u00e1rio em si e as policies (pol\u00edticas ou restri\u00e7\u00f5es) de acesso. Al\u00e9m disso, s\u00e3o necess\u00e1rios recursos que criem o usu\u00e1rio e atrelem a ele uma senha autom\u00e1tica (que pode ser exportada como output ), um recurso que crie o documento da pol\u00edtica, para facilitar a implementa\u00e7\u00e3o, e recursos que criem a conex\u00e3o entre o usu\u00e1rio e a pol\u00edtica. Crie o arquivo policies.tf e construa as suas configura\u00e7\u00f5es. Dica Para atrelar um documento a uma pol\u00edtica, use a seguinte vari\u00e1vel e sua configura\u00e7\u00e3o: terraform policy = data.aws_iam_policy_document.ec2_policy[each.value.name].json Crie o arquivo users.tf e construa as suas configura\u00e7\u00f5es. Associe uma pol\u00edtica criada a um usu\u00e1rio atrav\u00e9s do recurso aws_iam_user_policy_attachment . Dica Crie uma vari\u00e0vel para cada uma das configura\u00e7\u00f5es acima, ou seja, uma vari\u00e1vel para a configura\u00e7\u00e3o de pol\u00edticas, outra para a configura\u00e7\u00e3o de usu\u00e1rios e outra para a configura\u00e7\u00e3o de atrelamento de pol\u00edticas a usu\u00e1rios. Teste a cria\u00e7\u00e3o de um usu\u00e1rio com a restri\u00e7\u00e3o de acesso \u00e0 regi\u00e3o da North Virginia. A pol\u00edtica criada para isso est\u00e1 abaixo: { \"Version\" : \"2012-10-17\" , \"Statement\" : [ { \"Effect\" : \"Allow\" , \"Action\" : \"*\" , \"Resource\" : \"*\" , \"Condition\" : { \"StringEquals\" : { \"aws:RequestedRegion\" : \"us-east-1\" } } } ] } Criando m\u00faltiplas Regi\u00f5es \u00b6 Como os usu\u00e1rios s\u00e3o globais, n\u00e3o vamos nos preocupar com suas configura\u00e7\u00f5es para cada inst\u00e2ncia, eles podem receber sua pasta separada para gerenciamento de infraestrutura. Pensando, ent\u00e3o, nos outros arquivos, ou seja, main.tf , provider.tf , network.tf , instances.tf , security_groups.tf , para criar uma nova regi\u00e3o, basta replicar todo o diret\u00f3rio, mudando apenas no arquivo de configura\u00e7\u00f5es .json a regi\u00e3o do provider . Crie duas pastas com essa infraestrutura, uma para a regi\u00e3o da North Virginia e outra para a regi\u00e3o de Ohio. Teste a cria\u00e7\u00e3o de uma inst\u00e2ncia em cada regi\u00e3o. OBS.: Aplique o comando de init e apply em cada uma das pastas criadas. Criando um HA de servidores web \u00b6 Configurando uma Imagem Base \u00b6 Para a cria\u00e7\u00e3o de um HA de servidores web, \u00e9 necess\u00e1rio primeiro criar uma imagem( ami ) que funcionar\u00e1 como template para a cria\u00e7\u00e3o de inst\u00e2ncias caso as m\u00e1quinas base estejam ficando sobre-lotadas. Crie uma inst\u00e2ncia com o sistema operacional Ubuntu Server 18.04 LTS. Aplique: sudo apt update; sudo apt install nodejs build-essential -y Edite um arquivo server.js: #!/usr/bin/env nodejs var http = require ( \"http\" ); var os = require ( \"os\" ); var crypto = require ( \"crypto\" ); http . createServer ( function ( req , res ) { res . writeHead ( 200 , { \"Content-Type\" : \"text/plain\" }); var nonce = 1 ; var seed = Math . random (); var h = crypto . createHash ( \"sha256\" ); h . update ( new Buffer ( nonce + \" Hello World \" + seed )); while ( h . digest ( \"hex\" ). substr ( 0 , 3 ) != \"000\" ) { h = crypto . createHash ( \"sha256\" ); nonce ++ ; h . update ( new Buffer ( nonce + \" Hello World \" + seed )); } res . end ( '{ \"host\": ' + os . hostname () + ', \"nonce\": ' + nonce + \"}\" ); }) . listen ( 8080 , \"\" ); console . log ( \"Server running at http://localhost:8080/\" ); Torne o arquivo execut\u00e1vel: chmod +x ./server.js Execute e teste o servidor(lembre-se de liberar a porta no security group): Configure a m\u00e1quina para iniciar o servidor automaticamente ap\u00f3s reboot : crontab -e\\ @reboot /home/ubuntu/server.js D\u00ea reboot e teste o acesso ao servidor novamente. Copywright O procedimento foi retirado do site oficial da mat\u00e9ria . Com o template de inst\u00e2ncia criado, gere uma imagem dele pela dashboard da AWS e salve a ami gerada para uso no pr\u00f3ximos passos. Criando os recursos para o HA \u00b6 Para construir o HA, vamos utilizar o recurso aws_autoscaling_group , emparelhado com aws_launch_configuration e tamb\u00e9m aws_lb ( Load Balence ). Para isso, construa a infraestrutura baseada neste tutorial: Tutorial de HA . Ele foi produzido pela Hashicorp, empresa que desenvolve o Terraform, mas em caso de d\u00favida, o resultado esperado se encontra dentro da pasta sample-HA no reposit\u00f3rio do meu programa. ??? Dicas - Crie Security Groups diferentes para o Load Balencer e para configura\u00e7\u00e3o das inst\u00e2ncias. - S\u00e3o necess\u00e1rias 3 *Subnets* para a cria\u00e7\u00e3o do *Load Balencer*. Crie seu Pr\u00f3prio Programa. \u00b6 Com toda a experi\u00eancia adquirida na formata\u00e7\u00e3o, constru\u00e7\u00e3o e manipula\u00e7\u00e3o da infraestrutura por meio do terraform, agora voc\u00ea \u00e9 capaz de criar o seu pr\u00f3rpio programa. Eu criei, utilizando Python , uma ferramenta que roda no terminal e executa as opera\u00e7\u00f5es descritas acima, de forma automatizada. Para isso, a aplica\u00e7\u00e3o copia os arquivos de base, armazenados na pasta sample para uma nova pasta com o nome da regi\u00e3o, configura o arquivo .tvars.json com as informa\u00e7\u00f5es descritas pelo usu\u00e1rio e executa o terraform para a cria\u00e7\u00e3o da infraestrutura. O seu programa pode ser criado via Python ou qualquer outra linguagem que voc\u00ea se sinta confort\u00e1vel para manipula\u00e7\u00e3o de arquivos e execu\u00e7\u00e3o de comandos. \u00c9 poss\u00edvel, tamb\u00e9m, que essas configura\u00e7\u00f5es sejam feitas via backend e toda a interface de usu\u00e1rio seja feita via frontend em outra linguagem, uma vez que toda a configura\u00e7\u00e3o da infraestrutura pode ser enviada via .json para o backend. Aqui o c\u00e9u \u00e9 o limite! Use a sua criatividade! Motiva\u00e7\u00e3o \u00b6 Minha motiva\u00e7\u00e3o para a cria\u00e7\u00e3o desta aplica\u00e7\u00e3o e, consequentemente, este tutorial veio da crescente vontade de aprender sobre infraestrutura e Computa\u00e7\u00e3o Nuvem, o que me motivou a tentar produzir algo robusto e confi\u00e1vel, que pudesse ser utilizado por pessoas com algum conhecimento em infraestrutura, assim como eu, mas com a vontade de aprender.","title":"Francisco Janela"},{"location":"projetos_2022/fran-janela/#infraestrutura-por-codigo","text":"Aplica\u00e7\u00e3o em Python para gerenciar infraestrutura constru\u00edda com Terraform. Aluno: Francisco Pinheiro Janela Curso: Engenharia da Computa\u00e7\u00e3o Semestre: 6 Contato: franciscopj@al.insper.edu.br Ano: 2022 GitHub Page : https://fran-janela.github.io/roteiro-proj-CompNuvem/","title":"Infraestrutura por C\u00f3digo"},{"location":"projetos_2022/fran-janela/#como-operar-com-o-meu-programa","text":"Warning O programa foi desenvolvido por uma \u00fanica pessoa, e existem algumas falhas na robustez da utiliza\u00e7\u00e3o, ou seja, \u00e9 da responsabilidade do usu\u00e1rio configurar adequadamente os campos durante a utiliza\u00e7\u00e3o para que a montagem n\u00e3o falhe. Ademais, aproveito para lembrar a import\u00e2ncia da prote\u00e7\u00e3o de suas chaves de acesso , utilize-as apenas em vari\u00e1veis de ambiente. Esta aplica\u00e7\u00e3o utiliza a cria\u00e7\u00e3o de um arquivo .env para armazen\u00e1-las. Mais sobre isso na aba de Pr\u00e9-Requisitos.","title":"Como Operar com o meu programa:"},{"location":"projetos_2022/fran-janela/#pre-requisitos","text":"Para come\u00e7ar a operar com o meu programa, sigam o passo a passo indicado no readme do meu reposit\u00f3rio no github.","title":"Pr\u00e9-requisitos"},{"location":"projetos_2022/fran-janela/#como-usar","text":"Ao iniciar o programa pela primeira vez, o usu\u00e1rio se depara com a escolha entre a configura\u00e7\u00e3o das regi\u00f5es, podendo, nesse caminho, gerenciar inst\u00e2ncias, gerenciar security groups e levantar aplica\u00e7\u00f5es em HA (High Availability), e a configura\u00e7\u00e3o do ambiente do IAM, onde o usu\u00e1rio pode gerenciar usu\u00e1rios e pol\u00edticas(restri\u00e7\u00f5es). Para facilitar, a \u00e1rvore de navega\u00e7\u00e3o abaixo, pode trazer mais facilidade para o usu\u00e1rio se encontrar pelo programa: \u251c\u2500\u2500 Configura\u00e7\u00e3o de Regi\u00f5es \u2502 \u251c\u2500\u2500 Criar, deletar ou escolher uma regi\u00e3o \u2502 \u251c\u2500\u2500 Gerenciar Inst\u00e2ncias \u2502 \u2502 \u251c\u2500\u2500 Listar Inst\u00e2ncias \u2502 \u2502 \u251c\u2500\u2500 Criar Inst\u00e2ncia \u2502 \u2502 \u251c\u2500\u2500 Deletar Inst\u00e2ncia \u2502 \u2502 \u251c\u2500\u2500 Atualizar Configura\u00e7\u00e3o de uma Inst\u00e2ncia \u2502 \u2502 \u2514\u2500\u2500 Voltar \u2502 \u251c\u2500\u2500 Gerenciar Security Groups \u2502 \u2502 \u251c\u2500\u2500 Listar Security Groups \u2502 \u2502 \u251c\u2500\u2500 Criar Security Group \u2502 \u2502 \u251c\u2500\u2500 Deletar Security Group \u2502 \u2502 \u251c\u2500\u2500 Adicionar Regras a um Security Group \u2502 \u2502 \u251c\u2500\u2500 Deletar Regras de um Security Group \u2502 \u2502 \u2514\u2500\u2500 Voltar \u2502 \u2514\u2500\u2500 Gerenciar Aplica\u00e7\u00e3o em HA \u2502 \u251c\u2500\u2500 Listar Aplica\u00e7\u00e3o em HA \u2502 \u251c\u2500\u2500 Criar Aplica\u00e7\u00e3o em HA \u2502 \u251c\u2500\u2500 Deletar Aplica\u00e7\u00e3o em HA \u2502 \u2514\u2500\u2500 Voltar \u251c\u2500\u2500 Configura\u00e7\u00e3o do IAM \u2502 \u251c\u2500\u2500 Limpar ou Restaurar a Infraestrutura do IAM \u2502 \u251c\u2500\u2500 Gerenciar Usu\u00e1rios \u2502 \u2502 \u251c\u2500\u2500 Listar Usu\u00e1rios \u2502 \u2502 \u251c\u2500\u2500 Criar Usu\u00e1rio \u2502 \u2502 \u251c\u2500\u2500 Deletar Usu\u00e1rio \u2502 \u2502 \u251c\u2500\u2500 Adicionar Pol\u00edticas a um Usu\u00e1rio \u2502 \u2502 \u251c\u2500\u2500 Deletar Pol\u00edticas de um Usu\u00e1rio \u2502 \u2502 \u2514\u2500\u2500 Voltar \u2502 \u2514\u2500\u2500 Gerenciar Pol\u00edticas \u2502 \u251c\u2500\u2500 Listar Pol\u00edticas \u2502 \u251c\u2500\u2500 Importar Pol\u00edtica \u2502 \u2514\u2500\u2500 Voltar \u251c\u2500\u2500 Listar todas as Inst\u00e2ncias \u2514\u2500\u2500 Sair Em sua maioria, as instru\u00e7\u00f5es de uso de cada uma das funcionalidades est\u00e1 autocontida no pr\u00f3prio programa, mas existem algumas considera\u00e7\u00f5es que podem ser feitas:","title":"Como usar"},{"location":"projetos_2022/fran-janela/#configuracao-de-regioes","text":"","title":"Configura\u00e7\u00e3o de Regi\u00f5es"},{"location":"projetos_2022/fran-janela/#criar-deletar-ou-escolher-uma-regiao","text":"Ao criar uma regi\u00e3o em um uma daquelas dispon\u00edveis no programa, garanta que a sua conta possua permiss\u00f5es para faz\u00ea-lo, pois isso pode gerar um problema para o bom funcionamento da aplica\u00e7\u00e3o. Ao criar uma nova regi\u00e3o, autom\u00e1ticamente a infraestrutura b\u00e1sica \u00e9 copiada da pasta de sample para uma com o nome da regi\u00e3o, com a adi\u00e7\u00e3o do prefixo tf- . Ao escolher a op\u00e7\u00e3o de deletar uma regi\u00e3o, n\u00e3o existe confirma\u00e7\u00e3o necess\u00e1ria, e se o comando for executado, a regi\u00e3o ser\u00e1 deletada, ou seja, ir\u00e1 perder todos os recursos criados naquela regi\u00e3o de uma vez. Portanto, \u00e9 importante que o usu\u00e1rio tenha certeza de que deseja deletar a regi\u00e3o.","title":"Criar, deletar ou escolher uma regi\u00e3o"},{"location":"projetos_2022/fran-janela/#gerenciar-instancias","text":"Ao Listar as Inst\u00e2ncias, o usu\u00e1rio deve escolher pelo n\u00famero mostrado na tela aquela que quer visualizar mais informa\u00e7\u00f5es. Ao Criar uma Inst\u00e2ncia, o usu\u00e1rio deve escolher o tipo de inst\u00e2ncia que deseja criar, e o nome da inst\u00e2ncia que deseja criar. O nome da inst\u00e2ncia deve ser \u00fanico, ou seja, n\u00e3o pode haver duas inst\u00e2ncias com o mesmo nome na mesma regi\u00e3o. Al\u00e9m disso, o n\u00famero de inst\u00e2ncias olocado \u00e9 a quantidade de r\u00e9plicas aquelas configura\u00e7\u00f5es que ir\u00e3o ser criadas. Por fim, o Sistema Operacional pr\u00e9 definido \u00e9 o Ubuntu Server 18.04 LTS . Warning O usu\u00e1rio deve ter criado previamente seu par de chaves na AWS para poder indic\u00e1-lo na cria\u00e7\u00e3o de uma inst\u00e2ncia e, por sua vez, poder acess\u00e1-lo via ssh posteriormente. Ao atualizar a configura\u00e7\u00e3o de uma inst\u00e2ncia estar\u00e1 mudando todas as r\u00e9plicas criadas. Quando for feita a mudan\u00e7a de n\u00famero de inst\u00e2ncias, ser\u00e1 sempre a com \u00edndice maior que ser\u00e1 deletada. Ao mudar os ids dos security groups, dever\u00e1 passar novamente todos aqueles que desejar aplicar \u00e0 inst\u00e2ncia, configura\u00e7\u00f5es antigas ser\u00e3o perdidas.","title":"Gerenciar Inst\u00e2ncias"},{"location":"projetos_2022/fran-janela/#gerenciar-security-groups","text":"Ao Listar os Security Groups, o usu\u00e1rio deve escolher pelo n\u00famero mostrado na tela aquele que quer visualizar mais informa\u00e7\u00f5es. Ao Criar um Security Group, o usu\u00e1rio deve escolher o nome do Security Group que deseja criar. O nome do Security Group deve ser \u00fanico, ou seja, n\u00e3o pode haver dois Security Groups com o mesmo nome na mesma regi\u00e3o. Al\u00e9m disso, poder\u00e1 ser criado quantas regras de Ingress e Egress que o usu\u00e1rio desejar, se atentando somente \u00e0 libera\u00e7\u00e3o de todas as portas para n\u00e3o correr riscos de seguran\u00e7a. S\u00f3 ser\u00e1 poss\u00edvel deletar um Security Group se ele n\u00e3o estiver sendo usado, ou seja, se quiser delet\u00e1-lo, deve remover todas as depend\u00eancias dele nas inst\u00e2ncias da regi\u00e3o.","title":"Gerenciar Security Groups"},{"location":"projetos_2022/fran-janela/#gerenciar-aplicacao-em-ha","text":"Em primeiro lugar, a Aplica\u00e7\u00e3o em HA \u00e9 uma demo com funcionamento limitado, que permite a cria\u00e7\u00e3o de uma aplica\u00e7\u00e3o predefinida e utiliza sistemas de Auto Scalling e Load Balancing dispon\u00edveis na AWS. S\u00f3 \u00e9 poss\u00edvel criar em duas regi\u00f5es: us-east-1 e us-east-2 . S\u00f3 pode ser criada uma aplica\u00e7\u00e3o em HA por regi\u00e3o, ou seja, se j\u00e1 houver uma aplica\u00e7\u00e3o em HA criada na regi\u00e3o, n\u00e3o ser\u00e1 poss\u00edvel criar outra. Para pegar a URL da aplica\u00e7\u00e3o e poder acess\u00e1-la, basta listar a aplica\u00e7\u00e3o no programa.","title":"Gerenciar Aplica\u00e7\u00e3o em HA"},{"location":"projetos_2022/fran-janela/#configuracao-do-iam","text":"","title":"Configura\u00e7\u00e3o do IAM"},{"location":"projetos_2022/fran-janela/#limpar-ou-restaurar-a-infraestrutura-do-iam","text":"Limpar a infraestrutura do IAM significa apagar todas as configura\u00e7\u00f5es pr\u00e9 criadas para usu\u00e1rios, mas todos as pol\u00edticas importadas continuar\u00e3o sendo criadas quando for restaurada a infraestrutura. A Infraestrutura vem configurada com 4 pol\u00edticas de teste: AdministratorAccess , AdminNorthVirginia , AdminOregon e AdminOhio . Essas pol\u00edticas s\u00e3o criadas automaticamente quando a infraestrutura \u00e9 restaurada, e n\u00e3o podem ser deletadas.","title":"Limpar ou Restaurar a Infraestrutura do IAM"},{"location":"projetos_2022/fran-janela/#gerenciar-usuarios","text":"Ao Listar os Usu\u00e1rios, desta vez o usu\u00e1rio n\u00e3o precisa escolher pelo n\u00famero mostrado na tela, pois o programa j\u00e1 ir\u00e1 mostrar as informa\u00e7\u00f5es de todos os usu\u00e1rios e todas as pol\u00edticas atreladas a eles. Ao Criar um Usu\u00e1rio, o usu\u00e1rio deve escolher o nome do Usu\u00e1rio que deseja criar. O nome do Usu\u00e1rio deve ser \u00fanico, ou seja, n\u00e3o pode haver dois Usu\u00e1rios com o mesmo nome na mesma regi\u00e3o. Al\u00e9m disso, a senha aparecer\u00e1 somente na cria\u00e7\u00e3o deste, ent\u00e3o guarde-a em um local seguro antes de continuar. Atrelar uma pol\u00edtica (restri\u00e7\u00e3o) ao usu\u00e1rio, deve ser feita posteriormente com a fun\u00e7\u00e3o de adicionar pol\u00edticas. Ao deletar um Usu\u00e1rio, o usu\u00e1rio n\u00e3o poder\u00e1 ser recuperado, e todas as configura\u00e7\u00f5es de pol\u00edticas atreladas tamb\u00e9m ser\u00e3o descartadas, mas as pol\u00edticas em si ainda continuar\u00e3o existindo.","title":"Gerenciar Usu\u00e1rios"},{"location":"projetos_2022/fran-janela/#gerenciar-politicas","text":"Ao Listar as Pol\u00edticas, o usu\u00e1rio deve escolher pelo n\u00famero mostrado na tela aquela que quer visualizar mais informa\u00e7\u00f5es. Para importar uma pol\u00edtica, o usu\u00e1rio deve passar o path completo do arquivo .json . Caso seja um arquivo v\u00e1lido, a regra ser\u00e1 criada e permanentemente adicionada ao seu reposit\u00f3rio de pol\u00edticas. Para delet\u00e1-la, deve apagar o arquivo .json criado em iam/policies/ . O nome da pol\u00edtica ser\u00e1 o nome do arquivo, sem a extens\u00e3o. Para facilitar a cria\u00e7\u00e3o, construa a pol\u00edtica pela dashboard da AWS e copie o conte\u00fado do arquivo .json gerado.","title":"Gerenciar Pol\u00edticas"},{"location":"projetos_2022/fran-janela/#roteiro-diy","text":"","title":"Roteiro DIY"},{"location":"projetos_2022/fran-janela/#comecando","text":"Para seguir esse tutorial \u00e9 necess\u00e1rio: Tecnologias: Terraform, Python Documentos: Terraform AWS Docs Pr\u00e9-Requisitos: aqueles anteriormente destacados para o funcionamento do programa e uma conta na AWS com permiss\u00f5es de administrador e suas credenciais. Danger ATEN\u00c7\u00c3O: Estas pr\u00f3ximas etapas ser\u00e3o feitas para vias de estudo, n\u00e3o \u00e9 recomendado que sejam feitas em um ambiente de produ\u00e7\u00e3o. Al\u00e9m disso, as chaves que ser\u00e3o utilizadas s\u00e3o extremamente sens\u00edveis, ent\u00e3o n\u00e3o as compartilhe com ningu\u00e9m, muito menos disponibilize-as no GitHub ou similares. Daqui em diante \u00e9 por sua conta e risco.","title":"Come\u00e7ando"},{"location":"projetos_2022/fran-janela/#o-que-e-terraform","text":"Terraform \u00e9 uma ferramenta de infraestrutura por c\u00f3digo, desenvolvida pela HashiCorp , que te permite definir, tanto para Cloud P\u00fablica , quanto para Cloud Privada , recursos de infraestrutura em c\u00f3digo poss\u00edvel de ser lido pelo ser humano e pelo computador, podendo ser versionado, reutiliz\u00e1do e compartilhado.","title":"O que \u00e9 Terraform?"},{"location":"projetos_2022/fran-janela/#terraform-e-aws","text":"A HashiCorp disponibiliza uma s\u00e9rie de m\u00f3dulos para os recursos na aws que podem ser copiados e reconfigurados para construir a sua infraestrutura. Para facilitar a sua pesquisa, a documenta\u00e7\u00e3o no link acima \u00e9 de grande utilidade. Existem 4 grandes tipos de m\u00f3dulos que ser\u00e3o explorados neste roteiro, s\u00e3o eles: Provider: \u00e9 o m\u00f3dulo que permite a comunica\u00e7\u00e3o com a AWS, e \u00e9 o primeiro m\u00f3dulo que deve ser importado. Ele \u00e9 respons\u00e1vel por definir a regi\u00e3o que ser\u00e1 utilizada, e tamb\u00e9m as credenciais de acesso. Resource: \u00e9 o m\u00f3dulo que define os recursos que ser\u00e3o utilizados na AWS. Por exemplo, se voc\u00ea deseja criar uma inst\u00e2ncia EC2, voc\u00ea deve importar o m\u00f3dulo aws_instance e configurar os par\u00e2metros necess\u00e1rios para a cria\u00e7\u00e3o da inst\u00e2ncia. Data: \u00e9 o m\u00f3dulo que permite a consulta de informa\u00e7\u00f5es de recursos j\u00e1 existentes na AWS. Por exemplo, se voc\u00ea deseja consultar o ID de uma inst\u00e2ncia EC2, voc\u00ea deve importar o m\u00f3dulo aws_instance e configurar os par\u00e2metros necess\u00e1rios para a consulta da inst\u00e2ncia. Output: \u00e9 o m\u00f3dulo que permite a visualiza\u00e7\u00e3o de informa\u00e7\u00f5es de recursos j\u00e1 existentes na AWS. Por exemplo, se voc\u00ea deseja visualizar o ID de uma inst\u00e2ncia EC2, voc\u00ea deve importar o m\u00f3dulo aws_instance e configurar os par\u00e2metros necess\u00e1rios para a visualiza\u00e7\u00e3o da inst\u00e2ncia.","title":"Terraform e AWS"},{"location":"projetos_2022/fran-janela/#criando-a-infraestrutura-basica-para-o-roteiro","text":"Em primeiro lugar, defina um diret\u00f3rio(pasta) para o seu projeto. Isso vai ser importante para posteriormente replicar o que foi feito e poder escalar para a constru\u00e7\u00e3o de uma infraestrutura maior com o aux\u00edlio de uma aplica\u00e7\u00e3o em python . D\u00ea o nome de sample para o diret\u00f3rio, pois ele ser\u00e1 a amostra replicada para cada regi\u00e3o. Para este tutorial iremos utilizar somente a regi\u00e3o us-east-1 (Norte da Virg\u00ednia). Dentro deste diret\u00f3rio, crie um arquivo chamado main.tf e outro chamado variables.tf . O primeiro ser\u00e1 respons\u00e1vel por definir os providers necess\u00e1rios e iniciar a estrutura do terraform, e o segundo ser\u00e1 respons\u00e1vel por definir as vari\u00e1veis que ser\u00e3o utilizadas para a cria\u00e7\u00e3o dos recursos. Dentro do arquivo main.tf , insira o seguinte c\u00f3digo: terraform { required_providers { aws = { source = \"hashicorp/aws\" version = \"~> 4.16\" } } required_version = \">= 1.2.0\" } Este Snipet de c\u00f3digo \u00e9 respons\u00e1vel, ent\u00e3o, por definir a vers\u00e3o do terraform que ser\u00e1 utilizada e tamb\u00e9m a vers\u00e3o do provider aws que ser\u00e1 necess\u00e1rio. Al\u00e9m disso, \u00e9 necess\u00e1rio definir, em si, a regi\u00e3o do provider e passar a ele as credenciais para poder acessar a sua AWS. Em um novo arquivo provider.tf , insira o seguinte c\u00f3digo: provider \"aws\" { region = var.region access_key = var.AWS_ACCESS_KEY_ID secret_key = var.AWS_SECRET_ACCESS_KEY } E no arquivo j\u00e1 criado variables.tf , insira o seguinte c\u00f3digo: variable \"region\" { type = string default = \"us-east-1\" } variable \"AWS_ACCESS_KEY_ID\" { type = string sensitive = true } variable \"AWS_SECRET_ACCESS_KEY\" { type = string sensitive = true } Info O arquivo variables.tf \u00e9 respons\u00e1vel por definir as vari\u00e1veis que ser\u00e3o utilizadas na infraestrutura do Terraform. O par\u00e2metro sensitive = true \u00e9 respons\u00e1vel por ocultar a vari\u00e1vel quando for executado o comando terraform plan ou terraform apply . Agora, execute o comando terraform init para que o terraform baixe os providers necess\u00e1rios para a cria\u00e7\u00e3o da infraestrutura. terraform init","title":"Criando a Infraestrutura B\u00e1sica para o roteiro"},{"location":"projetos_2022/fran-janela/#definindo-as-variaveis-para-o-codigo","text":"Anteriormente foi falado da import\u00e2ncia de manter o sigilo quanto \u00e0s chaves de acesso \u00e0 AWS , e, portanto, iremos precisar de um arquivo que as contenha, e ao mesmo tempo, n\u00e3o seja enviado para nenhum reposit\u00f3rio aberto. O Terraform consegue ler um arquivo e dele extrair as vari\u00e1veis que ser\u00e3o utilizadas na infraestrutura. Para isso, crie um arquivo chamado config.tfvars.json dentro de uma pasta config . \u00c9 importante que estes estejam descritos no seu arquivo .gitignore ou similares. Adicione o conte\u00fado a esse arquivo: { \"region\" : \"us-east-1\" , \"AWS_ACCESS_KEY_ID\" : [ \"SEU_ID_CHAVE\" ], \"AWS_SECRET_ACCESS_KEY\" : [ \"SUA_SECRET_KEY\" ] } O arquivo variables.tf ser\u00e1 respons\u00e1vel por informar ao terraform quais as vari\u00e1veis que ser\u00e3o necess\u00e1rias e quais os seus tipos. O arquivo config.tfvars.json ser\u00e1 respons\u00e1vel por informar ao terraform quais os valores que ser\u00e3o utilizados para as vari\u00e1veis. Agora, podemos aplicar a nossa infraestrutura. Para isso, execute o comando terraform apply e informe o arquivo config.tfvars.json como vari\u00e1vel de entrada. terraform apply -var-file=config/config.tfvars.json","title":"Definindo as vari\u00e1veis para o c\u00f3digo:"},{"location":"projetos_2022/fran-janela/#criando-a-infraestrutura-de-rede","text":"Agora que j\u00e1 temos a infraestrutura b\u00e1sica criada, podemos come\u00e7ar a criar a infraestrutura de rede. Para isso, iremos criar um arquivo chamado network.tf e nele iremos definir os recursos que ser\u00e3o utilizados para a cria\u00e7\u00e3o da infraestrutura de rede. Para a cria\u00e7\u00e3o de rede, vamos come\u00e7ar a exercitar a pesquisa na documenta\u00e7\u00e3o do terraform. Crie um recurso para cada uma das seguintes funcionalidades e adicione os par\u00e2metros tamb\u00e9m descritos: VPC: cidr_block, instance_tenancy, enable_dns_support, enable_dns_hostnames e tags={Name} Subnet: vpc_id, cidr_block, map_public_ip_on_launch e tags={Name} Internet Gateway: vpc_id e tags={Name} Route Table: vpc_id e tags={Name} Route: route_table_id, destination_cidr_block e gateway_id Route Table Association: subnet_id e route_table_id Para as configura\u00e7\u00f5es de rede, adicione ao arquivo variables.tf as seguintes vari\u00e1veis: variable \"network_configurations\" { type = object ({ vpcCIDRblock = string instanceTenancy = string dnsSupport = bool dnsHostNames = bool publicsCIDRblock = string mapPublicIP = bool publicdestCIDRblock = string }) } E como exemplo, adicione ao arquivo config.tfvars.json as seguintes configura\u00e7\u00f5es: \"network_configurations\" : { \"vpcCIDRblock\" : \"172.16.0.0/16\" , \"instanceTenancy\" : \"default\" , \"dnsSupport\" : true , \"dnsHostNames\" : true , \"publicsCIDRblock\" : \"172.16.10.0/24\" , \"mapPublicIP\" : true , \"publicdestCIDRblock\" : \"0.0.0.0/0\" } O restante das vari\u00e1veis, associe diretamente no arquivo network.tf , utilizando a seguinte estrutura: variavel = [ recurso ].[ nome_do_recurso ].[ vari\u00e1vel_desejada ] # Exemplo: vpc_id = aws_vpc.VPC.id","title":"Criando a Infraestrutura de Rede"},{"location":"projetos_2022/fran-janela/#criando-instancias-ec2","text":"A cria\u00e7\u00e3o de inst\u00e2ncias vai nos trazer alguns conceitos extremamente interessantes para a escalabilidade da nossa aplica\u00e7\u00e3o no terraform, s\u00e3o estes: count , for_each , e locals . Vamos come\u00e7ar pelo b\u00e1sico. Crie uma inst\u00e2ncia usando o recurso aws_instance no arquivo instances.tf . Realize o Apply da infraestrutura e veja sua inst\u00e2ncia sendo criada. Utilizando a m\u00f3dulo de output do terraform, crie um output para a inst\u00e2ncia criada. O output deve conter o id da inst\u00e2ncia e o DNS p\u00fablico e estar\u00e1 localizado no arquivo gerado autom\u00e1ticamente terraform.tfstate .","title":"Criando Inst\u00e2ncias EC2"},{"location":"projetos_2022/fran-janela/#escalando-com-o-count","text":"Com o argumento count dentro da defini\u00e7\u00e3o do recurso, crie 3 inst\u00e2ncias EC2. Execute o terraform apply e veja as 3 inst\u00e2ncias sendo criadas. O count \u00e9 um sistema de cria\u00e7\u00e3o em massa de inst\u00e2ncias com as mesmas configura\u00e7\u00f5es, e deve ser usado para rapidamente construir um grupo de m\u00e1quinas com as mesmas configura\u00e7\u00f5es para provavelmente a mesma aplica\u00e7\u00e3o. Para possuir maior controle sobre o m\u00faltiplo deploy de inst\u00e2ncias, \u00e9 mais recomendado usar o for_each .","title":"Escalando com o count"},{"location":"projetos_2022/fran-janela/#escalando-com-o-for_each","text":"Em primeiro lugar, o for_each ir\u00e1 utilizar da configura\u00e7\u00e3o de vari\u00e1veis no formato de list ou map para criar m\u00faltiplas inst\u00e2ncias com configura\u00e7\u00f5es diferentes. Para isso, vamos criar uma vari\u00e1vel no arquivo variables.tf : variable \"instances_configuration\" { type = list ( object ({ instance_name = string instance_type = string ami = string key_name = string })) } O tipo list indica ao terraform que a vari\u00e1vel \u00e9 uma lista e deve ser percorrida pelo for_each . J\u00e1 o tipo object indica que a vari\u00e1vel \u00e9 um objeto, ou seja, um conjunto de vari\u00e1veis definidas, que podem ser acessadas pela sua chave. No arquivo de vari\u00e0veis .json , deve ser construido os valores da forma descrita acima. O recurso da inst\u00e2ncia com a constru\u00e7\u00e3o do for_each deve ser similar a: resource \"aws_instance\" \"web\" { for_each = { for instance in var.instances_configuration : instance.instance_name = > instance } ami = each.value.ami instance_type = each.value.instance_type subnet_id = aws_subnet.Subnet.id key_name = each.value.key_name tags = { Name = \"${each.value.instance_name}\" } } OBS.: Note que para indicar o valor de cada inst\u00e2ncia \u00e9 usado o complemento each.value Crie 3 inst\u00e2ncias diferentes com este m\u00e9todo.","title":"Escalando com o for_each"},{"location":"projetos_2022/fran-janela/#escalando-com-o-for_each-e-count","text":"\u00c9 de certo que n\u00e3o \u00e9 poss\u00edvel usar ambas as configura\u00e7\u00f5es for_each e count no mesmo recurso, mas podemos contornar essa situa\u00e7\u00e3o. Para isso, adicione uma vari\u00e0vel ao conjunto de vari\u00e1veis de configura\u00e7\u00e3o das inst\u00e2ncias que indicar\u00e1 a quantidade delas a serem criadas. Em seguida vamos utilizar as vari\u00e1veis locais , com o argumento locals . Construindo baseado na ideia de replicar a configura\u00e7\u00e3o definida para a quantidade de inst\u00e2ncias, basta criar um for que atenda a essa quantidade e adicione v\u00e1rias vezes a mesma configura\u00e7\u00e3o mudando apenas o nome, com o acr\u00e9scimo de um n\u00famero que indique ind\u00edce, por exemplo. Al\u00e9m disso, para aplicar tais configura\u00e7\u00f5es locais, as informa\u00e7\u00f5es devem ser passadas pela fun\u00e7\u00e3o de flatten . No final, a sua inst\u00e2ncia deve possuir o seguinte formato: locals { serverconfig = [ for srv in var.instances_configuration : [ for i in range ( 1 , srv.no_of_instances + 1 ) : { instance_name = \"${srv.instance_name}-${i}\" instance_type = srv.instance_type ami = srv.ami security_groups_ids = srv.security_groups_ids key_name = srv.key_name } ] ] } locals { instances = flatten ( local.serverconfig ) } resource \"aws_instance\" \"web\" { for_each = { for server in local.instances : server.instance_name = > server } ami = each.value.ami instance_type = each.value.instance_type subnet_id = aws_subnet.Subnet.id vpc_security_group_ids = each.value.security_groups_ids key_name = each.value.key_name tags = { Name = \"${each.value.instance_name}\" } } output \"instances\" { value = [ for instance in aws_instance.web : instance ] description = \"All Machine details\" }","title":"Escalando com o for_each e count"},{"location":"projetos_2022/fran-janela/#criando-security-groups","text":"Para a cria\u00e7\u00e3o dos security groups, vamos utilizar o m\u00e9todo do for_each pensando na escalabilidade da solu\u00e7\u00e3o. Al\u00e9m disso, na AWS \u00e9 poss\u00edvel adicionar v\u00e1rias regras tanto de Ingress (Inbound) quanto de Egress (Outbound) ao mesmo tempo, portanto, nossa aplica\u00e7\u00e3o tamb\u00e9m deve conseguir faz\u00ea-lo. Crie o arquivo security_groups.tf e construa as suas configura\u00e7\u00f5es. Dica Para criar m\u00faltiplas regras de Ingress e Egress , utilize vari\u00e1veis do tipo dynamic . Teste criando 2 grupos de seguran\u00e7a, um com uma regra de Ingress e duas regras de Egress e outro com duas regras de Ingress e uma regra de Egress .","title":"Criando Security Groups"},{"location":"projetos_2022/fran-janela/#aplicando-o-security-group-nas-instancias","text":"Utilizando a fun\u00e7\u00e3o de output , \u00e9 poss\u00edvel coletar o ID do Security Group definido autom\u00e1ticamente pela AWS. Para atrel\u00e1-lo a uma inst\u00e2ncia use a vari\u00e1vel do recurso aws_instance chamada vpc_security_group_ids e passe uma lista de IDs de Security Groups como valor. Crie um Security Group que libere a conex\u00e3o SSH e associe-o a uma inst\u00e2ncia Junto com o par de chaves criado e associado a key_name , teste o acesso \u00e0 inst\u00e2ncia.","title":"Aplicando o security group nas inst\u00e2ncias"},{"location":"projetos_2022/fran-janela/#criando-infraestrutura-para-o-iam","text":"Para a cria\u00e7\u00e3o da estrutura no IAM, ser\u00e3o necess\u00e1rios 2 recursos principais: o usu\u00e1rio em si e as policies (pol\u00edticas ou restri\u00e7\u00f5es) de acesso. Al\u00e9m disso, s\u00e3o necess\u00e1rios recursos que criem o usu\u00e1rio e atrelem a ele uma senha autom\u00e1tica (que pode ser exportada como output ), um recurso que crie o documento da pol\u00edtica, para facilitar a implementa\u00e7\u00e3o, e recursos que criem a conex\u00e3o entre o usu\u00e1rio e a pol\u00edtica. Crie o arquivo policies.tf e construa as suas configura\u00e7\u00f5es. Dica Para atrelar um documento a uma pol\u00edtica, use a seguinte vari\u00e1vel e sua configura\u00e7\u00e3o: terraform policy = data.aws_iam_policy_document.ec2_policy[each.value.name].json Crie o arquivo users.tf e construa as suas configura\u00e7\u00f5es. Associe uma pol\u00edtica criada a um usu\u00e1rio atrav\u00e9s do recurso aws_iam_user_policy_attachment . Dica Crie uma vari\u00e0vel para cada uma das configura\u00e7\u00f5es acima, ou seja, uma vari\u00e1vel para a configura\u00e7\u00e3o de pol\u00edticas, outra para a configura\u00e7\u00e3o de usu\u00e1rios e outra para a configura\u00e7\u00e3o de atrelamento de pol\u00edticas a usu\u00e1rios. Teste a cria\u00e7\u00e3o de um usu\u00e1rio com a restri\u00e7\u00e3o de acesso \u00e0 regi\u00e3o da North Virginia. A pol\u00edtica criada para isso est\u00e1 abaixo: { \"Version\" : \"2012-10-17\" , \"Statement\" : [ { \"Effect\" : \"Allow\" , \"Action\" : \"*\" , \"Resource\" : \"*\" , \"Condition\" : { \"StringEquals\" : { \"aws:RequestedRegion\" : \"us-east-1\" } } } ] }","title":"Criando Infraestrutura para o IAM"},{"location":"projetos_2022/fran-janela/#criando-multiplas-regioes","text":"Como os usu\u00e1rios s\u00e3o globais, n\u00e3o vamos nos preocupar com suas configura\u00e7\u00f5es para cada inst\u00e2ncia, eles podem receber sua pasta separada para gerenciamento de infraestrutura. Pensando, ent\u00e3o, nos outros arquivos, ou seja, main.tf , provider.tf , network.tf , instances.tf , security_groups.tf , para criar uma nova regi\u00e3o, basta replicar todo o diret\u00f3rio, mudando apenas no arquivo de configura\u00e7\u00f5es .json a regi\u00e3o do provider . Crie duas pastas com essa infraestrutura, uma para a regi\u00e3o da North Virginia e outra para a regi\u00e3o de Ohio. Teste a cria\u00e7\u00e3o de uma inst\u00e2ncia em cada regi\u00e3o. OBS.: Aplique o comando de init e apply em cada uma das pastas criadas.","title":"Criando m\u00faltiplas Regi\u00f5es"},{"location":"projetos_2022/fran-janela/#criando-um-ha-de-servidores-web","text":"","title":"Criando um HA de servidores web"},{"location":"projetos_2022/fran-janela/#configurando-uma-imagem-base","text":"Para a cria\u00e7\u00e3o de um HA de servidores web, \u00e9 necess\u00e1rio primeiro criar uma imagem( ami ) que funcionar\u00e1 como template para a cria\u00e7\u00e3o de inst\u00e2ncias caso as m\u00e1quinas base estejam ficando sobre-lotadas. Crie uma inst\u00e2ncia com o sistema operacional Ubuntu Server 18.04 LTS. Aplique: sudo apt update; sudo apt install nodejs build-essential -y Edite um arquivo server.js: #!/usr/bin/env nodejs var http = require ( \"http\" ); var os = require ( \"os\" ); var crypto = require ( \"crypto\" ); http . createServer ( function ( req , res ) { res . writeHead ( 200 , { \"Content-Type\" : \"text/plain\" }); var nonce = 1 ; var seed = Math . random (); var h = crypto . createHash ( \"sha256\" ); h . update ( new Buffer ( nonce + \" Hello World \" + seed )); while ( h . digest ( \"hex\" ). substr ( 0 , 3 ) != \"000\" ) { h = crypto . createHash ( \"sha256\" ); nonce ++ ; h . update ( new Buffer ( nonce + \" Hello World \" + seed )); } res . end ( '{ \"host\": ' + os . hostname () + ', \"nonce\": ' + nonce + \"}\" ); }) . listen ( 8080 , \"\" ); console . log ( \"Server running at http://localhost:8080/\" ); Torne o arquivo execut\u00e1vel: chmod +x ./server.js Execute e teste o servidor(lembre-se de liberar a porta no security group): Configure a m\u00e1quina para iniciar o servidor automaticamente ap\u00f3s reboot : crontab -e\\ @reboot /home/ubuntu/server.js D\u00ea reboot e teste o acesso ao servidor novamente. Copywright O procedimento foi retirado do site oficial da mat\u00e9ria . Com o template de inst\u00e2ncia criado, gere uma imagem dele pela dashboard da AWS e salve a ami gerada para uso no pr\u00f3ximos passos.","title":"Configurando uma Imagem Base"},{"location":"projetos_2022/fran-janela/#criando-os-recursos-para-o-ha","text":"Para construir o HA, vamos utilizar o recurso aws_autoscaling_group , emparelhado com aws_launch_configuration e tamb\u00e9m aws_lb ( Load Balence ). Para isso, construa a infraestrutura baseada neste tutorial: Tutorial de HA . Ele foi produzido pela Hashicorp, empresa que desenvolve o Terraform, mas em caso de d\u00favida, o resultado esperado se encontra dentro da pasta sample-HA no reposit\u00f3rio do meu programa. ??? Dicas - Crie Security Groups diferentes para o Load Balencer e para configura\u00e7\u00e3o das inst\u00e2ncias. - S\u00e3o necess\u00e1rias 3 *Subnets* para a cria\u00e7\u00e3o do *Load Balencer*.","title":"Criando os recursos para o HA"},{"location":"projetos_2022/fran-janela/#crie-seu-proprio-programa","text":"Com toda a experi\u00eancia adquirida na formata\u00e7\u00e3o, constru\u00e7\u00e3o e manipula\u00e7\u00e3o da infraestrutura por meio do terraform, agora voc\u00ea \u00e9 capaz de criar o seu pr\u00f3rpio programa. Eu criei, utilizando Python , uma ferramenta que roda no terminal e executa as opera\u00e7\u00f5es descritas acima, de forma automatizada. Para isso, a aplica\u00e7\u00e3o copia os arquivos de base, armazenados na pasta sample para uma nova pasta com o nome da regi\u00e3o, configura o arquivo .tvars.json com as informa\u00e7\u00f5es descritas pelo usu\u00e1rio e executa o terraform para a cria\u00e7\u00e3o da infraestrutura. O seu programa pode ser criado via Python ou qualquer outra linguagem que voc\u00ea se sinta confort\u00e1vel para manipula\u00e7\u00e3o de arquivos e execu\u00e7\u00e3o de comandos. \u00c9 poss\u00edvel, tamb\u00e9m, que essas configura\u00e7\u00f5es sejam feitas via backend e toda a interface de usu\u00e1rio seja feita via frontend em outra linguagem, uma vez que toda a configura\u00e7\u00e3o da infraestrutura pode ser enviada via .json para o backend. Aqui o c\u00e9u \u00e9 o limite! Use a sua criatividade!","title":"Crie seu Pr\u00f3prio Programa."},{"location":"projetos_2022/fran-janela/#motivacao","text":"Minha motiva\u00e7\u00e3o para a cria\u00e7\u00e3o desta aplica\u00e7\u00e3o e, consequentemente, este tutorial veio da crescente vontade de aprender sobre infraestrutura e Computa\u00e7\u00e3o Nuvem, o que me motivou a tentar produzir algo robusto e confi\u00e1vel, que pudesse ser utilizado por pessoas com algum conhecimento em infraestrutura, assim como eu, mas com a vontade de aprender.","title":"Motiva\u00e7\u00e3o"},{"location":"roteiros/0.Cabeamento/","text":"Laborat\u00f3rio de Cabeamento - 1 Aula \u00b6 Objetivos: \u00b6 Conhecer os padr\u00f5es mais utilizados para o cabeamento de rede e a confec\u00e7\u00e3o de um cabo de rede. Ainda neste laborat\u00f3rio dever\u00e3o ser configurados todos os equipamentos que comp\u00f5em o kit de trabalho de cloud computing. Pr\u00e9-requisitos: Ethernet . [Tanenbaum - se\u00e7\u00f5es 2.2.2 Par tran\u00e7ado, 4.3.1 Cabeamento Ethernet, 4.3.8 Ethernet de gigabit]. Cloud Computing \u00b6 O kit cont\u00e9m os seguintes itens: Roteador TP-LINK TL-R470T+ Switch DLink DSG-1210-28 de 28 portas 6 hosts OBS: A senha do roteador est\u00e1 no invent\u00e1rio do seu kit e a do switch est\u00e1 no manual oficial. Passo 1 \u2013 Cabo de rede (Patch cord) \u00b6 Primeiro exerc\u00edcio \u00b6 \u00c9 a confec\u00e7\u00e3o do cabo de rede para a conex\u00e3o de seu computador pessoal ao ambiente do seu kit. O padr\u00e3o que ser\u00e1 utilizado \u00e9 o ANSI/TIA/EIA 568 que foi desenvolvido em 1991 pela EIA (Electronics Industries Alliance) e pela TIA (Telecommunications Industry Association), para normatizar as liga\u00e7\u00f5es el\u00e9tricas/eletr\u00f4nicas de cabos de rede e sua conectoriza\u00e7\u00e3o. Em 1995 uma revis\u00e3o \u00e9 publicada a ANSI/TIA/EIA 568A. Iremos utilizar o cat6 \u00b6 Um resumo das diferen\u00e7as entre as categorias de cabos Ethernet: Categoria 4 (Cat 4): Suporta velocidades de at\u00e9 16 Mbps. Pouco comum e geralmente substitu\u00eddo por cabos de categoria superior devido \u00e0 sua limitada largura de banda. Categoria 5 (Cat 5): Introduziu melhorias significativas na capacidade de transmiss\u00e3o de dados. Suporta velocidades de at\u00e9 100 Mbps (Ethernet 100BASE-TX). Utilizado amplamente para redes Ethernet 100BASE-TX e tamb\u00e9m para redes de telefonia e v\u00eddeo. Categoria 5e (Cat 5e): \"E\" significa \"Enhanced\" (Aprimorado). Melhorias adicionais na capacidade de transmiss\u00e3o e redu\u00e7\u00e3o da interfer\u00eancia. Suporta velocidades de at\u00e9 1 Gbps (Gigabit Ethernet) at\u00e9 100 metros. Categoria 6 (Cat 6): Oferece melhor desempenho e largura de banda em compara\u00e7\u00e3o com Cat 5e. Suporta velocidades de at\u00e9 10 Gbps em curtas dist\u00e2ncias (at\u00e9 55 metros) e at\u00e9 1 Gbps em dist\u00e2ncias de at\u00e9 100 metros. Categoria 6a (Cat 6a): \"A\" significa \"Augmented\" (Aumentado). Melhorias adicionais na capacidade de transmiss\u00e3o e redu\u00e7\u00e3o da interfer\u00eancia em compara\u00e7\u00e3o com Cat 6. Suporta velocidades de at\u00e9 10 Gbps em dist\u00e2ncias de at\u00e9 100 metros. Categoria 7 (Cat 7): Introduzido para suportar o padr\u00e3o 10GBASE-T. Oferece maior largura de banda e imunidade a interfer\u00eancias. Suporta velocidades de at\u00e9 10 Gbps em dist\u00e2ncias de at\u00e9 100 metros. Categoria 8 (Cat 8): Projetado para atender \u00e0s demandas de redes de alta velocidade, como data centers e backbone de rede. Suporta velocidades de at\u00e9 40 Gbps e 100 Gbps em curtas dist\u00e2ncias (at\u00e9 30 metros). O protocolo Ethernet \u00e9 um dos protocolos mais comuns e amplamente utilizados em redes de computadores. Ele define as regras para a comunica\u00e7\u00e3o de dados entre dispositivos em uma rede local (LAN - Local Area Network). Aqui est\u00e3o alguns pontos-chave sobre o protocolo Ethernet: Meio de Transmiss\u00e3o: O Ethernet pode ser usado em diferentes tipos de m\u00eddia de transmiss\u00e3o, incluindo cabos de cobre (como o Ethernet de par tran\u00e7ado) e fibra \u00f3ptica. Isso proporciona flexibilidade na implementa\u00e7\u00e3o de redes Ethernet em diversos ambientes. Quadro Ethernet: Os dados s\u00e3o transmitidos em unidades chamadas de \"quadros Ethernet\". Cada quadro possui um cabe\u00e7alho e um trailer, al\u00e9m dos dados propriamente ditos. O cabe\u00e7alho cont\u00e9m informa\u00e7\u00f5es importantes, como endere\u00e7os MAC de origem e destino, tipo de protocolo e verifica\u00e7\u00e3o de erros. Endere\u00e7os MAC: Cada dispositivo em uma rede Ethernet possui um endere\u00e7o MAC (Media Access Control) \u00fanico, que \u00e9 gravado na placa de rede do dispositivo. Esses endere\u00e7os s\u00e3o utilizados para identificar os dispositivos na rede e determinar para qual dispositivo os quadros Ethernet s\u00e3o destinados. Acesso ao Meio: O protocolo Ethernet utiliza um m\u00e9todo de acesso ao meio chamado CSMA/CD (Carrier Sense Multiple Access with Collision Detection). Isso significa que os dispositivos verificam o meio de transmiss\u00e3o para detectar a presen\u00e7a de sinais de outros dispositivos antes de iniciar a transmiss\u00e3o. Se ocorrer uma colis\u00e3o (ou seja, dois dispositivos tentam transmitir simultaneamente), o CSMA/CD \u00e9 usado para lidar com a situa\u00e7\u00e3o e tentar retransmitir os dados de forma eficiente. Padr\u00f5es Ethernet: O Ethernet evoluiu ao longo do tempo, com diferentes padr\u00f5es que especificam velocidades de transmiss\u00e3o de dados, tipos de cabos, e outras caracter\u00edsticas. Alguns dos padr\u00f5es mais comuns incluem Ethernet de 10 Mbps (10BASE-T), Fast Ethernet de 100 Mbps (100BASE-TX), Gigabit Ethernet de 1 Gbps (1000BASE-T), e 10 Gigabit Ethernet de 10 Gbps (10GBASE-T). Lapidando o projeto \u00b6 Antes de iniciar voc\u00ea deve \"resetar\" o switch e o roteador do seu KIT !!!!!!! \u00b6 Agora com o cabo que voc\u00ea acabou de fazer, realize as seguinte modifica\u00e7\u00f5es (se preciso, leia os manuais): Lembre-se da aula teorica, com um certo nivel de abstrac\u00e3o, dispositivos so se comunic\u00e3o se estiverem na mesma rede. Altere o IP do Roteador para 172.16.0.1/20. Altere o IP do Switch para 172.16.0.2/20. Passo 2 - anotando informacoes necess\u00e1rias!!! \u00b6 Na parte de baixo de cada uma de suas NUCs voce ter\u00e1 a informacao do Mac Address, anote cada um deles (voc\u00ea ira precisar mais para frente) Conforme a imagem abaixo as maquinas ser\u00e3o chamadas a partir de agora (da esquerda para a direita). Main Server Server1 Server2 Server3 Server4 Server5 Passo 3 \u2013 conex\u00e3o dos hosts e roteador \u00b6 De Acordo com a imagem da topologia (primeira imagem), conecte os cabos de rede presentes em seu kit no switch, hosts e roteador; Utilize o cabo que voc\u00ea montou para interligar o seu notebook com o kit (conecte ele no switch);","title":"Cabeamento"},{"location":"roteiros/0.Cabeamento/#laboratorio-de-cabeamento-1-aula","text":"","title":"Laborat\u00f3rio de Cabeamento - 1 Aula"},{"location":"roteiros/0.Cabeamento/#objetivos","text":"Conhecer os padr\u00f5es mais utilizados para o cabeamento de rede e a confec\u00e7\u00e3o de um cabo de rede. Ainda neste laborat\u00f3rio dever\u00e3o ser configurados todos os equipamentos que comp\u00f5em o kit de trabalho de cloud computing. Pr\u00e9-requisitos: Ethernet . [Tanenbaum - se\u00e7\u00f5es 2.2.2 Par tran\u00e7ado, 4.3.1 Cabeamento Ethernet, 4.3.8 Ethernet de gigabit].","title":"Objetivos:"},{"location":"roteiros/0.Cabeamento/#cloud-computing","text":"O kit cont\u00e9m os seguintes itens: Roteador TP-LINK TL-R470T+ Switch DLink DSG-1210-28 de 28 portas 6 hosts OBS: A senha do roteador est\u00e1 no invent\u00e1rio do seu kit e a do switch est\u00e1 no manual oficial.","title":"Cloud Computing"},{"location":"roteiros/0.Cabeamento/#passo-1-cabo-de-rede-patch-cord","text":"","title":"Passo 1 \u2013 Cabo de rede (Patch cord)"},{"location":"roteiros/0.Cabeamento/#primeiro-exercicio","text":"\u00c9 a confec\u00e7\u00e3o do cabo de rede para a conex\u00e3o de seu computador pessoal ao ambiente do seu kit. O padr\u00e3o que ser\u00e1 utilizado \u00e9 o ANSI/TIA/EIA 568 que foi desenvolvido em 1991 pela EIA (Electronics Industries Alliance) e pela TIA (Telecommunications Industry Association), para normatizar as liga\u00e7\u00f5es el\u00e9tricas/eletr\u00f4nicas de cabos de rede e sua conectoriza\u00e7\u00e3o. Em 1995 uma revis\u00e3o \u00e9 publicada a ANSI/TIA/EIA 568A.","title":"Primeiro exerc\u00edcio"},{"location":"roteiros/0.Cabeamento/#iremos-utilizar-o-cat6","text":"Um resumo das diferen\u00e7as entre as categorias de cabos Ethernet: Categoria 4 (Cat 4): Suporta velocidades de at\u00e9 16 Mbps. Pouco comum e geralmente substitu\u00eddo por cabos de categoria superior devido \u00e0 sua limitada largura de banda. Categoria 5 (Cat 5): Introduziu melhorias significativas na capacidade de transmiss\u00e3o de dados. Suporta velocidades de at\u00e9 100 Mbps (Ethernet 100BASE-TX). Utilizado amplamente para redes Ethernet 100BASE-TX e tamb\u00e9m para redes de telefonia e v\u00eddeo. Categoria 5e (Cat 5e): \"E\" significa \"Enhanced\" (Aprimorado). Melhorias adicionais na capacidade de transmiss\u00e3o e redu\u00e7\u00e3o da interfer\u00eancia. Suporta velocidades de at\u00e9 1 Gbps (Gigabit Ethernet) at\u00e9 100 metros. Categoria 6 (Cat 6): Oferece melhor desempenho e largura de banda em compara\u00e7\u00e3o com Cat 5e. Suporta velocidades de at\u00e9 10 Gbps em curtas dist\u00e2ncias (at\u00e9 55 metros) e at\u00e9 1 Gbps em dist\u00e2ncias de at\u00e9 100 metros. Categoria 6a (Cat 6a): \"A\" significa \"Augmented\" (Aumentado). Melhorias adicionais na capacidade de transmiss\u00e3o e redu\u00e7\u00e3o da interfer\u00eancia em compara\u00e7\u00e3o com Cat 6. Suporta velocidades de at\u00e9 10 Gbps em dist\u00e2ncias de at\u00e9 100 metros. Categoria 7 (Cat 7): Introduzido para suportar o padr\u00e3o 10GBASE-T. Oferece maior largura de banda e imunidade a interfer\u00eancias. Suporta velocidades de at\u00e9 10 Gbps em dist\u00e2ncias de at\u00e9 100 metros. Categoria 8 (Cat 8): Projetado para atender \u00e0s demandas de redes de alta velocidade, como data centers e backbone de rede. Suporta velocidades de at\u00e9 40 Gbps e 100 Gbps em curtas dist\u00e2ncias (at\u00e9 30 metros). O protocolo Ethernet \u00e9 um dos protocolos mais comuns e amplamente utilizados em redes de computadores. Ele define as regras para a comunica\u00e7\u00e3o de dados entre dispositivos em uma rede local (LAN - Local Area Network). Aqui est\u00e3o alguns pontos-chave sobre o protocolo Ethernet: Meio de Transmiss\u00e3o: O Ethernet pode ser usado em diferentes tipos de m\u00eddia de transmiss\u00e3o, incluindo cabos de cobre (como o Ethernet de par tran\u00e7ado) e fibra \u00f3ptica. Isso proporciona flexibilidade na implementa\u00e7\u00e3o de redes Ethernet em diversos ambientes. Quadro Ethernet: Os dados s\u00e3o transmitidos em unidades chamadas de \"quadros Ethernet\". Cada quadro possui um cabe\u00e7alho e um trailer, al\u00e9m dos dados propriamente ditos. O cabe\u00e7alho cont\u00e9m informa\u00e7\u00f5es importantes, como endere\u00e7os MAC de origem e destino, tipo de protocolo e verifica\u00e7\u00e3o de erros. Endere\u00e7os MAC: Cada dispositivo em uma rede Ethernet possui um endere\u00e7o MAC (Media Access Control) \u00fanico, que \u00e9 gravado na placa de rede do dispositivo. Esses endere\u00e7os s\u00e3o utilizados para identificar os dispositivos na rede e determinar para qual dispositivo os quadros Ethernet s\u00e3o destinados. Acesso ao Meio: O protocolo Ethernet utiliza um m\u00e9todo de acesso ao meio chamado CSMA/CD (Carrier Sense Multiple Access with Collision Detection). Isso significa que os dispositivos verificam o meio de transmiss\u00e3o para detectar a presen\u00e7a de sinais de outros dispositivos antes de iniciar a transmiss\u00e3o. Se ocorrer uma colis\u00e3o (ou seja, dois dispositivos tentam transmitir simultaneamente), o CSMA/CD \u00e9 usado para lidar com a situa\u00e7\u00e3o e tentar retransmitir os dados de forma eficiente. Padr\u00f5es Ethernet: O Ethernet evoluiu ao longo do tempo, com diferentes padr\u00f5es que especificam velocidades de transmiss\u00e3o de dados, tipos de cabos, e outras caracter\u00edsticas. Alguns dos padr\u00f5es mais comuns incluem Ethernet de 10 Mbps (10BASE-T), Fast Ethernet de 100 Mbps (100BASE-TX), Gigabit Ethernet de 1 Gbps (1000BASE-T), e 10 Gigabit Ethernet de 10 Gbps (10GBASE-T).","title":"Iremos utilizar o cat6"},{"location":"roteiros/0.Cabeamento/#lapidando-o-projeto","text":"","title":"Lapidando o projeto"},{"location":"roteiros/0.Cabeamento/#antes-de-iniciar-voce-deve-resetar-o-switch-e-o-roteador-do-seu-kit","text":"Agora com o cabo que voc\u00ea acabou de fazer, realize as seguinte modifica\u00e7\u00f5es (se preciso, leia os manuais): Lembre-se da aula teorica, com um certo nivel de abstrac\u00e3o, dispositivos so se comunic\u00e3o se estiverem na mesma rede. Altere o IP do Roteador para 172.16.0.1/20. Altere o IP do Switch para 172.16.0.2/20.","title":"Antes de iniciar voc\u00ea deve \"resetar\" o switch e o roteador do seu KIT !!!!!!!"},{"location":"roteiros/0.Cabeamento/#passo-2-anotando-informacoes-necessarias","text":"Na parte de baixo de cada uma de suas NUCs voce ter\u00e1 a informacao do Mac Address, anote cada um deles (voc\u00ea ira precisar mais para frente) Conforme a imagem abaixo as maquinas ser\u00e3o chamadas a partir de agora (da esquerda para a direita). Main Server Server1 Server2 Server3 Server4 Server5","title":"Passo 2 - anotando informacoes necess\u00e1rias!!!"},{"location":"roteiros/0.Cabeamento/#passo-3-conexao-dos-hosts-e-roteador","text":"De Acordo com a imagem da topologia (primeira imagem), conecte os cabos de rede presentes em seu kit no switch, hosts e roteador; Utilize o cabo que voc\u00ea montou para interligar o seu notebook com o kit (conecte ele no switch);","title":"Passo 3 \u2013 conex\u00e3o dos hosts e roteador"},{"location":"roteiros/1.Bare_metal/","text":"Bare Metal \u00b6 Objetivos: \u00b6 Entender os conceitos b\u00e1sicos sobre uma plataforma de gerenciamento de hardware. Introduzir conceitos b\u00e1sicos sobre redes de computadores. Pr\u00e9-requisitos: Realizar a leitura sobre o MaaS. [ https://maas.io/ ]. Info DIVIS\u00c3O DO ROTEIRO O Roteiro \u00e9 dividido em 2 partes principais. Criando a Infraestrutura (Nuvem Bare-metal) Usando a infraestrutura: Django em Nuvem Bare-Metal Material \u00b6 O grupo ir\u00e1 contar com os seguintes itens no kit: 1 NUC (main) com 10Gb e 1 SSD (120Gb) 1 NUC (server1) com 12Gb e 1 SSD (120Gb) 1 NUC (server2) com 16Gb e 2 SSD (120Gb+120Gb) 3 NUCs (server3, server4 e server5) com 32Gb e 2 SSD (120Gb+120Gb) 1 Switch DLink DSG-1210-28 de 24 portas 1 Roteador TP-Link TL-R470T+ Rede \u00b6 Atencao as modificacoes necess\u00e1rias apresentadas nos requisitos de projeto citados abaixo, modifique o que for necess\u00e1rio. Cada grupo tem a disposi\u00e7\u00e3o um ponto de rede (cabo preto) com sa\u00edda para a rede interna da faculdade. Requisitos de projeto: Sua rede dever\u00e1 estar segregada fisicamente da rede do Insper. Todos os equipamentos estar\u00e3o conectados e possuem acesso \u00e0 Internet. As NUCs server2 , server3 , server4 e server5 estar\u00e3o conectados \u00e0 rede com 2 (duas) interfaces de rede, uma interna e uma externa USB (NIC). A NUC main e a server1 estar\u00e3o conectadas \u00e0 rede com uma interface de rede interna, a padr\u00e3o do hardware. Tarefa: Confirme se as conex\u00f5es de rede feitas anteriormente est\u00e3o corretas. Utilize o diagrama fornecido no roteiro de cabeamento e as informacoes acima. \u00b6 Cada kit possui um IP de entrada, fornecido no invent\u00e1rio do kit. Senhas - IMPORTANTE \u00b6 Todas as senhas do seu sistema devem seguir o seguinte crit\u00e9rio: utilizar a palavra 'cloud' + a letra do kit min\u00fascula. Por exemplo: 'cloudz' \u00e9 a senha padr\u00e3o do kit Z. Usar a mesma senha para todos os servi\u00e7os que exigem cadastramento N\u00c3O alterar nenhuma senha que j\u00e1 esteja pr\u00e9-cadastrada. Criando a Infraestrutura (Nuvem Bare-metal) \u00b6 Consulte o diagrama abaixo \"H1 - Diagrama\" Instalando o Ubuntu \u00b6 Procure tutoriais de como instalar o Sistema Operacional Ubuntu server , utilize um pen drive para baixart a imagem e criar um pendrive para boot da instalacao. Instale o Ubuntu Server 22.04 LTS na NUC main: hostname: main login: cloud senha: (cloud + letra do kit) IP fixo: 172.16.0.3 Instalando o MaaS \u00b6 Verifique se consegue pingar '8.8.8.8'. Se n\u00e3o conseguir, descubra como rotear os pacotes corretamente. Verifique se consegue pingar ' www.google.com '. Se n\u00e3o conseguir, descubra como resolver as urls corretamente. $ sudo apt update && sudo apt upgrade -y V\u00e1 tomar um caf\u00e9. $ sudo snap install maas Tenho certeza que voc\u00ea n\u00e3o leu os pr\u00e9-requisitos, ao inv\u00e9s do caf\u00e9 d\u00e1 uma lida na documentacao pedida no comeco do roteiro $ sudo snap install maas-test-db Acessando sua maquina remotamente. \u00b6 faca o acesso utilizando SSH \u00b6 Dentro da rede Local \u00b6 ssh cloud@172.16.0.3 Configurando o MaaS \u00b6 Inicializando o MaaS: $ sudo maas init region+rack $ sudo maas createadmin use o login cloud use a senha padr\u00e3o da disciplina deixe a chave vazia Gerando um par de chaves para autentica\u00e7\u00e3o. $ ssh-keygen -t rsa use senha vazia dessa vez $ cat ./.ssh/id_rsa.pub copie a chave gerada Agora vamos acessar o Dashboard do MaaS: ele estar\u00e1 dispon\u00edvel em http://172.16.0.3:5240/MAAS . Entenda onde o servi\u00e7o esta rodando e fa\u00e7a o login configure um DNS Forwarder com o DNS do Insper (DNS Externo que o seu roteador enxerga). Importe as imagens do Ubuntu 22.04LTS, Ubuntu 20.04 LTS e Ubuntu 18.04 LTS . Fa\u00e7a o upload da chave copiada no terminal SSH. Em Settings | General: Global Kernel Parameters: net.ifnames=0 (sem espa\u00e7os) Chaveando o DHCP \u00b6 Explore as configura\u00e7\u00f5es do MaaS. Habilite o DHCP na subrede pelo MaaS Controller. ALTERE o Reserved Range para iniciar em 172.16.11.1 e acabar em 172.16.14.255. Deixe o DNS da subnet apontando para o DNS do Insper! Desabilitar o DHCP no roteador. Comissionando servidores \u00b6 Cadastre os hosts (machines) dispon\u00edveis. Server1 ate Server5 Altere a op\u00e7\u00e3o Power Type para Intel AMT e preencha segundo as informacoes abaixo: MacAddress que voce anotou (Se nao anotou, desmonta os cabos e faz tudo de novo!!!) A senha \u00e9 = CloudComp6s! IP do AMT = 172.16.15.X (sendo X o id do server, por exemplo server1 = 172.16.15.1) As NUCs ir\u00e3o comissionar automaticamente, realizando o boot via PXE na rede. hora do Ch\u00e1 , s\u00f3 aliviar o est\u00f4mago um pouco. Ch\u00e1 tamb\u00e9m tem cafe\u00edna. Todos os n\u00f3s devem aparecer com o status Ready . Verificar se as caracter\u00edsticas de hardware (cpu, mem\u00f3ria, SSD e rede) foram detectados com sucesso. Adicionar o Roteador como devices no Dashboard do MaaS Aten\u00e7\u00e3o : verificar se as interfaces de rede se chamam eth0 (placa rede padr\u00e3o com PXE) e eth1 (NIC usb). Verificar o Global Kernel Parameters, apagar o n\u00f3 e reiniciar o processo caso algo esteja errado . Fazendo Acesso Remoto ao seu KIT \u00b6 De acordo com as aulas te\u00f3ricas, vamos realizar um NAT para permitir o acesso externo \"Rede Wi-fi Insper\" do seu computador ao servidor MAIN . A meta \u00e9 conseguir conectar no servidor principal \"main\" utilizando a porta 22. Libere tambem o acesso ao gerenciamento remoto do seu roteador criando uma regra de gest\u00e3o para a rede 0.0.0.0/0 Se n\u00e3o lembrar das aulas te\u00f3ricas, pesquise por como fazer NAT no Roteador do seu KIT. LINK-documentacao Usando a infraestrutura: \u00b6 Django em Nuvem Bare-Metal \u00b6 Primeiro Deploy \u00b6 Vamos realizar um deploy manual de uma aplica\u00e7\u00e3o simples em Django em nossa nuvem MaaS. Antes de come\u00e7ar, realize um pequeno ajuste no DNS server: Dentro da aba Subnets, clicar na subnet 172.16.0.0/20 e editar a Subnet summary colocando o DNS do Insper - 172.20.129.131 Primeira parte: Banco de Dados \u00b6 Postgres \u00e9 um servidor de banco de dados vers\u00e1til e de f\u00e1cil manejo. Muito usado em projetos Opensource. Acesse o Dashboard do MaaS e realize o deploy do Ubuntu 22.04 no server1. Acesse o terminal do server1 via SSH: $ sudo apt update $ sudo apt install postgresql postgresql-contrib -y Ainda no terminal do server1, crie agora um usu\u00e1rio para a aplica\u00e7\u00e3o: $ sudo su - postgres $ createuser -s cloud -W Usar a senha: cloud Crie um database para a aplica\u00e7\u00e3o: $ createdb -O cloud tasks Exponha o servi\u00e7o para acesso: $ nano /etc/postgresql/12/main/postgresql.conf Remova o coment\u00e1rio e substitua a string da linha para aceitar conex\u00f5es remotas: listen_addresses = '*' $ nano /etc/postgresql/12/main/pg_hba.conf Adicione a linha que libera qualquer m\u00e1quina dentro da subnet do kit: host all all 172.16.0.0/20 trust Saia do usu\u00e1rio postgres Libere o firewall: $ sudo ufw allow 5432/tcp Reinicie o servi\u00e7o: $ sudo systemctl restart postgresql Ser\u00e1 que \u00e9 poss\u00edvel automatizar esse processo Parte II: Aplica\u00e7\u00e3o Django \u00b6 De volta ao maas, vamos subir uma aplica\u00e7\u00e3o ORM Django pr\u00e9 produzida. No lugar de [login], utilize o usu\u00e1rio criado para administrar o MaaS. Pe\u00e7a uma m\u00e1quina direto do cli no terminal agora: $ maas login [login] http://172.16.0.3:5240/MAAS/ Buscar o token no dashboard dentro das configura\u00e7\u00f5es do usu\u00e1rio. Solicite a reserva da m\u00e1quina para o MaaS: $ maas [login] machines allocate name=server2 Anote o campo system_id do json resultante. Realize o deploy via linha de comando, usando o cli: $ maas [login] machine deploy [system_id] Caf\u00e9 ... Aguarde a m\u00e1quina finalizar e entre via ssh nela. No SSH do server2: $ git clone https://github.com/raulikeda/tasks.git Entre no diretorio tasks. $ ./install.sh reboot e aguarde Teste acessando o servi\u00e7o na porta 8080 no terminal do maas: $ wget http://[IP server2]:8080/admin/ Para acessar o servi\u00e7o no seu browser seria necess\u00e1rio fazer um NAT no roteador. Por\u00e9m podemos considerar esse servi\u00e7o como sendo tempor\u00e1rio e podemos usar uma outra forma de expor o servi\u00e7o para fora do kit usando SSH tunnel: Desconecte do SSH do maas Reconecte novamente usando: $ ssh cloud@10.103.0.X -L 8001:[IP server2]:8080 O comando acima ir\u00e1 criar um tunel do servi\u00e7o do server2 na porta 8080 para o seu localhost na porta 8001 usando a conex\u00e3o SSH. Note que \u00e9 importante que a porta 8001 n\u00e3o esteja sendo usada no seu computado. Acesse ent\u00e3o o endere\u00e7o no browser: http://localhost:8001/admin/ Login Django: cloud Senha Django: cloud Tome um tempo olhando o conte\u00fado do arquivo install.sh. Ele automatiza as tarefas de instala\u00e7\u00e3o usando shell script. Note que a utiliza\u00e7\u00e3o do maas-cli no terminal substitui a utiliza\u00e7\u00e3o do dashboard. Tome um tempo explorando: $ maas [login] help commands Caso tenha interesse na aplica\u00e7\u00e3o django: https://docs.djangoproject.com/pt-br/3.1/intro/tutorial01/ Exercise CheckPoint-1 De um print das Telas abaixo: 1. Do Dashboard do **MAAS** com as m\u00e1quinas. 1. Da aba images, com as imagens sincronizadas. 1. Da Aba de cada maquina(5x) mostrando os testes de hardware e commissioning com Status \"OK\" Finalizando \u00b6 Entre no Site e responda as questoes da plataforma PrairieLearn, voc\u00ea deve fazer no minimo de 70 pontos, para poder seguir para o Roteiro 2. LINK da plataforma de quest\u00f5es Acessar com seu usu\u00e1rio de login do INSPER. e-mail institucional As imagens abaixo s\u00e3o da plataforma. Clicar em Enroll Course Procurar o Curso -> NCCC 101: Network concepts for cloud construction Se cadastrar. Responder as quest\u00f5es Conclus\u00e3o: SOMENTE PARA PENSAR \u00b6 Descreva como o MaaS poderia ser utilizado em um datacenter real (com muitos servidores) e como seria um processo alternativo sem essa ferramenta. Ainda, \u00e9 poss\u00edvel e *SIMPLES* realizar a implanta\u00e7\u00e3o de uma aplica\u00e7\u00e3o usando o MaaS?","title":"MAAS"},{"location":"roteiros/1.Bare_metal/#bare-metal","text":"","title":"Bare Metal"},{"location":"roteiros/1.Bare_metal/#objetivos","text":"Entender os conceitos b\u00e1sicos sobre uma plataforma de gerenciamento de hardware. Introduzir conceitos b\u00e1sicos sobre redes de computadores. Pr\u00e9-requisitos: Realizar a leitura sobre o MaaS. [ https://maas.io/ ]. Info DIVIS\u00c3O DO ROTEIRO O Roteiro \u00e9 dividido em 2 partes principais. Criando a Infraestrutura (Nuvem Bare-metal) Usando a infraestrutura: Django em Nuvem Bare-Metal","title":"Objetivos:"},{"location":"roteiros/1.Bare_metal/#material","text":"O grupo ir\u00e1 contar com os seguintes itens no kit: 1 NUC (main) com 10Gb e 1 SSD (120Gb) 1 NUC (server1) com 12Gb e 1 SSD (120Gb) 1 NUC (server2) com 16Gb e 2 SSD (120Gb+120Gb) 3 NUCs (server3, server4 e server5) com 32Gb e 2 SSD (120Gb+120Gb) 1 Switch DLink DSG-1210-28 de 24 portas 1 Roteador TP-Link TL-R470T+","title":"Material"},{"location":"roteiros/1.Bare_metal/#rede","text":"Atencao as modificacoes necess\u00e1rias apresentadas nos requisitos de projeto citados abaixo, modifique o que for necess\u00e1rio. Cada grupo tem a disposi\u00e7\u00e3o um ponto de rede (cabo preto) com sa\u00edda para a rede interna da faculdade. Requisitos de projeto: Sua rede dever\u00e1 estar segregada fisicamente da rede do Insper. Todos os equipamentos estar\u00e3o conectados e possuem acesso \u00e0 Internet. As NUCs server2 , server3 , server4 e server5 estar\u00e3o conectados \u00e0 rede com 2 (duas) interfaces de rede, uma interna e uma externa USB (NIC). A NUC main e a server1 estar\u00e3o conectadas \u00e0 rede com uma interface de rede interna, a padr\u00e3o do hardware.","title":"Rede"},{"location":"roteiros/1.Bare_metal/#tarefa-confirme-se-as-conexoes-de-rede-feitas-anteriormente-estao-corretas-utilize-o-diagrama-fornecido-no-roteiro-de-cabeamento-e-as-informacoes-acima","text":"Cada kit possui um IP de entrada, fornecido no invent\u00e1rio do kit.","title":"Tarefa: Confirme se as conex\u00f5es de rede feitas anteriormente est\u00e3o corretas. Utilize o diagrama fornecido no roteiro de cabeamento e as informacoes acima."},{"location":"roteiros/1.Bare_metal/#senhas-importante","text":"Todas as senhas do seu sistema devem seguir o seguinte crit\u00e9rio: utilizar a palavra 'cloud' + a letra do kit min\u00fascula. Por exemplo: 'cloudz' \u00e9 a senha padr\u00e3o do kit Z. Usar a mesma senha para todos os servi\u00e7os que exigem cadastramento N\u00c3O alterar nenhuma senha que j\u00e1 esteja pr\u00e9-cadastrada.","title":"Senhas - IMPORTANTE"},{"location":"roteiros/1.Bare_metal/#criando-a-infraestrutura-nuvem-bare-metal","text":"Consulte o diagrama abaixo \"H1 - Diagrama\"","title":"Criando a Infraestrutura (Nuvem Bare-metal)"},{"location":"roteiros/1.Bare_metal/#instalando-o-ubuntu","text":"Procure tutoriais de como instalar o Sistema Operacional Ubuntu server , utilize um pen drive para baixart a imagem e criar um pendrive para boot da instalacao. Instale o Ubuntu Server 22.04 LTS na NUC main: hostname: main login: cloud senha: (cloud + letra do kit) IP fixo: 172.16.0.3","title":"Instalando o Ubuntu"},{"location":"roteiros/1.Bare_metal/#instalando-o-maas","text":"Verifique se consegue pingar '8.8.8.8'. Se n\u00e3o conseguir, descubra como rotear os pacotes corretamente. Verifique se consegue pingar ' www.google.com '. Se n\u00e3o conseguir, descubra como resolver as urls corretamente. $ sudo apt update && sudo apt upgrade -y V\u00e1 tomar um caf\u00e9. $ sudo snap install maas Tenho certeza que voc\u00ea n\u00e3o leu os pr\u00e9-requisitos, ao inv\u00e9s do caf\u00e9 d\u00e1 uma lida na documentacao pedida no comeco do roteiro $ sudo snap install maas-test-db","title":"Instalando o MaaS"},{"location":"roteiros/1.Bare_metal/#acessando-sua-maquina-remotamente","text":"","title":"Acessando sua maquina remotamente."},{"location":"roteiros/1.Bare_metal/#faca-o-acesso-utilizando-ssh","text":"","title":"faca o acesso utilizando SSH"},{"location":"roteiros/1.Bare_metal/#dentro-da-rede-local","text":"ssh cloud@172.16.0.3","title":"Dentro da rede Local"},{"location":"roteiros/1.Bare_metal/#configurando-o-maas","text":"Inicializando o MaaS: $ sudo maas init region+rack $ sudo maas createadmin use o login cloud use a senha padr\u00e3o da disciplina deixe a chave vazia Gerando um par de chaves para autentica\u00e7\u00e3o. $ ssh-keygen -t rsa use senha vazia dessa vez $ cat ./.ssh/id_rsa.pub copie a chave gerada Agora vamos acessar o Dashboard do MaaS: ele estar\u00e1 dispon\u00edvel em http://172.16.0.3:5240/MAAS . Entenda onde o servi\u00e7o esta rodando e fa\u00e7a o login configure um DNS Forwarder com o DNS do Insper (DNS Externo que o seu roteador enxerga). Importe as imagens do Ubuntu 22.04LTS, Ubuntu 20.04 LTS e Ubuntu 18.04 LTS . Fa\u00e7a o upload da chave copiada no terminal SSH. Em Settings | General: Global Kernel Parameters: net.ifnames=0 (sem espa\u00e7os)","title":"Configurando o MaaS"},{"location":"roteiros/1.Bare_metal/#chaveando-o-dhcp","text":"Explore as configura\u00e7\u00f5es do MaaS. Habilite o DHCP na subrede pelo MaaS Controller. ALTERE o Reserved Range para iniciar em 172.16.11.1 e acabar em 172.16.14.255. Deixe o DNS da subnet apontando para o DNS do Insper! Desabilitar o DHCP no roteador.","title":"Chaveando o DHCP"},{"location":"roteiros/1.Bare_metal/#comissionando-servidores","text":"Cadastre os hosts (machines) dispon\u00edveis. Server1 ate Server5 Altere a op\u00e7\u00e3o Power Type para Intel AMT e preencha segundo as informacoes abaixo: MacAddress que voce anotou (Se nao anotou, desmonta os cabos e faz tudo de novo!!!) A senha \u00e9 = CloudComp6s! IP do AMT = 172.16.15.X (sendo X o id do server, por exemplo server1 = 172.16.15.1) As NUCs ir\u00e3o comissionar automaticamente, realizando o boot via PXE na rede. hora do Ch\u00e1 , s\u00f3 aliviar o est\u00f4mago um pouco. Ch\u00e1 tamb\u00e9m tem cafe\u00edna. Todos os n\u00f3s devem aparecer com o status Ready . Verificar se as caracter\u00edsticas de hardware (cpu, mem\u00f3ria, SSD e rede) foram detectados com sucesso. Adicionar o Roteador como devices no Dashboard do MaaS Aten\u00e7\u00e3o : verificar se as interfaces de rede se chamam eth0 (placa rede padr\u00e3o com PXE) e eth1 (NIC usb). Verificar o Global Kernel Parameters, apagar o n\u00f3 e reiniciar o processo caso algo esteja errado .","title":"Comissionando servidores"},{"location":"roteiros/1.Bare_metal/#fazendo-acesso-remoto-ao-seu-kit","text":"De acordo com as aulas te\u00f3ricas, vamos realizar um NAT para permitir o acesso externo \"Rede Wi-fi Insper\" do seu computador ao servidor MAIN . A meta \u00e9 conseguir conectar no servidor principal \"main\" utilizando a porta 22. Libere tambem o acesso ao gerenciamento remoto do seu roteador criando uma regra de gest\u00e3o para a rede 0.0.0.0/0 Se n\u00e3o lembrar das aulas te\u00f3ricas, pesquise por como fazer NAT no Roteador do seu KIT. LINK-documentacao","title":"Fazendo Acesso Remoto ao seu KIT"},{"location":"roteiros/1.Bare_metal/#usando-a-infraestrutura","text":"","title":"Usando a infraestrutura:"},{"location":"roteiros/1.Bare_metal/#django-em-nuvem-bare-metal","text":"","title":"Django em Nuvem Bare-Metal"},{"location":"roteiros/1.Bare_metal/#primeiro-deploy","text":"Vamos realizar um deploy manual de uma aplica\u00e7\u00e3o simples em Django em nossa nuvem MaaS. Antes de come\u00e7ar, realize um pequeno ajuste no DNS server: Dentro da aba Subnets, clicar na subnet 172.16.0.0/20 e editar a Subnet summary colocando o DNS do Insper - 172.20.129.131","title":"Primeiro Deploy"},{"location":"roteiros/1.Bare_metal/#primeira-parte-banco-de-dados","text":"Postgres \u00e9 um servidor de banco de dados vers\u00e1til e de f\u00e1cil manejo. Muito usado em projetos Opensource. Acesse o Dashboard do MaaS e realize o deploy do Ubuntu 22.04 no server1. Acesse o terminal do server1 via SSH: $ sudo apt update $ sudo apt install postgresql postgresql-contrib -y Ainda no terminal do server1, crie agora um usu\u00e1rio para a aplica\u00e7\u00e3o: $ sudo su - postgres $ createuser -s cloud -W Usar a senha: cloud Crie um database para a aplica\u00e7\u00e3o: $ createdb -O cloud tasks Exponha o servi\u00e7o para acesso: $ nano /etc/postgresql/12/main/postgresql.conf Remova o coment\u00e1rio e substitua a string da linha para aceitar conex\u00f5es remotas: listen_addresses = '*' $ nano /etc/postgresql/12/main/pg_hba.conf Adicione a linha que libera qualquer m\u00e1quina dentro da subnet do kit: host all all 172.16.0.0/20 trust Saia do usu\u00e1rio postgres Libere o firewall: $ sudo ufw allow 5432/tcp Reinicie o servi\u00e7o: $ sudo systemctl restart postgresql Ser\u00e1 que \u00e9 poss\u00edvel automatizar esse processo","title":"Primeira parte: Banco de Dados"},{"location":"roteiros/1.Bare_metal/#parte-ii-aplicacao-django","text":"De volta ao maas, vamos subir uma aplica\u00e7\u00e3o ORM Django pr\u00e9 produzida. No lugar de [login], utilize o usu\u00e1rio criado para administrar o MaaS. Pe\u00e7a uma m\u00e1quina direto do cli no terminal agora: $ maas login [login] http://172.16.0.3:5240/MAAS/ Buscar o token no dashboard dentro das configura\u00e7\u00f5es do usu\u00e1rio. Solicite a reserva da m\u00e1quina para o MaaS: $ maas [login] machines allocate name=server2 Anote o campo system_id do json resultante. Realize o deploy via linha de comando, usando o cli: $ maas [login] machine deploy [system_id] Caf\u00e9 ... Aguarde a m\u00e1quina finalizar e entre via ssh nela. No SSH do server2: $ git clone https://github.com/raulikeda/tasks.git Entre no diretorio tasks. $ ./install.sh reboot e aguarde Teste acessando o servi\u00e7o na porta 8080 no terminal do maas: $ wget http://[IP server2]:8080/admin/ Para acessar o servi\u00e7o no seu browser seria necess\u00e1rio fazer um NAT no roteador. Por\u00e9m podemos considerar esse servi\u00e7o como sendo tempor\u00e1rio e podemos usar uma outra forma de expor o servi\u00e7o para fora do kit usando SSH tunnel: Desconecte do SSH do maas Reconecte novamente usando: $ ssh cloud@10.103.0.X -L 8001:[IP server2]:8080 O comando acima ir\u00e1 criar um tunel do servi\u00e7o do server2 na porta 8080 para o seu localhost na porta 8001 usando a conex\u00e3o SSH. Note que \u00e9 importante que a porta 8001 n\u00e3o esteja sendo usada no seu computado. Acesse ent\u00e3o o endere\u00e7o no browser: http://localhost:8001/admin/ Login Django: cloud Senha Django: cloud Tome um tempo olhando o conte\u00fado do arquivo install.sh. Ele automatiza as tarefas de instala\u00e7\u00e3o usando shell script. Note que a utiliza\u00e7\u00e3o do maas-cli no terminal substitui a utiliza\u00e7\u00e3o do dashboard. Tome um tempo explorando: $ maas [login] help commands Caso tenha interesse na aplica\u00e7\u00e3o django: https://docs.djangoproject.com/pt-br/3.1/intro/tutorial01/ Exercise CheckPoint-1 De um print das Telas abaixo: 1. Do Dashboard do **MAAS** com as m\u00e1quinas. 1. Da aba images, com as imagens sincronizadas. 1. Da Aba de cada maquina(5x) mostrando os testes de hardware e commissioning com Status \"OK\"","title":"Parte II: Aplica\u00e7\u00e3o Django"},{"location":"roteiros/1.Bare_metal/#finalizando","text":"Entre no Site e responda as questoes da plataforma PrairieLearn, voc\u00ea deve fazer no minimo de 70 pontos, para poder seguir para o Roteiro 2. LINK da plataforma de quest\u00f5es Acessar com seu usu\u00e1rio de login do INSPER. e-mail institucional As imagens abaixo s\u00e3o da plataforma. Clicar em Enroll Course Procurar o Curso -> NCCC 101: Network concepts for cloud construction Se cadastrar. Responder as quest\u00f5es","title":"Finalizando"},{"location":"roteiros/1.Bare_metal/#conclusao-somente-para-pensar","text":"Descreva como o MaaS poderia ser utilizado em um datacenter real (com muitos servidores) e como seria um processo alternativo sem essa ferramenta. Ainda, \u00e9 poss\u00edvel e *SIMPLES* realizar a implanta\u00e7\u00e3o de uma aplica\u00e7\u00e3o usando o MaaS?","title":"Conclus\u00e3o: SOMENTE PARA PENSAR"},{"location":"roteiros/2.Deployment/","text":"Deployment Orchestration \u00b6 Objetivos: Entender os conceitos b\u00e1sicos sobre uma plataforma de gerenciamento de aplica\u00e7\u00f5es distribu\u00eddas. Entender os conceitos b\u00e1sicos de comunica\u00e7\u00e3o entre aplica\u00e7\u00f5es e servi\u00e7os. Pr\u00e9-requisitos: Terminar o cap\u00edtulo anterior (Bare metal) Realizar a leitura sobre o Juju. [ https://jaas.ai/how-it-works ]. Realizar a leitura sobre redes de computadores. [Kavis - Cap. 6. Tanenbaum & Steen - Cap. 1 e Cap. 12] Info DIVIS\u00c3O DO ROTEIRO O Roteiro \u00e9 dividido em 3 partes principais. Entender a automac\u00e3o do Deploy - Utilizando ferramenta Ansible no Bare-metal Criando Infraestrutura para deploy com Juju (Deployment Orchestration) Utilizando a infraestrutura Bare Metal com o Juju - exemplo de deploy Wordpress Utilizando o Ansible - deploy automatizado de aplica\u00e7\u00e3o \u00b6 Exercise Check-point1: De um print da tela do Dashboard do MAAS com as 2 Maquinas e seus respectivos IPs. De um print da aplicacao Django, provando que voce est\u00e1 conectado ao server 2. Explique como foi feita a implementacao manual da aplicacao Django e banco de dados. Agora teremos 2 aplica\u00e7\u00f5es django (server2 e server3) compartilhando o mesmo banco de dados (server1) . Os motivos para fazermos isso s\u00e3o dois: Alta disponibilidade: se um node cair o outro est\u00e1 no ar, para que nosso cliente acesse. Load Balancing: podemos dividir a carga de acesso entre os n\u00f3s. Vamos realizar a instala\u00e7\u00e3o da mesma aplica\u00e7\u00e3o de forma autom\u00e1tica, por exemplo podemos efetuar a instala\u00e7\u00e3o em diversos servers . Vamos ent\u00e3o utilizar novos conceitos e ferramentas: Exemplo - gerenciador de deploy Ansible ( https://www.ansible.com/ ) Caracter\u00edsticas: Idempotente no sentido de conseguir repetir todos os procedimentos sem afetar os estados intermedi\u00e1rios da insta\u00e7\u00e3o. F\u00e1cil de se lidar com um pool de m\u00e1quinas simultaneamente. Consegue realizar o provisionamento autom\u00e1tico de VMs e Containers (mas n\u00e3o metal). Tarefas: Pe\u00e7a o deploy no server3 para o maas via cli Agora no SSH do main: $ sudo apt install ansible $ wget https://raw.githubusercontent.com/raulikeda/tasks/master/tasks-install-playbook.yaml $ ansible-playbook tasks-install-playbook.yaml --extra-vars server=[IP server3] Exercise Check-point2: Teste o acesso, caso esteja tudo certo, fa\u00e7a a tarefa abaixo De um print da tela do Dashboard do MAAS com as 3 Maquinas e seus respectivos IPs. De um print da aplicacao Django, provando que voce est\u00e1 conectado ao server 2. De um print da aplicacao Django, provando que voce est\u00e1 conectado ao server 3. Explique qual diferenca entre instalar manualmente a aplicacao Django e utilizando o Ansible. Contudo seria ideal que tiv\u00e9ssemos apenas um ponto de entrada, ao inv\u00e9s de escolher manualmente ou chavear os IPs dos n\u00f3s. Balancamento de carga usando Proxy Reverso \u00b6 Para montar o ponto \u00fanico de entrada, utilizaremos uma aplica\u00e7\u00e3o de proxy reverso como load balancer. Voc\u00eas conseguem instalar o NGINX no n\u00f3 server4 como loadbalancer? ... Ent\u00e3o monte este proxy . Tutorial para fazer manual: https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-load-balancing Dicas No arquivo de tasks/views.py de cada Django modifique a mensagem \"Hello World ...\" para conseguir identificar cada server (coloque uma mensagem diferente em cada) C\u00f3digo: from django.shortcuts import render from django.http import HttpResponse def index(request): return HttpResponse(\"Hello, world. You're at the tasks index.\") No arquivo de urls.py customize o seu path no urlpatterns: urlpatterns = [path( ' ', views.index, name='index'),] Exercise Check-point3: Teste o acesso, caso esteja tudo certo, fa\u00e7a a tarefa abaixo De um print da tela do Dashboard do MAAS com as 4 Maquinas e seus respectivos IPs. Altere o conte\u00fado da mensagem contida na fun\u00e7\u00e3o index do arquivo tasks/views.py de cada server para distinguir ambos os servers. Fa\u00e7a um GET request para o path que voce criou em urls.py para o Nginx e tire 2 prints das respostas de cada request, provando que voce est\u00e1 conectado ao server 4, que \u00e9 o Proxy Reverso e que ele bate cada vez em um server diferente Server2 e Server3. Agora que voc\u00ea utilizou um gerenciador de deploy, vamos retormar a cria\u00e7\u00e3o de nuvem utilizando este novo conceito. Remova o deploy (release) de todos n\u00f3s no kit. Criando Infraestrutura para deploy com Juju \u00b6 Ansible \u00e9 um gerenciador de deploy que consegue lidar com a instala\u00e7\u00e3o e configura\u00e7\u00e3o de um conjunto de n\u00f3s pr\u00e9 reservados, mas n\u00e3o consegue realizar o provisionamento direto com o MaaS (gerenciador de Bare-metal). Para montar a nossa Cloud Privada, vamos utilizar outro orquestrador de deploy que integra com o MaaS. Antes de continuar, verifique se todas m\u00e1quinas (server1, server2, server3, server4 e server5) est\u00e3o Ready no MAAS. Fa\u00e7a o release das m\u00e1quinas Django e Postgres caso necess\u00e1rio. Acesse o main via SSH e instale o Juju $ sudo snap install juju --classic --channel=2.9/stable Verifique se o Juju enxerga o MaaS como um provedor de recursos $ juju clouds Caso n\u00e3o possua o MaaS como op\u00e7\u00e3o, deve adicion\u00e1-lo Criar um arquivo de configura\u00e7\u00e3o: maas-juju.yaml (aten\u00e7\u00e3o com a formata\u00e7\u00e3o) clouds: maas: type: maas auth-types: [oauth1] endpoint: http://192.168.0.3:5240/MAAS/ $ juju add-cloud maas maas-juju.yaml $ juju add-credential maas Obs: OAuth \u00e9 o API KEY gerado no MaaS (dentro do menu do usu\u00e1rio) Vamos criar agora o juju controller : $ juju bootstrap --bootstrap-series=jammy maas main --to server1 Para verificar o status do controller utilize: $ juju status Para acessar o Dashboard (via browser): $ juju gui Crie novamente um tunel SSH: $ ssh cloud@[IP Roteador] -L 8080:[IP do Juju GUI]:17070 Acesse do seu browser a url indicada no terminal, adaptando o endere\u00e7o IP. Ao contr\u00e1rio do Ansible, Juju necessita de uma m\u00e1quina exclusiva para controlar todo o deploy. Essa m\u00e1quina \u00e9 alocada automaticamente durante o bootstrap e controlar\u00e1 todo o deploy que faremos no pr\u00f3ximo roteiro. Ainda, assim como voc\u00ea usou o maas-cli na primeira implanta\u00e7\u00e3o, voc\u00ea usou o juju-cli para interagir com o servi\u00e7o. Utilizando a infraestrutura Bare Metal com o Juju \u00b6 Vamos utilizar o Juju para deploy de uma das arquiteturas abaixo. As aplica\u00e7\u00f5es que vamos utilizar s\u00e3o: Grafana junto com o Prometheus Wordpress junto com o MySQL Faca o deploy da Aplicacao Grafana e Prometheus!!! \u00b6 Deploy Grafana e Prometheus \u00b6 O Grafana \u00e9 uma plataforma de c\u00f3digo aberto que simplifica a apresenta\u00e7\u00e3o visual de dados, como gr\u00e1ficos e pain\u00e9is, facilitando a compreens\u00e3o em tempo real de sistemas e informa\u00e7\u00f5es. Para funcionar, o Grafana requer um banco de dados para armazenar configura\u00e7\u00f5es, metadados e informa\u00e7\u00f5es relacionadas \u00e0 exibi\u00e7\u00e3o de dados em seus pain\u00e9is e gr\u00e1ficos. Ele \u00e9 compat\u00edvel com v\u00e1rios bancos de dados, como Prometheus, MySQL, PostgreSQL, InfluxDB, SQLite3 e outros. Neste contexto, estamos utilizando o Prometheus como banco de dados, mas voc\u00ea tem a flexibilidade de escolher outro se preferir. Instale a aplica\u00e7\u00e3o charm para utilizarmos, vamos baixar o charm do Grafana do reposit\u00f3rio charm-hub. Charm O charm \u00e9 como um pacote que cont\u00e9m instru\u00e7\u00f5es sobre como instalar e configurar um aplicativo, como o Grafana . Voc\u00ea simplesmente escolhe o charm do Grafana, define algumas configura\u00e7\u00f5es e o Juju cuida do restante, tornando o processo de implanta\u00e7\u00e3o mais f\u00e1cil e consistente em ambientes de nuvem. Entenda melhor sobre o que \u00e9 o charm lendo a sua documenta\u00e7\u00e3o charm-hub . $ sudo snap install charm --channel=2.x/stable --classic Baixe o charm do https://charmhub.io/grafana usando o comando charm pull . $ charm pull grafana Tamb\u00e9m vamos utilizar o charm do Prometheus $ charm pull prometheus2 Agora \u00e9 s\u00f3 fazer o Deploy com o auxilio do JUJU \u00b6 Fa\u00e7a o deploy do charm prometheus2 , para fazer deploy do charm local, use juju deploy ./pasta Deploy do charm grafana \u00b6 Ao realizar o Deploy do grafana, acompanhe o processo utilizando o comando juju status Caso ocorra um erro durante a instala\u00e7\u00e3o ( hook failed: install ): - Devemos acessar o log da aplica\u00e7\u00e3o via o comando juju debug-log --replay --include grafana/2 * Nos logs voce encontrar\u00e1 mais informa\u00e7\u00f5es da causa do erro NO_PUBKEY * Ele ocorre, pois a chave GPG do reposit\u00f3rio do grafana n\u00e3o est\u00e1 no seu servidor, quando o juju tenta fazer apt-get update o sistema n\u00e3o consegue verificar a autenticidade do reposit\u00f3rio. * Para consertar devemos acessar o servidor do grafana e instalar a chave manualmente: * juju ssh grafana/2 * wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - * sudo apt-get update Ao rodar os comandos acima, a chave ser\u00e1 instalada no sistema. Aguarde alguns instantes e o processo de instala\u00e7\u00e3o do grafana seguir\u00e1 normalmente. Acompanhe o andamento usando o comando juju status . Integrando Grafana com Prometheus \u00b6 Utilize a documenta\u00e7\u00e3o encontrada no README do charm do grafana. Acesse o dashboard do Grafana do seu computador e verifique o funcionamento do sistema. Verifique se a integra\u00e7\u00e3o foi feita corretamente. Para isso crie um dashboard dentro do grafana e adicione uma visualiza\u00e7\u00e3o (deve aparecer o prometheus como source). Exercise Apenas se escolheu fazer o deploy do grafana Checkpoint-4 De um print da tela do Dashboard do MAAS com as Maquinas e seus respectivos IPs. De um print de tela do comando \"juju status\" depois que o Grafana estiver \"active\". De um print da tela do Dashboard do Grafana com o Prometheus aparecendo como source. OPCIONAL - Deploy Wordpress e MySQL \u00b6 O Wordpress \u00e9 uma plataforma de gerenciamento de conte\u00fado (CMS) de c\u00f3digo aberto, baseada em PHP e MySQL. Ele \u00e9 usado por mais de 60 milh\u00f5es de sites, incluindo 33,6% dos 10 milh\u00f5es de sites mais bem classificados. Ele oferece ferramentas poderosas que permitem aos usu\u00e1rios criar, editar e publicar conte\u00fado na web sem a necessidade de conhecimentos avan\u00e7ados em programa\u00e7\u00e3o. Para funcionar, o Wordpress requer um banco de dados para armazenar informa\u00e7\u00f5es relacionadas ao conte\u00fado do site. Ele \u00e9 compat\u00edvel com v\u00e1rios bancos de dados, como MySQL, MariaDB, PostgreSQL, SQLite e outros. Neste contexto, estamos utilizando o MySQL como banco de dados, mas voc\u00ea tem a flexibilidade de escolher outro se preferir. Instale a aplica\u00e7\u00e3o charm para utilizarmos, vamos baixar o charm do Wordpress do reposit\u00f3rio charm-hub. Charm O charm \u00e9 como um pacote que cont\u00e9m instru\u00e7\u00f5es sobre como instalar e configurar um aplicativo, como o Grafana . Voc\u00ea simplesmente escolhe o charm do Grafana, define algumas configura\u00e7\u00f5es e o Juju cuida do restante, tornando o processo de implanta\u00e7\u00e3o mais f\u00e1cil e consistente em ambientes de nuvem. Entenda melhor sobre o que \u00e9 o charm lendo a sua documenta\u00e7\u00e3o charm-hub . $ sudo snap install charm --channel=2.x/stable --classic Baixe o charm do https://charmhub.io/wordpress usando o comando charm pull . $ charm pull wordpress Tamb\u00e9m vamos utilizar um charm previamente modificado do MYSQL ...Fa\u00e7a o clone do reposit\u00f3rio GIT. $ git clone https://github.com/TiagoDemay/charm-mysql.git Agora \u00e9 s\u00f3 fazer o Deploy com o auxilio do JUJU \u00b6 Fa\u00e7a o deploy do charm charm-mysql , para fazer deploy do charm local, use juju deploy ./pasta Modifique o charm wordpress \u00b6 Dentro do diret\u00f3rio criado, edite o arquivo metadata.yaml : modifique para utilizar apenas Ubuntu Bionic Fa\u00e7a o deploy do charm wordpress alterado localmente , utilize a documenta\u00e7\u00e3o encontrada no README do charm do wordpress que voc\u00eas baixaram, pare antes do capitulo Scaled Down Usage for Personal Use Acompanhe o andamento usando o comando juju status , ap\u00f3s terminado, acesse o Wordpress do seu computador, e verifique o funcionamento do sistema Limpeza de ambiente \u00b6 Limpe o deploy do Juju usando o command: juju destroy-controller main Voce far\u00e1 um semin\u00e1rio sobre um tema pr\u00e9 definido, para completar a entrega deste roteiro ... peca o tema para o professor. \u00b6 Conclus\u00e3o: SOMENTE PARA PENSAR \u00b6 O Ansible utilizou indiretamente o MaaS como provedor de recursos f\u00edsicos. O MaaS por sua vez forneceu o que havia dispon\u00edvel no rack. Voc\u00ea acha que seria necess\u00e1ria uma m\u00e1quina de 32Gb para rodar um Webserver ou um Load Balancer ? Extrapole a resposta para um Datacenter real, onde as m\u00e1quinas possuem configura\u00e7\u00f5es muito superiores. Como resolver esse problema?","title":"Computa\u00e7\u00e3o em Nuvem"},{"location":"roteiros/2.Deployment/#deployment-orchestration","text":"Objetivos: Entender os conceitos b\u00e1sicos sobre uma plataforma de gerenciamento de aplica\u00e7\u00f5es distribu\u00eddas. Entender os conceitos b\u00e1sicos de comunica\u00e7\u00e3o entre aplica\u00e7\u00f5es e servi\u00e7os. Pr\u00e9-requisitos: Terminar o cap\u00edtulo anterior (Bare metal) Realizar a leitura sobre o Juju. [ https://jaas.ai/how-it-works ]. Realizar a leitura sobre redes de computadores. [Kavis - Cap. 6. Tanenbaum & Steen - Cap. 1 e Cap. 12] Info DIVIS\u00c3O DO ROTEIRO O Roteiro \u00e9 dividido em 3 partes principais. Entender a automac\u00e3o do Deploy - Utilizando ferramenta Ansible no Bare-metal Criando Infraestrutura para deploy com Juju (Deployment Orchestration) Utilizando a infraestrutura Bare Metal com o Juju - exemplo de deploy Wordpress","title":"Deployment Orchestration"},{"location":"roteiros/2.Deployment/#utilizando-o-ansible-deploy-automatizado-de-aplicacao","text":"Exercise Check-point1: De um print da tela do Dashboard do MAAS com as 2 Maquinas e seus respectivos IPs. De um print da aplicacao Django, provando que voce est\u00e1 conectado ao server 2. Explique como foi feita a implementacao manual da aplicacao Django e banco de dados. Agora teremos 2 aplica\u00e7\u00f5es django (server2 e server3) compartilhando o mesmo banco de dados (server1) . Os motivos para fazermos isso s\u00e3o dois: Alta disponibilidade: se um node cair o outro est\u00e1 no ar, para que nosso cliente acesse. Load Balancing: podemos dividir a carga de acesso entre os n\u00f3s. Vamos realizar a instala\u00e7\u00e3o da mesma aplica\u00e7\u00e3o de forma autom\u00e1tica, por exemplo podemos efetuar a instala\u00e7\u00e3o em diversos servers . Vamos ent\u00e3o utilizar novos conceitos e ferramentas: Exemplo - gerenciador de deploy Ansible ( https://www.ansible.com/ ) Caracter\u00edsticas: Idempotente no sentido de conseguir repetir todos os procedimentos sem afetar os estados intermedi\u00e1rios da insta\u00e7\u00e3o. F\u00e1cil de se lidar com um pool de m\u00e1quinas simultaneamente. Consegue realizar o provisionamento autom\u00e1tico de VMs e Containers (mas n\u00e3o metal). Tarefas: Pe\u00e7a o deploy no server3 para o maas via cli Agora no SSH do main: $ sudo apt install ansible $ wget https://raw.githubusercontent.com/raulikeda/tasks/master/tasks-install-playbook.yaml $ ansible-playbook tasks-install-playbook.yaml --extra-vars server=[IP server3] Exercise Check-point2: Teste o acesso, caso esteja tudo certo, fa\u00e7a a tarefa abaixo De um print da tela do Dashboard do MAAS com as 3 Maquinas e seus respectivos IPs. De um print da aplicacao Django, provando que voce est\u00e1 conectado ao server 2. De um print da aplicacao Django, provando que voce est\u00e1 conectado ao server 3. Explique qual diferenca entre instalar manualmente a aplicacao Django e utilizando o Ansible. Contudo seria ideal que tiv\u00e9ssemos apenas um ponto de entrada, ao inv\u00e9s de escolher manualmente ou chavear os IPs dos n\u00f3s.","title":"Utilizando o Ansible - deploy automatizado de aplica\u00e7\u00e3o"},{"location":"roteiros/2.Deployment/#balancamento-de-carga-usando-proxy-reverso","text":"Para montar o ponto \u00fanico de entrada, utilizaremos uma aplica\u00e7\u00e3o de proxy reverso como load balancer. Voc\u00eas conseguem instalar o NGINX no n\u00f3 server4 como loadbalancer? ... Ent\u00e3o monte este proxy . Tutorial para fazer manual: https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-load-balancing Dicas No arquivo de tasks/views.py de cada Django modifique a mensagem \"Hello World ...\" para conseguir identificar cada server (coloque uma mensagem diferente em cada) C\u00f3digo: from django.shortcuts import render from django.http import HttpResponse def index(request): return HttpResponse(\"Hello, world. You're at the tasks index.\") No arquivo de urls.py customize o seu path no urlpatterns: urlpatterns = [path( ' ', views.index, name='index'),] Exercise Check-point3: Teste o acesso, caso esteja tudo certo, fa\u00e7a a tarefa abaixo De um print da tela do Dashboard do MAAS com as 4 Maquinas e seus respectivos IPs. Altere o conte\u00fado da mensagem contida na fun\u00e7\u00e3o index do arquivo tasks/views.py de cada server para distinguir ambos os servers. Fa\u00e7a um GET request para o path que voce criou em urls.py para o Nginx e tire 2 prints das respostas de cada request, provando que voce est\u00e1 conectado ao server 4, que \u00e9 o Proxy Reverso e que ele bate cada vez em um server diferente Server2 e Server3. Agora que voc\u00ea utilizou um gerenciador de deploy, vamos retormar a cria\u00e7\u00e3o de nuvem utilizando este novo conceito. Remova o deploy (release) de todos n\u00f3s no kit.","title":"Balancamento de carga usando Proxy Reverso"},{"location":"roteiros/2.Deployment/#criando-infraestrutura-para-deploy-com-juju","text":"Ansible \u00e9 um gerenciador de deploy que consegue lidar com a instala\u00e7\u00e3o e configura\u00e7\u00e3o de um conjunto de n\u00f3s pr\u00e9 reservados, mas n\u00e3o consegue realizar o provisionamento direto com o MaaS (gerenciador de Bare-metal). Para montar a nossa Cloud Privada, vamos utilizar outro orquestrador de deploy que integra com o MaaS. Antes de continuar, verifique se todas m\u00e1quinas (server1, server2, server3, server4 e server5) est\u00e3o Ready no MAAS. Fa\u00e7a o release das m\u00e1quinas Django e Postgres caso necess\u00e1rio. Acesse o main via SSH e instale o Juju $ sudo snap install juju --classic --channel=2.9/stable Verifique se o Juju enxerga o MaaS como um provedor de recursos $ juju clouds Caso n\u00e3o possua o MaaS como op\u00e7\u00e3o, deve adicion\u00e1-lo Criar um arquivo de configura\u00e7\u00e3o: maas-juju.yaml (aten\u00e7\u00e3o com a formata\u00e7\u00e3o) clouds: maas: type: maas auth-types: [oauth1] endpoint: http://192.168.0.3:5240/MAAS/ $ juju add-cloud maas maas-juju.yaml $ juju add-credential maas Obs: OAuth \u00e9 o API KEY gerado no MaaS (dentro do menu do usu\u00e1rio) Vamos criar agora o juju controller : $ juju bootstrap --bootstrap-series=jammy maas main --to server1 Para verificar o status do controller utilize: $ juju status Para acessar o Dashboard (via browser): $ juju gui Crie novamente um tunel SSH: $ ssh cloud@[IP Roteador] -L 8080:[IP do Juju GUI]:17070 Acesse do seu browser a url indicada no terminal, adaptando o endere\u00e7o IP. Ao contr\u00e1rio do Ansible, Juju necessita de uma m\u00e1quina exclusiva para controlar todo o deploy. Essa m\u00e1quina \u00e9 alocada automaticamente durante o bootstrap e controlar\u00e1 todo o deploy que faremos no pr\u00f3ximo roteiro. Ainda, assim como voc\u00ea usou o maas-cli na primeira implanta\u00e7\u00e3o, voc\u00ea usou o juju-cli para interagir com o servi\u00e7o.","title":"Criando Infraestrutura para deploy com Juju"},{"location":"roteiros/2.Deployment/#utilizando-a-infraestrutura-bare-metal-com-o-juju","text":"Vamos utilizar o Juju para deploy de uma das arquiteturas abaixo. As aplica\u00e7\u00f5es que vamos utilizar s\u00e3o: Grafana junto com o Prometheus Wordpress junto com o MySQL","title":"Utilizando a infraestrutura Bare Metal com o Juju"},{"location":"roteiros/2.Deployment/#faca-o-deploy-da-aplicacao-grafana-e-prometheus","text":"","title":"Faca o deploy da Aplicacao Grafana e Prometheus!!!"},{"location":"roteiros/2.Deployment/#deploy-grafana-e-prometheus","text":"O Grafana \u00e9 uma plataforma de c\u00f3digo aberto que simplifica a apresenta\u00e7\u00e3o visual de dados, como gr\u00e1ficos e pain\u00e9is, facilitando a compreens\u00e3o em tempo real de sistemas e informa\u00e7\u00f5es. Para funcionar, o Grafana requer um banco de dados para armazenar configura\u00e7\u00f5es, metadados e informa\u00e7\u00f5es relacionadas \u00e0 exibi\u00e7\u00e3o de dados em seus pain\u00e9is e gr\u00e1ficos. Ele \u00e9 compat\u00edvel com v\u00e1rios bancos de dados, como Prometheus, MySQL, PostgreSQL, InfluxDB, SQLite3 e outros. Neste contexto, estamos utilizando o Prometheus como banco de dados, mas voc\u00ea tem a flexibilidade de escolher outro se preferir. Instale a aplica\u00e7\u00e3o charm para utilizarmos, vamos baixar o charm do Grafana do reposit\u00f3rio charm-hub. Charm O charm \u00e9 como um pacote que cont\u00e9m instru\u00e7\u00f5es sobre como instalar e configurar um aplicativo, como o Grafana . Voc\u00ea simplesmente escolhe o charm do Grafana, define algumas configura\u00e7\u00f5es e o Juju cuida do restante, tornando o processo de implanta\u00e7\u00e3o mais f\u00e1cil e consistente em ambientes de nuvem. Entenda melhor sobre o que \u00e9 o charm lendo a sua documenta\u00e7\u00e3o charm-hub . $ sudo snap install charm --channel=2.x/stable --classic Baixe o charm do https://charmhub.io/grafana usando o comando charm pull . $ charm pull grafana Tamb\u00e9m vamos utilizar o charm do Prometheus $ charm pull prometheus2","title":"Deploy Grafana e Prometheus"},{"location":"roteiros/2.Deployment/#agora-e-so-fazer-o-deploy-com-o-auxilio-do-juju","text":"Fa\u00e7a o deploy do charm prometheus2 , para fazer deploy do charm local, use juju deploy ./pasta","title":"Agora \u00e9 s\u00f3 fazer o Deploy com o auxilio do JUJU"},{"location":"roteiros/2.Deployment/#deploy-do-charm-grafana","text":"Ao realizar o Deploy do grafana, acompanhe o processo utilizando o comando juju status Caso ocorra um erro durante a instala\u00e7\u00e3o ( hook failed: install ): - Devemos acessar o log da aplica\u00e7\u00e3o via o comando juju debug-log --replay --include grafana/2 * Nos logs voce encontrar\u00e1 mais informa\u00e7\u00f5es da causa do erro NO_PUBKEY * Ele ocorre, pois a chave GPG do reposit\u00f3rio do grafana n\u00e3o est\u00e1 no seu servidor, quando o juju tenta fazer apt-get update o sistema n\u00e3o consegue verificar a autenticidade do reposit\u00f3rio. * Para consertar devemos acessar o servidor do grafana e instalar a chave manualmente: * juju ssh grafana/2 * wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - * sudo apt-get update Ao rodar os comandos acima, a chave ser\u00e1 instalada no sistema. Aguarde alguns instantes e o processo de instala\u00e7\u00e3o do grafana seguir\u00e1 normalmente. Acompanhe o andamento usando o comando juju status .","title":"Deploy do charm grafana"},{"location":"roteiros/2.Deployment/#integrando-grafana-com-prometheus","text":"Utilize a documenta\u00e7\u00e3o encontrada no README do charm do grafana. Acesse o dashboard do Grafana do seu computador e verifique o funcionamento do sistema. Verifique se a integra\u00e7\u00e3o foi feita corretamente. Para isso crie um dashboard dentro do grafana e adicione uma visualiza\u00e7\u00e3o (deve aparecer o prometheus como source). Exercise Apenas se escolheu fazer o deploy do grafana Checkpoint-4 De um print da tela do Dashboard do MAAS com as Maquinas e seus respectivos IPs. De um print de tela do comando \"juju status\" depois que o Grafana estiver \"active\". De um print da tela do Dashboard do Grafana com o Prometheus aparecendo como source.","title":"Integrando Grafana com Prometheus"},{"location":"roteiros/2.Deployment/#opcional-deploy-wordpress-e-mysql","text":"O Wordpress \u00e9 uma plataforma de gerenciamento de conte\u00fado (CMS) de c\u00f3digo aberto, baseada em PHP e MySQL. Ele \u00e9 usado por mais de 60 milh\u00f5es de sites, incluindo 33,6% dos 10 milh\u00f5es de sites mais bem classificados. Ele oferece ferramentas poderosas que permitem aos usu\u00e1rios criar, editar e publicar conte\u00fado na web sem a necessidade de conhecimentos avan\u00e7ados em programa\u00e7\u00e3o. Para funcionar, o Wordpress requer um banco de dados para armazenar informa\u00e7\u00f5es relacionadas ao conte\u00fado do site. Ele \u00e9 compat\u00edvel com v\u00e1rios bancos de dados, como MySQL, MariaDB, PostgreSQL, SQLite e outros. Neste contexto, estamos utilizando o MySQL como banco de dados, mas voc\u00ea tem a flexibilidade de escolher outro se preferir. Instale a aplica\u00e7\u00e3o charm para utilizarmos, vamos baixar o charm do Wordpress do reposit\u00f3rio charm-hub. Charm O charm \u00e9 como um pacote que cont\u00e9m instru\u00e7\u00f5es sobre como instalar e configurar um aplicativo, como o Grafana . Voc\u00ea simplesmente escolhe o charm do Grafana, define algumas configura\u00e7\u00f5es e o Juju cuida do restante, tornando o processo de implanta\u00e7\u00e3o mais f\u00e1cil e consistente em ambientes de nuvem. Entenda melhor sobre o que \u00e9 o charm lendo a sua documenta\u00e7\u00e3o charm-hub . $ sudo snap install charm --channel=2.x/stable --classic Baixe o charm do https://charmhub.io/wordpress usando o comando charm pull . $ charm pull wordpress Tamb\u00e9m vamos utilizar um charm previamente modificado do MYSQL ...Fa\u00e7a o clone do reposit\u00f3rio GIT. $ git clone https://github.com/TiagoDemay/charm-mysql.git","title":"OPCIONAL - Deploy Wordpress e MySQL"},{"location":"roteiros/2.Deployment/#agora-e-so-fazer-o-deploy-com-o-auxilio-do-juju_1","text":"Fa\u00e7a o deploy do charm charm-mysql , para fazer deploy do charm local, use juju deploy ./pasta","title":"Agora \u00e9 s\u00f3 fazer o Deploy com o auxilio do JUJU"},{"location":"roteiros/2.Deployment/#modifique-o-charm-wordpress","text":"Dentro do diret\u00f3rio criado, edite o arquivo metadata.yaml : modifique para utilizar apenas Ubuntu Bionic Fa\u00e7a o deploy do charm wordpress alterado localmente , utilize a documenta\u00e7\u00e3o encontrada no README do charm do wordpress que voc\u00eas baixaram, pare antes do capitulo Scaled Down Usage for Personal Use Acompanhe o andamento usando o comando juju status , ap\u00f3s terminado, acesse o Wordpress do seu computador, e verifique o funcionamento do sistema","title":"Modifique o charm wordpress"},{"location":"roteiros/2.Deployment/#limpeza-de-ambiente","text":"Limpe o deploy do Juju usando o command: juju destroy-controller main","title":"Limpeza de ambiente"},{"location":"roteiros/2.Deployment/#voce-fara-um-seminario-sobre-um-tema-pre-definido-para-completar-a-entrega-deste-roteiro-peca-o-tema-para-o-professor","text":"","title":"Voce far\u00e1 um semin\u00e1rio sobre um tema pr\u00e9 definido, para completar a entrega deste roteiro ... peca o tema para o professor."},{"location":"roteiros/2.Deployment/#conclusao-somente-para-pensar","text":"O Ansible utilizou indiretamente o MaaS como provedor de recursos f\u00edsicos. O MaaS por sua vez forneceu o que havia dispon\u00edvel no rack. Voc\u00ea acha que seria necess\u00e1ria uma m\u00e1quina de 32Gb para rodar um Webserver ou um Load Balancer ? Extrapole a resposta para um Datacenter real, onde as m\u00e1quinas possuem configura\u00e7\u00f5es muito superiores. Como resolver esse problema?","title":"Conclus\u00e3o: SOMENTE PARA PENSAR"},{"location":"roteiros/3.Private_Cloud_Stack/","text":"Private cloud \u00b6 Objetivos Entender os conceitos b\u00e1sicos de Private Cloud. Aprofundar conceitos sobre redes virtuais SDN. Pr\u00e9-requisitos: Terminar o cap\u00edtulo anterior (Juju) Realizar a leitura sobre o Openstack. [ https://www.openstack.org/ ]. Realizar a leitura sobre o Openstack. [Jackson et al - Cap. 1 at\u00e9 Cap. 5] Info DIVIS\u00c3O DO ROTEIRO O Roteiro \u00e9 dividido em 2 partes principais. Criando a Infraestrutura (Nuvem VM) - Servidor Virtual Privado (VPS) Uso da Infraestrutura: Django na Nuvem VM criada Criando a Infraestrutura (Nuvem VM) - Servidor Virtual Privado (VPS) \u00b6 Nesse roteiro vamos instalar um conjunto de aplica\u00e7\u00f5es denominado Openstack que vai permitir distribuirmos virtual machines usando os n\u00f3s dispon\u00edveis no kit. At\u00e9 o momento usamos o mass para orquestrar o bare metal e o juju para cuidar do deployment de aplicacoes (exemplo Wordpress). E agora vamos utilizar o Openstack para criar VMs e distribuir os servi\u00e7os em todas as m\u00e1quinas kit com maior eficiencia. Instalando - Openstack Canonical Distro \u00b6 Fa\u00e7a o download do charm Openstack Base no maas: $ charm pull cs:openstack-base Dentro do diret\u00f3rio criado, edite o arquivo bundle.yaml : identifique quantas m\u00e1quinas ser\u00e3o alocadas. verifique cada um dos servi\u00e7os que ser\u00e3o instalados e em quais m\u00e1quinas. sete o nome do adaptador de rede, br-ex:eth1 na vari\u00e1vel data-port . Cuidado para n\u00e3o errar (seguir https://charmhub.io/openstack-base ) variables: openstack-origin: &openstack-origin cloud:focal-yoga data-port: &data-port br-ex:eth1 worker-multiplier: &worker-multiplier 0.25 osd-devices: &osd-devices /dev/sdb /dev/vdb expected-osd-count: &expected-osd-count 3 expected-mon-count: &expected-mon-count 3 Reservar (Allocate) a m\u00e1quina \"server2\" no maas. Instale o bundle customizado: $ juju deploy ./bundle.yaml Hora da leitura na documentacao pedida no comeco do roteiro Warning Provavelmente ocorreu um erro no deploy . ??? Conceito importante: Ao contr\u00e1rio do Ansible, Juju necessita de uma m\u00e1quina exclusiva para controlar todo o deploy. Essa m\u00e1quina \u00e9 alocada automaticamente durante o bootstrap e controlar\u00e1 todo o deploy. Logo voc\u00ea precisa fazer o bootstrap de um novo controlador no server1. Voc\u00eas j\u00e1 sabem o que fazer agora: utilizar o comando abaixo para ficar de olho no status do Juju: $ watch -n 2 -c \"juju status --color\" Enquanto aguarda a insta\u00e7\u00e3o at\u00e9 a indica\u00e7\u00e3o 'certificates' awaiting server certificate data e at\u00e9 que o servi\u00e7o Vault esteja bloqueado. Responda abaixo: Exercise QUESTOES-1 Conforme visto no arquivo de instala\u00e7\u00e3o, os servi\u00e7os s\u00e3o instalados usando LXD nos nodes. O que \u00e9 LXD? O que \u00e9 o bundle.yaml? Vault \u00e9 um servidor de secrets . Como ele funciona e para o que ele \u00e9 usado? Abrindo o cofre \u00b6 Para dar prosseguimento, precisamos instalar um certificado v\u00e1lido dentro do Vault, para isso precisamos fazer uma opera\u00e7\u00e3o de unseal : Instalando o cli do Vault e configurando-o: $ sudo snap install vault $ export VAULT_ADDR=\"http://:8200\" Gerando : $ vault operator init -key-shares=5 -key-threshold=3 Voc\u00eas receber\u00e3o 5 Unseal Keys e 1 Initial Root Token . Copie e reserve. Removendo o selo, repita a opera\u00e7\u00e3o com 3 keys diferentes: $ vault operator unseal Autorizando o charm (esse passo precisa ser feito em 10 minutos): $ export VAULT_TOKEN= $ vault token create -ttl=10m anote o token gerado pelo comando e use abaixo. $ juju run-action --wait vault/leader authorize-charm token= Finalmente, gerando o certificado: $ juju run-action --wait vault/leader generate-root-ca Espere at\u00e9 TODOS os servicos ficarem com o Status \"active\". Configurando o Openstack \u00b6 Chegou a hora de configurar o servi\u00e7o que controla as VMs (Nova), os volumes de disco (Cinder) e a estrutura de rede virtual (Neutron). O primeiro passo \u00e9 carregar as vari\u00e1veis de ambiente e autenticar (Keystone) no sistema. Ainda, montaremos o nosso servidor de imagens (Glance), que utiliza o Object Storage (Ceph) para armazenamento. O sistema ainda conta com um dashboard (Horizon), um cluster de banco de dados (Mysql Inno Cluster) e um servidor de filas (RabbitMQ) como apoio. Usando como base a p\u00e1gina do charm instalado ( https://jaas.ai/openstack-base/ ), LEIA O DOCUMENTO INTEIRO ANTES DE INICIAR OS COMANDOS. \u00b6 Acesse o Horizon ( dashboard ) como administrador, e mantenha ele aberto durante todo o setup do openstack (para ver as mudan\u00e7as acontecendo!) \u00b6 Dica O Domain name \u00e9 : admin_domain Exercise CheckPoint-1 De um print das Telas abaixo: Do Dashboard do MAAS com as m\u00e1quinas. Da aba compute overview no OpenStack . Da aba compute instances no OpenStack . Da aba network topology no OpenStack . Pense na estrutura de rede do seu KIT (Altere os Ips dos exemplos de comandos caso necess\u00e1rio) \u00b6 Prestem muita aten\u00e7\u00e3o nos passos! N\u00e3o copie e cole comandos sem verificar os argumentos. Come\u00e7e a partir da se\u00e7\u00e3o Install the OpenStack clients Instale o client do Openstack no maas via snap. Carregue as credenciais em openrc e verifique os servi\u00e7os: $ openstack service list Fa\u00e7a pequenos ajustes na rede: $ juju config neutron-api enable-ml2-dns=\"true\" $ juju config neutron-api-plugin-ovn dns-servers=\"X.X.0.1\" Importe a imagem do Ubuntu Jammy. Voc\u00ea precisar\u00e1 procurar esta imagem. Configure a rede externa. Usar uma faixa de aloca\u00e7\u00e3o entre X.X.7.0 e X.X.8.255. A partir de agora voc\u00ea criara uma rede interna na sua n\u00favem privada, use os valores dados abaixo. \u00b6 Crie a rede interna e o roteador. Usar a subnet 192.169.0.0/24. N\u00e3o use DNS. Analise o comando: $ openstack flavor create --help Crie os flavors (instance type) - SEM ephemeral disk : m1.tiny: 1 vcpu/1Gb RAM/20Gb disk m1.small: 1 vcpus/2Gb RAM/20Gb disk m1.medium: 2 vcpus/4Gb RAM/20Gb disk m1.large: 4 vcpus/8Gb RAM/20Gb disk Importe (upload) um key-pair, usando public key (id_rsa.pub) do pr\u00f3prio MaaS. Acesse o Horizon ( dashboard ) como administrador: Adicione a libera\u00e7\u00e3o do SSH e ALL ICMP no security group default . Verifique se a topologia de rede faz sentido. Ela deve ser semelhante ao projeto da sua rede f\u00edsica, por\u00e9m com mais um n\u00edvel dentro. Essa rede n\u00e3o existe fisicamente, \u00e9 tudo virtual. Dispare uma inst\u00e2ncia m1.tiny com o nome client e sem Novo Volume . Aloque um floating IP para a inst\u00e2ncia. Teste a conex\u00e3o SSH! Em caso de erro, volte e verifique se as etapas anteriores est\u00e3o corretas. Exercise CheckPoint-2 De um print das Telas abaixo: Do Dashboard do MAAS com as m\u00e1quinas. Da aba compute overview no OpenStack . Da aba compute instances no OpenStack . Da aba network topology no OpenStack . Enumere as diferencas encontradas entre os prints das telas no Checkpoint1 e o Checkpoint-2. Explique como cada recurso foi criado. Escalando os n\u00f3s \u00b6 Vamos adicionar o openstack no cluster como n\u00f3 de computing e block storage . Verfique no Dashboard do MaaS se ainda h\u00e1 uma m\u00e1quina dispon\u00edvel (m\u00e1quina que reservamos/allocated). Fa\u00e7a o release da m\u00e1quina que est\u00e1 ALLOCATED (cuidado para n\u00e3o errar!) Instale o hypervisor, realizando o deploy na m\u00e1quina: $ juju add-unit nova-compute Anote o n\u00famero da m\u00e1quina adicionada no status e instale o block storage: $ juju add-unit --to ceph-osd Exercise QUESTOES-2 Fa\u00e7a um desenho de como \u00e9 a sua arquitetura de rede, desde a sua conex\u00e3o com o Insper at\u00e9 a inst\u00e2ncia alocada. Uso da Infraestrutura: Django na Nuvem VM criada \u00b6 Agora conseguimos corrigir o erro apontado na conclus\u00e3o do H2, levantando a mesma aplica\u00e7\u00e3o django mas sem precisar sacrificar 4 m\u00e1quinas inteiras. \u00b6 Tarefa : Levantar a aplica\u00e7\u00e3o -> 2 instancias com django 1 com banco de dados e 1 com Nginx em cima das maquinas virtuais do Openstack. TOPOLOGIA: Exercise Escreva um relat\u00f3rio dos passos utilizados.(pode ser digitado no word!!!!!!!) Anexe fotos e/ou diagramas contendo: arquitetura de rede do Django dentro do Openstack ( Dica: use o dashboard do Openstack ), lista de VMs utilizadas com nome e IPs alocados, foto do Dashboard Django conectado na m\u00e1quina Nginx/LB.","title":"Computa\u00e7\u00e3o em Nuvem"},{"location":"roteiros/3.Private_Cloud_Stack/#private-cloud","text":"Objetivos Entender os conceitos b\u00e1sicos de Private Cloud. Aprofundar conceitos sobre redes virtuais SDN. Pr\u00e9-requisitos: Terminar o cap\u00edtulo anterior (Juju) Realizar a leitura sobre o Openstack. [ https://www.openstack.org/ ]. Realizar a leitura sobre o Openstack. [Jackson et al - Cap. 1 at\u00e9 Cap. 5] Info DIVIS\u00c3O DO ROTEIRO O Roteiro \u00e9 dividido em 2 partes principais. Criando a Infraestrutura (Nuvem VM) - Servidor Virtual Privado (VPS) Uso da Infraestrutura: Django na Nuvem VM criada","title":"Private cloud"},{"location":"roteiros/3.Private_Cloud_Stack/#criando-a-infraestrutura-nuvem-vm-servidor-virtual-privado-vps","text":"Nesse roteiro vamos instalar um conjunto de aplica\u00e7\u00f5es denominado Openstack que vai permitir distribuirmos virtual machines usando os n\u00f3s dispon\u00edveis no kit. At\u00e9 o momento usamos o mass para orquestrar o bare metal e o juju para cuidar do deployment de aplicacoes (exemplo Wordpress). E agora vamos utilizar o Openstack para criar VMs e distribuir os servi\u00e7os em todas as m\u00e1quinas kit com maior eficiencia.","title":"Criando a Infraestrutura (Nuvem VM) - Servidor Virtual Privado (VPS)"},{"location":"roteiros/3.Private_Cloud_Stack/#instalando-openstack-canonical-distro","text":"Fa\u00e7a o download do charm Openstack Base no maas: $ charm pull cs:openstack-base Dentro do diret\u00f3rio criado, edite o arquivo bundle.yaml : identifique quantas m\u00e1quinas ser\u00e3o alocadas. verifique cada um dos servi\u00e7os que ser\u00e3o instalados e em quais m\u00e1quinas. sete o nome do adaptador de rede, br-ex:eth1 na vari\u00e1vel data-port . Cuidado para n\u00e3o errar (seguir https://charmhub.io/openstack-base ) variables: openstack-origin: &openstack-origin cloud:focal-yoga data-port: &data-port br-ex:eth1 worker-multiplier: &worker-multiplier 0.25 osd-devices: &osd-devices /dev/sdb /dev/vdb expected-osd-count: &expected-osd-count 3 expected-mon-count: &expected-mon-count 3 Reservar (Allocate) a m\u00e1quina \"server2\" no maas. Instale o bundle customizado: $ juju deploy ./bundle.yaml Hora da leitura na documentacao pedida no comeco do roteiro Warning Provavelmente ocorreu um erro no deploy . ??? Conceito importante: Ao contr\u00e1rio do Ansible, Juju necessita de uma m\u00e1quina exclusiva para controlar todo o deploy. Essa m\u00e1quina \u00e9 alocada automaticamente durante o bootstrap e controlar\u00e1 todo o deploy. Logo voc\u00ea precisa fazer o bootstrap de um novo controlador no server1. Voc\u00eas j\u00e1 sabem o que fazer agora: utilizar o comando abaixo para ficar de olho no status do Juju: $ watch -n 2 -c \"juju status --color\" Enquanto aguarda a insta\u00e7\u00e3o at\u00e9 a indica\u00e7\u00e3o 'certificates' awaiting server certificate data e at\u00e9 que o servi\u00e7o Vault esteja bloqueado. Responda abaixo: Exercise QUESTOES-1 Conforme visto no arquivo de instala\u00e7\u00e3o, os servi\u00e7os s\u00e3o instalados usando LXD nos nodes. O que \u00e9 LXD? O que \u00e9 o bundle.yaml? Vault \u00e9 um servidor de secrets . Como ele funciona e para o que ele \u00e9 usado?","title":"Instalando - Openstack Canonical Distro"},{"location":"roteiros/3.Private_Cloud_Stack/#abrindo-o-cofre","text":"Para dar prosseguimento, precisamos instalar um certificado v\u00e1lido dentro do Vault, para isso precisamos fazer uma opera\u00e7\u00e3o de unseal : Instalando o cli do Vault e configurando-o: $ sudo snap install vault $ export VAULT_ADDR=\"http://:8200\" Gerando : $ vault operator init -key-shares=5 -key-threshold=3 Voc\u00eas receber\u00e3o 5 Unseal Keys e 1 Initial Root Token . Copie e reserve. Removendo o selo, repita a opera\u00e7\u00e3o com 3 keys diferentes: $ vault operator unseal Autorizando o charm (esse passo precisa ser feito em 10 minutos): $ export VAULT_TOKEN= $ vault token create -ttl=10m anote o token gerado pelo comando e use abaixo. $ juju run-action --wait vault/leader authorize-charm token= Finalmente, gerando o certificado: $ juju run-action --wait vault/leader generate-root-ca Espere at\u00e9 TODOS os servicos ficarem com o Status \"active\".","title":"Abrindo o cofre"},{"location":"roteiros/3.Private_Cloud_Stack/#configurando-o-openstack","text":"Chegou a hora de configurar o servi\u00e7o que controla as VMs (Nova), os volumes de disco (Cinder) e a estrutura de rede virtual (Neutron). O primeiro passo \u00e9 carregar as vari\u00e1veis de ambiente e autenticar (Keystone) no sistema. Ainda, montaremos o nosso servidor de imagens (Glance), que utiliza o Object Storage (Ceph) para armazenamento. O sistema ainda conta com um dashboard (Horizon), um cluster de banco de dados (Mysql Inno Cluster) e um servidor de filas (RabbitMQ) como apoio.","title":"Configurando o Openstack"},{"location":"roteiros/3.Private_Cloud_Stack/#usando-como-base-a-pagina-do-charm-instalado-httpsjaasaiopenstack-base-leia-o-documento-inteiro-antes-de-iniciar-os-comandos","text":"","title":"Usando como base a p\u00e1gina do charm instalado (https://jaas.ai/openstack-base/), LEIA O DOCUMENTO INTEIRO ANTES DE INICIAR OS COMANDOS."},{"location":"roteiros/3.Private_Cloud_Stack/#acesse-o-horizon-dashboard-como-administrador-e-mantenha-ele-aberto-durante-todo-o-setup-do-openstack-para-ver-as-mudancas-acontecendo","text":"Dica O Domain name \u00e9 : admin_domain Exercise CheckPoint-1 De um print das Telas abaixo: Do Dashboard do MAAS com as m\u00e1quinas. Da aba compute overview no OpenStack . Da aba compute instances no OpenStack . Da aba network topology no OpenStack .","title":"Acesse o Horizon (dashboard) como administrador, e mantenha ele aberto durante todo o setup do openstack (para ver as mudan\u00e7as acontecendo!)"},{"location":"roteiros/3.Private_Cloud_Stack/#pense-na-estrutura-de-rede-do-seu-kit-altere-os-ips-dos-exemplos-de-comandos-caso-necessario","text":"Prestem muita aten\u00e7\u00e3o nos passos! N\u00e3o copie e cole comandos sem verificar os argumentos. Come\u00e7e a partir da se\u00e7\u00e3o Install the OpenStack clients Instale o client do Openstack no maas via snap. Carregue as credenciais em openrc e verifique os servi\u00e7os: $ openstack service list Fa\u00e7a pequenos ajustes na rede: $ juju config neutron-api enable-ml2-dns=\"true\" $ juju config neutron-api-plugin-ovn dns-servers=\"X.X.0.1\" Importe a imagem do Ubuntu Jammy. Voc\u00ea precisar\u00e1 procurar esta imagem. Configure a rede externa. Usar uma faixa de aloca\u00e7\u00e3o entre X.X.7.0 e X.X.8.255.","title":"Pense na estrutura de rede do seu KIT (Altere os Ips dos exemplos de comandos caso necess\u00e1rio)"},{"location":"roteiros/3.Private_Cloud_Stack/#a-partir-de-agora-voce-criara-uma-rede-interna-na-sua-nuvem-privada-use-os-valores-dados-abaixo","text":"Crie a rede interna e o roteador. Usar a subnet 192.169.0.0/24. N\u00e3o use DNS. Analise o comando: $ openstack flavor create --help Crie os flavors (instance type) - SEM ephemeral disk : m1.tiny: 1 vcpu/1Gb RAM/20Gb disk m1.small: 1 vcpus/2Gb RAM/20Gb disk m1.medium: 2 vcpus/4Gb RAM/20Gb disk m1.large: 4 vcpus/8Gb RAM/20Gb disk Importe (upload) um key-pair, usando public key (id_rsa.pub) do pr\u00f3prio MaaS. Acesse o Horizon ( dashboard ) como administrador: Adicione a libera\u00e7\u00e3o do SSH e ALL ICMP no security group default . Verifique se a topologia de rede faz sentido. Ela deve ser semelhante ao projeto da sua rede f\u00edsica, por\u00e9m com mais um n\u00edvel dentro. Essa rede n\u00e3o existe fisicamente, \u00e9 tudo virtual. Dispare uma inst\u00e2ncia m1.tiny com o nome client e sem Novo Volume . Aloque um floating IP para a inst\u00e2ncia. Teste a conex\u00e3o SSH! Em caso de erro, volte e verifique se as etapas anteriores est\u00e3o corretas. Exercise CheckPoint-2 De um print das Telas abaixo: Do Dashboard do MAAS com as m\u00e1quinas. Da aba compute overview no OpenStack . Da aba compute instances no OpenStack . Da aba network topology no OpenStack . Enumere as diferencas encontradas entre os prints das telas no Checkpoint1 e o Checkpoint-2. Explique como cada recurso foi criado.","title":"A partir de agora voc\u00ea criara uma rede interna na sua n\u00favem privada, use os valores dados abaixo."},{"location":"roteiros/3.Private_Cloud_Stack/#escalando-os-nos","text":"Vamos adicionar o openstack no cluster como n\u00f3 de computing e block storage . Verfique no Dashboard do MaaS se ainda h\u00e1 uma m\u00e1quina dispon\u00edvel (m\u00e1quina que reservamos/allocated). Fa\u00e7a o release da m\u00e1quina que est\u00e1 ALLOCATED (cuidado para n\u00e3o errar!) Instale o hypervisor, realizando o deploy na m\u00e1quina: $ juju add-unit nova-compute Anote o n\u00famero da m\u00e1quina adicionada no status e instale o block storage: $ juju add-unit --to ceph-osd Exercise QUESTOES-2 Fa\u00e7a um desenho de como \u00e9 a sua arquitetura de rede, desde a sua conex\u00e3o com o Insper at\u00e9 a inst\u00e2ncia alocada.","title":"Escalando os n\u00f3s"},{"location":"roteiros/3.Private_Cloud_Stack/#uso-da-infraestrutura-django-na-nuvem-vm-criada","text":"","title":"Uso da Infraestrutura: Django na Nuvem VM criada"},{"location":"roteiros/3.Private_Cloud_Stack/#agora-conseguimos-corrigir-o-erro-apontado-na-conclusao-do-h2-levantando-a-mesma-aplicacao-django-mas-sem-precisar-sacrificar-4-maquinas-inteiras","text":"Tarefa : Levantar a aplica\u00e7\u00e3o -> 2 instancias com django 1 com banco de dados e 1 com Nginx em cima das maquinas virtuais do Openstack. TOPOLOGIA: Exercise Escreva um relat\u00f3rio dos passos utilizados.(pode ser digitado no word!!!!!!!) Anexe fotos e/ou diagramas contendo: arquitetura de rede do Django dentro do Openstack ( Dica: use o dashboard do Openstack ), lista de VMs utilizadas com nome e IPs alocados, foto do Dashboard Django conectado na m\u00e1quina Nginx/LB.","title":"Agora conseguimos corrigir o erro apontado na conclus\u00e3o do H2, levantando a mesma aplica\u00e7\u00e3o django mas sem precisar sacrificar 4 m\u00e1quinas inteiras."},{"location":"roteiros/4.IaC/","text":"SLA, DR e IaC \u00b6 Objetivos Entender os conceitos b\u00e1sicos Infraestrutura como c\u00f3digo. Entender os conceitos b\u00e1sicos sobre SLA e DR. Pr\u00e9-requisitos: Terminar o cap\u00edtulo anterior (Openstack) Realizar a leitura [Kavis - Cap 11 e Cap 13] Info DIVIS\u00c3O DO ROTEIRO O Roteiro \u00e9 dividido em 3 partes principais. Entendendo IaC - Vis\u00e3o Geral Criando a Infraestrutura utilizando IaC Criando um plano de Disaster Recovery e SLA (QUESTOES) IaC Vis\u00e3o geral \u00b6 Infraestrutura como c\u00f3digo (IaC) \u00e9 o gerenciamento e provisionamento de infraestrutura por meio de c\u00f3digo, em vez de processos manuais. Utilizando o IaC, \u00e9 poss\u00edvel criar arquivos de configura\u00e7\u00e3o que contenham especifica\u00e7\u00f5es de infraestrutura, o que facilita a edi\u00e7\u00e3o e distribui\u00e7\u00e3o das configura\u00e7\u00f5es. Tamb\u00e9m garante que voc\u00ea sempre forne\u00e7a o mesmo ambiente. Ao codificar e documentar suas especifica\u00e7\u00f5es de configura\u00e7\u00e3o, o IaC auxilia no gerenciamento de configura\u00e7\u00e3o e ajuda a evitar altera\u00e7\u00f5es de configura\u00e7\u00e3o n\u00e3o documentadas. O IaC evoluiu para lidar com a deriva ambiental em dutos de libera\u00e7\u00e3o. Sem o IaC, as equipes teriam que manter as configura\u00e7\u00f5es do ambiente de implanta\u00e7\u00e3o separadamente. Com o tempo, cada ambiente se torna um \"floco de neve\", uma configura\u00e7\u00e3o \u00fanica que n\u00e3o pode ser replicada automaticamente. Inconsist\u00eancias entre ambientes podem causar problemas de implanta\u00e7\u00e3o. O gerenciamento e a manuten\u00e7\u00e3o da infraestrutura envolvem processos manuais que s\u00e3o propensos a erros e dif\u00edceis de rastrear. Refor\u00e7ando \u00b6 O IaC evita a configura\u00e7\u00e3o manual e garante consist\u00eancia ao expressar o estado desejado do ambiente por meio de c\u00f3digo bem documentado em formatos como por exemplo o JSON. A implanta\u00e7\u00e3o de infraestrutura com IaC \u00e9 repet\u00edvel e evita problemas de tempo de execu\u00e7\u00e3o causados \u200b\u200bpor configura\u00e7\u00f5es quebradas ou depend\u00eancias ausentes. Para fazer altera\u00e7\u00f5es, voc\u00ea precisa editar a origem, n\u00e3o o destino . A idempot\u00eancia (a capacidade de uma determinada opera\u00e7\u00e3o produzir sempre o mesmo resultado) \u00e9 um princ\u00edpio fundamental da IaC. O comando deploy sempre define o ambiente de destino com a mesma configura\u00e7\u00e3o, independentemente do estado inicial do ambiente. A idempot\u00eancia \u00e9 alcan\u00e7ada configurando automaticamente os destinos existentes ou excluindo os destinos existentes e recriando novos ambientes. O que \u00e9 Terraform em Infraestrutura como C\u00f3digo? \u00b6 \u00c9 uma das possiveis ferramentas para IaC. O mercado de Infraestrutura como C\u00f3digo amadureceu ao longo dos anos. H\u00e1 uma grande variedade de ferramentas, oferecendo diferentes recursos. Terraform \u00e9 a infraestrutura da HashiCorp como ferramenta de c\u00f3digo. Ele permite que voc\u00ea defina recursos e infraestrutura em arquivos de configura\u00e7\u00e3o declarativos leg\u00edveis por humanos e gerencie o ciclo de vida de sua infraestrutura. O uso do Terraform tem v\u00e1rias vantagens em rela\u00e7\u00e3o ao gerenciamento manual de sua infraestrutura: O Terraform pode gerenciar a infraestrutura em v\u00e1rias plataformas de nuvem. A linguagem de configura\u00e7\u00e3o leg\u00edvel por humanos ajuda voc\u00ea a escrever c\u00f3digo de infraestrutura rapidamente. O estado do Terraform permite rastrear altera\u00e7\u00f5es de recursos em todas as suas implanta\u00e7\u00f5es. Voc\u00ea pode confirmar suas configura\u00e7\u00f5es no controle de vers\u00e3o para colaborar com seguran\u00e7a na infraestrutura. Para implantar infraestrutura com o Terraform: * Scope - Identifique a infraestrutura para o seu projeto. * Author - Escreva a configura\u00e7\u00e3o para sua infraestrutura. * Initialize - Instale os plugins que o Terraform precisa para gerenciar a infraestrutura. * Plan - Visualize as altera\u00e7\u00f5es que o Terraform far\u00e1 para corresponder \u00e0 sua configura\u00e7\u00e3o. * Apply - Fa\u00e7a as altera\u00e7\u00f5es planejadas. Instalar Terraform \u00b6 Ubuntu/Debian CentOS/RHEL Windows/FreeBSD/OpenBSD/Solaris macOS wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint echo \"deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main\" | sudo tee /etc/apt/sources.list.d/hashicorp.list sudo apt update && sudo apt install terraform sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo sudo yum -y install terraform Ir na pagina oficial e baixar o pacote bin\u00e1rio https://www.terraform.io/downloads brew tap hashicorp/tap brew install hashicorp/tap/terraform Criando a Infraestrutura utilizando IaC \u00b6 Agora vamos ver como isso funciona. At\u00e9 agora voc\u00ea acessou o dashboard ou utilizou a interface de linha de comando (CLI) para criar rede, subrede, instancia, roteador e outros recursos. Vamos criar a topologia abaixo via c\u00f3digo. O Terraform conta com arquivos .tf, que definem a infraestrutura. O Terraform sabe o que \u00e9 implantado por meio do arquivo de estado. Este estado \u00e9 armazenado por padr\u00e3o em um arquivo local chamado \u201cterraform.tfstate\u201d. Tamb\u00e9m pode ser armazenado remotamente, o que funciona melhor em um ambiente de equipe. O Terraform permite v\u00e1rios provedores, normalmente inicializados em um arquivo chamado provider.tf. A estrutura de pastas ficar\u00e1 conforme figura abaixo: Crie a estrutura Dentro da pasta terraform crie os arquivos abaixo: provider.tf # Terraform Openstack deployment # Author: Tiago Demay - tiagoaodc@insper.edu.br # Define required providers terraform { required_version = \">= 0.14.0\" required_providers { openstack = { source = \"terraform-provider-openstack/openstack\" version = \"~> 1.35.0\" } } } # Configure the OpenStack Provider provider \"openstack\" { cacert_file =\"/home/cloud/snap/openstackclients/common/root-ca.crt\" auth_url = \"https://192.168.0.120:5000/v3\" region = \"RegionOne\" user_name = \"admin\" # password = \"PASSWORD_USER\" } instance.tf resource \"openstack_compute_instance_v2\" \"instancia\" { name = \"basic\" image_name = \"bionic-amd64\" flavor_name = \"m1.small\" key_pair = \"mykey\" security_groups = [\"default\"] network { name = \"network_1\" } depends_on = [openstack_networking_network_v2.network_1] } network.tf resource \"openstack_networking_network_v2\" \"network_1\" { name = \"network_1\" admin_state_up = \"true\" } resource \"openstack_networking_subnet_v2\" \"subnet_1\" { network_id = \"${openstack_networking_network_v2.network_1.id}\" cidr = \"192.167.199.0/24\" } Info Alterar a variavel external_network_id = <\"ID_EXT_NETWORK\"> para o ID da sua rede externa, voc\u00ea pode encontrar esta informac\u00e3o, acessando o Dashboard do Openstack ou via CLI openstack router.tf resource \"openstack_networking_router_v2\" \"router_1\" { name = \"my_router\" admin_state_up = true external_network_id = <\"ID_EXT_NETWORK\"> } resource \"openstack_networking_router_interface_v2\" \"int_1\" { router_id = \"${openstack_networking_router_v2.router_1.id}\" subnet_id = \"${openstack_networking_subnet_v2.subnet_1.id}\" } Para testar a implementa\u00e7\u00e3o da infraestrutura, execute os comandos abaixo: terraform plan Este comando \u00e9 utilizado para criar um plano de execu\u00e7\u00e3o. Ele mostra quais a\u00e7\u00f5es o Terraform executar\u00e1 quando voc\u00ea aplicar suas configura\u00e7\u00f5es. terraform apply O comando terraform apply aplica as mudan\u00e7as necess\u00e1rias para alcan\u00e7ar o estado desejado da sua configura\u00e7\u00e3o. Ele cria, atualiza ou destr\u00f3i os recursos conforme necess\u00e1rio. Utlize a CLI do openstack para verificar que a instancia foi criada. Para deletar os recursos, execute o comando: terraform destroy Criando um plano de Disaster Recovery e SLA (QUESTOES) \u00b6 Pode ser no Word!!! \u00b6 Exercise QUESTOES Qual o conceito por tr\u00e1s de Edge Computing? (Obs: N\u00e3o \u00e9 a rede de celular 2G) Voc\u00ea \u00e9 o CTO (Chief Technology Officer) de uma grande empresa com sede em v\u00e1rias capitais no Brasil e precisa implantar um sistema cr\u00edtico, de baixo custo e com dados sigilosos para a \u00e1rea operacional. Voc\u00ea escolheria Public Cloud ou Private Cloud? Agora explique para ao RH por que voc\u00ea precisa de um time de DevOps. Considerando o mesmo sistema cr\u00edtico, agora sua equipe dever\u00e1 planejar e implementar um ambiente resiliente e capaz de mitigar poss\u00edveis interrup\u00e7\u00f5es/indisponibilidades. Para isso, identifiquem quais s\u00e3o as principais amea\u00e7as que podem colocar sua infraestrutura em risco, e descreva as principais a\u00e7\u00f5es que possibilitem o restabelecimento de todas as aplica\u00e7\u00f5es de forma r\u00e1pida e organizada caso algum evento cause uma interrup\u00e7\u00e3o ou incidente de seguran\u00e7a. Para isso monte um plano de DR e HA que considere entre as a\u00e7\u00f5es: Mapeamento das principais amea\u00e7as que podem colocar em riscos o seu ambiente. Elenque e priorize as a\u00e7\u00f5es para a recupera\u00e7\u00e3o de seu ambiente em uma poss\u00edvel interrup\u00e7\u00e3o/desastre. Como sua equipe ir\u00e1 tratar a pol\u00edtica de backup? Considerando poss\u00edveis instabilidades e problemas, descreva como alta disponibilidade ser\u00e1 implementada em sua infraestrutura.","title":"Computa\u00e7\u00e3o em Nuvem"},{"location":"roteiros/4.IaC/#sla-dr-e-iac","text":"Objetivos Entender os conceitos b\u00e1sicos Infraestrutura como c\u00f3digo. Entender os conceitos b\u00e1sicos sobre SLA e DR. Pr\u00e9-requisitos: Terminar o cap\u00edtulo anterior (Openstack) Realizar a leitura [Kavis - Cap 11 e Cap 13] Info DIVIS\u00c3O DO ROTEIRO O Roteiro \u00e9 dividido em 3 partes principais. Entendendo IaC - Vis\u00e3o Geral Criando a Infraestrutura utilizando IaC Criando um plano de Disaster Recovery e SLA (QUESTOES)","title":"SLA, DR e IaC"},{"location":"roteiros/4.IaC/#iac-visao-geral","text":"Infraestrutura como c\u00f3digo (IaC) \u00e9 o gerenciamento e provisionamento de infraestrutura por meio de c\u00f3digo, em vez de processos manuais. Utilizando o IaC, \u00e9 poss\u00edvel criar arquivos de configura\u00e7\u00e3o que contenham especifica\u00e7\u00f5es de infraestrutura, o que facilita a edi\u00e7\u00e3o e distribui\u00e7\u00e3o das configura\u00e7\u00f5es. Tamb\u00e9m garante que voc\u00ea sempre forne\u00e7a o mesmo ambiente. Ao codificar e documentar suas especifica\u00e7\u00f5es de configura\u00e7\u00e3o, o IaC auxilia no gerenciamento de configura\u00e7\u00e3o e ajuda a evitar altera\u00e7\u00f5es de configura\u00e7\u00e3o n\u00e3o documentadas. O IaC evoluiu para lidar com a deriva ambiental em dutos de libera\u00e7\u00e3o. Sem o IaC, as equipes teriam que manter as configura\u00e7\u00f5es do ambiente de implanta\u00e7\u00e3o separadamente. Com o tempo, cada ambiente se torna um \"floco de neve\", uma configura\u00e7\u00e3o \u00fanica que n\u00e3o pode ser replicada automaticamente. Inconsist\u00eancias entre ambientes podem causar problemas de implanta\u00e7\u00e3o. O gerenciamento e a manuten\u00e7\u00e3o da infraestrutura envolvem processos manuais que s\u00e3o propensos a erros e dif\u00edceis de rastrear.","title":"IaC Vis\u00e3o geral"},{"location":"roteiros/4.IaC/#reforcando","text":"O IaC evita a configura\u00e7\u00e3o manual e garante consist\u00eancia ao expressar o estado desejado do ambiente por meio de c\u00f3digo bem documentado em formatos como por exemplo o JSON. A implanta\u00e7\u00e3o de infraestrutura com IaC \u00e9 repet\u00edvel e evita problemas de tempo de execu\u00e7\u00e3o causados \u200b\u200bpor configura\u00e7\u00f5es quebradas ou depend\u00eancias ausentes. Para fazer altera\u00e7\u00f5es, voc\u00ea precisa editar a origem, n\u00e3o o destino . A idempot\u00eancia (a capacidade de uma determinada opera\u00e7\u00e3o produzir sempre o mesmo resultado) \u00e9 um princ\u00edpio fundamental da IaC. O comando deploy sempre define o ambiente de destino com a mesma configura\u00e7\u00e3o, independentemente do estado inicial do ambiente. A idempot\u00eancia \u00e9 alcan\u00e7ada configurando automaticamente os destinos existentes ou excluindo os destinos existentes e recriando novos ambientes.","title":"Refor\u00e7ando"},{"location":"roteiros/4.IaC/#o-que-e-terraform-em-infraestrutura-como-codigo","text":"\u00c9 uma das possiveis ferramentas para IaC. O mercado de Infraestrutura como C\u00f3digo amadureceu ao longo dos anos. H\u00e1 uma grande variedade de ferramentas, oferecendo diferentes recursos. Terraform \u00e9 a infraestrutura da HashiCorp como ferramenta de c\u00f3digo. Ele permite que voc\u00ea defina recursos e infraestrutura em arquivos de configura\u00e7\u00e3o declarativos leg\u00edveis por humanos e gerencie o ciclo de vida de sua infraestrutura. O uso do Terraform tem v\u00e1rias vantagens em rela\u00e7\u00e3o ao gerenciamento manual de sua infraestrutura: O Terraform pode gerenciar a infraestrutura em v\u00e1rias plataformas de nuvem. A linguagem de configura\u00e7\u00e3o leg\u00edvel por humanos ajuda voc\u00ea a escrever c\u00f3digo de infraestrutura rapidamente. O estado do Terraform permite rastrear altera\u00e7\u00f5es de recursos em todas as suas implanta\u00e7\u00f5es. Voc\u00ea pode confirmar suas configura\u00e7\u00f5es no controle de vers\u00e3o para colaborar com seguran\u00e7a na infraestrutura. Para implantar infraestrutura com o Terraform: * Scope - Identifique a infraestrutura para o seu projeto. * Author - Escreva a configura\u00e7\u00e3o para sua infraestrutura. * Initialize - Instale os plugins que o Terraform precisa para gerenciar a infraestrutura. * Plan - Visualize as altera\u00e7\u00f5es que o Terraform far\u00e1 para corresponder \u00e0 sua configura\u00e7\u00e3o. * Apply - Fa\u00e7a as altera\u00e7\u00f5es planejadas.","title":"O que \u00e9 Terraform em Infraestrutura como C\u00f3digo?"},{"location":"roteiros/4.IaC/#instalar-terraform","text":"Ubuntu/Debian CentOS/RHEL Windows/FreeBSD/OpenBSD/Solaris macOS wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint echo \"deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main\" | sudo tee /etc/apt/sources.list.d/hashicorp.list sudo apt update && sudo apt install terraform sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo sudo yum -y install terraform Ir na pagina oficial e baixar o pacote bin\u00e1rio https://www.terraform.io/downloads brew tap hashicorp/tap brew install hashicorp/tap/terraform","title":"Instalar Terraform"},{"location":"roteiros/4.IaC/#criando-a-infraestrutura-utilizando-iac","text":"Agora vamos ver como isso funciona. At\u00e9 agora voc\u00ea acessou o dashboard ou utilizou a interface de linha de comando (CLI) para criar rede, subrede, instancia, roteador e outros recursos. Vamos criar a topologia abaixo via c\u00f3digo. O Terraform conta com arquivos .tf, que definem a infraestrutura. O Terraform sabe o que \u00e9 implantado por meio do arquivo de estado. Este estado \u00e9 armazenado por padr\u00e3o em um arquivo local chamado \u201cterraform.tfstate\u201d. Tamb\u00e9m pode ser armazenado remotamente, o que funciona melhor em um ambiente de equipe. O Terraform permite v\u00e1rios provedores, normalmente inicializados em um arquivo chamado provider.tf. A estrutura de pastas ficar\u00e1 conforme figura abaixo: Crie a estrutura Dentro da pasta terraform crie os arquivos abaixo: provider.tf # Terraform Openstack deployment # Author: Tiago Demay - tiagoaodc@insper.edu.br # Define required providers terraform { required_version = \">= 0.14.0\" required_providers { openstack = { source = \"terraform-provider-openstack/openstack\" version = \"~> 1.35.0\" } } } # Configure the OpenStack Provider provider \"openstack\" { cacert_file =\"/home/cloud/snap/openstackclients/common/root-ca.crt\" auth_url = \"https://192.168.0.120:5000/v3\" region = \"RegionOne\" user_name = \"admin\" # password = \"PASSWORD_USER\" } instance.tf resource \"openstack_compute_instance_v2\" \"instancia\" { name = \"basic\" image_name = \"bionic-amd64\" flavor_name = \"m1.small\" key_pair = \"mykey\" security_groups = [\"default\"] network { name = \"network_1\" } depends_on = [openstack_networking_network_v2.network_1] } network.tf resource \"openstack_networking_network_v2\" \"network_1\" { name = \"network_1\" admin_state_up = \"true\" } resource \"openstack_networking_subnet_v2\" \"subnet_1\" { network_id = \"${openstack_networking_network_v2.network_1.id}\" cidr = \"192.167.199.0/24\" } Info Alterar a variavel external_network_id = <\"ID_EXT_NETWORK\"> para o ID da sua rede externa, voc\u00ea pode encontrar esta informac\u00e3o, acessando o Dashboard do Openstack ou via CLI openstack router.tf resource \"openstack_networking_router_v2\" \"router_1\" { name = \"my_router\" admin_state_up = true external_network_id = <\"ID_EXT_NETWORK\"> } resource \"openstack_networking_router_interface_v2\" \"int_1\" { router_id = \"${openstack_networking_router_v2.router_1.id}\" subnet_id = \"${openstack_networking_subnet_v2.subnet_1.id}\" } Para testar a implementa\u00e7\u00e3o da infraestrutura, execute os comandos abaixo: terraform plan Este comando \u00e9 utilizado para criar um plano de execu\u00e7\u00e3o. Ele mostra quais a\u00e7\u00f5es o Terraform executar\u00e1 quando voc\u00ea aplicar suas configura\u00e7\u00f5es. terraform apply O comando terraform apply aplica as mudan\u00e7as necess\u00e1rias para alcan\u00e7ar o estado desejado da sua configura\u00e7\u00e3o. Ele cria, atualiza ou destr\u00f3i os recursos conforme necess\u00e1rio. Utlize a CLI do openstack para verificar que a instancia foi criada. Para deletar os recursos, execute o comando: terraform destroy","title":"Criando a Infraestrutura utilizando IaC"},{"location":"roteiros/4.IaC/#criando-um-plano-de-disaster-recovery-e-sla-questoes","text":"","title":"Criando um plano de Disaster Recovery e SLA (QUESTOES)"},{"location":"roteiros/4.IaC/#pode-ser-no-word","text":"Exercise QUESTOES Qual o conceito por tr\u00e1s de Edge Computing? (Obs: N\u00e3o \u00e9 a rede de celular 2G) Voc\u00ea \u00e9 o CTO (Chief Technology Officer) de uma grande empresa com sede em v\u00e1rias capitais no Brasil e precisa implantar um sistema cr\u00edtico, de baixo custo e com dados sigilosos para a \u00e1rea operacional. Voc\u00ea escolheria Public Cloud ou Private Cloud? Agora explique para ao RH por que voc\u00ea precisa de um time de DevOps. Considerando o mesmo sistema cr\u00edtico, agora sua equipe dever\u00e1 planejar e implementar um ambiente resiliente e capaz de mitigar poss\u00edveis interrup\u00e7\u00f5es/indisponibilidades. Para isso, identifiquem quais s\u00e3o as principais amea\u00e7as que podem colocar sua infraestrutura em risco, e descreva as principais a\u00e7\u00f5es que possibilitem o restabelecimento de todas as aplica\u00e7\u00f5es de forma r\u00e1pida e organizada caso algum evento cause uma interrup\u00e7\u00e3o ou incidente de seguran\u00e7a. Para isso monte um plano de DR e HA que considere entre as a\u00e7\u00f5es: Mapeamento das principais amea\u00e7as que podem colocar em riscos o seu ambiente. Elenque e priorize as a\u00e7\u00f5es para a recupera\u00e7\u00e3o de seu ambiente em uma poss\u00edvel interrup\u00e7\u00e3o/desastre. Como sua equipe ir\u00e1 tratar a pol\u00edtica de backup? Considerando poss\u00edveis instabilidades e problemas, descreva como alta disponibilidade ser\u00e1 implementada em sua infraestrutura.","title":"Pode ser no Word!!!"},{"location":"roteiros/5.K8s/","text":"Containers e K8s \u00b6 Objetivos Entender os conceitos b\u00e1sicos sobre Cont\u00eaineres e seus Orquestradores. Instalar o Octavia no Openstack Integrar o Openstack e o Kubernetes Pr\u00e9-requisitos: Terminar o cap\u00edtulo anterior (SLA,DR e IaC) Realizar a leitura sobre o Docker. [ https://docs.docker.com/engine/docker-overview/ ]. Realizar a leitura sobre o Kubernetes. [ https://kubernetes.io/docs/concepts/ ]. Realizar a leitura do Octavia. [ https://docs.openstack.org/octavia/latest/ ]. Realizar a leitura do Barbican. [ https://docs.openstack.org/barbican/latest/ ]. Realizar a leitura dos Charms. [ https://jaas.ai/vault , https://jaas.ai/octavia , https://jaas.ai/barbican ]. Info DIVIS\u00c3O DO ROTEIRO O Roteiro \u00e9 dividido em 3 partes principais. Entendendo tipos de implantacoes - Vis\u00e3o Geral Adicionando Octavia (Load Balancer) na Nuvem privada(Openstack) Utilizando Docker e Kubernetes Voce chegou a um roteiro avancado, este Roteiro envolve a resolucao de problemas de implantacao, esperamos que voc\u00ea esteja preparado, este roteiro \u00e9 prototipado por voc\u00ea!!!! (se n\u00e3o estiver, nem comece) \u00b6 TARGET \u00b6 DO INICIO DO ROTEIRO 1 ATE ONDE CHEGAMOS NO FIM DESTE ROTEIRO \u00b6 Tipo de implantacoes \u00b6 Tradicional \u00b6 Inicialmente, as organiza\u00e7\u00f5es executavam aplicativos em servidores f\u00edsicos. Os limites de recursos n\u00e3o podem ser definidos para aplicativos em servidores f\u00edsicos, o que causa problemas de aloca\u00e7\u00e3o de recursos. Por exemplo, se v\u00e1rios aplicativos estiverem sendo executados em um servidor f\u00edsico, pode haver uma situa\u00e7\u00e3o em que um aplicativo consuma mais recursos, resultando em um desempenho insatisfat\u00f3rio de outros aplicativos. A solu\u00e7\u00e3o para isso \u00e9 executar cada aplicativo em um servidor f\u00edsico diferente. Mas isso n\u00e3o aumentou porque os recursos s\u00e3o subutilizados e \u00e9 caro para as organiza\u00e7\u00f5es manter muitos servidores f\u00edsicos. Virtualizada \u00b6 Como solu\u00e7\u00e3o, a virtualiza\u00e7\u00e3o foi introduzida. Ele permite que voc\u00ea execute v\u00e1rias m\u00e1quinas virtuais (VMs) na CPU de um \u00fanico servidor f\u00edsico. A virtualiza\u00e7\u00e3o permite que os aplicativos sejam isolados entre VMs e fornece um n\u00edvel de seguran\u00e7a que as informa\u00e7\u00f5es de um aplicativo n\u00e3o podem ser acessadas livremente por outro aplicativo. A virtualiza\u00e7\u00e3o permite uma melhor utiliza\u00e7\u00e3o dos recursos em servidores f\u00edsicos e uma melhor escalabilidade, pois os aplicativos podem ser facilmente adicionados ou atualizados, os custos de hardware s\u00e3o reduzidos e muito mais. Com a virtualiza\u00e7\u00e3o, voc\u00ea pode apresentar um conjunto de recursos f\u00edsicos como um cluster de m\u00e1quinas virtuais descart\u00e1veis. Cada VM \u00e9 uma m\u00e1quina completa, executando todos os componentes, incluindo seu pr\u00f3prio sistema operacional, sobre hardware virtualizado. Conteinerizada \u00b6 Os cont\u00eaineres s\u00e3o pacotes leves do c\u00f3digo do seu aplicativo, juntamente com depend\u00eancias, como vers\u00f5es espec\u00edficas de tempos de execu\u00e7\u00e3o de linguagem de programa\u00e7\u00e3o e bibliotecas necess\u00e1rias para executar seus servi\u00e7os de software. Os cont\u00eaineres facilitam o compartilhamento de recursos de CPU, mem\u00f3ria, armazenamento e rede no n\u00edvel dos sistemas operacionais e oferecem um mecanismo de empacotamento l\u00f3gico no qual os aplicativos podem ser abstra\u00eddos do ambiente em que realmente s\u00e3o executados. Os cont\u00eaineres virtualizam no n\u00edvel do sistema operacional enquanto as VMs virtualizam no n\u00edvel do hardware Instalando e Configurando o Octavia (Loadbalancer para Openstack) \u00b6 No servidor Main: Fa\u00e7a o download do arquivo loadbalancer-octavia.yaml no Github openstack-charmers/openstack-bundles Entre na pasta openstack Vamos pedir pro juju aplicar as modificacoes do bundle customizado com o overlay. juju deploy ./bundle.yaml --overlay loadbalancer-octavia.yaml Voc\u00eas j\u00e1 sabem o que fazer agora, Ler a documentacao sobre K8S e Docker, mas de olho no status do Juju. \u00b6 Agora vamos criar os certificados necess\u00e1rios. mkdir -p demoCA/newcerts touch demoCA/index.txt touch demoCA/index.txt.attr openssl genpkey -algorithm RSA -aes256 -pass pass:foobar -out issuing_ca_key.pem openssl req -x509 -passin pass:foobar -new -nodes -key issuing_ca_key.pem \\ -config /etc/ssl/openssl.cnf \\ -subj \"/C=US/ST=Somestate/O=Org/CN=www.example.com\" \\ -days 30 \\ -out issuing_ca.pem openssl genpkey -algorithm RSA -aes256 -pass pass:foobar -out controller_ca_key.pem openssl req -x509 -passin pass:foobar -new -nodes \\ -key controller_ca_key.pem \\ -config /etc/ssl/openssl.cnf \\ -subj \"/C=US/ST=Somestate/O=Org/CN=www.example.com\" \\ -days 30 \\ -out controller_ca.pem openssl req \\ -newkey rsa:2048 -nodes -keyout controller_key.pem \\ -subj \"/C=US/ST=Somestate/O=Org/CN=www.example.com\" \\ -out controller.csr openssl ca -passin pass:foobar -config /etc/ssl/openssl.cnf \\ -cert controller_ca.pem -keyfile controller_ca_key.pem \\ -create_serial -batch \\ -in controller.csr -days 30 -out controller_cert.pem cat controller_cert.pem controller_key.pem > controller_cert_bundle.pem Abra o cofre VAULT novamente... \u00b6 Adicionando variavel de ambiente VAULT: export VAULT_ADDR=\"http://:8200\" Removendo o selo, repita a opera\u00e7\u00e3o com 3 keys diferentes: vault operator unseal Autorizando o charm: export VAULT_TOKEN= vault token create -ttl=10m Anote o token gerado pelo comando e use abaixo: juju run-action --wait vault/leader authorize-charm token= juju run-action --wait vault/leader generate-root-ca Ainda no Servidor main , vamos aumentar alguns limites: openstack quota set --cores 100 [ID do Projeto] openstack quota set --instances 100 [ID do Projeto] Configurando o Octavia com as alteracoes \u00b6 Passo1 juju config octavia \\ lb-mgmt-issuing-cacert=\"$(base64 issuing_ca.pem)\" \\ lb-mgmt-issuing-ca-private-key=\"$(base64 issuing_ca_key.pem)\" \\ lb-mgmt-issuing-ca-key-passphrase=foobar \\ lb-mgmt-controller-cacert=\"$(base64 controller_ca.pem)\" \\ lb-mgmt-controller-cert=\"$(base64 controller_cert_bundle.pem)\" Passo2 juju config octavia loadbalancer-topology=ACTIVE_STANDBY spare-pool-size=4 juju run-action --wait glance-simplestreams-sync/0 sync-images \u00b6 Hold your breath! \u00b6 Criando imagem \u00b6 Passo1 juju run-action --wait octavia-diskimage-retrofit/leader retrofit-image \u00b6 Passo2 openstack image list openstack image set --tag octavia-diskimage-retrofit --tag octavia-amphora [id amphora image] juju run-action --wait octavia/0 configure-resources No cap\u00edtulo 3, foi realizada a implanta\u00e7\u00e3o do Openstack no hardware dispon\u00edvel. Al\u00e9m de VMs, o Openstack consegue tamb\u00e9m manipular containers, tal qual o MaaS e o Juju. Contudo o grande problema \u00e9 que n\u00e3o basta apenas criar e destruir um container, \u00e9 preciso administrar uma complexa arquitetura, monitorando e controlando um conjunto de containers que representam uma implanta\u00e7\u00e3o de um sistema. WebServer \u00b6 Criar uma inst\u00e2ncia m1.small com IP p\u00fablico no Openstack, nomea-la como juju-openstack Acessar a instancia criada Vamos criar um WebServer em NodeJS Criar o arquivo ~/hello-node/server.js #!/usr/bin/env nodejs var http = require('http'); var os = require('os'); var handleRequest = function(request, response) { console.log('Received request for URL: ' + request.url); response.writeHead(200); response.end('{ \"host\": ' + os.hostname() + ', \"message\": \"Hello World!\"}'); }; var www = http.createServer(handleRequest); www.listen(8080); console.log('Server running at http://localhost:8080/'); Testar o WebServer rodando localmente no terminal. sudo apt install nodejs ./server.js Exercise CheckPoint-1 WebServer De um print das Telas abaixo: Da aba network topology no OpenStack . Das regras do Security Group utilizado Da Aba do navegador com o WebServer Rodando. Instalar o Docker \u00b6 Arquitetura Docker sudo apt-get update sudo apt install build-essential apt-transport-https curl curl -fsSL https://get.docker.com | sh - sudo usermod -aG docker $USER newgrp docker docker version docker run hello-world Criar uma um arquivo ~/hello-node/Dockerfile que dar\u00e1 origem ao container FROM node:6.9.2 EXPOSE 8080 COPY server.js . CMD node server.js Montar a imagem local (Cria um container com esta aplicacao webserver) docker build -t hello-node:v1 ./hello-node/ Rodar o container com a imagem criada. docker container run hello-node:v1 Exercise CheckPoint-2 Docker De um print das Telas abaixo: WebServer Rodando no navegador. Docker Hub \u00b6 Criar individualmente um login na https://hub.docker.com/ \u2022 Fazer o login no Docker \u2022 Aplicar a tag na imagem e dar o push do Docker Hub \u2022 Para mais detalhes docker --help Exercise QUESTOES-1 O que \u00e9 Docker Swarm? O que \u00e9 Docker Registry? O que \u00e9 Docker Engine? Kubernetes aka k8s \u00b6 Para facilitar o deploy do Kubernetes vamos utilizar uma \"velha conhecida\". Deja-vu (Juju Reborn) \u00b6 O Dashboard do Openstack possui alguns termos (region, instance type, security group, etc) que s\u00e3o semelhantes ao da AWS. Como visto anteriormente, Juju consegue operar sobre Public Cloud, Private Cloud, Bare-metal e Container. Para o setup ficar completo, agora vamos utilizar o Juju sobre o Openstack. Dicas Documentacao - adicionar Openstack como cloud Documentacao - adicionar integrador obrigat\u00f3rio Bundle modificado do Kubernetes-core Acesse a inst\u00e2ncia m1.tiny criada no in\u00edcio do roteiro. Fazer a instala\u00e7\u00e3o do Juju. Adicione o Openstack como Cloud Provider no Juju. Fazer o deploy do Kubernetes-core Instalar kubectl no cliente via snap. sudo snap install kubectl --classic Verificar a configura\u00e7\u00e3o do Kubernetes via kubectl kubectl cluster-info Caso tenha problemas ver: documentacao-kubernetes Configurar o kubectl proxy para utiliza\u00e7\u00e3o externa na porta 8080. Acessar o Dashboard. Fazendo um Deploy \u00b6 Fazer o deploy da imagem docker criada na sess\u00e3o anterior kubectl run hello-node --image=[user]/hello-node:v1 --port=8080 Verificar no terminal: kubectl get all Verificar o deploy status no Dashboard Expandir o deploy para 5 r\u00e9plicas do pod Exercise CheckPoint-3 Dashboard Kubernetes De um print das Telas abaixo: Do dashboard Kubernetes com as 5 replicas Acessando o Deploy \u00b6 Criar um servi\u00e7o que ir\u00e1 expor o deploy Alternativa I - ClusterIP com Ingress \u00b6 kubectl expose deployment hello-node --type=ClusterIP Criar o arquivo ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: hello-node-ingress spec: rules: - host: hello-node.[ip do kubernetes-worker].xip.io http: paths: - path: / backend: serviceName: hello-node servicePort: 8080 * Aplicar arquivo ingress ao K8s kubectl create -f ingress.yaml Exercise CheckPoint-4 Expose Service De um print das Telas abaixo: Do comando -> kubectl get all Alternativa II - NodePort \u00b6 kubectl expose deployment hello-node --type=NodePort Verificar qual porta foi designada e liberar o security group do worker juju run --unit kubernetes-worker/[# worker] \"open-port [porta]\" Exercise CheckPoint-4 Acessar o deploy De um print das Telas abaixo: Do comando -> kubectl get all WebServer Rodando no navegador utilizando a porta aberta. Alterando o deploy \u00b6 Alterar o arquivo server.js Montar uma nova imagem com tag v2 e fa\u00e7a um push Fazer um deploy de um pod de testes Testar as altera\u00e7\u00f5es Fazer a implanta\u00e7\u00e3o imediata em produ\u00e7\u00e3o: kubectl set image deployment/hello-node hello-node=[user]/hello-node:v2 Exercise CheckPoint-5 Modificacao De um print das Telas abaixo: Do comando -> kubectl get all WebServer modificado Rodando no navegador utilizando a porta aberta. Conclus\u00e3o: SOMENTE PARA PENSAR \u00b6 Voc\u00ea desempenhou uma implanta\u00e7\u00e3o em tempo real usando Kubernetes e DockerHub. Como seria uma arquitetura de Continuous Integration/Continuous Delivery (CI/CD) real utilizando Kubernetes?","title":"Computa\u00e7\u00e3o em Nuvem"},{"location":"roteiros/5.K8s/#containers-e-k8s","text":"Objetivos Entender os conceitos b\u00e1sicos sobre Cont\u00eaineres e seus Orquestradores. Instalar o Octavia no Openstack Integrar o Openstack e o Kubernetes Pr\u00e9-requisitos: Terminar o cap\u00edtulo anterior (SLA,DR e IaC) Realizar a leitura sobre o Docker. [ https://docs.docker.com/engine/docker-overview/ ]. Realizar a leitura sobre o Kubernetes. [ https://kubernetes.io/docs/concepts/ ]. Realizar a leitura do Octavia. [ https://docs.openstack.org/octavia/latest/ ]. Realizar a leitura do Barbican. [ https://docs.openstack.org/barbican/latest/ ]. Realizar a leitura dos Charms. [ https://jaas.ai/vault , https://jaas.ai/octavia , https://jaas.ai/barbican ]. Info DIVIS\u00c3O DO ROTEIRO O Roteiro \u00e9 dividido em 3 partes principais. Entendendo tipos de implantacoes - Vis\u00e3o Geral Adicionando Octavia (Load Balancer) na Nuvem privada(Openstack) Utilizando Docker e Kubernetes","title":"Containers e K8s"},{"location":"roteiros/5.K8s/#voce-chegou-a-um-roteiro-avancado-este-roteiro-envolve-a-resolucao-de-problemas-de-implantacao-esperamos-que-voce-esteja-preparado-este-roteiro-e-prototipado-por-voce-se-nao-estiver-nem-comece","text":"","title":"Voce chegou a um roteiro avancado, este Roteiro envolve a resolucao de problemas de implantacao, esperamos que voc\u00ea esteja preparado, este roteiro \u00e9 prototipado por voc\u00ea!!!! (se n\u00e3o estiver, nem comece)"},{"location":"roteiros/5.K8s/#target","text":"","title":"TARGET"},{"location":"roteiros/5.K8s/#do-inicio-do-roteiro-1-ate-onde-chegamos-no-fim-deste-roteiro","text":"","title":"DO INICIO DO ROTEIRO 1 ATE ONDE CHEGAMOS NO FIM DESTE ROTEIRO"},{"location":"roteiros/5.K8s/#tipo-de-implantacoes","text":"","title":"Tipo de implantacoes"},{"location":"roteiros/5.K8s/#tradicional","text":"Inicialmente, as organiza\u00e7\u00f5es executavam aplicativos em servidores f\u00edsicos. Os limites de recursos n\u00e3o podem ser definidos para aplicativos em servidores f\u00edsicos, o que causa problemas de aloca\u00e7\u00e3o de recursos. Por exemplo, se v\u00e1rios aplicativos estiverem sendo executados em um servidor f\u00edsico, pode haver uma situa\u00e7\u00e3o em que um aplicativo consuma mais recursos, resultando em um desempenho insatisfat\u00f3rio de outros aplicativos. A solu\u00e7\u00e3o para isso \u00e9 executar cada aplicativo em um servidor f\u00edsico diferente. Mas isso n\u00e3o aumentou porque os recursos s\u00e3o subutilizados e \u00e9 caro para as organiza\u00e7\u00f5es manter muitos servidores f\u00edsicos.","title":"Tradicional"},{"location":"roteiros/5.K8s/#virtualizada","text":"Como solu\u00e7\u00e3o, a virtualiza\u00e7\u00e3o foi introduzida. Ele permite que voc\u00ea execute v\u00e1rias m\u00e1quinas virtuais (VMs) na CPU de um \u00fanico servidor f\u00edsico. A virtualiza\u00e7\u00e3o permite que os aplicativos sejam isolados entre VMs e fornece um n\u00edvel de seguran\u00e7a que as informa\u00e7\u00f5es de um aplicativo n\u00e3o podem ser acessadas livremente por outro aplicativo. A virtualiza\u00e7\u00e3o permite uma melhor utiliza\u00e7\u00e3o dos recursos em servidores f\u00edsicos e uma melhor escalabilidade, pois os aplicativos podem ser facilmente adicionados ou atualizados, os custos de hardware s\u00e3o reduzidos e muito mais. Com a virtualiza\u00e7\u00e3o, voc\u00ea pode apresentar um conjunto de recursos f\u00edsicos como um cluster de m\u00e1quinas virtuais descart\u00e1veis. Cada VM \u00e9 uma m\u00e1quina completa, executando todos os componentes, incluindo seu pr\u00f3prio sistema operacional, sobre hardware virtualizado.","title":"Virtualizada"},{"location":"roteiros/5.K8s/#conteinerizada","text":"Os cont\u00eaineres s\u00e3o pacotes leves do c\u00f3digo do seu aplicativo, juntamente com depend\u00eancias, como vers\u00f5es espec\u00edficas de tempos de execu\u00e7\u00e3o de linguagem de programa\u00e7\u00e3o e bibliotecas necess\u00e1rias para executar seus servi\u00e7os de software. Os cont\u00eaineres facilitam o compartilhamento de recursos de CPU, mem\u00f3ria, armazenamento e rede no n\u00edvel dos sistemas operacionais e oferecem um mecanismo de empacotamento l\u00f3gico no qual os aplicativos podem ser abstra\u00eddos do ambiente em que realmente s\u00e3o executados. Os cont\u00eaineres virtualizam no n\u00edvel do sistema operacional enquanto as VMs virtualizam no n\u00edvel do hardware","title":"Conteinerizada"},{"location":"roteiros/5.K8s/#instalando-e-configurando-o-octavia-loadbalancer-para-openstack","text":"No servidor Main: Fa\u00e7a o download do arquivo loadbalancer-octavia.yaml no Github openstack-charmers/openstack-bundles Entre na pasta openstack Vamos pedir pro juju aplicar as modificacoes do bundle customizado com o overlay. juju deploy ./bundle.yaml --overlay loadbalancer-octavia.yaml","title":"Instalando e Configurando o Octavia (Loadbalancer para Openstack)"},{"location":"roteiros/5.K8s/#voces-ja-sabem-o-que-fazer-agora-ler-a-documentacao-sobre-k8s-e-docker-mas-de-olho-no-status-do-juju","text":"Agora vamos criar os certificados necess\u00e1rios. mkdir -p demoCA/newcerts touch demoCA/index.txt touch demoCA/index.txt.attr openssl genpkey -algorithm RSA -aes256 -pass pass:foobar -out issuing_ca_key.pem openssl req -x509 -passin pass:foobar -new -nodes -key issuing_ca_key.pem \\ -config /etc/ssl/openssl.cnf \\ -subj \"/C=US/ST=Somestate/O=Org/CN=www.example.com\" \\ -days 30 \\ -out issuing_ca.pem openssl genpkey -algorithm RSA -aes256 -pass pass:foobar -out controller_ca_key.pem openssl req -x509 -passin pass:foobar -new -nodes \\ -key controller_ca_key.pem \\ -config /etc/ssl/openssl.cnf \\ -subj \"/C=US/ST=Somestate/O=Org/CN=www.example.com\" \\ -days 30 \\ -out controller_ca.pem openssl req \\ -newkey rsa:2048 -nodes -keyout controller_key.pem \\ -subj \"/C=US/ST=Somestate/O=Org/CN=www.example.com\" \\ -out controller.csr openssl ca -passin pass:foobar -config /etc/ssl/openssl.cnf \\ -cert controller_ca.pem -keyfile controller_ca_key.pem \\ -create_serial -batch \\ -in controller.csr -days 30 -out controller_cert.pem cat controller_cert.pem controller_key.pem > controller_cert_bundle.pem","title":"Voc\u00eas j\u00e1 sabem o que fazer agora, Ler a documentacao sobre K8S e Docker, mas de olho no status do Juju."},{"location":"roteiros/5.K8s/#abra-o-cofre-vault-novamente","text":"Adicionando variavel de ambiente VAULT: export VAULT_ADDR=\"http://:8200\" Removendo o selo, repita a opera\u00e7\u00e3o com 3 keys diferentes: vault operator unseal Autorizando o charm: export VAULT_TOKEN= vault token create -ttl=10m Anote o token gerado pelo comando e use abaixo: juju run-action --wait vault/leader authorize-charm token= juju run-action --wait vault/leader generate-root-ca Ainda no Servidor main , vamos aumentar alguns limites: openstack quota set --cores 100 [ID do Projeto] openstack quota set --instances 100 [ID do Projeto]","title":"Abra o cofre VAULT novamente..."},{"location":"roteiros/5.K8s/#configurando-o-octavia-com-as-alteracoes","text":"Passo1 juju config octavia \\ lb-mgmt-issuing-cacert=\"$(base64 issuing_ca.pem)\" \\ lb-mgmt-issuing-ca-private-key=\"$(base64 issuing_ca_key.pem)\" \\ lb-mgmt-issuing-ca-key-passphrase=foobar \\ lb-mgmt-controller-cacert=\"$(base64 controller_ca.pem)\" \\ lb-mgmt-controller-cert=\"$(base64 controller_cert_bundle.pem)\" Passo2 juju config octavia loadbalancer-topology=ACTIVE_STANDBY spare-pool-size=4 juju run-action --wait glance-simplestreams-sync/0 sync-images","title":"Configurando o Octavia com as alteracoes"},{"location":"roteiros/5.K8s/#_1","text":"","title":""},{"location":"roteiros/5.K8s/#hold-your-breath","text":"","title":"Hold your breath!"},{"location":"roteiros/5.K8s/#criando-imagem","text":"Passo1 juju run-action --wait octavia-diskimage-retrofit/leader retrofit-image","title":"Criando imagem"},{"location":"roteiros/5.K8s/#_2","text":"Passo2 openstack image list openstack image set --tag octavia-diskimage-retrofit --tag octavia-amphora [id amphora image] juju run-action --wait octavia/0 configure-resources No cap\u00edtulo 3, foi realizada a implanta\u00e7\u00e3o do Openstack no hardware dispon\u00edvel. Al\u00e9m de VMs, o Openstack consegue tamb\u00e9m manipular containers, tal qual o MaaS e o Juju. Contudo o grande problema \u00e9 que n\u00e3o basta apenas criar e destruir um container, \u00e9 preciso administrar uma complexa arquitetura, monitorando e controlando um conjunto de containers que representam uma implanta\u00e7\u00e3o de um sistema.","title":""},{"location":"roteiros/5.K8s/#webserver","text":"Criar uma inst\u00e2ncia m1.small com IP p\u00fablico no Openstack, nomea-la como juju-openstack Acessar a instancia criada Vamos criar um WebServer em NodeJS Criar o arquivo ~/hello-node/server.js #!/usr/bin/env nodejs var http = require('http'); var os = require('os'); var handleRequest = function(request, response) { console.log('Received request for URL: ' + request.url); response.writeHead(200); response.end('{ \"host\": ' + os.hostname() + ', \"message\": \"Hello World!\"}'); }; var www = http.createServer(handleRequest); www.listen(8080); console.log('Server running at http://localhost:8080/'); Testar o WebServer rodando localmente no terminal. sudo apt install nodejs ./server.js Exercise CheckPoint-1 WebServer De um print das Telas abaixo: Da aba network topology no OpenStack . Das regras do Security Group utilizado Da Aba do navegador com o WebServer Rodando.","title":"WebServer"},{"location":"roteiros/5.K8s/#instalar-o-docker","text":"Arquitetura Docker sudo apt-get update sudo apt install build-essential apt-transport-https curl curl -fsSL https://get.docker.com | sh - sudo usermod -aG docker $USER newgrp docker docker version docker run hello-world Criar uma um arquivo ~/hello-node/Dockerfile que dar\u00e1 origem ao container FROM node:6.9.2 EXPOSE 8080 COPY server.js . CMD node server.js Montar a imagem local (Cria um container com esta aplicacao webserver) docker build -t hello-node:v1 ./hello-node/ Rodar o container com a imagem criada. docker container run hello-node:v1 Exercise CheckPoint-2 Docker De um print das Telas abaixo: WebServer Rodando no navegador.","title":"Instalar o Docker"},{"location":"roteiros/5.K8s/#docker-hub","text":"Criar individualmente um login na https://hub.docker.com/ \u2022 Fazer o login no Docker \u2022 Aplicar a tag na imagem e dar o push do Docker Hub \u2022 Para mais detalhes docker --help Exercise QUESTOES-1 O que \u00e9 Docker Swarm? O que \u00e9 Docker Registry? O que \u00e9 Docker Engine?","title":"Docker Hub"},{"location":"roteiros/5.K8s/#kubernetes-aka-k8s","text":"Para facilitar o deploy do Kubernetes vamos utilizar uma \"velha conhecida\".","title":"Kubernetes aka k8s"},{"location":"roteiros/5.K8s/#deja-vu-juju-reborn","text":"O Dashboard do Openstack possui alguns termos (region, instance type, security group, etc) que s\u00e3o semelhantes ao da AWS. Como visto anteriormente, Juju consegue operar sobre Public Cloud, Private Cloud, Bare-metal e Container. Para o setup ficar completo, agora vamos utilizar o Juju sobre o Openstack. Dicas Documentacao - adicionar Openstack como cloud Documentacao - adicionar integrador obrigat\u00f3rio Bundle modificado do Kubernetes-core Acesse a inst\u00e2ncia m1.tiny criada no in\u00edcio do roteiro. Fazer a instala\u00e7\u00e3o do Juju. Adicione o Openstack como Cloud Provider no Juju. Fazer o deploy do Kubernetes-core Instalar kubectl no cliente via snap. sudo snap install kubectl --classic Verificar a configura\u00e7\u00e3o do Kubernetes via kubectl kubectl cluster-info Caso tenha problemas ver: documentacao-kubernetes Configurar o kubectl proxy para utiliza\u00e7\u00e3o externa na porta 8080. Acessar o Dashboard.","title":"Deja-vu (Juju Reborn)"},{"location":"roteiros/5.K8s/#fazendo-um-deploy","text":"Fazer o deploy da imagem docker criada na sess\u00e3o anterior kubectl run hello-node --image=[user]/hello-node:v1 --port=8080 Verificar no terminal: kubectl get all Verificar o deploy status no Dashboard Expandir o deploy para 5 r\u00e9plicas do pod Exercise CheckPoint-3 Dashboard Kubernetes De um print das Telas abaixo: Do dashboard Kubernetes com as 5 replicas","title":"Fazendo um Deploy"},{"location":"roteiros/5.K8s/#acessando-o-deploy","text":"Criar um servi\u00e7o que ir\u00e1 expor o deploy","title":"Acessando o Deploy"},{"location":"roteiros/5.K8s/#alternativa-i-clusterip-com-ingress","text":"kubectl expose deployment hello-node --type=ClusterIP Criar o arquivo ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: hello-node-ingress spec: rules: - host: hello-node.[ip do kubernetes-worker].xip.io http: paths: - path: / backend: serviceName: hello-node servicePort: 8080 * Aplicar arquivo ingress ao K8s kubectl create -f ingress.yaml Exercise CheckPoint-4 Expose Service De um print das Telas abaixo: Do comando -> kubectl get all","title":"Alternativa I - ClusterIP com Ingress"},{"location":"roteiros/5.K8s/#alternativa-ii-nodeport","text":"kubectl expose deployment hello-node --type=NodePort Verificar qual porta foi designada e liberar o security group do worker juju run --unit kubernetes-worker/[# worker] \"open-port [porta]\" Exercise CheckPoint-4 Acessar o deploy De um print das Telas abaixo: Do comando -> kubectl get all WebServer Rodando no navegador utilizando a porta aberta.","title":"Alternativa II - NodePort"},{"location":"roteiros/5.K8s/#alterando-o-deploy","text":"Alterar o arquivo server.js Montar uma nova imagem com tag v2 e fa\u00e7a um push Fazer um deploy de um pod de testes Testar as altera\u00e7\u00f5es Fazer a implanta\u00e7\u00e3o imediata em produ\u00e7\u00e3o: kubectl set image deployment/hello-node hello-node=[user]/hello-node:v2 Exercise CheckPoint-5 Modificacao De um print das Telas abaixo: Do comando -> kubectl get all WebServer modificado Rodando no navegador utilizando a porta aberta.","title":"Alterando o deploy"},{"location":"roteiros/5.K8s/#conclusao-somente-para-pensar","text":"Voc\u00ea desempenhou uma implanta\u00e7\u00e3o em tempo real usando Kubernetes e DockerHub. Como seria uma arquitetura de Continuous Integration/Continuous Delivery (CI/CD) real utilizando Kubernetes?","title":"Conclus\u00e3o: SOMENTE PARA PENSAR"},{"location":"roteiros/README-openstackBase/","text":"Basic OpenStack cloud \u00b6 This openstack-base bundle deploys a base OpenStack cloud. Its major elements include: Ubuntu 20.04 LTS (Focal) OpenStack Yoga Ceph Quincy Cloud services consist of Compute, Network, Block Storage, Object Storage, Identity, Image, and Dashboard. Note : Modifications will typically need to be made to this bundle for it to work in your environment. Requirements \u00b6 The bundle is primarily designed to work with MAAS as a backing cloud for Juju. The MAAS cluster must have a minimum of four nodes: one for the Juju controller, with at least 1 CPU and 4 GiB memory three (ideally identical) for the actual cloud, with minimum resources being: 8 GiB memory enough CPU cores to support your workload two disks two cabled network interfaces The first disk is used for the node's operating system, and the second is for Ceph storage. The first network interface is used for communication between cloud services (East/West traffic), and the second is for network traffic between the cloud and all external networks (North/South traffic). Pro tip : A single network interface will suffice if an Open vSwitch bridge is used on each of the nodes (MAAS v.2.9.2 required). Note : The smaller controller node can be targeted via Juju constraints at controller-creation time. Topology \u00b6 3 MAAS nodes, with each hosting one of the following: Ceph storage Nova Compute NTP LXD containers for the following (distributed among the 3 MAAS nodes): Ceph monitors (x3) Ceph RADOS Gateway Cinder Glance Horizon Keystone MySQL8 (x3) Neutron Nova Cloud Controller OVN (x3) Placement RabbitMQ Vault Download the bundle \u00b6 If not already done, clone the openstack-bundles repository: git clone https://github.com/openstack-charmers/openstack-bundles The stable and development bundles are found under the stable/openstack-base and development directories respectively. Overlay bundles are available under stable/overlays . See the Juju documentation on overlay bundles . Modify the bundle \u00b6 If using the stable openstack-base bundle, the file to modify is stable/openstack-base/bundle.yaml . Tip : Keep the master branch of the repository pristine and create a working branch to contain your modifications. A variables: section is used for conveniently setting values in one place. The third column contains the actual values. variables: openstack-origin: &openstack-origin cloud:focal-yoga data-port: &data-port br-ex:eno2 worker-multiplier: &worker-multiplier 0.25 osd-devices: &osd-devices /dev/sdb /dev/vdb expected-osd-count: &expected-osd-count 3 expected-mon-count: &expected-mon-count 3 See the Install OpenStack page in the OpenStack Charms Deployment Guide for help on understanding the variables (the first column). Network spaces \u00b6 If you're using MAAS and it contains network spaces you will need to bind them to the applications being deployed. One way of doing this is with the openstack-base-spaces-overlay.yaml overlay bundle. Like the main bundle file, it will likely require tailoring: variables: public-space: &public-space public-space See the Juju documentation on network spaces . Containerless \u00b6 If you do not want to run containers you will need to undo the placement directives that point to containers. One way of doing this is with the openstack-base-virt-overlay.yaml overlay bundle. MAAS cloud, Juju controller, and model \u00b6 Ensure that the MAAS cluster has been added to Juju as a cloud and that a Juju controller has been created for that cloud. See the Juju documentation for guidance: Using MAAS with Juju . Assuming the controller is called 'maas-controller', create a model called, say, 'openstack' and give it the appropriate default series (e.g. focal): juju add-model -c maas-controller --config default-series=focal openstack Now ensure that the new model is the current model: juju switch maas-controller:openstack Deploy the cloud \u00b6 To install OpenStack, if you're using the spaces overlay: juju deploy ./bundle.yaml --overlay ./openstack-base-spaces-overlay.yaml Otherwise, simply do: juju deploy ./bundle.yaml If you're using a custom overlay (to override elements in earlier bundles) simply append it to the command: juju deploy ./bundle.yaml --overlay ./custom-overlay.yaml juju deploy ./bundle.yaml --overlay ./openstack-base-spaces-overlay.yaml --overlay ./custom-overlay.yaml Note : Here it is assumed, for the sake of brevity, that the YAML files are in the current working directory. Issue TLS certificates \u00b6 This bundle uses Vault to issue TLS certificates to services, and some post-deployment steps are needed in order for it to work. Failure to complete them, for example, will leave the OVN deployment with the following message (in juju status ): 'ovsdb-*' incomplete, 'certificates' awaiting server certificate data See to the Vault charm README for instructions. Install the OpenStack clients \u00b6 You'll need the OpenStack clients in order to manage your cloud from the command line. Install them now: sudo snap install openstackclients Access the cloud \u00b6 Confirm that you can access the cloud from the command line: source ~/openstack-bundles/stable/openstack-base/openrc openstack service list You should get a listing of all registered cloud services. Import an image \u00b6 You'll need to import an image into Glance in order to create instances. First download a boot image, like Focal amd64: curl http://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img \\ --output ~/cloud-images/focal-amd64.img Now import the image and call it 'focal-amd64': openstack image create --public --container-format bare \\ --disk-format qcow2 --file ~/cloud-images/focal-amd64.img \\ focal-amd64 Images for other Ubuntu releases and architectures can be obtained in a similar way. For the ARM 64-bit (arm64) architecture you will need to configure the image to boot in UEFI mode: curl http://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img \\ --output ~/cloud-images/focal-arm64.img openstack image create --public --container-format bare \\ --disk-format qcow2 --property hw_firmware_type=uefi \\ --file ~/cloud-images/focal-arm64.img \\ focal-arm64 Configure networking \u00b6 For the purposes of a quick test, we'll set up an external network and a shared router ('provider-router') that will be used by all tenants for public access to instances. For an example private cloud, create a network ('ext_net'): openstack network create --external \\ --provider-network-type flat --provider-physical-network physnet1 \\ ext_net When creating the external subnet ('ext_subnet') the actual values used will depend on the environment that the second network interface (on all nodes) is connected to: openstack subnet create --network ext_net --no-dhcp \\ --gateway 10.0.0.1 --subnet-range 10.0.0.0/21 \\ --allocation-pool start=10.0.0.10,end=10.0.0.200 \\ ext_subnet Note : For a public cloud the ports would be connected to a publicly addressable part of the internet. We'll also need an internal network ('int_net'), subnet ('int_subnet'), and router ('provider-router'): openstack network create int_net openstack subnet create --network int_net --dns-nameserver 8.8.8.8 \\ --gateway 192.168.0.1 --subnet-range 192.168.0.0/24 \\ --allocation-pool start=192.168.0.10,end=192.168.0.200 \\ int_subnet openstack router create provider-router openstack router set --external-gateway ext_net provider-router openstack router add subnet provider-router int_subnet See the Neutron documentation for more information. Create a flavor \u00b6 Create at least one flavor to define a hardware profile for new instances. Here we create one called 'm1.small': openstack flavor create --ram 2048 --disk 20 --ephemeral 20 m1.small Make sure that your MAAS nodes can accommodate the flavor's resources. Import an SSH keypair \u00b6 An SSH keypair needs to be imported into the cloud in order to access your instances. Generate one first if you do not yet have one. This command creates a passphraseless keypair (remove the -N option to avoid that): ssh-keygen -q -N '' -f ~/cloud-keys/id_mykey To import a keypair: openstack keypair create --public-key ~/cloud-keys/id_mykey.pub mykey Configure security groups \u00b6 To allow ICMP (ping) and SSH traffic to flow to cloud instances create corresponding rules for each existing security group: for i in $(openstack security group list | awk '/default/{ print $2 }'); do openstack security group rule create $i --protocol icmp --remote-ip 0.0.0.0/0; openstack security group rule create $i --protocol tcp --remote-ip 0.0.0.0/0 --dst-port 22; done You only need to perform this step once. Create an instance \u00b6 Create a Focal amd64 instance called 'focal-1': openstack server create --image focal-amd64 --flavor m1.small \\ --key-name mykey --network int_net \\ focal-1 Assign a floating IP address \u00b6 Request and assign a floating IP address to the new instance: FLOATING_IP=$(openstack floating ip create -f value -c floating_ip_address ext_net) openstack server add floating ip focal-1 $FLOATING_IP Log in to an instance \u00b6 Log in to the new instance: ssh -i ~/cloud-keys/id_mykey ubuntu@$FLOATING_IP The below commands are a good start to troubleshooting if something goes wrong: openstack console log show focal-1 openstack server show focal-1 Access the cloud dashboard \u00b6 To access the dashboard (Horizon) first obtain its IP address: juju status --format=yaml openstack-dashboard | grep public-address | awk '{print $2}' | head -1 In this example, the address is '10.0.0.30'. The password can be queried from Keystone: juju run --unit keystone/leader leader-get admin_passwd The dashboard URL then becomes: http://10.0.0.30/horizon The final credentials needed to log in are: User Name: admin Password: *************** Domain: admin_domain VM consoles \u00b6 Enable a remote access protocol such as novnc (or spice ) if you want to connect to VM consoles from within the dashboard: juju config nova-cloud-controller console-access-protocol=novnc Further reading \u00b6 The below resources are recommended for further reading: [What is OpenStack?]: for an overview of the OpenStack project OpenStack Administrator Guides : for upstream OpenStack administrative help OpenStack Charms Deployment Guide : for charm usage information","title":"Basic OpenStack cloud"},{"location":"roteiros/README-openstackBase/#basic-openstack-cloud","text":"This openstack-base bundle deploys a base OpenStack cloud. Its major elements include: Ubuntu 20.04 LTS (Focal) OpenStack Yoga Ceph Quincy Cloud services consist of Compute, Network, Block Storage, Object Storage, Identity, Image, and Dashboard. Note : Modifications will typically need to be made to this bundle for it to work in your environment.","title":"Basic OpenStack cloud"},{"location":"roteiros/README-openstackBase/#requirements","text":"The bundle is primarily designed to work with MAAS as a backing cloud for Juju. The MAAS cluster must have a minimum of four nodes: one for the Juju controller, with at least 1 CPU and 4 GiB memory three (ideally identical) for the actual cloud, with minimum resources being: 8 GiB memory enough CPU cores to support your workload two disks two cabled network interfaces The first disk is used for the node's operating system, and the second is for Ceph storage. The first network interface is used for communication between cloud services (East/West traffic), and the second is for network traffic between the cloud and all external networks (North/South traffic). Pro tip : A single network interface will suffice if an Open vSwitch bridge is used on each of the nodes (MAAS v.2.9.2 required). Note : The smaller controller node can be targeted via Juju constraints at controller-creation time.","title":"Requirements"},{"location":"roteiros/README-openstackBase/#topology","text":"3 MAAS nodes, with each hosting one of the following: Ceph storage Nova Compute NTP LXD containers for the following (distributed among the 3 MAAS nodes): Ceph monitors (x3) Ceph RADOS Gateway Cinder Glance Horizon Keystone MySQL8 (x3) Neutron Nova Cloud Controller OVN (x3) Placement RabbitMQ Vault","title":"Topology"},{"location":"roteiros/README-openstackBase/#download-the-bundle","text":"If not already done, clone the openstack-bundles repository: git clone https://github.com/openstack-charmers/openstack-bundles The stable and development bundles are found under the stable/openstack-base and development directories respectively. Overlay bundles are available under stable/overlays . See the Juju documentation on overlay bundles .","title":"Download the bundle"},{"location":"roteiros/README-openstackBase/#modify-the-bundle","text":"If using the stable openstack-base bundle, the file to modify is stable/openstack-base/bundle.yaml . Tip : Keep the master branch of the repository pristine and create a working branch to contain your modifications. A variables: section is used for conveniently setting values in one place. The third column contains the actual values. variables: openstack-origin: &openstack-origin cloud:focal-yoga data-port: &data-port br-ex:eno2 worker-multiplier: &worker-multiplier 0.25 osd-devices: &osd-devices /dev/sdb /dev/vdb expected-osd-count: &expected-osd-count 3 expected-mon-count: &expected-mon-count 3 See the Install OpenStack page in the OpenStack Charms Deployment Guide for help on understanding the variables (the first column).","title":"Modify the bundle"},{"location":"roteiros/README-openstackBase/#network-spaces","text":"If you're using MAAS and it contains network spaces you will need to bind them to the applications being deployed. One way of doing this is with the openstack-base-spaces-overlay.yaml overlay bundle. Like the main bundle file, it will likely require tailoring: variables: public-space: &public-space public-space See the Juju documentation on network spaces .","title":"Network spaces"},{"location":"roteiros/README-openstackBase/#containerless","text":"If you do not want to run containers you will need to undo the placement directives that point to containers. One way of doing this is with the openstack-base-virt-overlay.yaml overlay bundle.","title":"Containerless"},{"location":"roteiros/README-openstackBase/#maas-cloud-juju-controller-and-model","text":"Ensure that the MAAS cluster has been added to Juju as a cloud and that a Juju controller has been created for that cloud. See the Juju documentation for guidance: Using MAAS with Juju . Assuming the controller is called 'maas-controller', create a model called, say, 'openstack' and give it the appropriate default series (e.g. focal): juju add-model -c maas-controller --config default-series=focal openstack Now ensure that the new model is the current model: juju switch maas-controller:openstack","title":"MAAS cloud, Juju controller, and model"},{"location":"roteiros/README-openstackBase/#deploy-the-cloud","text":"To install OpenStack, if you're using the spaces overlay: juju deploy ./bundle.yaml --overlay ./openstack-base-spaces-overlay.yaml Otherwise, simply do: juju deploy ./bundle.yaml If you're using a custom overlay (to override elements in earlier bundles) simply append it to the command: juju deploy ./bundle.yaml --overlay ./custom-overlay.yaml juju deploy ./bundle.yaml --overlay ./openstack-base-spaces-overlay.yaml --overlay ./custom-overlay.yaml Note : Here it is assumed, for the sake of brevity, that the YAML files are in the current working directory.","title":"Deploy the cloud"},{"location":"roteiros/README-openstackBase/#issue-tls-certificates","text":"This bundle uses Vault to issue TLS certificates to services, and some post-deployment steps are needed in order for it to work. Failure to complete them, for example, will leave the OVN deployment with the following message (in juju status ): 'ovsdb-*' incomplete, 'certificates' awaiting server certificate data See to the Vault charm README for instructions.","title":"Issue TLS certificates"},{"location":"roteiros/README-openstackBase/#install-the-openstack-clients","text":"You'll need the OpenStack clients in order to manage your cloud from the command line. Install them now: sudo snap install openstackclients","title":"Install the OpenStack clients"},{"location":"roteiros/README-openstackBase/#access-the-cloud","text":"Confirm that you can access the cloud from the command line: source ~/openstack-bundles/stable/openstack-base/openrc openstack service list You should get a listing of all registered cloud services.","title":"Access the cloud"},{"location":"roteiros/README-openstackBase/#import-an-image","text":"You'll need to import an image into Glance in order to create instances. First download a boot image, like Focal amd64: curl http://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img \\ --output ~/cloud-images/focal-amd64.img Now import the image and call it 'focal-amd64': openstack image create --public --container-format bare \\ --disk-format qcow2 --file ~/cloud-images/focal-amd64.img \\ focal-amd64 Images for other Ubuntu releases and architectures can be obtained in a similar way. For the ARM 64-bit (arm64) architecture you will need to configure the image to boot in UEFI mode: curl http://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img \\ --output ~/cloud-images/focal-arm64.img openstack image create --public --container-format bare \\ --disk-format qcow2 --property hw_firmware_type=uefi \\ --file ~/cloud-images/focal-arm64.img \\ focal-arm64","title":"Import an image"},{"location":"roteiros/README-openstackBase/#configure-networking","text":"For the purposes of a quick test, we'll set up an external network and a shared router ('provider-router') that will be used by all tenants for public access to instances. For an example private cloud, create a network ('ext_net'): openstack network create --external \\ --provider-network-type flat --provider-physical-network physnet1 \\ ext_net When creating the external subnet ('ext_subnet') the actual values used will depend on the environment that the second network interface (on all nodes) is connected to: openstack subnet create --network ext_net --no-dhcp \\ --gateway 10.0.0.1 --subnet-range 10.0.0.0/21 \\ --allocation-pool start=10.0.0.10,end=10.0.0.200 \\ ext_subnet Note : For a public cloud the ports would be connected to a publicly addressable part of the internet. We'll also need an internal network ('int_net'), subnet ('int_subnet'), and router ('provider-router'): openstack network create int_net openstack subnet create --network int_net --dns-nameserver 8.8.8.8 \\ --gateway 192.168.0.1 --subnet-range 192.168.0.0/24 \\ --allocation-pool start=192.168.0.10,end=192.168.0.200 \\ int_subnet openstack router create provider-router openstack router set --external-gateway ext_net provider-router openstack router add subnet provider-router int_subnet See the Neutron documentation for more information.","title":"Configure networking"},{"location":"roteiros/README-openstackBase/#create-a-flavor","text":"Create at least one flavor to define a hardware profile for new instances. Here we create one called 'm1.small': openstack flavor create --ram 2048 --disk 20 --ephemeral 20 m1.small Make sure that your MAAS nodes can accommodate the flavor's resources.","title":"Create a flavor"},{"location":"roteiros/README-openstackBase/#import-an-ssh-keypair","text":"An SSH keypair needs to be imported into the cloud in order to access your instances. Generate one first if you do not yet have one. This command creates a passphraseless keypair (remove the -N option to avoid that): ssh-keygen -q -N '' -f ~/cloud-keys/id_mykey To import a keypair: openstack keypair create --public-key ~/cloud-keys/id_mykey.pub mykey","title":"Import an SSH keypair"},{"location":"roteiros/README-openstackBase/#configure-security-groups","text":"To allow ICMP (ping) and SSH traffic to flow to cloud instances create corresponding rules for each existing security group: for i in $(openstack security group list | awk '/default/{ print $2 }'); do openstack security group rule create $i --protocol icmp --remote-ip 0.0.0.0/0; openstack security group rule create $i --protocol tcp --remote-ip 0.0.0.0/0 --dst-port 22; done You only need to perform this step once.","title":"Configure security groups"},{"location":"roteiros/README-openstackBase/#create-an-instance","text":"Create a Focal amd64 instance called 'focal-1': openstack server create --image focal-amd64 --flavor m1.small \\ --key-name mykey --network int_net \\ focal-1","title":"Create an instance"},{"location":"roteiros/README-openstackBase/#assign-a-floating-ip-address","text":"Request and assign a floating IP address to the new instance: FLOATING_IP=$(openstack floating ip create -f value -c floating_ip_address ext_net) openstack server add floating ip focal-1 $FLOATING_IP","title":"Assign a floating IP address"},{"location":"roteiros/README-openstackBase/#log-in-to-an-instance","text":"Log in to the new instance: ssh -i ~/cloud-keys/id_mykey ubuntu@$FLOATING_IP The below commands are a good start to troubleshooting if something goes wrong: openstack console log show focal-1 openstack server show focal-1","title":"Log in to an instance"},{"location":"roteiros/README-openstackBase/#access-the-cloud-dashboard","text":"To access the dashboard (Horizon) first obtain its IP address: juju status --format=yaml openstack-dashboard | grep public-address | awk '{print $2}' | head -1 In this example, the address is '10.0.0.30'. The password can be queried from Keystone: juju run --unit keystone/leader leader-get admin_passwd The dashboard URL then becomes: http://10.0.0.30/horizon The final credentials needed to log in are: User Name: admin Password: *************** Domain: admin_domain","title":"Access the cloud dashboard"},{"location":"roteiros/README-openstackBase/#vm-consoles","text":"Enable a remote access protocol such as novnc (or spice ) if you want to connect to VM consoles from within the dashboard: juju config nova-cloud-controller console-access-protocol=novnc","title":"VM consoles"},{"location":"roteiros/README-openstackBase/#further-reading","text":"The below resources are recommended for further reading: [What is OpenStack?]: for an overview of the OpenStack project OpenStack Administrator Guides : for upstream OpenStack administrative help OpenStack Charms Deployment Guide : for charm usage information","title":"Further reading"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..864e7a75 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,163 @@ + + + + https://github.com/Insper/computacao-nuvem/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/license/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/adicional/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/0.Cloud_Intro/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/1.ELB/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/10.EKS/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/11.KMS/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/12.Lambda/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/13.Fargate/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/14.S3/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/15.CloudWatch/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/2.RDS/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/2023-2_projeto/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/3.EC2/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/4.Auto_Scaling/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/5.VPC/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/6.Elastic_BeanStalk/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/7.IAM/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/8.Pipeline/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/9.ECS/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/changelog/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/construcao/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos/projeto_2022/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos_2022/DaviReisVieira/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/projetos_2022/fran-janela/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/roteiros/0.Cabeamento/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/roteiros/1.Bare_metal/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/roteiros/2.Deployment/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/roteiros/3.Private_Cloud_Stack/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/roteiros/4.IaC/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/roteiros/5.K8s/ + 2024-02-22 + daily + + + https://github.com/Insper/computacao-nuvem/roteiros/README-openstackBase/ + 2024-02-22 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 00000000..72bf07b8 Binary files /dev/null and b/sitemap.xml.gz differ