├── .npmrc
├── static
├── favicon.png
├── icons
│ ├── moon.png
│ ├── favicon-svelte.png
│ └── moon.svg
├── img
│ └── backdrop.jpg
├── apple-icon-180.png
├── font
│ ├── outfit-200.woff2
│ ├── outfit-300.woff2
│ ├── outfit-400.woff2
│ ├── outfit-500.woff2
│ ├── outfit-600.woff2
│ └── font.css
├── manifest-icon-192.maskable.png
├── manifest-icon-512.maskable.png
├── bootstrap-icons
│ ├── bootstrap-icons.woff
│ ├── bootstrap-icons.woff2
│ └── bootstrap-icons.css
├── themes
│ ├── light.css
│ ├── night.css
│ ├── olivia.css
│ └── glass.css
└── manifest.json
├── src
├── lib
│ ├── stores
│ │ ├── session.js
│ │ ├── settings.js
│ │ └── oldAssignments.js
│ ├── components
│ │ ├── PeriodSelect.svelte
│ │ ├── Spinner.svelte
│ │ ├── FakeAssignment.svelte
│ │ └── EditAssignment.svelte
│ └── js
│ │ ├── utils.js
│ │ └── parseData.js
├── service-worker.js
├── routes
│ ├── +layout.server.js
│ ├── +page.server.js
│ ├── grades
│ │ ├── +page.server.js
│ │ └── +page.svelte
│ ├── login
│ │ ├── +page.server.js
│ │ ├── +server.js
│ │ └── +page.svelte
│ ├── logout
│ │ └── +server.js
│ ├── settings
│ │ ├── +page.server.js
│ │ └── +page.svelte
│ ├── assignments
│ │ ├── +page.server.js
│ │ └── +page.svelte
│ ├── course
│ │ └── [courseIndex]
│ │ │ ├── +page.server.js
│ │ │ └── +page.svelte
│ ├── data
│ │ └── +server.js
│ ├── +layout.svelte
│ └── +page.svelte
├── hooks.server.js
├── variables.scss
├── app.html
└── app.scss
├── .gitignore
├── .eslintignore
├── .prettierignore
├── playwright.config.js
├── .prettierrc
├── jsconfig.json
├── vite.config.js
├── .eslintrc.cjs
├── svelte.config.js
├── .devcontainer
└── devcontainer.json
├── README.md
├── package.json
└── LICENSE
/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
--------------------------------------------------------------------------------
/static/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/favicon.png
--------------------------------------------------------------------------------
/static/icons/moon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/icons/moon.png
--------------------------------------------------------------------------------
/static/img/backdrop.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/img/backdrop.jpg
--------------------------------------------------------------------------------
/static/apple-icon-180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/apple-icon-180.png
--------------------------------------------------------------------------------
/static/font/outfit-200.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/font/outfit-200.woff2
--------------------------------------------------------------------------------
/static/font/outfit-300.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/font/outfit-300.woff2
--------------------------------------------------------------------------------
/static/font/outfit-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/font/outfit-400.woff2
--------------------------------------------------------------------------------
/static/font/outfit-500.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/font/outfit-500.woff2
--------------------------------------------------------------------------------
/static/font/outfit-600.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/font/outfit-600.woff2
--------------------------------------------------------------------------------
/src/lib/stores/session.js:
--------------------------------------------------------------------------------
1 | import { writable } from 'svelte/store'
2 |
3 | export const session = writable({})
4 |
--------------------------------------------------------------------------------
/static/icons/favicon-svelte.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/icons/favicon-svelte.png
--------------------------------------------------------------------------------
/static/manifest-icon-192.maskable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/manifest-icon-192.maskable.png
--------------------------------------------------------------------------------
/static/manifest-icon-512.maskable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/manifest-icon-512.maskable.png
--------------------------------------------------------------------------------
/static/bootstrap-icons/bootstrap-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/bootstrap-icons/bootstrap-icons.woff
--------------------------------------------------------------------------------
/static/bootstrap-icons/bootstrap-icons.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/refact0r/gradenight/HEAD/static/bootstrap-icons/bootstrap-icons.woff2
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /build
4 | /.svelte-kit
5 | /package
6 | .env
7 | .env.*
8 | !.env.example
9 | .vercel
10 | .output
11 | /responses
12 |
--------------------------------------------------------------------------------
/src/service-worker.js:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | import { build, files, version } from '$service-worker'
4 |
5 | self.addEventListener('fetch', (event) => {
6 | return
7 | })
8 |
--------------------------------------------------------------------------------
/src/routes/+layout.server.js:
--------------------------------------------------------------------------------
1 | /** @type {import('./$types').PageServerLoad} */
2 | export async function load({ locals, url }) {
3 | console.log('layout server load')
4 | return { ...locals, url: url.href }
5 | }
6 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /build
4 | /.svelte-kit
5 | /package
6 | .env
7 | .env.*
8 | !.env.example
9 |
10 | # Ignore files for PNPM, NPM and YARN
11 | pnpm-lock.yaml
12 | package-lock.json
13 | yarn.lock
14 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /build
4 | /.svelte-kit
5 | /package
6 | .env
7 | .env.*
8 | !.env.example
9 |
10 | # Ignore files for PNPM, NPM and YARN
11 | pnpm-lock.yaml
12 | package-lock.json
13 | yarn.lock
14 |
--------------------------------------------------------------------------------
/playwright.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('@playwright/test').PlaywrightTestConfig} */
2 | const config = {
3 | webServer: {
4 | command: 'npm run build && npm run preview',
5 | port: 4173
6 | }
7 | }
8 |
9 | export default config
10 |
--------------------------------------------------------------------------------
/src/routes/+page.server.js:
--------------------------------------------------------------------------------
1 | import { redirect } from '@sveltejs/kit'
2 |
3 | /** @type {import('./$types').PageLoad} */
4 | export async function load({ params, locals }) {
5 | console.log('page server load')
6 | if (!locals.user) {
7 | console.log('redirect')
8 | throw redirect(302, '/login')
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "useTabs": true,
3 | "tabWidth": 4,
4 | "semi": false,
5 | "singleQuote": true,
6 | "trailingComma": "none",
7 | "printWidth": 100,
8 | "plugins": ["prettier-plugin-svelte"],
9 | "pluginSearchDirs": ["."],
10 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
11 | }
12 |
--------------------------------------------------------------------------------
/src/routes/grades/+page.server.js:
--------------------------------------------------------------------------------
1 | import { redirect } from '@sveltejs/kit'
2 |
3 | /** @type {import('./$types').PageLoad} */
4 | export async function load({ params, locals }) {
5 | console.log('grades server load')
6 | if (!locals.user) {
7 | console.log('redirect to login')
8 | throw redirect(302, '/login')
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./.svelte-kit/tsconfig.json",
3 | "compilerOptions": {
4 | "allowJs": true,
5 | "checkJs": false,
6 | "esModuleInterop": true,
7 | "forceConsistentCasingInFileNames": true,
8 | "resolveJsonModule": true,
9 | "skipLibCheck": true,
10 | "sourceMap": true,
11 | "strict": true
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/routes/login/+page.server.js:
--------------------------------------------------------------------------------
1 | import { redirect } from '@sveltejs/kit'
2 |
3 | /** @type {import('./$types').PageLoad} */
4 | export async function load({ params, locals }) {
5 | console.log('login server load')
6 | if (locals.user) {
7 | console.log('redirect to home')
8 | throw redirect(302, '/')
9 | }
10 | return {}
11 | }
12 |
--------------------------------------------------------------------------------
/src/routes/logout/+server.js:
--------------------------------------------------------------------------------
1 | import cookie from 'cookie'
2 |
3 | export async function POST() {
4 | return new Response(null, {
5 | headers: {
6 | 'Set-cookie': cookie.serialize('auth', '', {
7 | httpOnly: true,
8 | sameSite: 'strict',
9 | path: '/',
10 | expires: new Date(0)
11 | })
12 | }
13 | })
14 | }
15 |
--------------------------------------------------------------------------------
/src/routes/settings/+page.server.js:
--------------------------------------------------------------------------------
1 | import { redirect } from '@sveltejs/kit'
2 |
3 | /** @type {import('./$types').PageLoad} */
4 | export async function load({ params, locals }) {
5 | console.log('settings server load')
6 | if (!locals.user) {
7 | console.log('redirect to login')
8 | throw redirect(302, '/login')
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/routes/assignments/+page.server.js:
--------------------------------------------------------------------------------
1 | import { redirect } from '@sveltejs/kit'
2 |
3 | /** @type {import('./$types').PageLoad} */
4 | export async function load({ params, locals }) {
5 | console.log('assignments server load')
6 | if (!locals.user) {
7 | console.log('redirect to login')
8 | throw redirect(302, '/login')
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { sveltekit } from '@sveltejs/kit/vite'
2 |
3 | /** @type {import('vite').UserConfig} */
4 | const config = {
5 | plugins: [sveltekit()],
6 |
7 | css: {
8 | preprocessorOptions: {
9 | scss: {
10 | additionalData: '@use "src/variables.scss" as *;'
11 | }
12 | }
13 | }
14 | }
15 |
16 | export default config
17 |
--------------------------------------------------------------------------------
/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | extends: ['eslint:recommended', 'prettier'],
4 | plugins: ['svelte3'],
5 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }],
6 | parserOptions: {
7 | sourceType: 'module',
8 | ecmaVersion: 2020
9 | },
10 | env: {
11 | browser: true,
12 | es2017: true,
13 | node: true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/svelte.config.js:
--------------------------------------------------------------------------------
1 | import auto from '@sveltejs/adapter-auto'
2 | import preprocess from 'svelte-preprocess'
3 |
4 | /** @type {import('@sveltejs/kit').Config} */
5 | const config = {
6 | preprocess: preprocess({
7 | scss: {
8 | prependData: '@use "src/variables.scss" as *;'
9 | }
10 | }),
11 | kit: {
12 | adapter: auto()
13 | }
14 | }
15 |
16 | export default config
17 |
--------------------------------------------------------------------------------
/src/routes/course/[courseIndex]/+page.server.js:
--------------------------------------------------------------------------------
1 | import { redirect } from '@sveltejs/kit'
2 |
3 | /** @type {import('./$types').PageLoad} */
4 | export async function load({ params, locals }) {
5 | console.log('course server load')
6 | if (!locals.user) {
7 | console.log('redirect to login')
8 | throw redirect(302, '/login')
9 | }
10 | return {
11 | courseIndex: params.courseIndex
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/hooks.server.js:
--------------------------------------------------------------------------------
1 | import cookie from 'cookie'
2 |
3 | export const handle = async ({ event, resolve }) => {
4 | const authCookie = event.cookies.get('auth')
5 |
6 | if (authCookie) {
7 | const auth = authCookie.split(':')
8 | event.locals.user = {
9 | username: auth[0],
10 | password: auth[1],
11 | districtUrl: auth[2]
12 | }
13 | }
14 |
15 | const response = await resolve(event)
16 | return response
17 | }
18 |
--------------------------------------------------------------------------------
/static/themes/light.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --bg-color-1: hsl(220, 30%, 86%);
3 | --bg-color-1-5: hsl(220, 40%, 90%);
4 | --bg-color-2: hsl(220, 50%, 94%);
5 | --bg-color-2-5: hsl(220, 40%, 90%);
6 | --bg-color-3: hsl(220, 30%, 82%);
7 | --bg-color-3-5: hsl(220, 30%, 78%);
8 | --font-color-3: hsl(220, 10%, 56%);
9 | --font-color-2: hsl(220, 10%, 36%);
10 | --font-color: hsl(220, 10%, 12%);
11 | --accent-color: hsl(220, 10%, 12%);
12 | }
13 |
--------------------------------------------------------------------------------
/static/themes/night.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --bg-color-1: hsl(220, 18%, 9%);
3 | --bg-color-1-5: hsl(220, 18%, 11%);
4 | --bg-color-2: hsl(220, 18%, 13%);
5 | --bg-color-2-5: hsl(220, 18%, 16%);
6 | --bg-color-3: hsl(220, 18%, 19%);
7 | --bg-color-3-5: hsl(220, 18%, 22%);
8 | --font-color-3: hsl(220, 18%, 28%);
9 | --font-color-2: hsl(220, 18%, 38%);
10 | --font-color: hsl(220, 37%, 68%);
11 | --accent-color: hsl(220, 37%, 68%);
12 | }
13 |
--------------------------------------------------------------------------------
/static/themes/olivia.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --bg-color-1: hsl(270deg 3% 10%);
3 | --bg-color-1-5: hsl(270deg 3% 11%);
4 | --bg-color-2: hsl(270deg 3% 12%);
5 | --bg-color-2-5: hsl(270deg 4% 13%);
6 | --bg-color-3: hsl(270deg 4% 14%);
7 | --bg-color-3-5: hsl(270deg 4% 15%);
8 | --font-color-3: hsl(0deg 11% 27%);
9 | --font-color-2: hsl(11deg 14% 44%);
10 | --font-color: hsl(24deg 16% 94%);
11 | --accent-color: hsl(17deg 50% 74%);
12 | }
13 |
--------------------------------------------------------------------------------
/src/lib/stores/settings.js:
--------------------------------------------------------------------------------
1 | import { browser } from '$app/environment'
2 | import { writable } from 'svelte/store'
3 |
4 | const defaultSettings = {
5 | theme: 'night'
6 | }
7 |
8 | const initial = browser
9 | ? JSON.parse(window.localStorage.getItem('settings')) ?? defaultSettings
10 | : defaultSettings
11 |
12 | export const settings = writable(initial)
13 |
14 | settings.subscribe((value) => {
15 | if (browser) {
16 | window.localStorage.setItem('settings', JSON.stringify(value))
17 | }
18 | })
19 |
--------------------------------------------------------------------------------
/src/lib/stores/oldAssignments.js:
--------------------------------------------------------------------------------
1 | import { browser } from '$app/environment'
2 | import { writable } from 'svelte/store'
3 |
4 | const defaultStr = ''
5 |
6 | const initialStr = browser
7 | ? window.localStorage.getItem('oldAssignments') ?? defaultStr
8 | : defaultStr
9 |
10 | export const oldAssignments = writable(new Set(initialStr.split(',')))
11 |
12 | oldAssignments.subscribe((value) => {
13 | if (browser) {
14 | window.localStorage.setItem('oldAssignments', Array.from(value).join(','))
15 | }
16 | })
17 |
--------------------------------------------------------------------------------
/src/variables.scss:
--------------------------------------------------------------------------------
1 | /* Variables and mixins declared here will be available in all other SCSS files */
2 | $spacing: 20px;
3 | $spacing-small: 10px;
4 | $roundness: 20px;
5 | $roundness-small: 12px;
6 | $breakpoint-phone: 480px;
7 |
8 | @mixin box {
9 | background: var(--bg-color-2);
10 | border: var(--border);
11 | backdrop-filter: var(--filter);
12 | border-radius: $roundness;
13 | padding: $spacing;
14 | }
15 |
16 | @mixin nowrap {
17 | overflow: hidden;
18 | white-space: nowrap;
19 | text-overflow: ellipsis;
20 | }
21 |
--------------------------------------------------------------------------------
/src/lib/components/PeriodSelect.svelte:
--------------------------------------------------------------------------------
1 |
5 |
6 |
11 |
12 |
24 |
--------------------------------------------------------------------------------
/.devcontainer/devcontainer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Node.js",
3 | "image": "mcr.microsoft.com/devcontainers/javascript-node:16",
4 | "portsAttributes": {
5 | "5173": {
6 | "label": "public"
7 | }
8 | },
9 |
10 | // Features to add to the dev container. More info: https://containers.dev/implementors/features.
11 | // "features": {},
12 |
13 | // Use 'forwardPorts' to make a list of ports inside the container available locally.
14 | "forwardPorts": [5173]
15 |
16 | // Use 'postCreateCommand' to run commands after the container is created.
17 | // "postCreateCommand": "yarn install",
18 |
19 | // Configure tool-specific properties.
20 | // "customizations": {},
21 |
22 | // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
23 | // "remoteUser": "root"
24 | }
25 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # gradenight
2 |
3 | A better looking and easier to use version of StudentVue using [StudentVue.js](https://github.com/StudentVue/StudentVue.js) and [Sveltekit](https://kit.svelte.dev).
4 |
5 | This app stores your login info as a cookie in your browser and nowhere else. If you don't trust me, feel free to fork and run it yourself on netlify or vercel.
6 |
7 | ## features
8 | - clean design
9 | - fancy graphs
10 | - create fake assignments and see impact on grade
11 | - edit assignments and see impact on grade
12 | - color-coded scores and percentages
13 | - themes
14 |
15 | 
16 |
17 | 
18 |
--------------------------------------------------------------------------------
/src/lib/components/Spinner.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
11 |
12 |
37 |
--------------------------------------------------------------------------------
/static/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Gradenight",
3 | "short_name": "Gradenight",
4 | "start_url": "/",
5 | "scope": "/",
6 | "icons": [
7 | {
8 | "src": "/manifest-icon-192.maskable.png",
9 | "sizes": "192x192",
10 | "type": "image/png",
11 | "purpose": "any"
12 | },
13 | {
14 | "src": "/manifest-icon-192.maskable.png",
15 | "sizes": "192x192",
16 | "type": "image/png",
17 | "purpose": "maskable"
18 | },
19 | {
20 | "src": "/manifest-icon-512.maskable.png",
21 | "sizes": "512x512",
22 | "type": "image/png",
23 | "purpose": "any"
24 | },
25 | {
26 | "src": "/manifest-icon-512.maskable.png",
27 | "sizes": "512x512",
28 | "type": "image/png",
29 | "purpose": "maskable"
30 | }
31 | ],
32 | "theme_color": "#13161b",
33 | "background_color": "#13161b",
34 | "display": "standalone"
35 | }
36 |
--------------------------------------------------------------------------------
/static/themes/glass.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --bg-color-1: hsla(0deg 0% 100% / 10%);
3 | --bg-color-1-5: hsla(0deg 0% 100% / 5%);
4 | --bg-color-2: hsla(0deg 0% 100% / 20%);
5 | --bg-color-2-5: hsla(0deg 0% 100% / 25%);
6 | --bg-color-3: hsla(0deg 0% 100% / 30%);
7 | --bg-color-3-5: hsla(0deg 0% 100% / 30%);
8 | --font-color-3: hsla(0deg 0% 100% / 50%);
9 | --font-color-2: hsla(0deg 0% 100% / 70%);
10 | --font-color: hsl(0, 0%, 95%);
11 | --accent-color: hsl(0, 0%, 90%);
12 | --border: 1px solid hsla(0deg 0% 100% / 10%);
13 | --filter: blur(20px);
14 | }
15 |
16 | body {
17 | background-image: url(../img/backdrop.jpg) !important;
18 | background-size: cover !important;
19 | }
20 |
21 | .loading-container {
22 | background-image: url(../img/backdrop.jpg) !important;
23 | background-size: cover !important;
24 | }
25 |
26 | option {
27 | color: black !important;
28 | }
29 |
30 | ::-webkit-scrollbar-thumb {
31 | background: var(--bg-color-1-5);
32 | }
33 | ::-webkit-scrollbar-thumb:hover {
34 | background: var(--bg-color-1);
35 | }
36 | ::-webkit-scrollbar-thumb:active {
37 | background: var(--bg-color-2);
38 | }
39 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "gradenight",
3 | "version": "1.3.1",
4 | "scripts": {
5 | "dev": "vite dev",
6 | "build": "vite build",
7 | "preview": "vite preview",
8 | "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json",
9 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch",
10 | "lint": "prettier --plugin-search-dir . --check .",
11 | "format": "prettier --plugin-search-dir . --write ."
12 | },
13 | "devDependencies": {
14 | "@playwright/test": "1.25.0",
15 | "@sveltejs/adapter-auto": "^1.0.0-next.91",
16 | "@sveltejs/kit": "next",
17 | "eslint": "^7.32.0",
18 | "eslint-config-prettier": "^8.3.0",
19 | "eslint-plugin-svelte3": "^3.2.1",
20 | "prettier": "^2.4.1",
21 | "prettier-plugin-svelte": "^2.4.0",
22 | "pwa-asset-generator": "^6.2.1",
23 | "sass": "^1.55.0",
24 | "svelte": "^3.44.0",
25 | "svelte-preprocess": "^4.10.1",
26 | "vite": "^4.0.0"
27 | },
28 | "dependencies": {
29 | "chart.js": "^3.7.0",
30 | "cookie": "^0.4.1",
31 | "studentvue.js": "^0.1.1"
32 | },
33 | "engines": {
34 | "node": ">=16.0.0"
35 | },
36 | "type": "module"
37 | }
38 |
--------------------------------------------------------------------------------
/src/lib/js/utils.js:
--------------------------------------------------------------------------------
1 | import { get } from 'svelte/store'
2 | import { settings } from '../stores/settings.js'
3 |
4 | const lightThemes = ['light']
5 |
6 | export function getColor(percent) {
7 | const isLight = lightThemes.indexOf(get(settings).theme) !== -1
8 | if (percent < 0) return null
9 | let hue = 0
10 | let sat = isLight ? 1 : 0.8
11 | let light = isLight ? 0.35 : 0.6
12 | if (percent >= 60) hue = 4 * (percent - 60)
13 | else light = (percent / 5 + (isLight ? 23 : 48)) / 100
14 | return HSLtoRGB(hue, sat, light)
15 | }
16 |
17 | export function fourToPercent(grade) {
18 | if (grade === 4.0) return 100
19 | else if (grade === 0) return 0
20 | else return grade * 10 + 55
21 | }
22 |
23 | export function percentToLetter(grade) {
24 | if (grade >= 90) return 'A'
25 | else if (grade >= 80) return 'B'
26 | else if (grade >= 70) return 'C'
27 | else if (grade >= 60) return 'D'
28 | else return 'F'
29 | }
30 |
31 | export function HSLtoRGB(h, s, l) {
32 | let a = s * Math.min(l, 1 - l)
33 | let f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)
34 | return `rgb(${f(0) * 255}, ${f(8) * 255}, ${f(4) * 255})`
35 | }
36 |
--------------------------------------------------------------------------------
/src/app.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
30 |
31 | %sveltekit.head%
32 |
33 |
34 | %sveltekit.body%
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/routes/login/+server.js:
--------------------------------------------------------------------------------
1 | import { login } from 'studentvue.js'
2 | import cookie from 'cookie'
3 |
4 | export async function POST({ request }) {
5 | console.log('post login')
6 |
7 | const body = await request.json()
8 | let result
9 |
10 | try {
11 | let client = await login(body.districtUrl, body.username, body.password)
12 | result = await Promise.all([
13 | client.getStudentInfo().then((value) => JSON.parse(value).StudentInfo),
14 | client.getGradebook(0).then((value) => JSON.parse(value).Gradebook),
15 | client.getGradebook(1).then((value) => JSON.parse(value).Gradebook),
16 | client.getGradebook(2).then((value) => JSON.parse(value).Gradebook),
17 | client.getGradebook(3).then((value) => JSON.parse(value).Gradebook)
18 | ])
19 |
20 | if (!result[0]) {
21 | throw new Error('No data returned')
22 | }
23 | } catch (error) {
24 | console.log(error)
25 | return new Response(null, {
26 | status: 401
27 | })
28 | }
29 |
30 | const currentPeriod =
31 | result[1].ReportingPeriods.ReportPeriod.length -
32 | 1 -
33 | result[1].ReportingPeriods.ReportPeriod.slice()
34 | .reverse()
35 | .findIndex((period) => {
36 | return new Date() > new Date(period.StartDate)
37 | })
38 |
39 | return new Response(
40 | JSON.stringify({
41 | student: result.shift(),
42 | periods: result,
43 | currentPeriod
44 | }),
45 | {
46 | headers: {
47 | 'Set-Cookie': cookie.serialize(
48 | 'auth',
49 | Buffer.from(body.username).toString('base64') +
50 | ':' +
51 | Buffer.from(body.password).toString('base64') +
52 | ':' +
53 | Buffer.from(body.districtUrl).toString('base64'),
54 | {
55 | httpOnly: true,
56 | maxAge: 60 * 60 * 24 * 30,
57 | sameSite: 'strict',
58 | path: '/'
59 | }
60 | )
61 | }
62 | }
63 | )
64 | }
65 |
--------------------------------------------------------------------------------
/static/font/font.css:
--------------------------------------------------------------------------------
1 | /* latin */
2 | @font-face {
3 | font-family: 'Outfit';
4 | font-style: normal;
5 | font-weight: 200;
6 | font-display: swap;
7 | src: url(./outfit-200.woff2) format('woff2');
8 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
9 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
10 | }
11 | /* latin */
12 | @font-face {
13 | font-family: 'Outfit';
14 | font-style: normal;
15 | font-weight: 300;
16 | font-display: swap;
17 | src: url(./outfit-300.woff2) format('woff2');
18 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
19 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
20 | }
21 | /* latin */
22 | @font-face {
23 | font-family: 'Outfit';
24 | font-style: normal;
25 | font-weight: 400;
26 | font-display: swap;
27 | src: url(./outfit-400.woff2) format('woff2');
28 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
29 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
30 | }
31 | /* latin */
32 | @font-face {
33 | font-family: 'Outfit';
34 | font-style: normal;
35 | font-weight: 500;
36 | font-display: swap;
37 | src: url(./outfit-500.woff2) format('woff2');
38 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
39 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
40 | }
41 | /* latin */
42 | @font-face {
43 | font-family: 'Outfit';
44 | font-style: normal;
45 | font-weight: 600;
46 | font-display: swap;
47 | src: url(./outfit-600.woff2) format('woff2');
48 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
49 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
50 | }
51 |
--------------------------------------------------------------------------------
/src/routes/data/+server.js:
--------------------------------------------------------------------------------
1 | import { login } from 'studentvue.js'
2 | import * as cookie from 'cookie'
3 |
4 | export async function GET({ locals }) {
5 | console.log('get data')
6 |
7 | let result
8 |
9 | try {
10 | let client = await login(
11 | Buffer.from(locals.user.districtUrl, 'base64').toString('ascii'),
12 | Buffer.from(locals.user.username, 'base64').toString('ascii'),
13 | Buffer.from(locals.user.password, 'base64').toString('ascii')
14 | )
15 | // let student = JSON.parse(await client.getStudentInfo()).StudentInfo
16 | // let gradebook = JSON.parse(await client.getGradebook()).Gradebook
17 | result = await Promise.all([
18 | client.getStudentInfo().then((value) => JSON.parse(value).StudentInfo),
19 | client.getGradebook(0).then((value) => JSON.parse(value).Gradebook),
20 | client.getGradebook(1).then((value) => JSON.parse(value).Gradebook),
21 | client.getGradebook(2).then((value) => JSON.parse(value).Gradebook),
22 | client.getGradebook(3).then((value) => JSON.parse(value).Gradebook)
23 | ])
24 |
25 | if (!result[0]) {
26 | throw new Error('No data returned')
27 | }
28 | } catch (error) {
29 | console.log(error)
30 | return new Response(null, {
31 | status: 401,
32 | headers: {
33 | 'Set-cookie': cookie.serialize('auth', '', {
34 | httpOnly: true,
35 | sameSite: 'strict',
36 | path: '/',
37 | expires: new Date(0)
38 | })
39 | }
40 | })
41 | }
42 |
43 | console.log('logged in')
44 |
45 | const currentPeriod =
46 | result[1].ReportingPeriods.ReportPeriod.length -
47 | 1 -
48 | result[1].ReportingPeriods.ReportPeriod.slice()
49 | .reverse()
50 | .findIndex((period) => {
51 | return new Date() > new Date(period.StartDate)
52 | })
53 |
54 | return new Response(
55 | JSON.stringify({
56 | student: result.shift(),
57 | periods: result,
58 | currentPeriod,
59 | periodDates: result[1].ReportingPeriods.ReportPeriod
60 | }),
61 | {
62 | headers: {
63 | 'Content-Type': 'application/json'
64 | }
65 | }
66 | )
67 | }
68 |
--------------------------------------------------------------------------------
/src/routes/grades/+page.svelte:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 | Grades
8 |
9 |
10 |
11 |
15 |
16 |
17 | {#each $session.selected.Courses.Course as course, index}
18 |
19 | | {course.Title} |
20 | {course.Staff} |
21 | {course.scoreString} |
22 | {course.score} |
23 |
24 | {/each}
25 |
26 |
27 |
28 |
29 |
95 |
--------------------------------------------------------------------------------
/src/routes/assignments/+page.svelte:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 | Assignments
8 |
9 |
10 |
11 |
12 |
Assignments
13 |
14 |
15 |
40 |
41 |
42 |
110 |
--------------------------------------------------------------------------------
/src/routes/settings/+page.svelte:
--------------------------------------------------------------------------------
1 |
23 |
24 |
25 | Settings
26 |
27 |
28 |
29 |
Settings
30 |
31 |
Account
32 |
33 |
Theme
34 |
{$settings.theme.charAt(0).toUpperCase() + $settings.theme.substring(1)}
35 |
36 |
57 |
58 |
59 |
60 |
100 |
--------------------------------------------------------------------------------
/static/icons/moon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
78 |
--------------------------------------------------------------------------------
/src/routes/login/+page.svelte:
--------------------------------------------------------------------------------
1 |
60 |
61 |
62 | Login
63 |
64 |
65 |
89 |
90 |
136 |
--------------------------------------------------------------------------------
/src/app.scss:
--------------------------------------------------------------------------------
1 | /* Write your global styles here, in SCSS syntax. Variables and mixins from the src/variables.scss file are available here without importing */
2 |
3 | :root {
4 | font-family: 'Outfit', sans-serif;
5 | font-weight: 300;
6 | font-size: 100%;
7 | }
8 |
9 | // @media (max-width: 800px) {
10 | // :root {
11 | // font-size: 90%;
12 | // }
13 | // }
14 |
15 | * {
16 | box-sizing: border-box;
17 | scrollbar-width: thin;
18 | }
19 |
20 | html {
21 | height: 100%;
22 | }
23 |
24 | body {
25 | height: 100%;
26 | margin: 0;
27 | background: var(--bg-color-1);
28 | color: var(--font-color);
29 | overflow: hidden;
30 | }
31 |
32 | #svelte {
33 | height: 100%;
34 | display: flex;
35 | padding: $spacing;
36 | }
37 |
38 | @media (max-width: $breakpoint-phone) {
39 | #svelte {
40 | flex-direction: column-reverse;
41 | }
42 | }
43 |
44 | ::placeholder,
45 | ::-webkit-input-placeholder {
46 | color: var(--font-color-2);
47 | }
48 |
49 | ::-webkit-scrollbar {
50 | width: 10px;
51 | }
52 | ::-webkit-scrollbar-track {
53 | background: transparent;
54 | }
55 | ::-webkit-scrollbar-thumb {
56 | background: var(--bg-color-2-5);
57 | }
58 | ::-webkit-scrollbar-thumb:hover {
59 | background: var(--bg-color-3);
60 | }
61 | ::-webkit-scrollbar-thumb:active {
62 | background: var(--bg-color-3-5);
63 | }
64 |
65 | button,
66 | a,
67 | input,
68 | select,
69 | option {
70 | font: inherit;
71 | color: inherit;
72 | border: none;
73 | outline: none;
74 | }
75 |
76 | input {
77 | background: var(--bg-color-1);
78 | padding: $spacing-small;
79 | border-radius: $roundness-small;
80 | &:focus {
81 | outline: 2px solid var(--bg-color-3-5);
82 | }
83 | }
84 |
85 | button {
86 | background: var(--bg-color-1);
87 | padding: $spacing-small;
88 | border-radius: $roundness-small;
89 | &:hover {
90 | background: var(--bg-color-1-5);
91 | cursor: pointer;
92 | }
93 | &:active {
94 | transform: scale(0.95);
95 | }
96 | }
97 |
98 | select {
99 | padding: $spacing-small;
100 | border-radius: $roundness-small;
101 | }
102 |
103 | p {
104 | margin: $spacing-small 0;
105 | }
106 |
107 | h1 {
108 | color: var(--accent-color);
109 | line-height: 40px;
110 | margin-top: calc($spacing-small + 5px);
111 | margin-bottom: 0;
112 | }
113 |
114 | @media (max-width: $breakpoint-phone) {
115 | h1 {
116 | font-size: 1.75rem;
117 | }
118 | }
119 |
120 | h2 {
121 | color: var(--accent-color);
122 | margin-top: 0;
123 | margin-bottom: $spacing-small;
124 | }
125 |
126 | h3 {
127 | color: var(--accent-color);
128 | margin-top: $spacing;
129 | margin-bottom: $spacing-small;
130 | }
131 |
132 | table {
133 | width: 100%;
134 | border-spacing: 0px;
135 | }
136 |
137 | td {
138 | padding: 0;
139 | }
140 |
141 | .grid-heading-container {
142 | display: flex;
143 | margin-bottom: $spacing;
144 | }
145 |
146 | .heading-container {
147 | display: flex;
148 | align-items: center;
149 | margin-bottom: $spacing-small;
150 | & h2 {
151 | margin: 0;
152 | }
153 | }
154 |
155 | .link {
156 | text-decoration: none;
157 | display: inline-block;
158 | &:hover {
159 | color: var(--font-color-2);
160 | }
161 | &:active {
162 | color: var(--font-color-3);
163 | transform: scale(0.95);
164 | }
165 | *:hover {
166 | color: var(--font-color-2);
167 | }
168 | *:active {
169 | color: var(--font-color-3);
170 | transform: scale(0.95);
171 | }
172 | }
173 |
174 | tr.fake {
175 | color: var(--font-color-2);
176 | }
177 |
--------------------------------------------------------------------------------
/src/lib/components/FakeAssignment.svelte:
--------------------------------------------------------------------------------
1 |
74 |
75 | {#if shown}
76 |
77 |
119 | {/if}
120 |
121 |
172 |
--------------------------------------------------------------------------------
/src/lib/components/EditAssignment.svelte:
--------------------------------------------------------------------------------
1 |
76 |
77 | {#if shown}
78 | {}}
82 | transition:fade={{ duration: 200 }}
83 | >
84 |
89 |
{assignment.Measure}
90 |
91 |
{assignment.Type}
92 |
{assignment.DueDate}
93 |
94 |
95 | {#if assignment.Notes}
96 |
{assignment.Notes}
97 | {/if}
98 |
99 |
134 |
135 |
136 | {/if}
137 |
138 |
188 |
--------------------------------------------------------------------------------
/src/routes/+layout.svelte:
--------------------------------------------------------------------------------
1 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | {#if data.user}
68 | {#if $session.gradebook && $session.student}
69 |
91 |
92 | {#key data.url}
93 |
98 |
99 |
100 | {/key}
101 |
102 | {:else}
103 |
104 |
105 |
106 |
Fetching student info...
107 |
108 |
109 | {/if}
110 | {:else}
111 |
116 |
117 |
118 | {/if}
119 |
120 |
251 |
--------------------------------------------------------------------------------
/src/routes/+page.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 | Gradenight
10 |
11 |
12 |
13 |
Good {greeting}, {$session.student.FormattedName.split(' ')[0]}!
14 |
15 |

16 |
{$session.student.FormattedName.split(' ')[0]}
17 |
18 |
19 |
20 | {$session.gradebook.average}
21 |
22 |
Average grade
23 |
24 |
25 |
26 | {$session.gradebook.week.average}
27 |
28 |
Average grade
this week
29 |
30 |
31 |
{$session.gradebook.week.length}
32 |
33 | {$session.gradebook.week.length === 1 ? 'Assignment' : 'Assignments'}
34 |
this week
35 |
36 |
37 |
38 |
39 | {$session.gradebook.days}
40 |
41 |
42 | {$session.days === 1 ? 'Day' : 'Days'} left in
43 |
{$session.gradebook.ReportingPeriod.GradePeriod}
44 |
45 |
46 |
47 |
Grades
48 |
49 | {#each $session.gradebook.Courses.Course as course, index}
50 |
51 | | {course.Title} |
52 | {course.scoreString} |
53 | {course.score} |
54 |
55 | {/each}
56 |
57 |
58 |
80 |
81 |
82 |
308 |
--------------------------------------------------------------------------------
/src/lib/js/parseData.js:
--------------------------------------------------------------------------------
1 | import { getColor, fourToPercent, percentToLetter } from './utils.js'
2 |
3 | export function parseData(session, oldAssignments) {
4 | for (let period of session.periods) {
5 | let grades = []
6 | let assignments = []
7 |
8 | for (let [index, course] of period.Courses.Course.entries()) {
9 | course.Title = course.Title.replace(/ \([\s\S]*?\)/g, '')
10 | course.index = index
11 | course.chartData = []
12 |
13 | course.fourPoint = false
14 | if (course.Marks.Mark && course.Marks.Mark.CalculatedScoreString !== 'N/A') {
15 | if (
16 | course.Marks.Mark.Assignments.Assignment &&
17 | Array.isArray(course.Marks.Mark.Assignments.Assignment) &&
18 | course.Marks.Mark.Assignments.Assignment[0].ScoreType === 'Rubric 0-4'
19 | ) {
20 | course.fourPoint = true
21 | }
22 | }
23 |
24 | if (course.Marks.Mark && course.Marks.Mark.Assignments.Assignment) {
25 | if (!Array.isArray(course.Marks.Mark.Assignments.Assignment)) {
26 | course.Marks.Mark.Assignments.Assignment = [
27 | course.Marks.Mark.Assignments.Assignment
28 | ]
29 | }
30 |
31 | course.scoreTypes = {}
32 | if (course.Marks.Mark.GradeCalculationSummary.AssignmentGradeCalc) {
33 | let gradeCalc = course.Marks.Mark.GradeCalculationSummary.AssignmentGradeCalc
34 | if (!Array.isArray(gradeCalc)) {
35 | gradeCalc = [gradeCalc]
36 | }
37 | for (let type of gradeCalc) {
38 | if (parseInt(type.Weight) !== 100.0) {
39 | course.scoreTypes[type.Type] = {
40 | score: 0,
41 | total: 0,
42 | weight: parseInt(type.Weight)
43 | }
44 | }
45 | }
46 | } else {
47 | course.scoreTypes.All = {
48 | score: 0,
49 | total: 0,
50 | weight: 100
51 | }
52 | }
53 |
54 | for (let assignment of [...course.Marks.Mark.Assignments.Assignment].reverse()) {
55 | assignment.Measure = assignment.Measure.replace('&', '&')
56 | assignment.course = course.Title
57 | assignment.courseIndex = index
58 | assignment.style = null
59 | assignment.scorePercent = -1
60 | if (assignment.Points.includes('Points Possible')) {
61 | assignment.percent = '?'
62 | assignment.score = 'Not Graded'
63 | } else {
64 | assignment.percent = '-'
65 | assignment.score = assignment.Points
66 | }
67 | if (oldAssignments) {
68 | if (assignment.new !== true) {
69 | assignment.new = !oldAssignments.has(assignment.GradebookID)
70 | }
71 | oldAssignments.add(assignment.GradebookID)
72 | }
73 |
74 | if (assignment.Points.includes(' / ') || assignment.edited) {
75 | if (assignment.Points.includes(' / ')) {
76 | let split = assignment.Points.split(' / ')
77 | assignment.pointsOriginal = parseFloat(split[0])
78 | assignment.totalOriginal = parseFloat(split[1])
79 | if (!assignment.edited) {
80 | assignment.points = assignment.pointsOriginal
81 | assignment.total = assignment.totalOriginal
82 | }
83 | }
84 | assignment.score = assignment.points + ' / ' + assignment.total
85 |
86 | if (
87 | (assignment.points === 0 && assignment.total === 0) ||
88 | assignment.Notes.toLowerCase().includes('not for grading')
89 | ) {
90 | assignment.scorePercent = -1
91 | assignment.percent = '-'
92 | } else {
93 | assignment.scorePercent = (assignment.points / assignment.total) * 100
94 | assignment.percent = assignment.scorePercent
95 | ? assignment.scorePercent.toFixed(1) + '%'
96 | : '0.0%'
97 |
98 | if (course.Marks.Mark.GradeCalculationSummary.AssignmentGradeCalc) {
99 | if (course.scoreTypes[assignment.Type]) {
100 | course.scoreTypes[assignment.Type].score += assignment.points
101 | course.scoreTypes[assignment.Type].total += assignment.total
102 | }
103 | } else {
104 | course.scoreTypes.All.score += assignment.points
105 | course.scoreTypes.All.total += assignment.total
106 | }
107 |
108 | let date = new Date(assignment.DueDate)
109 | let scoreSum = 0
110 | let totalSum = 0
111 |
112 | for (let type of Object.values(course.scoreTypes)) {
113 | if (type.total > 0) {
114 | scoreSum += (type.score / type.total) * type.weight
115 | totalSum += type.weight
116 | }
117 | }
118 |
119 | let color = getColor((scoreSum / totalSum) * 100)
120 | let grade = (scoreSum / totalSum) * (course.fourPoint ? 4 : 100)
121 |
122 | if (
123 | course.chartData.length > 0 &&
124 | course.chartData[course.chartData.length - 1].x ===
125 | Math.floor(date / 8.64e7)
126 | ) {
127 | course.chartData[course.chartData.length - 1].y = grade
128 | course.chartData[course.chartData.length - 1].color = color
129 | } else {
130 | course.chartData.push({
131 | x: Math.floor(date / 8.64e7),
132 | y: grade,
133 | color: color
134 | })
135 | }
136 | }
137 | assignment.style = `color: ${getColor(assignment.scorePercent)};`
138 | }
139 | assignments.push(assignment)
140 | }
141 |
142 | let totalWeight = 0
143 | for (let type of Object.values(course.scoreTypes)) {
144 | if (type.total === 0) {
145 | type.weight = 0
146 | }
147 | totalWeight += type.weight
148 | }
149 | for (let type of Object.values(course.scoreTypes)) {
150 | type.weight = ((type.weight / totalWeight) * 100).toFixed(1)
151 | let percent = type.total ? type.score / type.total : 0
152 | type.scorePercent = (percent * type.weight).toFixed(1)
153 | type.color = type.style = `color: ${percent ? getColor(percent * 100) : 0};`
154 | }
155 | }
156 |
157 | course.scorePercent = -1
158 | course.score = '-'
159 | course.scoreString = course.Marks.Mark ? course.Marks.Mark.CalculatedScoreString : 'N/A'
160 | if (course.chartData.length > 0) {
161 | course.scorePercent = course.chartData[course.chartData.length - 1].y
162 | course.score = course.scorePercent.toFixed(1)
163 | if (course.fourPoint) {
164 | course.scorePercent = fourToPercent(course.scorePercent)
165 | } else {
166 | course.score += '%'
167 | }
168 | grades.push(course.scorePercent)
169 | course.scoreString = percentToLetter(course.scorePercent)
170 | }
171 | course.color = getColor(course.scorePercent)
172 | course.style = `color: ${course.color};`
173 | }
174 |
175 | let averageRaw = -1
176 | if (grades.length > 0) averageRaw = grades.reduce((a, b) => a + b) / grades.length
177 |
178 | period.averageStyle = `color: ${getColor(averageRaw)};`
179 | period.average = averageRaw >= 0 ? averageRaw.toFixed(1) + '%' : '-'
180 |
181 | period.days = Math.round((new Date(period.ReportingPeriod.EndDate) - new Date()) / 86400000)
182 | assignments.sort((a, b) => new Date(b.DueDate) - new Date(a.DueDate))
183 | period.assignments = assignments
184 | period.week = getWeek(period.assignments)
185 | }
186 | }
187 |
188 | function getWeek(assignments) {
189 | const now = new Date()
190 | const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())
191 | const lastSunday = new Date(today.setDate(today.getDate() - today.getDay()))
192 | let week = assignments.filter((a) => {
193 | return new Date(a.DueDate) > lastSunday && a.scorePercent >= 0
194 | })
195 | let average = -1
196 | if (week.length > 0)
197 | average = (week.reduce((a, b) => a + b.scorePercent, 0) / week.length).toFixed(1)
198 | return {
199 | average: average >= 0 ? average + '%' : '-',
200 | averageStyle: `color: ${getColor(average)};`,
201 | length: week.length
202 | }
203 | }
204 |
--------------------------------------------------------------------------------
/src/routes/course/[courseIndex]/+page.svelte:
--------------------------------------------------------------------------------
1 |
130 |
131 |
132 | {course.Title}
133 |
134 |
135 |
136 |
137 |
{course.Title}
138 |
139 |
140 |
141 |
142 | {course.scoreString}
143 |
144 |
{course.score}
145 |
146 |
151 |
176 |
212 |
213 |
214 |
215 |
216 |
424 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/static/bootstrap-icons/bootstrap-icons.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'bootstrap-icons';
3 | src: url('/bootstrap-icons/bootstrap-icons.woff2?30af91bf14e37666a085fb8a161ff36d')
4 | format('woff2'),
5 | url('/bootstrap-icons/bootstrap-icons.woff?30af91bf14e37666a085fb8a161ff36d') format('woff');
6 | }
7 |
8 | .bi::before,
9 | [class^='bi-']::before,
10 | [class*=' bi-']::before {
11 | display: inline-block;
12 | font-family: bootstrap-icons !important;
13 | font-style: normal;
14 | font-weight: normal !important;
15 | font-variant: normal;
16 | text-transform: none;
17 | line-height: 1;
18 | vertical-align: -0.125em;
19 | -webkit-font-smoothing: antialiased;
20 | -moz-osx-font-smoothing: grayscale;
21 | }
22 |
23 | .bi-123::before {
24 | content: '\f67f';
25 | }
26 | .bi-alarm-fill::before {
27 | content: '\f101';
28 | }
29 | .bi-alarm::before {
30 | content: '\f102';
31 | }
32 | .bi-align-bottom::before {
33 | content: '\f103';
34 | }
35 | .bi-align-center::before {
36 | content: '\f104';
37 | }
38 | .bi-align-end::before {
39 | content: '\f105';
40 | }
41 | .bi-align-middle::before {
42 | content: '\f106';
43 | }
44 | .bi-align-start::before {
45 | content: '\f107';
46 | }
47 | .bi-align-top::before {
48 | content: '\f108';
49 | }
50 | .bi-alt::before {
51 | content: '\f109';
52 | }
53 | .bi-app-indicator::before {
54 | content: '\f10a';
55 | }
56 | .bi-app::before {
57 | content: '\f10b';
58 | }
59 | .bi-archive-fill::before {
60 | content: '\f10c';
61 | }
62 | .bi-archive::before {
63 | content: '\f10d';
64 | }
65 | .bi-arrow-90deg-down::before {
66 | content: '\f10e';
67 | }
68 | .bi-arrow-90deg-left::before {
69 | content: '\f10f';
70 | }
71 | .bi-arrow-90deg-right::before {
72 | content: '\f110';
73 | }
74 | .bi-arrow-90deg-up::before {
75 | content: '\f111';
76 | }
77 | .bi-arrow-bar-down::before {
78 | content: '\f112';
79 | }
80 | .bi-arrow-bar-left::before {
81 | content: '\f113';
82 | }
83 | .bi-arrow-bar-right::before {
84 | content: '\f114';
85 | }
86 | .bi-arrow-bar-up::before {
87 | content: '\f115';
88 | }
89 | .bi-arrow-clockwise::before {
90 | content: '\f116';
91 | }
92 | .bi-arrow-counterclockwise::before {
93 | content: '\f117';
94 | }
95 | .bi-arrow-down-circle-fill::before {
96 | content: '\f118';
97 | }
98 | .bi-arrow-down-circle::before {
99 | content: '\f119';
100 | }
101 | .bi-arrow-down-left-circle-fill::before {
102 | content: '\f11a';
103 | }
104 | .bi-arrow-down-left-circle::before {
105 | content: '\f11b';
106 | }
107 | .bi-arrow-down-left-square-fill::before {
108 | content: '\f11c';
109 | }
110 | .bi-arrow-down-left-square::before {
111 | content: '\f11d';
112 | }
113 | .bi-arrow-down-left::before {
114 | content: '\f11e';
115 | }
116 | .bi-arrow-down-right-circle-fill::before {
117 | content: '\f11f';
118 | }
119 | .bi-arrow-down-right-circle::before {
120 | content: '\f120';
121 | }
122 | .bi-arrow-down-right-square-fill::before {
123 | content: '\f121';
124 | }
125 | .bi-arrow-down-right-square::before {
126 | content: '\f122';
127 | }
128 | .bi-arrow-down-right::before {
129 | content: '\f123';
130 | }
131 | .bi-arrow-down-short::before {
132 | content: '\f124';
133 | }
134 | .bi-arrow-down-square-fill::before {
135 | content: '\f125';
136 | }
137 | .bi-arrow-down-square::before {
138 | content: '\f126';
139 | }
140 | .bi-arrow-down-up::before {
141 | content: '\f127';
142 | }
143 | .bi-arrow-down::before {
144 | content: '\f128';
145 | }
146 | .bi-arrow-left-circle-fill::before {
147 | content: '\f129';
148 | }
149 | .bi-arrow-left-circle::before {
150 | content: '\f12a';
151 | }
152 | .bi-arrow-left-right::before {
153 | content: '\f12b';
154 | }
155 | .bi-arrow-left-short::before {
156 | content: '\f12c';
157 | }
158 | .bi-arrow-left-square-fill::before {
159 | content: '\f12d';
160 | }
161 | .bi-arrow-left-square::before {
162 | content: '\f12e';
163 | }
164 | .bi-arrow-left::before {
165 | content: '\f12f';
166 | }
167 | .bi-arrow-repeat::before {
168 | content: '\f130';
169 | }
170 | .bi-arrow-return-left::before {
171 | content: '\f131';
172 | }
173 | .bi-arrow-return-right::before {
174 | content: '\f132';
175 | }
176 | .bi-arrow-right-circle-fill::before {
177 | content: '\f133';
178 | }
179 | .bi-arrow-right-circle::before {
180 | content: '\f134';
181 | }
182 | .bi-arrow-right-short::before {
183 | content: '\f135';
184 | }
185 | .bi-arrow-right-square-fill::before {
186 | content: '\f136';
187 | }
188 | .bi-arrow-right-square::before {
189 | content: '\f137';
190 | }
191 | .bi-arrow-right::before {
192 | content: '\f138';
193 | }
194 | .bi-arrow-up-circle-fill::before {
195 | content: '\f139';
196 | }
197 | .bi-arrow-up-circle::before {
198 | content: '\f13a';
199 | }
200 | .bi-arrow-up-left-circle-fill::before {
201 | content: '\f13b';
202 | }
203 | .bi-arrow-up-left-circle::before {
204 | content: '\f13c';
205 | }
206 | .bi-arrow-up-left-square-fill::before {
207 | content: '\f13d';
208 | }
209 | .bi-arrow-up-left-square::before {
210 | content: '\f13e';
211 | }
212 | .bi-arrow-up-left::before {
213 | content: '\f13f';
214 | }
215 | .bi-arrow-up-right-circle-fill::before {
216 | content: '\f140';
217 | }
218 | .bi-arrow-up-right-circle::before {
219 | content: '\f141';
220 | }
221 | .bi-arrow-up-right-square-fill::before {
222 | content: '\f142';
223 | }
224 | .bi-arrow-up-right-square::before {
225 | content: '\f143';
226 | }
227 | .bi-arrow-up-right::before {
228 | content: '\f144';
229 | }
230 | .bi-arrow-up-short::before {
231 | content: '\f145';
232 | }
233 | .bi-arrow-up-square-fill::before {
234 | content: '\f146';
235 | }
236 | .bi-arrow-up-square::before {
237 | content: '\f147';
238 | }
239 | .bi-arrow-up::before {
240 | content: '\f148';
241 | }
242 | .bi-arrows-angle-contract::before {
243 | content: '\f149';
244 | }
245 | .bi-arrows-angle-expand::before {
246 | content: '\f14a';
247 | }
248 | .bi-arrows-collapse::before {
249 | content: '\f14b';
250 | }
251 | .bi-arrows-expand::before {
252 | content: '\f14c';
253 | }
254 | .bi-arrows-fullscreen::before {
255 | content: '\f14d';
256 | }
257 | .bi-arrows-move::before {
258 | content: '\f14e';
259 | }
260 | .bi-aspect-ratio-fill::before {
261 | content: '\f14f';
262 | }
263 | .bi-aspect-ratio::before {
264 | content: '\f150';
265 | }
266 | .bi-asterisk::before {
267 | content: '\f151';
268 | }
269 | .bi-at::before {
270 | content: '\f152';
271 | }
272 | .bi-award-fill::before {
273 | content: '\f153';
274 | }
275 | .bi-award::before {
276 | content: '\f154';
277 | }
278 | .bi-back::before {
279 | content: '\f155';
280 | }
281 | .bi-backspace-fill::before {
282 | content: '\f156';
283 | }
284 | .bi-backspace-reverse-fill::before {
285 | content: '\f157';
286 | }
287 | .bi-backspace-reverse::before {
288 | content: '\f158';
289 | }
290 | .bi-backspace::before {
291 | content: '\f159';
292 | }
293 | .bi-badge-3d-fill::before {
294 | content: '\f15a';
295 | }
296 | .bi-badge-3d::before {
297 | content: '\f15b';
298 | }
299 | .bi-badge-4k-fill::before {
300 | content: '\f15c';
301 | }
302 | .bi-badge-4k::before {
303 | content: '\f15d';
304 | }
305 | .bi-badge-8k-fill::before {
306 | content: '\f15e';
307 | }
308 | .bi-badge-8k::before {
309 | content: '\f15f';
310 | }
311 | .bi-badge-ad-fill::before {
312 | content: '\f160';
313 | }
314 | .bi-badge-ad::before {
315 | content: '\f161';
316 | }
317 | .bi-badge-ar-fill::before {
318 | content: '\f162';
319 | }
320 | .bi-badge-ar::before {
321 | content: '\f163';
322 | }
323 | .bi-badge-cc-fill::before {
324 | content: '\f164';
325 | }
326 | .bi-badge-cc::before {
327 | content: '\f165';
328 | }
329 | .bi-badge-hd-fill::before {
330 | content: '\f166';
331 | }
332 | .bi-badge-hd::before {
333 | content: '\f167';
334 | }
335 | .bi-badge-tm-fill::before {
336 | content: '\f168';
337 | }
338 | .bi-badge-tm::before {
339 | content: '\f169';
340 | }
341 | .bi-badge-vo-fill::before {
342 | content: '\f16a';
343 | }
344 | .bi-badge-vo::before {
345 | content: '\f16b';
346 | }
347 | .bi-badge-vr-fill::before {
348 | content: '\f16c';
349 | }
350 | .bi-badge-vr::before {
351 | content: '\f16d';
352 | }
353 | .bi-badge-wc-fill::before {
354 | content: '\f16e';
355 | }
356 | .bi-badge-wc::before {
357 | content: '\f16f';
358 | }
359 | .bi-bag-check-fill::before {
360 | content: '\f170';
361 | }
362 | .bi-bag-check::before {
363 | content: '\f171';
364 | }
365 | .bi-bag-dash-fill::before {
366 | content: '\f172';
367 | }
368 | .bi-bag-dash::before {
369 | content: '\f173';
370 | }
371 | .bi-bag-fill::before {
372 | content: '\f174';
373 | }
374 | .bi-bag-plus-fill::before {
375 | content: '\f175';
376 | }
377 | .bi-bag-plus::before {
378 | content: '\f176';
379 | }
380 | .bi-bag-x-fill::before {
381 | content: '\f177';
382 | }
383 | .bi-bag-x::before {
384 | content: '\f178';
385 | }
386 | .bi-bag::before {
387 | content: '\f179';
388 | }
389 | .bi-bar-chart-fill::before {
390 | content: '\f17a';
391 | }
392 | .bi-bar-chart-line-fill::before {
393 | content: '\f17b';
394 | }
395 | .bi-bar-chart-line::before {
396 | content: '\f17c';
397 | }
398 | .bi-bar-chart-steps::before {
399 | content: '\f17d';
400 | }
401 | .bi-bar-chart::before {
402 | content: '\f17e';
403 | }
404 | .bi-basket-fill::before {
405 | content: '\f17f';
406 | }
407 | .bi-basket::before {
408 | content: '\f180';
409 | }
410 | .bi-basket2-fill::before {
411 | content: '\f181';
412 | }
413 | .bi-basket2::before {
414 | content: '\f182';
415 | }
416 | .bi-basket3-fill::before {
417 | content: '\f183';
418 | }
419 | .bi-basket3::before {
420 | content: '\f184';
421 | }
422 | .bi-battery-charging::before {
423 | content: '\f185';
424 | }
425 | .bi-battery-full::before {
426 | content: '\f186';
427 | }
428 | .bi-battery-half::before {
429 | content: '\f187';
430 | }
431 | .bi-battery::before {
432 | content: '\f188';
433 | }
434 | .bi-bell-fill::before {
435 | content: '\f189';
436 | }
437 | .bi-bell::before {
438 | content: '\f18a';
439 | }
440 | .bi-bezier::before {
441 | content: '\f18b';
442 | }
443 | .bi-bezier2::before {
444 | content: '\f18c';
445 | }
446 | .bi-bicycle::before {
447 | content: '\f18d';
448 | }
449 | .bi-binoculars-fill::before {
450 | content: '\f18e';
451 | }
452 | .bi-binoculars::before {
453 | content: '\f18f';
454 | }
455 | .bi-blockquote-left::before {
456 | content: '\f190';
457 | }
458 | .bi-blockquote-right::before {
459 | content: '\f191';
460 | }
461 | .bi-book-fill::before {
462 | content: '\f192';
463 | }
464 | .bi-book-half::before {
465 | content: '\f193';
466 | }
467 | .bi-book::before {
468 | content: '\f194';
469 | }
470 | .bi-bookmark-check-fill::before {
471 | content: '\f195';
472 | }
473 | .bi-bookmark-check::before {
474 | content: '\f196';
475 | }
476 | .bi-bookmark-dash-fill::before {
477 | content: '\f197';
478 | }
479 | .bi-bookmark-dash::before {
480 | content: '\f198';
481 | }
482 | .bi-bookmark-fill::before {
483 | content: '\f199';
484 | }
485 | .bi-bookmark-heart-fill::before {
486 | content: '\f19a';
487 | }
488 | .bi-bookmark-heart::before {
489 | content: '\f19b';
490 | }
491 | .bi-bookmark-plus-fill::before {
492 | content: '\f19c';
493 | }
494 | .bi-bookmark-plus::before {
495 | content: '\f19d';
496 | }
497 | .bi-bookmark-star-fill::before {
498 | content: '\f19e';
499 | }
500 | .bi-bookmark-star::before {
501 | content: '\f19f';
502 | }
503 | .bi-bookmark-x-fill::before {
504 | content: '\f1a0';
505 | }
506 | .bi-bookmark-x::before {
507 | content: '\f1a1';
508 | }
509 | .bi-bookmark::before {
510 | content: '\f1a2';
511 | }
512 | .bi-bookmarks-fill::before {
513 | content: '\f1a3';
514 | }
515 | .bi-bookmarks::before {
516 | content: '\f1a4';
517 | }
518 | .bi-bookshelf::before {
519 | content: '\f1a5';
520 | }
521 | .bi-bootstrap-fill::before {
522 | content: '\f1a6';
523 | }
524 | .bi-bootstrap-reboot::before {
525 | content: '\f1a7';
526 | }
527 | .bi-bootstrap::before {
528 | content: '\f1a8';
529 | }
530 | .bi-border-all::before {
531 | content: '\f1a9';
532 | }
533 | .bi-border-bottom::before {
534 | content: '\f1aa';
535 | }
536 | .bi-border-center::before {
537 | content: '\f1ab';
538 | }
539 | .bi-border-inner::before {
540 | content: '\f1ac';
541 | }
542 | .bi-border-left::before {
543 | content: '\f1ad';
544 | }
545 | .bi-border-middle::before {
546 | content: '\f1ae';
547 | }
548 | .bi-border-outer::before {
549 | content: '\f1af';
550 | }
551 | .bi-border-right::before {
552 | content: '\f1b0';
553 | }
554 | .bi-border-style::before {
555 | content: '\f1b1';
556 | }
557 | .bi-border-top::before {
558 | content: '\f1b2';
559 | }
560 | .bi-border-width::before {
561 | content: '\f1b3';
562 | }
563 | .bi-border::before {
564 | content: '\f1b4';
565 | }
566 | .bi-bounding-box-circles::before {
567 | content: '\f1b5';
568 | }
569 | .bi-bounding-box::before {
570 | content: '\f1b6';
571 | }
572 | .bi-box-arrow-down-left::before {
573 | content: '\f1b7';
574 | }
575 | .bi-box-arrow-down-right::before {
576 | content: '\f1b8';
577 | }
578 | .bi-box-arrow-down::before {
579 | content: '\f1b9';
580 | }
581 | .bi-box-arrow-in-down-left::before {
582 | content: '\f1ba';
583 | }
584 | .bi-box-arrow-in-down-right::before {
585 | content: '\f1bb';
586 | }
587 | .bi-box-arrow-in-down::before {
588 | content: '\f1bc';
589 | }
590 | .bi-box-arrow-in-left::before {
591 | content: '\f1bd';
592 | }
593 | .bi-box-arrow-in-right::before {
594 | content: '\f1be';
595 | }
596 | .bi-box-arrow-in-up-left::before {
597 | content: '\f1bf';
598 | }
599 | .bi-box-arrow-in-up-right::before {
600 | content: '\f1c0';
601 | }
602 | .bi-box-arrow-in-up::before {
603 | content: '\f1c1';
604 | }
605 | .bi-box-arrow-left::before {
606 | content: '\f1c2';
607 | }
608 | .bi-box-arrow-right::before {
609 | content: '\f1c3';
610 | }
611 | .bi-box-arrow-up-left::before {
612 | content: '\f1c4';
613 | }
614 | .bi-box-arrow-up-right::before {
615 | content: '\f1c5';
616 | }
617 | .bi-box-arrow-up::before {
618 | content: '\f1c6';
619 | }
620 | .bi-box-seam::before {
621 | content: '\f1c7';
622 | }
623 | .bi-box::before {
624 | content: '\f1c8';
625 | }
626 | .bi-braces::before {
627 | content: '\f1c9';
628 | }
629 | .bi-bricks::before {
630 | content: '\f1ca';
631 | }
632 | .bi-briefcase-fill::before {
633 | content: '\f1cb';
634 | }
635 | .bi-briefcase::before {
636 | content: '\f1cc';
637 | }
638 | .bi-brightness-alt-high-fill::before {
639 | content: '\f1cd';
640 | }
641 | .bi-brightness-alt-high::before {
642 | content: '\f1ce';
643 | }
644 | .bi-brightness-alt-low-fill::before {
645 | content: '\f1cf';
646 | }
647 | .bi-brightness-alt-low::before {
648 | content: '\f1d0';
649 | }
650 | .bi-brightness-high-fill::before {
651 | content: '\f1d1';
652 | }
653 | .bi-brightness-high::before {
654 | content: '\f1d2';
655 | }
656 | .bi-brightness-low-fill::before {
657 | content: '\f1d3';
658 | }
659 | .bi-brightness-low::before {
660 | content: '\f1d4';
661 | }
662 | .bi-broadcast-pin::before {
663 | content: '\f1d5';
664 | }
665 | .bi-broadcast::before {
666 | content: '\f1d6';
667 | }
668 | .bi-brush-fill::before {
669 | content: '\f1d7';
670 | }
671 | .bi-brush::before {
672 | content: '\f1d8';
673 | }
674 | .bi-bucket-fill::before {
675 | content: '\f1d9';
676 | }
677 | .bi-bucket::before {
678 | content: '\f1da';
679 | }
680 | .bi-bug-fill::before {
681 | content: '\f1db';
682 | }
683 | .bi-bug::before {
684 | content: '\f1dc';
685 | }
686 | .bi-building::before {
687 | content: '\f1dd';
688 | }
689 | .bi-bullseye::before {
690 | content: '\f1de';
691 | }
692 | .bi-calculator-fill::before {
693 | content: '\f1df';
694 | }
695 | .bi-calculator::before {
696 | content: '\f1e0';
697 | }
698 | .bi-calendar-check-fill::before {
699 | content: '\f1e1';
700 | }
701 | .bi-calendar-check::before {
702 | content: '\f1e2';
703 | }
704 | .bi-calendar-date-fill::before {
705 | content: '\f1e3';
706 | }
707 | .bi-calendar-date::before {
708 | content: '\f1e4';
709 | }
710 | .bi-calendar-day-fill::before {
711 | content: '\f1e5';
712 | }
713 | .bi-calendar-day::before {
714 | content: '\f1e6';
715 | }
716 | .bi-calendar-event-fill::before {
717 | content: '\f1e7';
718 | }
719 | .bi-calendar-event::before {
720 | content: '\f1e8';
721 | }
722 | .bi-calendar-fill::before {
723 | content: '\f1e9';
724 | }
725 | .bi-calendar-minus-fill::before {
726 | content: '\f1ea';
727 | }
728 | .bi-calendar-minus::before {
729 | content: '\f1eb';
730 | }
731 | .bi-calendar-month-fill::before {
732 | content: '\f1ec';
733 | }
734 | .bi-calendar-month::before {
735 | content: '\f1ed';
736 | }
737 | .bi-calendar-plus-fill::before {
738 | content: '\f1ee';
739 | }
740 | .bi-calendar-plus::before {
741 | content: '\f1ef';
742 | }
743 | .bi-calendar-range-fill::before {
744 | content: '\f1f0';
745 | }
746 | .bi-calendar-range::before {
747 | content: '\f1f1';
748 | }
749 | .bi-calendar-week-fill::before {
750 | content: '\f1f2';
751 | }
752 | .bi-calendar-week::before {
753 | content: '\f1f3';
754 | }
755 | .bi-calendar-x-fill::before {
756 | content: '\f1f4';
757 | }
758 | .bi-calendar-x::before {
759 | content: '\f1f5';
760 | }
761 | .bi-calendar::before {
762 | content: '\f1f6';
763 | }
764 | .bi-calendar2-check-fill::before {
765 | content: '\f1f7';
766 | }
767 | .bi-calendar2-check::before {
768 | content: '\f1f8';
769 | }
770 | .bi-calendar2-date-fill::before {
771 | content: '\f1f9';
772 | }
773 | .bi-calendar2-date::before {
774 | content: '\f1fa';
775 | }
776 | .bi-calendar2-day-fill::before {
777 | content: '\f1fb';
778 | }
779 | .bi-calendar2-day::before {
780 | content: '\f1fc';
781 | }
782 | .bi-calendar2-event-fill::before {
783 | content: '\f1fd';
784 | }
785 | .bi-calendar2-event::before {
786 | content: '\f1fe';
787 | }
788 | .bi-calendar2-fill::before {
789 | content: '\f1ff';
790 | }
791 | .bi-calendar2-minus-fill::before {
792 | content: '\f200';
793 | }
794 | .bi-calendar2-minus::before {
795 | content: '\f201';
796 | }
797 | .bi-calendar2-month-fill::before {
798 | content: '\f202';
799 | }
800 | .bi-calendar2-month::before {
801 | content: '\f203';
802 | }
803 | .bi-calendar2-plus-fill::before {
804 | content: '\f204';
805 | }
806 | .bi-calendar2-plus::before {
807 | content: '\f205';
808 | }
809 | .bi-calendar2-range-fill::before {
810 | content: '\f206';
811 | }
812 | .bi-calendar2-range::before {
813 | content: '\f207';
814 | }
815 | .bi-calendar2-week-fill::before {
816 | content: '\f208';
817 | }
818 | .bi-calendar2-week::before {
819 | content: '\f209';
820 | }
821 | .bi-calendar2-x-fill::before {
822 | content: '\f20a';
823 | }
824 | .bi-calendar2-x::before {
825 | content: '\f20b';
826 | }
827 | .bi-calendar2::before {
828 | content: '\f20c';
829 | }
830 | .bi-calendar3-event-fill::before {
831 | content: '\f20d';
832 | }
833 | .bi-calendar3-event::before {
834 | content: '\f20e';
835 | }
836 | .bi-calendar3-fill::before {
837 | content: '\f20f';
838 | }
839 | .bi-calendar3-range-fill::before {
840 | content: '\f210';
841 | }
842 | .bi-calendar3-range::before {
843 | content: '\f211';
844 | }
845 | .bi-calendar3-week-fill::before {
846 | content: '\f212';
847 | }
848 | .bi-calendar3-week::before {
849 | content: '\f213';
850 | }
851 | .bi-calendar3::before {
852 | content: '\f214';
853 | }
854 | .bi-calendar4-event::before {
855 | content: '\f215';
856 | }
857 | .bi-calendar4-range::before {
858 | content: '\f216';
859 | }
860 | .bi-calendar4-week::before {
861 | content: '\f217';
862 | }
863 | .bi-calendar4::before {
864 | content: '\f218';
865 | }
866 | .bi-camera-fill::before {
867 | content: '\f219';
868 | }
869 | .bi-camera-reels-fill::before {
870 | content: '\f21a';
871 | }
872 | .bi-camera-reels::before {
873 | content: '\f21b';
874 | }
875 | .bi-camera-video-fill::before {
876 | content: '\f21c';
877 | }
878 | .bi-camera-video-off-fill::before {
879 | content: '\f21d';
880 | }
881 | .bi-camera-video-off::before {
882 | content: '\f21e';
883 | }
884 | .bi-camera-video::before {
885 | content: '\f21f';
886 | }
887 | .bi-camera::before {
888 | content: '\f220';
889 | }
890 | .bi-camera2::before {
891 | content: '\f221';
892 | }
893 | .bi-capslock-fill::before {
894 | content: '\f222';
895 | }
896 | .bi-capslock::before {
897 | content: '\f223';
898 | }
899 | .bi-card-checklist::before {
900 | content: '\f224';
901 | }
902 | .bi-card-heading::before {
903 | content: '\f225';
904 | }
905 | .bi-card-image::before {
906 | content: '\f226';
907 | }
908 | .bi-card-list::before {
909 | content: '\f227';
910 | }
911 | .bi-card-text::before {
912 | content: '\f228';
913 | }
914 | .bi-caret-down-fill::before {
915 | content: '\f229';
916 | }
917 | .bi-caret-down-square-fill::before {
918 | content: '\f22a';
919 | }
920 | .bi-caret-down-square::before {
921 | content: '\f22b';
922 | }
923 | .bi-caret-down::before {
924 | content: '\f22c';
925 | }
926 | .bi-caret-left-fill::before {
927 | content: '\f22d';
928 | }
929 | .bi-caret-left-square-fill::before {
930 | content: '\f22e';
931 | }
932 | .bi-caret-left-square::before {
933 | content: '\f22f';
934 | }
935 | .bi-caret-left::before {
936 | content: '\f230';
937 | }
938 | .bi-caret-right-fill::before {
939 | content: '\f231';
940 | }
941 | .bi-caret-right-square-fill::before {
942 | content: '\f232';
943 | }
944 | .bi-caret-right-square::before {
945 | content: '\f233';
946 | }
947 | .bi-caret-right::before {
948 | content: '\f234';
949 | }
950 | .bi-caret-up-fill::before {
951 | content: '\f235';
952 | }
953 | .bi-caret-up-square-fill::before {
954 | content: '\f236';
955 | }
956 | .bi-caret-up-square::before {
957 | content: '\f237';
958 | }
959 | .bi-caret-up::before {
960 | content: '\f238';
961 | }
962 | .bi-cart-check-fill::before {
963 | content: '\f239';
964 | }
965 | .bi-cart-check::before {
966 | content: '\f23a';
967 | }
968 | .bi-cart-dash-fill::before {
969 | content: '\f23b';
970 | }
971 | .bi-cart-dash::before {
972 | content: '\f23c';
973 | }
974 | .bi-cart-fill::before {
975 | content: '\f23d';
976 | }
977 | .bi-cart-plus-fill::before {
978 | content: '\f23e';
979 | }
980 | .bi-cart-plus::before {
981 | content: '\f23f';
982 | }
983 | .bi-cart-x-fill::before {
984 | content: '\f240';
985 | }
986 | .bi-cart-x::before {
987 | content: '\f241';
988 | }
989 | .bi-cart::before {
990 | content: '\f242';
991 | }
992 | .bi-cart2::before {
993 | content: '\f243';
994 | }
995 | .bi-cart3::before {
996 | content: '\f244';
997 | }
998 | .bi-cart4::before {
999 | content: '\f245';
1000 | }
1001 | .bi-cash-stack::before {
1002 | content: '\f246';
1003 | }
1004 | .bi-cash::before {
1005 | content: '\f247';
1006 | }
1007 | .bi-cast::before {
1008 | content: '\f248';
1009 | }
1010 | .bi-chat-dots-fill::before {
1011 | content: '\f249';
1012 | }
1013 | .bi-chat-dots::before {
1014 | content: '\f24a';
1015 | }
1016 | .bi-chat-fill::before {
1017 | content: '\f24b';
1018 | }
1019 | .bi-chat-left-dots-fill::before {
1020 | content: '\f24c';
1021 | }
1022 | .bi-chat-left-dots::before {
1023 | content: '\f24d';
1024 | }
1025 | .bi-chat-left-fill::before {
1026 | content: '\f24e';
1027 | }
1028 | .bi-chat-left-quote-fill::before {
1029 | content: '\f24f';
1030 | }
1031 | .bi-chat-left-quote::before {
1032 | content: '\f250';
1033 | }
1034 | .bi-chat-left-text-fill::before {
1035 | content: '\f251';
1036 | }
1037 | .bi-chat-left-text::before {
1038 | content: '\f252';
1039 | }
1040 | .bi-chat-left::before {
1041 | content: '\f253';
1042 | }
1043 | .bi-chat-quote-fill::before {
1044 | content: '\f254';
1045 | }
1046 | .bi-chat-quote::before {
1047 | content: '\f255';
1048 | }
1049 | .bi-chat-right-dots-fill::before {
1050 | content: '\f256';
1051 | }
1052 | .bi-chat-right-dots::before {
1053 | content: '\f257';
1054 | }
1055 | .bi-chat-right-fill::before {
1056 | content: '\f258';
1057 | }
1058 | .bi-chat-right-quote-fill::before {
1059 | content: '\f259';
1060 | }
1061 | .bi-chat-right-quote::before {
1062 | content: '\f25a';
1063 | }
1064 | .bi-chat-right-text-fill::before {
1065 | content: '\f25b';
1066 | }
1067 | .bi-chat-right-text::before {
1068 | content: '\f25c';
1069 | }
1070 | .bi-chat-right::before {
1071 | content: '\f25d';
1072 | }
1073 | .bi-chat-square-dots-fill::before {
1074 | content: '\f25e';
1075 | }
1076 | .bi-chat-square-dots::before {
1077 | content: '\f25f';
1078 | }
1079 | .bi-chat-square-fill::before {
1080 | content: '\f260';
1081 | }
1082 | .bi-chat-square-quote-fill::before {
1083 | content: '\f261';
1084 | }
1085 | .bi-chat-square-quote::before {
1086 | content: '\f262';
1087 | }
1088 | .bi-chat-square-text-fill::before {
1089 | content: '\f263';
1090 | }
1091 | .bi-chat-square-text::before {
1092 | content: '\f264';
1093 | }
1094 | .bi-chat-square::before {
1095 | content: '\f265';
1096 | }
1097 | .bi-chat-text-fill::before {
1098 | content: '\f266';
1099 | }
1100 | .bi-chat-text::before {
1101 | content: '\f267';
1102 | }
1103 | .bi-chat::before {
1104 | content: '\f268';
1105 | }
1106 | .bi-check-all::before {
1107 | content: '\f269';
1108 | }
1109 | .bi-check-circle-fill::before {
1110 | content: '\f26a';
1111 | }
1112 | .bi-check-circle::before {
1113 | content: '\f26b';
1114 | }
1115 | .bi-check-square-fill::before {
1116 | content: '\f26c';
1117 | }
1118 | .bi-check-square::before {
1119 | content: '\f26d';
1120 | }
1121 | .bi-check::before {
1122 | content: '\f26e';
1123 | }
1124 | .bi-check2-all::before {
1125 | content: '\f26f';
1126 | }
1127 | .bi-check2-circle::before {
1128 | content: '\f270';
1129 | }
1130 | .bi-check2-square::before {
1131 | content: '\f271';
1132 | }
1133 | .bi-check2::before {
1134 | content: '\f272';
1135 | }
1136 | .bi-chevron-bar-contract::before {
1137 | content: '\f273';
1138 | }
1139 | .bi-chevron-bar-down::before {
1140 | content: '\f274';
1141 | }
1142 | .bi-chevron-bar-expand::before {
1143 | content: '\f275';
1144 | }
1145 | .bi-chevron-bar-left::before {
1146 | content: '\f276';
1147 | }
1148 | .bi-chevron-bar-right::before {
1149 | content: '\f277';
1150 | }
1151 | .bi-chevron-bar-up::before {
1152 | content: '\f278';
1153 | }
1154 | .bi-chevron-compact-down::before {
1155 | content: '\f279';
1156 | }
1157 | .bi-chevron-compact-left::before {
1158 | content: '\f27a';
1159 | }
1160 | .bi-chevron-compact-right::before {
1161 | content: '\f27b';
1162 | }
1163 | .bi-chevron-compact-up::before {
1164 | content: '\f27c';
1165 | }
1166 | .bi-chevron-contract::before {
1167 | content: '\f27d';
1168 | }
1169 | .bi-chevron-double-down::before {
1170 | content: '\f27e';
1171 | }
1172 | .bi-chevron-double-left::before {
1173 | content: '\f27f';
1174 | }
1175 | .bi-chevron-double-right::before {
1176 | content: '\f280';
1177 | }
1178 | .bi-chevron-double-up::before {
1179 | content: '\f281';
1180 | }
1181 | .bi-chevron-down::before {
1182 | content: '\f282';
1183 | }
1184 | .bi-chevron-expand::before {
1185 | content: '\f283';
1186 | }
1187 | .bi-chevron-left::before {
1188 | content: '\f284';
1189 | }
1190 | .bi-chevron-right::before {
1191 | content: '\f285';
1192 | }
1193 | .bi-chevron-up::before {
1194 | content: '\f286';
1195 | }
1196 | .bi-circle-fill::before {
1197 | content: '\f287';
1198 | }
1199 | .bi-circle-half::before {
1200 | content: '\f288';
1201 | }
1202 | .bi-circle-square::before {
1203 | content: '\f289';
1204 | }
1205 | .bi-circle::before {
1206 | content: '\f28a';
1207 | }
1208 | .bi-clipboard-check::before {
1209 | content: '\f28b';
1210 | }
1211 | .bi-clipboard-data::before {
1212 | content: '\f28c';
1213 | }
1214 | .bi-clipboard-minus::before {
1215 | content: '\f28d';
1216 | }
1217 | .bi-clipboard-plus::before {
1218 | content: '\f28e';
1219 | }
1220 | .bi-clipboard-x::before {
1221 | content: '\f28f';
1222 | }
1223 | .bi-clipboard::before {
1224 | content: '\f290';
1225 | }
1226 | .bi-clock-fill::before {
1227 | content: '\f291';
1228 | }
1229 | .bi-clock-history::before {
1230 | content: '\f292';
1231 | }
1232 | .bi-clock::before {
1233 | content: '\f293';
1234 | }
1235 | .bi-cloud-arrow-down-fill::before {
1236 | content: '\f294';
1237 | }
1238 | .bi-cloud-arrow-down::before {
1239 | content: '\f295';
1240 | }
1241 | .bi-cloud-arrow-up-fill::before {
1242 | content: '\f296';
1243 | }
1244 | .bi-cloud-arrow-up::before {
1245 | content: '\f297';
1246 | }
1247 | .bi-cloud-check-fill::before {
1248 | content: '\f298';
1249 | }
1250 | .bi-cloud-check::before {
1251 | content: '\f299';
1252 | }
1253 | .bi-cloud-download-fill::before {
1254 | content: '\f29a';
1255 | }
1256 | .bi-cloud-download::before {
1257 | content: '\f29b';
1258 | }
1259 | .bi-cloud-drizzle-fill::before {
1260 | content: '\f29c';
1261 | }
1262 | .bi-cloud-drizzle::before {
1263 | content: '\f29d';
1264 | }
1265 | .bi-cloud-fill::before {
1266 | content: '\f29e';
1267 | }
1268 | .bi-cloud-fog-fill::before {
1269 | content: '\f29f';
1270 | }
1271 | .bi-cloud-fog::before {
1272 | content: '\f2a0';
1273 | }
1274 | .bi-cloud-fog2-fill::before {
1275 | content: '\f2a1';
1276 | }
1277 | .bi-cloud-fog2::before {
1278 | content: '\f2a2';
1279 | }
1280 | .bi-cloud-hail-fill::before {
1281 | content: '\f2a3';
1282 | }
1283 | .bi-cloud-hail::before {
1284 | content: '\f2a4';
1285 | }
1286 | .bi-cloud-haze-1::before {
1287 | content: '\f2a5';
1288 | }
1289 | .bi-cloud-haze-fill::before {
1290 | content: '\f2a6';
1291 | }
1292 | .bi-cloud-haze::before {
1293 | content: '\f2a7';
1294 | }
1295 | .bi-cloud-haze2-fill::before {
1296 | content: '\f2a8';
1297 | }
1298 | .bi-cloud-lightning-fill::before {
1299 | content: '\f2a9';
1300 | }
1301 | .bi-cloud-lightning-rain-fill::before {
1302 | content: '\f2aa';
1303 | }
1304 | .bi-cloud-lightning-rain::before {
1305 | content: '\f2ab';
1306 | }
1307 | .bi-cloud-lightning::before {
1308 | content: '\f2ac';
1309 | }
1310 | .bi-cloud-minus-fill::before {
1311 | content: '\f2ad';
1312 | }
1313 | .bi-cloud-minus::before {
1314 | content: '\f2ae';
1315 | }
1316 | .bi-cloud-moon-fill::before {
1317 | content: '\f2af';
1318 | }
1319 | .bi-cloud-moon::before {
1320 | content: '\f2b0';
1321 | }
1322 | .bi-cloud-plus-fill::before {
1323 | content: '\f2b1';
1324 | }
1325 | .bi-cloud-plus::before {
1326 | content: '\f2b2';
1327 | }
1328 | .bi-cloud-rain-fill::before {
1329 | content: '\f2b3';
1330 | }
1331 | .bi-cloud-rain-heavy-fill::before {
1332 | content: '\f2b4';
1333 | }
1334 | .bi-cloud-rain-heavy::before {
1335 | content: '\f2b5';
1336 | }
1337 | .bi-cloud-rain::before {
1338 | content: '\f2b6';
1339 | }
1340 | .bi-cloud-slash-fill::before {
1341 | content: '\f2b7';
1342 | }
1343 | .bi-cloud-slash::before {
1344 | content: '\f2b8';
1345 | }
1346 | .bi-cloud-sleet-fill::before {
1347 | content: '\f2b9';
1348 | }
1349 | .bi-cloud-sleet::before {
1350 | content: '\f2ba';
1351 | }
1352 | .bi-cloud-snow-fill::before {
1353 | content: '\f2bb';
1354 | }
1355 | .bi-cloud-snow::before {
1356 | content: '\f2bc';
1357 | }
1358 | .bi-cloud-sun-fill::before {
1359 | content: '\f2bd';
1360 | }
1361 | .bi-cloud-sun::before {
1362 | content: '\f2be';
1363 | }
1364 | .bi-cloud-upload-fill::before {
1365 | content: '\f2bf';
1366 | }
1367 | .bi-cloud-upload::before {
1368 | content: '\f2c0';
1369 | }
1370 | .bi-cloud::before {
1371 | content: '\f2c1';
1372 | }
1373 | .bi-clouds-fill::before {
1374 | content: '\f2c2';
1375 | }
1376 | .bi-clouds::before {
1377 | content: '\f2c3';
1378 | }
1379 | .bi-cloudy-fill::before {
1380 | content: '\f2c4';
1381 | }
1382 | .bi-cloudy::before {
1383 | content: '\f2c5';
1384 | }
1385 | .bi-code-slash::before {
1386 | content: '\f2c6';
1387 | }
1388 | .bi-code-square::before {
1389 | content: '\f2c7';
1390 | }
1391 | .bi-code::before {
1392 | content: '\f2c8';
1393 | }
1394 | .bi-collection-fill::before {
1395 | content: '\f2c9';
1396 | }
1397 | .bi-collection-play-fill::before {
1398 | content: '\f2ca';
1399 | }
1400 | .bi-collection-play::before {
1401 | content: '\f2cb';
1402 | }
1403 | .bi-collection::before {
1404 | content: '\f2cc';
1405 | }
1406 | .bi-columns-gap::before {
1407 | content: '\f2cd';
1408 | }
1409 | .bi-columns::before {
1410 | content: '\f2ce';
1411 | }
1412 | .bi-command::before {
1413 | content: '\f2cf';
1414 | }
1415 | .bi-compass-fill::before {
1416 | content: '\f2d0';
1417 | }
1418 | .bi-compass::before {
1419 | content: '\f2d1';
1420 | }
1421 | .bi-cone-striped::before {
1422 | content: '\f2d2';
1423 | }
1424 | .bi-cone::before {
1425 | content: '\f2d3';
1426 | }
1427 | .bi-controller::before {
1428 | content: '\f2d4';
1429 | }
1430 | .bi-cpu-fill::before {
1431 | content: '\f2d5';
1432 | }
1433 | .bi-cpu::before {
1434 | content: '\f2d6';
1435 | }
1436 | .bi-credit-card-2-back-fill::before {
1437 | content: '\f2d7';
1438 | }
1439 | .bi-credit-card-2-back::before {
1440 | content: '\f2d8';
1441 | }
1442 | .bi-credit-card-2-front-fill::before {
1443 | content: '\f2d9';
1444 | }
1445 | .bi-credit-card-2-front::before {
1446 | content: '\f2da';
1447 | }
1448 | .bi-credit-card-fill::before {
1449 | content: '\f2db';
1450 | }
1451 | .bi-credit-card::before {
1452 | content: '\f2dc';
1453 | }
1454 | .bi-crop::before {
1455 | content: '\f2dd';
1456 | }
1457 | .bi-cup-fill::before {
1458 | content: '\f2de';
1459 | }
1460 | .bi-cup-straw::before {
1461 | content: '\f2df';
1462 | }
1463 | .bi-cup::before {
1464 | content: '\f2e0';
1465 | }
1466 | .bi-cursor-fill::before {
1467 | content: '\f2e1';
1468 | }
1469 | .bi-cursor-text::before {
1470 | content: '\f2e2';
1471 | }
1472 | .bi-cursor::before {
1473 | content: '\f2e3';
1474 | }
1475 | .bi-dash-circle-dotted::before {
1476 | content: '\f2e4';
1477 | }
1478 | .bi-dash-circle-fill::before {
1479 | content: '\f2e5';
1480 | }
1481 | .bi-dash-circle::before {
1482 | content: '\f2e6';
1483 | }
1484 | .bi-dash-square-dotted::before {
1485 | content: '\f2e7';
1486 | }
1487 | .bi-dash-square-fill::before {
1488 | content: '\f2e8';
1489 | }
1490 | .bi-dash-square::before {
1491 | content: '\f2e9';
1492 | }
1493 | .bi-dash::before {
1494 | content: '\f2ea';
1495 | }
1496 | .bi-diagram-2-fill::before {
1497 | content: '\f2eb';
1498 | }
1499 | .bi-diagram-2::before {
1500 | content: '\f2ec';
1501 | }
1502 | .bi-diagram-3-fill::before {
1503 | content: '\f2ed';
1504 | }
1505 | .bi-diagram-3::before {
1506 | content: '\f2ee';
1507 | }
1508 | .bi-diamond-fill::before {
1509 | content: '\f2ef';
1510 | }
1511 | .bi-diamond-half::before {
1512 | content: '\f2f0';
1513 | }
1514 | .bi-diamond::before {
1515 | content: '\f2f1';
1516 | }
1517 | .bi-dice-1-fill::before {
1518 | content: '\f2f2';
1519 | }
1520 | .bi-dice-1::before {
1521 | content: '\f2f3';
1522 | }
1523 | .bi-dice-2-fill::before {
1524 | content: '\f2f4';
1525 | }
1526 | .bi-dice-2::before {
1527 | content: '\f2f5';
1528 | }
1529 | .bi-dice-3-fill::before {
1530 | content: '\f2f6';
1531 | }
1532 | .bi-dice-3::before {
1533 | content: '\f2f7';
1534 | }
1535 | .bi-dice-4-fill::before {
1536 | content: '\f2f8';
1537 | }
1538 | .bi-dice-4::before {
1539 | content: '\f2f9';
1540 | }
1541 | .bi-dice-5-fill::before {
1542 | content: '\f2fa';
1543 | }
1544 | .bi-dice-5::before {
1545 | content: '\f2fb';
1546 | }
1547 | .bi-dice-6-fill::before {
1548 | content: '\f2fc';
1549 | }
1550 | .bi-dice-6::before {
1551 | content: '\f2fd';
1552 | }
1553 | .bi-disc-fill::before {
1554 | content: '\f2fe';
1555 | }
1556 | .bi-disc::before {
1557 | content: '\f2ff';
1558 | }
1559 | .bi-discord::before {
1560 | content: '\f300';
1561 | }
1562 | .bi-display-fill::before {
1563 | content: '\f301';
1564 | }
1565 | .bi-display::before {
1566 | content: '\f302';
1567 | }
1568 | .bi-distribute-horizontal::before {
1569 | content: '\f303';
1570 | }
1571 | .bi-distribute-vertical::before {
1572 | content: '\f304';
1573 | }
1574 | .bi-door-closed-fill::before {
1575 | content: '\f305';
1576 | }
1577 | .bi-door-closed::before {
1578 | content: '\f306';
1579 | }
1580 | .bi-door-open-fill::before {
1581 | content: '\f307';
1582 | }
1583 | .bi-door-open::before {
1584 | content: '\f308';
1585 | }
1586 | .bi-dot::before {
1587 | content: '\f309';
1588 | }
1589 | .bi-download::before {
1590 | content: '\f30a';
1591 | }
1592 | .bi-droplet-fill::before {
1593 | content: '\f30b';
1594 | }
1595 | .bi-droplet-half::before {
1596 | content: '\f30c';
1597 | }
1598 | .bi-droplet::before {
1599 | content: '\f30d';
1600 | }
1601 | .bi-earbuds::before {
1602 | content: '\f30e';
1603 | }
1604 | .bi-easel-fill::before {
1605 | content: '\f30f';
1606 | }
1607 | .bi-easel::before {
1608 | content: '\f310';
1609 | }
1610 | .bi-egg-fill::before {
1611 | content: '\f311';
1612 | }
1613 | .bi-egg-fried::before {
1614 | content: '\f312';
1615 | }
1616 | .bi-egg::before {
1617 | content: '\f313';
1618 | }
1619 | .bi-eject-fill::before {
1620 | content: '\f314';
1621 | }
1622 | .bi-eject::before {
1623 | content: '\f315';
1624 | }
1625 | .bi-emoji-angry-fill::before {
1626 | content: '\f316';
1627 | }
1628 | .bi-emoji-angry::before {
1629 | content: '\f317';
1630 | }
1631 | .bi-emoji-dizzy-fill::before {
1632 | content: '\f318';
1633 | }
1634 | .bi-emoji-dizzy::before {
1635 | content: '\f319';
1636 | }
1637 | .bi-emoji-expressionless-fill::before {
1638 | content: '\f31a';
1639 | }
1640 | .bi-emoji-expressionless::before {
1641 | content: '\f31b';
1642 | }
1643 | .bi-emoji-frown-fill::before {
1644 | content: '\f31c';
1645 | }
1646 | .bi-emoji-frown::before {
1647 | content: '\f31d';
1648 | }
1649 | .bi-emoji-heart-eyes-fill::before {
1650 | content: '\f31e';
1651 | }
1652 | .bi-emoji-heart-eyes::before {
1653 | content: '\f31f';
1654 | }
1655 | .bi-emoji-laughing-fill::before {
1656 | content: '\f320';
1657 | }
1658 | .bi-emoji-laughing::before {
1659 | content: '\f321';
1660 | }
1661 | .bi-emoji-neutral-fill::before {
1662 | content: '\f322';
1663 | }
1664 | .bi-emoji-neutral::before {
1665 | content: '\f323';
1666 | }
1667 | .bi-emoji-smile-fill::before {
1668 | content: '\f324';
1669 | }
1670 | .bi-emoji-smile-upside-down-fill::before {
1671 | content: '\f325';
1672 | }
1673 | .bi-emoji-smile-upside-down::before {
1674 | content: '\f326';
1675 | }
1676 | .bi-emoji-smile::before {
1677 | content: '\f327';
1678 | }
1679 | .bi-emoji-sunglasses-fill::before {
1680 | content: '\f328';
1681 | }
1682 | .bi-emoji-sunglasses::before {
1683 | content: '\f329';
1684 | }
1685 | .bi-emoji-wink-fill::before {
1686 | content: '\f32a';
1687 | }
1688 | .bi-emoji-wink::before {
1689 | content: '\f32b';
1690 | }
1691 | .bi-envelope-fill::before {
1692 | content: '\f32c';
1693 | }
1694 | .bi-envelope-open-fill::before {
1695 | content: '\f32d';
1696 | }
1697 | .bi-envelope-open::before {
1698 | content: '\f32e';
1699 | }
1700 | .bi-envelope::before {
1701 | content: '\f32f';
1702 | }
1703 | .bi-eraser-fill::before {
1704 | content: '\f330';
1705 | }
1706 | .bi-eraser::before {
1707 | content: '\f331';
1708 | }
1709 | .bi-exclamation-circle-fill::before {
1710 | content: '\f332';
1711 | }
1712 | .bi-exclamation-circle::before {
1713 | content: '\f333';
1714 | }
1715 | .bi-exclamation-diamond-fill::before {
1716 | content: '\f334';
1717 | }
1718 | .bi-exclamation-diamond::before {
1719 | content: '\f335';
1720 | }
1721 | .bi-exclamation-octagon-fill::before {
1722 | content: '\f336';
1723 | }
1724 | .bi-exclamation-octagon::before {
1725 | content: '\f337';
1726 | }
1727 | .bi-exclamation-square-fill::before {
1728 | content: '\f338';
1729 | }
1730 | .bi-exclamation-square::before {
1731 | content: '\f339';
1732 | }
1733 | .bi-exclamation-triangle-fill::before {
1734 | content: '\f33a';
1735 | }
1736 | .bi-exclamation-triangle::before {
1737 | content: '\f33b';
1738 | }
1739 | .bi-exclamation::before {
1740 | content: '\f33c';
1741 | }
1742 | .bi-exclude::before {
1743 | content: '\f33d';
1744 | }
1745 | .bi-eye-fill::before {
1746 | content: '\f33e';
1747 | }
1748 | .bi-eye-slash-fill::before {
1749 | content: '\f33f';
1750 | }
1751 | .bi-eye-slash::before {
1752 | content: '\f340';
1753 | }
1754 | .bi-eye::before {
1755 | content: '\f341';
1756 | }
1757 | .bi-eyedropper::before {
1758 | content: '\f342';
1759 | }
1760 | .bi-eyeglasses::before {
1761 | content: '\f343';
1762 | }
1763 | .bi-facebook::before {
1764 | content: '\f344';
1765 | }
1766 | .bi-file-arrow-down-fill::before {
1767 | content: '\f345';
1768 | }
1769 | .bi-file-arrow-down::before {
1770 | content: '\f346';
1771 | }
1772 | .bi-file-arrow-up-fill::before {
1773 | content: '\f347';
1774 | }
1775 | .bi-file-arrow-up::before {
1776 | content: '\f348';
1777 | }
1778 | .bi-file-bar-graph-fill::before {
1779 | content: '\f349';
1780 | }
1781 | .bi-file-bar-graph::before {
1782 | content: '\f34a';
1783 | }
1784 | .bi-file-binary-fill::before {
1785 | content: '\f34b';
1786 | }
1787 | .bi-file-binary::before {
1788 | content: '\f34c';
1789 | }
1790 | .bi-file-break-fill::before {
1791 | content: '\f34d';
1792 | }
1793 | .bi-file-break::before {
1794 | content: '\f34e';
1795 | }
1796 | .bi-file-check-fill::before {
1797 | content: '\f34f';
1798 | }
1799 | .bi-file-check::before {
1800 | content: '\f350';
1801 | }
1802 | .bi-file-code-fill::before {
1803 | content: '\f351';
1804 | }
1805 | .bi-file-code::before {
1806 | content: '\f352';
1807 | }
1808 | .bi-file-diff-fill::before {
1809 | content: '\f353';
1810 | }
1811 | .bi-file-diff::before {
1812 | content: '\f354';
1813 | }
1814 | .bi-file-earmark-arrow-down-fill::before {
1815 | content: '\f355';
1816 | }
1817 | .bi-file-earmark-arrow-down::before {
1818 | content: '\f356';
1819 | }
1820 | .bi-file-earmark-arrow-up-fill::before {
1821 | content: '\f357';
1822 | }
1823 | .bi-file-earmark-arrow-up::before {
1824 | content: '\f358';
1825 | }
1826 | .bi-file-earmark-bar-graph-fill::before {
1827 | content: '\f359';
1828 | }
1829 | .bi-file-earmark-bar-graph::before {
1830 | content: '\f35a';
1831 | }
1832 | .bi-file-earmark-binary-fill::before {
1833 | content: '\f35b';
1834 | }
1835 | .bi-file-earmark-binary::before {
1836 | content: '\f35c';
1837 | }
1838 | .bi-file-earmark-break-fill::before {
1839 | content: '\f35d';
1840 | }
1841 | .bi-file-earmark-break::before {
1842 | content: '\f35e';
1843 | }
1844 | .bi-file-earmark-check-fill::before {
1845 | content: '\f35f';
1846 | }
1847 | .bi-file-earmark-check::before {
1848 | content: '\f360';
1849 | }
1850 | .bi-file-earmark-code-fill::before {
1851 | content: '\f361';
1852 | }
1853 | .bi-file-earmark-code::before {
1854 | content: '\f362';
1855 | }
1856 | .bi-file-earmark-diff-fill::before {
1857 | content: '\f363';
1858 | }
1859 | .bi-file-earmark-diff::before {
1860 | content: '\f364';
1861 | }
1862 | .bi-file-earmark-easel-fill::before {
1863 | content: '\f365';
1864 | }
1865 | .bi-file-earmark-easel::before {
1866 | content: '\f366';
1867 | }
1868 | .bi-file-earmark-excel-fill::before {
1869 | content: '\f367';
1870 | }
1871 | .bi-file-earmark-excel::before {
1872 | content: '\f368';
1873 | }
1874 | .bi-file-earmark-fill::before {
1875 | content: '\f369';
1876 | }
1877 | .bi-file-earmark-font-fill::before {
1878 | content: '\f36a';
1879 | }
1880 | .bi-file-earmark-font::before {
1881 | content: '\f36b';
1882 | }
1883 | .bi-file-earmark-image-fill::before {
1884 | content: '\f36c';
1885 | }
1886 | .bi-file-earmark-image::before {
1887 | content: '\f36d';
1888 | }
1889 | .bi-file-earmark-lock-fill::before {
1890 | content: '\f36e';
1891 | }
1892 | .bi-file-earmark-lock::before {
1893 | content: '\f36f';
1894 | }
1895 | .bi-file-earmark-lock2-fill::before {
1896 | content: '\f370';
1897 | }
1898 | .bi-file-earmark-lock2::before {
1899 | content: '\f371';
1900 | }
1901 | .bi-file-earmark-medical-fill::before {
1902 | content: '\f372';
1903 | }
1904 | .bi-file-earmark-medical::before {
1905 | content: '\f373';
1906 | }
1907 | .bi-file-earmark-minus-fill::before {
1908 | content: '\f374';
1909 | }
1910 | .bi-file-earmark-minus::before {
1911 | content: '\f375';
1912 | }
1913 | .bi-file-earmark-music-fill::before {
1914 | content: '\f376';
1915 | }
1916 | .bi-file-earmark-music::before {
1917 | content: '\f377';
1918 | }
1919 | .bi-file-earmark-person-fill::before {
1920 | content: '\f378';
1921 | }
1922 | .bi-file-earmark-person::before {
1923 | content: '\f379';
1924 | }
1925 | .bi-file-earmark-play-fill::before {
1926 | content: '\f37a';
1927 | }
1928 | .bi-file-earmark-play::before {
1929 | content: '\f37b';
1930 | }
1931 | .bi-file-earmark-plus-fill::before {
1932 | content: '\f37c';
1933 | }
1934 | .bi-file-earmark-plus::before {
1935 | content: '\f37d';
1936 | }
1937 | .bi-file-earmark-post-fill::before {
1938 | content: '\f37e';
1939 | }
1940 | .bi-file-earmark-post::before {
1941 | content: '\f37f';
1942 | }
1943 | .bi-file-earmark-ppt-fill::before {
1944 | content: '\f380';
1945 | }
1946 | .bi-file-earmark-ppt::before {
1947 | content: '\f381';
1948 | }
1949 | .bi-file-earmark-richtext-fill::before {
1950 | content: '\f382';
1951 | }
1952 | .bi-file-earmark-richtext::before {
1953 | content: '\f383';
1954 | }
1955 | .bi-file-earmark-ruled-fill::before {
1956 | content: '\f384';
1957 | }
1958 | .bi-file-earmark-ruled::before {
1959 | content: '\f385';
1960 | }
1961 | .bi-file-earmark-slides-fill::before {
1962 | content: '\f386';
1963 | }
1964 | .bi-file-earmark-slides::before {
1965 | content: '\f387';
1966 | }
1967 | .bi-file-earmark-spreadsheet-fill::before {
1968 | content: '\f388';
1969 | }
1970 | .bi-file-earmark-spreadsheet::before {
1971 | content: '\f389';
1972 | }
1973 | .bi-file-earmark-text-fill::before {
1974 | content: '\f38a';
1975 | }
1976 | .bi-file-earmark-text::before {
1977 | content: '\f38b';
1978 | }
1979 | .bi-file-earmark-word-fill::before {
1980 | content: '\f38c';
1981 | }
1982 | .bi-file-earmark-word::before {
1983 | content: '\f38d';
1984 | }
1985 | .bi-file-earmark-x-fill::before {
1986 | content: '\f38e';
1987 | }
1988 | .bi-file-earmark-x::before {
1989 | content: '\f38f';
1990 | }
1991 | .bi-file-earmark-zip-fill::before {
1992 | content: '\f390';
1993 | }
1994 | .bi-file-earmark-zip::before {
1995 | content: '\f391';
1996 | }
1997 | .bi-file-earmark::before {
1998 | content: '\f392';
1999 | }
2000 | .bi-file-easel-fill::before {
2001 | content: '\f393';
2002 | }
2003 | .bi-file-easel::before {
2004 | content: '\f394';
2005 | }
2006 | .bi-file-excel-fill::before {
2007 | content: '\f395';
2008 | }
2009 | .bi-file-excel::before {
2010 | content: '\f396';
2011 | }
2012 | .bi-file-fill::before {
2013 | content: '\f397';
2014 | }
2015 | .bi-file-font-fill::before {
2016 | content: '\f398';
2017 | }
2018 | .bi-file-font::before {
2019 | content: '\f399';
2020 | }
2021 | .bi-file-image-fill::before {
2022 | content: '\f39a';
2023 | }
2024 | .bi-file-image::before {
2025 | content: '\f39b';
2026 | }
2027 | .bi-file-lock-fill::before {
2028 | content: '\f39c';
2029 | }
2030 | .bi-file-lock::before {
2031 | content: '\f39d';
2032 | }
2033 | .bi-file-lock2-fill::before {
2034 | content: '\f39e';
2035 | }
2036 | .bi-file-lock2::before {
2037 | content: '\f39f';
2038 | }
2039 | .bi-file-medical-fill::before {
2040 | content: '\f3a0';
2041 | }
2042 | .bi-file-medical::before {
2043 | content: '\f3a1';
2044 | }
2045 | .bi-file-minus-fill::before {
2046 | content: '\f3a2';
2047 | }
2048 | .bi-file-minus::before {
2049 | content: '\f3a3';
2050 | }
2051 | .bi-file-music-fill::before {
2052 | content: '\f3a4';
2053 | }
2054 | .bi-file-music::before {
2055 | content: '\f3a5';
2056 | }
2057 | .bi-file-person-fill::before {
2058 | content: '\f3a6';
2059 | }
2060 | .bi-file-person::before {
2061 | content: '\f3a7';
2062 | }
2063 | .bi-file-play-fill::before {
2064 | content: '\f3a8';
2065 | }
2066 | .bi-file-play::before {
2067 | content: '\f3a9';
2068 | }
2069 | .bi-file-plus-fill::before {
2070 | content: '\f3aa';
2071 | }
2072 | .bi-file-plus::before {
2073 | content: '\f3ab';
2074 | }
2075 | .bi-file-post-fill::before {
2076 | content: '\f3ac';
2077 | }
2078 | .bi-file-post::before {
2079 | content: '\f3ad';
2080 | }
2081 | .bi-file-ppt-fill::before {
2082 | content: '\f3ae';
2083 | }
2084 | .bi-file-ppt::before {
2085 | content: '\f3af';
2086 | }
2087 | .bi-file-richtext-fill::before {
2088 | content: '\f3b0';
2089 | }
2090 | .bi-file-richtext::before {
2091 | content: '\f3b1';
2092 | }
2093 | .bi-file-ruled-fill::before {
2094 | content: '\f3b2';
2095 | }
2096 | .bi-file-ruled::before {
2097 | content: '\f3b3';
2098 | }
2099 | .bi-file-slides-fill::before {
2100 | content: '\f3b4';
2101 | }
2102 | .bi-file-slides::before {
2103 | content: '\f3b5';
2104 | }
2105 | .bi-file-spreadsheet-fill::before {
2106 | content: '\f3b6';
2107 | }
2108 | .bi-file-spreadsheet::before {
2109 | content: '\f3b7';
2110 | }
2111 | .bi-file-text-fill::before {
2112 | content: '\f3b8';
2113 | }
2114 | .bi-file-text::before {
2115 | content: '\f3b9';
2116 | }
2117 | .bi-file-word-fill::before {
2118 | content: '\f3ba';
2119 | }
2120 | .bi-file-word::before {
2121 | content: '\f3bb';
2122 | }
2123 | .bi-file-x-fill::before {
2124 | content: '\f3bc';
2125 | }
2126 | .bi-file-x::before {
2127 | content: '\f3bd';
2128 | }
2129 | .bi-file-zip-fill::before {
2130 | content: '\f3be';
2131 | }
2132 | .bi-file-zip::before {
2133 | content: '\f3bf';
2134 | }
2135 | .bi-file::before {
2136 | content: '\f3c0';
2137 | }
2138 | .bi-files-alt::before {
2139 | content: '\f3c1';
2140 | }
2141 | .bi-files::before {
2142 | content: '\f3c2';
2143 | }
2144 | .bi-film::before {
2145 | content: '\f3c3';
2146 | }
2147 | .bi-filter-circle-fill::before {
2148 | content: '\f3c4';
2149 | }
2150 | .bi-filter-circle::before {
2151 | content: '\f3c5';
2152 | }
2153 | .bi-filter-left::before {
2154 | content: '\f3c6';
2155 | }
2156 | .bi-filter-right::before {
2157 | content: '\f3c7';
2158 | }
2159 | .bi-filter-square-fill::before {
2160 | content: '\f3c8';
2161 | }
2162 | .bi-filter-square::before {
2163 | content: '\f3c9';
2164 | }
2165 | .bi-filter::before {
2166 | content: '\f3ca';
2167 | }
2168 | .bi-flag-fill::before {
2169 | content: '\f3cb';
2170 | }
2171 | .bi-flag::before {
2172 | content: '\f3cc';
2173 | }
2174 | .bi-flower1::before {
2175 | content: '\f3cd';
2176 | }
2177 | .bi-flower2::before {
2178 | content: '\f3ce';
2179 | }
2180 | .bi-flower3::before {
2181 | content: '\f3cf';
2182 | }
2183 | .bi-folder-check::before {
2184 | content: '\f3d0';
2185 | }
2186 | .bi-folder-fill::before {
2187 | content: '\f3d1';
2188 | }
2189 | .bi-folder-minus::before {
2190 | content: '\f3d2';
2191 | }
2192 | .bi-folder-plus::before {
2193 | content: '\f3d3';
2194 | }
2195 | .bi-folder-symlink-fill::before {
2196 | content: '\f3d4';
2197 | }
2198 | .bi-folder-symlink::before {
2199 | content: '\f3d5';
2200 | }
2201 | .bi-folder-x::before {
2202 | content: '\f3d6';
2203 | }
2204 | .bi-folder::before {
2205 | content: '\f3d7';
2206 | }
2207 | .bi-folder2-open::before {
2208 | content: '\f3d8';
2209 | }
2210 | .bi-folder2::before {
2211 | content: '\f3d9';
2212 | }
2213 | .bi-fonts::before {
2214 | content: '\f3da';
2215 | }
2216 | .bi-forward-fill::before {
2217 | content: '\f3db';
2218 | }
2219 | .bi-forward::before {
2220 | content: '\f3dc';
2221 | }
2222 | .bi-front::before {
2223 | content: '\f3dd';
2224 | }
2225 | .bi-fullscreen-exit::before {
2226 | content: '\f3de';
2227 | }
2228 | .bi-fullscreen::before {
2229 | content: '\f3df';
2230 | }
2231 | .bi-funnel-fill::before {
2232 | content: '\f3e0';
2233 | }
2234 | .bi-funnel::before {
2235 | content: '\f3e1';
2236 | }
2237 | .bi-gear-fill::before {
2238 | content: '\f3e2';
2239 | }
2240 | .bi-gear-wide-connected::before {
2241 | content: '\f3e3';
2242 | }
2243 | .bi-gear-wide::before {
2244 | content: '\f3e4';
2245 | }
2246 | .bi-gear::before {
2247 | content: '\f3e5';
2248 | }
2249 | .bi-gem::before {
2250 | content: '\f3e6';
2251 | }
2252 | .bi-geo-alt-fill::before {
2253 | content: '\f3e7';
2254 | }
2255 | .bi-geo-alt::before {
2256 | content: '\f3e8';
2257 | }
2258 | .bi-geo-fill::before {
2259 | content: '\f3e9';
2260 | }
2261 | .bi-geo::before {
2262 | content: '\f3ea';
2263 | }
2264 | .bi-gift-fill::before {
2265 | content: '\f3eb';
2266 | }
2267 | .bi-gift::before {
2268 | content: '\f3ec';
2269 | }
2270 | .bi-github::before {
2271 | content: '\f3ed';
2272 | }
2273 | .bi-globe::before {
2274 | content: '\f3ee';
2275 | }
2276 | .bi-globe2::before {
2277 | content: '\f3ef';
2278 | }
2279 | .bi-google::before {
2280 | content: '\f3f0';
2281 | }
2282 | .bi-graph-down::before {
2283 | content: '\f3f1';
2284 | }
2285 | .bi-graph-up::before {
2286 | content: '\f3f2';
2287 | }
2288 | .bi-grid-1x2-fill::before {
2289 | content: '\f3f3';
2290 | }
2291 | .bi-grid-1x2::before {
2292 | content: '\f3f4';
2293 | }
2294 | .bi-grid-3x2-gap-fill::before {
2295 | content: '\f3f5';
2296 | }
2297 | .bi-grid-3x2-gap::before {
2298 | content: '\f3f6';
2299 | }
2300 | .bi-grid-3x2::before {
2301 | content: '\f3f7';
2302 | }
2303 | .bi-grid-3x3-gap-fill::before {
2304 | content: '\f3f8';
2305 | }
2306 | .bi-grid-3x3-gap::before {
2307 | content: '\f3f9';
2308 | }
2309 | .bi-grid-3x3::before {
2310 | content: '\f3fa';
2311 | }
2312 | .bi-grid-fill::before {
2313 | content: '\f3fb';
2314 | }
2315 | .bi-grid::before {
2316 | content: '\f3fc';
2317 | }
2318 | .bi-grip-horizontal::before {
2319 | content: '\f3fd';
2320 | }
2321 | .bi-grip-vertical::before {
2322 | content: '\f3fe';
2323 | }
2324 | .bi-hammer::before {
2325 | content: '\f3ff';
2326 | }
2327 | .bi-hand-index-fill::before {
2328 | content: '\f400';
2329 | }
2330 | .bi-hand-index-thumb-fill::before {
2331 | content: '\f401';
2332 | }
2333 | .bi-hand-index-thumb::before {
2334 | content: '\f402';
2335 | }
2336 | .bi-hand-index::before {
2337 | content: '\f403';
2338 | }
2339 | .bi-hand-thumbs-down-fill::before {
2340 | content: '\f404';
2341 | }
2342 | .bi-hand-thumbs-down::before {
2343 | content: '\f405';
2344 | }
2345 | .bi-hand-thumbs-up-fill::before {
2346 | content: '\f406';
2347 | }
2348 | .bi-hand-thumbs-up::before {
2349 | content: '\f407';
2350 | }
2351 | .bi-handbag-fill::before {
2352 | content: '\f408';
2353 | }
2354 | .bi-handbag::before {
2355 | content: '\f409';
2356 | }
2357 | .bi-hash::before {
2358 | content: '\f40a';
2359 | }
2360 | .bi-hdd-fill::before {
2361 | content: '\f40b';
2362 | }
2363 | .bi-hdd-network-fill::before {
2364 | content: '\f40c';
2365 | }
2366 | .bi-hdd-network::before {
2367 | content: '\f40d';
2368 | }
2369 | .bi-hdd-rack-fill::before {
2370 | content: '\f40e';
2371 | }
2372 | .bi-hdd-rack::before {
2373 | content: '\f40f';
2374 | }
2375 | .bi-hdd-stack-fill::before {
2376 | content: '\f410';
2377 | }
2378 | .bi-hdd-stack::before {
2379 | content: '\f411';
2380 | }
2381 | .bi-hdd::before {
2382 | content: '\f412';
2383 | }
2384 | .bi-headphones::before {
2385 | content: '\f413';
2386 | }
2387 | .bi-headset::before {
2388 | content: '\f414';
2389 | }
2390 | .bi-heart-fill::before {
2391 | content: '\f415';
2392 | }
2393 | .bi-heart-half::before {
2394 | content: '\f416';
2395 | }
2396 | .bi-heart::before {
2397 | content: '\f417';
2398 | }
2399 | .bi-heptagon-fill::before {
2400 | content: '\f418';
2401 | }
2402 | .bi-heptagon-half::before {
2403 | content: '\f419';
2404 | }
2405 | .bi-heptagon::before {
2406 | content: '\f41a';
2407 | }
2408 | .bi-hexagon-fill::before {
2409 | content: '\f41b';
2410 | }
2411 | .bi-hexagon-half::before {
2412 | content: '\f41c';
2413 | }
2414 | .bi-hexagon::before {
2415 | content: '\f41d';
2416 | }
2417 | .bi-hourglass-bottom::before {
2418 | content: '\f41e';
2419 | }
2420 | .bi-hourglass-split::before {
2421 | content: '\f41f';
2422 | }
2423 | .bi-hourglass-top::before {
2424 | content: '\f420';
2425 | }
2426 | .bi-hourglass::before {
2427 | content: '\f421';
2428 | }
2429 | .bi-house-door-fill::before {
2430 | content: '\f422';
2431 | }
2432 | .bi-house-door::before {
2433 | content: '\f423';
2434 | }
2435 | .bi-house-fill::before {
2436 | content: '\f424';
2437 | }
2438 | .bi-house::before {
2439 | content: '\f425';
2440 | }
2441 | .bi-hr::before {
2442 | content: '\f426';
2443 | }
2444 | .bi-hurricane::before {
2445 | content: '\f427';
2446 | }
2447 | .bi-image-alt::before {
2448 | content: '\f428';
2449 | }
2450 | .bi-image-fill::before {
2451 | content: '\f429';
2452 | }
2453 | .bi-image::before {
2454 | content: '\f42a';
2455 | }
2456 | .bi-images::before {
2457 | content: '\f42b';
2458 | }
2459 | .bi-inbox-fill::before {
2460 | content: '\f42c';
2461 | }
2462 | .bi-inbox::before {
2463 | content: '\f42d';
2464 | }
2465 | .bi-inboxes-fill::before {
2466 | content: '\f42e';
2467 | }
2468 | .bi-inboxes::before {
2469 | content: '\f42f';
2470 | }
2471 | .bi-info-circle-fill::before {
2472 | content: '\f430';
2473 | }
2474 | .bi-info-circle::before {
2475 | content: '\f431';
2476 | }
2477 | .bi-info-square-fill::before {
2478 | content: '\f432';
2479 | }
2480 | .bi-info-square::before {
2481 | content: '\f433';
2482 | }
2483 | .bi-info::before {
2484 | content: '\f434';
2485 | }
2486 | .bi-input-cursor-text::before {
2487 | content: '\f435';
2488 | }
2489 | .bi-input-cursor::before {
2490 | content: '\f436';
2491 | }
2492 | .bi-instagram::before {
2493 | content: '\f437';
2494 | }
2495 | .bi-intersect::before {
2496 | content: '\f438';
2497 | }
2498 | .bi-journal-album::before {
2499 | content: '\f439';
2500 | }
2501 | .bi-journal-arrow-down::before {
2502 | content: '\f43a';
2503 | }
2504 | .bi-journal-arrow-up::before {
2505 | content: '\f43b';
2506 | }
2507 | .bi-journal-bookmark-fill::before {
2508 | content: '\f43c';
2509 | }
2510 | .bi-journal-bookmark::before {
2511 | content: '\f43d';
2512 | }
2513 | .bi-journal-check::before {
2514 | content: '\f43e';
2515 | }
2516 | .bi-journal-code::before {
2517 | content: '\f43f';
2518 | }
2519 | .bi-journal-medical::before {
2520 | content: '\f440';
2521 | }
2522 | .bi-journal-minus::before {
2523 | content: '\f441';
2524 | }
2525 | .bi-journal-plus::before {
2526 | content: '\f442';
2527 | }
2528 | .bi-journal-richtext::before {
2529 | content: '\f443';
2530 | }
2531 | .bi-journal-text::before {
2532 | content: '\f444';
2533 | }
2534 | .bi-journal-x::before {
2535 | content: '\f445';
2536 | }
2537 | .bi-journal::before {
2538 | content: '\f446';
2539 | }
2540 | .bi-journals::before {
2541 | content: '\f447';
2542 | }
2543 | .bi-joystick::before {
2544 | content: '\f448';
2545 | }
2546 | .bi-justify-left::before {
2547 | content: '\f449';
2548 | }
2549 | .bi-justify-right::before {
2550 | content: '\f44a';
2551 | }
2552 | .bi-justify::before {
2553 | content: '\f44b';
2554 | }
2555 | .bi-kanban-fill::before {
2556 | content: '\f44c';
2557 | }
2558 | .bi-kanban::before {
2559 | content: '\f44d';
2560 | }
2561 | .bi-key-fill::before {
2562 | content: '\f44e';
2563 | }
2564 | .bi-key::before {
2565 | content: '\f44f';
2566 | }
2567 | .bi-keyboard-fill::before {
2568 | content: '\f450';
2569 | }
2570 | .bi-keyboard::before {
2571 | content: '\f451';
2572 | }
2573 | .bi-ladder::before {
2574 | content: '\f452';
2575 | }
2576 | .bi-lamp-fill::before {
2577 | content: '\f453';
2578 | }
2579 | .bi-lamp::before {
2580 | content: '\f454';
2581 | }
2582 | .bi-laptop-fill::before {
2583 | content: '\f455';
2584 | }
2585 | .bi-laptop::before {
2586 | content: '\f456';
2587 | }
2588 | .bi-layer-backward::before {
2589 | content: '\f457';
2590 | }
2591 | .bi-layer-forward::before {
2592 | content: '\f458';
2593 | }
2594 | .bi-layers-fill::before {
2595 | content: '\f459';
2596 | }
2597 | .bi-layers-half::before {
2598 | content: '\f45a';
2599 | }
2600 | .bi-layers::before {
2601 | content: '\f45b';
2602 | }
2603 | .bi-layout-sidebar-inset-reverse::before {
2604 | content: '\f45c';
2605 | }
2606 | .bi-layout-sidebar-inset::before {
2607 | content: '\f45d';
2608 | }
2609 | .bi-layout-sidebar-reverse::before {
2610 | content: '\f45e';
2611 | }
2612 | .bi-layout-sidebar::before {
2613 | content: '\f45f';
2614 | }
2615 | .bi-layout-split::before {
2616 | content: '\f460';
2617 | }
2618 | .bi-layout-text-sidebar-reverse::before {
2619 | content: '\f461';
2620 | }
2621 | .bi-layout-text-sidebar::before {
2622 | content: '\f462';
2623 | }
2624 | .bi-layout-text-window-reverse::before {
2625 | content: '\f463';
2626 | }
2627 | .bi-layout-text-window::before {
2628 | content: '\f464';
2629 | }
2630 | .bi-layout-three-columns::before {
2631 | content: '\f465';
2632 | }
2633 | .bi-layout-wtf::before {
2634 | content: '\f466';
2635 | }
2636 | .bi-life-preserver::before {
2637 | content: '\f467';
2638 | }
2639 | .bi-lightbulb-fill::before {
2640 | content: '\f468';
2641 | }
2642 | .bi-lightbulb-off-fill::before {
2643 | content: '\f469';
2644 | }
2645 | .bi-lightbulb-off::before {
2646 | content: '\f46a';
2647 | }
2648 | .bi-lightbulb::before {
2649 | content: '\f46b';
2650 | }
2651 | .bi-lightning-charge-fill::before {
2652 | content: '\f46c';
2653 | }
2654 | .bi-lightning-charge::before {
2655 | content: '\f46d';
2656 | }
2657 | .bi-lightning-fill::before {
2658 | content: '\f46e';
2659 | }
2660 | .bi-lightning::before {
2661 | content: '\f46f';
2662 | }
2663 | .bi-link-45deg::before {
2664 | content: '\f470';
2665 | }
2666 | .bi-link::before {
2667 | content: '\f471';
2668 | }
2669 | .bi-linkedin::before {
2670 | content: '\f472';
2671 | }
2672 | .bi-list-check::before {
2673 | content: '\f473';
2674 | }
2675 | .bi-list-nested::before {
2676 | content: '\f474';
2677 | }
2678 | .bi-list-ol::before {
2679 | content: '\f475';
2680 | }
2681 | .bi-list-stars::before {
2682 | content: '\f476';
2683 | }
2684 | .bi-list-task::before {
2685 | content: '\f477';
2686 | }
2687 | .bi-list-ul::before {
2688 | content: '\f478';
2689 | }
2690 | .bi-list::before {
2691 | content: '\f479';
2692 | }
2693 | .bi-lock-fill::before {
2694 | content: '\f47a';
2695 | }
2696 | .bi-lock::before {
2697 | content: '\f47b';
2698 | }
2699 | .bi-mailbox::before {
2700 | content: '\f47c';
2701 | }
2702 | .bi-mailbox2::before {
2703 | content: '\f47d';
2704 | }
2705 | .bi-map-fill::before {
2706 | content: '\f47e';
2707 | }
2708 | .bi-map::before {
2709 | content: '\f47f';
2710 | }
2711 | .bi-markdown-fill::before {
2712 | content: '\f480';
2713 | }
2714 | .bi-markdown::before {
2715 | content: '\f481';
2716 | }
2717 | .bi-mask::before {
2718 | content: '\f482';
2719 | }
2720 | .bi-megaphone-fill::before {
2721 | content: '\f483';
2722 | }
2723 | .bi-megaphone::before {
2724 | content: '\f484';
2725 | }
2726 | .bi-menu-app-fill::before {
2727 | content: '\f485';
2728 | }
2729 | .bi-menu-app::before {
2730 | content: '\f486';
2731 | }
2732 | .bi-menu-button-fill::before {
2733 | content: '\f487';
2734 | }
2735 | .bi-menu-button-wide-fill::before {
2736 | content: '\f488';
2737 | }
2738 | .bi-menu-button-wide::before {
2739 | content: '\f489';
2740 | }
2741 | .bi-menu-button::before {
2742 | content: '\f48a';
2743 | }
2744 | .bi-menu-down::before {
2745 | content: '\f48b';
2746 | }
2747 | .bi-menu-up::before {
2748 | content: '\f48c';
2749 | }
2750 | .bi-mic-fill::before {
2751 | content: '\f48d';
2752 | }
2753 | .bi-mic-mute-fill::before {
2754 | content: '\f48e';
2755 | }
2756 | .bi-mic-mute::before {
2757 | content: '\f48f';
2758 | }
2759 | .bi-mic::before {
2760 | content: '\f490';
2761 | }
2762 | .bi-minecart-loaded::before {
2763 | content: '\f491';
2764 | }
2765 | .bi-minecart::before {
2766 | content: '\f492';
2767 | }
2768 | .bi-moisture::before {
2769 | content: '\f493';
2770 | }
2771 | .bi-moon-fill::before {
2772 | content: '\f494';
2773 | }
2774 | .bi-moon-stars-fill::before {
2775 | content: '\f495';
2776 | }
2777 | .bi-moon-stars::before {
2778 | content: '\f496';
2779 | }
2780 | .bi-moon::before {
2781 | content: '\f497';
2782 | }
2783 | .bi-mouse-fill::before {
2784 | content: '\f498';
2785 | }
2786 | .bi-mouse::before {
2787 | content: '\f499';
2788 | }
2789 | .bi-mouse2-fill::before {
2790 | content: '\f49a';
2791 | }
2792 | .bi-mouse2::before {
2793 | content: '\f49b';
2794 | }
2795 | .bi-mouse3-fill::before {
2796 | content: '\f49c';
2797 | }
2798 | .bi-mouse3::before {
2799 | content: '\f49d';
2800 | }
2801 | .bi-music-note-beamed::before {
2802 | content: '\f49e';
2803 | }
2804 | .bi-music-note-list::before {
2805 | content: '\f49f';
2806 | }
2807 | .bi-music-note::before {
2808 | content: '\f4a0';
2809 | }
2810 | .bi-music-player-fill::before {
2811 | content: '\f4a1';
2812 | }
2813 | .bi-music-player::before {
2814 | content: '\f4a2';
2815 | }
2816 | .bi-newspaper::before {
2817 | content: '\f4a3';
2818 | }
2819 | .bi-node-minus-fill::before {
2820 | content: '\f4a4';
2821 | }
2822 | .bi-node-minus::before {
2823 | content: '\f4a5';
2824 | }
2825 | .bi-node-plus-fill::before {
2826 | content: '\f4a6';
2827 | }
2828 | .bi-node-plus::before {
2829 | content: '\f4a7';
2830 | }
2831 | .bi-nut-fill::before {
2832 | content: '\f4a8';
2833 | }
2834 | .bi-nut::before {
2835 | content: '\f4a9';
2836 | }
2837 | .bi-octagon-fill::before {
2838 | content: '\f4aa';
2839 | }
2840 | .bi-octagon-half::before {
2841 | content: '\f4ab';
2842 | }
2843 | .bi-octagon::before {
2844 | content: '\f4ac';
2845 | }
2846 | .bi-option::before {
2847 | content: '\f4ad';
2848 | }
2849 | .bi-outlet::before {
2850 | content: '\f4ae';
2851 | }
2852 | .bi-paint-bucket::before {
2853 | content: '\f4af';
2854 | }
2855 | .bi-palette-fill::before {
2856 | content: '\f4b0';
2857 | }
2858 | .bi-palette::before {
2859 | content: '\f4b1';
2860 | }
2861 | .bi-palette2::before {
2862 | content: '\f4b2';
2863 | }
2864 | .bi-paperclip::before {
2865 | content: '\f4b3';
2866 | }
2867 | .bi-paragraph::before {
2868 | content: '\f4b4';
2869 | }
2870 | .bi-patch-check-fill::before {
2871 | content: '\f4b5';
2872 | }
2873 | .bi-patch-check::before {
2874 | content: '\f4b6';
2875 | }
2876 | .bi-patch-exclamation-fill::before {
2877 | content: '\f4b7';
2878 | }
2879 | .bi-patch-exclamation::before {
2880 | content: '\f4b8';
2881 | }
2882 | .bi-patch-minus-fill::before {
2883 | content: '\f4b9';
2884 | }
2885 | .bi-patch-minus::before {
2886 | content: '\f4ba';
2887 | }
2888 | .bi-patch-plus-fill::before {
2889 | content: '\f4bb';
2890 | }
2891 | .bi-patch-plus::before {
2892 | content: '\f4bc';
2893 | }
2894 | .bi-patch-question-fill::before {
2895 | content: '\f4bd';
2896 | }
2897 | .bi-patch-question::before {
2898 | content: '\f4be';
2899 | }
2900 | .bi-pause-btn-fill::before {
2901 | content: '\f4bf';
2902 | }
2903 | .bi-pause-btn::before {
2904 | content: '\f4c0';
2905 | }
2906 | .bi-pause-circle-fill::before {
2907 | content: '\f4c1';
2908 | }
2909 | .bi-pause-circle::before {
2910 | content: '\f4c2';
2911 | }
2912 | .bi-pause-fill::before {
2913 | content: '\f4c3';
2914 | }
2915 | .bi-pause::before {
2916 | content: '\f4c4';
2917 | }
2918 | .bi-peace-fill::before {
2919 | content: '\f4c5';
2920 | }
2921 | .bi-peace::before {
2922 | content: '\f4c6';
2923 | }
2924 | .bi-pen-fill::before {
2925 | content: '\f4c7';
2926 | }
2927 | .bi-pen::before {
2928 | content: '\f4c8';
2929 | }
2930 | .bi-pencil-fill::before {
2931 | content: '\f4c9';
2932 | }
2933 | .bi-pencil-square::before {
2934 | content: '\f4ca';
2935 | }
2936 | .bi-pencil::before {
2937 | content: '\f4cb';
2938 | }
2939 | .bi-pentagon-fill::before {
2940 | content: '\f4cc';
2941 | }
2942 | .bi-pentagon-half::before {
2943 | content: '\f4cd';
2944 | }
2945 | .bi-pentagon::before {
2946 | content: '\f4ce';
2947 | }
2948 | .bi-people-fill::before {
2949 | content: '\f4cf';
2950 | }
2951 | .bi-people::before {
2952 | content: '\f4d0';
2953 | }
2954 | .bi-percent::before {
2955 | content: '\f4d1';
2956 | }
2957 | .bi-person-badge-fill::before {
2958 | content: '\f4d2';
2959 | }
2960 | .bi-person-badge::before {
2961 | content: '\f4d3';
2962 | }
2963 | .bi-person-bounding-box::before {
2964 | content: '\f4d4';
2965 | }
2966 | .bi-person-check-fill::before {
2967 | content: '\f4d5';
2968 | }
2969 | .bi-person-check::before {
2970 | content: '\f4d6';
2971 | }
2972 | .bi-person-circle::before {
2973 | content: '\f4d7';
2974 | }
2975 | .bi-person-dash-fill::before {
2976 | content: '\f4d8';
2977 | }
2978 | .bi-person-dash::before {
2979 | content: '\f4d9';
2980 | }
2981 | .bi-person-fill::before {
2982 | content: '\f4da';
2983 | }
2984 | .bi-person-lines-fill::before {
2985 | content: '\f4db';
2986 | }
2987 | .bi-person-plus-fill::before {
2988 | content: '\f4dc';
2989 | }
2990 | .bi-person-plus::before {
2991 | content: '\f4dd';
2992 | }
2993 | .bi-person-square::before {
2994 | content: '\f4de';
2995 | }
2996 | .bi-person-x-fill::before {
2997 | content: '\f4df';
2998 | }
2999 | .bi-person-x::before {
3000 | content: '\f4e0';
3001 | }
3002 | .bi-person::before {
3003 | content: '\f4e1';
3004 | }
3005 | .bi-phone-fill::before {
3006 | content: '\f4e2';
3007 | }
3008 | .bi-phone-landscape-fill::before {
3009 | content: '\f4e3';
3010 | }
3011 | .bi-phone-landscape::before {
3012 | content: '\f4e4';
3013 | }
3014 | .bi-phone-vibrate-fill::before {
3015 | content: '\f4e5';
3016 | }
3017 | .bi-phone-vibrate::before {
3018 | content: '\f4e6';
3019 | }
3020 | .bi-phone::before {
3021 | content: '\f4e7';
3022 | }
3023 | .bi-pie-chart-fill::before {
3024 | content: '\f4e8';
3025 | }
3026 | .bi-pie-chart::before {
3027 | content: '\f4e9';
3028 | }
3029 | .bi-pin-angle-fill::before {
3030 | content: '\f4ea';
3031 | }
3032 | .bi-pin-angle::before {
3033 | content: '\f4eb';
3034 | }
3035 | .bi-pin-fill::before {
3036 | content: '\f4ec';
3037 | }
3038 | .bi-pin::before {
3039 | content: '\f4ed';
3040 | }
3041 | .bi-pip-fill::before {
3042 | content: '\f4ee';
3043 | }
3044 | .bi-pip::before {
3045 | content: '\f4ef';
3046 | }
3047 | .bi-play-btn-fill::before {
3048 | content: '\f4f0';
3049 | }
3050 | .bi-play-btn::before {
3051 | content: '\f4f1';
3052 | }
3053 | .bi-play-circle-fill::before {
3054 | content: '\f4f2';
3055 | }
3056 | .bi-play-circle::before {
3057 | content: '\f4f3';
3058 | }
3059 | .bi-play-fill::before {
3060 | content: '\f4f4';
3061 | }
3062 | .bi-play::before {
3063 | content: '\f4f5';
3064 | }
3065 | .bi-plug-fill::before {
3066 | content: '\f4f6';
3067 | }
3068 | .bi-plug::before {
3069 | content: '\f4f7';
3070 | }
3071 | .bi-plus-circle-dotted::before {
3072 | content: '\f4f8';
3073 | }
3074 | .bi-plus-circle-fill::before {
3075 | content: '\f4f9';
3076 | }
3077 | .bi-plus-circle::before {
3078 | content: '\f4fa';
3079 | }
3080 | .bi-plus-square-dotted::before {
3081 | content: '\f4fb';
3082 | }
3083 | .bi-plus-square-fill::before {
3084 | content: '\f4fc';
3085 | }
3086 | .bi-plus-square::before {
3087 | content: '\f4fd';
3088 | }
3089 | .bi-plus::before {
3090 | content: '\f4fe';
3091 | }
3092 | .bi-power::before {
3093 | content: '\f4ff';
3094 | }
3095 | .bi-printer-fill::before {
3096 | content: '\f500';
3097 | }
3098 | .bi-printer::before {
3099 | content: '\f501';
3100 | }
3101 | .bi-puzzle-fill::before {
3102 | content: '\f502';
3103 | }
3104 | .bi-puzzle::before {
3105 | content: '\f503';
3106 | }
3107 | .bi-question-circle-fill::before {
3108 | content: '\f504';
3109 | }
3110 | .bi-question-circle::before {
3111 | content: '\f505';
3112 | }
3113 | .bi-question-diamond-fill::before {
3114 | content: '\f506';
3115 | }
3116 | .bi-question-diamond::before {
3117 | content: '\f507';
3118 | }
3119 | .bi-question-octagon-fill::before {
3120 | content: '\f508';
3121 | }
3122 | .bi-question-octagon::before {
3123 | content: '\f509';
3124 | }
3125 | .bi-question-square-fill::before {
3126 | content: '\f50a';
3127 | }
3128 | .bi-question-square::before {
3129 | content: '\f50b';
3130 | }
3131 | .bi-question::before {
3132 | content: '\f50c';
3133 | }
3134 | .bi-rainbow::before {
3135 | content: '\f50d';
3136 | }
3137 | .bi-receipt-cutoff::before {
3138 | content: '\f50e';
3139 | }
3140 | .bi-receipt::before {
3141 | content: '\f50f';
3142 | }
3143 | .bi-reception-0::before {
3144 | content: '\f510';
3145 | }
3146 | .bi-reception-1::before {
3147 | content: '\f511';
3148 | }
3149 | .bi-reception-2::before {
3150 | content: '\f512';
3151 | }
3152 | .bi-reception-3::before {
3153 | content: '\f513';
3154 | }
3155 | .bi-reception-4::before {
3156 | content: '\f514';
3157 | }
3158 | .bi-record-btn-fill::before {
3159 | content: '\f515';
3160 | }
3161 | .bi-record-btn::before {
3162 | content: '\f516';
3163 | }
3164 | .bi-record-circle-fill::before {
3165 | content: '\f517';
3166 | }
3167 | .bi-record-circle::before {
3168 | content: '\f518';
3169 | }
3170 | .bi-record-fill::before {
3171 | content: '\f519';
3172 | }
3173 | .bi-record::before {
3174 | content: '\f51a';
3175 | }
3176 | .bi-record2-fill::before {
3177 | content: '\f51b';
3178 | }
3179 | .bi-record2::before {
3180 | content: '\f51c';
3181 | }
3182 | .bi-reply-all-fill::before {
3183 | content: '\f51d';
3184 | }
3185 | .bi-reply-all::before {
3186 | content: '\f51e';
3187 | }
3188 | .bi-reply-fill::before {
3189 | content: '\f51f';
3190 | }
3191 | .bi-reply::before {
3192 | content: '\f520';
3193 | }
3194 | .bi-rss-fill::before {
3195 | content: '\f521';
3196 | }
3197 | .bi-rss::before {
3198 | content: '\f522';
3199 | }
3200 | .bi-rulers::before {
3201 | content: '\f523';
3202 | }
3203 | .bi-save-fill::before {
3204 | content: '\f524';
3205 | }
3206 | .bi-save::before {
3207 | content: '\f525';
3208 | }
3209 | .bi-save2-fill::before {
3210 | content: '\f526';
3211 | }
3212 | .bi-save2::before {
3213 | content: '\f527';
3214 | }
3215 | .bi-scissors::before {
3216 | content: '\f528';
3217 | }
3218 | .bi-screwdriver::before {
3219 | content: '\f529';
3220 | }
3221 | .bi-search::before {
3222 | content: '\f52a';
3223 | }
3224 | .bi-segmented-nav::before {
3225 | content: '\f52b';
3226 | }
3227 | .bi-server::before {
3228 | content: '\f52c';
3229 | }
3230 | .bi-share-fill::before {
3231 | content: '\f52d';
3232 | }
3233 | .bi-share::before {
3234 | content: '\f52e';
3235 | }
3236 | .bi-shield-check::before {
3237 | content: '\f52f';
3238 | }
3239 | .bi-shield-exclamation::before {
3240 | content: '\f530';
3241 | }
3242 | .bi-shield-fill-check::before {
3243 | content: '\f531';
3244 | }
3245 | .bi-shield-fill-exclamation::before {
3246 | content: '\f532';
3247 | }
3248 | .bi-shield-fill-minus::before {
3249 | content: '\f533';
3250 | }
3251 | .bi-shield-fill-plus::before {
3252 | content: '\f534';
3253 | }
3254 | .bi-shield-fill-x::before {
3255 | content: '\f535';
3256 | }
3257 | .bi-shield-fill::before {
3258 | content: '\f536';
3259 | }
3260 | .bi-shield-lock-fill::before {
3261 | content: '\f537';
3262 | }
3263 | .bi-shield-lock::before {
3264 | content: '\f538';
3265 | }
3266 | .bi-shield-minus::before {
3267 | content: '\f539';
3268 | }
3269 | .bi-shield-plus::before {
3270 | content: '\f53a';
3271 | }
3272 | .bi-shield-shaded::before {
3273 | content: '\f53b';
3274 | }
3275 | .bi-shield-slash-fill::before {
3276 | content: '\f53c';
3277 | }
3278 | .bi-shield-slash::before {
3279 | content: '\f53d';
3280 | }
3281 | .bi-shield-x::before {
3282 | content: '\f53e';
3283 | }
3284 | .bi-shield::before {
3285 | content: '\f53f';
3286 | }
3287 | .bi-shift-fill::before {
3288 | content: '\f540';
3289 | }
3290 | .bi-shift::before {
3291 | content: '\f541';
3292 | }
3293 | .bi-shop-window::before {
3294 | content: '\f542';
3295 | }
3296 | .bi-shop::before {
3297 | content: '\f543';
3298 | }
3299 | .bi-shuffle::before {
3300 | content: '\f544';
3301 | }
3302 | .bi-signpost-2-fill::before {
3303 | content: '\f545';
3304 | }
3305 | .bi-signpost-2::before {
3306 | content: '\f546';
3307 | }
3308 | .bi-signpost-fill::before {
3309 | content: '\f547';
3310 | }
3311 | .bi-signpost-split-fill::before {
3312 | content: '\f548';
3313 | }
3314 | .bi-signpost-split::before {
3315 | content: '\f549';
3316 | }
3317 | .bi-signpost::before {
3318 | content: '\f54a';
3319 | }
3320 | .bi-sim-fill::before {
3321 | content: '\f54b';
3322 | }
3323 | .bi-sim::before {
3324 | content: '\f54c';
3325 | }
3326 | .bi-skip-backward-btn-fill::before {
3327 | content: '\f54d';
3328 | }
3329 | .bi-skip-backward-btn::before {
3330 | content: '\f54e';
3331 | }
3332 | .bi-skip-backward-circle-fill::before {
3333 | content: '\f54f';
3334 | }
3335 | .bi-skip-backward-circle::before {
3336 | content: '\f550';
3337 | }
3338 | .bi-skip-backward-fill::before {
3339 | content: '\f551';
3340 | }
3341 | .bi-skip-backward::before {
3342 | content: '\f552';
3343 | }
3344 | .bi-skip-end-btn-fill::before {
3345 | content: '\f553';
3346 | }
3347 | .bi-skip-end-btn::before {
3348 | content: '\f554';
3349 | }
3350 | .bi-skip-end-circle-fill::before {
3351 | content: '\f555';
3352 | }
3353 | .bi-skip-end-circle::before {
3354 | content: '\f556';
3355 | }
3356 | .bi-skip-end-fill::before {
3357 | content: '\f557';
3358 | }
3359 | .bi-skip-end::before {
3360 | content: '\f558';
3361 | }
3362 | .bi-skip-forward-btn-fill::before {
3363 | content: '\f559';
3364 | }
3365 | .bi-skip-forward-btn::before {
3366 | content: '\f55a';
3367 | }
3368 | .bi-skip-forward-circle-fill::before {
3369 | content: '\f55b';
3370 | }
3371 | .bi-skip-forward-circle::before {
3372 | content: '\f55c';
3373 | }
3374 | .bi-skip-forward-fill::before {
3375 | content: '\f55d';
3376 | }
3377 | .bi-skip-forward::before {
3378 | content: '\f55e';
3379 | }
3380 | .bi-skip-start-btn-fill::before {
3381 | content: '\f55f';
3382 | }
3383 | .bi-skip-start-btn::before {
3384 | content: '\f560';
3385 | }
3386 | .bi-skip-start-circle-fill::before {
3387 | content: '\f561';
3388 | }
3389 | .bi-skip-start-circle::before {
3390 | content: '\f562';
3391 | }
3392 | .bi-skip-start-fill::before {
3393 | content: '\f563';
3394 | }
3395 | .bi-skip-start::before {
3396 | content: '\f564';
3397 | }
3398 | .bi-slack::before {
3399 | content: '\f565';
3400 | }
3401 | .bi-slash-circle-fill::before {
3402 | content: '\f566';
3403 | }
3404 | .bi-slash-circle::before {
3405 | content: '\f567';
3406 | }
3407 | .bi-slash-square-fill::before {
3408 | content: '\f568';
3409 | }
3410 | .bi-slash-square::before {
3411 | content: '\f569';
3412 | }
3413 | .bi-slash::before {
3414 | content: '\f56a';
3415 | }
3416 | .bi-sliders::before {
3417 | content: '\f56b';
3418 | }
3419 | .bi-smartwatch::before {
3420 | content: '\f56c';
3421 | }
3422 | .bi-snow::before {
3423 | content: '\f56d';
3424 | }
3425 | .bi-snow2::before {
3426 | content: '\f56e';
3427 | }
3428 | .bi-snow3::before {
3429 | content: '\f56f';
3430 | }
3431 | .bi-sort-alpha-down-alt::before {
3432 | content: '\f570';
3433 | }
3434 | .bi-sort-alpha-down::before {
3435 | content: '\f571';
3436 | }
3437 | .bi-sort-alpha-up-alt::before {
3438 | content: '\f572';
3439 | }
3440 | .bi-sort-alpha-up::before {
3441 | content: '\f573';
3442 | }
3443 | .bi-sort-down-alt::before {
3444 | content: '\f574';
3445 | }
3446 | .bi-sort-down::before {
3447 | content: '\f575';
3448 | }
3449 | .bi-sort-numeric-down-alt::before {
3450 | content: '\f576';
3451 | }
3452 | .bi-sort-numeric-down::before {
3453 | content: '\f577';
3454 | }
3455 | .bi-sort-numeric-up-alt::before {
3456 | content: '\f578';
3457 | }
3458 | .bi-sort-numeric-up::before {
3459 | content: '\f579';
3460 | }
3461 | .bi-sort-up-alt::before {
3462 | content: '\f57a';
3463 | }
3464 | .bi-sort-up::before {
3465 | content: '\f57b';
3466 | }
3467 | .bi-soundwave::before {
3468 | content: '\f57c';
3469 | }
3470 | .bi-speaker-fill::before {
3471 | content: '\f57d';
3472 | }
3473 | .bi-speaker::before {
3474 | content: '\f57e';
3475 | }
3476 | .bi-speedometer::before {
3477 | content: '\f57f';
3478 | }
3479 | .bi-speedometer2::before {
3480 | content: '\f580';
3481 | }
3482 | .bi-spellcheck::before {
3483 | content: '\f581';
3484 | }
3485 | .bi-square-fill::before {
3486 | content: '\f582';
3487 | }
3488 | .bi-square-half::before {
3489 | content: '\f583';
3490 | }
3491 | .bi-square::before {
3492 | content: '\f584';
3493 | }
3494 | .bi-stack::before {
3495 | content: '\f585';
3496 | }
3497 | .bi-star-fill::before {
3498 | content: '\f586';
3499 | }
3500 | .bi-star-half::before {
3501 | content: '\f587';
3502 | }
3503 | .bi-star::before {
3504 | content: '\f588';
3505 | }
3506 | .bi-stars::before {
3507 | content: '\f589';
3508 | }
3509 | .bi-stickies-fill::before {
3510 | content: '\f58a';
3511 | }
3512 | .bi-stickies::before {
3513 | content: '\f58b';
3514 | }
3515 | .bi-sticky-fill::before {
3516 | content: '\f58c';
3517 | }
3518 | .bi-sticky::before {
3519 | content: '\f58d';
3520 | }
3521 | .bi-stop-btn-fill::before {
3522 | content: '\f58e';
3523 | }
3524 | .bi-stop-btn::before {
3525 | content: '\f58f';
3526 | }
3527 | .bi-stop-circle-fill::before {
3528 | content: '\f590';
3529 | }
3530 | .bi-stop-circle::before {
3531 | content: '\f591';
3532 | }
3533 | .bi-stop-fill::before {
3534 | content: '\f592';
3535 | }
3536 | .bi-stop::before {
3537 | content: '\f593';
3538 | }
3539 | .bi-stoplights-fill::before {
3540 | content: '\f594';
3541 | }
3542 | .bi-stoplights::before {
3543 | content: '\f595';
3544 | }
3545 | .bi-stopwatch-fill::before {
3546 | content: '\f596';
3547 | }
3548 | .bi-stopwatch::before {
3549 | content: '\f597';
3550 | }
3551 | .bi-subtract::before {
3552 | content: '\f598';
3553 | }
3554 | .bi-suit-club-fill::before {
3555 | content: '\f599';
3556 | }
3557 | .bi-suit-club::before {
3558 | content: '\f59a';
3559 | }
3560 | .bi-suit-diamond-fill::before {
3561 | content: '\f59b';
3562 | }
3563 | .bi-suit-diamond::before {
3564 | content: '\f59c';
3565 | }
3566 | .bi-suit-heart-fill::before {
3567 | content: '\f59d';
3568 | }
3569 | .bi-suit-heart::before {
3570 | content: '\f59e';
3571 | }
3572 | .bi-suit-spade-fill::before {
3573 | content: '\f59f';
3574 | }
3575 | .bi-suit-spade::before {
3576 | content: '\f5a0';
3577 | }
3578 | .bi-sun-fill::before {
3579 | content: '\f5a1';
3580 | }
3581 | .bi-sun::before {
3582 | content: '\f5a2';
3583 | }
3584 | .bi-sunglasses::before {
3585 | content: '\f5a3';
3586 | }
3587 | .bi-sunrise-fill::before {
3588 | content: '\f5a4';
3589 | }
3590 | .bi-sunrise::before {
3591 | content: '\f5a5';
3592 | }
3593 | .bi-sunset-fill::before {
3594 | content: '\f5a6';
3595 | }
3596 | .bi-sunset::before {
3597 | content: '\f5a7';
3598 | }
3599 | .bi-symmetry-horizontal::before {
3600 | content: '\f5a8';
3601 | }
3602 | .bi-symmetry-vertical::before {
3603 | content: '\f5a9';
3604 | }
3605 | .bi-table::before {
3606 | content: '\f5aa';
3607 | }
3608 | .bi-tablet-fill::before {
3609 | content: '\f5ab';
3610 | }
3611 | .bi-tablet-landscape-fill::before {
3612 | content: '\f5ac';
3613 | }
3614 | .bi-tablet-landscape::before {
3615 | content: '\f5ad';
3616 | }
3617 | .bi-tablet::before {
3618 | content: '\f5ae';
3619 | }
3620 | .bi-tag-fill::before {
3621 | content: '\f5af';
3622 | }
3623 | .bi-tag::before {
3624 | content: '\f5b0';
3625 | }
3626 | .bi-tags-fill::before {
3627 | content: '\f5b1';
3628 | }
3629 | .bi-tags::before {
3630 | content: '\f5b2';
3631 | }
3632 | .bi-telegram::before {
3633 | content: '\f5b3';
3634 | }
3635 | .bi-telephone-fill::before {
3636 | content: '\f5b4';
3637 | }
3638 | .bi-telephone-forward-fill::before {
3639 | content: '\f5b5';
3640 | }
3641 | .bi-telephone-forward::before {
3642 | content: '\f5b6';
3643 | }
3644 | .bi-telephone-inbound-fill::before {
3645 | content: '\f5b7';
3646 | }
3647 | .bi-telephone-inbound::before {
3648 | content: '\f5b8';
3649 | }
3650 | .bi-telephone-minus-fill::before {
3651 | content: '\f5b9';
3652 | }
3653 | .bi-telephone-minus::before {
3654 | content: '\f5ba';
3655 | }
3656 | .bi-telephone-outbound-fill::before {
3657 | content: '\f5bb';
3658 | }
3659 | .bi-telephone-outbound::before {
3660 | content: '\f5bc';
3661 | }
3662 | .bi-telephone-plus-fill::before {
3663 | content: '\f5bd';
3664 | }
3665 | .bi-telephone-plus::before {
3666 | content: '\f5be';
3667 | }
3668 | .bi-telephone-x-fill::before {
3669 | content: '\f5bf';
3670 | }
3671 | .bi-telephone-x::before {
3672 | content: '\f5c0';
3673 | }
3674 | .bi-telephone::before {
3675 | content: '\f5c1';
3676 | }
3677 | .bi-terminal-fill::before {
3678 | content: '\f5c2';
3679 | }
3680 | .bi-terminal::before {
3681 | content: '\f5c3';
3682 | }
3683 | .bi-text-center::before {
3684 | content: '\f5c4';
3685 | }
3686 | .bi-text-indent-left::before {
3687 | content: '\f5c5';
3688 | }
3689 | .bi-text-indent-right::before {
3690 | content: '\f5c6';
3691 | }
3692 | .bi-text-left::before {
3693 | content: '\f5c7';
3694 | }
3695 | .bi-text-paragraph::before {
3696 | content: '\f5c8';
3697 | }
3698 | .bi-text-right::before {
3699 | content: '\f5c9';
3700 | }
3701 | .bi-textarea-resize::before {
3702 | content: '\f5ca';
3703 | }
3704 | .bi-textarea-t::before {
3705 | content: '\f5cb';
3706 | }
3707 | .bi-textarea::before {
3708 | content: '\f5cc';
3709 | }
3710 | .bi-thermometer-half::before {
3711 | content: '\f5cd';
3712 | }
3713 | .bi-thermometer-high::before {
3714 | content: '\f5ce';
3715 | }
3716 | .bi-thermometer-low::before {
3717 | content: '\f5cf';
3718 | }
3719 | .bi-thermometer-snow::before {
3720 | content: '\f5d0';
3721 | }
3722 | .bi-thermometer-sun::before {
3723 | content: '\f5d1';
3724 | }
3725 | .bi-thermometer::before {
3726 | content: '\f5d2';
3727 | }
3728 | .bi-three-dots-vertical::before {
3729 | content: '\f5d3';
3730 | }
3731 | .bi-three-dots::before {
3732 | content: '\f5d4';
3733 | }
3734 | .bi-toggle-off::before {
3735 | content: '\f5d5';
3736 | }
3737 | .bi-toggle-on::before {
3738 | content: '\f5d6';
3739 | }
3740 | .bi-toggle2-off::before {
3741 | content: '\f5d7';
3742 | }
3743 | .bi-toggle2-on::before {
3744 | content: '\f5d8';
3745 | }
3746 | .bi-toggles::before {
3747 | content: '\f5d9';
3748 | }
3749 | .bi-toggles2::before {
3750 | content: '\f5da';
3751 | }
3752 | .bi-tools::before {
3753 | content: '\f5db';
3754 | }
3755 | .bi-tornado::before {
3756 | content: '\f5dc';
3757 | }
3758 | .bi-trash-fill::before {
3759 | content: '\f5dd';
3760 | }
3761 | .bi-trash::before {
3762 | content: '\f5de';
3763 | }
3764 | .bi-trash2-fill::before {
3765 | content: '\f5df';
3766 | }
3767 | .bi-trash2::before {
3768 | content: '\f5e0';
3769 | }
3770 | .bi-tree-fill::before {
3771 | content: '\f5e1';
3772 | }
3773 | .bi-tree::before {
3774 | content: '\f5e2';
3775 | }
3776 | .bi-triangle-fill::before {
3777 | content: '\f5e3';
3778 | }
3779 | .bi-triangle-half::before {
3780 | content: '\f5e4';
3781 | }
3782 | .bi-triangle::before {
3783 | content: '\f5e5';
3784 | }
3785 | .bi-trophy-fill::before {
3786 | content: '\f5e6';
3787 | }
3788 | .bi-trophy::before {
3789 | content: '\f5e7';
3790 | }
3791 | .bi-tropical-storm::before {
3792 | content: '\f5e8';
3793 | }
3794 | .bi-truck-flatbed::before {
3795 | content: '\f5e9';
3796 | }
3797 | .bi-truck::before {
3798 | content: '\f5ea';
3799 | }
3800 | .bi-tsunami::before {
3801 | content: '\f5eb';
3802 | }
3803 | .bi-tv-fill::before {
3804 | content: '\f5ec';
3805 | }
3806 | .bi-tv::before {
3807 | content: '\f5ed';
3808 | }
3809 | .bi-twitch::before {
3810 | content: '\f5ee';
3811 | }
3812 | .bi-twitter::before {
3813 | content: '\f5ef';
3814 | }
3815 | .bi-type-bold::before {
3816 | content: '\f5f0';
3817 | }
3818 | .bi-type-h1::before {
3819 | content: '\f5f1';
3820 | }
3821 | .bi-type-h2::before {
3822 | content: '\f5f2';
3823 | }
3824 | .bi-type-h3::before {
3825 | content: '\f5f3';
3826 | }
3827 | .bi-type-italic::before {
3828 | content: '\f5f4';
3829 | }
3830 | .bi-type-strikethrough::before {
3831 | content: '\f5f5';
3832 | }
3833 | .bi-type-underline::before {
3834 | content: '\f5f6';
3835 | }
3836 | .bi-type::before {
3837 | content: '\f5f7';
3838 | }
3839 | .bi-ui-checks-grid::before {
3840 | content: '\f5f8';
3841 | }
3842 | .bi-ui-checks::before {
3843 | content: '\f5f9';
3844 | }
3845 | .bi-ui-radios-grid::before {
3846 | content: '\f5fa';
3847 | }
3848 | .bi-ui-radios::before {
3849 | content: '\f5fb';
3850 | }
3851 | .bi-umbrella-fill::before {
3852 | content: '\f5fc';
3853 | }
3854 | .bi-umbrella::before {
3855 | content: '\f5fd';
3856 | }
3857 | .bi-union::before {
3858 | content: '\f5fe';
3859 | }
3860 | .bi-unlock-fill::before {
3861 | content: '\f5ff';
3862 | }
3863 | .bi-unlock::before {
3864 | content: '\f600';
3865 | }
3866 | .bi-upc-scan::before {
3867 | content: '\f601';
3868 | }
3869 | .bi-upc::before {
3870 | content: '\f602';
3871 | }
3872 | .bi-upload::before {
3873 | content: '\f603';
3874 | }
3875 | .bi-vector-pen::before {
3876 | content: '\f604';
3877 | }
3878 | .bi-view-list::before {
3879 | content: '\f605';
3880 | }
3881 | .bi-view-stacked::before {
3882 | content: '\f606';
3883 | }
3884 | .bi-vinyl-fill::before {
3885 | content: '\f607';
3886 | }
3887 | .bi-vinyl::before {
3888 | content: '\f608';
3889 | }
3890 | .bi-voicemail::before {
3891 | content: '\f609';
3892 | }
3893 | .bi-volume-down-fill::before {
3894 | content: '\f60a';
3895 | }
3896 | .bi-volume-down::before {
3897 | content: '\f60b';
3898 | }
3899 | .bi-volume-mute-fill::before {
3900 | content: '\f60c';
3901 | }
3902 | .bi-volume-mute::before {
3903 | content: '\f60d';
3904 | }
3905 | .bi-volume-off-fill::before {
3906 | content: '\f60e';
3907 | }
3908 | .bi-volume-off::before {
3909 | content: '\f60f';
3910 | }
3911 | .bi-volume-up-fill::before {
3912 | content: '\f610';
3913 | }
3914 | .bi-volume-up::before {
3915 | content: '\f611';
3916 | }
3917 | .bi-vr::before {
3918 | content: '\f612';
3919 | }
3920 | .bi-wallet-fill::before {
3921 | content: '\f613';
3922 | }
3923 | .bi-wallet::before {
3924 | content: '\f614';
3925 | }
3926 | .bi-wallet2::before {
3927 | content: '\f615';
3928 | }
3929 | .bi-watch::before {
3930 | content: '\f616';
3931 | }
3932 | .bi-water::before {
3933 | content: '\f617';
3934 | }
3935 | .bi-whatsapp::before {
3936 | content: '\f618';
3937 | }
3938 | .bi-wifi-1::before {
3939 | content: '\f619';
3940 | }
3941 | .bi-wifi-2::before {
3942 | content: '\f61a';
3943 | }
3944 | .bi-wifi-off::before {
3945 | content: '\f61b';
3946 | }
3947 | .bi-wifi::before {
3948 | content: '\f61c';
3949 | }
3950 | .bi-wind::before {
3951 | content: '\f61d';
3952 | }
3953 | .bi-window-dock::before {
3954 | content: '\f61e';
3955 | }
3956 | .bi-window-sidebar::before {
3957 | content: '\f61f';
3958 | }
3959 | .bi-window::before {
3960 | content: '\f620';
3961 | }
3962 | .bi-wrench::before {
3963 | content: '\f621';
3964 | }
3965 | .bi-x-circle-fill::before {
3966 | content: '\f622';
3967 | }
3968 | .bi-x-circle::before {
3969 | content: '\f623';
3970 | }
3971 | .bi-x-diamond-fill::before {
3972 | content: '\f624';
3973 | }
3974 | .bi-x-diamond::before {
3975 | content: '\f625';
3976 | }
3977 | .bi-x-octagon-fill::before {
3978 | content: '\f626';
3979 | }
3980 | .bi-x-octagon::before {
3981 | content: '\f627';
3982 | }
3983 | .bi-x-square-fill::before {
3984 | content: '\f628';
3985 | }
3986 | .bi-x-square::before {
3987 | content: '\f629';
3988 | }
3989 | .bi-x::before {
3990 | content: '\f62a';
3991 | }
3992 | .bi-youtube::before {
3993 | content: '\f62b';
3994 | }
3995 | .bi-zoom-in::before {
3996 | content: '\f62c';
3997 | }
3998 | .bi-zoom-out::before {
3999 | content: '\f62d';
4000 | }
4001 | .bi-bank::before {
4002 | content: '\f62e';
4003 | }
4004 | .bi-bank2::before {
4005 | content: '\f62f';
4006 | }
4007 | .bi-bell-slash-fill::before {
4008 | content: '\f630';
4009 | }
4010 | .bi-bell-slash::before {
4011 | content: '\f631';
4012 | }
4013 | .bi-cash-coin::before {
4014 | content: '\f632';
4015 | }
4016 | .bi-check-lg::before {
4017 | content: '\f633';
4018 | }
4019 | .bi-coin::before {
4020 | content: '\f634';
4021 | }
4022 | .bi-currency-bitcoin::before {
4023 | content: '\f635';
4024 | }
4025 | .bi-currency-dollar::before {
4026 | content: '\f636';
4027 | }
4028 | .bi-currency-euro::before {
4029 | content: '\f637';
4030 | }
4031 | .bi-currency-exchange::before {
4032 | content: '\f638';
4033 | }
4034 | .bi-currency-pound::before {
4035 | content: '\f639';
4036 | }
4037 | .bi-currency-yen::before {
4038 | content: '\f63a';
4039 | }
4040 | .bi-dash-lg::before {
4041 | content: '\f63b';
4042 | }
4043 | .bi-exclamation-lg::before {
4044 | content: '\f63c';
4045 | }
4046 | .bi-file-earmark-pdf-fill::before {
4047 | content: '\f63d';
4048 | }
4049 | .bi-file-earmark-pdf::before {
4050 | content: '\f63e';
4051 | }
4052 | .bi-file-pdf-fill::before {
4053 | content: '\f63f';
4054 | }
4055 | .bi-file-pdf::before {
4056 | content: '\f640';
4057 | }
4058 | .bi-gender-ambiguous::before {
4059 | content: '\f641';
4060 | }
4061 | .bi-gender-female::before {
4062 | content: '\f642';
4063 | }
4064 | .bi-gender-male::before {
4065 | content: '\f643';
4066 | }
4067 | .bi-gender-trans::before {
4068 | content: '\f644';
4069 | }
4070 | .bi-headset-vr::before {
4071 | content: '\f645';
4072 | }
4073 | .bi-info-lg::before {
4074 | content: '\f646';
4075 | }
4076 | .bi-mastodon::before {
4077 | content: '\f647';
4078 | }
4079 | .bi-messenger::before {
4080 | content: '\f648';
4081 | }
4082 | .bi-piggy-bank-fill::before {
4083 | content: '\f649';
4084 | }
4085 | .bi-piggy-bank::before {
4086 | content: '\f64a';
4087 | }
4088 | .bi-pin-map-fill::before {
4089 | content: '\f64b';
4090 | }
4091 | .bi-pin-map::before {
4092 | content: '\f64c';
4093 | }
4094 | .bi-plus-lg::before {
4095 | content: '\f64d';
4096 | }
4097 | .bi-question-lg::before {
4098 | content: '\f64e';
4099 | }
4100 | .bi-recycle::before {
4101 | content: '\f64f';
4102 | }
4103 | .bi-reddit::before {
4104 | content: '\f650';
4105 | }
4106 | .bi-safe-fill::before {
4107 | content: '\f651';
4108 | }
4109 | .bi-safe2-fill::before {
4110 | content: '\f652';
4111 | }
4112 | .bi-safe2::before {
4113 | content: '\f653';
4114 | }
4115 | .bi-sd-card-fill::before {
4116 | content: '\f654';
4117 | }
4118 | .bi-sd-card::before {
4119 | content: '\f655';
4120 | }
4121 | .bi-skype::before {
4122 | content: '\f656';
4123 | }
4124 | .bi-slash-lg::before {
4125 | content: '\f657';
4126 | }
4127 | .bi-translate::before {
4128 | content: '\f658';
4129 | }
4130 | .bi-x-lg::before {
4131 | content: '\f659';
4132 | }
4133 | .bi-safe::before {
4134 | content: '\f65a';
4135 | }
4136 | .bi-apple::before {
4137 | content: '\f65b';
4138 | }
4139 | .bi-microsoft::before {
4140 | content: '\f65d';
4141 | }
4142 | .bi-windows::before {
4143 | content: '\f65e';
4144 | }
4145 | .bi-behance::before {
4146 | content: '\f65c';
4147 | }
4148 | .bi-dribbble::before {
4149 | content: '\f65f';
4150 | }
4151 | .bi-line::before {
4152 | content: '\f660';
4153 | }
4154 | .bi-medium::before {
4155 | content: '\f661';
4156 | }
4157 | .bi-paypal::before {
4158 | content: '\f662';
4159 | }
4160 | .bi-pinterest::before {
4161 | content: '\f663';
4162 | }
4163 | .bi-signal::before {
4164 | content: '\f664';
4165 | }
4166 | .bi-snapchat::before {
4167 | content: '\f665';
4168 | }
4169 | .bi-spotify::before {
4170 | content: '\f666';
4171 | }
4172 | .bi-stack-overflow::before {
4173 | content: '\f667';
4174 | }
4175 | .bi-strava::before {
4176 | content: '\f668';
4177 | }
4178 | .bi-wordpress::before {
4179 | content: '\f669';
4180 | }
4181 | .bi-vimeo::before {
4182 | content: '\f66a';
4183 | }
4184 | .bi-activity::before {
4185 | content: '\f66b';
4186 | }
4187 | .bi-easel2-fill::before {
4188 | content: '\f66c';
4189 | }
4190 | .bi-easel2::before {
4191 | content: '\f66d';
4192 | }
4193 | .bi-easel3-fill::before {
4194 | content: '\f66e';
4195 | }
4196 | .bi-easel3::before {
4197 | content: '\f66f';
4198 | }
4199 | .bi-fan::before {
4200 | content: '\f670';
4201 | }
4202 | .bi-fingerprint::before {
4203 | content: '\f671';
4204 | }
4205 | .bi-graph-down-arrow::before {
4206 | content: '\f672';
4207 | }
4208 | .bi-graph-up-arrow::before {
4209 | content: '\f673';
4210 | }
4211 | .bi-hypnotize::before {
4212 | content: '\f674';
4213 | }
4214 | .bi-magic::before {
4215 | content: '\f675';
4216 | }
4217 | .bi-person-rolodex::before {
4218 | content: '\f676';
4219 | }
4220 | .bi-person-video::before {
4221 | content: '\f677';
4222 | }
4223 | .bi-person-video2::before {
4224 | content: '\f678';
4225 | }
4226 | .bi-person-video3::before {
4227 | content: '\f679';
4228 | }
4229 | .bi-person-workspace::before {
4230 | content: '\f67a';
4231 | }
4232 | .bi-radioactive::before {
4233 | content: '\f67b';
4234 | }
4235 | .bi-webcam-fill::before {
4236 | content: '\f67c';
4237 | }
4238 | .bi-webcam::before {
4239 | content: '\f67d';
4240 | }
4241 | .bi-yin-yang::before {
4242 | content: '\f67e';
4243 | }
4244 | .bi-bandaid-fill::before {
4245 | content: '\f680';
4246 | }
4247 | .bi-bandaid::before {
4248 | content: '\f681';
4249 | }
4250 | .bi-bluetooth::before {
4251 | content: '\f682';
4252 | }
4253 | .bi-body-text::before {
4254 | content: '\f683';
4255 | }
4256 | .bi-boombox::before {
4257 | content: '\f684';
4258 | }
4259 | .bi-boxes::before {
4260 | content: '\f685';
4261 | }
4262 | .bi-dpad-fill::before {
4263 | content: '\f686';
4264 | }
4265 | .bi-dpad::before {
4266 | content: '\f687';
4267 | }
4268 | .bi-ear-fill::before {
4269 | content: '\f688';
4270 | }
4271 | .bi-ear::before {
4272 | content: '\f689';
4273 | }
4274 | .bi-envelope-check-1::before {
4275 | content: '\f68a';
4276 | }
4277 | .bi-envelope-check-fill::before {
4278 | content: '\f68b';
4279 | }
4280 | .bi-envelope-check::before {
4281 | content: '\f68c';
4282 | }
4283 | .bi-envelope-dash-1::before {
4284 | content: '\f68d';
4285 | }
4286 | .bi-envelope-dash-fill::before {
4287 | content: '\f68e';
4288 | }
4289 | .bi-envelope-dash::before {
4290 | content: '\f68f';
4291 | }
4292 | .bi-envelope-exclamation-1::before {
4293 | content: '\f690';
4294 | }
4295 | .bi-envelope-exclamation-fill::before {
4296 | content: '\f691';
4297 | }
4298 | .bi-envelope-exclamation::before {
4299 | content: '\f692';
4300 | }
4301 | .bi-envelope-plus-fill::before {
4302 | content: '\f693';
4303 | }
4304 | .bi-envelope-plus::before {
4305 | content: '\f694';
4306 | }
4307 | .bi-envelope-slash-1::before {
4308 | content: '\f695';
4309 | }
4310 | .bi-envelope-slash-fill::before {
4311 | content: '\f696';
4312 | }
4313 | .bi-envelope-slash::before {
4314 | content: '\f697';
4315 | }
4316 | .bi-envelope-x-1::before {
4317 | content: '\f698';
4318 | }
4319 | .bi-envelope-x-fill::before {
4320 | content: '\f699';
4321 | }
4322 | .bi-envelope-x::before {
4323 | content: '\f69a';
4324 | }
4325 | .bi-explicit-fill::before {
4326 | content: '\f69b';
4327 | }
4328 | .bi-explicit::before {
4329 | content: '\f69c';
4330 | }
4331 | .bi-git::before {
4332 | content: '\f69d';
4333 | }
4334 | .bi-infinity::before {
4335 | content: '\f69e';
4336 | }
4337 | .bi-list-columns-reverse::before {
4338 | content: '\f69f';
4339 | }
4340 | .bi-list-columns::before {
4341 | content: '\f6a0';
4342 | }
4343 | .bi-meta::before {
4344 | content: '\f6a1';
4345 | }
4346 | .bi-mortorboard-fill::before {
4347 | content: '\f6a2';
4348 | }
4349 | .bi-mortorboard::before {
4350 | content: '\f6a3';
4351 | }
4352 | .bi-nintendo-switch::before {
4353 | content: '\f6a4';
4354 | }
4355 | .bi-pc-display-horizontal::before {
4356 | content: '\f6a5';
4357 | }
4358 | .bi-pc-display::before {
4359 | content: '\f6a6';
4360 | }
4361 | .bi-pc-horizontal::before {
4362 | content: '\f6a7';
4363 | }
4364 | .bi-pc::before {
4365 | content: '\f6a8';
4366 | }
4367 | .bi-playstation::before {
4368 | content: '\f6a9';
4369 | }
4370 | .bi-plus-slash-minus::before {
4371 | content: '\f6aa';
4372 | }
4373 | .bi-projector-fill::before {
4374 | content: '\f6ab';
4375 | }
4376 | .bi-projector::before {
4377 | content: '\f6ac';
4378 | }
4379 | .bi-qr-code-scan::before {
4380 | content: '\f6ad';
4381 | }
4382 | .bi-qr-code::before {
4383 | content: '\f6ae';
4384 | }
4385 | .bi-quora::before {
4386 | content: '\f6af';
4387 | }
4388 | .bi-quote::before {
4389 | content: '\f6b0';
4390 | }
4391 | .bi-robot::before {
4392 | content: '\f6b1';
4393 | }
4394 | .bi-send-check-fill::before {
4395 | content: '\f6b2';
4396 | }
4397 | .bi-send-check::before {
4398 | content: '\f6b3';
4399 | }
4400 | .bi-send-dash-fill::before {
4401 | content: '\f6b4';
4402 | }
4403 | .bi-send-dash::before {
4404 | content: '\f6b5';
4405 | }
4406 | .bi-send-exclamation-1::before {
4407 | content: '\f6b6';
4408 | }
4409 | .bi-send-exclamation-fill::before {
4410 | content: '\f6b7';
4411 | }
4412 | .bi-send-exclamation::before {
4413 | content: '\f6b8';
4414 | }
4415 | .bi-send-fill::before {
4416 | content: '\f6b9';
4417 | }
4418 | .bi-send-plus-fill::before {
4419 | content: '\f6ba';
4420 | }
4421 | .bi-send-plus::before {
4422 | content: '\f6bb';
4423 | }
4424 | .bi-send-slash-fill::before {
4425 | content: '\f6bc';
4426 | }
4427 | .bi-send-slash::before {
4428 | content: '\f6bd';
4429 | }
4430 | .bi-send-x-fill::before {
4431 | content: '\f6be';
4432 | }
4433 | .bi-send-x::before {
4434 | content: '\f6bf';
4435 | }
4436 | .bi-send::before {
4437 | content: '\f6c0';
4438 | }
4439 | .bi-steam::before {
4440 | content: '\f6c1';
4441 | }
4442 | .bi-terminal-dash-1::before {
4443 | content: '\f6c2';
4444 | }
4445 | .bi-terminal-dash::before {
4446 | content: '\f6c3';
4447 | }
4448 | .bi-terminal-plus::before {
4449 | content: '\f6c4';
4450 | }
4451 | .bi-terminal-split::before {
4452 | content: '\f6c5';
4453 | }
4454 | .bi-ticket-detailed-fill::before {
4455 | content: '\f6c6';
4456 | }
4457 | .bi-ticket-detailed::before {
4458 | content: '\f6c7';
4459 | }
4460 | .bi-ticket-fill::before {
4461 | content: '\f6c8';
4462 | }
4463 | .bi-ticket-perforated-fill::before {
4464 | content: '\f6c9';
4465 | }
4466 | .bi-ticket-perforated::before {
4467 | content: '\f6ca';
4468 | }
4469 | .bi-ticket::before {
4470 | content: '\f6cb';
4471 | }
4472 | .bi-tiktok::before {
4473 | content: '\f6cc';
4474 | }
4475 | .bi-window-dash::before {
4476 | content: '\f6cd';
4477 | }
4478 | .bi-window-desktop::before {
4479 | content: '\f6ce';
4480 | }
4481 | .bi-window-fullscreen::before {
4482 | content: '\f6cf';
4483 | }
4484 | .bi-window-plus::before {
4485 | content: '\f6d0';
4486 | }
4487 | .bi-window-split::before {
4488 | content: '\f6d1';
4489 | }
4490 | .bi-window-stack::before {
4491 | content: '\f6d2';
4492 | }
4493 | .bi-window-x::before {
4494 | content: '\f6d3';
4495 | }
4496 | .bi-xbox::before {
4497 | content: '\f6d4';
4498 | }
4499 | .bi-ethernet::before {
4500 | content: '\f6d5';
4501 | }
4502 | .bi-hdmi-fill::before {
4503 | content: '\f6d6';
4504 | }
4505 | .bi-hdmi::before {
4506 | content: '\f6d7';
4507 | }
4508 | .bi-usb-c-fill::before {
4509 | content: '\f6d8';
4510 | }
4511 | .bi-usb-c::before {
4512 | content: '\f6d9';
4513 | }
4514 | .bi-usb-fill::before {
4515 | content: '\f6da';
4516 | }
4517 | .bi-usb-plug-fill::before {
4518 | content: '\f6db';
4519 | }
4520 | .bi-usb-plug::before {
4521 | content: '\f6dc';
4522 | }
4523 | .bi-usb-symbol::before {
4524 | content: '\f6dd';
4525 | }
4526 | .bi-usb::before {
4527 | content: '\f6de';
4528 | }
4529 | .bi-boombox-fill::before {
4530 | content: '\f6df';
4531 | }
4532 | .bi-displayport-1::before {
4533 | content: '\f6e0';
4534 | }
4535 | .bi-displayport::before {
4536 | content: '\f6e1';
4537 | }
4538 | .bi-gpu-card::before {
4539 | content: '\f6e2';
4540 | }
4541 | .bi-memory::before {
4542 | content: '\f6e3';
4543 | }
4544 | .bi-modem-fill::before {
4545 | content: '\f6e4';
4546 | }
4547 | .bi-modem::before {
4548 | content: '\f6e5';
4549 | }
4550 | .bi-motherboard-fill::before {
4551 | content: '\f6e6';
4552 | }
4553 | .bi-motherboard::before {
4554 | content: '\f6e7';
4555 | }
4556 | .bi-optical-audio-fill::before {
4557 | content: '\f6e8';
4558 | }
4559 | .bi-optical-audio::before {
4560 | content: '\f6e9';
4561 | }
4562 | .bi-pci-card::before {
4563 | content: '\f6ea';
4564 | }
4565 | .bi-router-fill::before {
4566 | content: '\f6eb';
4567 | }
4568 | .bi-router::before {
4569 | content: '\f6ec';
4570 | }
4571 | .bi-ssd-fill::before {
4572 | content: '\f6ed';
4573 | }
4574 | .bi-ssd::before {
4575 | content: '\f6ee';
4576 | }
4577 | .bi-thunderbolt-fill::before {
4578 | content: '\f6ef';
4579 | }
4580 | .bi-thunderbolt::before {
4581 | content: '\f6f0';
4582 | }
4583 | .bi-usb-drive-fill::before {
4584 | content: '\f6f1';
4585 | }
4586 | .bi-usb-drive::before {
4587 | content: '\f6f2';
4588 | }
4589 | .bi-usb-micro-fill::before {
4590 | content: '\f6f3';
4591 | }
4592 | .bi-usb-micro::before {
4593 | content: '\f6f4';
4594 | }
4595 | .bi-usb-mini-fill::before {
4596 | content: '\f6f5';
4597 | }
4598 | .bi-usb-mini::before {
4599 | content: '\f6f6';
4600 | }
4601 | .bi-cloud-haze2::before {
4602 | content: '\f6f7';
4603 | }
4604 | .bi-device-hdd-fill::before {
4605 | content: '\f6f8';
4606 | }
4607 | .bi-device-hdd::before {
4608 | content: '\f6f9';
4609 | }
4610 | .bi-device-ssd-fill::before {
4611 | content: '\f6fa';
4612 | }
4613 | .bi-device-ssd::before {
4614 | content: '\f6fb';
4615 | }
4616 | .bi-displayport-fill::before {
4617 | content: '\f6fc';
4618 | }
4619 | .bi-mortarboard-fill::before {
4620 | content: '\f6fd';
4621 | }
4622 | .bi-mortarboard::before {
4623 | content: '\f6fe';
4624 | }
4625 | .bi-terminal-x::before {
4626 | content: '\f6ff';
4627 | }
4628 |
--------------------------------------------------------------------------------