From a79b316a45e949bf3a11af5c1816f703c24b6eb2 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Sat, 8 Jun 2024 00:11:10 +0900 Subject: [PATCH] =?UTF-8?q?Chore:=20JS=20project=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.json | 31 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/PULL_REQUEST_TEMPLATE.md | 17 + .gitignore | 26 + .prettierrc.json | 38 + README.md | 322 ++ index.html | 13 + package.json | 52 + pnpm-lock.yaml | 4696 +++++++++++++++++ public/ZZan.svg | 9 + src/App.jsx | 16 + src/Router.jsx | 98 + src/apis/AxiosClient.js | 64 + src/apis/auth/auth.api.js | 44 + .../detail-challenge/detail.challenge.api.js | 23 + .../detail-challenge/ranking.challenge.api.js | 15 + src/apis/list-challenge/list.challenge.api.js | 14 + src/apis/my-challenge/my.challenge.api.js | 14 + src/apis/rank/rank.api.js | 13 + .../record-challenge/record.challenge.api.js | 33 + src/apis/record-challenge/verification.js | 29 + src/apis/review/review.challenge.api.js | 38 + src/apis/user/user.api.js | 49 + src/assets/Challenge-Shorts.svg | 5 + src/assets/DashBoard.svg | 5 + src/assets/Default-Image.svg | 9 + src/assets/Home.svg | 10 + src/assets/My-Challenge.svg | 10 + src/assets/Rank/1st-Trophy.svg | 15 + src/assets/Rank/2nd-Trophy.svg | 16 + src/assets/Rank/3rd-Trophy.svg | 16 + src/assets/Ranking.svg | 10 + src/assets/StampActive.svg | 27 + src/assets/StampInactive.svg | 10 + src/assets/UserImage.svg | 9 + src/assets/challenge/Challange-Img.png | Bin 0 -> 117146 bytes src/assets/challenge/Start-Icon.svg | 5 + src/assets/challenge/ZZAN-Black.png | Bin 0 -> 4130 bytes src/assets/challenge/ZZAN-Green.png | Bin 0 -> 3804 bytes src/assets/dummy.png | Bin 0 -> 68792 bytes src/assets/header/Prev-Icon.svg | 3 + src/assets/login/kakao.svg | 4 + src/assets/main/Down-Arrow.svg | 3 + src/assets/main/Eco-Logo.svg | 3 + src/assets/main/Heart-Logo.svg | 3 + src/assets/main/Home.svg | 10 + src/assets/main/My-Challenge.svg | 10 + src/assets/main/Nanum-Logo.svg | 3 + src/assets/main/Ranking.svg | 10 + src/assets/main/Star-Icon.svg | 5 + src/assets/main/Volunteer-Logo.svg | 9 + src/assets/main/ZZAN-Default.png | Bin 0 -> 3804 bytes src/assets/main/ZZAN-Logo.svg | 27 + src/assets/main/ZZAN-Profile.png | Bin 0 -> 11677 bytes src/components/header/Header.jsx | 27 + src/components/header/styles.js | 57 + src/components/modal/UpdateNicknameModal.jsx | 89 + src/components/modal/styles.js | 26 + src/components/nav-bar/navigate-Bar.jsx | 59 + src/components/nav-bar/styles.js | 40 + src/components/postModal/PostModal.jsx | 26 + src/components/postModal/PostModal.module.css | 37 + src/components/tab/slide-Tab.jsx | 58 + src/components/tab/styles.js | 71 + src/components/top-bar/styles.js | 42 + src/components/top-bar/top-Bar.jsx | 26 + src/components/userInfo/TierInfo.jsx | 69 + src/constants/Dummy.js | 123 + src/constants/TierSchema.js | 166 + src/constants/URI.js | 6 + src/hooks/useBottomSheet.jsx | 19 + src/main.jsx | 5 + src/pages/dashboard/Dashboard.jsx | 21 + src/pages/dashboard/components/Record.jsx | 25 + src/pages/dashboard/components/Styles.js | 127 + src/pages/dashboard/components/UserInfo.jsx | 64 + src/pages/dashboard/styles.js | 6 + .../detail-challenge/ChallengeDetailPage.jsx | 60 + .../components/difficulty/Difficulty.jsx | 62 + .../components/difficulty/styles.js | 85 + .../components/userItem/UserItem.jsx | 24 + .../components/userItem/styles.js | 65 + .../description/Description.jsx | 38 + .../detail-challenge/description/styles.js | 64 + .../detail-challenge/ranking/Ranking.jsx | 40 + src/pages/detail-challenge/ranking/styles.js | 31 + src/pages/detail-challenge/styles.js | 43 + .../components/CategoryButton.jsx | 63 + .../list-challenge/components/Contents.jsx | 25 + src/pages/list-challenge/components/styles.js | 25 + src/pages/list-challenge/list-challenge.jsx | 49 + src/pages/list-challenge/styles.js | 53 + .../ListRecordChallenge.jsx | 24 + .../components/ListItem.jsx | 22 + .../components/Styles.js | 44 + src/pages/list-record-challenge/styles.js | 20 + src/pages/login/LoginPage.jsx | 22 + src/pages/login/RedirectPage.jsx | 17 + src/pages/login/style.js | 34 + src/pages/main/MainPage.jsx | 20 + src/pages/main/components/Category.jsx | 43 + src/pages/main/components/MainTitle.jsx | 26 + src/pages/main/components/Review.jsx | 54 + src/pages/main/components/Strick-calendar.jsx | 119 + src/pages/main/components/Strick.jsx | 31 + src/pages/main/components/Teer.jsx | 90 + src/pages/main/components/styles.js | 342 ++ src/pages/main/style.js | 7 + src/pages/my-challenge/MyChallenge.jsx | 44 + .../my-challenge/components/ChallengeList.jsx | 38 + src/pages/my-challenge/components/styles.js | 104 + src/pages/my-challenge/styles.js | 15 + src/pages/rank/Rank.jsx | 22 + src/pages/rank/components/AllRank.jsx | 51 + src/pages/rank/components/HighRank.jsx | 48 + src/pages/rank/components/MyRank.jsx | 41 + src/pages/rank/components/UserRank.jsx | 48 + src/pages/rank/components/styles.js | 167 + src/pages/rank/styles.js | 26 + .../record-challenge/ChallengeRecordPage.jsx | 42 + .../bottomsheet/BottomSheet.jsx | 40 + .../record-challenge/bottomsheet/Header.jsx | 11 + .../record-challenge/bottomsheet/styles.js | 85 + .../record-challenge/components/Stamp.jsx | 15 + .../record-challenge/components/styles.js | 8 + .../stampboard/StampBoard.jsx | 102 + .../record-challenge/stampboard/styles.js | 75 + src/pages/record-challenge/styles.js | 26 + .../verification/Verification.jsx | 70 + .../record-challenge/verification/styles.js | 100 + src/pages/review/review-list/ReviewList.jsx | 44 + .../components/reviewItem/ReviewItem.jsx | 32 + .../components/reviewItem/styles.js | 72 + .../components/reviewRating/ReviewRating.jsx | 67 + .../components/reviewRating/styles.js | 78 + src/pages/review/review-list/styles.js | 33 + .../review/writingReview/WritingReview.jsx | 84 + src/pages/review/writingReview/styles.js | 102 + .../shorts-challenge/Shorts-challenge.jsx | 20 + .../components/ChallengeContents.jsx | 32 + .../components/ChallengeImage.jsx | 14 + .../components/ChallengeInfo.jsx | 26 + .../shorts-challenge/components/styles.js | 82 + src/pages/shorts-challenge/styles.js | 8 + src/store/useStore.js | 14 + src/store/useUserInfoStore.js | 22 + src/styles/GlobalStyle.jsx | 94 + vite.config.js | 22 + 148 files changed, 10766 insertions(+) create mode 100644 .eslintrc.json create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .gitignore create mode 100644 .prettierrc.json create mode 100644 README.md create mode 100644 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/ZZan.svg create mode 100644 src/App.jsx create mode 100644 src/Router.jsx create mode 100644 src/apis/AxiosClient.js create mode 100644 src/apis/auth/auth.api.js create mode 100644 src/apis/detail-challenge/detail.challenge.api.js create mode 100644 src/apis/detail-challenge/ranking.challenge.api.js create mode 100644 src/apis/list-challenge/list.challenge.api.js create mode 100644 src/apis/my-challenge/my.challenge.api.js create mode 100644 src/apis/rank/rank.api.js create mode 100644 src/apis/record-challenge/record.challenge.api.js create mode 100644 src/apis/record-challenge/verification.js create mode 100644 src/apis/review/review.challenge.api.js create mode 100644 src/apis/user/user.api.js create mode 100644 src/assets/Challenge-Shorts.svg create mode 100644 src/assets/DashBoard.svg create mode 100644 src/assets/Default-Image.svg create mode 100644 src/assets/Home.svg create mode 100644 src/assets/My-Challenge.svg create mode 100644 src/assets/Rank/1st-Trophy.svg create mode 100644 src/assets/Rank/2nd-Trophy.svg create mode 100644 src/assets/Rank/3rd-Trophy.svg create mode 100644 src/assets/Ranking.svg create mode 100644 src/assets/StampActive.svg create mode 100644 src/assets/StampInactive.svg create mode 100644 src/assets/UserImage.svg create mode 100644 src/assets/challenge/Challange-Img.png create mode 100644 src/assets/challenge/Start-Icon.svg create mode 100644 src/assets/challenge/ZZAN-Black.png create mode 100644 src/assets/challenge/ZZAN-Green.png create mode 100644 src/assets/dummy.png create mode 100644 src/assets/header/Prev-Icon.svg create mode 100644 src/assets/login/kakao.svg create mode 100644 src/assets/main/Down-Arrow.svg create mode 100644 src/assets/main/Eco-Logo.svg create mode 100644 src/assets/main/Heart-Logo.svg create mode 100644 src/assets/main/Home.svg create mode 100644 src/assets/main/My-Challenge.svg create mode 100644 src/assets/main/Nanum-Logo.svg create mode 100644 src/assets/main/Ranking.svg create mode 100644 src/assets/main/Star-Icon.svg create mode 100644 src/assets/main/Volunteer-Logo.svg create mode 100644 src/assets/main/ZZAN-Default.png create mode 100644 src/assets/main/ZZAN-Logo.svg create mode 100644 src/assets/main/ZZAN-Profile.png create mode 100644 src/components/header/Header.jsx create mode 100644 src/components/header/styles.js create mode 100644 src/components/modal/UpdateNicknameModal.jsx create mode 100644 src/components/modal/styles.js create mode 100644 src/components/nav-bar/navigate-Bar.jsx create mode 100644 src/components/nav-bar/styles.js create mode 100644 src/components/postModal/PostModal.jsx create mode 100644 src/components/postModal/PostModal.module.css create mode 100644 src/components/tab/slide-Tab.jsx create mode 100644 src/components/tab/styles.js create mode 100644 src/components/top-bar/styles.js create mode 100644 src/components/top-bar/top-Bar.jsx create mode 100644 src/components/userInfo/TierInfo.jsx create mode 100644 src/constants/Dummy.js create mode 100644 src/constants/TierSchema.js create mode 100644 src/constants/URI.js create mode 100644 src/hooks/useBottomSheet.jsx create mode 100644 src/main.jsx create mode 100644 src/pages/dashboard/Dashboard.jsx create mode 100644 src/pages/dashboard/components/Record.jsx create mode 100644 src/pages/dashboard/components/Styles.js create mode 100644 src/pages/dashboard/components/UserInfo.jsx create mode 100644 src/pages/dashboard/styles.js create mode 100644 src/pages/detail-challenge/ChallengeDetailPage.jsx create mode 100644 src/pages/detail-challenge/components/difficulty/Difficulty.jsx create mode 100644 src/pages/detail-challenge/components/difficulty/styles.js create mode 100644 src/pages/detail-challenge/components/userItem/UserItem.jsx create mode 100644 src/pages/detail-challenge/components/userItem/styles.js create mode 100644 src/pages/detail-challenge/description/Description.jsx create mode 100644 src/pages/detail-challenge/description/styles.js create mode 100644 src/pages/detail-challenge/ranking/Ranking.jsx create mode 100644 src/pages/detail-challenge/ranking/styles.js create mode 100644 src/pages/detail-challenge/styles.js create mode 100644 src/pages/list-challenge/components/CategoryButton.jsx create mode 100644 src/pages/list-challenge/components/Contents.jsx create mode 100644 src/pages/list-challenge/components/styles.js create mode 100644 src/pages/list-challenge/list-challenge.jsx create mode 100644 src/pages/list-challenge/styles.js create mode 100644 src/pages/list-record-challenge/ListRecordChallenge.jsx create mode 100644 src/pages/list-record-challenge/components/ListItem.jsx create mode 100644 src/pages/list-record-challenge/components/Styles.js create mode 100644 src/pages/list-record-challenge/styles.js create mode 100644 src/pages/login/LoginPage.jsx create mode 100644 src/pages/login/RedirectPage.jsx create mode 100644 src/pages/login/style.js create mode 100644 src/pages/main/MainPage.jsx create mode 100644 src/pages/main/components/Category.jsx create mode 100644 src/pages/main/components/MainTitle.jsx create mode 100644 src/pages/main/components/Review.jsx create mode 100644 src/pages/main/components/Strick-calendar.jsx create mode 100644 src/pages/main/components/Strick.jsx create mode 100644 src/pages/main/components/Teer.jsx create mode 100644 src/pages/main/components/styles.js create mode 100644 src/pages/main/style.js create mode 100644 src/pages/my-challenge/MyChallenge.jsx create mode 100644 src/pages/my-challenge/components/ChallengeList.jsx create mode 100644 src/pages/my-challenge/components/styles.js create mode 100644 src/pages/my-challenge/styles.js create mode 100644 src/pages/rank/Rank.jsx create mode 100644 src/pages/rank/components/AllRank.jsx create mode 100644 src/pages/rank/components/HighRank.jsx create mode 100644 src/pages/rank/components/MyRank.jsx create mode 100644 src/pages/rank/components/UserRank.jsx create mode 100644 src/pages/rank/components/styles.js create mode 100644 src/pages/rank/styles.js create mode 100644 src/pages/record-challenge/ChallengeRecordPage.jsx create mode 100644 src/pages/record-challenge/bottomsheet/BottomSheet.jsx create mode 100644 src/pages/record-challenge/bottomsheet/Header.jsx create mode 100644 src/pages/record-challenge/bottomsheet/styles.js create mode 100644 src/pages/record-challenge/components/Stamp.jsx create mode 100644 src/pages/record-challenge/components/styles.js create mode 100644 src/pages/record-challenge/stampboard/StampBoard.jsx create mode 100644 src/pages/record-challenge/stampboard/styles.js create mode 100644 src/pages/record-challenge/styles.js create mode 100644 src/pages/record-challenge/verification/Verification.jsx create mode 100644 src/pages/record-challenge/verification/styles.js create mode 100644 src/pages/review/review-list/ReviewList.jsx create mode 100644 src/pages/review/review-list/components/reviewItem/ReviewItem.jsx create mode 100644 src/pages/review/review-list/components/reviewItem/styles.js create mode 100644 src/pages/review/review-list/components/reviewRating/ReviewRating.jsx create mode 100644 src/pages/review/review-list/components/reviewRating/styles.js create mode 100644 src/pages/review/review-list/styles.js create mode 100644 src/pages/review/writingReview/WritingReview.jsx create mode 100644 src/pages/review/writingReview/styles.js create mode 100644 src/pages/shorts-challenge/Shorts-challenge.jsx create mode 100644 src/pages/shorts-challenge/components/ChallengeContents.jsx create mode 100644 src/pages/shorts-challenge/components/ChallengeImage.jsx create mode 100644 src/pages/shorts-challenge/components/ChallengeInfo.jsx create mode 100644 src/pages/shorts-challenge/components/styles.js create mode 100644 src/pages/shorts-challenge/styles.js create mode 100644 src/store/useStore.js create mode 100644 src/store/useUserInfoStore.js create mode 100644 src/styles/GlobalStyle.jsx create mode 100644 vite.config.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..3493180 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,31 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "plugin:prettier/recommended", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "plugin:jsx-a11y/recommended", + "plugin:import/errors", + "plugin:import/warnings" + ], + "parserOptions": { + "ecmaVersion": 2021, + "sourceType": "module" + }, + "plugins": ["react", "react-hooks", "jsx-a11y", "import", "prettier"], + "rules": { + "no-param-reassign": ["error", { "props": false }], + "import/no-unresolved": "off", + "react/prop-types": "off", + "prettier/prettier": [ + "off", + { + "endOfLine": "auto" + } + ], + "react/react-in-jsx-scope": "off" + } +} diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..7593461 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: 기능 추가 이슈 템플릿 +title: '' +labels: '' +assignees: '' +--- + +## **Issue** + +### ✨ 기능 리스트 + +- [ ] 구현한 기능 +- [ ] 구현한 기능 + +--- + +### ✏ 사용 이유 + +--- diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..e09c904 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,17 @@ +## **PR** + +### ✨ 작업 내용 + +- + +--- + +### ✨ 참고 사항 + +--- + +### ⏰ 현재 버그 + +--- + +### ✏ Git Close diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b0b403 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +.env \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..4b561b8 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,38 @@ +{ + "arrowParens": "always", + "bracketSameLine": false, + "bracketSpacing": true, + "embeddedLanguageFormatting": "auto", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxSingleQuote": true, + "printWidth": 80, + "proseWrap": "always", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleAttributePerLine": false, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false, + "vueIndentScriptAndStyle": false, + + "plugins": ["@trivago/prettier-plugin-sort-imports"], + "importOrder": [ + "^react(.*)", + "", + "^@api/(.*)$", + "^@assets/(.*)$", + "^@components/(.*)$", + "^@constants/(.*)$|^@utils/(.*)", + "^@hooks/(.*)$", + "^@pages/(.*)$", + "^@store/(.*)$", + "^@styles/(.*)$", + "^@utils/(.*)$", + "^(.*)/(.*)$" + ], + "importOrderSeparation": true, + "importOrderSortSpecifiers": false +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..bf31962 --- /dev/null +++ b/README.md @@ -0,0 +1,322 @@ +## 핵심 라이브러리 + +### React + +- react: 사용자 인터페이스를 구축하기 위한 JavaScript 라이브러리. +- react-dom: React의 DOM 관련 메서드를 제공. + +### 스타일링 + +- CSS-in-JS 라이브러리: @emotion/react 및 @emotion/styled: JavaScript로 CSS + 스타일을 작성하기 위한 CSS-in-JS 접근 방식을 제공하는 라이브러리. +- styled-components: 실제 CSS를 사용하여 React 컴포넌트를 스타일링할 수 있는 또 + 다른 인기 있는 CSS-in-JS 라이브러리. + +### UI 컴포넌트 + +Ant Design: antd: 고품질의 컴포넌트를 제공하는 인기 있는 React UI 프레임워크. + +### 애니메이션 및 상호작용 + +- 애니메이션 및 모션: framer-motion: React 애플리케이션에서 애니메이션을 + 생성하기 위한 라이브러리. react-intersection-observer: 요소의 가시성 변화를 + 관리하기 위한 Intersection Observer API의 React 구현체. + +### 모달 관리 + +- 모달 관리: react-modal: React에서 접근 가능한 모달 다이얼로그를 생성하기 위한 + 라이브러리. + +### 라우팅 + +- 라우팅: react-router-dom: React 애플리케이션에서 경로 및 내비게이션을 관리하기 + 위한 라이브러리. + +### 상태 관리 + +- 상태 관리: zustand: 작고 빠르고 확장 가능한 React 상태 관리 라이브러리. + +### HTTP 클라이언트 + +- HTTP 클라이언트: +- axios: 서버로 요청을 보내기 위한 promise 기반의 HTTP 클라이언트. + +### 개발 도구 + +- 개발 도구: vite: 차세대 프론트엔드 빌드 도구. eslint: JavaScript 코드의 패턴을 + 식별하고 보고하는 도구로, 코드 품질을 보장. prettier: 의견이 반영된 코드 + 포매터. @vitejs/plugin-react: React와 Vite를 통합하기 위한 Vite 플러그인. + +### 린팅 및 포맷팅 + +- ESLint 플러그인: + +eslint-config-airbnb: JavaScript, React, JSX 규칙을 포함한 Airbnb의 ESLint 구성. +eslint-config-prettier: Prettier와 충돌할 수 있는 규칙을 비활성화. +eslint-plugin-import: ES6+ import/export 구문을 린트하고, 파일 경로 및 import +이름의 철자 오류를 방지. eslint-plugin-jsx-a11y: JSX 요소의 접근성 규칙을 위한 +정적 AST 검사기. eslint-plugin-prettier: Prettier를 ESLint 규칙으로 실행. +eslint-plugin-react: React 전용 ESLint 규칙. eslint-plugin-react-hooks: Hooks의 +규칙을 강제하여 일반적인 실수를 방지. eslint-plugin-react-refresh: 개발 중에 +React Refresh와 관련된 규칙을 강제. TypeScript 정의: + +@types/react: React의 TypeScript 정의. @types/react-dom: React DOM의 TypeScript +정의. + +### 유틸리티 라이브러리 + +- 유틸리티 라이브러리: inflight: 진행 중인 요청을 관리하기 위한 라이브러리. + react-icons: React 프로젝트에서 인기 있는 아이콘을 포함하기 위한 라이브러리. + swiper: 하드웨어 가속 전환을 사용하는 현대적인 모바일 터치 슬라이더. + +### Prettier 플러그인 + +- Prettier 플러그인: @trivago/prettier-plugin-sort-imports: import를 정렬하기 + 위한 Prettier 플러그인. 이 스택은 빌드 도구, 린터, 포매터, 상태 관리 + 라이브러리, UI 컴포넌트 등을 포함하여 효율적인 개발을 위한 다양한 도구를 + 제공하며, 잘 구성된 강력한 개발 환경을 보장합니다. +======= +# 짠수니 + +## 데모 + +## 참여 + +## 기획 + +### 동기 + +- 팀원 4명의 공통 관심사를 취합하였다. 그결과 `짠수니`라는 서비스를 기획하게 되었다. +- 사회에 긍정적인 영향 미치기 위해 노력하는 사람들을 위한 서비스를 만들고 싶었다. +- 사용자에게 재미를 주면서도, 사회에 긍정적인 영향을 미치는 서비스를 만들고 싶었다. + +## 기능 + +### 1️⃣ 진행상황 + +사용자는 챌린지의 진행상황을 볼수있다. + +- 주마다 4일참여해야하는 챌린지라면, 월,화,수의 기록을 볼수있어야한다. + +### 2️⃣ 랭킹 + +1. 진행중인 각 챌린지 별, 유저가 얻은 경험치로 정렬해서 보여주기(상위 N명과, 사용자) +2. 참여중인 사용자수를 확인할 수 있다. +3. 전체 경험치 랭킹 보여주기(상위 N명과, 사용자) + +### 3️⃣ 챌린지 게시 + +1. 관리자가 챌린지를 게시할 수 있다. +2. 챌린지에는 주제, 제목, 내용, 기간(정기적(ex매주3일)/일회성(ex달성하기)), 보상을 입력받는다. + - 챌린지 운영기간을 명시해야한다. +3. 난이도란 챌린지의 세부적인 목표를 분류한것이다. 상중하로 분류된다. 난이도에 해당하는 목표를 작성할 수 있다. + - (주 n일) / n개 달성 + +### 4️⃣ 챌린지 참여 + +1. 숏폼으로 챌린지를 랜덤으로 제공하여 사용자에게 보여준다. 사용자는 챌린지를 선택하여 참여할 수 있다. +2. 챌린지 참여 인증에는 사진과 설명으로 인증한다. (사진은 챌린지의 성격에 따라 다르다) + +### 5️⃣ 챌린지 종료 + +1. 종료기간이 되거나 완료한 챌린지는 종료된다. +2. 챌린지를 완수한 사용자는 추가 보상을 받는다. + +### 주제 + +> 주제는 에코, 봉사, 선행, 나눔, 건강 총 5가지로 분류하여 나타낸다. + +### 1️⃣ 에코 + +환경에 관련된 챌린지를 나타낸다. + +- 예를 들어 전기 절약 → 얼마나 절약되었는지/ 몇리터를 아꼈습니다. +- 매연의 감소와 같은 절약 + +### 2️⃣ 선행 + +선행에 관련된 챌린지를 나타낸다. + +- 예를 들어 쓰레기 줍기, 앞사람에게 인사하기 등등 + +### 3️⃣ 나눔 + +나눔에 관련된 챌린지를 나타낸다. + +- 예를 들어 나무젓가락 나눔 + +### 4️⃣ 건강 + +건강에 관련된 챌린지를 나타낸다. + +- 예를 들어 걷기 + +### 5️⃣ 레벨 시스템 + +### 01. 스트릭 + +- 유저의 날짜별 활동을 기록한다. 이 기록에는 챌린지 참가기록, 연속참가일자로 구성된다. + 멋있는 UI로 표현된다. +- 달마다의 스트릭정보를 볼수있다.(페이징) + +### 02. 티어 + +- 티어는 노비-상민-평민-양반-진골-성골-에코로 구성된다 +- 티어별 경험치표가 존재한다. + - 티어별 4단계로 구성된다. +- 티어 순서는 4,3,2,1 순으로 올라간다. + +### 6️⃣ 게시글 + +### 챌린지 + +리뷰 및 피드백 + +1. 챌린지의 만족도와 후기를 작성할 수 있다. +2. 만족도는 1,2,3,4,5점으로 줄 수 있다. +3. 만족도는 챌린지의 기록정보에 저장된다. (만족도가 낮은 챌린지는 관리자가 확인하고 제외할 수 있다) +4. 최근 챌린지만족도를 메인화면에서 조회할 수 있다, 챌린지상세페이지에서 리뷰를 조회할 수 있다. + +## 나중에 넣을 기능 (V2) + +### 1. 문의 게시글 + +### 2. 챌린지 빙고 넣기 + +### 3. 엘라스틱 서치로 사용자 기록을 보고 추천서비스 + +### 4. 기록을 바탕으로 일기를 만들어주고 짠돌이가 칭찬해줘요 + +### 5. 퀴즈 + +### 6. 챌린지 신설 요청 + +- 유저들의 챌린지 요청 게시글을 볼 수 있다. +- 추천기능이 존재하여, 사용자들의 수요를 볼 수 있다. + +## 기술 스택 +## 핵심 라이브러리 +### React +- react: 사용자 인터페이스를 구축하기 위한 JavaScript 라이브러리. +- react-dom: React의 DOM 관련 메서드를 제공. +### 스타일링 +- CSS-in-JS 라이브러리: +@emotion/react 및 @emotion/styled: JavaScript로 CSS 스타일을 작성하기 위한 CSS-in-JS 접근 방식을 제공하는 라이브러리. +- styled-components: 실제 CSS를 사용하여 React 컴포넌트를 스타일링할 수 있는 또 다른 인기 있는 CSS-in-JS 라이브러리. +### UI 컴포넌트 +Ant Design: +antd: 고품질의 컴포넌트를 제공하는 인기 있는 React UI 프레임워크. +### 애니메이션 및 상호작용 +- 애니메이션 및 모션: +framer-motion: React 애플리케이션에서 애니메이션을 생성하기 위한 라이브러리. +react-intersection-observer: 요소의 가시성 변화를 관리하기 위한 Intersection Observer API의 React 구현체. +### 모달 관리 +- 모달 관리: +react-modal: React에서 접근 가능한 모달 다이얼로그를 생성하기 위한 라이브러리. +### 라우팅 +- 라우팅: +react-router-dom: React 애플리케이션에서 경로 및 내비게이션을 관리하기 위한 라이브러리. +### 상태 관리 +- 상태 관리: +zustand: 작고 빠르고 확장 가능한 React 상태 관리 라이브러리. +### HTTP 클라이언트 +- HTTP 클라이언트: +- axios: 서버로 요청을 보내기 위한 promise 기반의 HTTP 클라이언트. +### 개발 도구 +- 개발 도구: +vite: 차세대 프론트엔드 빌드 도구. +eslint: JavaScript 코드의 패턴을 식별하고 보고하는 도구로, 코드 품질을 보장. +prettier: 의견이 반영된 코드 포매터. +@vitejs/plugin-react: React와 Vite를 통합하기 위한 Vite 플러그인. +### 린팅 및 포맷팅 +- ESLint 플러그인: + +eslint-config-airbnb: JavaScript, React, JSX 규칙을 포함한 Airbnb의 ESLint 구성. +eslint-config-prettier: Prettier와 충돌할 수 있는 규칙을 비활성화. +eslint-plugin-import: ES6+ import/export 구문을 린트하고, 파일 경로 및 import 이름의 철자 오류를 방지. +eslint-plugin-jsx-a11y: JSX 요소의 접근성 규칙을 위한 정적 AST 검사기. +eslint-plugin-prettier: Prettier를 ESLint 규칙으로 실행. +eslint-plugin-react: React 전용 ESLint 규칙. +eslint-plugin-react-hooks: Hooks의 규칙을 강제하여 일반적인 실수를 방지. +eslint-plugin-react-refresh: 개발 중에 React Refresh와 관련된 규칙을 강제. +TypeScript 정의: + +@types/react: React의 TypeScript 정의. +@types/react-dom: React DOM의 TypeScript 정의. +### 유틸리티 라이브러리 +- 유틸리티 라이브러리: +inflight: 진행 중인 요청을 관리하기 위한 라이브러리. +react-icons: React 프로젝트에서 인기 있는 아이콘을 포함하기 위한 라이브러리. +swiper: 하드웨어 가속 전환을 사용하는 현대적인 모바일 터치 슬라이더. +### Prettier 플러그인 +- Prettier 플러그인: +@trivago/prettier-plugin-sort-imports: import를 정렬하기 위한 Prettier 플러그인. +이 스택은 빌드 도구, 린터, 포매터, 상태 관리 라이브러리, UI 컴포넌트 등을 포함하여 효율적인 개발을 위한 다양한 도구를 제공하며, 잘 구성된 강력한 개발 환경을 보장합니다. + +## 사용자 플로우 + +## Router +## Router 설정 + +이 프로젝트는 `react-router-dom`의 `createBrowserRouter`를 사용하여 라우팅을 설정합니다. 라우터 설정은 다음과 같습니다: + +### 기본 경로 ('/'): +- `NavigateBar` 컴포넌트를 래핑하고 있으며, 이는 모든 하위 경로에서 네비게이션 바를 포함하게 합니다. +- `Outlet`은 하위 경로에서 렌더링될 컴포넌트를 표시합니다. + +### 하위 경로: + +#### 메인 페이지: +- 경로: `/` +- 컴포넌트: `MainPage` + +#### 챌린지 관련 경로: +- 경로: `/challenge` +- 컴포넌트: `MyChallenge` + - 하위 경로: + - 챌린지 목록: + - 경로: `/challenge/list` + - 컴포넌트: `ChallengeList` + - 기록된 챌린지 목록: + - 경로: `/challenge/record-list` + - 컴포넌트: `ListRecordChallenge` + +#### 쇼츠 챌린지: +- 경로: `/shorts` +- 컴포넌트: `ShortsChallenge` + +#### 랭킹 페이지: +- 경로: `/rank` +- 컴포넌트: `RankPage` + +#### 대시보드: +- 경로: `/dashboard` +- 컴포넌트: `Dashboard` + +#### 챌린지 상세 페이지: +- 경로: `/challenge-detail` +- 컴포넌트: `ChallengeDetailPage` + +#### 챌린지 기록 페이지: +- 경로: `/challenge-record` +- 컴포넌트: `ChallengeRecordPage` + +#### 리뷰 작성 페이지: +- 경로: `/writing-reivew` +- 컴포넌트: `WritingReview` + +#### 리뷰 목록 페이지: +- 경로: `/reivew-list` +- 컴포넌트: `ReviewList` + +### 로그인 관련 경로: + +#### 로그인 페이지: +- 경로: `/login` +- 컴포넌트: `LoginPage` + +#### 카카오 리디렉트 페이지: +- 경로: `/login/kakao` +- 컴포넌트: `RedirectPage` + +## 향후 아키텍쳐 diff --git a/index.html b/index.html new file mode 100644 index 0000000..5d30a19 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + ZZANSUNI + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..e9d0879 --- /dev/null +++ b/package.json @@ -0,0 +1,52 @@ +{ + "name": "zzansuni-fe", + "private": true, + "version": "0.0.0", + "type": "module", + "homepage": ".", + "scripts": { + "dev": "vite", + "start": "vite", + "port": "vite --host 0.0.0.0 --port 5173", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "format": "prettier --check --ignore-path .gitignore .", + "format:fix": "prettier --write --ignore-path .gitignore ." + }, + "dependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "antd": "^5.17.4", + "axios": "^1.7.2", + "eslint-plugin-import": "^2.29.1", + "framer-motion": "^11.2.8", + "inflight": "1.0.6", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^5.2.1", + "react-intersection-observer": "^9.10.2", + "react-modal": "^3.16.1", + "react-router-dom": "^6.23.1", + "styled-components": "^6.1.11", + "swiper": "^11.1.3", + "zustand": "^4.5.2" + }, + "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.6", + "prettier": "^3.2.5", + "vite": "^5.2.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..eedfc63 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4696 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@emotion/react': + specifier: ^11.11.4 + version: 11.11.4(@types/react@18.3.3)(react@18.3.1) + '@emotion/styled': + specifier: ^11.11.5 + version: 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + antd: + specifier: ^5.17.4 + version: 5.17.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + axios: + specifier: ^1.7.2 + version: 1.7.2 + eslint-plugin-import: + specifier: ^2.29.1 + version: 2.29.1(eslint@8.57.0) + framer-motion: + specifier: ^11.2.8 + version: 11.2.10(@emotion/is-prop-valid@1.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + inflight: + specifier: 1.0.6 + version: 1.0.6 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + react-icons: + specifier: ^5.2.1 + version: 5.2.1(react@18.3.1) + react-intersection-observer: + specifier: ^9.10.2 + version: 9.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-modal: + specifier: ^3.16.1 + version: 3.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-router-dom: + specifier: ^6.23.1 + version: 6.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + styled-components: + specifier: ^6.1.11 + version: 6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + swiper: + specifier: ^11.1.3 + version: 11.1.4 + zustand: + specifier: ^4.5.2 + version: 4.5.2(@types/react@18.3.3)(react@18.3.1) + devDependencies: + '@trivago/prettier-plugin-sort-imports': + specifier: ^4.3.0 + version: 4.3.0(prettier@3.2.5) + '@types/react': + specifier: ^18.2.66 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.2.22 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.3.0(vite@5.2.12) + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-airbnb: + specifier: ^19.0.4 + version: 19.0.4(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.34.2(eslint@8.57.0))(eslint@8.57.0) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-jsx-a11y: + specifier: ^6.8.0 + version: 6.8.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + eslint-plugin-react: + specifier: ^7.34.1 + version: 7.34.2(eslint@8.57.0) + eslint-plugin-react-hooks: + specifier: ^4.6.2 + version: 4.6.2(eslint@8.57.0) + eslint-plugin-react-refresh: + specifier: ^0.4.6 + version: 0.4.7(eslint@8.57.0) + prettier: + specifier: ^3.2.5 + version: 3.2.5 + vite: + specifier: ^5.2.0 + version: 5.2.12 + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@ant-design/colors@7.0.2': + resolution: {integrity: sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg==} + + '@ant-design/cssinjs@1.20.0': + resolution: {integrity: sha512-uG3iWzJxgNkADdZmc6W0Ci3iQAUOvLMcM8SnnmWq3r6JeocACft4ChnY/YWvI2Y+rG/68QBla/O+udke1yH3vg==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@ant-design/icons-svg@4.4.2': + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + + '@ant-design/icons@5.3.7': + resolution: {integrity: sha512-bCPXTAg66f5bdccM4TT21SQBDO1Ek2gho9h3nO9DAKXJP4sq+5VBjrQMSxMVXSB3HyEz+cUbHQ5+6ogxCOpaew==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@ant-design/react-slick@1.1.2': + resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==} + peerDependencies: + react: '>=16.9.0' + + '@babel/code-frame@7.24.6': + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.6': + resolution: {integrity: sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.6': + resolution: {integrity: sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.17.7': + resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.6': + resolution: {integrity: sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.24.6': + resolution: {integrity: sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.24.6': + resolution: {integrity: sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.6': + resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.24.6': + resolution: {integrity: sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.6': + resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.24.6': + resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.6': + resolution: {integrity: sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.6': + resolution: {integrity: sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.6': + resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.6': + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.6': + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.6': + resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.6': + resolution: {integrity: sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.6': + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.6': + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.24.6': + resolution: {integrity: sha512-FfZfHXtQ5jYPQsCRyLpOv2GeLIIJhs8aydpNh39vRDjhD411XcfWDni5i7OjP/Rs8GAtTn7sWFFELJSHqkIxYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.24.6': + resolution: {integrity: sha512-BQTBCXmFRreU3oTUXcGKuPOfXAGb1liNY4AvvFKsOBAJ89RKcTsIrSsnMYkj59fNa66OFKnSa4AJZfy5Y4B9WA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.24.6': + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.24.6': + resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.23.2': + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.6': + resolution: {integrity: sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.17.0': + resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.6': + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + engines: {node: '>=6.9.0'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@emotion/babel-plugin@11.11.0': + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/hash@0.8.0': + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@emotion/is-prop-valid@1.2.2': + resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/react@11.11.4': + resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.1.4': + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + + '@emotion/sheet@1.2.2': + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + + '@emotion/styled@11.11.5': + resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.2.1': + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rc-component/async-validator@5.0.4': + resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} + engines: {node: '>=14.x'} + + '@rc-component/color-picker@1.5.3': + resolution: {integrity: sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/context@1.4.0': + resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/mini-decimal@1.1.0': + resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==} + engines: {node: '>=8.x'} + + '@rc-component/mutate-observer@1.1.0': + resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/portal@1.1.2': + resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/tour@1.15.0': + resolution: {integrity: sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/trigger@2.2.0': + resolution: {integrity: sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@remix-run/router@1.16.1': + resolution: {integrity: sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==} + engines: {node: '>=14.0.0'} + + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.18.0': + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.18.0': + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.18.0': + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.18.0': + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.18.0': + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.18.0': + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.18.0': + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + cpu: [x64] + os: [win32] + + '@trivago/prettier-plugin-sort-imports@4.3.0': + resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==} + peerDependencies: + '@vue/compiler-sfc': 3.x + prettier: 2.x - 3.x + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + + '@types/stylis@4.2.5': + resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-react@4.3.0': + resolution: {integrity: sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + antd@5.17.4: + resolution: {integrity: sha512-oDWrcibe1s72223vpvA3/dNBEotGkggyWQVX1+GVrhuVXt/QYE3oU3Tsg3PeMurohvO8kjxambqG/zbmsMG34g==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-lite@1.0.30001625: + resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + compute-scroll-into-view@3.1.0: + resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + electron-to-chromium@1.4.787: + resolution: {integrity: sha512-d0EFmtLPjctczO3LogReyM2pbBiiZbnsKnGF+cdZhsYzHm/A0GV7W94kqzLD8SN4O3f3iHlgLUChqghgyznvCQ==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-airbnb-base@15.0.0: + resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + + eslint-config-airbnb@19.0.4: + resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} + engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.28.0 + eslint-plugin-react-hooks: ^4.3.0 + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.8.0: + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-prettier@5.1.3: + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-refresh@0.4.7: + resolution: {integrity: sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw==} + peerDependencies: + eslint: '>=7' + + eslint-plugin-react@7.34.2: + resolution: {integrity: sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + exenv@1.2.2: + resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + framer-motion@11.2.10: + resolution: {integrity: sha512-/gr3PLZUVFCc86a9MqCUboVrALscrdluzTb3yew+2/qKBU8CX6nzs918/SRBRCqaPbx0TZP10CB6yFgK2C5cYQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json2mq@0.2.0: + resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qrcode.react@3.1.0: + resolution: {integrity: sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + rc-cascader@3.26.0: + resolution: {integrity: sha512-L1dml383TPSJD1I11YwxuVbmqaJY64psZqFp1ETlgl3LEOwDu76Cyl11fw5dmjJhMlUWwM5dECQfqJgfebhUjg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-checkbox@3.3.0: + resolution: {integrity: sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-collapse@3.7.3: + resolution: {integrity: sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-dialog@9.4.0: + resolution: {integrity: sha512-AScCexaLACvf8KZRqCPz12BJ8olszXOS4lKlkMyzDQHS1m0zj1KZMYgmMCh39ee0Dcv8kyrj8mTqxuLyhH+QuQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-drawer@7.1.0: + resolution: {integrity: sha512-nBE1rF5iZvpavoyqhSSz2mk/yANltA7g3aF0U45xkx381n3we/RKs9cJfNKp9mSWCedOKWt9FLEwZDaAaOGn2w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-dropdown@4.2.0: + resolution: {integrity: sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + + rc-field-form@2.0.1: + resolution: {integrity: sha512-3WK/POHBcfMFKrzScrkmgMIXqoVQ0KgVwcVnej/ukwuQG4ZHCJaTi2KhM+tWTK4WODBXbmjKg5pKHj2IVmSg4A==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-image@7.6.0: + resolution: {integrity: sha512-tL3Rvd1sS+frZQ01i+tkeUPaOeFz2iG9/scAt/Cfs0hyCRVA/w0Pu1J/JxIX8blalvmHE0bZQRYdOmRAzWu4Hg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-input-number@9.1.0: + resolution: {integrity: sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-input@1.5.1: + resolution: {integrity: sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + rc-mentions@2.13.1: + resolution: {integrity: sha512-DSyUDq/PPCleUX1eghIn371lTSRQsIuCs1N7xR9nZcHP9R1NkE7JjpWUP8Gy4EGVPu0JN0qIcokxYJaoGPnofg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-menu@9.14.0: + resolution: {integrity: sha512-La3LBCDMLMs9Q/8mTGbnscb+ZeJ26ebkLz9xJFHd2SD8vfsCKl1Z/k3mwbxyKL01lB40fel1s9Nn9LAv/nmVJQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-motion@2.9.1: + resolution: {integrity: sha512-QD4bUqByjVQs7PhUT1d4bNxvtTcK9ETwtg7psbDfo6TmYalH/1hhjj4r2hbhW7g5OOEqYHhfwfj4noIvuOVRtQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-notification@5.4.0: + resolution: {integrity: sha512-li19y9RoYJciF3WRFvD+DvWS70jdL8Fr+Gfb/OshK+iY6iTkwzoigmSIp76/kWh5tF5i/i9im12X3nsF85GYdA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-overflow@1.3.2: + resolution: {integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-pagination@4.0.4: + resolution: {integrity: sha512-GGrLT4NgG6wgJpT/hHIpL9nELv27A1XbSZzECIuQBQTVSf4xGKxWr6I/jhpRPauYEWEbWVw22ObG6tJQqwJqWQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-picker@4.5.0: + resolution: {integrity: sha512-suqz9bzuhBQlf7u+bZd1bJLPzhXpk12w6AjQ9BTPTiFwexVZgUKViG1KNLyfFvW6tCUZZK0HmCCX7JAyM+JnCg==} + engines: {node: '>=8.x'} + peerDependencies: + date-fns: '>= 2.x' + dayjs: '>= 1.x' + luxon: '>= 3.x' + moment: '>= 2.x' + react: '>=16.9.0' + react-dom: '>=16.9.0' + peerDependenciesMeta: + date-fns: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + + rc-progress@4.0.0: + resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-rate@2.12.0: + resolution: {integrity: sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-resize-observer@1.4.0: + resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-segmented@2.3.0: + resolution: {integrity: sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + rc-select@14.14.0: + resolution: {integrity: sha512-Uo2wulrjoPPRLCPd7zlK4ZFVJxlTN//yp1xWP/U+TUOQCyXrT+Duvq/Si5OzVcmQyWAUSbsplc2OwNNhvbOeKQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + + rc-slider@10.6.2: + resolution: {integrity: sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-steps@6.0.1: + resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-switch@4.1.0: + resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-table@7.45.7: + resolution: {integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tabs@15.1.0: + resolution: {integrity: sha512-xTNz4Km1025emtkv1q7xKhjPwAtXr/wycuXVTAcFJg+DKhnPDDbnwbA9KRW0SawAVOGvVEj8ZrBlU0u0FGLrbg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-textarea@1.7.0: + resolution: {integrity: sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tooltip@6.2.0: + resolution: {integrity: sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tree-select@5.21.0: + resolution: {integrity: sha512-w+9qEu6zh0G3wt9N/hzWNSnqYH1i9mH1Nqxo0caxLRRFXF5yZWYmpCDoDTMdQM1Y4z3Q5yj08qyrPH/d4AtumA==} + peerDependencies: + react: '*' + react-dom: '*' + + rc-tree@5.8.7: + resolution: {integrity: sha512-cpsIQZ4nNYwpj6cqPRt52e/69URuNdgQF9wZ10InmEf8W3+i0A41OVmZWwHuX9gegQSqj+DPmaDkZFKQZ+ZV1w==} + engines: {node: '>=10.x'} + peerDependencies: + react: '*' + react-dom: '*' + + rc-upload@4.5.2: + resolution: {integrity: sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-util@5.41.0: + resolution: {integrity: sha512-xtlCim9RpmVv0Ar2Nnc3WfJCxjQkTf3xHPWoFdjp1fSs2NirQwqiQrfqdU9HUe0kdfb168M/T8Dq0IaX50xeKg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-virtual-list@3.14.2: + resolution: {integrity: sha512-rA+W5xryhklJAcmswNyuKB3ZGeB855io+yOFQK5u/RXhjdshGblfKpNkQr4/9fBhZns0+uiL/0/s6IP2krtSmg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-icons@5.2.1: + resolution: {integrity: sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==} + peerDependencies: + react: '*' + + react-intersection-observer@9.10.2: + resolution: {integrity: sha512-j2hGADK2hCbAlfaq6L3tVLb4iqngoN7B1fT16MwJ4J16YW/vWLcmAIinLsw0lgpZeMi4UDUWtHC9QDde0/P1yQ==} + peerDependencies: + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react-dom: + optional: true + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + + react-modal@3.16.1: + resolution: {integrity: sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==} + engines: {node: '>=8'} + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 + react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.23.1: + resolution: {integrity: sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.23.1: + resolution: {integrity: sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + string-convert@0.2.1: + resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + styled-components@6.1.11: + resolution: {integrity: sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swiper@11.1.4: + resolution: {integrity: sha512-1n7kbYJB2dFEpUHRFszq7gys/ofIBrMNibwTiMvPHwneKND/t9kImnHt6CfGPScMHgI+dWMbGTycCKGMoOO1KA==} + engines: {node: '>= 4.7.0'} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + throttle-debounce@5.0.0: + resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} + engines: {node: '>=12.22'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + vite@5.2.12: + resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zustand@4.5.2: + resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@ant-design/colors@7.0.2': + dependencies: + '@ctrl/tinycolor': 3.6.1 + + '@ant-design/cssinjs@1.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@emotion/hash': 0.8.0 + '@emotion/unitless': 0.7.5 + classnames: 2.5.1 + csstype: 3.1.3 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + stylis: 4.3.2 + + '@ant-design/icons-svg@4.4.2': {} + + '@ant-design/icons@5.3.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@ant-design/colors': 7.0.2 + '@ant-design/icons-svg': 4.4.2 + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@ant-design/react-slick@1.1.2(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + json2mq: 0.2.0 + react: 18.3.1 + resize-observer-polyfill: 1.5.1 + throttle-debounce: 5.0.0 + + '@babel/code-frame@7.24.6': + dependencies: + '@babel/highlight': 7.24.6 + picocolors: 1.0.1 + + '@babel/compat-data@7.24.6': {} + + '@babel/core@7.24.6': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helpers': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/template': 7.24.6 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.17.7': + dependencies: + '@babel/types': 7.17.0 + jsesc: 2.5.2 + source-map: 0.5.7 + + '@babel/generator@7.24.6': + dependencies: + '@babel/types': 7.24.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.24.6': + dependencies: + '@babel/compat-data': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.24.6': {} + + '@babel/helper-function-name@7.24.6': + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + + '@babel/helper-hoist-variables@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-module-imports@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-module-transforms@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + + '@babel/helper-plugin-utils@7.24.6': {} + + '@babel/helper-simple-access@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-split-export-declaration@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-string-parser@7.24.6': {} + + '@babel/helper-validator-identifier@7.24.6': {} + + '@babel/helper-validator-option@7.24.6': {} + + '@babel/helpers@7.24.6': + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + + '@babel/highlight@7.24.6': + dependencies: + '@babel/helper-validator-identifier': 7.24.6 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.24.6': + dependencies: + '@babel/types': 7.17.0 + + '@babel/plugin-transform-react-jsx-self@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-react-jsx-source@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/runtime@7.24.6': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.24.6': + dependencies: + '@babel/code-frame': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + + '@babel/traverse@7.23.2': + dependencies: + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.24.6': + dependencies: + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.17.0': + dependencies: + '@babel/helper-validator-identifier': 7.24.6 + to-fast-properties: 2.0.0 + + '@babel/types@7.24.6': + dependencies: + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + to-fast-properties: 2.0.0 + + '@ctrl/tinycolor@3.6.1': {} + + '@emotion/babel-plugin@11.11.0': + dependencies: + '@babel/helper-module-imports': 7.24.6 + '@babel/runtime': 7.24.6 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.4 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + + '@emotion/cache@11.11.0': + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + + '@emotion/hash@0.8.0': {} + + '@emotion/hash@0.9.1': {} + + '@emotion/is-prop-valid@1.2.2': + dependencies: + '@emotion/memoize': 0.8.1 + + '@emotion/memoize@0.8.1': {} + + '@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.4 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@emotion/serialize@1.1.4': + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + + '@emotion/sheet@1.2.2': {} + + '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.2 + '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) + '@emotion/serialize': 1.1.4 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) + '@emotion/utils': 1.2.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@emotion/unitless@0.7.5': {} + + '@emotion/unitless@0.8.1': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@emotion/utils@1.2.1': {} + + '@emotion/weak-memoize@0.3.1': {} + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.5 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgr/core@0.1.1': {} + + '@rc-component/async-validator@5.0.4': + dependencies: + '@babel/runtime': 7.24.6 + + '@rc-component/color-picker@1.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@ctrl/tinycolor': 3.6.1 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/context@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/mini-decimal@1.1.0': + dependencies: + '@babel/runtime': 7.24.6 + + '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/tour@1.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/trigger@2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@remix-run/router@1.16.1': {} + + '@rollup/rollup-android-arm-eabi@4.18.0': + optional: true + + '@rollup/rollup-android-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-x64@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.18.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.18.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.18.0': + optional: true + + '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.2.5)': + dependencies: + '@babel/generator': 7.17.7 + '@babel/parser': 7.24.6 + '@babel/traverse': 7.23.2 + '@babel/types': 7.17.0 + javascript-natural-sort: 0.7.1 + lodash: 4.17.21 + prettier: 3.2.5 + transitivePeerDependencies: + - supports-color + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.24.6 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.24.6 + + '@types/estree@1.0.5': {} + + '@types/json5@0.0.29': {} + + '@types/parse-json@4.0.2': {} + + '@types/prop-types@15.7.12': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.3 + + '@types/react@18.3.3': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/stylis@4.2.5': {} + + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-react@4.3.0(vite@5.2.12)': + dependencies: + '@babel/core': 7.24.6 + '@babel/plugin-transform-react-jsx-self': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-react-jsx-source': 7.24.6(@babel/core@7.24.6) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.2.12 + transitivePeerDependencies: + - supports-color + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn@8.11.3: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + antd@5.17.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@ant-design/colors': 7.0.2 + '@ant-design/cssinjs': 1.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/icons': 5.3.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/react-slick': 1.1.2(react@18.3.1) + '@babel/runtime': 7.24.6 + '@ctrl/tinycolor': 3.6.1 + '@rc-component/color-picker': 1.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tour': 1.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + copy-to-clipboard: 3.3.3 + dayjs: 1.11.11 + qrcode.react: 3.1.0(react@18.3.1) + rc-cascader: 3.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-checkbox: 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-collapse: 3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dialog: 9.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-drawer: 7.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-field-form: 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-image: 7.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input-number: 9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-mentions: 2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-notification: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-pagination: 4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-picker: 4.5.0(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-progress: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-rate: 2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-segmented: 2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-select: 14.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-slider: 10.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-steps: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-switch: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-table: 7.45.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tabs: 15.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tooltip: 6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.8.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree-select: 5.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-upload: 4.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + scroll-into-view-if-needed: 3.1.0 + throttle-debounce: 5.0.0 + transitivePeerDependencies: + - date-fns + - luxon + - moment + + argparse@2.0.1: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + + array-tree-filter@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.toreversed@1.1.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.tosorted@1.1.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + ast-types-flow@0.0.8: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axe-core@4.7.0: {} + + axios@1.7.2: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@3.2.1: + dependencies: + dequal: 2.0.3 + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.24.6 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + balanced-match@1.0.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001625 + electron-to-chromium: 1.4.787 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.0) + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camelize@1.0.1: {} + + caniuse-lite@1.0.30001625: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + classnames@2.5.1: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + compute-scroll-into-view@3.1.0: {} + + concat-map@0.0.1: {} + + confusing-browser-globals@1.0.11: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-color-keywords@1.0.0: {} + + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + csstype@3.1.3: {} + + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + dayjs@1.11.11: {} + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + electron-to-chromium@1.4.787: {} + + emoji-regex@9.2.2: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-iterator-helpers@1.0.19: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0): + dependencies: + confusing-browser-globals: 1.0.11 + eslint: 8.57.0 + eslint-plugin-import: 2.29.1(eslint@8.57.0) + object.assign: 4.1.5 + object.entries: 1.1.8 + semver: 6.3.1 + + eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.34.2(eslint@8.57.0))(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.34.2(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + object.assign: 4.1.5 + object.entries: 1.1.8 + + eslint-config-prettier@9.1.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.29.1(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): + dependencies: + '@babel/runtime': 7.24.6 + aria-query: 5.3.0 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): + dependencies: + eslint: 8.57.0 + prettier: 3.2.5 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react-refresh@0.4.7(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react@7.34.2(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.3 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + exenv@1.2.2: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + find-root@1.1.0: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + follow-redirects@1.15.6: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + framer-motion@11.2.10(@emotion/is-prop-valid@1.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + tslib: 2.6.2 + optionalDependencies: + '@emotion/is-prop-valid': 1.2.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graphemer@1.4.0: {} + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + ignore@5.3.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-path-inside@3.0.3: {} + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-weakmap@2.0.2: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-weakset@2.0.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + iterator.prototype@1.1.2: + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + + javascript-natural-sort@0.7.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json2mq@0.2.0: + dependencies: + string-convert: 0.2.1 + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimist@1.2.8: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.14: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.1: {} + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.entries@1.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + + object.hasown@1.1.4: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.values@1.2.0: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + picocolors@1.0.1: {} + + possible-typed-array-names@1.0.0: {} + + postcss-value-parser@4.2.0: {} + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.2.5: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + qrcode.react@3.1.0(react@18.3.1): + dependencies: + react: 18.3.1 + + queue-microtask@1.2.3: {} + + rc-cascader@3.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + array-tree-filter: 2.1.0 + classnames: 2.5.1 + rc-select: 14.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.8.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-checkbox@3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-collapse@3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-dialog@9.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-drawer@7.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-dropdown@4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-field-form@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/async-validator': 5.0.4 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-image@7.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-dialog: 9.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-input-number@9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/mini-decimal': 1.1.0 + classnames: 2.5.1 + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-input@1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-mentions@2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-menu@9.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-motion@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-notification@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-overflow@1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-pagination@4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-picker@4.5.0(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + dayjs: 1.11.11 + + rc-progress@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-rate@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-resize-observer@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + resize-observer-polyfill: 1.5.1 + + rc-segmented@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-select@14.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-slider@10.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-steps@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-switch@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-table@7.45.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-tabs@15.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-textarea@1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-tooltip@6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-tree-select@5.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-select: 14.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.8.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-tree@5.8.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-motion: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-upload@4.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-util@5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + + rc-virtual-list@3.14.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.6 + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-icons@5.2.1(react@18.3.1): + dependencies: + react: 18.3.1 + + react-intersection-observer@9.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-lifecycles-compat@3.0.4: {} + + react-modal@3.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + exenv: 1.2.2 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-lifecycles-compat: 3.0.4 + warning: 4.0.3 + + react-refresh@0.14.2: {} + + react-router-dom@6.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.16.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.23.1(react@18.3.1) + + react-router@6.23.1(react@18.3.1): + dependencies: + '@remix-run/router': 1.16.1 + react: 18.3.1 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + reflect.getprototypeof@1.0.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + which-builtin-type: 1.1.3 + + regenerator-runtime@0.14.1: {} + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + resize-observer-polyfill@1.5.1: {} + + resolve-from@4.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.18.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.0 + + semver@6.3.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + shallowequal@1.1.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + source-map-js@1.2.0: {} + + source-map@0.5.7: {} + + string-convert@0.2.1: {} + + string.prototype.matchall@4.0.11: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-json-comments@3.1.1: {} + + styled-components@6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@emotion/is-prop-valid': 1.2.2 + '@emotion/unitless': 0.8.1 + '@types/stylis': 4.2.5 + css-to-react-native: 3.2.0 + csstype: 3.1.3 + postcss: 8.4.38 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + shallowequal: 1.1.0 + stylis: 4.3.2 + tslib: 2.6.2 + + stylis@4.2.0: {} + + stylis@4.3.2: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + swiper@11.1.4: {} + + synckit@0.8.8: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + + text-table@0.2.0: {} + + throttle-debounce@5.0.0: {} + + to-fast-properties@2.0.0: {} + + toggle-selection@1.0.6: {} + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.6.2: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + update-browserslist-db@1.0.16(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-sync-external-store@1.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + + vite@5.2.12: + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.18.0 + optionalDependencies: + fsevents: 2.3.3 + + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-builtin-type@1.1.3: + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + yallist@3.1.1: {} + + yaml@1.10.2: {} + + yocto-queue@0.1.0: {} + + zustand@4.5.2(@types/react@18.3.3)(react@18.3.1): + dependencies: + use-sync-external-store: 1.2.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + react: 18.3.1 diff --git a/public/ZZan.svg b/public/ZZan.svg new file mode 100644 index 0000000..09f10a5 --- /dev/null +++ b/public/ZZan.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 0000000..35011f9 --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,16 @@ +import { RouterProvider } from 'react-router-dom'; + +import { Router } from './Router'; +import { GlobalStyle } from './styles/GlobalStyle'; +import { Global } from '@emotion/react'; + +function App() { + return ( + <> + + + + ); +} + +export default App; diff --git a/src/Router.jsx b/src/Router.jsx new file mode 100644 index 0000000..dc0ba53 --- /dev/null +++ b/src/Router.jsx @@ -0,0 +1,98 @@ +import { createBrowserRouter, Outlet } from 'react-router-dom'; + +import ChallengeList from './pages/list-challenge/list-challenge'; +import ListRecordChallenge from './pages/list-record-challenge/ListRecordChallenge'; +import RedirectPage from './pages/login/RedirectPage'; +import MyChallenge from './pages/my-challenge/MyChallenge'; +import RankPage from './pages/rank/Rank'; +import ShortsChallenge from './pages/shorts-challenge/Shorts-challenge'; +import NavigateBar from '@/components/nav-bar/navigate-Bar'; +import Dashboard from '@/pages/dashboard/Dashboard'; +import ChallengeDetailPage from '@/pages/detail-challenge/ChallengeDetailPage'; +import LoginPage from '@/pages/login/LoginPage'; +import MainPage from '@/pages/main/MainPage'; +import ChallengeRecordPage from '@/pages/record-challenge/ChallengeRecordPage'; +import ReviewList from '@/pages/review/review-list/ReviewList'; +import WritingReview from '@/pages/review/writingReview/WritingReview'; + +export const Router = createBrowserRouter([ + { + path: '/', + element: ( + <> + + + + + ), + children: [ + { + index: true, + element: , + }, + { + path: 'main', + element: , + }, + { + path: 'challenge', + children: [ + { + index: true, + element: , + }, + { + path: 'list', + element: , + }, + { + path: 'record-list', + element: , + }, + ], + }, + { + path: 'shorts', + element: , + }, + { + path: 'rank', + element: , + }, + { + path: 'dashboard', + element: , + }, + { + path: 'challenge-detail', + element: , + }, + { + path: 'challenge-record', + element: , + }, + { + path: 'writing-reivew', + element: , + }, + { + path: 'reivew-list', + element: , + }, + ], + }, + { + path: 'login', + children: [ + { index: true, element: }, + { + path: 'kakao', + element: , + }, + ], + }, + // { + // path: '*', + // element:
Not Found
, + // }, +]); diff --git a/src/apis/AxiosClient.js b/src/apis/AxiosClient.js new file mode 100644 index 0000000..42eb59e --- /dev/null +++ b/src/apis/AxiosClient.js @@ -0,0 +1,64 @@ +import axios from 'axios'; + +import { BASE_URI } from '../constants/URI'; + +export const axiosClient = axios.create({ + baseURL: BASE_URI, + headers: { + 'Content-Type': 'application/json', + 'Cross-Control-Allow-Origin': '*', + }, +}); + +axiosClient.interceptors.request.use( + (config) => { + const token = localStorage.getItem('accessToken'); + if (token) { + config.headers['Authorization'] = 'Bearer ' + token; + } + return config; + }, + (error) => { + return reject(error); + } +); + +// axiosClient.interceptors.response.use( +// (response) => { +// return response; +// }, +// async (error) => { +// const originalRequest = error.config; +// if (error.response.status === 401 && !originalRequest._retry) { +// originalRequest._retry = true; +// const refreshToken = secureLocalStorage.getItem('refreshToken'); +// if (!refreshToken) { +// return Promise.reject(error); +// } +// const resp = await fetch( +// `${import.meta.env.VITE_API_BASE_URL}/api/auth/refresh`, +// { +// method: 'post', +// headers: { +// 'Content-Type': 'application/json', +// 'Cross-Control-Allow-Origin': '*', +// Authorization: `Bearer ${refreshToken}`, +// }, +// } +// ); +// if (resp.ok) { +// console.log('토큰 재발급 성공'); +// const data = await resp.json(); +// secureLocalStorage.setItem('accessToken', data.accessToken); +// secureLocalStorage.setItem('refreshToken', data.refreshToken); +// return axiosClient(originalRequest); +// } else { +// console.log('토큰 재발급 실패'); +// secureLocalStorage.removeItem('accessToken'); +// secureLocalStorage.removeItem('refreshToken'); +// } +// return Promise.reject(error); +// } +// return Promise.reject(error); +// } +// ); diff --git a/src/apis/auth/auth.api.js b/src/apis/auth/auth.api.js new file mode 100644 index 0000000..ccf92a8 --- /dev/null +++ b/src/apis/auth/auth.api.js @@ -0,0 +1,44 @@ +import { useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; + +import axios from 'axios'; + +import { BASE_URI } from '../../constants/URI'; + +export const AuthAPI = (code, provider, state) => { + const navigate = useNavigate(); + + // 인가 코드 받아서 토큰 요청 + useEffect(() => { + if (code) { + const provider = 'KAKAO'; + const state = 'string'; + axios + // .post(`${BASE_URI}/oauth2?code=${code}`, { + .post(`${BASE_URI}/api/auth/oauth2`, { provider, code, state }) + .then((res) => { + const accessToken = res.data.data.accessToken; + // console.log(accessToken); + + // 로컬 스토리지에 토큰 저장 + localStorage.setItem('accessToken', accessToken); + + navigate('/main'); + }) + .catch((error) => { + console.error('Error during OAuth2 redirect:', error); + // logOut(); + }); + } + }, [code, navigate]); +}; + +// export async function login(provider, code, state) { +// const resp = await axiosClient.post( +// '/api/auth/oauth2', +// provider, +// code, +// state +// ); +// return resp.data; +// } diff --git a/src/apis/detail-challenge/detail.challenge.api.js b/src/apis/detail-challenge/detail.challenge.api.js new file mode 100644 index 0000000..a5cb09c --- /dev/null +++ b/src/apis/detail-challenge/detail.challenge.api.js @@ -0,0 +1,23 @@ +import { axiosClient } from '../AxiosClient'; + + +export async function getChallengeDetail(id) { + try { + const response = await axiosClient.get(`api/challengeGroups/${id}`); + console.log('getChallengeDetail response: ', response.data); + return response.data.data; + } catch (error) { + throw new Error('getChallengeDetail error: ', error); + } +} + +export async function joinChallenge(id) { + try { + const response = await axiosClient.post(`api/challenges/${id}/join`); + console.log('joinChallenge response: ', response.data); + return response.data.data; + } catch (error) { + throw new Error('joinChallenge error: ', error); + } +} + diff --git a/src/apis/detail-challenge/ranking.challenge.api.js b/src/apis/detail-challenge/ranking.challenge.api.js new file mode 100644 index 0000000..debec53 --- /dev/null +++ b/src/apis/detail-challenge/ranking.challenge.api.js @@ -0,0 +1,15 @@ +import { axiosClient } from '../AxiosClient'; + + +export async function getChallengeRanking(id,page) { + try { + const response = await axiosClient.get(`api/challengeGroups/${id}/rankings?page=${page}&size=4`); + console.log('getChallengeRanking response: ', response.data); + return response.data.data; + } catch (error) { + throw new Error('getChallengeRanking error: ', error); + } +} + + + diff --git a/src/apis/list-challenge/list.challenge.api.js b/src/apis/list-challenge/list.challenge.api.js new file mode 100644 index 0000000..acd7eda --- /dev/null +++ b/src/apis/list-challenge/list.challenge.api.js @@ -0,0 +1,14 @@ +import { axiosClient } from '../AxiosClient'; + +// 카테고리 버튼 눌렀을때 -> 해당 페이지 호출 +export async function getChallengeList(page, size, category) { + try { + const response = await axiosClient.get(`/api/challengeGroups`, { + params: { page, size, category }, + }); + console.log('getChallengeList response: ', response.data); + return response.data; + } catch (error) { + throw new Error('getChallengeList error: ', error); + } +} diff --git a/src/apis/my-challenge/my.challenge.api.js b/src/apis/my-challenge/my.challenge.api.js new file mode 100644 index 0000000..6616ab8 --- /dev/null +++ b/src/apis/my-challenge/my.challenge.api.js @@ -0,0 +1,14 @@ +import { axiosClient } from '../AxiosClient'; + +// 카테고리 버튼 눌렀을때 -> 해당 페이지 호출 +export async function getCurrentChallengeList(page, size) { + try { + const response = await axiosClient.get(`/api/user/challenges/currents`, { + params: { page, size }, + }); + console.log('getCurrentChallengeList response: ', response.data); + return response.data; + } catch (error) { + throw new Error('getCurrentChallengeList error: ', error); + } +} diff --git a/src/apis/rank/rank.api.js b/src/apis/rank/rank.api.js new file mode 100644 index 0000000..470bba2 --- /dev/null +++ b/src/apis/rank/rank.api.js @@ -0,0 +1,13 @@ +import { axiosClient } from '../AxiosClient'; + +export async function getUserRanking(page, size) { + try { + const response = await axiosClient.get('/api/users/ranking', { + params: { page, size }, + }); + console.log('getUserRanking response: ', response.data); + return response.data; + } catch (error) { + throw new Error('getUserRanking error: ', error); + } +} diff --git a/src/apis/record-challenge/record.challenge.api.js b/src/apis/record-challenge/record.challenge.api.js new file mode 100644 index 0000000..e5cc0b8 --- /dev/null +++ b/src/apis/record-challenge/record.challenge.api.js @@ -0,0 +1,33 @@ +import { axiosClient } from '../AxiosClient'; + +export async function getChallengeRecord(id) { + try { + const response = await axiosClient.get(`api/challenges/${id}/record`); + console.log('getChallengeRecord response: ', response.data); + return response.data.data; + } catch (error) { + throw new Error('getChallengeRecord error: ', error); + } +} + +export async function getChallengeRecordDetail(id) { + try { + const response = await axiosClient.get(`api/challenges/record/${id}`); + console.log('getChallengeRecordDetail response: ', response.data); + return response.data.data; + } catch (error) { + throw new Error('getChallengeRecordDetail error: ', error); + } +} + +export async function getCompletesChallenge(page, size) { + try { + const response = await axiosClient.get(`/api/user/challenges/completes`, { + params: { page, size }, + }); + console.log('getCompletesChallenge response: ', response.data); + return response.data; + } catch (error) { + throw new Error('getCompletesChallenge error: ', error); + } +} diff --git a/src/apis/record-challenge/verification.js b/src/apis/record-challenge/verification.js new file mode 100644 index 0000000..cad6a81 --- /dev/null +++ b/src/apis/record-challenge/verification.js @@ -0,0 +1,29 @@ +import axios from 'axios'; + +import { BASE_URI } from '../../constants/URI'; + +const multiPartClient = axios.create({ + baseURL: BASE_URI, + headers: { + "Content-Type": "multipart/form-data", + 'Authorization': "Bearer "+localStorage.getItem('accessToken'), + }, +}); + + +export async function postVerification(id, image, content) { + const formData = new FormData(); + formData.append("body", new Blob([JSON.stringify({content})], { type: "application/json" })); + formData.append('image', new Blob([image], { type: "image/**" })); + + try { + const response = await multiPartClient.post(`api/challenges/${id}/verification`, formData); + console.log('postVerification response: ', response.data); + return response.data.data; + } catch (error) { + throw new Error('postVerification error: ', error); + } +} + + + diff --git a/src/apis/review/review.challenge.api.js b/src/apis/review/review.challenge.api.js new file mode 100644 index 0000000..b76d475 --- /dev/null +++ b/src/apis/review/review.challenge.api.js @@ -0,0 +1,38 @@ +import { axiosClient } from '../AxiosClient'; + + +export async function getReview(id,page) { + try { + const response = await axiosClient.get(`api/challengeGroups/${id}/reviews` ,{ + params: { page, size:5 }, + }); + console.log('getReview response: ', response.data); + return response.data.data; + } catch (error) { + throw new Error('getReview error: ', error); + } +} + + +export async function postReview(id,content,rating) { + const body = {content, rating}; + console.log("json : ",JSON.stringify(body)) + try { + const response = await axiosClient.post(`api/challenges/${id}/reviews`, JSON.stringify(body)); + console.log('postReview response: ', response.data); + return response.data.data; + } catch (error) { + throw new Error('postReview error: ', error); + } +} + + +export async function getChallegeAvgScore(id) { + try { + const response = await axiosClient.get(`api/challengeGroups/${id}/reviews/score`); + console.log('getChallegeAvgScore response: ', response.data); + return response.data.data; + } catch (error) { + throw new Error('getChallegeAvgScore error: ', error); + } +} \ No newline at end of file diff --git a/src/apis/user/user.api.js b/src/apis/user/user.api.js new file mode 100644 index 0000000..3d459e8 --- /dev/null +++ b/src/apis/user/user.api.js @@ -0,0 +1,49 @@ +// import { axiosClient } from '../AxiosClient'; +import { axiosClient } from '../AxiosClient'; + +export async function getUserInfo() { + try { + const response = await axiosClient.get('/api/user'); + console.log('getUserInfo response: ', response.data); + return response.data; + } catch (error) { + throw new Error('getUserInfo error: ', error); + } +} + +export async function fixUserInfo(nickname) { + try { + const response = await axiosClient.put('/api/user', { + nickname, // Sending the nickname as per API specification + }); + console.log('fixUserInfo response:', response.data); + return response.data; + } catch (error) { + console.error('FixUserInfo error:', error); + throw new Error('Failed to update user info'); + } +} + +export async function getUserRank(page, size) { + try { + const response = await axiosClient.get('api/user/ranking', { + params: { page, size }, + }); + console.log('getUserRank response: ', response.data); + return response.data; + } catch (error) { + throw new Error('getUserRank error: ', error); + } +} + +export async function getUserStrick(startDate, endDate) { + try { + const response = await axiosClient.get('api/user/strick', { + params: { startDate, endDate }, + }); + console.log('getUserStrick response: ', response.data); + return response.data; + } catch (error) { + throw new Error('getUserStrick error: ', error); + } +} diff --git a/src/assets/Challenge-Shorts.svg b/src/assets/Challenge-Shorts.svg new file mode 100644 index 0000000..ef2784e --- /dev/null +++ b/src/assets/Challenge-Shorts.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/DashBoard.svg b/src/assets/DashBoard.svg new file mode 100644 index 0000000..8cdc4e7 --- /dev/null +++ b/src/assets/DashBoard.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/Default-Image.svg b/src/assets/Default-Image.svg new file mode 100644 index 0000000..44e7166 --- /dev/null +++ b/src/assets/Default-Image.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/Home.svg b/src/assets/Home.svg new file mode 100644 index 0000000..135a401 --- /dev/null +++ b/src/assets/Home.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/My-Challenge.svg b/src/assets/My-Challenge.svg new file mode 100644 index 0000000..7dac4be --- /dev/null +++ b/src/assets/My-Challenge.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/Rank/1st-Trophy.svg b/src/assets/Rank/1st-Trophy.svg new file mode 100644 index 0000000..51c891a --- /dev/null +++ b/src/assets/Rank/1st-Trophy.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/Rank/2nd-Trophy.svg b/src/assets/Rank/2nd-Trophy.svg new file mode 100644 index 0000000..471bd48 --- /dev/null +++ b/src/assets/Rank/2nd-Trophy.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/Rank/3rd-Trophy.svg b/src/assets/Rank/3rd-Trophy.svg new file mode 100644 index 0000000..a03f1b7 --- /dev/null +++ b/src/assets/Rank/3rd-Trophy.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/Ranking.svg b/src/assets/Ranking.svg new file mode 100644 index 0000000..0cf509e --- /dev/null +++ b/src/assets/Ranking.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/StampActive.svg b/src/assets/StampActive.svg new file mode 100644 index 0000000..4495033 --- /dev/null +++ b/src/assets/StampActive.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/StampInactive.svg b/src/assets/StampInactive.svg new file mode 100644 index 0000000..ba46a34 --- /dev/null +++ b/src/assets/StampInactive.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/UserImage.svg b/src/assets/UserImage.svg new file mode 100644 index 0000000..8f66a11 --- /dev/null +++ b/src/assets/UserImage.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/challenge/Challange-Img.png b/src/assets/challenge/Challange-Img.png new file mode 100644 index 0000000000000000000000000000000000000000..704644a6b6da8f3225890f5153dbe1ec08dc55e2 GIT binary patch literal 117146 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 + + + + diff --git a/src/assets/challenge/ZZAN-Black.png b/src/assets/challenge/ZZAN-Black.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3930b48d0d9ad99923479b0f20fd85f31629d2 GIT binary patch literal 4130 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 literal 0 HcmV?d00001 diff --git a/src/assets/challenge/ZZAN-Green.png b/src/assets/challenge/ZZAN-Green.png new file mode 100644 index 0000000000000000000000000000000000000000..97f9d2f4b88481ac7054679ccc177dcd17821fa5 GIT binary patch literal 3804 zcmV<24kPi2P)+aP{lVxg zL3aJRcux9MVai0t*+_IvWRfhzm{&@9fFvCtM!SjRmy*~v85_N=bnLXlbQXZo8GzkW zmBg5sg-y=K>qyDy5EE=W9q7usSnU=CUW0)_cvR;Ia2c9g8D}!FGzQhtOjta(C~x8DH)E8za6{GI;_g`L8GzTkw2R z(jhtv;MiO~g*0{@m~!AC4C0jEDqPN6igHX*(ONd$&b^^MVXn+ z^gY0mM)#l=pK(2|>+k9vqV~Iz#LV?w(R9g#6EgE@L)Gm<3Ma1o@o4M0w?8*&(nkNPm-l0I)ZdUByiPhGgu$ z_;@{g#hBC+p*TDuv8UoL&S{P&y|aEO1{4%e$$D2~mQ*PHmB)_xRyy5oJrqX|N0?pf z`i&%c2j_fTLBgE(>>k$>Oo~*g^9PEjq!-fn3^@&z=L*BT89wG0*hgtWV(R_5b?$2n z;d^^mv~MX;9uCAmO`L!{+?2kzgp~g%NzPp1XxKPHnr)wcM< zVJ?U0q<3~o+F6{OafNDT*OuP^%ayOS7~@vWoW1K5%4y~$3@m$=sqqO$;YPkEA~wrsO7g(rvs1&j^Ob?4hu6MK3UKMiKI{_jAPASQ4U zKLXVvzeNBz8p=mVA@jnnEa}%RQMRpiPuWQ7BV^at$2&X~Ph-tm$@tXpSTfERJ#^fu zH&d8S{LJwCm2gZ*Q>gHvx+E#1O1(3a-AP>lm>mx1=gO^f&7fYwqWWsYR>vAK$Bo_L zGC`dTzBqMOjfxTkqn}eaCLr*+P^1#oRJtLs7Ig!P5rbq^c3t@_>LFy;SNzE|jSV2a zyeIhZ;$s5ep%<^f>`y=S-pNExjq745X@u2BF7<9Q<1XqcNaBcj)-K#qF|IpQd!6fk zoa{q5uvqFLa22BkfTmL|dJ`9P=wv4orp6KxUA~*2lDSvi0vNJWuYhrGQ1zn5s>>o_ zI6UR|;aHbZ?_pxzj+(g6w`R)@{B7f!&2P0jnPAdHc+C9qJ#Jw+7VArxKEU*vZ#c@! z&j}rH)K&ZwmhCp`13+Y>jKeLRid>MI+KS%2n#KoH5EG0kxjV3=vC#sHlumtzpU7DL zNMHxN|5DuSU+D}$N-;U`9Vh&i;Qn0YJ0=k8#gP=BBf#?&C8l4*G@6VM@@5RUz~KSv z4KTR`rZYt~7i}pUgB2g4GX(4}*a%2!#^b;7@4^mg#$z#mc-@iMGEn5z;nWw9@(ZY1H5!L;FdqdC5mH|`fnX-M8qmV(!Rq$Nu|PdJ zb*`Hck~~h`fROFh2aAPOE~Kjmp>~MF{N^(wXiQ4CDdpXz$(b7{Ql`j|-m-Qb4hR5Q z3y9+=0;u>tYH0r=Ft7ld+K3pcQ2NL%t#SY{JqMyV7dsw8-2iU+J?v^}Yy1$;>M>)y zsxPmmVu+W~P1x8noc>3bd94}F)KsJEd1wgN#J*rAB-@M44Gc%1lB1?N*H(;My^M{1 zIWax(YEi+UZFv5GX!kGJ$X~IMLH;`kT9pKzKNcmVKNdRw3sW<`!q4rwb?a9eOsj6P zw7HyaXSy@h8J3Y*>()i77|t}wFHYYnHp%_Soi7YW^ogh9CSVLUr8XyofgmVON`H_H zGY!pyot>&&)Bd}xI3eRP>H-Q9XYH|QGKDxF-(*d2M8X?5&@x`R048F#2Qk5f*ujXM z8;%Hdq=nGUg3{!fpHUaEpuX~g^R)P#aIyD8Y$oTrU+<5cq!qWkvp6y1Vf&`C!9h+d z4CG&(sU!l-vc-{bxM2*0=%0ec!SZ zsDwxr*9`DkVo`>ndBkOtqt3ORbpBP_p_4})9@q0K@rg8_DX9rUKP8gGm0V9#1-O8{ z6D{7dahT-VN)Vn0xg35P5!m1nvcUF5y(@u(sFWQ6@@ruFNh%$Y9 znEy;<9-QATk>=AGDQjqTMyLTmy=G!p+dG+X)Rv#`Guk#FQv6z#8hxZ?okk_amyp0q z!%aBf;~EbJ()?(;SX`WxG0!I`8A}~xrf9*uUaVTH54MbDq#>l1$NacbTt^WAj9-Ai zpEx1)p=0*4*9K#~vBb3cP9{L`XRyn;&VSA{emiQ6JHoJDgIpsm+=5U={iH@C)UefriB`gzyQXmzcaAPbkHl@8K zR>B(Q_?f`Jg&@19a7x-iGQ>7&)!#XdP_iog$yBB-bWA&GX~GR2@h?vFGofp5c@Ldj z@PGFO-b1e%e59hC37R!yzogKJK9iU>Y1ZKzAy0 z@2IUna7s6FOn3+md9?D%@D)S+r)AZy4kgyT)<;!IUYFYL(1%$pDwG%u+Wug`4Ii;- zRdVJg71p;CTOLx^q)EN+-jSk9v^ zfO9bhCpueI>~J$9!Prj7|EG-UZ^DecPThb!Vz$cu+5~R0w!);DTTb=Qcds9=+qAoJ zgKgOPrA5h^*TCPnP$zEIt+M3-uZ(#KCv!j4{6>@wpADS!$ng_<&yUk~70;WelyFbS z6BbZEdJqgO#l$sSWA{nH-qD#HVG=5N!nhY>cX7sVD@;sVMUjE!c&Y|*=6yS`(?&=J zq)&aAvBPrJqEu80md9JTn8X&=mrvw^HKL$1t9V*g8TAqD^_6!)937<5+@dKNjiKW= zuX{Y|@PJXO!hI(~hNU>kZo~O-pq#N!^0m<2D_|8SmnLVt!!^VxxT2y!2J9a9NPA7? zwBAgN1me$}YrhT0fPyDx-_ll`nC`@FbC$Ar5fr$L!jNkZldgNzAK%*#<+-T_DT9Kw^IM4A+3r-2ZY52%L#Mfbphbzh@` zsn4l*{SEng{b|9Vq$^;l{LzKZE!s+9noAbeyRIt@_zv+>(rl$zlb~c*jGQFSe zsrU~(lutJe_B`a{0+=wA+~vbCh5IQ2D6i?W z(N(&Y@GY86gVj5Wi^EZD+7s)hEcP+zmjI5Qq&7fOSTL{cysMqnIhehkgO2pdKk zOY5b^3ZtyHt@#tCf7_dVozefYfe*PzFoArUW?& zLJineoRrl>X8>o!L?p2wM@%kV!^1D?X- Sm1yh$0000}6MySo*agS*q>PJ!a??(T)+?(Q6*I0tukcXxL=xc_>6@AbTe=Z|f( zSF$q6C&^5*Cj6&@Br*a4!j~^!kfo)>l)rp|koorxhJ*Qc2Mk4({(HbXNNGBM`GSb~ z-v#j{BMa}}AcV8Bq{x@5NurZ~A5i8$bNb9pInEDVqe73HOJ7g;%L{aUl98;|Y(i=d zQE~O_@fo+2C5h&FC{7V=cA$^&uOE%Te>_GW1AXu!f2AF%CIKn&e|*4b!PWlXa1K!j z{aBaaQs!hSt+ez9x)$yK#yj7bl~cN!r%C@&OwNB`%`43%q|^hcworRfa@(X0VBeV+RGKB+guI7p_@5|sZ(qsA zgcbZs0W!)7)+cKncMUlIO;Zc}&N!}8CHpjLHkY|axx{owch-qR<<_Y<`NlzK_MCCc z_ivsl_4{p1(&x=#-(*6mQM1ofT%pa(%h=ds`Dr~7EsbBYY+u6C9mV#9gkRqedoe=( zN1`mvT{sG*)cM(NZ*FV0H+ZEWy6V~aWS`PW{!%1CS~`oG9M`$;&7i*!rdQGxspCnALosU``^D_Ln0>qB>e+K7F zxBxReF$eFR)d=hs$_4+^hHetmVmt&+x^LeXHZv;x0pR-lFEh@=iNbNC^6MGrh#5+p z*YhT=ft)wDSicA(z|e#5nsUN_#%`e;JdOO0sWTSgq||dDLs9mXWAfZgVaC~gk0sAX z5o;fbRAEEMp2vaVj_1X^khZ>vRC_kz$`XY5OlB59arT#gkErWNB^$okO6WuUt4_6n zc#9k8>S6dk(T$o%C1sIAm+u{o*L#hrTbs|P^pn86Ky;=swOx&S;UAwApQ(t_LYe@X zTQP(PJA;m&OEj(nHF15931pSl@I*t%dlg|EZvp+tlo@VV$rMSHXN&-6Zg zH$3b!1^ohi2bR-B^z~oJ>)q6_irCvs(Gq0CHbB1raLf3-iKTZ%zQvjKkgMfl?reP}F5NHxVbVt!en?Nf&jQBQyuURI6NkdfI3x$1gYPwr!0NAB z`PgM4cag7Z8m?&IK&PVw6fiyak3j08HLt~g#5ERQbI`>t$K`e>C%!R15iTe;Ga6zf->FeYAdUC1P z&^*rna}x5f=y`iaft*x>krt$)fxrsWx(_)POHo#8g`Jk1yCVRj*vfzYS1W@-Q;5f? z=9lovqFut+f7CMGbx1K8-or6?li5rQP7q5vifGUEWjCAD&nSG19>d6hzPYEH{qdi7tvDuyD`)B>>n_(?)?|;MZY@PP3GtSIZC)~i@S1;qozzXO z`TCgG4;9vsS94Sw-Ga8(4TVpEjTGA)7uP{BbZu-VXSABv;Mh^th%04m~!Fs z1~Z}ssl2mtJ)Smh3>r6_-dVa=St+Pan4cYcv>A9ejE#L5_${Z}5VkWN{sJ@E`c7LH zeku09;J8mk#|$rC8viEEmzZKK8z|TD+zXo*F{`;ku7{bKCU%P$$`hIM%hDk(T&)Tq z7%G+coAF1U-rlkf4>0FX#J-?~W72<;Xz1NVC}UChE&w%ZM3V*?!lr-y;QVED?sunK zO0fn-#(5!~Y*etGFoSlx&JlC6MvXGd;ZMSDSjzwVh@SkJi9b*Eu#k$;^JFwqS&90P z86aBqS1+2i(8*MgFAx4{BIU^Xl!*h+Z1ZuI`gDGN%iLJJyCMh@lLFJDIn1);KgVOL zYY*F_jRx{cFF5npIh2%k^^IH4I;j>06AQB6N*wWD86{WrtS69&U{Z2&CbrL~B-s2* zQ?p=l)ub36mlG*Jq|oWZPU}t|YW}h5YzTo&XXyz!RQEl`TiT!2lb#LHl&Y*xyw3(O z`u_*0A^@{h%xvql7XT%zRU25foPoJ(E|WO);xm+c({?J#zjd_RQter%dss}D74~r> zXqy7Fb_y|{kkX!XAU>ufGtK>jE!;h;FfL<#<*3hkqU!QCcjX{E0~(e6^}TM(G$RIx zFgHHD_c3>h$QxT^yBf3-HUNjwDlP}tH`@w(f9%e&iu{KwTv8d0fnU!3Ar zet-o@iAkY=Pmtc#RYo2?o=HDkkU>_W>P?W(ygvMV%4Ml}kny0C9XI`FlKoxT z$U>WuNJ%^;FZ9lv)K6GNpJ(>rhLSi`AGR)IvHfS1KB>-I^*H!#_hJ?wC*jT~8q)r! zZ9|bH60KK1S*GCnfA-hoFxrEQ_4&YDzQ3sMwg!A@_`^2EzcBQ3yQ{ez~o{Xx0e4Vy!3*mKR^peJzRDc zTl@x0KO2(Rh!0{Z*+VNFQp}@b76eTQH|u-oO4|7@Ej?8{4p+bBP`^*Vy$mFc71I*l zILgbgk{w#o(l^rk1Ln@SkX*kEkJr}I;_-?(?i-y}91q8d#!@U6vX%kmjLXe5mqjp{ zHA~gXf=I@~t78*8ycHo^B`KOgKli;pTYjB}#N*`*(<&9A*1!o4 zDAE9#0=RViG1Y83308byeM5wP3?V;tS5CL40)e;qPP4$D*-VKdP_?!f%gv^k;0Cy+ zu7d`RRv$VABB3Zw>!pGew&6$Sz7*@~z9r#L-t`aTE0Lu#*UIM6)ZY%1LIA#4DRWOP zAPi5WF!^tnm;P^VLidypSDW(dx2$+mLxa(TAipy;9rs(tVRsjVRzhNe-W3%Z@e-HE zd!v!rgN#M`sjaZu{XKn#7N4CT1>FSPXgBU&&;8EcpuNs&^0}10hH78I)i(8S;IhBS zsC%S-dtKXiH=-s^@kUhhXmh7GX~X8gkv6!Vm;(UU4z}=ziiY#O>-Dkw*obYhct_`a zP|42l4aL*Y);lNC-9tB`zs6@Z&>Ic0x8%rf#7Lv* z0HOU#-5=W9?W(8C=iHd*2S+sSlf~6(|C;|@w#TF58<19Q5yDHydFHUsG^)@m~@9>z06(KFMK}R}>&A^sc!4nr(0B@*X)Ohd-@aSoheG1{Lz_+8hQfjnS!kWIEA6G}Dg#*O zY18$(P$T&;Jx*!QHGC`o3rXc9q#`bq)DP|~5lHLFZ6@C^KL~kUxLus+q`Z6K2(J9#ZCx8B^*J}Irf{`$)U78*sM7j&KTzZ3m~c51il~|iJ@&MN$9|L&?Ib_EGOrv` zwn&DHhaBx3oBPQRc%8m}Tgp&S`!}gSS|4)5RoV1zLf5WXLo`}DWOcwxZj)Z^uZ_k> z3@Q?oWW9S=M*UwhrP{*}VHUfs$8J-?;wG5O6E|{6hPphDV)GM;ctaTAW96>gJ9ZYD z&EBncngu)iQWAWm!(M2RI`Y?76KqEv0;EI(s+eFEcltNYh+1bbn(Ggd` zp@+J8Q~x|zC;WH?H*Bx-GlzLQeTZ~v$_v+it*b)M-gUQGE3jX&qHWjeDVXcv8@}+g zbvmuu{NA=FLopvCRw;=nq#0pMe$vni0gkWr;`U;je(cFAr7we+tXTw=crTHn7{3!G zq=jkjgKfotgXvr4G~t$Nesml!U7Z!-?xZQ4RKSu&AIF{6_-KtzzBy?(#U)#^>|6w0 z-@J(tn)BX>V8i|ZGtq)LC41-1LiM*)ip~{@mwgYv*(Rj)c_Dre=<6U1CNra${Ah7H zr+|)|8^?bD^oM$$B!T)N<3g^TCPci){t1?rQG%DtrITUJiY{IAsX*o4@PO6( z%*mCkD$IoWD-oH-&PreF9YjPT0*URUz|8Atq*m2_Htmi=7=BXTVGqA~Eh-%5-f<+T z(PGEhn!+f`wX{fnXO4I!n{&@%8hM^#!3Ce^JX>`6!t^jisJ znY_a(us9(w7#j<#vq?NdITn_UjHXEeRUUmPqZtyPSs%XEXFzWy$AXS4Zxw4X;pF{ih~|MN&}7t>H18RT+LU!m1OFeP*YB|;#zX)8A> z`8j&9?6i=)-1_c?6*jL}Bq)c1yz{cufvhR=moc4gP!(FeE|V*rc98)Wj91Kt|JRL8 zKHy`E@dl3Z`w2D*zM+@IlZCzoq*~O&9qV#FX1$C|M1u1L%Zi(>kA-+h2Ud{$Nt{d1 z+Sa|DK$AK1=G|(lao}ISDP>jLZ!kQy!zwMXRz+yI>UYz*nY4mo*#>Upm zm(l$W@SpE)3GSH6a;CG(ZVO!J!ZoBDf`Z5TY~T5na)a=YNqB;W9*Fx}IU$$tYTM#8 z{fjit{j3|p<`K7NEmDWEc<=7&mPJwG3)|f1P=tbW4#phsH{ADD)!V;X7JrBG+HIp* zgu|WS_^pqaj1cyj-dDLaH0vIHJPiw+ofC@yt-Q)(UTJk^OmD{U-479QnANp6%`UwvT4lZp!a>S+e!V zxMXTO^<(X7R)RF4jyt$2N6%)(3%b+yg%UrD?f_8EnZ>s$W!`~@b7-2W8mL;a*F!`@ z?Wj=CqkQMP%@Aaka@7a*N6^nL-oAHKBSYKW}Hq#IZw83HmHklA5$ zZfPfp<<=^U*`oKHxewPNYOx`r0!YQ$_p8tv48$!a4bIFM`W$?I*zb~9WBeLVjJCh) z{(vNK9UTjko{&<>^cfO|N*DNeoBBX0N<)K5-(qFVS@!YgcZLd@S(@*s6?&)f4-|g7 z@sE!EtQPL=q#+U2Ntd9`Oenc5ft)Cf5naDkC++1HzNdR}5T}peRvxHG>q_m#CuzY) z)6DJkCfKBK4$`1Kq_#etLmVE{&52?0+NO<=R5Uytrwe+wHsIQVYO_hyptN)ZYu*6$ zT;gkfOOdmb^(QN;G7gS%m;+$Mt5yxq-C5PPi|Ech>S{w4Kxd|_4i}tjpvPnQI|fYz zOx7*A7~NWOFN>V2Q*tUgZOYf*B3V1XUA!*Wsy1Tca^Cx&{tl}3#Y?%2KRlr5jH_j* zPATMz<0B{oGpQt_6k`Z)EaRPg_V@fF-xUSKq(Xm+4Ck!GH4hP8wjGh&FDz%XO66WTm9L zGyMQ8@YDX)C$k9~oz7$Hk}Q*}*pRei_hpd`{6R4J5+(v4MK1vvV;(^^!_ZN5aJJ#+F-eU4wmJ)Af z78#|REk<_5*TX}RE%-4eH;zR(eyDh!gcUZ69@G{kPrf-4;ob16nmkjcwfwT}e@4 z@?In$k*z|Y5RVQWRb1MP4Lq4VPFDt1=WHUqGMxxcaI#nr+GrT0>rczU)EO9))NX5G zT@VkKAuDnG+?a_)juy~UPFa&~e0Ml7h34d|mR zMOF&W)2`?Xiupl}oxvD|q8S(e$g1J0L_h=*lo*qfR1L)v=l7yc&CJw+xA;ms<@WAY7N;jg@$v6B@7aZA+YzWj6M zdeqdTbyzK=n1&tJT=c}%)e-y{>Muwy>5+Y93}@_bzE*E)=lr>O$~m4Ea)D|1P@RS@pX-rKAQ(JZuiBY@k+kZ^Vewsc&fmI zE(v9nFA`U$>>Q>CSYIgcRp>c(|Kl;-ABhr;FQr?Vvm}iI^U9qwsa^5M;vn76BZrz3 zt~5?{bP@URz=cPjE`DbZ$Z*hJkNwVF=bz!Yl?lw_Nm38&$%ORUvv_mUp1NK1h)M!F z=5e^(9EeY`-0rRS#jBmI&s<@N{K8l0qp=84F+p;f<~ac#emjS$xy0tH7Cc3woWT=m z5nDs8En?&z4A}b?QFQ~;#z1Unw&6m@tiSt?!1WL-jbLB5h(k$vfn4iWBb}zfAwV_5 z_JVrx^w#0R2{f~`Qw_-}B~I#fnR*6qQ=F^(yu$BUAoh!hu0#g%EQyBZ^k7~%nf1tX zP@)u1S+Fnin<=E$(7Sbd;vZojtVSKTv*if=-e#kTugucvov)#rGHvR(IbLs$0`JR( z!)A4NjT#X<*Ai|6oNIBTCTHR~l_Ij@X%&-|p2Y8roPDBKK6>{-M_jl7rE(v>#l$r^^0-6AetzGPTTUeD~_BH4w z6M1BcADvZfq=CnNd`kICaGw}jlaakNT?h|~3GfeM*tvex{i~N>x~|I@Ha$cMbb$wW zyqHSb)yfoaJh3z6G7k7h@>hqOX3(gAj5!Oq=J8Vsrp!$)y%?!H19ry-*J@PuR~{LH z{qHP;2FS@q;TrIEhYa>9{f{Q1bGWBwJgkr!-JykUV?Tdmq@PPM{5(85X(1AFfaBhf za0V15sbo#dU*ZdrGQHM1BpF%FAYZ;rzCZO}z0pJw36<$x2Mf$IwFiIhc&tKPIM+oJD2T$&HjDZ$Ni#ED{tnD@tl4OSy60|z( zu;ces;TIX_(o&ASr4lQZt1#400PawiMY@B_rE^s^r-+ymujeMaBcG{{DL2}=nY|z@ zIU*pZxLUC2*1)Q@EdOWK8y1B$;GhGiNn<&2lF-3@u%OG}TPM*=wV=Fu9Jqfy z1*stA>J?hLe=5lM?}_)sloVVhI7xz>b=#}CPG#s<1c!RLM~ZW+xTIDo7M7Fp*NIYQ z|A#s#7!+wM;1{XAg_E-*?Wyfrve8m@nww|gXGjq=(4FwkIU$o>&Cm1j_EF!gwbkjB zm7bN&G$BWXmPrVcRHjgM@;Sf;M4OS|@~5#cXJv(XSM{UYik=0=hQryy^4pyKz>7TL zbUN7e51IJ$WUepwrN=vf#bX+Nx(@&?!JLrC)9OG-&ZN6 zYe<|MPTa@S9G~=Um7`2-k)4J>BXr-ecj^)` zp`{`KT17yuabK`Oh*~QB{gg)HIa9RNSbg`fpm@HtkObNmWo1uvz)Y-839pa@_Xys=W z5gNrl?SSIv@QC>kg|8xAzu}ZPWa9h@Mcqa9JL=lw_WwkkS?UsNKe)GuJ!-kpcM?zc z_^T+`gjiGxZ^E}~F&iIv2LK+ZaNOX2PnOF{Y|1RhHHTLU3i|Gq!YsZlZTIP_4J<+6 zxBDtVrOcBL6LJgsJAb8!PJ+itY-4N5gF6scXYyZdcWZ3TlLrebfLXTlxuscN<-LKrX_YnG=j4Cn9~Mbj8?LrEi~*0 z4p1Cu09<yV4p0#dI;9Ixh%FE4^^J}Zz`q6ddTYT_~aV?YjY&k5etO>C(RjJKOW zr0~ne)?jtVC-=5(bbU<5^t2QR25;jK!&+cUuE?DJGz@Xx?14C}>a0`OJZ=ZpD% zQiGmnR~IH)<4Z>N0Evg&{eT{2W=X$> z$OQF_r4C)hleAJ95nya8dxFjHAxFRyDt@8X$C1EZ*BPtnE_cua1iP@VMa07vmhGL} z_p6kFOsQ@ulF)X%U46pOoDw`Ox;1$1l3o=$ZR&_Y5oBi702dldLZw!CjwPrC_6fFR z_nX~#-xt(I#A==H^!ZZiqjsv!)?t*TG8tQLK}tpfe$Yl=GEyoC#M4a#u^iq>kjDDl zLcFc|dyzg|t%?&CL7Gh6;_Lo{?)T06HT&M;OnY(@smO#Rpt&phVC{FK@Iu*LfJbeK z3`ud-@J>rKS+TVM8a`cmH~K4v$v(RhA)MzJuv#+b>U(o#Y9lmPX~i|Hp9bf!eU3A!z{;=E z^QnUlt(s@6Qk>#cFIo|Zj@hzz?@U^<|H?dO?Zc{VvG?giIkMpt3W)+GOOHr^8&!|>K`3)3o-Z6FE!0%ih>FyT3`vul<~jYMVB98bITqEL~;Pxe|Iax}Vneh!oYbz)&4NT$-i`0;PG`R! zsW{x=R3QJBP=ifYH&95f1Q|73{08^9{)x8f@i;ak8&=_a#(2EeN?h%E#P9fCt|z^2 zAW^5ge$7P9rR4ez&?YrG0%vQox~(qE8}p9YnKnB6Q$~(bdrJE8RJ91louq?PK42eN zoja4_jm z&!0FLHaAcdL{Q-qKQ>cl(-c9$QgkKL`4GzZW@>8Da>eQFR)PHWz%FY3&ZOEfFeQwE z<|PnQM{UakcDfG3SFrU!rmQe-6J+BMxe>%!F}4&2{qp7l{dE0~>9H$DS(@adtE0`q zq6xpIl<`wLYWHh0QenuqZ+)4aB?}=X6sp&A+Btm@=Ny;#I^o!mwjL9UmRWQ#9-m8V zaRrZ`xBh>P3t@tvN z73&IYROkJ73Je7V{O?yhl+X`Vx=^ZlWc~Av3rX@uGVj}S7n!79D%I8*S{eE?+%cJj)hKSa;P?A@a&i5NsGTQo+ zuO`jobT%-jAS4x9*I%H$Xnafh!+ZvlN=51=~kGo?Y*)NRP)*!(tR^?WwRw1vU!EOAF1M0(fz1c#j(`+hOtCTmk}^&uK3TpstZzy?=z0{LY^(yFT{9Amy;h9R!s&g++%utin6`_ERW_2bSGG ziV&|P0iWxlaKq?k)h7rSD?znL@9v2znN}+QSS&J2}bX$I=7*5=B2`#zCFGCamule zvg`M@kB-X^c>ZJWwjI!u1(R8qnU~ee+;I+f$uuodV~pTusa)qe%j<~eL4C2ygwdz- z*)+d6QvwR^6<>WxNo2pL>?~W3a`dY5lv3tK(-Wf zC>K#dC9!C`M!PrFUF4QBnfD#n%JpNzZD_ps+6br2vRY9VX^QMgbcywb&d*dyX4}tny$(83& z_-y*Cs|d;>(KLDn9Fc+Un7OjQ9cy?xu0}{L6XzSA+e0H7D|o2sMao{E#xVUOrR8KU zxrbJuurQa#tK{J?}-5z=*m9k!$w8<&&{@3W1;`^`xCZhh`>^qQmd?vM9% zqB;?c%g|pC{lOfMbI5I{by~_eA)U`ydtynz0iv{XI1hY2IfoL(=I#9$tfTi9l#C$` zbDI-9LcjR?eWC4B8}WtA%WVN!-E#?7?DpdoUx+}P-}0XU%YLyvD6XHMy!>4}>*J>d zWj91cp4MDC(Wk|0aeAK6tuKoht5cR)?b5OZqQ7n(ZDyUtxwI6r2jHsx_1!46n&bk$ zM>2(?zUc=&zSG%oYeF1U00v5o2zGF-fNeOaMq18c>n>5F^M7fjjI&7$tfrRYI8Z>c zMamZTS6Pnj0}}K)7~+=1SxHY)OeEj=!PxGb(IY#KP?n6UCQwP5pPsk_dSE$8I269- z9nqtu=92s0?$#IIuo_iIb;JDGmL#mJV|Z9->EkbtN>Gb!+@#W&x2YWpLQy0xAO%~{ z1V8E935GXSW{?-9l$hH#aJL05C0Sw|)yrVbu~xNC2O4u)&p7ahmGenD9wlJX#>2Wi zmyx){FB;d#u@qW_6V z=SL202h2#bwK-m#+*r58XzA7^WVF+o^6{X|qbnsEm{JK8mXdCCbv0gCb@dQ(vfQQB zrLR<5p&Vg}1IZ}HRAaUl>HB8(b(-(gdA5-GIb|jyp1UWDcM8#{cdGY#CJNDj zHV>K{QJtK)a{?jR9IS;iuIz#Pjk%{u5EmHh=;w8W3H`l8!_45M9VBuv-_R|K{6J`G zF-7}TgzmAlI>=~&9t%O!$JQOjJpAhIg7kbKe2Z2St*k|qOb$?qt*60)m|j&qF^CeJp6DUu0|&wNdKvJ%T;1z1tQwvp4s-9PrHXQSWYjs~%sH~)E{&)YnZP&+SgPzB zY&0LMn=7-2+hTYz|_BZ@<{shEzXog~8;r;@)?)Qm0tq>ID5ZX~MrSaTw))=QeC zr$#Pq@N6ljU~%z}efIhH73-lbUs$V;*?Y09t&6~&BYt5?aWSLfR7$^up&Ld3YW@Tu zztA0j*48sCyXNUkQu(Pcci2d^x(D_{m9WvTGO$fOd*BplqJgJcbsE|c7=(H_dRhAW zX|&O=fF`W%;ut$oD<^b@X;#G)V2b9uHUA1rcddFUM})M^A#acnXA0}N2)WCj?*G91 z8X8ZpM{iUlWmh-rkq>dVc&{g-EQ_NhM0t{SAWtIcait%yP*PeGEKSYE@3@Qb%rYDJ zlsP9aztMgMvC2(;(u6tqZg(|U@~{x0c<#l7LAEn=fr z^DnCL=EBC65T}Z1gKYWL?Aj!LQfE%8NOnnW4u9X<{UY6_P5W&=RaqO9W;FtNo(FyX zXf7PGwrban;7>(|ck)+(zr9)k1%;ER5wQnk9uRN5k57UD8@AN)ub9nQfXv;a-5C8u zD}seihqHy?8fTQ4R-QI(XI8+W%shPiW2p~rOt!oiSEY^GF>m(g*|0g<)l1xU6~?Zp z4&bWbUsZWfDWspnyhejUibJN>&d09&`<-Ybq@Q62t=OKWi~$kA3ycYUNLWc_kVI{` ze&yY~ts$YlD@o*LG@469nJXn-XTN?(+q3SnaiT-I>9?fSo;B_Ej(r5pQr zC~wd>A0{Fdoa|*bWu2PUKlUOy&0q6Xcf*rNC~?r=KM%6xg!-ke4*d4I#{SemdU#!H z8%BMsNxDL&dN0aMMJN_`7O=(n`>!>f=V4s}IGt8lAX?rlXtnUEuS^w=7Ywy`nAI9#C3wo zbK7$r1t-?b9#c7MkX^#F6n)y#FnmvrghWZ_rYSFZ`s`wrwyUnSSs$t=d$% zsga){=#*xYvDQYdo!=Dsm{XQhq5F1t7fpr(M15p9V(#YQcTqo*LZ|=%kDZdVwaVn> z%mCD7i{E4kYE>2l+08Ob64b#wwt_LDRHm~H*j#HWpHbjEg6~B<>&Yh}juzVSt_;w2 z%uw&g6$d|2W5*ANQ?^lw6O&mI6@x;^O@9TjYMs$TRoTZfjiyIBS3$*R9=pVz)y+NS zFHGgvS;Mz_f&V5@9DjBQhf>rZ^I7U4?OSW1cB4{ZtDPd$-$P{D{m$lz#3C&(By_C$ zGkJ!XfL(8|8}7rLP(dZ})`z{i{nX-#>?K$H^W9v*4S#jIJE9IlR-dS0 zxPotdyIDq^ZNfrTzZ3;)0nQ`{y8+wu_MxHfD-kqYWzDD0(d6sc;;CHYeApMf)XalLgzs65JuJ*0J!>Be=atnBeYJ}f`l z6aTnWOhp+Mx$uGsi!OY_?{XcLxAhBX9xok0J=e=&fuzL30a12P_E6`DB`OBTXIf&I z+9Bg+l5bw&)iIJHS$aCsn_ET@4qKr)5n*`1{$1^2luI9bm7F^WN)sf4&M+8ECIU7| zq~qtm4bY`Ur<=*+fUY}4xH}wPzfa!FeC~X%ELh%f4j4Zm)o#MICH6fgu;}ZrkKOXF z!IX^1$~T-z-3e?B=r^k^+r1wi-Y|FRT_|R=CTdVdwXXtnH0xzhpoOZ4wJnZdkQwTS z=iLsh;TJjvlpM34{gJATPuuh;J&55fKs@b!ekKJxJ8{Szukt(e*m)oF1Y+`|n~&T) zfOA7Xv%9G0Kj8#RP@LMYM`bZJ=wyY7jCW2U#xc1pl9|v@c>$Bt`9B+lD!JH`9&bDc zWTLi(V@sUyoA|^T?>_*_{HzIxsm1EG+LS1%&_OVi0~?FIQds6#IaVl-|tNy{5~vlB9daedkFS5NRWT>c&2nrye}Mo>Y^Wj6c{B1P!M$yu`~B4<5$_KI@r z+d(!4?iLbRZF&dR-Vv}q@@13t$66;;)nT28=rl9jN2=QBN~_W5-?91U56MyoT_=r? zIM;WN{JB;<&%aT$j9~CKwtJ^b3jh=~3H+g|GRSfJ_1*cqnBZU2LH3{ZBcORAI}=@Z z1Ne)i)K2jnW_QUafUdvHBwMNihg+p&i?c2CXX4OtG#1W~&P)7nr%4`j zOwI#bgBU@STlY^CKU1-|Ty&G`ueNBcyrM_Jh2B|w&{sE)6tuJS+$K)W)p&a;w5h_f z&jhq6XVXzm2CahDkX$IF;P>yXv@+?Ot+4(p$YF?(P#7wcnuXL<{EaWSB(?1w5^>}h zMD~N|Ht2LoHhe|v>(C6=N=a4oodTq*&wY8np&~daYJR(g_8mK= zbCT5W&Wy(uX-xILk=l}1Q|p26&!!5@pV^$cO>TN%y>2Q+J>fM%#zWycF3{P4*Uf&G zfxY7JgE=;oA-RH&8CZh&BZAJfWe#D~F4RtxB|@rP3Ge8P4>N5~3NVo7kv}EVzm=vc zTNTE?-S-&Nu<&?bP*rW5m^iXiC`G{Uv%0SSIE27m6JifL-iHtq^2l= z>cE9qsyt}T^@80~?R&v_k(=sNsKzK= znD0EBdL0P@qMed7`GtvF9u3#MkyeomZgtqBI0*$Eza4!@M?hN&^&|lgM5AuQDBL&B09HLRMHVUGrAm|6x*Ux z=()>5d`1S7p_3EA9;Qm!@Vd9b5qE&8XlOYPN!KZ>Byq0Cjad>AbVkIraEpxIA*hPG zj$SS(s|87)s}^Y^jV`+XlH6d8HekTkJB*p^AJ3+s8@1OqqAv|vJ0>?FYy?pZDoBAQEs6>U>@8OL!gu$ah7=efE6p(9@nl zH!PSx-dXGLhbH=@&MqvxY{YO@5E{^wgDCU83dkmc8r=#gji$H@H>XGr$=lr}Te;1h zDb}oiS;>rK6h^E*I`s^v+A%pPqVhzOv}9GgUD(fOwL=^oz5&I#3~2-5ZcY~z2M#;7 zI-s^S`gbs|r-(!~vN2+t7V$Vn8ACyUhMm0wNc1X?J&3naU+e243S!!b9J7NoiGPI& zPxkQAn%}uCPTX9Tr{t!&JtgiY*Cnwoefxm2ASl-ICNI)>rGprXzB=679b5IXb zn_eD*HIb0+$TFo3g%YSitv=?v5wrJ6_sKP^V4K&HnBn3<1P<`ZXiY7*)g2_i4MVJLTcq`B)xIInuQ&%Zz zFc@+8Hx(!dew30jxfuP4>Xo8-u;SaToTxsfXO4Fpno~P}8?=5CKTtYd5$Ihe#XmXu zYSG;?o+kU%FNb`Gf#a!^fG&4P7^3a1%L@EaAYaqmS;*PU008}d*d7WH&84n(Q5O|$ z-5V`98eI)a>FC8+)mS@DMy@}V2`hdi&svrK_EP^#(`angc#0l#(PVO&)BZ>MjbxDb ztr_%`Ri*-y?_gMpK;I?@%oIvtxj(#2JvuTL$25P;0!4N|G?PRWpzo01PBFsOLC54% zrhh;AL1OAl;Sjna>aE(pedluw^I?*Nmzyly!pF!4?DdFf_S3t)d%j>Ab;-KQ@$F!d zY$0y_PH{9hnIdri&ydmE!Q2HL7^D^!f9v#sYs*9y3gvmP$5&=vW+p;dH6Yn>>?bi@S+r`0s0Sfo0a zxVJ2M?C{-3WJ7E^!G(i&!BLwUcJs!!UNkp3#84#n7Q}m`Z}jBr+H2x%m{Rd&m>e`W z$5L)jmc)ykYpmVWq5OC-iuH^*V(DQe+za_g&dw?F3&OSq|HOv!rb^FLrjkcp`p5`d zxzi>>*^O)t&ed?rh;gw;=9?;0Vmt(yKF=ll)OOV>!b`_)>)F3bx+Z!R3jfXNw#<2H zHX0UMG-)v`TL902mPH4ewPf#40jgy8O~~6p{p1XHT!%0J4@E$_zcl-AWl!Z2Y0v!= z%z=-RGa)DDzk0TPB=IKtKuH7oef5GNhPXzL8z|-O0Qzo2R6dQ$sn5~|aYnOnXs7lE z?ts1O-$`>YtsFjcVi?Eoa7^ZzGefxd%U{BYG+(%YJeuQp;L-J;E z%AYrrp`tpLSP_d-ccE0anZs?;motO2byS!eFNGEpbp5?A5x2K&Vl?NbrY6aeQx=OQ zmU$YfqlCVS(-r!AQR+6#mLxG$@~qjpNXRZedmMIXP|E#z5sV+QHOQNH#c1LT?AS>`C>MH<$r&WL_RN#y?fs}cI<9)dX6kGQ zQKI1ERHp>cYLIN;%CD7$lksy)kj}S>BgZgL*>gSOZ9hp9CFdG1#q!yt-%i3QF%LX+ z<`h2r+0WtdDe|(@4m>`53g7CK&NGn@$ z+(YPc%~qHVSHboz({>AyV}^+eDAU&X%+XO%)?t(qdLiI+KrY5Z-uYotv?q=o!4Gsl zN~a06|2H&B&q%JjB_~ddzP3O@x@^+bv00E6gYg>j>HyU9aps93P(&$_z+G&ruT4R6=>GQ{$)| zBQBD>+lFg5NU5jDSvwrk7D#n+5RDeEzLL!B4Ya(onw6F#Cv5MP@UtC~_bm<|UI!-C zK=h~fAf`FN;c+IVPfvXy&{*O+je7C;;mc=w%gS)Beoq6ir@8V^tWZ4kLa8OGbh@S< z{&nymexv$E6rg_#c*m9oLLpX}PP{3;kv>c2IQP}CY3=>XSucr2%LK1@W;IwjX+p&! z`Sz?tc(4=2#HK-{4j!q-LlgeMvyWo=?JJQ_FAh~o3?mcQ(*2N5GV&Dg2GC74~gdiV&_&Y?*PZEb0V5(R`q0olWkx|-_CoxehJEz43nB8VJ_vg*< zCkhH_j0zz~E)={1rei5EJ&CV9Hi!Z5G_L5X;`s11j*m?v@B`@q&K`db&+=o3kh$$c zs)C)PtI4|H9^eiEL7go;<|%rP16>{|Og>+#uK4{0rnr<>V@iT62J!Ebg%e5Ovh$aV zDXn`!s0Cc;jUV|kk97(^a(m82C#c_EEIoKGuGE(T%*9d((`}sFo~UD|zQqgs;`4^{ zRRt-IgDq;dl-2H*%}S?SuAx+^ppCuLz6SSm<@~^f0ZJ}Ot=yYCh1#=6iisnhD5 zX|~Gg#&N@1yGU{wIZDUdq2X_+#c_Q{M}w{tbj02Dp20CZ=^e%Gc8#D#nUuUhXaF-b zYuBf{;k9?dl-Rtbfy<^PUsxx&l^S=Fk>h&CsFIE(o>3m2N$|R=$K9VTKrRW{3|C2D*gor@;QWJRborx?^3z~jragrfsK{Dm=$hiNRO z_53&YRPY~vut16fV$DcQAhZv-Mg()#Qwl|*Vhhq<$JS|z3y1EPLv)_y^BGKx`_kLU zbH0Nl#x?oAYsXXAvgJy2w6zJKk;?VuQTV5iDbf??Oj`DBDZ-M3^e`R5loFZFws!^M zOuOs22yHXXwItWyDLl8jEInB_UR0CT4_tuRA3A{O46Q5PczKP>Q2LJkVMNIfL- zWp(B>XAkjosjzozRsjrtJ#>qJ5!pxl2XRepHQEfss1qJ6@U<5Pd4%lgdh{%-q_p^g+w;4lDI55QDjye9uk>et;n_R8$5;Kr=Gy7 z*S!vl5#^8x0hftqdHTP>ClnW@(yr9ToDr#Wdx``(^)ByBeO2O0>uSafqe+|YCsX#v zwKgXlGKmrnIMT2Q%bXn@yH-L@;y{(#WyQ$Numa);x#tU)&SxbldF2<8_?|7&%0r)q zTqtAB{>~J3Oa|Dqzn75X8?c=?%D431M+!0|>mq}yY@Gb80zvl&%U#%8Tt@d*fu_M4 zSKdT5TYJ`^E00CrgI70{H6v#_k@(8ZmzMW8Y0d1)owh-cnBxm@pwm_to8d(XPAmTHRvSc;l-lfud zHn9k_u!_b!M`!nGMJBccnIrbx8sIQL?oH1n*q-{daK~)s2Ud%^#1aM=tIpu!I$A0Q z7gH{~qLhu*?W(mnYP<&b-6#S{Z1lb6EIyuk3_n?W8BM&J@?Jdf5`K_Z{)7u$yyZW` z?)?V*C%!A#Dnv0$S{E}Axh&xkQpMQN(9wWqk0(XEHJFd8CY=ds`k8VQ)Uau#E_SI*#r!cT zf>+R{p)Z__u=)|rqi<=)je{Q|?<=D4( z2fq2>1N5E(I)V_Z@7#uVU(6e4A+cYf#D(J#4{RWh_A04okkI{X`7oC*@PuQBhX~}H z+%M@$bEB&&30f_~0>Ng8`0>WZ5XOq4aWip2$Ih?#hHJjBiEfzi*oeHVH2wf<*1BE^#}hRy29V~Vyel@s3-*=SuHLr zRcdGeihfbDW0DLM8A5l1LLUm5Z!sB7kz?muGNC0+iA_nFh&36|z;lY0m1BnNuj}3b zyyg9{8()QRs))+e5RTS5@y~5Ph=0z%3183Lj#Q>-a`*$1zH z!jfg!yk!G=dk0)7g^wENT+_r$(>3%hSwUP=E^%L6nrCkmO9OjY5C0$V@#i&Gku!@xi{eRayFTK{V@mYfnw=S+u$g84>s=*4`8`XPjhm>xlVf{ShfcbgLz}%Pp4O_E&2i-bQ3)@T z&XsC>dlF*AH8c%Z#R>AF%stT*87c0|^%VJwi)3&g8k@}^OiNNGx@c_PwB=@*z*EGR z?HQRur93Tkgdqn=S7#r}#2F>I&oD2fPSX71xjcT&3y;Mi^IRoD?+u;k;Cj5Ach9k- zzMAO1q`_q{hOIbDiocicsT;OF@3p>RB;&=XG$zx$IH2Bd-Bxy8S6*=iMuyIaV{l}$grn0wR$g-xLQYAd z0h1QVCW%39Y{W@5A+I=r=+G|O-$Mz^w`{JHf(zJhK)k+*0|dmg&se?GTFzGMDfRA)AXO`6IMxaK^^qDkDG7d!PHK?F4~5> zunB7odA%8lacGgmWm*Xbkv=q}j7G;sabhZuAQh-rjce91SJ|-?`$vw`1Rlay%?;p! z2&}W2$ll@);*rUzw3dMT!5DGEmHOMMm?Ii-S@VlLKvQu86VJYh=orT(V)` zTH<@wNYx;DzpJ$e$H~NQxk@i&;ejAqKJU`UYotUnoyg^Sl}Km0m*f4)28DcdLE%9c zB-S}NjFwEBuKD=tAUSmMT(G2uX^z>WiQVqIwsb~I$8qDYJm;&&ssw?C320q2uMBg# zRBh=_qobRYt0Lm+lnaPrVcULcpE6R4l1CYa9g7_ z$K?>Cs#6QDCauK#D3xJO?gXCx6l`%6F*`)9hJ!6EMtibbEsXdQO<{Bn6X=ejBzSbr zPs}XI25~~14X5zu=3WftXIxeFIoHR>i`99;rtwGae+q|& zO30*qDf-L7wxQ8n$a$nqpww;&bCJx9cfC!>FC^ zVT{(>;R%atdfb9HiZVQJAylE7Vp@$#3y z9AEzOSFmKs5_EL-%!md^La5r>I`GO@z6#s7U+pL#1wmRAI_V+g>c?8$EIAE1K2Dq@ zQ(p9J1po?XN;UDS#eF%j~{))w5*#gopFG>k}ti)$HO-Z)A(&=Tt? zX<`dxEjW8=hW}B#Y2;muiN_*>e`R(J{NCj-JZcP!XgC^$6D&?Yft#bt=bZ|@(D5Ivlb`%jnjHQ7i!4aAq9T?otx zQlu-}a7l!pWGERKYBukiNMV?$Brcl4or=4&dFR>Wjnk{QSCD=`nx~`3u?_n}sJO((;&=D}5kM<1Zvfo4B>lV^O0WZIG1Y=m{x+A#EJEsI}yy zWF-|B2Oj_)|0hQ+@%2=M&zJO9alS5~H;g)EO+7Q~;>qPzl$@W;s>`)3mD^zg*Sd-7 zSh)lp%?w$oA;pDMdB>;s^ridsn7sRN4rsOj+r5-__ALl}GgwRriq~b~qIWpA;maIhAwjadaqo=WEvytJ^Hm396kt_gG+Fbwf zYtI}aluG+vrlvvN&QudhQoxU=`R%UQ!vB2oN{m%}{OlEj=wkkkbul4O)3yozhBv}L zvQJ_=8SMld3L%Zcd}&;z-634Cbdy)oy0ZIR#7Jinq(RVJF!u%nR1~RDVgZ|xL5^AE@KL#X1&Od@(_LU3K!J}>`d{5!w*3$=Qfd(3PX8d~V3w6wS z>V-q%tc7qIBVeqK^yW;I|Z49M@tA1XBh=% z&cv2w?{binM5AID<7COD7djJ@-w;d7Rn3f&iA>6Kl=hf>s&TZ7g?nVn5Pju~uGl{k zBcDwx^#N1w#cq=6Xn^yTG;lstG;+3yryMburs2<~^vYf7-}#RuZwaIhVj-nwp*Vt! zON)dmBu;Kf6nC|rq^U}1ieoPkxDcB9Utrz5mFh~+!pW(?Bp+Mw&Jrh-G-q=Mlu~-0 zH|KBVvKH0lWC3kN=L*;|p(2Hytptq(wi!IzbB^n5#msUQDagU&C-B7MkKv}9Zgtn= zH+mg8lwYfA!Rf|lmHOd}kxht^9>+?aK17ZhMvxULR>FLubm8n+4!e9SX=kFzmafyj zMUFN~p0I?;am8}aZ5pnhl&lK2ENm7*7>IMoxB|@=3tC=AMCr=x$5!&Xy#(R{J3MRH3l)JV=V~D2+;O3WraPI7Pnz z12s=7Mm8PdTch(9((-y&!5({7cE#AyakBVpmV4uKd_KI0e&{7!wO1c4o#rl5BpgkXRWWIdVk4ID@LQvlE97 z9m39?J25gcf?~0V-rio^cH3=u)0^Lnd_Jp#&E~7Mb8xgYbF;Cdz!t}pc64-*lV%H^ zdiq%jf75%_ib6@luaGulu1vLTS-1s{(X7}arTMHByrE~()=d{nv=?_Oh+T8G#4+R|P?%enI;%(uJd*+?lp2yh!nY;u z*;^EH|p56N?f9F0n{eH0 zvWoh+**I}O=6G7&unAfb#}Jt$IpgYG%|XSNgzyMLJ#wOoE4!qYjkbTV zcHYYu6zFP~^2V^F;NwKmNcABpVl4UO$!N|!zCKk|`};Qsp`z#spwKSC;<7LGUas-olr z2mtisW^Rw`El}l9=$O_xBV+UQ&{V0`6n$}2` zLr5m^$=(jUdfOWGW;A9R9O}06D){Z)!Ve3vK^yer-nIDM@}CfgT@Zd!$Jz=C<>Lip zHHx*s;Y4Z=Np=tKitTia-p!1NUF(tS91;II|~_0*J_&(o%cPAnZI zIS`qHW@q}4DHk+kwL|qL}Vrp_)V|#7f zFpX*RE)?=elL9<->Leb1_+e3!+TT5+&Xpj8BO}xJ@>7TKw(HiS(A`f+ac4y<2hT&vrQ zBbO~wK?_?)0=0R^{>BqKh%C;?@7#Tm`;)MTmyu+#RMhhGxs1Sk2>=#$kK>~>kNNQf z&&_)t!6kIO;`k&vh(mO=w}~ZE;WoDcA15FLxfX}_9Y(sX4dZmK6kS}Jl&7Jce{|@y zJai_kd7>uqV+)>3>h?iu6iQC>1ynm=Gb3b0?3FQHtl*RP?a)$jF69s10}_O-8-=Nx z!nVr%s``58UX+%xnjrpch~`w<*adkyBdA2LnR&Fp(=3v5HDL<08~6*gUo(g(ViN&i7|-4s41S3K^_iwUWHwop|uUZ{kBA`fF15qdHHmC;Vf?nLOkH z&(iuG94q2Pb~(IF*OQX$ly)0Q=8lnqmJyDRhEjKyQ5-i4^tsHP(JZ)3hMUCHP$>-) zeZxE_rvOyca*+1dwAqX%{pxGDSaSI)oVyGfMqp!PI_x=4ii#ucxdOFxyCVf!sS+Zy zNT)Kwbx0p>n^Xd^^t>x<3G^iq5DB!+l_TX)|UWtLuteAj7p-bC6IAtdYh<*O$NiB#PXewtteal+c zm5#W&QY@R3lnIkoo=u@OCP8toij4$xr)BJFbdK?=Pm7#4B_E6J^L;Kc;@Q-cwP9Mo zCI~P)!|dE9w{;Fc_cKth|5#@VrLs1eri3!~j}hMHel;?$?7Y;2*f+jzfO3bNi%i$J zvLl5;(PD5al9n@heH93-1lifMn>vRjBi&G)fG zs^6Xa`O9DaGQRSauV_Q9B<2wM3^nsik!n(Jm5(FygdX(d#FQu!9VZWa;@$YOakq)oiv$Lyy$6iXK8Sco;iaF+I5pS!1{Tl>!44l zv@CyXBL&2qO2{3{TvZ-MjBWIw!>CHT&#)kaY%V8NbS5UJ<8~ zr@c-6P=YdOQV!8XDOMv1eMyLLKAz__dQ&fil6ldOlvOFQsx*%Lf5BoDDNmMdqip}; zKS~Iz=ujvcQ5VE7I z9z9@XbLS>%c^co%?FQEk_!wwUN&dPq(K+tR%=pfnr0{wG8fkwT-N13LqHJR|N5!!R zHCLG*eCC;_h?AE3?ox4SZE6kPx#YdHo;vWEL;r%aqeFtQ4jwv&1J516AOGq9!F}KU zD#p%CIwh&cOxivqikd~|iWSp(&Ds@MyLJ@@mUJVNQV_$TRK?sfY`pGP+Gwj%(A<;M z21ogD<{NDu>(*|-?RUIf5b$i^Al*)7*9&m)R4j^hp&ByG_ zJbcUAfj*i?nql*n2rm^M85_->roIgB6tu{Wcwt5drnHm$$pI+|Y#Ql`G~GX=;9 z@5BTn=>W^NZo|PHk0318q(wu()RI+qN{VQ-JMOv@x%2|*z^?HPkKWL@b{FOBDD5UZ z^Er#9DOxoJRqh&}E0v1~BA=b4>!B0djD@*K+VV1*-l)euJ@MQ=;U?0aDnI?Zt@Bm0 z&DQ!c_;0jphN+r#4cvL;5UyIgdX{Oc4>A&Oo9>eAoGB9VcH;PHIp5&mAU*IDz1}aq z#E%_4fo!%wh%!%P^a+$n38zW%mFY9hXQu@qhRmmb-J!FRqAE4n)&W=ne~;(QO8+k`ZXFRc>PTQx>Xbd`%Z(StMh zb!s9;Ns4ha+K=jH>)MC%go@z!rg^;_5~Ddp0B%LQRaAx-CRz+d%d3^GCq-HpE9wo8 zBzvQdnvIU#99m8EdW790o;YQeb4g39**=RAtt%gkZc8)$%$o`=>;iAl>4eqMz-G_d z`t=B>Y?7e$&_!@)IFP}@8%=WnIV;Mcp`nH+*#&R&0<9S>Gq!%^68!YL-i}w^dOgNQ zN?6jgOJn8mCe#Wc z{_^S%z#~5UN4?ZX>g4!17qKL4NG7(Kr{|Dv7zr5BP&nn%V{zb( zPLt79rK`{5qM^#mW_rUjj!TMhi1@|81T##!nStXoe@>hjk}n!-^)-H|$H@GyNr1O$ zn8(gk=ADie!o>KL3~Dx$t1D|Zx7V#(E9N-QNe-aRr1O%u-QT~=nW;W0(b|IiA`35! z6T@Rssjqj7iz@$0x@%uR&Qo5rpA4a37t&Sbw9lGIhi<-5YnXZyOz3J z)7GaUPt_QQ#mSCC_`vD+k) zql)@+R*F!_xOvJ|u<5y$&}J=+>*P0cBg3?7_jL705ehM_ohizbp+-!6ds{a-bjmJP z%;k2>g9t@w(d+w;pT!ituUncdkzz@wP^;7=>p=R{IJ0TKhbF}|PM>Ib>QGi5b8=?uS#OtQGa0ZR@6%3m3} zj{9~LvFlibx8IsWZ%0k1mJOr@EC=W^2h3&nX#~jo?IE4hl+hO=8vjY-OG7YP)i$u! zIYefUY4h{ecClo>g=~EU(rk>u3nwka^K4!k@6Q8J#n(@yar2T$D2ofZPWMxNTFwp3 zHZmE^+z&T?mTB!L?_S_sjlVEr>n5eRW%Fh{{mip?`Hk1$FaO7XmG|8L&?9*LEAPS* zZV_9W)=tVDZTPo8{)5P{f~tiQ*e=S_Pt`-Acx|zN>e^dw!q>j|Wtx{Bt~q=Ib}xGf zPp$hVo-+5#c&043=^Dnbo%mV&!|+G&f%SikE$PjY5hmVy*BH#>0>m^&0;Abw?2|q- zO%zS6brh-$Oo%tnlT~K@0ZHT-zUo?Z4-oJ$8R74vfU|9!V{#5h=?gj>CKo}eti?zo zAwy=OaTjilX3s?OljN$?wTx9VC`P^(+IYz!N~1Ldr--bcoSM?fc7bOXZ=mJ`%GcTP zF-ac`>a4SFS3H=ROcqO*E<+NQk|g|dm_$csXT70T(rk+*A<(DE6JDukZyDW9=iiz5 zVI4g^OdORb-cAi=Qlej-K+y$z-HdDiCva?NRCZr>%-SrGWra3UXf>^6$vNX(o3dI$ z$|>L?O^T^1r+0-iy&_YS8k5#_o@AZ#*ugUHd!mSLGD$x0u@RYwk&ySHOh_q4VQt-; zT#_C#7i)?bsq|f{)qU@C-(hB&Wr?FsLT=_!L zZo_&Bb6T}>8I}-dxV9sUfBnYSqn|ckOG;8g>}albb$8(#4?cuv4;_^5gp6WmmjX=2 zal`tJ=DLWy+9(;VJcegr@L+)v2Vtsa+~ zgQb|m7jM5u^iGWNN?b2MQlfRpmCz$Rv0hNYFVsYHbto>lc9kqV!Bq92>kd0Z8{~jJvk1exv?^% zqoZQldXBS70#H}4UM-mnb#Bx-G}xT>J#U7irP=$Kkm#utAvG=@YUX#y@M~p)_`8n{ zAsrak4bg~Mz~|-j=x4Rn#rY(;21d0-`udx%Jm$c0wQcC>_3>Aqn}k=>wz?9&B?X0D zXG}Wi$+D>jXS^^`6gFKmVxD0}A=`x|d2V5>?MQj!NQ%BLV84lV5YX5Daf3q>(M56C zUusF_-FtuHC&`K^VCVirc#f)?-`lK4T5 zQJ8z&?zS}Uy5kmYp__{F%4gn=Tyd#%F=eVLmVVh4Y37BXg5la;{KAoch2K2(YdBUu zELFH7&+)F}m{A_^_%xwNF4_XkpyOGS@wI;q>!^qwlw2#6%*b?*l9nt|9OfJe*t|U- zIveUk<{){gE9t>5@*!$I7SA&R5^A4cG`XyZlK(4`vqMdV3tNE6Jtsv0#CuE1;3*C~ zH)h81_-|}xvuQ0Q&KxHueR@bqb2+FaRxOd{a3pqg^z?L-GU;(Vs(66kMDDS7A<6jlk!pKbyx8) zFufFSdF71h?@>GQu>e%i;s`|72bQ`oj6?CBTAHKI3J7K33Hq+ zCp08(s?kzN9{02&UK_hIf7VqQ^2A|UwWiM7E;JUbNKcK&5;>x=zu~-NHSgzncw9I{ zRhkE0+~Z0A8lE~F zV&ih+Yiru3fq7*9d+fN*39^^_vM+Q$)or9qin0>vB3cY5p`KUez>!;^GiqBYXAmbf~7CKX6MS6L?>hfyV! z(si?z%CELj_++6+&yS83rI_e^JgzvTql5D+ip11VpM;Ig1=C*VlFR4Jfu=5U%T)=U zHkvtdK48&E-->6Z2lC<}o_=U(8fQmGu&lqIc3Lal7WrM%l_DuB+L6lKB`%a=5`2{D zVi5-p9H<{AL8#0TaYw>jHb)zI7kbG{*W2GEAvVgFxXLLBM@lC-HZ+duQW-h!j}1t! zI9F|F(_XAapI)zVs8QC@42|6M`3w*Z^-&|LozUY~9)A{Ze%U%gr?gwsB#yW!0`2~V zY?Tb6Dkh3093LD+Zu1gNM-&tpB1H$t&}Em1z&|lu!*Bfc1b*e+?YMPQ)>V=QMoKg; z<+Wn*ZJ97Jh9 zlz7P4vE_AZ66YYX*f-#5S5D4rXMT0AyYRw9uGT%iAihi-jtmlUYn*4Aik&AmK7Tl9 zVrFxZjM?oNcxp{mrf~4&ajfoHLLS>t1|~~pz`7Ny=;5bDVHm%r>1afXKlG|;TlzrTvQaOdmRM{`9_c(b2t)L zXHbtxYwqjPxLNIClZ{gH_eTz%!E=M7xMpoyCR?8K*13&^94nB`XZOB+*tUK$r0=`t5YZ?O9U)y= zft$YQA{1%{20*|NX_Lcy27U^+wcU#M9s3X1Q+yI>Pg6Ii>AWxNxC{Tf|KG|L`%+|u zHdq?Zbjp*mglCHtvQh#~Zg3h!EI&_sB#DK?5f7a2UFFR^OODqBFw7be`W%M_4UW_h z2RU&ZMP-g6aT}Y}h}4BPX`g$68!1sECcJNKJ#F^+igg^1M9h3+@bb(UjX8_3j}T5O zm8}P2pYt)?(+> ziR$N=5$vw)iYUJCoTSN|@?4EVTjwIxX%yqZ{U->yq+}8MbZ?>OON^auq7^u7Nn*la zoN@%tm9fJrfG2TaOXT?S@u6?+$6ILkkBL_tE9Qi6;__0Q`N1UlDWVuQO_Nh5)9nhC zan5POb=`0@92qma|OlL0I0ko!)8&;U6QUeSfWy03({-e4q1TbG))w_vJ% zia5>(2IE=b7)h|x;#8&V>@;3aob@yVPhvbU$C~2jDRGRfFgd)#x5AlaGFpt5z4%gJ z!wcYw9?cY^ojCcpHQJ;~G-h8p6k~n2Y+=ebUnV4ZE>Qzf<8V`qbOZ7{)7-tbuZHfp zD8s`ocx#^ab7yp&7Je|4xyVYZLeFtm*oDzkX@o8mjN@OKPptW|WN&4Oc)4-x7$G#R z&cjG^+)v@j@iutVR+1bT#u>8(Kb`w0e7^ekxHtYCntKrja20+act7qv&PXu8Ku%V$ zv^eIAp9;AMi6`rine>$7A8P~((h|eu?$xS`Wy+>;|8dtleV!;1PQI+tTsu5&#TgfI zSRXr@5=-nnk4xLUrOaj*%d{gsaqC zaR^d;;%tm*X#RHMsF4UoG2@8)J2@e31SI&?Bub`Hyw%2u0#>6zElW@DV}YHKjj$?H z0U=NP2%mlUX$)+;jm#{Xj8!fcLS{G@_%K>^r9w#i?1`gTy1v`lbDs2lsnIoNi970T z_wj+xjnQ}zr9fQOm8)`C)|tVFzCMh%-_(KA6IFRH$0tTy0Vz&UmywCb3iHXcq*TM? zS_LcPeATjN2#sahuVUA@ue@=n89%e9a1uVk2unkUV=OH|s+PlZo%vi{(?)gcrql3* zmOeqoHBXCapX~V(~+2S9=4W2qz)ND667Ul53 zS&m8dB%#5VvE-75z1W)iB^2T-u`~EvTob(y$Isr3qja5l;z?h%f{<;>m(qY7Y(7;9 z(O(EOrPjD&z#JyWo^ju;1n1o0X<4Do`{9$?PFjQTXFdV8fP7N2!<seUD^{ncoLf|PV*NHjD85WYUp&jq2ma#Qx^b9L z{3I=?$zlOjLN2Gq%h++IiuBVJ36lS}ughVQc5|jgBvS~k5j`}mvMudN-ff*yuTR*; z%^hA_DMHrFdHF8ZG@j3NkF7(W5c9E0o8WaTGI-`pq+V9z#uZ81(pjcEZ7h+?_)3Lb z{5ik~p=53Y)JO!oY&LgYX77hGFKG-4G>=}sD!`R(;z1Loz@b|4z&e@(r2K}D$~-91 zCh_gQ8%W8mq^n;gv8`k*AurCmNNNQ{+SgflI^HO`g3m49NkVtD+Q=-m(wwe_<1r~> zQmR==7_%;I(<8@dAnRed|0*mG@1%1S5T|PB@VLl_R(zMNAFqtDsTz8-d6~nEZaJ2- zMo5*NfHk)ATzaf>gleU6wiv%2u|kjM8sGfcGR?tq=sWY>lLQl!l%;b$dKNMW*piTJ zHbTGb<4Vy(&+$5Udh$XdPZCi(MDNjDPPYdZ`O_nE7nw~&MTS0a-9@vl-muNOdC|*7L#(26ylU^jVg-;PlZ*W&U z%bDFad9-f8$3{k_(u;C2?wX@mQ#DPJAFjxYO-hdIoF)@_e5_bEW1EAh>v_K%dnS$y zEfbc@X0U754!m;N3Nb~H?SUO1L6we~VZ{_H2Sgf@A#6i}*o(mzOcaj5!{O6s!VkeSXaxD*M&uHkfUv$BhO_G%JFsDw|)oDms#*$bd5d|=qzW|X-J+zwOmNwk$J3^5|q|!>Mcs42B zb$KwQObZ4FJXft|jxg)9vb~Bo5l7seRm&lY11YD+mJd?IH?Gp5lv92LCX_XJ0CTnMNe3n$|l+ZA6ZDWbu#$eP*$lO6cXJz(k&|`?h5SJA@ZC!mEyzVkw#%h&Nv2nPb`nedmdk=4?hc1I{FqEHMw_ z97?PDT+m&x3C&Z(>d<=C}>a+qV`MIY^((op7xTFnUSYw9VFHX=Ha6+ zK<8PLw3=v!N*C*Eo);y>pZl29YT8>HixWj)kuz6kzOHBD+INIFh6i;{xaMTWwMW$= zX6~kK62G@VeMqZ=;=51-Ufkk&ReG}i#b+2B*I;kCFQajxv-_YJXX0^i{njh4!u2;? z=Nvi<8?DBnIZXgnK&rnV)1nr~Pn?qanl<8tqD?o^B;^NJquo0avzd{qC|9GcGz@G# z6vNjMl1_nTj*H|F9pdh?*%XoI9w9X&Awe*Wnv1bRYw8>Dr0-0!N!ghfd){ZSyl)_z zPgzdnEo}O_7qzMs2P*5&T-+jM(Db4C7fYirBLqV7@0Hk--0vjLKuojb0xrXsYzjaKz^0AnTvlt@>j%Q6hpPiqLl{J&_zP?-sS47%A5a_dKWyeaD zG+>qk~)! ziy5TtfT6*?o}(?TDiB|gg%*7_sZPiYQr?sm-f(lwA9&%|}Wpkm>?WfI}Qxc~NLH0~+K z>B5aC9Vp|n-DV4)ncI(W(t}CjhFwZwf*SR{n$C&FT;hP1@nYQcC#@?R*Heh&#y&ic zs1>5;Vy}Es|Mp_Z<;%=r;my_c09mX^+M>5WH#MV^gF6*YjUJcgL#!A=qu7Ecrin~l z$#QBB}Hwd*P z;5^xJ#|o_J^2nj09Sgaup&(FJ1ipUhw2S1Cvx&SFCkTI=uYPq@*Grz$UR$^w@Y3qveKZzYl}0#<0kCHhJ2IWy~huDdf4(Iw(@%Eck1 z^UIKlOXRdDBf};5IWvc24n0+J@_Qh`I*JJ0A(QMJu5wZ;a}S#mnY!)TB0$fknFf|q z7pu~WGszrDt~Yk+bAreuDB4IE($=k4YI8OE{F44Pxc$yM@$h#ZCXab)&Vrw8S3KJ7!@N-?XB(m_^`hj&lD6iU%eS5x&?JMXyPLl#A2UNayg?RcopxN`A(XLtW zTy?~46dfdJzDA3(SXJ}KbN6a-VFBm7w-=+>#W-k5IL|5L8P5~itSz!y@O2;uLB3oh zw=Zw7j67?@W#!x!bACxApgA{IfjE*fUJ_Gu?r4jPDJe3wYrcks-MuQr)(&85Qd^8D z&5@QCB~r}9D54LYisJDmCotZ=rc72z8%~!jhKMdXIl&175zdr3h~Jm75&%F?y~`AF zg?C1{OLn69F7jhMO5-rPC45bNnll$6pN-Q#Z|S$_$@}8X7WD1N;6_**<^?UR=sDf8 zkV@zSS9uG`e9{tsw&?(ksjnvb&}8JybpAu6#e8K;aXKN1dYR|^o;xGYt3uA#xmw>) zU--^=nRC0WQy}{DV&1PgpaGgYSvY7(1?FDBB+644F4%47itfE*fV|Jlo@y_#3 zA6ch}V_Fb-tXjDS8e+tysDPVpyb1gFK1Vy~#GLyD%nY+zOcr{zSenLxLwj+>wi^)C z(h?34b3k&c8=0-I#P09>Beq?4EvAp}m!iae$5P?2G{!C|`ZasfB-41-D>muc7-6~! z*8pl};Nyi&KSGqD&(Cfwp(#7Z0sTr|4GR@2E@^He&L0~-v46F z2e-Yh^RT#7z|xtN@{bYTnn!LEp~5S=h$H4qqg)Chhe?Ufh^53Ge?sCU1wVEX`H1tvjn(ZXs9j0rrg4aCo?g5%TzMwWm-pHIxY?q+>PZxkA)% zoWq34OPRF!0=u-{qCU-SoB`xc?NS-G_#zSJ&H~UP4rE~~$b_i|q z{>frkH@lnd?1W7{pJ)gnt>5&;O4j1+Q66FJR%O%u9GdW%R)0uJn^YhJN(1@Z;% z&*MyfnP@rOe#h0$CVA}M zXU_SU8%kax4dg!`rCRI|N~A@E;mvOt7lrDHj{VC4q`^=bySrJKeV2lgNV_nc%5xUO7j(hz7DvSuKed(cI!L zju}#v)>Fp|#L2>tGlv9L6;d(U=;OGs9hKjRf2{Wk3#0NV=)o z8FNvh8R#$L(?+;dmFp>gju(y<^2d3xs(%gus9c^tLf-q8<407~y zCfkmDIz@a8lStakn)}{VZ3#OjbHpX7$5?>9r|cTXO>(;kEj~Km#iMT3aLVM?Emw$= zP15tEGXouT^QO(Du-CXE9h(2X5CfDb<5QcabSoLJ(_@YR@UbUJXjuc*C7J=3Mi>a_ zxcX9sp39MO4bJO`B^lth1Ysmi=!~~;ukhxd7p51~7B)!HYv?^j%Qs@_n`M=(~B!Yb0KmW6(tKP%Ggx|Sw!{Wg_^%7;x!K*E6VXR5?mY6 z4n7rT@Z?kn@sTyzK{k>hy8PtLp_@lCIN?dy>y=Gm_oG@XA; zln6H{6L)&@#Ho4|5<7Nc4pinhkk!(;?e#c39pUhSLx{-4nWJZE)dN z8r#ZF5lbj*O-CfzP}Vo+Q6>#xB*#2u7&pwkOCrwd5arDI^kfPz$y;302ZwgFz)EnQ zRX1OQy&0!TOkkrG>@htqN=4H*odZnYNMAJ^iaRk*-fpR2e~vn^OcG31k{X^q&XsvJ zd)zsqf#-1q7dE6&viYLbDT@YQUZ*QfB-Bi)?3_7@NtB3@xu;du69?D4*Wx6c^Gdj?Ip=GnpPMx8cc30cpP0Sa~FVFDuDvbpl`e+E=9cSW*e4ejU)u z6lEC2QulJp)-7aOGn7aWge$tii<~&5_KsfSD{q$0kRAtfFIb^O9V`6x+=2b@U0LZQ z-m(TwAB*EWx^MeY>^L@viL>ODuS}zO;*d}ea9&lde5IwzBF}R>wx%eaoVIx6B#puG zSUkm=JL}Nf^Uy9lCae@rmbhTAgRb%<7N{QNo+k%7Gana5$_`tj$d}v1c4PvqZx3Ca z(8XN?VR9Or&zw6n?)=r6^jY$zXKB7$ za$IUCm~mf?Fu4j@WIOFj0tyYJxFF&KH-9tdRWNq;ZX;0&R#F$WL1I*Yz5X`q>Lp>LSJa=V{?`f-d5pV1ht#PjOx80*lJ6~_=Qc2ba=H*ZB)YZQ>s z7O`+)Mv#fIefxE2CmJAj6`2<{B|ULk4G#~~dlL`5l|W!4**I38CV9gP*S!W$KJygD zC#O&w8N}Ja6F59t#c@J)Cra*%em*i`$q``j#A%C1>Fco}4@1?otFq&1Ftc$r&ljsF zo8sg=w{e`9NM4Uckx1W^d7J{tWA3DhUdSlF2Ip8%N>A^3U8k>Uuy%15C8(Io&V?@K z@Dk}t39*rl#}{`~7dfLgb~e1d#?@4{i$H4UySK#65tBpE#IXY&s=%1)5G+ne?KI8q zW9UP&-Xzs;p<}Y+%ky0r*7?ARDpWm_)=5a!wMkR9nzb`%s%F=rZJH~UYAF1oQYub+pd>co3q*Jc!oVj?W!)5h)t9cu$nQ#tlEDwrynBFBDF+F^Q%*(Va zmifj>2Q`ufUEv+HIO-IR5n`Q@))*H8n9LG?6JmL~9n)J8 zOBn@TfMS{^Ry}=B2QdyD*o$YLewKKcj9#I$8=5NxNf|KqT+%sjxanr(^BuG?7)dL$ zUQ!$bbu-+Pg1qF|x$_mc|NgH_+E(1KOy-Op%hcoqA=;vZi>UW9@f0h4z?*qy<&7vG z--kyZdI-1Neh1pekK#m`lwf9!9EF!c=qYDtTtU^?A!pgY>#2+eF2({E`lRJ}o|Q6b zXG;+@2w9Ic-_ep(Q6dVkvQ4?Ps#A`M!6lhAr4zQZ;Ydh)L}54On->wF}NqFRe3zhCExZYt7zPohX-Ek-S&@X-QS zrRQdsMwb=rTye8AyXIGtGd?a}Rx+=q$C4xH zmuP`lJZ=>l=;z8=oa)+yLj&9KFrmkT)g1AedEqhHWDmV4v07aJ9pbmhNp%1H_meqY zYs3*I&Ek{n9ixhw%YrRkz64iqyIP8HNcvTM@jAjeLDW1ZG;ud>+=8`h*UM)YGA#HH z?AX#ayjq0VxYhvHB)pX;F{R=)zV3C13w_wTYmanPTvr`LM?56qDv_7g9k=OPOr2{r zbp_mj0R~tE7pM|TI-YOTTpBI8jG8+7MuWqebC;gPvGx_5`=}1s^@rHqEBoGh+X9z| z>xxWRyKrE#J6N%nO!!NnC7}u+cF3`VHrI6>&I~p>KVnz;d*OMn{2nA6E2ZF|N?vjo zz#UmvMPG`%SmB{jnb6LY!u^M0U6@ECO!mb6I2(63P8zEG%tB|^D@Ybv!{N8UJDpi9 z_XVxJ>N(T5IhaCyl#O^w)KR88pF5kB&vWfr>ehqNhza3d-HcrDl3X(~sYMyMa)uX0 zy(Q$$8GN~@jo#db!D+oGJMYh0wy1Zkqs&wOxw+OE}|7NKVORFexh*IFt?A)=CP-SwSnCuc1?tBN% zjE&-%$Dbxnzlsf0yU-qu3TjAp^~7_0F%Xs*N(nrLBCKOm8rncej>d5Y|>=%Q=PHmrw)cRW`V zM^gFQi(R2-`d;N8>l^|W>V_ePXsnf#j+Qg{Xzf~jIogDW%`!Y~mtwE&#cr<$Uy0Y^ z>mcffD~}q#K8Chw|C@XD7Bl{A7QRjEzOyi;k@lPZxPbW0N_y7Y;--dkT3OsWt1u9~ zp}w353yaR<6gxM4bI$vGK63eb=4c~}x>Ld?`$N-2Vv!w+{)ikL(uypk`IP~;a z;is~5cpG`}u`a_{;;(#^i{t_1sBXB-hZqjkL3e7V^B9o@zL+?w-jGl(y4$(D<~%tR z?)}CCIDP80pjGk0`^~;UZJ^{!ZysNqJg>O>b?EHst$SG2J89;fKZ(~*AF5pxYU66s z5`e$Jisu5V9AwYel`5=6;f7b??1P`fq4o@}*t!YpruSfP`!(c=ZgVvq7qs;+SdtA& zTC3Bsxd_Lp=|}lQSx4sq#U?Sk&DuV(=L2&VY*J!UzwlOG|Z}0`=4(< zJU_W?iqbP0?!%cm^;#g!>lCOjn3SJE$G~dXN{l5dx8TT*Z({yj3R_1Ria&_!AWv_N zynx(iMmHvRE;sgU>T=H!E|%a+*)6YrJ=P}iV^+#Y?b*8%Pdxb;IW^MmCfq`83g6(^ zF;+?(N49L6;=O-@3(bKAyL+tGi;rg!IM#)_}q-C2nu`JhNOd49*x}S8OYic+QN|Jm44X3&UVx0GPNx{R? zyn+EK(Py!!F;4E43sau%^1^}_iBB9&f) zqi4x_F~?b&O>OzKWSDqb3{*mRiU=!{@;WOQe5+-dJZG8>wVv@2jE+jqkaM;|WhRBS$*Y39xkO65Mgeouo9i=3+fdM<&$5!)%=mQz{jkHvgG3 z%D9(U;pXxg$yZ-!-EmwfBWt+}Dd$!|_S)AWo$JE0Pd|Z?v2hgaC@IVR;DQWBGC4v~ zu2PN0uSyjnK_wjUFEMObv?PJ-99DH=3Nt6aMO|rVfnLY8G6@`Sn13vHU$_Qir~l0p}1d4$gF zcITe+lNHCLbu}e9dGIWa-()SWM@cZQ;f8gL`j}H^l*9MWT|42a6OM~w=y+<3Y(wn4 zKcYTLNrH!Ix~>JpD)333rDt3e24(`-MuF|dSuE3dl4YOVk;MWzX*1AlBqg~Lhso;xW z_?(NEbc!_Tn3qrmu?qzP^CAJ>@P;1{s=&Iw#>owxD;};nV7go?H@xDr-`Iq}+S=OO z*xCig-Zav-q^2e#=T2l_@uP?{89e^j6POsQp{sTTE6e*)32I2vh4}nI$j!+@@j5eb zsX^1*7AtD5S&2XxChtijtH&T=9h(o|2fB9L30A! zp_)+ZtPv3vD$T__ap*Ld5QB>bIUFM5D&8wQd{@%W9p5O@S4HW@(*=honMjNey(Hv; zH!1qe!Exd!L&t%;vDI-fl3K|04%11T48eVE#Bzbwk7lJgle9JS{wSwI!^xHMlS@9w zxHQdg-WUR}p6`WZ&d-?lruhdm_vQKv&2uGobD4oj+R>}=i zmq<}IRd>qB|dcdL|lA6^XIg3iO#%#_zMG1FycH@GC`7yc{zk4n6TW^;}XHW0g zfjHfPwZ&6dQa(kCG;&2@lPBUk?`jP}9AB6&VRS*`!z~yp#0mNf%rJe9roO3gm7?YC zzMR=K4c@#|p6+sJPiu%w!d5O6pIEQ(L|@ajOXt62WZO-MxHB#8LkA{fQCy*GW2{<8 zGy5CWd9N8kI^nOYZxo!{(oySOgZn4O9Eh{c&_2NOwOQR^Axlwo zche4An}G~?Op>m9@*n+P=vj_J*K(ZG!JHzGeRph)59xG0GsxbMKqRU2vNcZ>c4;|}$$ zJ}JuLysascdsA*SLU&h>QVoj~S%}<6h~`^i`|FWebu~tYj^VMV_o77S-CWv_-tuW} zmFj5-O5T~MUYM4}?KPQ)=f59rAQoeAlIwwNgNy;_7;(OYNYg_ zS8v9*cy*!cg`L-)*meGbpKf4xeb#;xI-cjv^*&~xcgPFL=epJlqJ)dTWZuTl^`LOakIB^D|Jdj8oF&H@ZAhDjcH-fCPvS%| z#2?&43-Ht!y2yhV#SLf5`IWPxf-zE(qnv4B0lPp9tnO)%pk1EKt2$iWW8q*G% zo9%QBg{Xu=X%y{Kr_ech64~JsXwQ(6%eP_QgckqMf+`lx>3+Pnf`HpcR4_*C>d3xb zIJ9R6MotXEk~1^l=3Mr|Itj>q7)ZIn#*|-}2j}YuCF2aTPK-Gp2DNoiGRI1A%2I;m zjiw*gZ9%611HV8(q`08fo;dq>Lp*Vo$RsX&<6S&dc}WnZn0s2wnou(ltV2WUiFRJA zB-C8XdwFh>lYh3Y6Dj)ASg_>gwZTv}-$N!zr~_%WFSuv@x)y9U$E)ROa9eiXPz0TF zabNCE;%O0#(9r@!hf7DiLe9hIKYJfJIVK&di|WTsc5lx;Fv$it6CUCVl~4#Pd5pT%4Bnrqple#3rD%l{4C^s zTtV9lt+Wfx^sYv<`7VUJ@5Paa?n89-%W!qq6#n&fr|{T)>)~fZ{Q1{?{Ezp#OUYFj|pS4;i(!zxREp!I`jStJkY}3RO zmusr_=8I1hUYo|a#v34+ZyZZm9eSDWnYfx&85-a(}5drzYUwNx{^3zX*l7=+ui0IP16_v4y$4R zSS-)ME||rmOTv(u8%ln6y;9IT(H+`oOvf{H8kk2wkhT*4(ojq?;_BXR2$EzglW7%c zHSN=tRXLg^kLH@E^?Q;uR@y*lGL1}CBqcJPGIdau&}{QVkp*CFlUx!-DS5|Yf^nj} zkF$fjpluj}dJJN+189b7EU>z7#Z@$c+v{eOj)U@k9bE(9I7zKh7rU;E^X+0WD&+O9 ziV_Z>6_-pM!SH9)RPZI2IF+j5f&0IT!Q+F(tvNSp^X}+=3^`_vt}#uB;7xCM1G@9e z5m(h5m$#^^)-5kvcj~ZrQ`NeUq$sUSUE^w9(s%B#SgxF}kB&uWM<+e}tV68^iv|o5 zgKUNC;numPX3=re8xU0{aL=LD*!k6U_~5OFuzlGie)Hzz_`@ew;_O6-e}1ZnYqsR1 zm2JW?EhIV#^_d@-;6ljSV_Tm4JQ~(GYC|dl5i;z^7@UV@Y#Iq85eM9oloeCCYMWHo zEQJhp+VMo^QhQbI!5&v>o~32%72!DaD^yWJ`y?u{p)CXeSZ4*e*R_C%n%zBF$fhFq z=6E-^Tk5BUDe%?gwqcX=PLCh(IMdhhDPP*`N|6b!B~40}9h9Rd2l1VqyRrMJXHhLy zkRR~G- zEM2cVpi`m=nJ-}%xlZW^Q;+Olz)Y2MlKH`BPwA4v`E~-s7c^%jHCOX!4uEy zBxJ(-oOUZQXxgou)0g|LjMFals+YeEZA;f;+?C8?Z)J+rpqQC~Dh%twheS#HjzxmL z1|Vv>f0k;sf?BnPg(L}b=PE;tj3WbA2pEeJzK6&;OpF)Fh?L7Ie53kW?64VlsUrS- z*BZR9{UB~!K8E)aB77*k0-HBviCWNU+uZA9rnrl6Xke zC+q4}^zOxtBf#;_yj&wUCzIYk;&gKN-{Ci+GEi5rP8q`1(Y*B5Ns=&%0u|zEstdl44z2GIga%@698#Ejl0$EsLA!X z0^e4H=LH(@21C}D;VSR5L>uG=g6_)|gV8B+4)(f@%<8r3rebF1p)XP{jiNNDN79d+ z+JoZch?rR{o-1mbgg00(lDU~BMc7MQ+WM~KF%o}m2EVSX#Br1~0 zVd;H_i|YowTZQN{A+p@sH5H-LOe352adc<`fAje-6N#Qv(}m3d-{A;{1mv<~E(2A= z|MP|`@zbwbjfu)xQtUv{rZ5$yX!j2=8S!}|6giF3H6cxOi&qbn)y3o0(XgIpYO1J{ z$C(EUP0(e_RzRH>o_L2B+np}9i?j=p0OIt6Fnl+jSZ-WJAm2M1H6$V|;ktt7NGULSAtC|CIk)EP0RydoxBJuhf zGe4@7+DJ`fW8M5>Dx)W(ctdib=4nyNkB?(QYm8nwsGeS!Ecxh3Sqa&RjS@w+3H9j* zU5P!#J)$PrGz}6%GU;WVC`|glzmRa}d@z3wF(S`bT8=Q%uFgb6vW}~yObC&WP2=pz z6WH9)z)W^s@av(>l^H%oIaZKS%i+)LWdDkt@+BW>=r|+d> zrU=zkCF3D%!gWkR#QIv7r8^1`QNoNU} zaKYaw46vr73S0Cf<0y9gD|d`IP1n0Oy8&I^b10O@$*Ir?cAodJ$wZZZlyf{w&LA#I z5XHJk7R;G(E`QEl=DLl=*f{Jx_r2nXN))x#AnnjO_R>sY@VIi}1Yy`_eqLg-Wz(kT z6)7Lqmzltw{Z;AT6A2AN9@1E!b!aucwMwY7#=Xdeiz9l7HyYXmEBspQNo-`~xG$b7 zHAbl^ov)G=WgD4c$#vJUrJ0SK^=H18uYK!r{PoA4L8&;2G%fO&o>7W6a$ZYpo%t@~ zE1`B`XcmedMUTT(`nf89I-9|QhCtI}NMMO)W{#d&AYwtRqB@#%8`uJFZ=ouzkx;Q4 zx~B-FjB7MYQ(7-8_%>3Q2n*uSi3!N~Vp&FlGCjvxi%TM|&ANV5=ev=t71{u&$Qeer zPZkdMDN-9Q?fMQiTVruENqr6p_@L4l$TZsaNM|@W&PH>|+yI#whg4^bZJ5e#|20m* z#PKLbPaoE{vx&LVtdu37pPTSjuw>m;WPWO9jOUtXNicY%JV%Q7!$Rjuj1CWx84NU@ zjF~ZLe5o~3RM}`0y&2*aBh8&J1`aGWy9j0r;Qyup*`HQ zmtVAqL&U`k==ehwU(6ieb;g{pEv&?(a%?9(r!|F0Ok;MeMVty`W4EC;CbLJ+jFo(b zHob1Yf-bfSQWbQk8QIkE?UT!CAqJ|DXR|x z`JCTF@1AhoT+{$^?lHtllxPfsapdztUv5A)B@K6@bF!l^&`nepu`KvVkK-ak{FqRb zsfcn0&GD~&X9t zcN}b@@GKfJ8A&{*I*s_{Hu_wJ(tykpr3oT;R7 zxYUlbwG75XMMeB<(`;&Riv*+Gjqp8Q;HHkw>BOW=;<@zoNJ3_&CMHms7}Xkr^$VG4 zZg7eEwn7^^dREGSMzJSBx6+W55XV5egq8U!R^-a)UzNr`AJ8hyh?SR^4XmV63w>@P z3E<|`F|fBg5MITPczbe_uPI&rTq0gZ=*E|cBRR)WLg>HznhyNOf1bpO z{w#j-?qQVgFT-EH5tCWsLTj2c%dD`nA*S)rjN@Ew!tY5;0S3$T-dd#HE#t&9InVMj znrok!tEC#m+zZ509FbY<5vr|Wd7cmmdEl1^Q#2PnWVw1Z&qr4&DxyWoTyb}%N*hsD z>oCqsM;Mu`Qow<8s7uNj8G9hc|^mTkvDYsCK zo=5vo$FkX%$WuK!9pcpJ6xNk2x_q{8YFbN^@sk55OZ&P=@s81kTjO{m<=5OG@_H+m z$ca9$60qo|=b;soW`_P-HLcxP@p0LF4*Ukf;{v})DrqxE zoP>Ktb&tAk*$X;RuBzv==acA?`K=e-WY`q>^2c zyG&t{jJ=cOBwtks&`+D{k~Gmzn52!(5;ev}Mp9(uWiUhvbflKXSyG%O0t}o@#+C%5 zdoE0prZG(DNBB3InAK4Er=-dbPX?aY z#wNz0+trwZp%VI*<=0(MzamX=WTtGK9)Vv7}tj zV{Vx`+S?|mOWR(m2W#G~j7`9)k`}Y5X|LcKO=!ctbBGHuQ&YI6GK#2_S%m)9~`9J=E*LVJ=)pm(oGPk!^frb&W2I#-?x z!q0G6%aXon+|*XVzm$fF^UM;u44p01G^IuH24r@xl}2Y_sO(pYUJGZ%t}Vnvg`!kx z4A~P+c0Z?g7ij@yS7h+(KS6(^F*V*66yEk7LylmoXzbuD2%FPevn^-yoM;S3l- z8C+MD??2WV5YzMg_}3oCllw<8J~>UE*BU0qOBf<=^?0!aTcWY2ah#VC-LE-i?KVgO4m4ZHx|t%n z>)@zQijp5#N;XD@YD{mn(LLs9tqr8ASeKs=>&ADL-#KnLcA0N%Wd^=+p@ddFqO6X5 zQi3_32d#|dDW0lj_4G+tg_ZcTnsZi6(*?5^t0)MRz1FN?eAUKmF3`l;aeA-PRGh&p znF@BsLg9&9u7-Hm4J&ZXvQZTL2@b;1A+lOzAdLO`L|@f6Kock};WTQBcyl)=s}7hE znyheKqk0u-Cn9sFeTXEyAllZOskEsVSj>Pz2FYNn&^d{V} zqFb6o!A3|*eANTn=2*P$k;cgm+IWK(C8)%uK=NZFMZ`rYPEQntZqSrIEvnI6r!k_L z-?yY&7M8RdB?Z9+UHy9IhF#DRqSpaIFRa8k?$Z-5ZiKN(I$l02^*Mu>%o>lBQK*!H zUS}vJy%MjtH8V+=2GbUyRJ9l`Yh6xj?YTiNw|t<*_Oj(gyk*&taECEN{hB*hsO=E6 z`i?4Ou4p9rQYI<95jiMiu(43XLqkU9*t}w!Xe0VIM(1G%TwgA7oV1RIW+0h4gC}NS z;($vER~V%|Vx!I+L)^f(o;`$5e)BN0f%23*^^PsQ3qvh-oylaJrDA6)NEdR)zAE0>HmqNUJFi(s$a0vx+%%JlS`w>LRnL zD!VEhiGkILmT-WY*TNV;)A?^3p?^o9cwC; zwJs30Iq}{pPc(R-WY-jgvEG4o2N09QN5+a zjInb(8k}&x;LxS*+@9$Iw(onLIjAjjXO5@#jqAt zIn{6mM`Jt*{?5*D> z-MVlYowGLeCdF?W#<_*#cA+JWM1#;qfBlLwzWQ{A7+mGYW0&3%*RKac5$-!plm~4J znJ}va5l?1rnGx&nuHKD2`-XSang6kNWlgB2pq`50v|UOZDS^A-xW4{XWw{-fGZCz| zBapx{Ya4g&agaldUB^yfqE?f#S#dI%_%sZ^neZl3KCF7UZrw`q`upO{UMMi3{>Rug2ITtic36Mf!j zPCL_8=&}SnIB&BdWD}!U4ke2~YcxWLZ;1n?U6D74LN<+8ud`U!ahfoT+AT zlK7Pgvd1UlluV<*O+?g{6cQCl2Tto$vRa&#+YM+OU|KxEq_rKDqMu1R`*ECT5HJ@< z<}p394tA!bW8&B%hlr3; z;5KUC1obEhe!jk#ixF&7J{o&cBX_^-{a)RXrg`RymS7gjhW4@1TBI)Ihu$_=X~zv& z<|x_eLcElzN+~Z>&kV6{{F+de{98}Db!*7fqd|H*GTN$DIBu=fFEPBa_PiD}NdJw~ zTz_o;I96@%MkeCb!Yz%fNRZXd>)P?zr;4Pk$opO^Bb{l)4XVlQrdgBa!S`6B3UFn3^V-8q|JD~U2;XA)`Hl&1(giWN9S)?3hm zkSsE{0jtAAos;6xF!j-Hw282;@{%oV%B=gw(x zV2Cyu`b^p>T#kz1S;Nr|NfL@G@0k^=5^!uC4i>P;C@x_DP}ks%57h@?7I$XqI=>O< zkT_C!5})RESfk^)3D7IHUxASDbYPTW64JeX{>HJbEO3j}y}fb{ z&FPu5HK`(?zfBP7JsnptK3c}UgJXm!L-|DLb8Wj2yGLSN-#I8a*ydKDIBb+R#J_e6fi4JK?CxTA}Ia|nlYs;OwR=^TerY8o-`&d zwJJPqj?NW9)70w0ySxF?M$=CVu)iZuUf&d!5(-_FnWiC~62}*l(-WlR#>lHaSz~^g zC#mq`iFHMoM4Dh^GuvYKnPjU(8QU8gMj&cDs^iD%DPs zkaPzMq&PK_XR5nWe{Yx60^nMa2|AbiadTg;LFkVdpMLBlUVlv&otGD`_DbS=iHMW9 z^NK!vb;k&b)d|`_^IG7d2|dmkU#kH^OS^LT_dogy@<#X3*l_jwT7A%(z;9!H+2&H~z z<2TXVTt%MjjZ3O{_PK!Orzd^wz4~1kB$2g;N69)Y2jq}Vprb`x2N2EkWN!RzLj&ng zL9)v?V0mLv&G=ybH9N~ZX&h1!1o4A}=Jp&PR+9tPh3i^1TjWWEVovsScHoNTOEf^) zxHu?l=CL7doj70L-%IE_o^|e-m&50sA`<<%BjXr4H6@F;p0*?zGd>|sG8e0akZ1%3 zCoOsWxiG^tmMvXEZy^rU&kE`?jI=n^#ZT1-xW0ZxVaM7uP0D4_-4eePA#&D^?)FLO zTRoQ4Z3t{uo|-73ks*>inuPS${O7fO1$1+I8DAH7ij2~(v{+1vj+6wMbp5HCEaiD&+MIPvlPr1%Lrt$g=N+kJFA4EW7 zcCu)M28lg4H|057H;s+ssoa!upR04Pj4&JxksvnS(3TJM%RNdArNZd>ubtle`0)uG zK3m52z8sxbgU4f+$+WefD4{f`ccx_1SI5}=n8_cr*7m->)1xvd%chh z+-jet+a%I7NQ-YPxyfcPzx7nnmuVyD$Tf=MHZH44hs+V@$nkSd4~9*Mb?yd`Amtg# zisvDR0nu*ONgLZWD?#l?TKQnDGS|le`yH%%hl4fUTI{fCV5inbV z*yU<@&UvCwcW&F%Ek8#zQfC#H;9(4*3*m0@7~F z=J;ZeE?aS7gzUrVjkwWMyV8yplgr(MW>Z9Lb1Y8`l77Yl76`F zghzA3HjroizFiig+sxUCadO&6g-q?VY@(5%z3VV2rkh2wsB4uXu3FviPyn5qQJ9I`;ta%$;W#qsb0eIdZbZJQrbt3& zn6i)#}GG=u|sxo#p~e=64pFE;>_835?MCgOJNIGcf3 zW8Oj;u}Zb`J(TD=w{(VBmW?DRT{dc~3)e0ZO{%z17l$A>c2;K&VPYV8O(E7!vG5p; zR*9|%W9P|sC?A@xs9MsvYtjNLGrv4>(jhq#`oaYypDyDsX%z%Y{|L1; zBdNgD&($1i)rcr?Nd~;u|Nr*h1j?@Kx(?j;z4xb@=R#qgNPyq~fFdbT6g5ziEqRb7 zPb+S_W3?@}JFTQGr`t}q?AXcbtjI}LmYpoeP8`dzlvuJTTeeImmPk>YMS+AkPngF7 z3P8=%AK$wA&d+m1^_hc5kj-Xf8QWBTNptT6uhMJVT3T?+`gJ0JYtozL zjDZX0=>G#bCKFMlD%Xzo_Fjq#_9>D|mReZKXK*d_@lzw{?CK`8rzb6){W$Hy#?BaU z@^uCI?sjY%>d+JdThqjjM0b96rPJuUsT)bR7Q}s%E_e>P2_h9W<{Ij}N+g>R8_tM~ zO}4e09u)kbzfX=A3E{Z*>4|OWy=N;G~86yqSV$|tyy)&FR?CX88 z_>taAT|BybtBjrSt5Ow37?h5c=R%MtB-=7TNML{rKA{0N{9#s5zn}r)ZJ!?xaB$iR zVIE(gvc>*l`E0u?Gm9TYhY5A!j@LCzH_l%1iYZk}6n&30_M2Fjs`UDUh_kv-7O1+6)E*eFb_gU7)_sJg)E8Ip`(x(u)iKUf{*kgsgLY z$k7I$Y3W5&phv!49$~HxhUPg4yl@r>r@}EPkTgBxHVS9y1HYJq41FNIiB)=Xg?=)e zUBc7x!V~Vz&p_jM5k&xTkjTxE2|+H+@v$kKnVP0A%xHd>p1Y$RL%H$%zuPyhmz+%j z)a?5B2`C#pBeI;Ju}n)Ba%5P-Je?5zosC+sZdJdeX9P!b*Q0{QSm#qV|m;n5agMtYs)+P zoF!h3f=wAtg4g;Xd3`J$_UN@V3AXfiQIs!IL&g(TD3|-Sqo{Tq7qCyv;#tt%+t@L~rNL^_?M_m{y5od_E{obe% zu2K8}8(v_s=w`_agQduB9#Ca$-Z-Pwh}%o@WPBu5&n=)}P9SyT#x@!e??M_UT;Wg< z9e{Q8>-Wk(yx6XffhrIDoKM+@wMnAJ;`S04fSt>m8uKd?5aaR0Hm0nY%#r5Fx zr(p}3)bxsBs4*AcO2L`PXZNM+t{&%bWtml?lBzW)a?RoxvB(GB_pQC~<;3S7`%;^z zi*`HX1b;n@ZgBI2SS9_*dK<79eO+J#I#;rhN5o6`_|TF|FNx-p*sbSP-8E)I)78Rj zSWA6x7z&k>R*9h0E*U3Q!MEVZ*%-5>NW2}U(UKrX^SV_$yMTZfKSFx2rxcN=l+6<` z;0M`21_%*@1p3`oDOnBhiGmB=91dL2n;H4!TImC55gFp(L=VoWYo@cuq}JXzF7l;g zr$qtCtG&Q+4b0n#(Fs+;>fP6G5}7D)hc!kpjJ67dY>CInwvwSHSCvr>D}}^1BZkDd zJdAa#=tRN*OUk^v*~I6RZ!bta>@XqA!NEZh74SEeDT0uUIVVV;IdcYMW0QJgE}+Q0 z(y^EW5kpSg==jXM=Ko22x~dZ+(5b?OKsT=^q@Nq4Ytcm;S*PrNbdkih=hOEOMd6AX z(g(C|UW_)m`+O~Vl7v~J1M;*1we-`Yhpu%8eQsV`5=i!ezrW|FPBb3>JRRVk(-C2E zm&|)Xo`)x|W(#mD*R^f6WfADFH*}A3L;{Oza6qe7c`wfmDl&1rphX%Zl+7PZ^ap}! zrJ^NKbhe^F*Zi(qH=~^bOWX{LQL6EQukiE70s$O@NmwXZuv8p$xsA7Ft0p#kYSj829) zH5EG%70vdruJ@JP2lpL`h;?)28Vkf&i9ZMj&Yd&E$mMH$_e7{7uDPuVV$=CX2a{p9 zQ7ylu$HZK}T6J$IDyvCP&sK_f?#Kx_Kz|`pNi|+@p(dlZQUGWBrt4_Iwo(K#=TZzC zCX{W6YFnSr2Dd-bLhI{Ao={jNwoBY@9bDeXrHI>a*oGHgcp1|((_}0MFfwvh1cbfe zsuJp4w|*^74xbi2lXEqLMIXD;MeVOe`qNFs`S~j5X3L`6C|sBDp^PNS#047Qy7PvO zWZZJXjcI@5#PuRq%AzsAB+I|Se@%D$6lM7Z<-}!uWYOy9=`W6>!|QjkV*`9{&f@Tt zZdiQW34Fff!jU*+64Bhcdrgr%3FUoPG@Pp zK}k7r%^MA|lEH|Mlf{4LgE!(o{>@%OC)p(fL3}hEHIHc_o}_@|lLw~o{!JZDE!|3x ztX57aU@?G4_Z^mbV4N4Bd5gL}M4m5h{8TH6?Yeme3y`m0ix(UgLWkIfztfZ=E>s9Z zT+SWiBh7OakntPQLLlPNA{($UsC%pRGirD(y?3C^g@nm4ZX3*qGFUaV;w&vbKHi*} z<~=@Pv9()+v9+cTt<5g zSwn)WK?@Q5NHw7-BkMYDU$+{oh-YN?I`%nI&?*t`vEvC~ z<^06KcdmvjW$f)me_IEZ7Hai7grTVS6#Dynuyf~j%+Jk|n^MKVV886l8nH`IDiv|+ z)M?BYW1JhE5;7gyl`v5(%H$?sfH^vbc?vLbT3xjkAxG%oy7j#< z<*Ep{ass}_?PB;U2i-taqmq-g11>q_G>X70p|}l5C<5&l!`E2K=8V!FIyHEzI7;Fo zMp6tcee|;v1#%w=ZMfvS3pS@ujPTW*sJy$cD%?Aa#Y%=!{NA7ka`f9Mpi@rZP$k?3 zyM*CpV??hzJmcVa;wxKL=uOBzRKqWR?A_Q#yt1viAPqbaaT{)0Nfo0l6XJ_coJNV& z=dIERvS|?_y=7e+`dS*@e>j9_L>$AX1zERFWF|1jM)Q2jsunc1kiA$`mj~z5h7Mh) zA{cNRuJbVTW0t=j7|V1=6|pp-sRw2j-xn6q2^{^B2ED9xX=rs0cd$eMtxCtZzT1!& z;jY&bgRc)8(Zgr0Xjv|F{TIL3q-Z(tuD=V=O3k-_U86dP^;w|)L#=mVYN#95^qr8& zN`~j)iD8UQo!DRd9he<>`Q?3R@907wA=0t2ad>qeHkvat zvv~2vQQ|8L=;>^QC%deJTvrNF`oZXsOaDH+Z4f<$grcAkItu|hh=W-}E>2sP+{sm2 z2<`TW-Nj>X@u-Z>vvLrF7-s4?KWIL z)Hl=NnMAqEL{-pT*6GEM%r>r%`lk!1py&HL3;6Y4z6ZblAHI&6DLvMpekJAVOEpQ7 z5%sJm51hrT=Qdz>cTVOmBOxY0)^~^4ys8yrCrYa3;{qO)GP#nKs#0a}K}JQy+*E6* zs}-O8>3d*OWNDY>6^Tkt;Lw@t5tX=lL$3t&x*uUYC*1fHt2;@TAV`6RiI${jLPtd` zkYRN0w_b89|326)32!o|20Ll35F0f-SHBnOdtGqZvY{MNVoQ06c9Rd=B%7AE3@!U91=IX|KM@FWA_fJ*9`*~;8{kV)x}178v{q!bMpM!4*dI% z-vnEkMB-{rMa70IYxp*=rr=7pMfjM+O?u@GZQVI>ToRVPeCL0E`d7LQxj%#S_w(<* zaf_gyM!`q$V;hNtugv0sBeTeM4zZ?%&V`z`4dt7|a&5fv&XSM#P7301iL3-2%re}; z*Bz?pZJocwCS-l9rm?7;pW=*2TE=SiigNL;cAVzYNKsSCl2DbU__}Lyd4iPhIWHy0 zSqr}IfmRxGohxTYNJ2KD$cK)617AISFN)iaW8KmBV(eT8CTfXPpG9J{$k3HJmv~O{ zBwJcS>^(Sx-FK0ptcd6uZ8|md=R@q;(22(mPNTrRl59oJqgvEWjS(>O{#;;DrSGrJ zGm`AYZ~dbm#m(1sYc6ji<@0*Oah$D0Ma(4XW+%op;NgpXhE^*n9b|NKk6GigB1I8^ z4<)7W$-PhMBEEKfZAxB8?=vz~r^%pnFXaQ8+2l5}dgMFUX= z)gr};@^aw^2RiYtcilpq=<5pX&-j)+Ah^L;>uh| zzWFkSNl_}@R4y;Bk&&*JL|ZQrT})8a(o&EFD9n%H*4u{Y`N|57%9R<7wZ*)g?;f=H z-eY@F{N^4MTiX!ytwUj8Gi(n9pE|qf-0~t^%g857?|aV>cgM`iXKCH}O3ueDJT7{y zZKxk=DprcF_Xs2!Du|VH=deXDh5;Rh7Vrc7s$gT^&xoE71TEq_4EE{&1U& z6~R01<%x;P4DLVp0KWXfm+|uC0ePOgS>Ac;G5l=!9?X#e{n9J*`09&AO}*oDXO*E$ zL|lD@zy96`e&KyIVGKhi<_KZry_Q{cUpm+}SX)%fiUc%{AyG!!}hdq~6|gXT30xR;WX{w+vvoKh?Ut zR^><q)UNvB~k23DKemfz{vWkRW!a9)>I}rrX&jIyy)w9sd5juuS`(ofeo=`xSv&6P3QmvsD%uA5O& zjicx0@fQz1E17X-Y98_Q^C%yE3309!E#0e;9ohujKZvkr4OSO27-~0~U|x%z;?c^^ zW5F@eeQ(VYe_e<%Hp``Mu^5&>azkko$^?RPO=%M4@iSN*&f_(VL&sW)7pl9dvxps{`upd!=B?$(Q_qaqdfgPS7n8GsdSR&RDe#J zd%t>XEBD62y|2xw1Y0eGmOLx=wBW_lvp703jV-+eDaf#Nya8>Z8z_3wp3#=PvoueW zN{CFB=p>rQTUPhr_MIDW$L=lIdEEfIDM;#rC4p;rcPZr~yoOp_rJm+mUP5ro=O#_k8@hyXoVms)p8eN=R;yt$Zj6}iPi+uS5}^>ku41zYBB z1kOy);i)rc@bsxkoR}_?@yg=n&6^RCA&RBFiFK~?GQP&E_XwvHqob__y>0DeR4RlV zv<+@e>Zet=j)8hlORLIsSuYL{$qi}A8{GBo+p&)#il2VYZI{f~<4`XDM?rS!b1nP1?oEs~&ROe9{IgIMa0f891Zr*}_ z@N*wV2j3^U@m%IA>P5J6L)mKzfb=JL@@ym`ABK*@&d;GdJ%;k>!$>9wrcaH_{F$I* ze&F1C99Y|n>(=$-x{dwf%C_dX$|#~ofYw45`K-2<&5)6-#Y)E{exAj7>^b{1{_?f2 z6FB%TYFS2b87X#P8^d{t`xD~r6K<+iAY*Ls>+fkJLmuOi;j)(3()ZPpqQJ2)K6wV8 z{pecEP=xIC@GM>-z%g4cU-j>#?8ZDtJ-1@aXk$+JzhpuzP zQico|xaX4N#8n_UBkyRc7 zxRg1e*WmbEh!!R@GDbMkA_W^>d+8u{?AVNKE~}AxsU3GwX@`D-pe`+TwT7>~)yOOG z;(=j2v}ZqBauLehxsU#rqu@j=9BQOhPGksH54NL&Hqk%){jcGs-~K7|wp&dva}r>F zT>7!s?}?VqhC;mGIS^z2$uT_e%}2;co<%S-Nyx3LSsg6n7GyC`8};^0tMKHj$B}Js z#h?A{efZ$rJMqo$yiCEg7U|8sadjWo4)tKuU=Ba`Bkz`$u#q#8%70N1i@1{q4&9IM z9(V?~_uq`CMxN6eZ&oe0DoRqOdHehG579NqW4JO+u5t~(_QM~?wxfMGc&>!+962q$ zVA`V?Uw`flwsey>Gd(L+SroRRx!Q^!xup|7{WCv^*0wg7u~C>kdl0|y0){tiME}Qr zObWlO%VW(X3R?L6!38eqg#tS))*I2W_e51p#95UmTc%l2$uv%O&j>HPzMbZS)Z=Fa z6-r1ciPO8b`0Mku2@P)Qd4dMztg2K1}o(gurcP1KFvf7Fb-yGFi5vTs)C|J{sc!?#=w2 z7ruvE3d9jbyr2^aN=Sf(cT0*SZ&IGm*mEf3zH-FUInAQr#FhIx3 zC7BUL#zl^wn{=i93$Lc344kx>@_|QAO<>mzoAKJw<2YB0p$cib47h<;Y_h_+7Af%X z!r?Qx?S{4ZzkcU0@Q?o9`w0=PB7@`*L+sq~lw@A6TeL933CDTv?ny8`IDz{Qy$I8h zQ)D8_PntW+XTS~RUORD4ROg>PZ~}d+R^j>mr%RPI`z^W}O^9BhAJn5=Xo0nl*z`=euR|24pk1tljeB2VGB{@YPW#M@F&t#aD3K z&K-Ccabu4?yALCibI7+8P&0W6HmytQPv1#VVk;G5C(cc&crPCT zE75QerAT}$xu4_n(}YI3f~Tx?z%CMJtO|{Q7Vn3*eu#|n19*J+NqlJ258x{=eN}QJ zE2wHeLvEu&MrUS*KMW0t4@UqX+-%#({|}Kr#%m2 zDIZR-rez){XIliBCf1kbY8q1FaG~FxtIiv<%Y$X zbI5aejrh@sBTKb;L6NpLMW4|w?)l{aitx97^Z)y2%X#5q!zL*+PAU11A9@&L)AKkp zQ^YrqoWkz4edwm>W2qYA|9|Qg{O*GfVr%~Zu3x*(rD!BlI(Rw5=W}W9pOztl$a#qZ zit@VKyvPtfd~z7ScJJS!ue$@cY}zQ3D{v}FHqnwWX@eo9X0a;o7}HP|Xc{7&S0?b_ zD|0w7@XD))ovgn}b3s#C|3nc%u~-tfkNc)X^d2r*6X0cB+X0#chY49sP%vu!`Zcdp zMtJ$dUkBrxNzvcy*Q~~Y6BGF6oat7~v=Z#p?--Fo+GA_2v{RIUnvkS_`BBUEL zPH64a=saE<9>t&i-E$&!H`LpQj&?E*Ccdnle!+2a4g@Wl$DcWdhh9F4yd!kAxuQ`4 zT_^AoI@A?&5TFHyK zarG_u%V+-rv-6YKI=BVHGb56}=abk!zU_x_Q~wV9z}62VA8F+byYV}EtN4XGdhoNi zbrWiB6P|Z=ejXbK$iR}@XlmLbgM%4}iWuqW$EwLubg<$O3oR!F+KA>6-F+t+i)cmu zguXYH$Z|q%cOm2+JyqgMGb+XsB(B0P5KqmDV6LXC^^j}3u0XDHzAAf-&%KPiO78hL zN&zefVy(8K$yP^*x+6}R<_J?WoDdVnk!)}QU5lX5fv{^08Pqt{=<#{9Y>UkCuOps# z30bpRHZn~ZB$Upc*Z3m{4}Ag2+7Hl&wp^m2biv`}8cKPKPf-y=q;;fYb7g$tfp0#}1F6yFG_96w&?aD@U-ZqZ@zk?)MQt)vEe_#_xE`PvrKm6`8D{uGYip0M8sf zgbGE7TPcDVMj3Gzc*^fNHHv){dEdEV9d6pVUW}lkIE{dZzT>;qJk7v_s3$8g+!(Gz zq`9%$fmPb~A2^P>mS6pQgyfGj!YaL+`Ra0;S#FYK+$P0HxFsWLSK8+}#QJq>5L_kq z+vk${w1Dz2WziE8ysRP6l&EuBq*WeaHw+wJjjd6QWBJ>Fn^F66nHII&i zC4Aiv9~s3A^T9NE*AMha6xpn}-nxcY50B#6L!)AlxcPm+scEs6-WqvWL77g3OAj7ym7xQ%Yj~kJatl z$qg@%Ynn59>N?=_B>Yw&?6g^ zQKAdQ_cCXN#BuSD>GCpadvvb@1`zPj#_VE7R?8bF{Jvcc@i;#}#seQ-s-kmd8)7hy-@w9X2xKB@9uf*`wn6F~6E{D!@v6sxL zE^++w`Qr9-FBC$F)v9Z5?~Ss)mW>h{Nk-kVYe5l81FFPbcPqSWduux;r>Et!dwN*h z7g{s6!ed=L8U& z;`qz>;!|J5XFvE^h-Xrw+E}TKcMJSB_}i zJGn8SEF`5SSn4lKmd=w_nnfGIslYM6E(crMPdnQw1T7n+Fo3fYGL>V9$G-(LkwdWV z55;5|{Q%jtq#Tunya#Rr&h3Gn*+ZalJM6i?1ZJP2OG3fpB#$alDPd{KMcuDrdXOgR z#*+TQEnO3W=EqK*!?&K^D}8jOL6rz;gi@~78W}-A+@f>%^eBeUP7qJnEt3k+ZhL{A zuYR_3hcm7_%X#0w7~zGAoib!F)==nwrdXs1a)L*XoyH@_Pth)~QeNB(`_+@Yi2nz+ zZdi{G+;j`_MCJ`rgd9t8Y@L4P6|g;C)rL=jsnk`g1_d#C#T1sz z5*6`UQlE-U1+WXt{mfaIz-Zz#N9M<;W{AU_K~HxluG_L+axt&8k>ug8xu+pQI)=~% zUZf(0F3#PztjFy)tj6Kf6L|djspPOL%EJ(WWjfT28wW5q_XHioL6ig43sob>ogT@NrEA$$$fAoP zN^5&tamThn{I5T>3+q?)V$14I43aU*aT*G7+#Gq9qJu;$Pee;GaRCJZL{NnqhGE*nD1i?uGw7!`?*xh#>(*2VB<#SH88^w%(Ut%6zP zxT=*_mD6;udSFV=!^}KKFDt3Boejk!;I<@@3joQc$Gz&wn+zyIE^21AaU>&uK(8&q zGMDRCQb^HnJH4O2^B(zb&bkN_pZ*@;Vp%N|F`rr%UYEJq;vXvbr$6^I=qqp7OsK0aBf!er&xL|SWe_q zNak4jiv0F}`!ZfQa#Yd~_~dOArah6l4+*D9+;PJWyha9dsH+$A1j9?^5(RH!tnKWT zN&k+UZlvdm_{iu&!FUBZUr7L_3Sx##IuF+4mh?Mm5=V06g_QIh8a z?_#SWOs%G+Z+t^}p|`cQ5{hg`F9k+=dO9??kgQPDVFkl)WXw--vo?-tj!ahZ{L4qk zEq@I!?mvOUXJ+M^auX~=bLPmYDRg9kfB7pvj30f^&BA?|;PMT<>_eez{6zt!BO{X- zBcsetX`zrq3mL~;E<}M`YYw<@u*@$NzIL2d;DW!(bBS@Sdjc05jBd(wpFVy6r}5gE zL%4PAE_~zYHzc}Vl+J$^H}&nnKfLqP_`kpVPcTb?tX|WOpYOW|AM1ZVzB2j{4(%Vo zZ$8}ej((ZeEWJ+zTNI_T7sWP~jcJl?Mf~9} ziveV}kU9FKq8hel{5jyjmw@Sg%0VXDdRe;3ibk~*)ar(I_wOUgt%7yPSH08=Ipe9n zxqL$@f+j)Y+-8e&vqk*zHy^<>`(DC08J>35GbDFXkRIPS78>F@RtoC$ce1Q~5j!_; z!mZbD#QSdAp{6H+Ru3?_?i9zX^kkGQ&rmWSRi+F6xj(-bPwzh@ykF>Qbww>FQFoCa zd4lKNbR5%TQ*Hi> zl@4(?tW5(VRU)fTo*2gH_=L0p<#Q5a&pC!hRj}D8<}$p%{Ud`sFL+jv54<3TGmvSo z=_`*amovmg4+FVea(--F0%crA#-=5u=(XeLu>a6$oSP`qc^Le_yKcmf-?NQ4IUwx} zcDX}xl=x>xe%BsQIcQm;i)_0tpX?ec53T4&3UHh@lYw18^DLJl;*5Y2Ey~k#=kUM% z)h{BTVCHoLH&9gkZ|EMjah4$+R)kxx+l9T;FHw*}#X`#T{Pz4hoGYIrblr*Hdj2|O zH@*u`PmH0bx0BFsCwA=Ifua6Y=)fD4^dhLCavTKU4k%ixXMCly_5ViatZwx%p| zv{{Ih?Y;r#^i#CNO70$os&pm&g1F|J>`I0> z><|4{a=R*G;B1!o-x385rw$?f-oJ%ivy&#-_vk>#NXA;3!)POxAa7MzQHD9%=N@d~oIn=JSK8224 zMhdu+#MM#;0Ie`Y)nB!haFv?TOv4*DQI1<-~#(%7Jd3|Zq zyFk;;BuMDepfp$T^6q!cTrznplXe=veBZC))XZ_*F?0tWI{qM7b#1Vv8)w_*5W8}{ z3cHZ3Xz%v7nc6%)zV%}$&Q9PbhJG5WdWOgg>%>5zi(a3RRvp}b+`6_DA=;!NnQWNB zY#4MA}dw*N+Y?jCC!?95TAOGK7xY9tna{^ zhX_!shaq-Qz!Tko_Up*K{Fn6a1-e&(iuVNC4}9sfy2Plrx}cCcRDN$~dpn*yv=4h< z+m8aFi0#DxwdV4enw%E*S;TQ2s^eU#(a8y{rU>JisR>-x8cvP1Jd@TrO z@Q_nsgD)}9jC-;wq7qD}@Fo?Dz;8{SXEmH4$kS=*#I{bY`m%?oN{qT$3>zbV-BmKv zDb;v^2IFm|9;#75aM>9S?7@UQ_bsi7EZ(v94m@)B5sc1`;9VQ;#8Agt^cK2t0;Adz znKy80Nn4R9bCo0UT(MQoNJY!H&pt@r+BE*;rO)G;bNjJx_8>}?846nVpK?=CFocdxN73YTrpHFBk9ayLmEa_2-%w-KJ`f;;>2hM*epBx-8> z_&XEh`pWC@(N_Mh)V<~)P+0F(UFX*?&GlCQvnKg_Jl_+dbQnAS=C^(W4<3Ay7IhV) z@fmatu9D~_8@Yg7@e)NmG7{xwH#!oOnd7X6upQY<4rBA9LKReMMf}*hPvE}ee}&KP z{xy8+`d=W#RU&siqt|hz!ow>Xb=7>P=pviL?D4Ol_2tiN3f!u@C=&f7y`qKwt)#RE zdw=9fa>U2hlzvNG?`=`cXWl-M?oNnXhlqx1fgO99fL9lNM@igfSXG4Qbh#=4vM6@l zhq&yKTZ86%k+iKRn@OA~8&q=F?Yn;$F$<1M1U+^h&Qk09ayZH*hmlP8)6>&<^~6bh z^|43s-0>q6QSQbKYd2!Bs|zE2QbO?-_oB%JI$$)4Aa1n?{hssPMF+MXc zD4@T+3m<#;yK(o;JFum%8@L)qu{qwJgXY~d0f&c>3I_g zRVB6AiT1yV{pM+1a(b8(w8;6In_Ac7k+a{yM^?QbfAoR>1or0>ii(FUe-ylN8>E^P zBa}-lQSU6`vB#0w`#JG~l2v!Y4u2b>77}RAvP7*Va;DiDS{hn$rL24|WGAxpIZ2i_ zlv&~}-T_P=C!;kf0Z>_`qTj&j07aoBKn4*VjAm(MP1-Q=lYs4@NJ%?*J3g zb2&l{-4rceMLguD)oZbNa5Zk)ya9ckEz+hykXx*Ij?K{=S7NZ?v!SMYWhkoq@W>Om z_uyY)zB*6naspG;Y4T`hP>Czr?l*S5s$2sZHYN-#Iw_l1XnoaPAI^LS2s-du$JewLJYeu?u&u;(|&mrvDK>?T{T3Z~Xp;gQMPLiUg z1xkH`h`VGq^-=d8{1t$L+RoPio&>DjC1%|6VKHnb7pmgjM3@Q zaXfeIF!q!2Ja&8-XDD#OJmo-d7k>RGegb`Mc@g8}N`y;seQONkW9{%)i(HBXhc9Cn zjB#qxRS_}JHoC%-GD#e|9DS>e>Lp?5Ut z{W~0;Ifa?>1S*v|atpacwd_=h0tqxk9HJl&y))Z}^@T0CzIP*T?7b0p^z0;8n>e?i zD7l9mkYLa14GelWq@QzOG8AR5L`s1JMTs21D~%&Aokc`H*&y2LtmH)ow&s#oBgwC{ zf)ESzp!bCotZ8438b!D>ul@U|fzAe|ZcDaj?AJ-{M z{Dz6!Km`kyHTd&csU=Z0XYJPkO$})jEOq^r;qn;k`-#*PNN`E(_?0_JnjB?wT&Y1p zg&GAOvScZ_oY75ARTW~f6A|W!B>*M44lXBF`p)x~PKKjE1|$c~^{g3*?@HE&q|>p; zZ4$dGw~J9me&JvFq3g@Kl)yj%3bgOGPzr4N6PM3nR8K*&6X0uST+H73fTmQ4azhKD z^|X*>RzxzSSp+An3*Q+!K2wwV;8N?7G^VMkVP4$LT+%hTl7@1*LvwAkR@g@q^$^ku zh-)Fmr8%18`!W1xyijs*srer)$iGcx>0Cjn}D|I4ogrS6fr$2`@`mIO6+=@;7b%-SX8Oge|I z;csu4>qh8GbQ=AB4K<9u$9Us0Uum>lHT4U$f-VXRzPUu!p+)tj6yqF4rIW{M(c zTyr^_c$35j>U`uI@ZH~6j`AYoYP#T}f62laHj!AIG|Muv6YcQ4PczZHIo@K!Rrqk3 z-Xs~w$%(S+FhJYLa-Zzpt`>xxnuo{+E$a( zFpN{)@&9X%=6I_Ose2bC^1!KnKveTNzmY&C=I3iTH#$YWWky6vSPvmdRq~sK7k<2L zAQUT;1gs`rBP5y0qGBqjw?=Im$>w-#j?mTc&XdnQF*&Cio#I9%uG%-kd^yJKoXYbh zto9`8J?5%3s(Z7Jw~?=zK_#wYHZ0=L4t)t{%Htv^T2DW38q4N*>kTfIW@@Qit-`vB zGoP<1Nj4(Dk-_-HjI>U1@pw%FH%&w7$J@qGa=+&&%H!dYhw#|h$MIXQd=C5P_Bjrx zX(pTFtvRF>FQEPIrM(6J<%2g`wku7#h?<(7sfciN;w#lmle72ZEq5j4_A?=!`05`k zO_^AzW1=*LuaDd(Wn&w&>#!=j3UJNEu3m9hb2P^rH`IGhkj+KNWK?t0E9py#vDU_k za#pca)vf?RS_#-3ZoK6Tr7PJ+95|!Ng30v6oT=iEkAFd$bhU&Te0s;H&>6PDtC;g> z&Wq-Fs|{ncf+d%Y(9xb3^k`jMlTbRD1_~1bSH2?+zKrWL)LapMyd|-9$hEDk9>P@z zfpRS`O}~OyW?p3lJA7j8kE0{gf#yVLj<^00-81p5T3aJ&lN=a_ETt_+oYqR0%4M88 zJ1x<0RS9pp-hR9VU2kn!VZ$0~wt@-~*w4Vu(f&GO)J{3<4qgFS?Zcxen_e=yn3nMd1;@}9N*_*w2V<2)p1wD zAVEHF2wfU!Sf=7cTFNNe+lh9>JUcpxzTW&5mau;F&XH?syYMO|;yN4e8Yi&z9(oNA zIDt-WJu8ak^m95X;j72*!^3AElInvHPO+Rmsv{_9mY8&Rixz56UBg4$tfqg}pZ7wf z()G|tUZ^U#BGvzN-Ikq;)zAvp^|wa)(m)VL!?)HWpT^W5aQCU9ysKH=bPW$leG3Iq zY7;NM@7nd!_cNC+lyv`V9Qfp}1U5oxzKTlGu~CGND+0+m)SOJUWv&6nj8R9nStjhdmSlYU2@NfdIGP8{9?3zfMQzLCGVrh3Fd2zPp zHkd?mRY#u28q-o`gcax(Ff2U$lzUg?C*l)Cju9}~B`C$8aAQl8T;mSQL)_cNo!Kf7H6IliZlAwJn26wSdXVGTooZwRh%6Rf0G<`cGV)L$y?t zO_W{v>aPMI1Ppd*1E2KMJ?|WW;Frcel%{kz`}&XlLnN!hdTGuL&Fq z^~eAXAk);J%L+>o%fjGRsIhmgjT%l9We9ae{uitck8 zE<$YqBD9VJRpZG$lWn;y@0FIL6d^TXR+`b9Am=9k!j=L}MES-Jzfz|!<$BD`?4$qy&aAg$ZwNcDh zr}3FBzlvM>wjoQqY3wF;lJ*gZxP7^7YsY+}qN%N){Uf?usCjwOb_2eOITpsuMJ7@rT6zAj*@hSpikd?c^6l((+~59{6^1oZ%& zI4DqjqN$dCQ`Tl>b@0~^J6Hk{+6D?6&gBl$ID<{+LXc^7NHZhHX50oV2G|Fo{Jd+R z3a@TcLOriApWP_mSSwCGL{GdQmpqg+gUKkghUds!Q%FbFN?iag(m1YYpIt(Xo@eut zm}%3>OE_`K`k}=cCK|BePf56jm0d$Rt_pqMWKzUrT*SJTHE0R)$b<#d2yI4IA%Cin zk~kOD-G};Gy|f0G*XC%5NL%GJrNKOfv^WsN_asirvWOy^X?UAXPR<^%Sa4BcaKoROkx?J2M6{*7M4 z#xW+hA|ak6%H~{mp1=Dxl|(V2Bmcnft)P5zK@>iNTh%7$%xIXd%?JKPp$f z^Cqo(P5Y;t#zYa1M(o12!E&A%z?n38nhhoNzKQ{jV;5o9N$%le{T_Ngx$fSXpq?_K zX-ENl(|U33xCMc6`JTGN)uDZQaLthpqZ^J%l=n-jB|(t#w>Ng)h*(cwS!YvqJ_J^0 zxV4@RQ7&Aw9GJIMF95lP-)H6Sz-L|F+=!0lvkeC3;AEFC=Y$ZVm@60lz+_b70;g04XnFL)PUMxEX+&l1jS zcAwcu-}(j7U^eT=weTq2=O+uI@E)Z!woh#af|eMJ^a=ULL@8NYby4Yt`|AM*;HV5B z%}OxJ0}DXlykatpkTfuI+@&2v9ni>EnL3)U7bv(@yx`vHzbqb&;=kUgS`RvmNjGXK zv2>fUP;|B|fk=I>ChaMh^9~8nfcQ-II<9_dpAj^v$KEhrm#ehyqB~Texp!n*t24SI z2zvApF8$;>%7C1(8k?a0BoyVH*M)Jx#l0||u#Q6v(gkZ>6R|LLIqQe-xi$aw#-#@> zya?7IO-qv}B!kH}CZrpb1gSNLP16~I)JUW^-0hn|!>4*a$)E8X5(#$KNA6>4H~p66 zHY^!SZByspf%`*Op$_+XHZ|UL4`cDQe7g<5%@}8Z7@d2nf+-JnspBf~ z`!&vNsKBodb&?X9qxycEeukvpm{8KWf-urxo22Eax|T+|-5pN%D_f^8Q_7{jpfx3I zDYSq7jSJE@>A!nPx4Mn<8?Ku#)){@F@6>mfAQX8vHHmBR`DmI^n28*XNQjBW5NJ=?YTZHX%@Gz5>qH>x&EH?1gEzHSx0AM8#(aA_pQySe@%c=M<3 z7aUTlTN}@vnTvQ|3F_w1xrXvrt-g!;horYyajNU?dLU9#*0~`b_9G=%7>(*VAj(J@ zOh6>FaA`9604&C!{EXFhNZjR3oSa@TbDC+G!G;pSTKj%M6z9VOhkf&Cw zl!Wi+lpdZ(5|wtSv2ot$d=1qoG8fMryv$Ygw5+L9RE_VwHb>oS(H-8q?vC>e9DU=g z{1sd`M=8?%eq##98jobbAcXin3V1wx-t*9e=cG0#)}1449Li53b#E1^cy1|Mhb^h0 z)6yts5drTK@J)12)k)UFXE!zy%>pkYXw8j-#Hls1*$A#wIDc^ju3b@9^zA*eKRy z56!5=S*=Wz))cv-CFjv;FvU9W%okyJPB_XaYUKPxcBd1aunwFkf9X~K-%PEU&j%33 zQ3mfc2qe|MqRhl1+uapE=JU;AZnV zF`m{m(_WgRVVIae)RuHRxo#zq53 zc{AF~^O0o(sqF(Jm;K?Gq|f=xQbtm~;&tCkoF#?hAEHCpXi_^Kxk{EqwCxsSM&q@ z<8#DPPEu29{F(c_M6T6V4vIc2>~J}QS2M+-Io>QIj^`yAKZFKb5;l;IYv&;nMxf!>Mbg0cU(hx1{T)jb;{P%)f^3RRw zo_yWcVVT3B%ipH^_DM9yipF9?xY&R;4P|pQ$JHL@;V=w7^Li+9!K-nJLky-3evCNF zkJDf8M{_hsb2P`BVwi`?VShNtC;#qZ2=cslVg{~1lxND=gR*JumAu607*qoM6N<$f@Y#g)c^nh literal 0 HcmV?d00001 diff --git a/src/assets/header/Prev-Icon.svg b/src/assets/header/Prev-Icon.svg new file mode 100644 index 0000000..4530760 --- /dev/null +++ b/src/assets/header/Prev-Icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/login/kakao.svg b/src/assets/login/kakao.svg new file mode 100644 index 0000000..44ddd6a --- /dev/null +++ b/src/assets/login/kakao.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/main/Down-Arrow.svg b/src/assets/main/Down-Arrow.svg new file mode 100644 index 0000000..4fd44a0 --- /dev/null +++ b/src/assets/main/Down-Arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/main/Eco-Logo.svg b/src/assets/main/Eco-Logo.svg new file mode 100644 index 0000000..5cae6a4 --- /dev/null +++ b/src/assets/main/Eco-Logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/main/Heart-Logo.svg b/src/assets/main/Heart-Logo.svg new file mode 100644 index 0000000..ca38937 --- /dev/null +++ b/src/assets/main/Heart-Logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/main/Home.svg b/src/assets/main/Home.svg new file mode 100644 index 0000000..135a401 --- /dev/null +++ b/src/assets/main/Home.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/main/My-Challenge.svg b/src/assets/main/My-Challenge.svg new file mode 100644 index 0000000..7dac4be --- /dev/null +++ b/src/assets/main/My-Challenge.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/main/Nanum-Logo.svg b/src/assets/main/Nanum-Logo.svg new file mode 100644 index 0000000..b57c11c --- /dev/null +++ b/src/assets/main/Nanum-Logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/main/Ranking.svg b/src/assets/main/Ranking.svg new file mode 100644 index 0000000..0cf509e --- /dev/null +++ b/src/assets/main/Ranking.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/main/Star-Icon.svg b/src/assets/main/Star-Icon.svg new file mode 100644 index 0000000..fe6975d --- /dev/null +++ b/src/assets/main/Star-Icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/main/Volunteer-Logo.svg b/src/assets/main/Volunteer-Logo.svg new file mode 100644 index 0000000..bf41952 --- /dev/null +++ b/src/assets/main/Volunteer-Logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/main/ZZAN-Default.png b/src/assets/main/ZZAN-Default.png new file mode 100644 index 0000000000000000000000000000000000000000..97f9d2f4b88481ac7054679ccc177dcd17821fa5 GIT binary patch literal 3804 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 Sm1yh$0000 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/main/ZZAN-Profile.png b/src/assets/main/ZZAN-Profile.png new file mode 100644 index 0000000000000000000000000000000000000000..e0adac460a44ba58d75adfe6f0da56db672699e9 GIT binary patch literal 11677 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 literal 0 HcmV?d00001 diff --git a/src/components/header/Header.jsx b/src/components/header/Header.jsx new file mode 100644 index 0000000..9943dd1 --- /dev/null +++ b/src/components/header/Header.jsx @@ -0,0 +1,27 @@ +import { useNavigate } from 'react-router-dom'; + +import * as Styles from './styles'; +import PrevIcon from '@/assets/header/Prev-Icon.svg'; + +const Header = ({ title, BackgroundColor }) => { + const navigate = useNavigate(); + const handlerNavigate = () => { + navigate('/'); + }; + + return ( + <> + + + + + + {title} + +   + + + ); +}; + +export default Header; diff --git a/src/components/header/styles.js b/src/components/header/styles.js new file mode 100644 index 0000000..47e2ecb --- /dev/null +++ b/src/components/header/styles.js @@ -0,0 +1,57 @@ +import styled from '@emotion/styled'; + +export const HeaderLayout = styled.div` + /* position: sticky; + top: 0; */ + display: flex; + /* width: 100%; */ + height: 3rem; + padding: 0.46875rem 0.625rem; + justify-content: space-between; + text-align: center; + align-items: center; + background-color: ${(props) => + props.BackgroundColor || 'var(--color-green-06)'}; +`; + +export const prevbtnContainer = styled.div` + display: flex; + width: 2.0625rem; + justify-content: center; + align-items: center; + gap: 0.625rem; + flex-shrink: 0; + align-self: stretch; + + border-radius: 0.625rem; +`; + +export const prevbtn = styled.img` + width: 0.83744rem; + height: 1.45488rem; + flex-shrink: 0; +`; + +export const HeaderTitleContainer = styled.div` + display: flex; + justify-content: center; + align-items: center; +`; + +export const HeaderTitle = styled.div` + color: #000; + font-family: 'Noto Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 700; + line-height: normal; +`; + +export const EmptyContainer = styled.div` + display: flex; + width: 2.8125rem; + height: 1.6875rem; + justify-content: center; + align-items: center; + flex-shrink: 0; +`; diff --git a/src/components/modal/UpdateNicknameModal.jsx b/src/components/modal/UpdateNicknameModal.jsx new file mode 100644 index 0000000..a47c43a --- /dev/null +++ b/src/components/modal/UpdateNicknameModal.jsx @@ -0,0 +1,89 @@ +import { useState, useEffect, useCallback } from 'react'; +import Modal from 'react-modal'; + +import { Button, Input, Space } from 'antd'; + +import { fixUserInfo } from '../../apis/user/user.api.js'; +import * as Styles from './styles'; +import { useUserInfoStore } from '@/store/useUserInfoStore'; + +Modal.setAppElement('#root'); + +const UpdateNicknameModal = ({ isOpen, onRequestClose, currentNickname }) => { + const { setUserNickname, setUpdateNickname } = useUserInfoStore(); + const [nickname, setNickname] = useState(currentNickname); + + const fetchFixNickname = useCallback(async () => { + try { + const data = await fixUserInfo(nickname); // No need to access data from response.data + console.log(data); + return data; + } catch (error) { + console.error('Error fixing user info:', error); + throw error; + } + }, [nickname]); + + useEffect(() => { + setNickname(currentNickname); + }, [currentNickname]); + + const handleSubmit = async () => { + try { + if (nickname.trim() !== '') { + await fetchFixNickname(); // Call fetchFixNickname + setUpdateNickname(nickname); // Set the nickname in the store + setUserNickname(nickname); // Set the nickname in the store + alert('닉네임이 성공적으로 수정되었습니다.'); + onRequestClose(); + } else { + alert('유효한 닉네임을 입력해주세요.'); + } + } catch (error) { + console.error('Error updating nickname:', error); + alert('닉네임 수정에 실패했습니다. 다시 시도해주세요.'); + } + }; + + return ( + + +

닉네임 수정

+ setNickname(e.target.value)} + /> + + + + 수정 + + + 취소 + + + + + + ); +}; + +export default UpdateNicknameModal; diff --git a/src/components/modal/styles.js b/src/components/modal/styles.js new file mode 100644 index 0000000..4534bec --- /dev/null +++ b/src/components/modal/styles.js @@ -0,0 +1,26 @@ +import { Button } from 'antd'; + +import styled from '@emotion/styled'; + +export const ModalContainer = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 10px; + background-color: white; + border-radius: 10px; +`; + +export const ButtonContainer = styled.div` + margin-top: 1rem; + display: flex; + flex-direction: row; + justify-content: space-between; + gap: 10px; + align-items: center; +`; + +export const CustomButton = styled(Button)` + background-color: var(--color-green-01); +`; diff --git a/src/components/nav-bar/navigate-Bar.jsx b/src/components/nav-bar/navigate-Bar.jsx new file mode 100644 index 0000000..355294b --- /dev/null +++ b/src/components/nav-bar/navigate-Bar.jsx @@ -0,0 +1,59 @@ +import React from 'react'; +import { Outlet, useNavigate } from 'react-router-dom'; + +import * as Styles from '../nav-bar/styles'; +import ChallengeShorts from '@/assets/Challenge-Shorts.svg'; +import Dashboard from '@/assets/DashBoard.svg'; +import Home from '@/assets/Home.svg'; +import MyChallenge from '@/assets/My-Challenge.svg'; +import Ranking from '@/assets/Ranking.svg'; + +const NavigateBar = ({ children }) => { + const navigate = useNavigate(); + + const handlerNavigate = (path) => { + navigate(path); + }; + + return ( + <> + + {children} + + + handlerNavigate('/challenge')} + src={MyChallenge} + /> + + + handlerNavigate('/shorts')} + src={ChallengeShorts} + /> + + + handlerNavigate('/main')} + src={Home} + /> + + + handlerNavigate('/rank')} + src={Ranking} + /> + + + handlerNavigate('/dashboard')} + src={Dashboard} + /> + + + + + ); +}; + +export default NavigateBar; diff --git a/src/components/nav-bar/styles.js b/src/components/nav-bar/styles.js new file mode 100644 index 0000000..e476f64 --- /dev/null +++ b/src/components/nav-bar/styles.js @@ -0,0 +1,40 @@ +import styled from '@emotion/styled'; + +export const MainContent = styled.div` + display: flex; + flex-direction: column; + height: 100%; + padding-bottom: 3.4375rem; +`; + +export const ContentWrapper = styled.div` + flex: 1; +`; + +export const NavigateBarLayout = styled.div` + display: flex; + flex-direction: row; + background-color: #f1f1f1; + + position: fixed; + width: 100%; + bottom: 0; + left: 0; + + height: 3.4375rem; + + justify-content: center; + align-items: center; + gap: 2.5rem; + + border-top: 0.5px solid #bdc5cd; + background: #fafafa; +`; + +export const IconContainer = styled.div` + width: 1.9375rem; + height: 1.9375rem; + flex-shrink: 0; +`; + +export const NavIcon = styled.img``; diff --git a/src/components/postModal/PostModal.jsx b/src/components/postModal/PostModal.jsx new file mode 100644 index 0000000..f651184 --- /dev/null +++ b/src/components/postModal/PostModal.jsx @@ -0,0 +1,26 @@ +import React from "react"; +import styles from "./Modal.module.css"; +import { useNavigate } from "react-router-dom"; + +const Modal = ({result}) => { + const navigate = useNavigate(); + + const handleBack = () => { + navigate(-1); + }; + + return ( +
+
+ {result ? 성공적으로 저장하였습니다. + :요청에 실패했어요 ㅠ} +
+
+ +
+
+ ) +} + + +export default Modal; \ No newline at end of file diff --git a/src/components/postModal/PostModal.module.css b/src/components/postModal/PostModal.module.css new file mode 100644 index 0000000..872fc59 --- /dev/null +++ b/src/components/postModal/PostModal.module.css @@ -0,0 +1,37 @@ +.modalContainer{ + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + text-align: center; +} + + +.textInfo { + position: fixed; + top: 30%; + left: 0; + right: 0; + font-size: var(--font-size-md); +} + + +.btnsWrap{ + position: fixed; + bottom: 0; + height: 45px; + width: 80%; + align-items: center; +} + +.btn{ + height: 35px; + width: 100%; + font-weight: 600; + color: var(--color-white); + font-size: var(--font-size-sm); + border-radius: 100px; + border: none; + cursor: pointer; + background-color: var(--color-green); +} diff --git a/src/components/tab/slide-Tab.jsx b/src/components/tab/slide-Tab.jsx new file mode 100644 index 0000000..f4e56ff --- /dev/null +++ b/src/components/tab/slide-Tab.jsx @@ -0,0 +1,58 @@ +import React, { useRef, useEffect, useState } from 'react'; + +import { + TabHeaderContainer, + StylizedTab, + StyledTabPanel, + TabsHolder, + inactiveTab, + TabSlider, +} from './styles'; + +export const Tab = ({ label, active, onClick }) => { + return ( + + {label} + + ); +}; + +export const Tabs = ({ selectedTab, onChange, children, position }) => { + const containerRef = useRef(null); + const [containerWidth, setContainerWidth] = useState(0); + + useEffect(() => { + setContainerWidth(containerRef.current.getBoundingClientRect().width); + }, [containerRef]); + + const sliderWidth = containerWidth / children.length; + + const tabs = children.map((child) => { + const handleClick = (e) => { + onChange(e, child.props.value); + }; + + return React.cloneElement(child, { + key: child.props.value, + active: child.props.value === selectedTab, + onClick: handleClick, + }); + }); + + return ( + + {tabs} + + + ); +}; + +export const TabPanel = ({ children, value, selectedIndex }) => { + const hidden = value !== selectedIndex; + + return ( + + ); +}; diff --git a/src/components/tab/styles.js b/src/components/tab/styles.js new file mode 100644 index 0000000..3f50f2c --- /dev/null +++ b/src/components/tab/styles.js @@ -0,0 +1,71 @@ +import { css, keyframes } from '@emotion/react'; +import styled from '@emotion/styled'; + +export const TabHeaderContainer = styled.div` + /* position: absolute; */ + position: ${(props) => props.position || 'absolute'}; + width: 100%; +`; + +export const StylizedTab = styled.div` + z-index: 1; + color: var(--color-grey-02); + width: 100%; + font-size: var(--font-size-md); + background-color: transparent; + border: none; + height: 50px; + margin-top: 3px; + text-align: center; + line-height: 50px; + + ${(p) => + p.active && + css` + color: var(--color-white); + font-weight: bold; + border-radius: 20px; + animation: ${inset} 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; + `} + ${(p) => !p.active && p.inactiveStyle} +`; + +export const TabsHolder = styled.div` + display: flex; + flex-direction: row; +`; + +export const inactiveTab = { + opacity: 0.65, +}; + +export const TabSlider = styled.div` + position: absolute; + top: 3px; + width: ${(props) => `${props.width}px`}; + height: 50px; + background-color: var(--color-green-01); + border-radius: 20px; + transition: 0.2s; + transform: ${(props) => `translateX(${props.width * props.index}px)`}; +`; + +const inset = keyframes` + 0% { + -webkit-box-shadow: 0 0 0 0 rgba(92, 198, 186, 0); + box-shadow: 0 0 0 0 rgba(92, 198, 186, 0); + } + 100% { + -webkit-box-shadow: 3px 3px 3px rgba(92, 198, 186, 0.5); + box-shadow: 3px 3px 3px rgba(92, 198, 186, 0.5); + } +`; + +export const StyledTabPanel = styled.div` + display: ${(p) => (p.active ? 'flex' : 'none')}; + font-size: 2rem; + flex-direction: column; + width: 100%; + height: 100%; + justify-content: center; +`; diff --git a/src/components/top-bar/styles.js b/src/components/top-bar/styles.js new file mode 100644 index 0000000..37fc6d7 --- /dev/null +++ b/src/components/top-bar/styles.js @@ -0,0 +1,42 @@ +import styled from '@emotion/styled'; + +export const TopBarLayout = styled.div` + display: flex; + z-index: 2; + + position: fixed; + width: 100%; + top: 0; + left: 0; + + height: 50px; + justify-content: center; + align-items: center; + gap: 2.5rem; + + background: var(--color-white); + font-size: var(--font-size-lg); + font-weight: bold; +`; + + +export const prevbtnContainer = styled.div` + position: fixed; + top: 15px; + left: 8px; + display: flex; + width: 2.0625rem; + justify-content: center; + align-items: center; + gap: 0.625rem; + flex-shrink: 0; + align-self: stretch; + border-radius: 0.625rem; + z-index: 10; +`; + +export const prevbtn = styled.img` + width: 0.83744rem; + height: 1.45488rem; + flex-shrink: 0; +`; \ No newline at end of file diff --git a/src/components/top-bar/top-Bar.jsx b/src/components/top-bar/top-Bar.jsx new file mode 100644 index 0000000..f624dc5 --- /dev/null +++ b/src/components/top-bar/top-Bar.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import PrevIcon from '@/assets/header/Prev-Icon.svg'; +import * as Styles from '../top-bar/styles'; + +const TopBar = ({ title }) => { + const navigate = useNavigate(); + + const handleBack = () => { + navigate(-1); + }; + + return ( + <> + + + + + + {title} + + + ); +}; + +export default TopBar; diff --git a/src/components/userInfo/TierInfo.jsx b/src/components/userInfo/TierInfo.jsx new file mode 100644 index 0000000..16ba33d --- /dev/null +++ b/src/components/userInfo/TierInfo.jsx @@ -0,0 +1,69 @@ +import { useEffect } from 'react'; + +import { useUserInfoStore } from '../../store/useUserInfoStore'; +// import { UserDummy } from '../../constants/Dummy'; +import { getTierDetails } from '@/constants/TierSchema'; + +const UserDummy = { + result: 'SUCCESS', + data: { + id: 1, + nickname: 'john_doe', + profileImageUrl: 'https://example.com/profile.jpg', + email: 'john.doe@example.com', + tierInfo: { + tier: '성골 I', + totalExp: 1200, + currentExp: 200, + }, + }, + message: 'Operation completed successfully', + errorCode: '', +}; + +export const TierInfo = () => { + const { + setUserId, + setUserNickname, + setUserProfileImageUrl, + setUserEmail, + setUserTier, + setUserTotalExp, + setUserCurrentExp, + userNickname, + userEmail, + userTier, + userTotalExp, + userCurrentExp, + } = useUserInfoStore(); + + useEffect(() => { + setUserId(UserDummy.data.id); + setUserNickname(UserDummy.data.nickname); + setUserProfileImageUrl(UserDummy.data.profileImageUrl); + setUserEmail(UserDummy.data.email); + setUserTier(UserDummy.data.tierInfo.tier); + setUserTotalExp(UserDummy.data.tierInfo.totalExp); + setUserCurrentExp(UserDummy.data.tierInfo.currentExp); + }, [ + setUserId, + setUserNickname, + setUserProfileImageUrl, + setUserEmail, + setUserTier, + setUserTotalExp, + setUserCurrentExp, + ]); + const tierDetails = getTierDetails(UserDummy.data.tierInfo.tier); + console.log(tierDetails); + + return ( +
+

{userNickname}

+

Tier: {userTier}

+

Total Experience: {userTotalExp}

+

Current Experience: {userCurrentExp}

+

Tier Color: {tierDetails ? tierDetails.color : 'Unknown'}

+
+ ); +}; diff --git a/src/constants/Dummy.js b/src/constants/Dummy.js new file mode 100644 index 0000000..2e0805a --- /dev/null +++ b/src/constants/Dummy.js @@ -0,0 +1,123 @@ +const UserDummy = { + result: 'SUCCESS', + data: { + totalPage: 4, + hasNext: true, + data: [ + { + id: 34, + nickname: '주엽', + profileImageUrl: 'https://picsum.photos/sd/GTUgLFvuZ/640/480', + email: 'testt13@a.c', + tierInfo: { + tier: '에코', + totalExp: 20, + currentExp: 5, + }, + }, + { + id: 39, + nickname: '예솔', + profileImageUrl: 'https://loremflickr.com40/480?lock=5535552531070976', + email: 'testt18@a.c', + tierInfo: { + tier: '진골 III', + totalExp: 20, + currentExp: 4, + }, + }, + { + id: 38, + nickname: '혁주', + profileImageUrl: 'https://loremflickr.com40/480?lock=1474097934499840', + email: 'testt17@a.c', + tierInfo: { + tier: '양반 II', + totalExp: 20, + currentExp: 4, + }, + }, + { + id: 17, + nickname: '영후', + profileImageUrl: null, + email: 'test14@a.c', + tierInfo: { + tier: '양반 III', + totalExp: 20, + currentExp: 8, + }, + }, + { + id: 31, + nickname: '성빈', + profileImageUrl: 'https://loremflickr.com40/480?lock=5094699765334016', + email: 'testt10@a.c', + tierInfo: { + tier: '진골 IV', + totalExp: 20, + currentExp: 17, + }, + }, + { + id: 21, + nickname: '기태', + profileImageUrl: 'https://picsum.photos/se/U2uEiDz/640/480', + email: 'testt0@a.c', + tierInfo: { + tier: '상민 IV', + totalExp: 20, + currentExp: 17, + }, + }, + { + id: 10, + nickname: '준범', + profileImageUrl: null, + email: 'test7@a.c', + tierInfo: { + tier: '평민 III', + totalExp: 20, + currentExp: 12, + }, + }, + { + id: 3, + nickname: '이원', + profileImageUrl: null, + email: 'test0@a.c', + tierInfo: { + tier: '평민 IV', + totalExp: 20, + currentExp: 9, + }, + }, + { + id: 7, + nickname: '태윤', + profileImageUrl: null, + email: 'test4@a.c', + tierInfo: { + tier: '상민 IV', + totalExp: 20, + currentExp: 7, + }, + }, + { + id: 8, + nickname: '예승', + profileImageUrl: null, + email: 'test5@a.c', + tierInfo: { + tier: '노비 IV', + totalExp: 20, + currentExp: 3, + }, + }, + ], + }, + message: null, + errorCode: null, +}; + +export default UserDummy; diff --git a/src/constants/TierSchema.js b/src/constants/TierSchema.js new file mode 100644 index 0000000..8c784bf --- /dev/null +++ b/src/constants/TierSchema.js @@ -0,0 +1,166 @@ +export const tierGroups = [ + { + group: '노비', + color: 'var(--color-class-01)', + // exp gap : 50 + tiers: [ + { + tier: '노비 I', + totalExp: 50, + }, + { + tier: '노비 II', + totalExp: 100, + }, + { + tier: '노비 III', + totalExp: 150, + }, + { + tier: '노비 IV', + totalExp: 200, + }, + ], + }, + { + group: '상민', + color: 'var(--color-class-02)', + // exp gap : 100 + tiers: [ + { + tier: '상민 I', + totalExp: 250, + }, + { + tier: '상민 II', + totalExp: 350, + }, + { + tier: '상민 III', + totalExp: 450, + }, + { + tier: '상민 IV', + totalExp: 550, + }, + ], + }, + { + group: '평민', + color: 'var(--color-class-03)', + // exp gap : 150 + tiers: [ + { + tier: '평민 I', + totalExp: 700, + }, + { + tier: '평민 II', + totalExp: 850, + }, + { + tier: '평민 III', + totalExp: 1000, + }, + { + tier: '평민 IV', + totalExp: 1150, + }, + ], + }, + { + group: '양반', + color: 'var(--color-class-04)', + // exp gap : 200 + tiers: [ + { + tier: '양반 I', + totalExp: 1350, + }, + { + tier: '양반 II', + totalExp: 1550, + }, + { + tier: '양반 III', + totalExp: 1750, + }, + { + tier: '양반 IV', + totalExp: 1950, + }, + ], + }, + { + group: '진골', + color: 'var(--color-class-05)', + // exp gap : 250 + tiers: [ + { + tier: '진골 I', + totalExp: 2200, + }, + { + tier: '진골 II', + totalExp: 2450, + }, + { + tier: '진골 III', + totalExp: 2700, + }, + { + tier: '진골 IV', + totalExp: 2950, + }, + ], + }, + { + group: '성골', + color: 'var(--color-class-06)', + // exp gap : 300 + tiers: [ + { + tier: '성골 I', + totalExp: 3250, + }, + { + tier: '성골 II', + totalExp: 3550, + }, + { + tier: '성골 III', + totalExp: 3850, + }, + { + tier: '성골 IV', + totalExp: 4150, + }, + ], + }, + { + group: '에코', + color: 'var(--color-class-07)', + // exp gap : 350 + tiers: [ + { + tier: '에코', + totalExp: 4500, + }, + ], + }, +]; + +export function getTierDetails(tierName) { + for (const group of tierGroups) { + for (const tier of group.tiers) { + if (tier.tier === tierName) { + return { + color: group.color, + tier: tier.tier, + totalExp: tier.totalExp, + }; + } + } + } + return null; +} diff --git a/src/constants/URI.js b/src/constants/URI.js new file mode 100644 index 0000000..d2bce23 --- /dev/null +++ b/src/constants/URI.js @@ -0,0 +1,6 @@ +export const BASE_URI = import.meta.env.VITE_APP_BASE_URL; + +export const REST_API_KEY = import.meta.env.VITE_APP_KAKAO_API_KEY; +export const REDIRECT_URI = import.meta.env.VITE_APP_REDIRECT_URI; + +export const KAKAO_AUTH_URL = `https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}`; diff --git a/src/hooks/useBottomSheet.jsx b/src/hooks/useBottomSheet.jsx new file mode 100644 index 0000000..271eb2f --- /dev/null +++ b/src/hooks/useBottomSheet.jsx @@ -0,0 +1,19 @@ +import { useAnimation } from "framer-motion"; +import { useEffect, useState } from "react"; + + +const useBottomSheet = (isClick) => { + const controls = useAnimation(); + + useEffect(() => { + if (!isClick) { + controls.start("hidden"); + } else if (isClick) { + controls.start("visible"); + } + }, [controls, isClick]); + + return { controls }; +}; + +export default useBottomSheet; diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..57282ff --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,5 @@ +import ReactDOM from 'react-dom/client'; + +import App from './App'; + +ReactDOM.createRoot(document.getElementById('root')).render(); diff --git a/src/pages/dashboard/Dashboard.jsx b/src/pages/dashboard/Dashboard.jsx new file mode 100644 index 0000000..0ada107 --- /dev/null +++ b/src/pages/dashboard/Dashboard.jsx @@ -0,0 +1,21 @@ +import Strick from '../main/components/Strick'; +import { TeerCurrent, TeerTotal } from '../main/components/styles'; +import Record from './components/Record'; +import UserInfo from './components/UserInfo'; +import * as Styles from './styles'; +import Header from '@/components/header/Header'; + +const Dashboard = () => { + return ( + <> +
+ + + + + + + ); +}; + +export default Dashboard; diff --git a/src/pages/dashboard/components/Record.jsx b/src/pages/dashboard/components/Record.jsx new file mode 100644 index 0000000..f04cf4f --- /dev/null +++ b/src/pages/dashboard/components/Record.jsx @@ -0,0 +1,25 @@ +import { useNavigate } from 'react-router-dom'; + +import { TitleText } from '../../main/components/styles'; +import * as Styles from './Styles'; + +const Record = () => { + const navigate = useNavigate(); + const handlerPage = () => { + navigate('/challenge/record-list'); + }; + return ( + <> + + 내기록 + + + + 완료한 챌린지 목록 + + + + ); +}; + +export default Record; diff --git a/src/pages/dashboard/components/Styles.js b/src/pages/dashboard/components/Styles.js new file mode 100644 index 0000000..3f83297 --- /dev/null +++ b/src/pages/dashboard/components/Styles.js @@ -0,0 +1,127 @@ +import styled from '@emotion/styled'; + +export const DashBoardContainer = styled.div` + /* width: 24.375rem; */ + height: 14.625rem; + flex-shrink: 0; + + border-radius: 0rem 0rem 0.625rem 0.625rem; + background: var(--green--06, #f0f4f3); +`; + +export const LeaveContainer = styled.div` + display: flex; + justify-content: flex-end; /* Align items to the right */ + align-items: center; + + /* width: 100%; Make container take the full width */ + padding-right: 1rem; + /* optional: Add padding to right side; */ +`; + +export const LeaveBtn = styled.div` + display: inline-flex; + padding: 0.1875rem 0.5625rem 0.1875rem 0.5rem; + justify-content: center; + align-items: center; + + border-radius: 0.5rem; + background: var(--green--03, #5498c7); + box-shadow: 1px 2px 4px 0px rgba(0, 0, 0, 0.25); + + color: #fff; + font-family: 'Noto Sans'; + font-size: 1rem; + font-style: normal; + font-weight: 700; + line-height: normal; +`; + +export const ProfileContainer = styled.div` + display: flex; + margin: 1rem 1rem; +`; + +export const ProfileImg = styled.img` + width: 5.625rem; + height: 5.625rem; +`; + +export const ProfileInfoContainer = styled.div` + display: flex; + flex-direction: row; + margin-left: 1rem; + /* margin-top: 1rem; */ + height: 3rem; + width: 100%; + border-bottom: 1px solid #dadada; + gap: 1rem; +`; + +export const ProfileInfoText = styled.div` + color: #000; + font-family: 'Noto Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: normal; +`; + +export const Bar = styled.hr` + width: 80%; + margin-top: 4rem; +`; + +export const editBtnContainer = styled.div` + display: flex; + padding: 0.1875rem 0.5625rem 0.1875rem 0.5rem; + justify-content: center; + align-items: center; + height: 1.5rem; + border-radius: 0.5rem; + background: var(--green--05, #457a82); + box-shadow: 1px 2px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const EditBtn = styled.div` + color: #fff; + font-family: 'Noto Sans'; + font-size: 1rem; + font-style: normal; + font-weight: 700; + line-height: normal; +`; + +export const TeerText = styled.div` + display: flex; + justify-content: space-between; + width: 5rem; + + margin: 0.5rem 1rem; +`; + +export const TeerTextItem = styled.div` + color: ${(props) => props.color || 'var(--color-class-02)'}; + font-family: 'Noto Sans'; + font-weight: ${(props) => props.fw || '1rem'}; +`; + +export const FinishChallengeBtn = styled.div` + display: flex; + padding: 0.75rem 5.9375rem 0.5625rem 5.875rem; + justify-content: center; + border-radius: 1.25rem; + margin: 1rem 1rem 2rem 1rem; + cursor: pointer; + background: var(--green--01, #5cc6ba); + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const FinishChallengeText = styled.div` + color: #fff; + font-family: 'Noto Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: normal; +`; diff --git a/src/pages/dashboard/components/UserInfo.jsx b/src/pages/dashboard/components/UserInfo.jsx new file mode 100644 index 0000000..31e904b --- /dev/null +++ b/src/pages/dashboard/components/UserInfo.jsx @@ -0,0 +1,64 @@ +import { useState } from 'react'; + +import { TeerCurrent, TeerTotal } from '../../main/components/styles'; +import * as Styles from './Styles'; +import ProfileImg from '@/assets/main/ZZAN-Profile.png'; +import UpdateNicknameModal from '@/components/modal/UpdateNicknameModal'; +import { getTierDetails } from '@/constants/TierSchema'; +import { useUserInfoStore } from '@/store/useUserInfoStore'; + +const UserInfo = () => { + const { userNickname, userTier, userCurrentExp } = useUserInfoStore(); + const tierDetails = userTier + ? getTierDetails(userTier) + : { color: 'var(--color-class-02)' }; + + const [isModalOpen, setIsModalOpen] = useState(false); + + const handleOpenModal = () => { + setIsModalOpen(true); + }; + + const handleCloseModal = () => { + setIsModalOpen(false); + }; + + return ( + <> + + + 회원탈퇴 + + + + + {userNickname} + + + 수정하기 + + + + + + + {userTier} + + + {userCurrentExp} + + + + + + + + + ); +}; + +export default UserInfo; diff --git a/src/pages/dashboard/styles.js b/src/pages/dashboard/styles.js new file mode 100644 index 0000000..9dc62ca --- /dev/null +++ b/src/pages/dashboard/styles.js @@ -0,0 +1,6 @@ +import styled from '@emotion/styled'; + +export const DashBoardLayout = styled.div` + /* width: 24.375rem; */ + height: 52.625rem; +`; diff --git a/src/pages/detail-challenge/ChallengeDetailPage.jsx b/src/pages/detail-challenge/ChallengeDetailPage.jsx new file mode 100644 index 0000000..1a73f6b --- /dev/null +++ b/src/pages/detail-challenge/ChallengeDetailPage.jsx @@ -0,0 +1,60 @@ +import { useState, useEffect } from 'react'; + +import { Tabs, Tab, TabPanel } from '../../components/tab/slide-Tab'; +import TopBar from '../../components/top-bar/top-Bar'; +import Description from './description/Description'; +import Ranking from './ranking/Ranking'; +import { getChallengeDetail } from '../../apis/detail-challenge/detail.challenge.api'; + +import { + TabsContainer, + TabPanelContainer, + Image, + ImageMask, + Wrapper, +} from './styles'; +import DefaultImage from '@/assets/Default-Image.svg'; + +const ChallengeDetailPage = () => { + const [activeTab, setActiveTab] = useState(0); + const [data, setData] = useState(0); + + const handleChange = (e, value) => { + setActiveTab(value); + }; + + + useEffect(() => { + getChallengeDetail(1).then((res) => { + setData(res); + console.log(res); + + })}, []); + + + return ( + + + + {data ? :
} + +
+ + + + + + + + + {data ? :
} +
+ + + +
+
+ ); +}; + +export default ChallengeDetailPage; diff --git a/src/pages/detail-challenge/components/difficulty/Difficulty.jsx b/src/pages/detail-challenge/components/difficulty/Difficulty.jsx new file mode 100644 index 0000000..2d6b35b --- /dev/null +++ b/src/pages/detail-challenge/components/difficulty/Difficulty.jsx @@ -0,0 +1,62 @@ +import * as Styles from './styles'; +import { joinChallenge } from '../../../../apis/detail-challenge/detail.challenge.api'; +import { useState, useEffect } from 'react'; +import { useNavigate } from "react-router-dom"; + + +const Difficulty = ({props, max}) => { + const [data, setData] = useState(0); + const navigate = useNavigate(); + + const saveHandler = () =>{ + joinChallenge(4).then((res) => { + setData(res); + alert("성공적으로 참여했습니다."); + navigate("/"); + }).catch(()=>{ + alert("이미 참여한 챌린지입니다."); + navigate("/"); + }); + }; + + + return ( + + + + 난이도 + 최대 난이도 + + + + + {props.difficulty} + + + + {max} + + + + + 1{props.dayType} / {props.participantCount}번 참여하기 + + + + 참여 경험치 + {props.onceExp} 포인트 + + + + 완료 경험치 + {props.successExp} 포인트 + + + + 참여하기 + + ); + } + + +export default Difficulty; \ No newline at end of file diff --git a/src/pages/detail-challenge/components/difficulty/styles.js b/src/pages/detail-challenge/components/difficulty/styles.js new file mode 100644 index 0000000..f1f31e9 --- /dev/null +++ b/src/pages/detail-challenge/components/difficulty/styles.js @@ -0,0 +1,85 @@ +import styled from '@emotion/styled'; + +export const Outer = styled.div` + border-radius: 20px; + border: var(--color-grey-02) 1px solid; + padding: 10px; + width: 230px; + flex-shrink: 0; + margin-bottom: 50px; +` + +export const Wrapper = styled.div` + display: flex; + flex-direction: column; + padding-bottom: 10px; +` + +export const RowWrapper = styled.div` + display: flex; + flex-direction: row; + align-items: center; + gap: 10px; +` + +export const SubText = styled.div` + font-size: var(--font-size-sm); + color: var(--color-grey-02); + flex-shrink: 0; +` + +export const Text = styled.div` + font-size: var(--font-size-md); +` + +export const Bar = styled.div` + border-radius: 10px; + height: 10px; + background: linear-gradient(90deg, #457A82, #5CC6BA); + width: 80px; + flex-shrink: 0; +` + +export const MaxBar = styled.div` + border-radius: 10px; + height: 10px; + background: var(--color-grey-02); + width: 115px; +` + +export const BoldText = styled.div` + font-size: var(--font-size-md); + font-weight: bold; + flex-shrink: 0; +` + +export const ExpContent = styled.div` + font-size: var(--font-size-sm); + background-size: contain; + text-align: center; + color: var(--color-green-01); + padding: 3px; + border-radius: 20px; + border: var(--color-green-01) 1px solid; + flex-shrink: 0; + min-width: 80px; + height: 18px; +` + +export const Btn = styled.button` + border-radius: 20px; + background-color: var(--color-green-01); + color: var(--color-white); + font-weight: bold; + width: 100%; + height: 45px; + border: none; +` + +export const Margin = styled.div` + margin: 2px; +` + +export const BigMargin = styled.div` + margin: 20px; +` \ No newline at end of file diff --git a/src/pages/detail-challenge/components/userItem/UserItem.jsx b/src/pages/detail-challenge/components/userItem/UserItem.jsx new file mode 100644 index 0000000..5835f4b --- /dev/null +++ b/src/pages/detail-challenge/components/userItem/UserItem.jsx @@ -0,0 +1,24 @@ +import * as Styles from './styles'; +import DefaultImage from '../../../../assets/UserImage.svg'; + +const UserItem = ({props}) => { + return ( + <> + + + {props.ranking}위 + + + {props.user.nickname} + {props.user.tierInfo.tier} + + + + {props.acquiredPoint}포인트 + + + + ); + } + + +export default UserItem; \ No newline at end of file diff --git a/src/pages/detail-challenge/components/userItem/styles.js b/src/pages/detail-challenge/components/userItem/styles.js new file mode 100644 index 0000000..862d7a0 --- /dev/null +++ b/src/pages/detail-challenge/components/userItem/styles.js @@ -0,0 +1,65 @@ +import styled from '@emotion/styled'; + +export const Wrapper = styled.div` + display: flex; + justify-content: space-between; + flex-direction: row; + align-items: center; +`; + +export const Content = styled.div` + display: flex; + justify-content: space-between; + flex-direction: row; + align-items: center; + gap: 10px; +`; + + +export const Rank = styled.div` + font-size: var(--font-size-md); + font-weight: bold; +`; + +export const UserWrapper = styled.div` + display: flex; + flex-direction: column; +`; + +export const Text = styled.div` + font-size: var(--font-size-md); + font-weight: bold; +`; + +export const BoldText = styled.div` + font-size: var(--font-size-sm); + font-weight: bold; +` + +export const SubText = styled.div` + font-size: var(--font-size-sm); + color: var(--color-grey-01); +` + +export const Point = styled.div` + font-size: var(--font-size-md); + color: var(--color-green-05); +` + +export const Line = styled.div` + border-top: 1px solid var(--color-green-06); + margin: 10px 0px; +` + +export const ImageBox = styled.div` + height: 40px; + width: 40px; + border-radius: 70%; + overflow: hidden; +` + +export const Image = styled.img` + height: 100%; + width: 100%; + object-fit: cover; +`; \ No newline at end of file diff --git a/src/pages/detail-challenge/description/Description.jsx b/src/pages/detail-challenge/description/Description.jsx new file mode 100644 index 0000000..1bed9d6 --- /dev/null +++ b/src/pages/detail-challenge/description/Description.jsx @@ -0,0 +1,38 @@ +import * as Styles from './styles'; +import Difficulty from '../components/difficulty/Difficulty'; + +const Description = ({data}) => { + const challenges = data.challenges; + + return ( + + {data.category} + {data.title} + {data.content} +
+ + 시작일 + {data.startDate} + + + 종료일 + {data.endDate} + + + 참여방법 + {data.guide} + +
+ {challenges.map((item) =>( + + ))} +
+ + + + + ); +} + + +export default Description; diff --git a/src/pages/detail-challenge/description/styles.js b/src/pages/detail-challenge/description/styles.js new file mode 100644 index 0000000..d3bde3c --- /dev/null +++ b/src/pages/detail-challenge/description/styles.js @@ -0,0 +1,64 @@ +import styled from '@emotion/styled'; + +export const Wrapper = styled.div` + display: flex; + flex-direction: column; + text-align: left; +`; + +export const Category = styled.div` + margin: 30px; + margin-bottom: 0px; + font-size: var(--font-size-xs); + color: var(--color-green-01); +`; + +export const Title = styled.div` + margin: 0 30px; + font-size: var(--font-size-xl); + font-weight: bold; + margin-bottom: 15px; +`; + +export const Text = styled.div` + font-size: var(--font-size-sm); + margin: 5px 0; + margin: 0 30px; +` + +export const BoldText = styled.div` + font-size: var(--font-size-sm); + font-weight: bold; + flex-shrink: 0; + margin: 5px 0; + margin: 0 30px; +` + +export const SubText = styled.div` + font-size: var(--font-size-sm); + color: var(--color-grey-01); + margin: 0 30px; +` + +export const Line = styled.div` + border-top: 1px solid var(--color-green-06); + margin: 20px; +` + +export const ContentWrapper = styled.div` + display: flex; + flex-direction: row; +` + +export const RowList = styled.div` + display: flex; + flex-direction: row; + overflow-x: auto; + scrollbar-color: transparent transparent; + &::-webkit-scrollbar { + background-color: transparent; + display: none; + }; + gap: 20px; + margin: 30px 0; +` \ No newline at end of file diff --git a/src/pages/detail-challenge/ranking/Ranking.jsx b/src/pages/detail-challenge/ranking/Ranking.jsx new file mode 100644 index 0000000..886311d --- /dev/null +++ b/src/pages/detail-challenge/ranking/Ranking.jsx @@ -0,0 +1,40 @@ +import { useState, useEffect } from 'react'; +import UserItem from '../components/userItem/UserItem'; +import * as Styles from './styles'; +import { useInView } from 'react-intersection-observer'; +import { getChallengeRanking } from '../../../apis/detail-challenge/ranking.challenge.api.js'; + +const Ranking = ({title, category}) => { + const [users, setUsers] = useState([]); + const [page, setPage] = useState(1); + const [ref, inView] = useInView({threshold: 0.8,}); + +useEffect(() => { + if(inView){ + getChallengeRanking(1,page).then((response) => { + setUsers([...users, ...(response.data)]); + setPage((page) => page + 1); + }); + } + }, [inView]); + + + + return ( + <> + + {category} + {title} + + + {users.map((item) => ( + + ))} +
+
로딩..
+
+ + ); +}; + +export default Ranking; diff --git a/src/pages/detail-challenge/ranking/styles.js b/src/pages/detail-challenge/ranking/styles.js new file mode 100644 index 0000000..6f6b242 --- /dev/null +++ b/src/pages/detail-challenge/ranking/styles.js @@ -0,0 +1,31 @@ +import styled from '@emotion/styled'; + +export const Wrapper = styled.div` + margin: 30px; + display: flex; + flex-direction: column; + text-align: left; +`; + +export const Category = styled.div` + font-size: var(--font-size-xs); + color: var(--color-green-01); +`; + +export const Title = styled.div` + font-size: var(--font-size-xl); + font-weight: bold; + margin-bottom: 15px; +`; + +export const Text = styled.div` + font-size: var(--font-size-sm); +` + +export const RankingWrapper = styled.div` + margin: 30px; + margin-top: 0px; + margin-bottom: 55px; + display: flex; + flex-direction: column; +`; diff --git a/src/pages/detail-challenge/styles.js b/src/pages/detail-challenge/styles.js new file mode 100644 index 0000000..c9981da --- /dev/null +++ b/src/pages/detail-challenge/styles.js @@ -0,0 +1,43 @@ +import styled from '@emotion/styled'; + +// 챌린지 상세 페이지 css + +export const TabsContainer = styled.div` + display: flex; + position: relative; + top: 50px; + align-self: center; + width: 90%; + margin: 0 auto; + height: 55px; + border-radius: 20px; + background-color: var(--color-green-06); +`; + +export const TabPanelContainer = styled.div` + height: 100%; + width: 100%; + position: relative; + top: 50px; + text-align: center; +`; + +export const Image = styled.img` + position: relative; + margin: auto; + display: block; + height: 40%; + opacity: 20%; + object-fit: cover; + margin-bottom: 28px; + filter: grayscale(100%); +`; + +export const ImageMask = styled.div` + background-color: var(--color-green-06); + position: relative; + top: 50px +`; + + +export const Wrapper = styled.div``; diff --git a/src/pages/list-challenge/components/CategoryButton.jsx b/src/pages/list-challenge/components/CategoryButton.jsx new file mode 100644 index 0000000..1f71dc9 --- /dev/null +++ b/src/pages/list-challenge/components/CategoryButton.jsx @@ -0,0 +1,63 @@ +import { useState } from 'react'; + +import { Tab, Tabs } from '../../../components/tab/slide-Tab'; +import { Text } from '../../rank/styles'; +import { TabsContainer } from '../../record-challenge/styles'; +import * as Styles from '../styles'; + +const CategoryButton = ({ onCategoryChange }) => { + const [activeTab, setActiveTab] = useState(0); + + const handleChange = (e, value) => { + setActiveTab(value); + }; + + return ( + // + // onCategoryChange('ECHO')}> + // 에코 + // + // onCategoryChange('SHARE')}> + // 나눔 + // + // onCategoryChange('VOLUNTEER')}> + // 봉사 + // + // onCategoryChange('HEALTH')}> + // 건강 + // + // + <> + + + onCategoryChange('ECHO')} + > + onCategoryChange('SHARE')} + > + onCategoryChange('VOLUNTEER')} + > + onCategoryChange('HEALTH')} + > + + + + ); +}; + +export default CategoryButton; diff --git a/src/pages/list-challenge/components/Contents.jsx b/src/pages/list-challenge/components/Contents.jsx new file mode 100644 index 0000000..9795e2e --- /dev/null +++ b/src/pages/list-challenge/components/Contents.jsx @@ -0,0 +1,25 @@ +import React from 'react'; + +import { Text } from '../../rank/styles'; +import * as Styles from '../styles'; + +const Contents = ({ challenge }) => { + const { title, content, participantCount, startDate, endDate } = challenge; + + return ( + + + + {title} + + {content} + 누적 참여자수 {participantCount}명 + + {startDate} ~ {endDate} + + + + ); +}; + +export default Contents; diff --git a/src/pages/list-challenge/components/styles.js b/src/pages/list-challenge/components/styles.js new file mode 100644 index 0000000..e3625c7 --- /dev/null +++ b/src/pages/list-challenge/components/styles.js @@ -0,0 +1,25 @@ +import styled from '@emotion/styled'; + +// 챌린지 기록 페이지 css + +export const TabsContainer = styled.div` + display: flex; + position: relative; + top: 50px; + align-self: center; + width: 90%; + margin: 0 auto; + height: 55px; + border-radius: 20px; + background-color: var(--color-green-06); +`; + +export const TabPanelContainer = styled.div` + height: 100%; + width: 100%; + position: relative; + top: 50px; + text-align: center; +`; + +export const Wrapper = styled.div``; diff --git a/src/pages/list-challenge/list-challenge.jsx b/src/pages/list-challenge/list-challenge.jsx new file mode 100644 index 0000000..9e86918 --- /dev/null +++ b/src/pages/list-challenge/list-challenge.jsx @@ -0,0 +1,49 @@ +import React, { useEffect, useState } from 'react'; + +import { getChallengeList } from '../../apis/list-challenge/list.challenge.api'; +import { Text } from '../rank/styles'; +import CategoryButton from './components/CategoryButton'; +import Contents from './components/Contents'; +import * as Styles from './styles'; +import Header from '@/components/header/Header'; + +const ChallengeList = () => { + const [listChallenges, setListChallenges] = useState([]); + const [category, setCategory] = useState('ECHO'); + + useEffect(() => { + const fetchChallenges = async () => { + try { + const challenges = await getChallengeList(0, 10, category); + setListChallenges(challenges.data.data); + console.log(listChallenges); + } catch (error) { + console.error('Error fetching challenges:', error); + } + }; + + fetchChallenges(); + }, [category]); + + const handleCategoryChange = (newCategory) => { + setCategory(newCategory); + }; + + return ( + <> +
+ + + {listChallenges.length > 0 ? ( + listChallenges.map((challenge) => ( + + )) + ) : ( + 챌린지를 불러올 수 없습니다. // Display a message if no listChallenges are available + )} + + + ); +}; + +export default ChallengeList; diff --git a/src/pages/list-challenge/styles.js b/src/pages/list-challenge/styles.js new file mode 100644 index 0000000..be640a0 --- /dev/null +++ b/src/pages/list-challenge/styles.js @@ -0,0 +1,53 @@ +import styled from '@emotion/styled'; + +export const ChallengeListLayout = styled.div` + display: flex; + flex-direction: column; + margin: 0 1rem; +`; + +export const ButtonContainer = styled.div` + width: 100%; + height: 2.5rem; + flex-shrink: 0; + border-radius: 1.25rem; + margin: 1rem 0; + text-align: center; + display: flex; + justify-content: space-around; + align-items: center; + background: var(--green--06, #f0f4f3); +`; + +export const ButtonChoose = styled.div` + display: flex; + /* width: 5rem; */ + padding: 0.25rem 2rem; + justify-content: center; + align-items: center; + border-radius: 1.25rem; + background: var(--green--01, #5cc6ba); +`; + +export const ChallengeListContainer = styled.div` + /* width: 21.1875rem; */ + margin: 1rem 0; + height: 13.6875rem; + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: space-between; + border-radius: 1.25rem; + /* background: var(--green--06, #f0f4f3); */ + background: #fff; + border: 1px solid var(--color-green-03); + /* box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); */ +`; + +export const ChallengeListContents = styled.div` + display: flex; + flex-direction: column; + padding: 1rem; + gap: 1rem; + justify-content: space-between; +`; diff --git a/src/pages/list-record-challenge/ListRecordChallenge.jsx b/src/pages/list-record-challenge/ListRecordChallenge.jsx new file mode 100644 index 0000000..345d6c2 --- /dev/null +++ b/src/pages/list-record-challenge/ListRecordChallenge.jsx @@ -0,0 +1,24 @@ +import ListItem from './components/ListItem'; +import * as Styles from './styles'; +import Header from '@/components/header/Header'; + +function ListRecordChallenge() { + return ( + <> +
+ + + + + + + + + + + + + ); +} + +export default ListRecordChallenge; diff --git a/src/pages/list-record-challenge/components/ListItem.jsx b/src/pages/list-record-challenge/components/ListItem.jsx new file mode 100644 index 0000000..1eededd --- /dev/null +++ b/src/pages/list-record-challenge/components/ListItem.jsx @@ -0,0 +1,22 @@ +import * as Styles from './Styles'; +import ProfileImg from '@/assets/challenge/ZZAN-Green.png'; + +const ListItem = () => { + return ( + <> + + + + + + 쓰레기 줍기 챌린지 + + + 2024.06.02 + + + + ); +}; + +export default ListItem; diff --git a/src/pages/list-record-challenge/components/Styles.js b/src/pages/list-record-challenge/components/Styles.js new file mode 100644 index 0000000..f671842 --- /dev/null +++ b/src/pages/list-record-challenge/components/Styles.js @@ -0,0 +1,44 @@ +import styled from '@emotion/styled'; + +export const listItemLayout = styled.div` + /* width: 20.6875rem; */ + /* width: 20.6875rem; */ + /* height: 3.75rem; */ + display: flex; + flex-direction: row; + width: 100%; + gap: 20px; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid #e0e0e0; + margin: 0 1rem; +`; + +export const ProfileContainer = styled.div` + display: flex; + border-radius: 50%; + border: 1px solid #5cc6ba; + border-style: solid; + stroke-width: 1px; + stroke: var(--green--01, #5cc6ba); + filter: drop-shadow(2px 3px 5px rgba(80, 153, 145, 0.5)); + padding: 0.5rem; + margin-bottom: 0.25rem; + /* align-items: center; + margin: 0.5rem 0; + width: 100%; */ +`; + +export const ProfileImage = styled.img` + width: 1.5rem; +`; + +export const Text = styled.p` + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + /* max-width: 150px; */ + max-width: ${(props) => props.max}; + font-size: ${(props) => props.fs}; + font-weight: ${(props) => props.fw}; +`; diff --git a/src/pages/list-record-challenge/styles.js b/src/pages/list-record-challenge/styles.js new file mode 100644 index 0000000..4828a77 --- /dev/null +++ b/src/pages/list-record-challenge/styles.js @@ -0,0 +1,20 @@ +import styled from '@emotion/styled'; + +export const ChallengeListLayout = styled.div` + display: flex; + flex-direction: column; + height: 100vh; + background: var(--green--06, #f0f4f3); +`; + +export const ChallengeListContainer = styled.div` + display: inline-flex; + /* height: 46.8125rem; */ + margin: 1rem 1rem; + padding: 0.625rem 1.5rem; + flex-direction: column; + align-items: center; + + border-radius: 1.25rem; + background: #fff; +`; diff --git a/src/pages/login/LoginPage.jsx b/src/pages/login/LoginPage.jsx new file mode 100644 index 0000000..d3b5b3a --- /dev/null +++ b/src/pages/login/LoginPage.jsx @@ -0,0 +1,22 @@ +import { KAKAO_AUTH_URL } from '../../constants/URI'; +import * as Styles from './style'; +import Logo from '@/assets/login/kakao.svg'; + +const LoginPage = () => { + const HandlerKakaoLogin = () => { + window.location.href = KAKAO_AUTH_URL; + }; + + return ( + <> + + + + 카카오 로그인 + + + + ); +}; + +export default LoginPage; diff --git a/src/pages/login/RedirectPage.jsx b/src/pages/login/RedirectPage.jsx new file mode 100644 index 0000000..78d9cd0 --- /dev/null +++ b/src/pages/login/RedirectPage.jsx @@ -0,0 +1,17 @@ +import React from 'react'; + +import { AuthAPI } from '../../apis/auth/auth.api'; +import { BASE_URI } from '../../constants/URI'; + +const RedirectPage = () => { + const code = new URLSearchParams(window.location.search).get('code'); + const provider = 'KAKAO'; + const state = 'string'; + + console.log(`${BASE_URI}/oauth2?code=${code}`); + AuthAPI(code, provider, state); + + return
로그인 성공
; +}; + +export default RedirectPage; diff --git a/src/pages/login/style.js b/src/pages/login/style.js new file mode 100644 index 0000000..5f938ef --- /dev/null +++ b/src/pages/login/style.js @@ -0,0 +1,34 @@ +import styled from '@emotion/styled'; + +export const LoginContainer = styled.div``; + +export const ButtonSection = styled.div` + display: flex; + + text-align: center; + margin-top: 2rem; + justify-content: center; +`; +export const KaKaoLoginButton = styled.div` + display: flex; + text-align: center; + background-color: #fee500; + width: 15rem; + height: 2.5rem; + border-radius: 0.5rem; + align-items: center; +`; + +export const KaKaoLoginLogo = styled.img` + width: 1.5rem; + text-align: center; + + margin-right: 2rem; + margin-left: 1rem; +`; + +export const LoginText = styled.div` + display: flex; + text-align: center; + margin-left: 1rem; +`; diff --git a/src/pages/main/MainPage.jsx b/src/pages/main/MainPage.jsx new file mode 100644 index 0000000..9f3a535 --- /dev/null +++ b/src/pages/main/MainPage.jsx @@ -0,0 +1,20 @@ +import Category from './components/Category'; +import MainTitle from './components/MainTitle'; +import Review from './components/Review'; +import Strick from './components/Strick'; +import Teer from './components/Teer'; +import { MainPageLayout } from './style'; + +const MainPage = () => { + return ( + + + + + + + + ); +}; + +export default MainPage; diff --git a/src/pages/main/components/Category.jsx b/src/pages/main/components/Category.jsx new file mode 100644 index 0000000..df25e93 --- /dev/null +++ b/src/pages/main/components/Category.jsx @@ -0,0 +1,43 @@ +import * as Styles from './styles'; +import EcoIcon from '@/assets/main/Eco-Logo.svg'; +import HealthIcon from '@/assets/main/Heart-Logo.svg'; +import ShearIcon from '@/assets/main/Nanum-Logo.svg'; +import VolunteerIcon from '@/assets/main/Volunteer-Logo.svg'; + +const Category = () => { + return ( + <> + + 챌린지 카테고리 + + + + + + + 에코 + + + + + + 나눔 + + + + + + 봉사 + + + + + + 건강 + + + + ); +}; + +export default Category; diff --git a/src/pages/main/components/MainTitle.jsx b/src/pages/main/components/MainTitle.jsx new file mode 100644 index 0000000..bff0c8a --- /dev/null +++ b/src/pages/main/components/MainTitle.jsx @@ -0,0 +1,26 @@ +import { useNavigate } from 'react-router-dom'; + +import * as Styles from './styles'; +import TitleLogo from '@/assets/main/ZZAN-Default.png'; + +const MainTitle = () => { + const navigate = useNavigate(); + const handlerNavigate = () => { + navigate('/'); + }; + + return ( + <> + + + + + + ZZANSUZI + + + + ); +}; + +export default MainTitle; diff --git a/src/pages/main/components/Review.jsx b/src/pages/main/components/Review.jsx new file mode 100644 index 0000000..fa84af0 --- /dev/null +++ b/src/pages/main/components/Review.jsx @@ -0,0 +1,54 @@ +import * as Styled from './styles'; +import StarIcon from '@/assets/main/Star-Icon.svg'; +import ProfileIcon from '@/assets/main/ZZAN-Profile.png'; +import styled from '@emotion/styled'; +import { Swiper, SwiperSlide } from 'swiper/react'; + +const Review = () => { + return ( + <> + + 최근 챌린지 리뷰 + + + + + 쓰레기 줍기 챌린지 + + + + + + + + + 짠돌이 + + + + 세상이 깨끗해지는 기분이에요! 포인트도 많이줘서 등급 올리기 ... + + + + + + ); +}; + +export default Review; + +const StyledSwiper = styled(Swiper)` + width: 100%; + height: fit-content; + padding: 16px; + background-color: #eee !important; + border-radius: 10px; + cursor: grabbing; + &::-webkit-scrollbar { + display: none; + } + .swiper-slide { + width: fit-content !important; + background-color: transparent !important; + } +`; diff --git a/src/pages/main/components/Strick-calendar.jsx b/src/pages/main/components/Strick-calendar.jsx new file mode 100644 index 0000000..1d841d4 --- /dev/null +++ b/src/pages/main/components/Strick-calendar.jsx @@ -0,0 +1,119 @@ +import * as Styles from './styles'; + +const StrickCalendar = () => { + return ( + <> + + + S + M + T + W + T + F + S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4월 + 5월 + 6월 + + + ); +}; + +export default StrickCalendar; diff --git a/src/pages/main/components/Strick.jsx b/src/pages/main/components/Strick.jsx new file mode 100644 index 0000000..0e8bf4b --- /dev/null +++ b/src/pages/main/components/Strick.jsx @@ -0,0 +1,31 @@ +import StrickCalendar from './Strick-calendar'; +import * as Styles from './styles'; +import DownArrow from '@/assets/main/Down-Arrow.svg'; + +const Strick = () => { + return ( + <> + + 스트릭 + + + + + 현재 + +  8  + + 일 + + + 6월 + + + + + + + ); +}; + +export default Strick; diff --git a/src/pages/main/components/Teer.jsx b/src/pages/main/components/Teer.jsx new file mode 100644 index 0000000..4322874 --- /dev/null +++ b/src/pages/main/components/Teer.jsx @@ -0,0 +1,90 @@ +import { useCallback, useEffect, useState } from 'react'; + +import { TierInfo } from '../../../components/userInfo/TierInfo'; +import * as Styles from './styles'; +import { getUserInfo } from '@/apis/user/user.api'; +import ProfileImg from '@/assets/main/ZZAN-Profile.png'; +import { getTierDetails } from '@/constants/TierSchema'; +import { useUserInfoStore } from '@/store/useUserInfoStore'; + +const Teer = () => { + const [userInfo, setUserInfo] = useState([]); + const { + setUserId, + setUserNickname, + setUserProfileImageUrl, + setUserEmail, + setUserTier, + setUserTotalExp, + setUserCurrentExp, + userNickname, + userTier, + userCurrentExp, + } = useUserInfoStore(); + + const fetchUserInfo = useCallback(async () => { + try { + const response = await getUserInfo(); + const data = response.data; + setUserInfo(data); + // Assuming setting store state is necessary here + setUserId(data.id); + setUserNickname(data.nickname); + setUserProfileImageUrl(data.profileImageUrl); + setUserEmail(data.email); + setUserTier(data.tierInfo.tier); + setUserTotalExp(data.tierInfo.totalExp); + setUserCurrentExp(data.tierInfo.currentExp); + } catch (error) { + console.error('fetchUserInfo error: ', error); + } + }, [ + setUserId, + setUserNickname, + setUserProfileImageUrl, + setUserEmail, + setUserTier, + setUserTotalExp, + setUserCurrentExp, + ]); + + useEffect(() => { + fetchUserInfo(); + }, [fetchUserInfo]); + + const tierDetails = userTier + ? getTierDetails(userTier) + : { color: 'var(--color-class-02)' }; + + console.log(userTier); + return ( + <> + + 내 티어 + + + + + + + + {userNickname} + + + {userTier} + + + {userCurrentExp} + + + + + + + + + + ); +}; + +export default Teer; diff --git a/src/pages/main/components/styles.js b/src/pages/main/components/styles.js new file mode 100644 index 0000000..3048974 --- /dev/null +++ b/src/pages/main/components/styles.js @@ -0,0 +1,342 @@ +import styled from '@emotion/styled'; + +export const TitleLayout = styled.div` + display: flex; + align-items: center; + text-align: center; + flex-direction: row; + margin: 1rem 0.5rem 1rem 0.5rem; + cursor: pointer; + gap: 1rem; +`; + +export const LogoContainer = styled.div` + border: 1.5px solid var(--color-green-01); + padding: 0.25rem; + border-radius: 50%; +`; + +export const TitleLogo = styled.img` + width: 2rem; + color: var(--color-green-01); +`; + +export const TitleText = styled.div` + /* font-size: var(--font-size-xxl); */ + font-size: ${(props) => props.fs || '1.25rem'}; + font-weight: bold; + margin-top: ${(props) => props.mgTP || '0'}; + margin-left: ${(props) => props.mgLF || '0'}; + margin-bottom: ${(props) => props.mgBT || '0'}; + color: ${(props) => props.color || '#000'}; +`; + +export const CategoryLayout = styled.div` + display: flex; + /* width: 23.8125rem; */ + padding: 0rem 0.625rem; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; +`; + +export const CategoryButtonContainer = styled.div` + display: flex; + padding: 0.3125rem; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 0.3125rem; +`; + +export const ButtonText = styled.div` + font-size: var(--font-size-xl); + font-weight: bold; + color: ${(props) => props.color || '#000'}; +`; + +export const CategoryButton = styled.div` + display: flex; + width: 4.375rem; + height: 4.375rem; + justify-content: center; + align-items: center; + gap: 0.625rem; + border-radius: 1.25rem; + border: 1px solid #d4d6dd; + background: #fff; + box-shadow: 0px 2px 2px 0px rgba(0, 0, 0, 0.25); +`; + +export const CategoryButtonImage = styled.img` + display: flex; + width: 2.5rem; + height: 2.5rem; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 0.625rem; + flex-shrink: 0; +`; + +export const TeerLayout = styled.div` + /* height: 9.3125rem; */ + height: ${(props) => props.height || '0'}; + + flex-shrink: 0; + margin: 1rem 1rem 3rem 1rem; + border-radius: 1.25rem; + border: 1px solid #d4d6dd; + background: #fff; + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const InfoContainer = styled.div` + display: inline-flex; + /* padding: 0.625rem; */ + padding: 1rem; + align-items: center; + gap: 0.625rem; +`; + +export const ImgContainer = styled.div` + display: flex; + width: 4.6875rem; + height: 4.6875rem; + flex-direction: column; + align-items: flex-start; + gap: 0.625rem; + + border-radius: 6.25rem; + background: #fff; + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; +export const ProfileImg = styled.img` + flex: 1 0 0; + align-self: stretch; +`; + +export const NameContainer = styled.div` + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + gap: 0.625rem; +`; + +export const TextContainer = styled.div` + display: flex; + gap: 0.5rem; +`; + +export const TextItem = styled.div` + color: ${(props) => props.color || 'var(--color-class-02)'}; + font-family: 'Noto Sans'; + font-size: 1rem; + font-style: normal; + font-weight: ${(props) => props.fw || '400'}; + line-height: normal; +`; + +export const TeerTotal = styled.div` + display: flex; + /* width: 21.125rem; */ + margin: 0 1rem; + /* width: 19rem; */ + height: 0.9375rem; + /* padding-right: 11.8125rem; */ + /* padding: 0 1rem; */ + /* margin: 0 5rem; */ + align-items: center; + flex-shrink: 0; + + border-radius: 0.3125rem; + background: #000; + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const TeerCurrent = styled.div` + width: 10.3125rem; + height: 0.9375rem; + flex-shrink: 0; + padding-left: 0.3125rem; + border-radius: 0.3125rem; + /* background: linear-gradient(90deg, #81633e 0%, #b28854 50%); */ + background: ${(props) => + `linear-gradient(45deg, #4e4e4e 0%, ${props.background} 50%)` || + 'linear-gradient(90deg, #81633e 0%, #b28854 50%)'}; +`; + +export const StrickLayout = styled.div` + height: 17.5rem; + flex-shrink: 0; + margin: 1rem; + border-radius: 1.25rem; + border: 1px solid #d4d6dd; + background: #fff; + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const StrickInfo = styled.div` + margin: 1rem 1rem; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + text-align: start; + gap: 0.625rem; +`; + +export const StrickText = styled.div` + /* font-size: var(--font-size-xxl); */ + font-size: ${(props) => props.fs || '1.25rem'}; + font-weight: ${(props) => props.fw || '1.25rem'}; + display: flex; +`; + +export const StrickMonthContainer = styled.div` + display: inline-flex; + padding: 0.3125rem 0.625rem; + justify-content: center; + align-items: center; + gap: 1.25rem; + border-radius: 0.4375rem; + border: 1px solid var(--green--01, #5cc6ba); + background: #fff; +`; + +export const StrickMonthImg = styled.img` + width: 0.78125rem; + height: 0.4375rem; + color: #000; +`; + +export const StrickCalendarLayout = styled.div` + display: inline-flex; + justify-content: center; + align-items: center; + gap: 0.7rem; + margin: 0 1rem; +`; + +export const CalendarMonth = styled.div` + display: flex; + flex-direction: column; + justify-content: space-between; + gap: 1px; +`; + +export const MonthText = styled.div` + color: #b3b3b3; + text-align: center; + font-family: 'Noto Sans'; + font-size: 0.9rem; + font-style: normal; + font-weight: 500; + line-height: normal; +`; + +export const CalenderInfo = styled.div` + display: flex; + width: 18rem; + justify-content: center; + align-items: center; + align-content: center; + gap: 0.125rem; + /* margin: 0 1rem; */ + flex-wrap: wrap; +`; + +export const CalenderItem = styled.div` + width: 1.25rem; + height: 1.25rem; + flex-shrink: 0; + border-radius: 0.3125rem; + /* background: #d9d9d9; */ + background: ${(props) => props.bgColor || '#d9d9d9'}; +`; + +export const MonthTextContainer = styled.div` + display: flex; + flex-direction: row; + width: 13rem; + margin: 1rem 4rem; + justify-content: space-between; +`; + +export const MonthTextItem = styled.div` + color: #b3b3b3; + text-align: center; + font-family: 'Noto Sans'; + font-size: 0.8125rem; + font-style: normal; + font-weight: 500; + line-height: normal; +`; + +export const ReviewLayout = styled.div` + display: flex; + height: 15.5625rem; + padding: 0.9375rem 4.8125rem 0.9375rem 0.8125rem; + align-items: center; + flex-shrink: 0; + margin: 1rem 1rem 1rem 1rem; + + border-radius: 1.25rem; + background: var(--green--06, rgba(240, 244, 243, 0.75)); + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const ChallengeLayout = styled.div` + width: 18rem; + height: 13.6875rem; + padding: 1rem; + border-radius: 1.25rem; + background: var(--green--01, #5cc6ba); + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const StarContainer = styled.div` + display: flex; + margin: 0.5rem; + gap: 0.2rem; +`; + +export const StarImg = styled.img` + display: flex; + width: 1.25rem; + height: 1.25rem; + justify-content: center; + align-items: center; + flex-shrink: 0; +`; + +export const ReviewProfileContainer = styled.div` + display: flex; + margin: 1rem 0.5rem; + flex-direction: row; + justify-content: space-between; + width: 5.5rem; + align-items: center; + gap: 0.25rem; +`; + +export const ReviewProfileImg = styled.img` + width: 2rem; + border-radius: 6.25rem; +`; + +export const ReviewText = styled.div` + color: #fff; + text-align: left; + font-family: 'Noto Sans'; + font-size: 1rem; + font-style: normal; + font-weight: ${(props) => props.fw || '400'}; + line-height: normal; +`; + +export const ReviewContents = styled.div` + width: 100%; + /* justify-content: left; */ +`; diff --git a/src/pages/main/style.js b/src/pages/main/style.js new file mode 100644 index 0000000..331c4d9 --- /dev/null +++ b/src/pages/main/style.js @@ -0,0 +1,7 @@ +import styled from '@emotion/styled'; + +export const MainPageLayout = styled.div` + display: flex; + justify-content: flex-start; + flex-direction: column; +`; diff --git a/src/pages/my-challenge/MyChallenge.jsx b/src/pages/my-challenge/MyChallenge.jsx new file mode 100644 index 0000000..bd1dbdd --- /dev/null +++ b/src/pages/my-challenge/MyChallenge.jsx @@ -0,0 +1,44 @@ +import { useState, useEffect } from 'react'; + +import { getCurrentChallengeList } from '../../apis/my-challenge/my.challenge.api'; +import { TitleText } from '../main/components/styles'; +import ChallengeList from './components/ChallengeList'; +import * as Styles from './styles'; +import Header from '@/components/header/Header'; + +const MyChallenge = () => { + const [listChallenges, setListChallenges] = useState([]); + + useEffect(() => { + const fetchCurrentChallenges = async () => { + try { + const challenges = await getCurrentChallengeList(0, 10); + setListChallenges(challenges.data.data); + console.log(challenges.data.data); + } catch (error) { + console.error('Error fetching challenges:', error); + } + }; + + fetchCurrentChallenges(); + }, []); + + return ( + <> +
+ + 참여중인 챌린지 + + + + + + ); +}; + +export default MyChallenge; diff --git a/src/pages/my-challenge/components/ChallengeList.jsx b/src/pages/my-challenge/components/ChallengeList.jsx new file mode 100644 index 0000000..2a13718 --- /dev/null +++ b/src/pages/my-challenge/components/ChallengeList.jsx @@ -0,0 +1,38 @@ +import React from 'react'; + +import * as Styles from './styles'; +import FinishStamp from '@/assets/challenge/ZZAN-Black.png'; + +const ChallengeList = ({ BackgroundColor, color, BorderColor, challenges }) => { + return ( + <> + + {challenges.map((challenge) => ( + + + + + + + {challenge.title} + + + + 리뷰 쓰기 + + + ))} + + + + + + + + ); +}; + +export default ChallengeList; diff --git a/src/pages/my-challenge/components/styles.js b/src/pages/my-challenge/components/styles.js new file mode 100644 index 0000000..490fe3d --- /dev/null +++ b/src/pages/my-challenge/components/styles.js @@ -0,0 +1,104 @@ +import styled from '@emotion/styled'; + +export const ChallengeListLayout = styled.div` + /* height: 8rem; */ + display: flex; + /* width: 85vh; */ + flex-direction: column; + justify-content: center; + align-items: center; + /* margin-bottom: 1.25rem; */ + + border-bottom: 1px solid #d4d6dd; + background: #fff; +`; +export const ChallengeContainer = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + /* height: 3rem; */ +`; +export const ChallengeImgContainer = styled.div` + border-radius: 100%; + border: 1px dashed #c0c0c0; + display: flex; + margin: 1rem 1rem 1.5rem; + justify-content: left; + text-align: center; + width: 1.5rem; + height: 1.5rem; + padding: 0.5rem; +`; + +export const ChallengeImg = styled.img` + width: 2.5rem; + filter: opacity(0.5) drop-shadow(0 0 0 #c0c0c0); +`; + +export const ChallengeInfoContainer = styled.div` + display: flex; + text-align: left; + align-items: center; + margin: 2rem 0 1rem 0.5rem; +`; + +export const ChallengeName = styled.span` + color: #000; + font-family: 'Noto Sans'; + font-size: 1.125rem; + font-style: normal; + font-weight: 700; + line-height: normal; +`; + +export const ReviewContainer = styled.div` + display: flex; + padding: 0.625rem; + justify-content: center; + align-items: center; + gap: 0.625rem; + height: 1.001rem; + border-radius: 0.625rem; + margin: 1rem; + /* background: var(--green--01, #5cc6ba); */ + background-color: ${(props) => props.BackgroundColor || '#5cc6ba'}; + border: 1px solid; + border-color: ${(props) => props.BorderColor || '#5cc6ba'}; +`; + +export const ReviewText = styled.span` + color: ${(props) => props.color || '#5cc6ba'}; + font-family: 'Noto Sans'; + font-size: 0.875rem; + font-style: normal; + font-weight: 700; + line-height: normal; +`; + +export const ChallengeBarContainer = styled.div` + display: flex; + margin: 1.2rem 1rem 1rem 4rem; + width: 100%; +`; + +export const ChallengeBar = styled.div` + display: inline-flex; + height: 0.3125rem; + width: 60%; + /* padding: 0 30%; */ + align-items: center; + flex-shrink: 0; + + border-radius: 0.15625rem; + background: #000; + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const ChallengeBarFill = styled.div` + width: 9.3125rem; + height: 0.3125rem; + border-radius: 0.3125rem; + background: #9e00ff; +`; diff --git a/src/pages/my-challenge/styles.js b/src/pages/my-challenge/styles.js new file mode 100644 index 0000000..c30eda8 --- /dev/null +++ b/src/pages/my-challenge/styles.js @@ -0,0 +1,15 @@ +import styled from '@emotion/styled'; + +export const MyChallengeLayout = styled.div` + display: inline-flex; + height: 44.1875rem; + padding: 0.625rem; + flex-direction: column; + align-items: center; + flex-shrink: 0; + margin: 0 1rem; + + border-radius: 1.25rem; + border: 1px solid var(--green--01, #5cc6ba); + background: #fff; +`; diff --git a/src/pages/rank/Rank.jsx b/src/pages/rank/Rank.jsx new file mode 100644 index 0000000..6fffe77 --- /dev/null +++ b/src/pages/rank/Rank.jsx @@ -0,0 +1,22 @@ +import AllRank from './components/AllRank'; +import MyRank from './components/MyRank'; +import * as Styles from './styles'; +import Header from '@/components/header/Header'; + +const RankPage = () => { + return ( + <> +
+ + + + + + + + + + ); +}; + +export default RankPage; diff --git a/src/pages/rank/components/AllRank.jsx b/src/pages/rank/components/AllRank.jsx new file mode 100644 index 0000000..77d3d3f --- /dev/null +++ b/src/pages/rank/components/AllRank.jsx @@ -0,0 +1,51 @@ +import { useState, useEffect, useCallback } from 'react'; + +import { Text } from '../styles'; +import HighRank from './HighRank'; +import UserRank from './UserRank'; +import * as Styles from './styles'; +import { getUserRanking } from '@/apis/rank/rank.api'; + +const AllRank = () => { + const [userRanks, setUserRanks] = useState([]); + const [loading, setLoading] = useState(true); + + const fetchAllRank = useCallback(async () => { + try { + const response = await getUserRanking(1, 10); + const data = response.data; + setUserRanks(data.data); + setLoading(false); + console.log('fetchAllRank data: ', data); + // console.log(userRanks); + } catch (error) { + console.error('fetchAllRank error: ', error); + } + }, []); + + useEffect(() => { + fetchAllRank(); + }, [fetchAllRank]); + + return ( + <> + + + 전체 순위 + + + {userRanks.slice(0, 3).map((user, index) => ( + + ))} + + + {userRanks.slice(3).map((user, index) => ( + + ))} + + + + ); +}; + +export default AllRank; diff --git a/src/pages/rank/components/HighRank.jsx b/src/pages/rank/components/HighRank.jsx new file mode 100644 index 0000000..282d628 --- /dev/null +++ b/src/pages/rank/components/HighRank.jsx @@ -0,0 +1,48 @@ +import { Text } from '../styles'; +import * as Styles from './styles'; +import First from '@/assets/Rank/1st-Trophy.svg'; +import Second from '@/assets/Rank/2nd-Trophy.svg'; +import Third from '@/assets/Rank/3rd-Trophy.svg'; +import Profile from '@/assets/main/ZZAN-Profile.png'; +import { getTierDetails } from '@/constants/TierSchema'; + +const gradeToTrophy = { + 1: First, + 2: Second, + 3: Third, +}; + +const HighRank = ({ grade, user }) => { + const trophySrc = gradeToTrophy[grade]; + const { nickname, profileImageUrl, tierInfo } = user; + + const tierDetails = tierInfo + ? getTierDetails(tierInfo.tier) + : { color: 'var(--color-class-02)' }; + + return ( + + + + + + + {nickname} + + + + {tierInfo.tier} + + + + + + + ); +}; + +export default HighRank; diff --git a/src/pages/rank/components/MyRank.jsx b/src/pages/rank/components/MyRank.jsx new file mode 100644 index 0000000..8dd88f1 --- /dev/null +++ b/src/pages/rank/components/MyRank.jsx @@ -0,0 +1,41 @@ +import { Text } from '../styles'; +import * as Styles from './styles'; +import Profile from '@/assets/main/ZZAN-Profile.png'; +import { getTierDetails } from '@/constants/TierSchema'; +import { useUserInfoStore } from '@/store/useUserInfoStore'; + +const MyRank = () => { + const { userNickname, userTier } = useUserInfoStore(); + + const tierDetails = userTier + ? getTierDetails(userTier) + : { color: 'var(--color-class-02)' }; + console.log(tierDetails.color); + return ( + <> + + + 내 순위 + + + + 1위 + + + + + + + {userNickname} + + + {userTier} + + + + + + ); +}; + +export default MyRank; diff --git a/src/pages/rank/components/UserRank.jsx b/src/pages/rank/components/UserRank.jsx new file mode 100644 index 0000000..dcb40ce --- /dev/null +++ b/src/pages/rank/components/UserRank.jsx @@ -0,0 +1,48 @@ +import { Text } from '../styles'; +import * as Styles from './styles'; +import Profile from '@/assets/main/ZZAN-Profile.png'; +import { getTierDetails } from '@/constants/TierSchema'; + +const UserRank = ({ user, index }) => { + const { nickname, profileImageUrl, tierInfo, currentExp } = user; + + const tierDetails = tierInfo + ? getTierDetails(tierInfo.tier) + : { color: 'var(--color-class-02)' }; + + console.log(tierDetails.color); + + return ( + <> + + + {index + 4}위 + + {nickname} + + + + + {tierInfo.tier} + + + {tierInfo.currentExp} + + + + + + + + + + + ); +}; + +export default UserRank; diff --git a/src/pages/rank/components/styles.js b/src/pages/rank/components/styles.js new file mode 100644 index 0000000..368ea2b --- /dev/null +++ b/src/pages/rank/components/styles.js @@ -0,0 +1,167 @@ +import styled from '@emotion/styled'; + +export const MyRankLayout = styled.div` + display: flex; + flex-direction: column; + background-color: var(--color-green-06); + border-bottom: 1px solid #bdc5cd; +`; + +export const RankInfoContainer = styled.div` + display: flex; + flex-direction: row; + align-items: center; + + justify-content: space-between; + gap: 0.6rem; + padding: 1rem 0.5rem; +`; + +export const RankProfile = styled.div` + display: flex; +`; + +export const RankProfileImg = styled.img` + width: ${(props) => props.width || '3rem'}; + height: ${(props) => props.height || '3rem'}; +`; +export const TextContainer = styled.div` + display: flex; + /* flex-direction: row; */ + flex-direction: ${(props) => props.direction || 'row'}; + justify-content: space-between; + align-items: center; + width: 100%; + margin-left: 1rem; + /* margin-right: 0.5rem; */ + margin-right: ${(props) => props.marginRight || '0.5rem'}; +`; + +export const RankPosition = styled.div` + flex-shrink: 0; + width: 3rem; + text-align: center; + white-space: nowrap; +`; + +export const AllRankLayout = styled.div` + display: flex; + margin: 1rem 0; + flex-direction: column; + background-color: var(--color-green-06); +`; + +export const HighRankContainer = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + padding: 1rem 0; + gap: 1rem; +`; + +export const HighRankLayout = styled.div` + display: flex; + padding: 1.1875rem 1.25rem; + width: 100%; + flex-direction: column; + justify-content: center; + text-align: center; + align-items: center; + gap: 0.625rem; + + border-radius: 0.625rem; + background: #fff; + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const TrophyContainer = styled.div` + width: 2.25356rem; + height: 2.48563rem; +`; + +export const Trophy = styled.img` + width: 100%; + height: 100%; +`; + +export const TeerText = styled.div` + display: flex; + width: 4.375rem; + align-items: center; + gap: 0.625rem; +`; + +export const TeerGraph = styled.div` + text-align: center; + width: 100%; + margin: 1rem 0; + display: flex; + height: 0.3125rem; + /* padding-right: 1.625rem; */ + align-items: center; + border-radius: 0.125rem; + background: #000; + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const CurrentTeerGrpah = styled.div` + /* width: 1rem; */ + padding: 0 1rem; + height: 0.3125rem; + border-radius: 0.125rem; + /* background: linear-gradient(90deg, #81633e 0%, #b28854 50%); */ + background: ${(props) => + `linear-gradient(45deg, #4e4e4e 0%, ${props.background} 50%)` || + 'linear-gradient(90deg, #81633e 0%, #b28854 50%)'}; +`; + +export const AllRankContainer = styled.div` + display: flex; + /* height: 20.875rem; */ + padding: 1rem 1rem; + flex-direction: column; + align-items: center; + flex-shrink: 0; + border-radius: 0.9375rem; + background: #fff; + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const UserRankContainer = styled.div` + display: flex; + width: 100%; + /* margin: 0 1.5rem 0 1rem; */ + /* padding: 0.46875rem 0rem 0.46875rem 0.625rem; */ + padding: 0.5rem 0; + justify-content: space-between; + gap: 5px; + align-items: center; + text-align: center; + border-bottom: 1px solid #d9d9d9; + background: #fff; +`; + +export const Container = styled.div` + display: flex; + width: 100%; + align-items: center; + text-align: center; + flex-direction: row; + gap: 1rem; +`; + +export const Wapper = styled.div` + display: flex; + /* width: 10rem; */ +`; + +export const Text = styled.span` + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + /* max-width: 150px; */ + color: ${(props) => props.color || 'black'}; + max-width: ${(props) => props.max}; + font-size: ${(props) => props.fs}; + font-weight: ${(props) => props.fw}; +`; diff --git a/src/pages/rank/styles.js b/src/pages/rank/styles.js new file mode 100644 index 0000000..5700c85 --- /dev/null +++ b/src/pages/rank/styles.js @@ -0,0 +1,26 @@ +import styled from '@emotion/styled'; + +export const RankLayout = styled.div` + display: flex; + flex-direction: column; + background-color: var(--color-green-06); +`; + +export const PageLayout = styled.div` + margin: 0 1rem; +`; + +export const Text = styled.div` + font-size: ${(props) => props.fs || '1rem'}; + font-weight: ${(props) => props.fw || 'normal'}; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + line-clamp: 3; + box-orient: vertical; + white-space: normal; + + color: ${(props) => props.color || 'black'}; +`; diff --git a/src/pages/record-challenge/ChallengeRecordPage.jsx b/src/pages/record-challenge/ChallengeRecordPage.jsx new file mode 100644 index 0000000..5548974 --- /dev/null +++ b/src/pages/record-challenge/ChallengeRecordPage.jsx @@ -0,0 +1,42 @@ +import { useState } from "react"; +import { Tabs, Tab, TabPanel } from "../../components/tab/slide-Tab"; +import Verification from "./verification/Verification"; +import StampBoard from "./stampboard/StampBoard"; +import TopBar from "../../components/top-bar/top-Bar" +import { + TabsContainer, + TabPanelContainer, + Wrapper, +} from "./styles"; + + +const ChallengeRecordPage = () => { + const [activeTab, setActiveTab] = useState(0); + + const handleChange = (e, value) => { + setActiveTab(value); + }; + + return ( + + + + + + + + + + + + + + + + + + ); +} + + +export default ChallengeRecordPage; \ No newline at end of file diff --git a/src/pages/record-challenge/bottomsheet/BottomSheet.jsx b/src/pages/record-challenge/bottomsheet/BottomSheet.jsx new file mode 100644 index 0000000..f0be02e --- /dev/null +++ b/src/pages/record-challenge/bottomsheet/BottomSheet.jsx @@ -0,0 +1,40 @@ +import useBottomSheet from "../../../hooks/useBottomSheet"; + +import * as S from "./styles"; +import Header from "./Header"; + +const BottomSheet = ({ data , isOpen, onDragEnd}) => { + const { controls } = useBottomSheet(isOpen); + if (!isOpen) { + return null; + } + return ( + + +
+ + {data.content} + + + + + ); +}; + +export default BottomSheet; diff --git a/src/pages/record-challenge/bottomsheet/Header.jsx b/src/pages/record-challenge/bottomsheet/Header.jsx new file mode 100644 index 0000000..c53bca7 --- /dev/null +++ b/src/pages/record-challenge/bottomsheet/Header.jsx @@ -0,0 +1,11 @@ +import * as S from "./styles"; + +const Header = ({date}) => { + return ( + + {date} + + ); +}; + +export default Header; diff --git a/src/pages/record-challenge/bottomsheet/styles.js b/src/pages/record-challenge/bottomsheet/styles.js new file mode 100644 index 0000000..162679c --- /dev/null +++ b/src/pages/record-challenge/bottomsheet/styles.js @@ -0,0 +1,85 @@ +import styled from '@emotion/styled'; +import { motion } from "framer-motion"; + +const BOTTOM_SHEET_HEIGHT = window.innerHeight; + + +export const Outer = styled.div` +position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 100; +` + +export const Wrapper = styled(motion.div)` + z-index: 101; + flex-direction: column; + position: fixed; + z-index: 10; + left: 0; + right: 0; + bottom: -50px; + border-top-left-radius: 20px; + border-top-right-radius: 20px; + background-color: var(--color-green-06); + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6); + height: 70%; + width: 100%; + + transition: transform 150ms ease-out; + margin: 0 auto; + overflow: auto; +`; + +export const HeaderWrapper = styled(motion.div)` + z-index: 102; + height: 20px; + border-top-left-radius: 20px; + border-top-right-radius: 20px; + position: relative; + padding: 15px; + background-color: var(--color-green-01); + color: var(--color-white); + display: flex; + flex-direction: row; +`; + +export const HandleBar = styled(motion.div)` + z-index: 103; + position: absolute; + left: 50%; + margin-left: -16px; + width: 32px; + height: 2px; + border-radius: 2px; + background-color: var(--color-white); +`; + +export const Text = styled.div` + font-size: var(--font-size-lg); + align-self: center; +`; + +export const ContentWrapper = styled.div` + padding: 20px; + display: flex; + flex-direction: column; + gap: 20px; +`; + +export const SubText = styled.div` + font-size: var(--font-size-md); + text-align: left; +`; + +export const Image = styled.img` + border-radius: 20px; + width: 100%; + align-self: center; +`; \ No newline at end of file diff --git a/src/pages/record-challenge/components/Stamp.jsx b/src/pages/record-challenge/components/Stamp.jsx new file mode 100644 index 0000000..9feeedc --- /dev/null +++ b/src/pages/record-challenge/components/Stamp.jsx @@ -0,0 +1,15 @@ +import * as Styles from './styles'; +import StampActive from '../../../assets/StampActive.svg'; +import StampInActive from '../../../assets/StampInactive.svg'; + + +const Stamp = ({data}) => { + return ( + <> + {data===-1 ? :} + + ); +} + + +export default Stamp; \ No newline at end of file diff --git a/src/pages/record-challenge/components/styles.js b/src/pages/record-challenge/components/styles.js new file mode 100644 index 0000000..b304eee --- /dev/null +++ b/src/pages/record-challenge/components/styles.js @@ -0,0 +1,8 @@ +import styled from '@emotion/styled'; + + +export const Stamp = styled.img` + width: 80px; + height: 80px; + margin: 5px auto; +` \ No newline at end of file diff --git a/src/pages/record-challenge/stampboard/StampBoard.jsx b/src/pages/record-challenge/stampboard/StampBoard.jsx new file mode 100644 index 0000000..9494610 --- /dev/null +++ b/src/pages/record-challenge/stampboard/StampBoard.jsx @@ -0,0 +1,102 @@ +import * as Styles from './styles'; +import Stamp from '../components/Stamp'; +import BottomSheet from '../bottomsheet/BottomSheet'; +import useBottomSheet from '@/hooks/useBottomSheet'; +import { useState,useEffect } from "react"; +import { getChallengeRecord, getChallengeRecordDetail } from '../../../apis/record-challenge/record.challenge.api'; + + +const StampBoard = () => { + const [isBottomSheetOpen, setBottomSheetOpen] = useState(false); + const [data, setData] = useState(null); + const [items, setItems] = useState([]); + const [record, setRecord] = useState([]); + + + const setArray = (length, values) => { + const array = new Array(length).fill(-1); + for (let i = 0; i < values.length; i++) { + array[i] = values[i]; + } + setItems(array); + }; + + + const chunkItems = (arr, chunkSize) => { + const chunks = []; + const last = arr.length % chunkSize == 1 ? chunkSize+1 : 0; + for (let i = 0; i < arr.length-last; i += chunkSize) + chunks.push(arr.slice(i, i + chunkSize)); + + for (let i = arr.length-last; i { + console.log(isBottomSheetOpen); + console.log(idx); + if (idx===-1){ + setBottomSheetOpen(false); + console.log("ddd"); + } + else { + getChallengeRecordDetail(idx).then((res) => { + setRecord(res); + setBottomSheetOpen(true); + }); + } + } + + const handleDragEnd = (event, info) => { + if (info.offset.y > 100) { + setBottomSheetOpen(false); + } + }; + + useEffect(() => { + getChallengeRecord(18).then((res) => { + setData(res); + setArray(res.totalCount, res.recordIds); + })}, []); + + + return ( + <> + {data ? + + {data.title} + + 챌린지 인증하고 레벨업!
짠돌이가 응원해요
+ 챌린지 유효기간 {data.startDate} ~ {data.endDate} + {rows.map((row, rowIndex) => ( + + {row.map((item, index) => ( + {toggleBottomSheet(item)}}> + + + ))} + + ))} +
+
+ :
} + + + 유의사항 + + 별도의 규칙이 없는 한 스탬프는 하루 한개로 제한됩니다. (동일 챌린지에 하루 여러건 참여한 것은 인정되지 않습니다.)
+ 모든 스탬프를 찍은 후 챌린지가 완료되며, 일부만 수행한 경우 챌린지가 완료로 표시되지 않습니다.
+ 명시된 횟수를 초과한 경우 챌린지 완료로 인정되나 추가 인증에 대한 포인트는 제공되지 않습니다.
+ 사진 조작, 타인의 계정 이용등의 부정행위가 적발될 시 해당 계정은 자동 탈퇴되며 추후 서비스 이용에 제한이 있을 수 있습니다.
+ 스탬프가 정상 인증되지 않는경우 고객센터로 문의하세요
+
+ + + + ); +} + +export default StampBoard; \ No newline at end of file diff --git a/src/pages/record-challenge/stampboard/styles.js b/src/pages/record-challenge/stampboard/styles.js new file mode 100644 index 0000000..dc9f3c1 --- /dev/null +++ b/src/pages/record-challenge/stampboard/styles.js @@ -0,0 +1,75 @@ +import styled from '@emotion/styled'; + +export const Wrapper = styled.div` + margin: 30px; + margin-bottom: 50px; + display: flex; + flex-direction: column; + text-align: left; + + overflow-y: auto; + scrollbar-color: transparent transparent; + &::-webkit-scrollbar { + display: none; + }; +`; + +export const Title = styled.div` + font-size: var(--font-size-lg); + font-weight: bold; + margin-bottom: 15px; +`; + +export const StampWrapper = styled.div` + border-radius: 20px; + text-align: center; + padding: 10px 20px; + background-color: var(--color-green-06); + margin-bottom: calc(100% - 250px); +` + +export const CautionWrapper = styled.div` + margin-bottom: 50px; + padding: 25px; + background-color: var(--color-grey-01); + color: var(--color-white); + text-align: left; +` + +export const Text = styled.div` + font-size: var(--font-size-sm); + font-weight: bold; + margin: 5px 0; +` + +export const SubText = styled.div` + font-size: var(--font-size-sm); + margin-bottom: 15px; +` + +export const SmallText = styled.div` + font-size: var(--font-size-xs); + margin-bottom: 15px; +` + + +export const Row = styled.div` + display: flex; +` + +export const Item = styled.div` + width: 100%; + flex: 1; + text-align: center; + + + ${({ rowLength }) => rowLength === 1 && ` + flex: 1 1 100%; + `} + ${({ rowLength }) => rowLength === 2 && ` + flex: 1 1 calc(50% - 10px); + `} + ${({ rowLength }) => rowLength === 3 && ` + flex: 1 1 calc(33.33% - 20px); + `} +` diff --git a/src/pages/record-challenge/styles.js b/src/pages/record-challenge/styles.js new file mode 100644 index 0000000..24a23e6 --- /dev/null +++ b/src/pages/record-challenge/styles.js @@ -0,0 +1,26 @@ +import styled from '@emotion/styled'; + +// 챌린지 기록 페이지 css + +export const TabsContainer = styled.div` + display: flex; + position: ${(props) => props.position || 'relative'}; + /* position: relative; */ + top: 50px; + align-self: center; + width: 90%; + margin: 0 auto; + height: 55px; + border-radius: 20px; + background-color: var(--color-green-06); +`; + +export const TabPanelContainer = styled.div` + height: 100%; + width: 100%; + position: relative; + top: 50px; + text-align: center; +`; + +export const Wrapper = styled.div``; diff --git a/src/pages/record-challenge/verification/Verification.jsx b/src/pages/record-challenge/verification/Verification.jsx new file mode 100644 index 0000000..c161a03 --- /dev/null +++ b/src/pages/record-challenge/verification/Verification.jsx @@ -0,0 +1,70 @@ +import React, { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import * as Styles from './styles'; +import { postVerification } from '../../../apis/record-challenge/verification'; + +const Verification = () => { + const fileInput = React.useRef(null); + const [previewImg, setPreviewImg] = useState(); + const [text, setText] = useState(''); + const navigate = useNavigate(); + + const saveHandler = () =>{ + postVerification(18, previewImg, text).then((res)=>{ + console.log("응답: ",res); + alert("성공적으로 저장했습니다."); + navigate("/"); + }).catch(()=>{ + alert("저장에 실패했습니다."); + navigate("/"); + }); + + } + + + + const handleButtonClick = (e) => { + fileInput.current.click(); + }; + + const imageHandler = (fileBlob) => { + const reader = new FileReader(); + reader.readAsDataURL(fileBlob); + return new Promise((resolve) =>{ + reader.onload = () => { + setPreviewImg(reader.result); + resolve(); + }; + }); + }; + + + return ( + + 길에 떨어진 쓰레기 줍기 챌린지 + setText(e.target.value)} > + + + {!previewImg && + {imageHandler(e.target.files[0])}} + /> + 사진추가 + } + {previewImg &&} + 참여하기 + + + ); +} + + +export default Verification; \ No newline at end of file diff --git a/src/pages/record-challenge/verification/styles.js b/src/pages/record-challenge/verification/styles.js new file mode 100644 index 0000000..1416436 --- /dev/null +++ b/src/pages/record-challenge/verification/styles.js @@ -0,0 +1,100 @@ +import styled from '@emotion/styled'; + +export const Wrapper = styled.div` + position: relative; + margin: 30px; + margin-bottom: 60px; + display: flex; + flex-direction: column; + text-align: left; + + overflow-y: auto; + scrollbar-color: transparent transparent; + &::-webkit-scrollbar { + display: none; + }; +`; + +export const Title = styled.div` + font-size: var(--font-size-lg); + font-weight: bold; + margin-bottom: 15px; +`; + +export const Text = styled.div` + font-size: var(--font-size-sm); + margin: 5px 0; +` +export const InputArea = styled.textarea` + font-size: var(--font-size-sm); + border-radius: 20px; + border: var(--color-green-01) 1px solid; + padding: 10px; + height: 30vh; + resize: none; +` + +export const SubText = styled.div` + font-size: var(--font-size-sm); + color: var(--color-grey-01); +` +export const AddImageBtn = styled.div` + border-radius: 20px; + background-color: var(--color-white); + font-size: var(--font-size-md); + color: var(--color-green-01); + width: 99.5%; + display: flex; + align-items: center; + justify-content: center; + height: 45px; + border: var(--color-green-01) 1px solid; + margin-top: 30px; +` + +export const Btn = styled.button` + position: fixed; + display:block; + bottom: 60px; + width: calc(100% - 60px); + height: 50px; + margin-top: 30px; + border-radius: 20px; + background-color: var(--color-green-01); + color: var(--color-white); + font-size: var(--font-size-md); + font-weight: bold; + border: none; +` + +export const Image = styled.img` + margin-top: 30px; + margin-bottom: 60px; + border-radius: 20px; + width: 100%; + object-fit: cover; + border: none; +` + + +export const ModalBack = styled.div` + position: fixed; + top:0; left: 0; bottom: 0; right: 0; + background: rgba(0, 0, 0, 0.8); +` + +export const ModalBackDrop = styled.div` + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 60%; + height: 20%; + background-color: var(--color-white); + border-radius: 10px; + display: flex; + justify-content: center; + align-items: center; + z-index: 100; + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); +` \ No newline at end of file diff --git a/src/pages/review/review-list/ReviewList.jsx b/src/pages/review/review-list/ReviewList.jsx new file mode 100644 index 0000000..9e63da8 --- /dev/null +++ b/src/pages/review/review-list/ReviewList.jsx @@ -0,0 +1,44 @@ +import React, { useState,useEffect } from 'react'; +import TopBar from '../../../components/top-bar/top-Bar'; +import * as Styles from './styles'; +import ReviewItem from './components/reviewItem/ReviewItem'; +import ReviewRating from './components/reviewRating/ReviewRating'; +import { getReview } from '../../../apis/review/review.challenge.api'; +import { useInView } from 'react-intersection-observer'; + + +const ReviewList = () => { + const [reviews, setReviews] = useState([]); + const [page, setPage] = useState(0); + const [ref, inView] = useInView({threshold: 0.5}); + const [hasNext, setHasNext] = useState(true); + + + useEffect(() => { + if (hasNext) { + getReview(1,page).then((res) => { + setReviews([...reviews, ...(res.data)]); + setPage((page) => page + 1); + setHasNext(res.hasNext) + })} + }, [inView]); + + + return ( + + + 길에 떨어진 쓰레기 줍기 챌린지 + + + + {reviews.map((item) => ( + + ))} + {hasNext ?
로딩..
:
} + + + ); +} + + +export default ReviewList; \ No newline at end of file diff --git a/src/pages/review/review-list/components/reviewItem/ReviewItem.jsx b/src/pages/review/review-list/components/reviewItem/ReviewItem.jsx new file mode 100644 index 0000000..dfc138e --- /dev/null +++ b/src/pages/review/review-list/components/reviewItem/ReviewItem.jsx @@ -0,0 +1,32 @@ +import React from 'react'; +import * as Styles from './styles'; +import { PiStarFill, PiStarLight } from "react-icons/pi"; + + +const ReviewItem = ({data}) => { + const rating =2; + return ( + + + + + + {data.user.nickname} + {data.user.tierinfo} + + 참여난이도 {data.challengeDifficulty} + + + {[...Array(rating)].map((a,i) => ( + ))} + {[...Array(5 - rating)].map((a,i) => ( + ))} + + + {data.content} + + ); +} + + +export default ReviewItem; \ No newline at end of file diff --git a/src/pages/review/review-list/components/reviewItem/styles.js b/src/pages/review/review-list/components/reviewItem/styles.js new file mode 100644 index 0000000..25fd409 --- /dev/null +++ b/src/pages/review/review-list/components/reviewItem/styles.js @@ -0,0 +1,72 @@ +import styled from '@emotion/styled'; + +export const Wrapper = styled.div` + display: flex; + flex-direction: column; + text-align: left; +`; + +export const ProfileImg = styled.img` + height: 100%; + width: 100%; + object-fit: cover; +`; + +export const Name = styled.div` + font-size: var(--font-size-md); + font-weight: 700; +`; + +export const Tier = styled.div` + font-size: var(--font-size-sm); + color: var(--color-grey-01); +`; + +export const Text = styled.div` + font-size: var(--font-size-sm); + margin-left: 35px; +` + +export const SmallText = styled.div` + font-size: 0.8rem; + margin-left: 35px; + margin-bottom: 5px; + color: var(--color-grey-01); + border-radius: 20px; + width: 90px; + border: var(--color-grey-02) 0.5px solid; + text-align: center; +` + +export const RowWrapper = styled.div` + display: flex; + flex-direction: row; + gap: 5px; + align-items: center; + justify-content: space-between; +` + +export const UserWrapper = styled.div` + display: flex; + flex-direction: row; + gap: 5px; + align-items: start; + justify-content: space-between; +` + +export const StarWrapper = styled.div` + position: absolute + display: flex; + flex-direction: row; + top: 0px; + right: 0px; + margin: 5px; +` + +export const ImageBox = styled.div` + height: 30px; + width: 30px; + border-radius: 70%; + overflow: hidden; + z-index: 10; +` \ No newline at end of file diff --git a/src/pages/review/review-list/components/reviewRating/ReviewRating.jsx b/src/pages/review/review-list/components/reviewRating/ReviewRating.jsx new file mode 100644 index 0000000..b88d094 --- /dev/null +++ b/src/pages/review/review-list/components/reviewRating/ReviewRating.jsx @@ -0,0 +1,67 @@ +import React, { useState,useEffect } from 'react'; +import * as Styles from './styles'; +import { getChallegeAvgScore } from '../../../../../apis/review/review.challenge.api'; + + +const ReviewRating = ({props}) => { + const [datas, setDatas] = useState(null); + const [starAvg,setStarAvg] = useState(0); + const [ratingToPercent,setRatingToPercent] = useState({width: `${(starAvg/5)*100}%`}); + + + useEffect(() => { + getChallegeAvgScore(1).then((res) => { + setDatas(res.ratingCount); + console.log("ddd",res.ratingCount); + setStarAvg(res.averageRating); + setRatingToPercent({width: `${(res.averageRating/5)*100}%`}) + })}, []); + + return ( + <> + {datas ? + + + {starAvg} + + + + + + + + + + + + + 매우 만족 + 만족 + 보통 + 별로 + 매우 별로 + + + + + + + + + + {datas[1]} + {datas[2]} + {datas[3]} + {datas[4]} + {datas[5]} + + + + :
+ } + + ); +} + + +export default ReviewRating; \ No newline at end of file diff --git a/src/pages/review/review-list/components/reviewRating/styles.js b/src/pages/review/review-list/components/reviewRating/styles.js new file mode 100644 index 0000000..d239e4f --- /dev/null +++ b/src/pages/review/review-list/components/reviewRating/styles.js @@ -0,0 +1,78 @@ +import styled from '@emotion/styled'; + +export const StarWrapper = styled.div` + display: flex; + flex-direction: row; + align-items: center; + align-self: center; + width: 90%; + border-radius: 10px; + background-color: var(--color-green-06); + padding: 0px 20px; + justify-content: center; +`; + +export const VLine = styled.div` + border: #D7D7D7 solid 0.5px; + height: 100px; + border-radius: 10px; + margin: 10px; +` + +export const RWrapper = styled.div` + display: flex; + flex-direction: row; + flex-shrink: 0; + align-items: center; + width: 170px; + justify-content: space-between; +`; + +export const CWrapper = styled.div` + display: flex; + flex-direction: column; + flex-shrink: 0; +`; + +export const Num = styled.div` + font-size: var(--font-size-xxl); + font-weight: bold; +`; + +export const SubText = styled.div` + font-size: var(--font-size-xs); + color: var(--color-grey-01); + margin: 0.2px; +` +export const StarRating = styled.div` + position: relative; + unicode-bidi: bidi-override; + width: max-content; + -webkit-text-fill-color: transparent; + -webkit-text-stroke-width: 0.8px; + -webkit-text-stroke-color: var(--color-green-01); +` +export const StarFill = styled.div` + padding: 0; + position: absolute; + z-index: 1; + display: flex; + top: 0; + left: 0; + overflow: hidden; + -webkit-text-fill-color: var(--color-green-01); +` +export const StarBase = styled.div` + z-index: 0; + padding: 0; +`; + +export const Bar = styled.div` + border-radius: 10px; + height: 5px; + --percentage: ${(props) => `${props.percentage}`}; + background: linear-gradient(to right, var(--color-green-01) var(--percentage), #D7D7D7 var(--percentage)); + width: 80px; + flex-shrink: 0; + margin: 6px 0; +` \ No newline at end of file diff --git a/src/pages/review/review-list/styles.js b/src/pages/review/review-list/styles.js new file mode 100644 index 0000000..69f77c2 --- /dev/null +++ b/src/pages/review/review-list/styles.js @@ -0,0 +1,33 @@ +import styled from '@emotion/styled'; + +export const Wrapper = styled.div` + position: relative; + margin: 30px; + margin-top: 60px; + display: flex; + flex-direction: column; +`; + +export const Title = styled.div` + font-size: var(--font-size-lg); + font-weight: bold; + margin-bottom: 15px; +`; + +export const List = styled.div` + position: relative; + margin-top: 50px; + display: flex; + flex-direction: column; + gap: 3rem; +`; + +export const VLine = styled.div` + position: absolute; + border: #D7D7D7 solid 0.5px; + height: calc(100% - 20px); + width: 0px; + border-radius: 10px; + margin: 13px; + z-index: 0; +` \ No newline at end of file diff --git a/src/pages/review/writingReview/WritingReview.jsx b/src/pages/review/writingReview/WritingReview.jsx new file mode 100644 index 0000000..b8867a5 --- /dev/null +++ b/src/pages/review/writingReview/WritingReview.jsx @@ -0,0 +1,84 @@ +import React, { useState } from 'react'; +import TopBar from '../../../components/top-bar/top-Bar'; +import * as Styles from './styles'; +import { PiStarFill, PiStarLight } from "react-icons/pi"; +import { postReview } from '../../../apis/review/review.challenge.api'; +import { useNavigate } from "react-router-dom"; + + +const WritingReview = () => { + const Item1 = ["어려워요", "적당해요","쉬워요"]; + const Item2 = ["뿌듯해요", "유익해요","애매해요"]; + const navigate = useNavigate(); + + const [rating, setRating] = useState(0); + const [selectedItem1, setSelectedItem1] = useState(null); + const [selectedItem2, setSelectedItem2] = useState(null); + const [text, setText] = useState(''); + + const handleItem1Click = (item) => { + setSelectedItem1(item); + }; + const handleItem2Click = (item) => { + setSelectedItem2(item); + }; + + const saveHandler = () =>{ + postReview(9, text, rating).then((res)=>{ + console.log("응답: ",res); + alert("성공적으로 저장했습니다."); + navigate("/"); + }).catch(()=>{ + alert("저장에 실패했습니다."); + navigate("/"); + }); + } + + + + return ( + + + 길에 떨어진 쓰레기 줍기 챌린지 + + {[...Array(rating)].map((a,i) => ( + setRating(i + 1)} color='var(--color-green-01)'/> + ))} + {[...Array(5 - rating)].map((a,i) => ( + setRating(rating + i + 1)} color='var(--color-green-01)'/> + ))} + {rating}.0/5.0 + + + 난이도 + {Item1.map((item) => ( + handleItem1Click(item)} + isSelected={selectedItem1 === item}> {item} + ))} + + + 성취감 + {Item2.map((item) => ( + handleItem2Click(item)} + isSelected={selectedItem2 === item}> {item} + ))} + + + 리뷰 쓰기 + setText(e.target.value)} > + + 등록하기 + + ); +} + + +export default WritingReview; \ No newline at end of file diff --git a/src/pages/review/writingReview/styles.js b/src/pages/review/writingReview/styles.js new file mode 100644 index 0000000..f8fa274 --- /dev/null +++ b/src/pages/review/writingReview/styles.js @@ -0,0 +1,102 @@ +import styled from '@emotion/styled'; + +export const Wrapper = styled.div` + position: relative; + margin: 30px; + margin-top: 60px; + margin-bottom: 60px; + display: flex; + flex-direction: column; + text-align: left; +`; + +export const RowWrapper = styled.div` + display: flex; + flex-direction: row; + flex-shrink: 0; + margin: 10px 0; +`; + +export const StarWrapper = styled.div` + display: flex; + flex-direction: row; + margin: 20px 0; + align-items: end; + align-self: center; +`; + +export const Title = styled.div` + font-size: var(--font-size-lg); + font-weight: bold; + margin-bottom: 15px; +`; + +export const Star = styled.div` + font-size: var(--font-size-xxl); + font-weight: bold; + margin-left: 10px; +`; + +export const BoldText = styled.div` + font-size: var(--font-size-md); + font-weight: bold; + margin-left: 5px; + margin-right: 20px; + flex-shrink: 0; +`; + +export const Text = styled.div` + font-size: var(--font-size-sm); + margin: 5px 0; +` +export const InputArea = styled.textarea` + font-size: var(--font-size-sm); + border-radius: 20px; + border: var(--color-green-01) 1px solid; + padding: 10px; + height: 30vh; + resize: none; + margin-top: 10px; +` + +export const SubText = styled.div` + font-size: var(--font-size-sm); + color: var(--color-grey-01); + margin: 3px; +` + + +export const Btn = styled.button` + position: fixed; + display:block; + bottom: 60px; + width: calc(100% - 60px); + height: 50px; + margin-top: 30px; + border-radius: 20px; + background-color: var(--color-green-01); + color: var(--color-white); + font-size: var(--font-size-md); + font-weight: bold; + border: none; +` + +export const CheckBtn = styled.button` + height: 25px; + border-radius: 20px; + margin-left: 5px; + border: var(--color-grey-02) 1px solid; + background-color: var(--color-white); + color: var(--color-grey-02); + font-size: var(--font-size-sm); + text-align: center; + flex-shrink: 0; + ${({ isSelected }) => isSelected && ` + border: var(--color-green-01) 1px solid; + color: var(--color-green-01); + `} +` + +export const Margin = styled.div` + margin: 10px; +` \ No newline at end of file diff --git a/src/pages/shorts-challenge/Shorts-challenge.jsx b/src/pages/shorts-challenge/Shorts-challenge.jsx new file mode 100644 index 0000000..9450d08 --- /dev/null +++ b/src/pages/shorts-challenge/Shorts-challenge.jsx @@ -0,0 +1,20 @@ +import ChallengeContents from './components/ChallengeContents'; +import ChallengeImage from './components/ChallengeImage'; +import ChallengeInfo from './components/ChallengeInfo'; +import * as Styles from './styles'; +import Header from '@/components/header/Header'; + +const ShortsChallenge = () => { + return ( + <> +
+ + + + + + + ); +}; + +export default ShortsChallenge; diff --git a/src/pages/shorts-challenge/components/ChallengeContents.jsx b/src/pages/shorts-challenge/components/ChallengeContents.jsx new file mode 100644 index 0000000..d0d8597 --- /dev/null +++ b/src/pages/shorts-challenge/components/ChallengeContents.jsx @@ -0,0 +1,32 @@ +import * as Styles from './styles'; + +const ChallengeContents = () => { + return ( + <> + + + 길에 떨어진 쓰레기 줍기 챌린지 + + + 길에 떨어진 쓰레기를 주워 우리 동네를 깨끗하게 만드는 챌린지입니다. + + + 사회적 책임감을 높이고 환경 보호 의식을 증진하기 위한 운동 중 + 하나입니다. 이 챌린지는 일상에서 마주하는 길거리나 공원 등 공공장소에 + 흩뿌려진 쓰레기를 주변을 깨끗하게 만들기 위해 자발적으로 줍는 것을 + 촉구합니다. + + + + ); +}; + +export default ChallengeContents; diff --git a/src/pages/shorts-challenge/components/ChallengeImage.jsx b/src/pages/shorts-challenge/components/ChallengeImage.jsx new file mode 100644 index 0000000..73247b4 --- /dev/null +++ b/src/pages/shorts-challenge/components/ChallengeImage.jsx @@ -0,0 +1,14 @@ +import * as Styles from './styles'; +import ChallengeImg from '@/assets/challenge/Challange-Img.png'; + +const ChallengeImage = () => { + return ( + <> + + + + + ); +}; + +export default ChallengeImage; diff --git a/src/pages/shorts-challenge/components/ChallengeInfo.jsx b/src/pages/shorts-challenge/components/ChallengeInfo.jsx new file mode 100644 index 0000000..ed5730b --- /dev/null +++ b/src/pages/shorts-challenge/components/ChallengeInfo.jsx @@ -0,0 +1,26 @@ +import * as Styles from './styles'; +import StartIcon from '@/assets/challenge/Start-Icon.svg'; +import EcoIcon from '@/assets/main/Eco-Logo.svg'; + +const ChallengeInfo = () => { + return ( + <> + + + + + + + 누적 참여자 :  + + 125명 + + + + + + + ); +}; + +export default ChallengeInfo; diff --git a/src/pages/shorts-challenge/components/styles.js b/src/pages/shorts-challenge/components/styles.js new file mode 100644 index 0000000..48c849f --- /dev/null +++ b/src/pages/shorts-challenge/components/styles.js @@ -0,0 +1,82 @@ +import styled from '@emotion/styled'; + +export const ShortChallengeLayout = styled.div` + display: flex; + flex-direction: column; + margin: 0 1rem; +`; + +export const ChallengeText = styled.div` + font-family: 'Noto Sans'; + font-size: ${(props) => props.fontSize || '1rem'}; + font-weight: ${(props) => props.fontWeight || 'normal'}; + color: ${(props) => props.color || 'var(--color-black-01)'}; + margin-top: ${(props) => props.mgTP || '1rem'}; + line-height: 1.5; +`; + +export const ChallengeImgContainer = styled.div` + display: flex; + margin: 1rem 0; +`; + +export const ChallengeImg = styled.img` + width: 100%; +`; + +export const ChallengeInfoLayout = styled.div` + display: flex; + flex-direction: row; + margin-left: 1rem; + align-items: center; +`; + +export const ChallengeInfoIconContainer = styled.div` + display: flex; + padding: 0.5rem; + border-radius: 50%; + background-color: #fff; + border: 1px solid var(--color-green-01); + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +`; + +export const ChallengeInfoIcon = styled.img` + width: 1.5rem; + height: 1.5rem; +`; + +export const ChallengeInfoTextContainer = styled.div` + display: flex; + flex-direction: row; + margin-left: 1rem; +`; + +export const ChallengeInfoText = styled.div` + color: #000; + font-family: 'Noto Sans'; + font-size: 1.125rem; + font-style: normal; + font-weight: 700; + line-height: normal; +`; + +export const ChallengeStartBtn = styled.div` + display: flex; + width: 0.5rem; + height: 0.5rem; + + justify-content: center; + align-items: center; + text-align: center; + border-radius: 5rem; + + margin: 1rem 19rem 2rem; + background: #5cc6ba; + padding: 1.5rem; +`; + +export const ChallengeStartIcon = styled.img` + width: 1rem; + height: 1.25rem; + flex-shrink: 0; +`; diff --git a/src/pages/shorts-challenge/styles.js b/src/pages/shorts-challenge/styles.js new file mode 100644 index 0000000..7a84d1d --- /dev/null +++ b/src/pages/shorts-challenge/styles.js @@ -0,0 +1,8 @@ +import styled from '@emotion/styled'; + +export const ShortChallengeLayout = styled.div` + display: flex; + flex-direction: column; + + background: var(--green--06, #f0f4f3); +`; diff --git a/src/store/useStore.js b/src/store/useStore.js new file mode 100644 index 0000000..94da702 --- /dev/null +++ b/src/store/useStore.js @@ -0,0 +1,14 @@ +import { create } from 'zustand'; + +export const usePageStore = create((set) => ({ + // 초기 상태 설정 + page: 0, + // 상태 변경 함수 + setPage: (page) => set({ page }), +})); + +// 사용 예시 +// import { usePageStore } from '@/store/useStore'; +// const { page, setPage } = usePageStore(); +// setPage(1); // page 상태 변경 +// console.log(page); diff --git a/src/store/useUserInfoStore.js b/src/store/useUserInfoStore.js new file mode 100644 index 0000000..e6baeaf --- /dev/null +++ b/src/store/useUserInfoStore.js @@ -0,0 +1,22 @@ +import { create } from 'zustand'; + +export const useUserInfoStore = create((set) => ({ + userId: 0, + userNickname: '', + userProfileImageUrl: '', + userEmail: '', + userTier: '', + userTotalExp: 0, + userCurrentExp: 0, + updateNickname: '', + + setUserId: (userId) => set({ userId }), + setUserNickname: (userNickname) => set({ userNickname }), + setUserProfileImageUrl: (userProfileImageUrl) => set({ userProfileImageUrl }), + setUserEmail: (userEmail) => set({ userEmail }), + // setTierInfo: (tierInfo) => set({ tierInfo }), + setUpdateNickname: async (updateNickname) => set({ updateNickname }), + setUserTier: (userTier) => set({ userTier }), + setUserTotalExp: (userTotalExp) => set({ userTotalExp }), + setUserCurrentExp: (userCurrentExp) => set({ userCurrentExp }), +})); diff --git a/src/styles/GlobalStyle.jsx b/src/styles/GlobalStyle.jsx new file mode 100644 index 0000000..c91b017 --- /dev/null +++ b/src/styles/GlobalStyle.jsx @@ -0,0 +1,94 @@ +import { css } from '@emotion/react'; + +// fontSize 정의 +const fontSizeXXl = '1.5rem'; // 24px +const fontSizeXl = '1.25rem'; // 20px +const fontSizeLg = '1.175rem'; //18px +const fontSizeMd = '1rem'; // 16px +const fontSizeSm = '0.875rem'; // 14px +const fontSizeXs = '0.75rem'; // 12px + +//color 정의 +const colorWhite = '#FFFFFF'; +const colorGreen01 = '#5CC6BA'; +const colorGreen02 = '#53E6AF'; +const colorGreen03 = '#5498C7'; +const colorGreen04 = '#103955'; +const colorGreen05 = '#457A82'; +const colorGreen06 = '#F0F4F3'; +const colorGrey01 = '#797979'; +const colorGrey02 = '#B8B8B8'; + +// 티어별 색상 정의 +const colorClass01 = '#C0C0C0C0'; +const colorClass02 = '#B28753'; +const colorClass03 = '#74A3D1'; +const colorClass04 = '#D6B534'; +const colorClass05 = '#E3242B'; +const colorClass06 = '#8B00FF'; +const colorClass07 = '#009000'; + +export const GlobalStyle = css` + @import url('https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap'); + + :root { + --font-size-xxl: ${fontSizeXXl}; + --font-size-xl: ${fontSizeXl}; + --font-size-lg: ${fontSizeLg}; + --font-size-md: ${fontSizeMd}; + --font-size-sm: ${fontSizeSm}; + --font-size-xs: ${fontSizeXs}; + + --color-white: ${colorWhite}; + --color-green-01: ${colorGreen01}; + --color-green-02: ${colorGreen02}; + --color-green-03: ${colorGreen03}; + --color-green-04: ${colorGreen04}; + --color-green-05: ${colorGreen05}; + --color-green-06: ${colorGreen06}; + --color-grey-01: ${colorGrey01}; + --color-grey-02: ${colorGrey02}; + + --color-class-01: ${colorClass01}; + --color-class-02: ${colorClass02}; + --color-class-03: ${colorClass03}; + --color-class-04: ${colorClass04}; + --color-class-05: ${colorClass05}; + --color-class-06: ${colorClass06}; + --color-class-07: ${colorClass07}; + } + + body { + margin: 0; + padding: 0; + font-family: 'Noto Sans', sans-serif; + box-sizing: border-box; + overflow-y: auto; + width: 100%; + height: 100%; + overflow-y: auto; + + /* 중앙 정렬 및 고정 너비 적용 */ + position: relative; + // transform: translateX(-50%); + // left: 50%; + + // 모바일 너비 적용 + @media (min-width: 768px) { + width: 480px; + } + + /* position: fixed; */ + /* left: 50%; */ + } + + img { + display: block; + } + + ul { + list-style: none; + padding: 0; + margin: 0; + } +`; diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..f7d0fb0 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,22 @@ +import path from 'path'; +import { defineConfig } from 'vite'; + +import react from '@vitejs/plugin-react'; + +// https://vitejs.dev/config/ +export default defineConfig({ + define: { + global: {}, + }, + plugins: [react()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + server: { + hmr: { + overlay: false, + }, + }, +});