From 17c9d487b2d1e8694041e43d39d52737499e097d Mon Sep 17 00:00:00 2001 From: ukyo Date: Mon, 20 Jan 2025 16:42:05 +0800 Subject: [PATCH] inital commit --- .../Controllers/Admin/IndexController.php | 74 +++ .../Controllers/Admin/LoginController.php | 11 - .../Controllers/Admin/MemberController.php | 17 + .../Controllers/Admin/RegisterController.php | 63 ++ .../Controllers/Admin/SettingController.php | 65 +++ app/Http/Controllers/EmailController.php | 263 +++++++++ app/Http/Controllers/LoginController.php | 141 +++++ .../Controllers/front/LoginController.php | 77 --- .../Controllers/front/MemberController.php | 79 ++- .../Controllers/front/PromoCodeController.php | 81 +++ .../Controllers/front/RegisterController.php | 83 +++ app/Http/Middleware/AdminRedirect.php | 34 ++ app/Http/Middleware/GuestRedirect.php | 29 + app/Http/Middleware/MemberRedirect.php | 31 + app/Http/Middleware/memberAuth.php | 17 +- app/Imports/PromoImport.php | 36 ++ app/Mail/CustomMail.php | 36 ++ app/Models/EmailVerifications.php | 12 + app/Models/Member.php | 14 + app/Models/Promocode.php | 21 + app/Models/User.php | 4 +- app/Providers/AppServiceProvider.php | 7 + app/Providers/MenuProvider.php | 11 +- app/Providers/RouteServiceProvider.php | 41 -- bootstrap/app.php | 1 + bootstrap/providers.php | 1 + composer.json | 1 + composer.lock | 514 ++++++++++++++++- config/app.php | 20 +- .../0001_01_01_000000_create_users_table.php | 28 +- .../2025_01_08_025433_create_member_table.php | 27 +- .../2025_01_08_025554_create_order_table.php | 4 +- ...5_01_13_154705_create_promocodes_table.php | 35 ++ ...02838_create_email_verifications_table.php | 29 + database/seeders/PromocodeSeeder.php | 17 + package-lock.json | 31 + package.json | 1 + public/assets/img/pages/profile_banner.png | Bin 0 -> 53334 bytes public/assets/js/form-validation.js | 10 +- .../js/pages-account-settings-billing.js | 2 +- public/assets/js/pages-auth.js | 16 +- resources/menu/horizontalMenu.json | 14 - resources/menu/memberMenu.json | 15 + resources/menu/verticalMenu.json | 31 +- .../views/admin/dasdborad/index.blade.php | 0 .../admin/dashboard/auth-register.blade.php | 326 +++++++++++ .../views/admin/dashboard/index.blade.php | 27 + .../views/admin/dashboard/profile.blade.php | 435 ++++++++++++++ resources/views/admin/login.blade.php | 197 ++++--- resources/views/admin/member/index.blade.php | 194 +++++++ resources/views/admin/profile/index.blade.php | 489 +++++++++++----- .../views/admin/setting/promocode.blade.php | 168 ++++++ resources/views/emails/custom.blade.php | 11 + resources/views/front/login.blade.php | 90 ++- .../front/member/auth-register.blade.php | 375 ++++++++++++ resources/views/front/member/index.blade.php | 203 ++++++- .../views/front/member/page-profile.blade.php | 391 +++++++++++++ .../views/front/member/profile.blade.php | 541 +++++++++++++++++- resources/views/layouts/admin_app.blade.php | 124 ++++ resources/views/layouts/admin_aside.blade.php | 61 ++ .../views/layouts/admin_footer.blade.php | 19 + .../views/layouts/admin_navbar.blade.php | 159 +++++ resources/views/layouts/app.blade.php | 24 +- resources/views/layouts/aside.blade.php | 29 +- resources/views/layouts/footer.blade.php | 7 +- resources/views/layouts/navbar.blade.php | 93 +-- .../vendor/pagination/bootstrap-4.blade.php | 46 ++ .../vendor/pagination/bootstrap-5.blade.php | 88 +++ .../views/vendor/pagination/default.blade.php | 46 ++ .../vendor/pagination/materialize.blade.php | 89 +++ .../vendor/pagination/semantic-ui.blade.php | 36 ++ .../pagination/simple-bootstrap-4.blade.php | 27 + .../pagination/simple-bootstrap-5.blade.php | 29 + .../pagination/simple-default.blade.php | 19 + .../pagination/simple-tailwind.blade.php | 25 + .../vendor/pagination/tailwind.blade.php | 106 ++++ routes/admin.php | 43 ++ routes/web.php | 60 +- 78 files changed, 6047 insertions(+), 574 deletions(-) create mode 100644 app/Http/Controllers/Admin/IndexController.php delete mode 100644 app/Http/Controllers/Admin/LoginController.php create mode 100644 app/Http/Controllers/Admin/MemberController.php create mode 100644 app/Http/Controllers/Admin/RegisterController.php create mode 100644 app/Http/Controllers/Admin/SettingController.php create mode 100644 app/Http/Controllers/EmailController.php create mode 100644 app/Http/Controllers/LoginController.php delete mode 100644 app/Http/Controllers/front/LoginController.php create mode 100644 app/Http/Controllers/front/PromoCodeController.php create mode 100644 app/Http/Controllers/front/RegisterController.php create mode 100644 app/Http/Middleware/AdminRedirect.php create mode 100644 app/Http/Middleware/GuestRedirect.php create mode 100644 app/Http/Middleware/MemberRedirect.php create mode 100644 app/Imports/PromoImport.php create mode 100644 app/Mail/CustomMail.php create mode 100644 app/Models/EmailVerifications.php create mode 100644 app/Models/Promocode.php delete mode 100644 app/Providers/RouteServiceProvider.php create mode 100644 database/migrations/2025_01_13_154705_create_promocodes_table.php create mode 100644 database/migrations/2025_01_17_102838_create_email_verifications_table.php create mode 100644 database/seeders/PromocodeSeeder.php create mode 100644 public/assets/img/pages/profile_banner.png delete mode 100644 resources/menu/horizontalMenu.json create mode 100644 resources/menu/memberMenu.json delete mode 100644 resources/views/admin/dasdborad/index.blade.php create mode 100644 resources/views/admin/dashboard/auth-register.blade.php create mode 100644 resources/views/admin/dashboard/index.blade.php create mode 100644 resources/views/admin/dashboard/profile.blade.php create mode 100644 resources/views/admin/member/index.blade.php create mode 100644 resources/views/admin/setting/promocode.blade.php create mode 100644 resources/views/emails/custom.blade.php create mode 100644 resources/views/front/member/auth-register.blade.php create mode 100644 resources/views/front/member/page-profile.blade.php create mode 100644 resources/views/layouts/admin_app.blade.php create mode 100644 resources/views/layouts/admin_aside.blade.php create mode 100644 resources/views/layouts/admin_footer.blade.php create mode 100644 resources/views/layouts/admin_navbar.blade.php create mode 100644 resources/views/vendor/pagination/bootstrap-4.blade.php create mode 100644 resources/views/vendor/pagination/bootstrap-5.blade.php create mode 100644 resources/views/vendor/pagination/default.blade.php create mode 100644 resources/views/vendor/pagination/materialize.blade.php create mode 100644 resources/views/vendor/pagination/semantic-ui.blade.php create mode 100644 resources/views/vendor/pagination/simple-bootstrap-4.blade.php create mode 100644 resources/views/vendor/pagination/simple-bootstrap-5.blade.php create mode 100644 resources/views/vendor/pagination/simple-default.blade.php create mode 100644 resources/views/vendor/pagination/simple-tailwind.blade.php create mode 100644 resources/views/vendor/pagination/tailwind.blade.php create mode 100644 routes/admin.php diff --git a/app/Http/Controllers/Admin/IndexController.php b/app/Http/Controllers/Admin/IndexController.php new file mode 100644 index 0000000..34e7f44 --- /dev/null +++ b/app/Http/Controllers/Admin/IndexController.php @@ -0,0 +1,74 @@ +password); + + // 傳送資料到前端 + $data = $user->toArray(); + + if ($isDefaultPassword) { + $data['password'] = $defaultPassword; + } else { + $data['password'] = null; + } + + return view('admin.dashboard.profile', ['data' => (Object) $data]); + } + public function profileUpdate(Request $request) + { + + $user = Auth::user(); + + $user->email = $request->email; + if ($request->password != null) { + $user->password = Hash::make($request->password); + } + $user->phone = $request->phone; + $user->save(); + + return response()->json(['status' => 'success', 'message' => '更新成功', 'data' => $user]); + + } + + public function pageProfile() + { + $user = Auth::user(); + // 從環境變數獲取預設密碼 + $defaultPassword = env('DEFAULT_PASSWORD'); + + // 判斷用戶密碼是否為預設密碼 + $isDefaultPassword = Hash::check($defaultPassword, $user->password); + + // 傳送資料到前端 + $data = $user->toArray(); + + if ($isDefaultPassword) { + $data['password'] = $defaultPassword; + } else { + $data['password'] = null; + } + return view('admin.profile.index', ['data' => (Object) $data]); + } +} diff --git a/app/Http/Controllers/Admin/LoginController.php b/app/Http/Controllers/Admin/LoginController.php deleted file mode 100644 index 754cf2f..0000000 --- a/app/Http/Controllers/Admin/LoginController.php +++ /dev/null @@ -1,11 +0,0 @@ - $data]); + } +} diff --git a/app/Http/Controllers/Admin/RegisterController.php b/app/Http/Controllers/Admin/RegisterController.php new file mode 100644 index 0000000..0e9ff47 --- /dev/null +++ b/app/Http/Controllers/Admin/RegisterController.php @@ -0,0 +1,63 @@ +validate([ + 'name' => 'required', + 'email' => 'required|email|unique:users', + 'password' => 'required|min:6', + 'phone' => 'required', + ]); + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => bcrypt($request->password), + 'phone' => $request->phone, + ]); + + return view('admin.dashboard.auth-register'); + } + + public function registerCreate(Request $request) + { + $request->validate([ + 'name' => 'required', + 'email' => 'required|email|unique:users', + 'password' => 'required|min:6', + 'phone' => 'required', + ]); + + $check = User::where('email', $request->email)->first(); + + if ($check) { + return response()->json(['status' => 'error', 'message' => '此帳號已被註冊']); + } + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => bcrypt($request->password), + 'phone' => $request->phone, + 'line_id' => null, + 'can_login' => false, + ]); + + return response()->json(['status' => 'success', 'message' => '註冊成功']); + } + +} diff --git a/app/Http/Controllers/Admin/SettingController.php b/app/Http/Controllers/Admin/SettingController.php new file mode 100644 index 0000000..bdcf822 --- /dev/null +++ b/app/Http/Controllers/Admin/SettingController.php @@ -0,0 +1,65 @@ +startOfMonth(); + $end = Carbon::now()->endOfMonth(); + + $result = Promocode::whereBetween('created_at', [$start, $end])->paginate(100); + + return view('admin.setting.promocode', ['data' => $result]); + } + /** + * @param Request $request ->file + * + * @return [type][string ] + */ + public function promoCodeCreate(Request $request) + { + // 驗證文件 + $request->validate([ + 'file' => 'required|mimes:xlsx,xls,csv|max:2048', + ]); + + if ($request->hasFile('file')) { + $file = $request->file('file'); + Log::info('File uploaded: ', [ + 'name' => $file->getClientOriginalName(), + 'size' => $file->getSize(), + 'mime' => $file->getMimeType(), + 'path' => $file->getRealPath(), + ]); + + // 获取整个文件的内容并打印出来 + $data = Excel::toArray([], $file); + // Log::info('Excel file content: ', $data); // 打印整个数据数组 + + // echo '
';
+            // print_r($data);
+            // exit;
+
+        }
+
+        // 讀取並導入 Excel 文件
+        try {
+            Excel::import(new PromoImport, $file);
+            return back()->with('success', '促銷代碼已成功導入!');
+        } catch (\Exception $e) {
+            return back()->with('error', '導入失敗: ' . $e->getMessage());
+        }
+    }
+
+}
diff --git a/app/Http/Controllers/EmailController.php b/app/Http/Controllers/EmailController.php
new file mode 100644
index 0000000..2145e9b
--- /dev/null
+++ b/app/Http/Controllers/EmailController.php
@@ -0,0 +1,263 @@
+all());
+
+        // 獲取當前登入的會員(若存在)
+        $auth = Auth::guard('member')->user();
+
+        // 驗證請求中是否包含 token
+        $validatedData = $request->validate([
+            'token' => 'required|string',
+        ]);
+
+        // 查詢對應的驗證記錄
+        $check = EmailVerifications::where('token', $validatedData['token'])->first();
+
+        if (!$check) {
+            Log::warning('Invalid token provided for email verification:', ['token' => $validatedData['token']]);
+            return response()->json(['status' => 'error', 'msg' => '無效的驗證連結或連結已過期'], 400);
+        }
+
+        Log::info(message: 'Email verification record found:', context: $check->toArray());
+
+        // 查詢對應的會員
+        $member = Member::where('email', $check->email)->orderBy('created_at', 'asc')->first();
+
+
+
+
+        // 若當前登入用戶存在 line_id,則使用當前用戶更新
+        if ($auth && isset($auth->line_id)) {
+            $line_id = $auth->line_id;
+        } else {
+            $line_id = $member->line_id;
+        }
+
+        if ($auth && isset($auth->avatar)) {
+            $avatar = $auth->avatar;
+        } else {
+            $avatar = $member->avatar;
+        }
+
+
+        // 更新會員的 Email 與驗證時間
+
+        Log::info('Member email verification updated successfully:', $member->toArray());
+
+        // 如果當前登入用戶與驗證的會員不同,登出當前用戶並重新登入
+        if ($auth && $auth->id != $member->id) {
+            // 在登出之前執行需要刪除或處理的操作
+            $needdeletaccount = Auth::guard('member')->user();
+
+            // 確保在登出前刪除帳號資料或執行其他操作
+            if ($needdeletaccount) {
+                $needdeletaccount->delete(); // 這會刪除登入用戶的資料
+                $member->email_verified_at = now();
+                $member->line_id = $line_id;
+                $member->avatar = $avatar;
+                Log::info('Deleted account after logout:', ['user_id' => $needdeletaccount->id]);
+            }
+
+            $member->save();
+
+            // 登出並重新登入
+            Auth::logout();
+            Auth::guard('member')->loginUsingId($member->id);
+            Log::info('Logged out previous user and logged in verified user:', ['user_id' => $member->id]);
+        }
+
+
+        // 刪除驗證記錄以防重複使用
+        $check->delete();
+        Log::info('Verification token record deleted successfully:', ['token' => $validatedData['token']]);
+
+        // return response()->json(['status' => 'success', 'msg' => '電子郵件驗證成功']);
+
+        return redirect()->route('member.index');
+
+
+
+    }
+    public function sendemail(Request $request)
+    {
+        \Log::info('got send mail', ['function' => 'sendemail']);
+
+        // 驗證請求數據
+        $validatedData = $request->validate([
+            'email' => 'required|email',
+        ]);
+        //判斷是否更新token
+
+        $check = EmailVerifications::where('email', $request->email)->first();
+
+        // 生成隨機 token
+        $token = Str::random(32);
+
+        if (!$check) {
+            $check = new EmailVerifications;
+        }
+
+        $check->email = $request->email;
+        $check->token = $token;
+        $check->save();
+
+        \Log::info('Generated token', ['token' => $token]);
+
+        $subject = "卡菲姬系統-驗證email";
+
+        // 使用 route 生成驗證鏈接
+        $verificationLink = route('email.verify', ['token' => $token]);
+        \Log::info('Generated verification link', ['link' => $verificationLink]);
+
+        try {
+            // 郵件內容
+            $message = "您好,\n\n請點擊以下鏈接以驗證您的電子郵件地址:\n\n" . $verificationLink . "\n\n如果您未請求此操作,請忽略此郵件。\n\n感謝您!";
+
+            \Log::info('Preparing to send mail', ['email' => $validatedData['email'], 'subject' => $subject, 'message' => $message]);
+
+            // 發送電子郵件
+            Mail::to($validatedData['email'])->send(new \App\Mail\CustomMail($subject, $message));
+
+            \Log::info('Mail sent successfully');
+
+            return response()->json(['status' => 'success', 'msg' => '郵件發送成功']);
+        } catch (\Exception $e) {
+            \Log::error('Failed to send mail', ['error' => $e->getMessage()]);
+
+            return response()->json(['status' => 'error', 'msg' => '郵件發送失敗,請稍後再試!', 'error' => $e->getMessage()], 500);
+        }
+    }
+
+    /**
+     * Summary of validemail ajax  驗證email 是否註冊過
+     * @param \Illuminate\Http\Request $request
+     * @return mixed|\Illuminate\Http\JsonResponse
+     */
+    public function validemail(Request $request)
+    {
+        // 構建郵件內容
+
+        // 驗證輸入的數據
+        $validatedData = $request->validate([
+            'email' => 'required|email',
+        ]);
+
+        // 檢查是否已有其他會員使用相同的 email
+        $user = Member::where('email', $validatedData['email'])->first();
+
+        if ($user) {
+            // 查找是否已有驗證記錄
+            $vaild = EmailVerifications::where('email', $validatedData['email'])->first();
+
+            return response()->json([
+                'status' => 'error',
+                'msg' => 'email 以使用 ,是否逕行合併,如果是 請先驗證email',
+            ]);
+        }
+        return response()->json([
+            'status' => 'success',
+
+        ]);
+
+    }
+    /**
+     * Summary of checkEmail email 寄送  token 點擊後 驗證
+     * @param \Illuminate\Http\Request $request
+     * @return mixed|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
+     */
+    public function checkEmail(Request $request)
+    {
+        Log::info('Email verification request received:', $request->all());
+
+        // 獲取當前登入的會員(若存在)
+        $auth = Auth::guard('member')->user();
+
+        // 驗證請求中是否包含 token
+        $validatedData = $request->validate([
+            'token' => 'required|string',
+        ]);
+
+        // 查詢對應的驗證記錄
+        $check = EmailVerifications::where('token', $validatedData['token'])->first();
+
+        if (!$check) {
+            Log::warning('Invalid token provided for email verification:', ['token' => $validatedData['token']]);
+            return response()->json(['status' => 'error', 'msg' => '無效的驗證連結或連結已過期'], 400);
+        }
+
+        Log::info(message: 'Email verification record found:', context: $check->toArray());
+
+        // 查詢對應的會員
+        $member = Member::where('email', $check->email)->orderBy('created_at', 'asc')->first();
+
+
+
+
+        // 若當前登入用戶存在 line_id,則使用當前用戶更新
+        if ($auth && isset($auth->line_id)) {
+            $line_id = $auth->line_id;
+        } else {
+            $line_id = $member->line_id;
+        }
+
+        // 更新會員的 Email 與驗證時間
+
+        Log::info('Member email verification updated successfully:', $member->toArray());
+
+        // 如果當前登入用戶與驗證的會員不同,登出當前用戶並重新登入
+        if ($auth && $auth->id != $member->id) {
+            // 在登出之前執行需要刪除或處理的操作
+            $needdeletaccount = Auth::guard('member')->user();
+
+            // 確保在登出前刪除帳號資料或執行其他操作
+            if ($needdeletaccount) {
+                $needdeletaccount->delete(); // 這會刪除登入用戶的資料
+                $member->email_verified_at = now();
+                $member->line_id = $line_id;
+                Log::info('Deleted account after logout:', ['user_id' => $needdeletaccount->id]);
+            }
+
+            $member->save();
+
+            // 登出並重新登入
+            Auth::logout();
+            Auth::guard('member')->loginUsingId($member->id);
+            Log::info('Logged out previous user and logged in verified user:', ['user_id' => $member->id]);
+        }
+
+
+        // 刪除驗證記錄以防重複使用
+        $check->delete();
+        Log::info('Verification token record deleted successfully:', ['token' => $validatedData['token']]);
+
+        // return response()->json(['status' => 'success', 'msg' => '電子郵件驗證成功']);
+
+        return redirect()->route('member.index');
+
+    }
+}
diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/LoginController.php
new file mode 100644
index 0000000..5cc65fb
--- /dev/null
+++ b/app/Http/Controllers/LoginController.php
@@ -0,0 +1,141 @@
+is('admin/*') ? 'admin' : 'member';
+        session(['redirect_to' => $redirectTo]); // 将值存入 Session
+        return Socialite::driver('line')->redirect();
+    }
+
+    /**
+     * Summary of handleProviderCallback
+     * line 登入後查詢
+     * @return void
+     */
+    public function handleProviderCallback(Request $request)
+    {
+        // 从 Session 获取 $redirectTo
+        $redirectTo = session('redirect_to', 'member');
+
+        $user = Socialite::driver('line')->user();
+        Log::info('line', ['user' => $user]);
+        $lineId = $user->getId();
+        $name   = $user->getName();
+        $avatar = $user->getAvatar() ?? '';
+        $email  = $user->getEmail() ?? '';
+
+        Log::info('email', [$email]);
+
+        if ($redirectTo == 'admin') {
+            // Admin 登录逻辑
+            $existingUser = $user = User::where('line_id', $lineId)
+                ->orWhere('email', $email)
+                ->first();
+
+            if ($existingUser) {
+                Auth::guard('web')->login($existingUser);
+            } else {
+                $newUser = User::create([
+                    'name'     => $name,
+                    'line_id'  => $lineId,
+                    'password' => bcrypt(env('DEFAULT_PASSWORD')),
+                    'avatar'   => $avatar,
+                    'source'   => 'cafeg',
+                    'email'    => $email,
+                ]);
+                Auth::guard('web')->login($newUser);
+            }
+
+            $user = Auth::guard('web')->user();
+            return $user->email
+                ? redirect()->route('admin.index')
+                : redirect()->route('admin.profile');
+        } else {
+            // Member 登录逻辑
+            $existingUser = Member::where('line_id', $lineId)
+                ->orWhere('email', $email)
+                ->first();
+            if ($existingUser) {
+                Auth::guard('member')->login($existingUser);
+            } else {
+                $newUser = Member::create([
+                    'name'     => $name,
+                    'line_id'  => $lineId,
+                    'password' => bcrypt(env('DEFAULT_PASSWORD')),
+                    'avatar'   => $avatar,
+                    'source'   => 'cafeg',
+                    'email'    => $email,
+                ]);
+                Auth::guard('member')->login($newUser);
+            }
+
+            $user = Auth::guard('member')->user();
+            return $user->email
+                ? redirect()->route('member.index')
+                : redirect()->route('member.profile');
+        }
+    }
+
+    public function adminLogout()
+    {
+        Auth::guard('web')->logout();
+        return redirect()->route('admin.login');
+    }
+
+    public function memberLogout()
+    {
+        Auth::guard('member')->logout();
+        return redirect()->route('front.login.view');
+    }
+
+    public function adminNormalLogin(Request $request)
+    {
+
+        $credentials = $request->only('email', 'password');
+
+        if (Auth::guard('web')->attempt($credentials)) {
+            return redirect()->route('admin.index');
+        }
+        return redirect()->route('admin.login');
+    }
+
+    public function memberNormalLogin(Request $request)
+    {
+        $credentials = $request->only('email', 'password');
+
+        if (Auth::guard('member')->attempt($credentials)) {
+            return redirect()->route('member.index');
+        } else {
+
+            return redirect()->route('front.login.view')->with('error', '帳號密碼錯誤');
+        }
+    }
+}
diff --git a/app/Http/Controllers/front/LoginController.php b/app/Http/Controllers/front/LoginController.php
deleted file mode 100644
index 0989c51..0000000
--- a/app/Http/Controllers/front/LoginController.php
+++ /dev/null
@@ -1,77 +0,0 @@
-redirect();
-
-    }
-
-    /**
-     * Summary of handleProviderCallback
-     * line 登入後查詢
-     * @return void
-     */
-    public function handleProviderCallback()
-    {
-        // 获取 LINE 用户信息
-        $user = Socialite::driver('line')->user();
-
-        // 从返回的信息中获取数据
-        $lineId = $user->getId(); // LINE ID
-        $name = $user->getName(); // 用户名
-        $avatar = $user->getAvatar(); // 用户头像
-
-        // 查询数据库中是否已有此用户
-        $existingUser = Member::where('line_id', $lineId)->first();
-
-        if ($existingUser) {
-            // 如果用户存在,使用 guard 'member' 登录
-            Auth::guard('member')->login($existingUser);
-        } else {
-
-            $user = [
-                'name' => $name,
-                'line_id' => $lineId,
-                'password' => bcrypt(env('DEFAULT_PASSWORD')),
-                'avatar' => $avatar,
-                'phone' => '',
-                'source' => 'cafeg',
-            ];
-
-            // 如果用户不存在,创建新用户并登录
-            $newUser = Member::create($user);
-
-            Auth::guard('member')->login($newUser);
-        }
-
-        $user = Auth::guard('member')->user();
-
-        if (!$user->email) {
-            return redirect()->route('member.profile');
-        } else {
-
-// 登录成功后重定向到特定页面
-            return redirect()->route('member.index');
-        }
-    }
-}
diff --git a/app/Http/Controllers/front/MemberController.php b/app/Http/Controllers/front/MemberController.php
index 2f6ef3f..57b397c 100644
--- a/app/Http/Controllers/front/MemberController.php
+++ b/app/Http/Controllers/front/MemberController.php
@@ -1,19 +1,94 @@
 user()->id)) {
+            $user_id = Auth::guard('member')->user()->id;
+            $code = Promocode::where('used_count', $user_id)->first();
+
+            return view('front.member.index', ['code' => $code]);
+        } else {
+            Auth::guard('member')->logout();
+            return redirect()->route('front.login.view');
+        }
     }
     public function profile()
     {
         return view('front.member.profile');
     }
+    /**
+     * Summary of profileUpdate
+     * @param \Illuminate\Http\Request $request
+     * @return \Illuminate\Http\RedirectResponse
+     * @todo  目前沒有錢包與購買方案與report 以後要 一起下壓
+     * @method put
+     */
+    public function profileUpdate(Request $request)
+    {
+        // 驗證輸入的數據
+        $validatedData = $request->validate([
+            'email' => 'required|email',
+            'password' => 'nullable|min:6', // password 與 password_confirmation 必須匹配
+            'phone' => 'nullable|string|max:15',
+        ]);
+
+        $auth = Member::find(Auth::guard('member')->id());
+
+        // 檢查是否已有其他會員使用相同的 email
+        $user = Member::where('email', $validatedData['email'])->first();
+
+        if ($user && $user->id != $auth->id) {
+            // 如果該 Email 已被其他用戶使用,返回錯誤信息
+            return response()->json(['status' => 'error', 'msg' => '該 Email 已被其他帳戶使用'], 422);
+        }
+
+        // 更新當前用戶的資料
+        $auth->email = $validatedData['email'];
+        if ($request->has('password')) {
+            $auth->password = Hash::make($validatedData['password']);
+        }
+        $auth->phone = $validatedData['phone'] ?? $auth->phone;
+
+        // 保存更改
+        $auth->save();
+
+        return response()->json(['status' => 'success', 'msg' => '更新成功']);
+    }
+
+    public function pageProfile(Request $request)
+    {
+
+        return view('front.member.page-profile');
+    }
+
+    public function checkPhone(Request $request)
+    {
+        $validatedData = $request->validate([
+            'phone' => 'required|string|max:15',
+        ]);
+        \Log::info('checkPhone', []);
+        $user = Member::where('phone', $validatedData['phone'])->first();
+
+        if ($user) {
+            return response()->json(['status' => 'error', 'msg' => '該電話號碼已被其他帳戶使用']);
+        }
+
+        return response()->json(['status' => 'success', 'msg' => '該電話號碼可用']);
+    }
+
 }
diff --git a/app/Http/Controllers/front/PromoCodeController.php b/app/Http/Controllers/front/PromoCodeController.php
new file mode 100644
index 0000000..28f6cb7
--- /dev/null
+++ b/app/Http/Controllers/front/PromoCodeController.php
@@ -0,0 +1,81 @@
+user()->id;
+        $count   = Promocode::where('used_count', $user_id)->count();
+
+        if (! $count) {
+
+            $row             = Promocode::where('used_count', 0)->first();
+            $row->used_count = $user_id;
+            $row->save();
+            return response()->json(['status' => 'success', 'msg' => '已成功取得', 'promocode' => $row->code]);
+        } else {
+            $code = Promocode::where('used_count', $user_id)->first();
+            return response()->json(['status' => 'success', 'msg' => '你已取得過優惠碼', 'promocode' => $code->code]);
+
+        }
+
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     */
+    public function store(Request $request)
+    {
+        
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     */
+    public function show(Promocode $promocode)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     */
+    public function edit(Promocode $promocode)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     */
+    public function update(Request $request, Promocode $promocode)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     */
+    public function destroy(Promocode $promocode)
+    {
+        //
+    }
+}
diff --git a/app/Http/Controllers/front/RegisterController.php b/app/Http/Controllers/front/RegisterController.php
new file mode 100644
index 0000000..0d1aca9
--- /dev/null
+++ b/app/Http/Controllers/front/RegisterController.php
@@ -0,0 +1,83 @@
+ $request->name,
+            'password' => bcrypt($request->password),
+            'avatar' => $request->avatar ?? '',
+            'email' => $request->email ?? '',
+            'source' => 'cafeg',
+            'phone' => $request->phone ?? '',
+        ]);
+
+        if (isset($newUser->email)) {
+
+            return redirect()->route('member.index')->with('sucess', '完成註冊');
+
+        } else {
+
+            return redirect()->route('member.profile')->with('sucess', '完成註冊,請完善你得資料');
+        }
+
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     */
+    public function show(Member $member)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     */
+    public function edit(Member $member)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     */
+    public function update(Request $request, Member $member)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     */
+    public function destroy(Member $member)
+    {
+        //
+    }
+}
diff --git a/app/Http/Middleware/AdminRedirect.php b/app/Http/Middleware/AdminRedirect.php
new file mode 100644
index 0000000..ee3d596
--- /dev/null
+++ b/app/Http/Middleware/AdminRedirect.php
@@ -0,0 +1,34 @@
+path() != 'admin/register') {
+            return redirect()->route('admin.login');
+        }
+        if (Auth::check() && $request->path() == 'admin/login') {
+            return redirect()->route('admin.index');
+        }
+
+        // $user = Auth::user();
+        // if ($user->email == null) {
+        //     return redirect()->route('admin.profile');
+        // }
+
+        return $next($request);
+    }
+}
diff --git a/app/Http/Middleware/GuestRedirect.php b/app/Http/Middleware/GuestRedirect.php
new file mode 100644
index 0000000..060e62f
--- /dev/null
+++ b/app/Http/Middleware/GuestRedirect.php
@@ -0,0 +1,29 @@
+check() && $request->path() == '/') {
+
+            return redirect()->route('front.login.view');
+
+        } else if ($request->path() == '/' && Auth::guard('member')->check()) {
+            return redirect()->route('member.index');
+
+        }
+
+        return $next($request);
+    }
+}
diff --git a/app/Http/Middleware/MemberRedirect.php b/app/Http/Middleware/MemberRedirect.php
new file mode 100644
index 0000000..5ef5045
--- /dev/null
+++ b/app/Http/Middleware/MemberRedirect.php
@@ -0,0 +1,31 @@
+check()) {
+
+            $loginUrlPath = parse_url(route('front.login.view'), PHP_URL_PATH);
+            if ($request->is('login')) {
+                return redirect()->route('member.index');
+            }
+
+        }
+
+        return $next($request);
+    }
+}
diff --git a/app/Http/Middleware/memberAuth.php b/app/Http/Middleware/memberAuth.php
index 8135e75..49ea1d0 100644
--- a/app/Http/Middleware/memberAuth.php
+++ b/app/Http/Middleware/memberAuth.php
@@ -1,5 +1,4 @@
 check()) {
-
-            $loginUrlPath = parse_url(route('front.login.view'), PHP_URL_PATH);
-            // if ($request->path() === ltrim($loginUrlPath, '/')) {
-            //     return redirect()->route('member.index');
-
-            // }
+        // 使用 'member' 守衛進行身份驗證
+        if (!Auth::guard('member')->check()) {
+            // 未登入,記錄日誌並重導向
 
+            \Log::warning('Unauthorized access attempt.', ['url' => $request->url()]);
+            return redirect()->route('front.login.view');
         }
 
+        // 驗證成功,繼續處理請求
         return $next($request);
     }
 }
diff --git a/app/Imports/PromoImport.php b/app/Imports/PromoImport.php
new file mode 100644
index 0000000..38e3230
--- /dev/null
+++ b/app/Imports/PromoImport.php
@@ -0,0 +1,36 @@
+ $row->toArray()[3]]);
+
+            if ($row->toArray()[3] != '提货码') // 跳過第一行
+            {
+                Promocode::create([
+                    'code' => $row->toArray()[3], // 使用 "提货码" 列
+                    'discount' => 100, // 假設折扣為固定值 100
+                    'type' => 'percent', // 默認為百分比
+                    'usage_limit' => 1, // 默認每個代碼只能使用一次
+                    'valid_from' => date('Y-m-d'), // 當前日期
+                    'valid_to' => date('Y-m-d', strtotime('1 day')), // 默認有效期至第二天
+                    'is_active' => 1, // 默認啟用
+                ]);
+            }
+
+        }
+
+    }
+}
diff --git a/app/Mail/CustomMail.php b/app/Mail/CustomMail.php
new file mode 100644
index 0000000..d07980b
--- /dev/null
+++ b/app/Mail/CustomMail.php
@@ -0,0 +1,36 @@
+subject      = $subject;
+        $this->emailMessage = $emailMessage;
+    }
+
+    public function build()
+    {
+        Log::info('mail send log test:', [
+            'subject'      => $this->subject,
+            'emailMessage' => $this->emailMessage,
+        ]);
+
+        return $this->subject($this->subject)
+            ->view('emails.custom')
+            ->with([
+                'subject'      => $this->subject,
+                'emailMessage' => $this->emailMessage,
+            ]);
+    }
+}
diff --git a/app/Models/EmailVerifications.php b/app/Models/EmailVerifications.php
new file mode 100644
index 0000000..03f93c6
--- /dev/null
+++ b/app/Models/EmailVerifications.php
@@ -0,0 +1,12 @@
+ '一般會員',
+        1 => '白銀會員',
+        2 => '黃金會員',
+        9 => '管理員',
+    ];
+
+    // 訪問器:自動轉換 Level
+    public function getLevelNameAttribute()
+    {
+        return self::$levelName[$this->level] ?? '未知會員';
+    }
+
     /**
      * 隱藏的屬性。
      *
diff --git a/app/Models/Promocode.php b/app/Models/Promocode.php
new file mode 100644
index 0000000..35ec6b0
--- /dev/null
+++ b/app/Models/Promocode.php
@@ -0,0 +1,21 @@
+
      */
     protected $hidden = [
-        'password',
         'remember_token',
     ];
 
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
index 02a4756..a9468da 100644
--- a/app/Providers/AppServiceProvider.php
+++ b/app/Providers/AppServiceProvider.php
@@ -2,6 +2,7 @@
 
 namespace App\Providers;
 
+use Illuminate\Pagination\Paginator;
 use Illuminate\Support\Facades\URL;
 use Illuminate\Support\ServiceProvider;
 
@@ -31,5 +32,11 @@ public function boot(): void
                 $app['request'], $config['client_id'], $config['client_secret'], $config['redirect']
             );
         });
+
+        // 设置默认分页视图为 Materialize 样式
+        Paginator::defaultView('vendor.pagination.materialize');
+
+        // 可选:设置简单分页的默认视图
+        Paginator::defaultSimpleView('vendor.pagination.materialize');
     }
 }
diff --git a/app/Providers/MenuProvider.php b/app/Providers/MenuProvider.php
index 694a96e..2d60819 100644
--- a/app/Providers/MenuProvider.php
+++ b/app/Providers/MenuProvider.php
@@ -1,5 +1,4 @@
 share('menuData', [
             $verticalMenuData,
-            $horizontalMenuData,
+            $memberMenuData,
         ]);
     }
 }
diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php
deleted file mode 100644
index e1b8c94..0000000
--- a/app/Providers/RouteServiceProvider.php
+++ /dev/null
@@ -1,41 +0,0 @@
-by($request->user()?->id ?: $request->ip());
-        });
-
-        $this->routes(function () {
-            Route::middleware('api')
-                ->prefix('api')
-                ->group(base_path('routes/api.php'));
-
-            Route::middleware('web')
-                ->namespace('App\Http\Controllers')
-                ->group(base_path('routes/web.php'));
-        });
-    }
-}
diff --git a/bootstrap/app.php b/bootstrap/app.php
index 9266892..93fd463 100644
--- a/bootstrap/app.php
+++ b/bootstrap/app.php
@@ -23,6 +23,7 @@
         ]);
 
     })
+
     ->withExceptions(function (Exceptions $exceptions) {
         //
     })->create();
diff --git a/bootstrap/providers.php b/bootstrap/providers.php
index ed31fb3..d5be48c 100644
--- a/bootstrap/providers.php
+++ b/bootstrap/providers.php
@@ -3,4 +3,5 @@
 return [
     App\Providers\AppServiceProvider::class,
     App\Providers\MenuProvider::class,
+
 ];
diff --git a/composer.json b/composer.json
index 86a4de1..177e2b2 100644
--- a/composer.json
+++ b/composer.json
@@ -11,6 +11,7 @@
         "laravel/sanctum": "^4.0",
         "laravel/socialite": "^5.16",
         "laravel/tinker": "^2.9",
+        "maatwebsite/excel": "^3.1",
         "socialiteproviders/line": "^4.1"
     },
     "require-dev": {
diff --git a/composer.lock b/composer.lock
index c51f29a..638b92b 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "6124ac50e296caf206e7d2ec2e56ae8e",
+    "content-hash": "a479f93c0f786bef7c2eb2887cbe259b",
     "packages": [
         {
             "name": "brick/math",
@@ -135,6 +135,87 @@
             ],
             "time": "2024-02-09T16:56:22+00:00"
         },
+        {
+            "name": "composer/semver",
+            "version": "3.4.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/semver.git",
+                "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+                "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.2 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^1.11",
+                "symfony/phpunit-bridge": "^3 || ^7"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Semver\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                },
+                {
+                    "name": "Rob Bast",
+                    "email": "rob.bast@gmail.com",
+                    "homepage": "http://robbast.nl"
+                }
+            ],
+            "description": "Semver library that offers utilities, version constraint parsing and validation.",
+            "keywords": [
+                "semantic",
+                "semver",
+                "validation",
+                "versioning"
+            ],
+            "support": {
+                "irc": "ircs://irc.libera.chat:6697/composer",
+                "issues": "https://github.com/composer/semver/issues",
+                "source": "https://github.com/composer/semver/tree/3.4.3"
+            },
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-09-19T14:15:21+00:00"
+        },
         {
             "name": "dflydev/dot-access-data",
             "version": "v3.0.3",
@@ -510,6 +591,67 @@
             ],
             "time": "2024-12-27T00:36:43+00:00"
         },
+        {
+            "name": "ezyang/htmlpurifier",
+            "version": "v4.18.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ezyang/htmlpurifier.git",
+                "reference": "cb56001e54359df7ae76dc522d08845dc741621b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b",
+                "reference": "cb56001e54359df7ae76dc522d08845dc741621b",
+                "shasum": ""
+            },
+            "require": {
+                "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
+            },
+            "require-dev": {
+                "cerdic/css-tidy": "^1.7 || ^2.0",
+                "simpletest/simpletest": "dev-master"
+            },
+            "suggest": {
+                "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.",
+                "ext-bcmath": "Used for unit conversion and imagecrash protection",
+                "ext-iconv": "Converts text to and from non-UTF-8 encodings",
+                "ext-tidy": "Used for pretty-printing HTML"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "library/HTMLPurifier.composer.php"
+                ],
+                "psr-0": {
+                    "HTMLPurifier": "library/"
+                },
+                "exclude-from-classmap": [
+                    "/library/HTMLPurifier/Language/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-2.1-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "Edward Z. Yang",
+                    "email": "admin@htmlpurifier.org",
+                    "homepage": "http://ezyang.com"
+                }
+            ],
+            "description": "Standards compliant HTML filter written in PHP",
+            "homepage": "http://htmlpurifier.org/",
+            "keywords": [
+                "html"
+            ],
+            "support": {
+                "issues": "https://github.com/ezyang/htmlpurifier/issues",
+                "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0"
+            },
+            "time": "2024-11-01T03:51:45+00:00"
+        },
         {
             "name": "fahlisaputra/laravel-minify",
             "version": "v1.1.5",
@@ -2346,6 +2488,271 @@
             ],
             "time": "2024-12-08T08:18:47+00:00"
         },
+        {
+            "name": "maatwebsite/excel",
+            "version": "3.1.62",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/SpartnerNL/Laravel-Excel.git",
+                "reference": "decfb9140161fcc117571e47e35ddf27983189ce"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/decfb9140161fcc117571e47e35ddf27983189ce",
+                "reference": "decfb9140161fcc117571e47e35ddf27983189ce",
+                "shasum": ""
+            },
+            "require": {
+                "composer/semver": "^3.3",
+                "ext-json": "*",
+                "illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0",
+                "php": "^7.0||^8.0",
+                "phpoffice/phpspreadsheet": "^1.29.7",
+                "psr/simple-cache": "^1.0||^2.0||^3.0"
+            },
+            "require-dev": {
+                "laravel/scout": "^7.0||^8.0||^9.0||^10.0",
+                "orchestra/testbench": "^6.0||^7.0||^8.0||^9.0",
+                "predis/predis": "^1.1"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "aliases": {
+                        "Excel": "Maatwebsite\\Excel\\Facades\\Excel"
+                    },
+                    "providers": [
+                        "Maatwebsite\\Excel\\ExcelServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Maatwebsite\\Excel\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Patrick Brouwers",
+                    "email": "patrick@spartner.nl"
+                }
+            ],
+            "description": "Supercharged Excel exports and imports in Laravel",
+            "keywords": [
+                "PHPExcel",
+                "batch",
+                "csv",
+                "excel",
+                "export",
+                "import",
+                "laravel",
+                "php",
+                "phpspreadsheet"
+            ],
+            "support": {
+                "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues",
+                "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.62"
+            },
+            "funding": [
+                {
+                    "url": "https://laravel-excel.com/commercial-support",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/patrickbrouwers",
+                    "type": "github"
+                }
+            ],
+            "time": "2025-01-04T12:14:36+00:00"
+        },
+        {
+            "name": "maennchen/zipstream-php",
+            "version": "3.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/maennchen/ZipStream-PHP.git",
+                "reference": "6187e9cc4493da94b9b63eb2315821552015fca9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/6187e9cc4493da94b9b63eb2315821552015fca9",
+                "reference": "6187e9cc4493da94b9b63eb2315821552015fca9",
+                "shasum": ""
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "ext-zlib": "*",
+                "php-64bit": "^8.1"
+            },
+            "require-dev": {
+                "ext-zip": "*",
+                "friendsofphp/php-cs-fixer": "^3.16",
+                "guzzlehttp/guzzle": "^7.5",
+                "mikey179/vfsstream": "^1.6",
+                "php-coveralls/php-coveralls": "^2.5",
+                "phpunit/phpunit": "^10.0",
+                "vimeo/psalm": "^5.0"
+            },
+            "suggest": {
+                "guzzlehttp/psr7": "^2.4",
+                "psr/http-message": "^2.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "ZipStream\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paul Duncan",
+                    "email": "pabs@pablotron.org"
+                },
+                {
+                    "name": "Jonatan Männchen",
+                    "email": "jonatan@maennchen.ch"
+                },
+                {
+                    "name": "Jesse Donat",
+                    "email": "donatj@gmail.com"
+                },
+                {
+                    "name": "András Kolesár",
+                    "email": "kolesar@kolesar.hu"
+                }
+            ],
+            "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
+            "keywords": [
+                "stream",
+                "zip"
+            ],
+            "support": {
+                "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
+                "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/maennchen",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-10-10T12:33:01+00:00"
+        },
+        {
+            "name": "markbaker/complex",
+            "version": "3.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/MarkBaker/PHPComplex.git",
+                "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
+                "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+                "phpcompatibility/php-compatibility": "^9.3",
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
+                "squizlabs/php_codesniffer": "^3.7"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Complex\\": "classes/src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mark Baker",
+                    "email": "mark@lange.demon.co.uk"
+                }
+            ],
+            "description": "PHP Class for working with complex numbers",
+            "homepage": "https://github.com/MarkBaker/PHPComplex",
+            "keywords": [
+                "complex",
+                "mathematics"
+            ],
+            "support": {
+                "issues": "https://github.com/MarkBaker/PHPComplex/issues",
+                "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2"
+            },
+            "time": "2022-12-06T16:21:08+00:00"
+        },
+        {
+            "name": "markbaker/matrix",
+            "version": "3.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/MarkBaker/PHPMatrix.git",
+                "reference": "728434227fe21be27ff6d86621a1b13107a2562c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c",
+                "reference": "728434227fe21be27ff6d86621a1b13107a2562c",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+                "phpcompatibility/php-compatibility": "^9.3",
+                "phpdocumentor/phpdocumentor": "2.*",
+                "phploc/phploc": "^4.0",
+                "phpmd/phpmd": "2.*",
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
+                "sebastian/phpcpd": "^4.0",
+                "squizlabs/php_codesniffer": "^3.7"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Matrix\\": "classes/src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mark Baker",
+                    "email": "mark@demon-angel.eu"
+                }
+            ],
+            "description": "PHP Class for working with matrices",
+            "homepage": "https://github.com/MarkBaker/PHPMatrix",
+            "keywords": [
+                "mathematics",
+                "matrix",
+                "vector"
+            ],
+            "support": {
+                "issues": "https://github.com/MarkBaker/PHPMatrix/issues",
+                "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1"
+            },
+            "time": "2022-12-02T22:17:43+00:00"
+        },
         {
             "name": "monolog/monolog",
             "version": "3.8.1",
@@ -2965,6 +3372,111 @@
             },
             "time": "2020-10-15T08:29:30+00:00"
         },
+        {
+            "name": "phpoffice/phpspreadsheet",
+            "version": "1.29.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
+                "reference": "02c8625411dcb96e1f63d58c47460284e15b2e80"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/02c8625411dcb96e1f63d58c47460284e15b2e80",
+                "reference": "02c8625411dcb96e1f63d58c47460284e15b2e80",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-dom": "*",
+                "ext-fileinfo": "*",
+                "ext-gd": "*",
+                "ext-iconv": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-simplexml": "*",
+                "ext-xml": "*",
+                "ext-xmlreader": "*",
+                "ext-xmlwriter": "*",
+                "ext-zip": "*",
+                "ext-zlib": "*",
+                "ezyang/htmlpurifier": "^4.15",
+                "maennchen/zipstream-php": "^2.1 || ^3.0",
+                "markbaker/complex": "^3.0",
+                "markbaker/matrix": "^3.0",
+                "php": "^7.4 || ^8.0",
+                "psr/http-client": "^1.0",
+                "psr/http-factory": "^1.0",
+                "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "dev-main",
+                "dompdf/dompdf": "^1.0 || ^2.0 || ^3.0",
+                "friendsofphp/php-cs-fixer": "^3.2",
+                "mitoteam/jpgraph": "^10.3",
+                "mpdf/mpdf": "^8.1.1",
+                "phpcompatibility/php-compatibility": "^9.3",
+                "phpstan/phpstan": "^1.1",
+                "phpstan/phpstan-phpunit": "^1.0",
+                "phpunit/phpunit": "^8.5 || ^9.0",
+                "squizlabs/php_codesniffer": "^3.7",
+                "tecnickcom/tcpdf": "^6.5"
+            },
+            "suggest": {
+                "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+                "ext-intl": "PHP Internationalization Functions",
+                "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+                "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
+                "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Maarten Balliauw",
+                    "homepage": "https://blog.maartenballiauw.be"
+                },
+                {
+                    "name": "Mark Baker",
+                    "homepage": "https://markbakeruk.net"
+                },
+                {
+                    "name": "Franck Lefevre",
+                    "homepage": "https://rootslabs.net"
+                },
+                {
+                    "name": "Erik Tilt"
+                },
+                {
+                    "name": "Adrien Crivelli"
+                }
+            ],
+            "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+            "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+            "keywords": [
+                "OpenXML",
+                "excel",
+                "gnumeric",
+                "ods",
+                "php",
+                "spreadsheet",
+                "xls",
+                "xlsx"
+            ],
+            "support": {
+                "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
+                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.7"
+            },
+            "time": "2024-12-27T05:10:37+00:00"
+        },
         {
             "name": "phpoption/phpoption",
             "version": "1.9.3",
diff --git a/config/app.php b/config/app.php
index f467267..4d26007 100644
--- a/config/app.php
+++ b/config/app.php
@@ -11,7 +11,7 @@
     | framework needs to place the application's name in a notification or
     | other UI elements where an application name needs to be displayed.
     |
-    */
+     */
 
     'name' => env('APP_NAME', 'Laravel'),
 
@@ -24,7 +24,7 @@
     | running in. This may determine how you prefer to configure various
     | services the application utilizes. Set this in your ".env" file.
     |
-    */
+     */
 
     'env' => env('APP_ENV', 'production'),
 
@@ -37,7 +37,7 @@
     | stack traces will be shown on every error that occurs within your
     | application. If disabled, a simple generic error page is shown.
     |
-    */
+     */
 
     'debug' => (bool) env('APP_DEBUG', false),
 
@@ -50,7 +50,7 @@
     | the Artisan command line tool. You should set this to the root of
     | the application so that it's available within Artisan commands.
     |
-    */
+     */
 
     'url' => env('APP_URL', 'http://localhost'),
 
@@ -63,9 +63,9 @@
     | will be used by the PHP date and date-time functions. The timezone
     | is set to "UTC" by default as it is suitable for most use cases.
     |
-    */
+     */
 
-    'timezone' => env('APP_TIMEZONE', 'UTC'),
+    'timezone' => env('APP_TIMEZONE', 'asia/Taipei'),
 
     /*
     |--------------------------------------------------------------------------
@@ -76,7 +76,7 @@
     | by Laravel's translation / localization methods. This option can be
     | set to any locale for which you plan to have translation strings.
     |
-    */
+     */
 
     'locale' => env('APP_LOCALE', 'en'),
 
@@ -93,14 +93,14 @@
     | to a random, 32 character string to ensure that all encrypted values
     | are secure. You should do this prior to deploying the application.
     |
-    */
+     */
 
     'cipher' => 'AES-256-CBC',
 
     'key' => env('APP_KEY'),
 
     'previous_keys' => [
-        ...array_filter(
+         ...array_filter(
             explode(',', env('APP_PREVIOUS_KEYS', ''))
         ),
     ],
@@ -116,7 +116,7 @@
     |
     | Supported drivers: "file", "cache"
     |
-    */
+     */
 
     'maintenance' => [
         'driver' => env('APP_MAINTENANCE_DRIVER', 'file'),
diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php
index 3562faa..ae40745 100644
--- a/database/migrations/0001_01_01_000000_create_users_table.php
+++ b/database/migrations/0001_01_01_000000_create_users_table.php
@@ -14,12 +14,14 @@ public function up(): void
         Schema::create('users', function (Blueprint $table) {
             $table->id();
             $table->string('name');
-            $table->string('email')->unique();
+            $table->string('email')->nullable()->unique();
             $table->timestamp('email_verified_at')->nullable();
-            $table->string('app_id')->comment('line user_id');
+            $table->string('line_id')->nullable()->comment('line user_id');
             $table->string('phone')->nullable()->comment('手機電話');
-            $table->string('role')->comment('admin,agent');
+            // $table->string('role')->comment('admin,agent');
             $table->string('password');
+            $table->string('avatar')->nullable(); // 頭像
+            $table->boolean('can_login')->default(true); // 是否可以登入
             $table->rememberToken();
             $table->softDeletes();
             $table->timestamps();
@@ -32,12 +34,20 @@ public function up(): void
         });
 
         Schema::create('sessions', function (Blueprint $table) {
-            $table->string('id')->primary();
-            $table->foreignId('user_id')->nullable()->index();
-            $table->string('ip_address', 45)->nullable();
-            $table->text('user_agent')->nullable();
-            $table->longText('payload');
-            $table->integer('last_activity')->index();
+            $table->id();
+            $table->string('name')->default('客戶')->nullable(); // 使用者名稱
+            $table->string('email')->nullable()->unique(); // 電子郵件
+            $table->string('password'); // 密碼
+            $table->string('avatar')->nullable(); // 頭像
+            $table->string('phone')->nullable(); // 電話
+            $table->string('line_id')->nullable()->unique(); // Line ID
+            $table->string('facebook_id')->nullable()->unique(); // Facebook ID
+            $table->string('google_id')->nullable()->unique(); // Google ID
+            $table->integer('level')->default(1)->comment('會員等級  一般,1.系統管理員,2工程師'); // 會員等級
+            $table->string('reset_token')->nullable(); // 密碼重置 Token
+            $table->timestamp('email_verified_at')->nullable(); // 電子郵件驗證時間
+            $table->rememberToken(); // 記住登入 Token
+            $table->timestamps(); // 建立與更新時間
         });
     }
 
diff --git a/database/migrations/2025_01_08_025433_create_member_table.php b/database/migrations/2025_01_08_025433_create_member_table.php
index 04d4d3d..e38199e 100644
--- a/database/migrations/2025_01_08_025433_create_member_table.php
+++ b/database/migrations/2025_01_08_025433_create_member_table.php
@@ -15,20 +15,21 @@ public function up()
     {
         Schema::create('members', function (Blueprint $table) {
             $table->id();
-            $table->string('name')->default('客戶')->nullable(); // 使用者名稱
-            $table->string('email')->nullable()->unique(); // 電子郵件
-            $table->string('password'); // 密碼
-            $table->string('avatar')->nullable(); // 頭像
-            $table->string('phone')->nullable(); // 電話
-            $table->string('source')->comment('來源'); // 來源
-            $table->string('line_id')->nullable()->unique(); // Line ID
-            $table->string('facebook_id')->nullable()->unique(); // Facebook ID
-            $table->string('google_id')->nullable()->unique(); // Google ID
+            $table->string('name')->default('客戶')->nullable();                                    // 使用者名稱
+            $table->string('email')->nullable()->unique();                                                                // 電子郵件
+            $table->string('password');                                                                                   // 密碼
+            $table->string('avatar')->nullable();                                                                         // 頭像
+            $table->string('phone')->nullable();                                                                          // 電話
+            $table->string('source')->comment('來源');                                                                  // 來源
+            $table->string('line_id')->nullable()->unique();                                                              // Line ID
+            $table->string('facebook_id')->nullable()->unique();                                                          // Facebook ID
+            $table->string('google_id')->nullable()->unique();                                                            // Google ID
             $table->integer('level')->default(0)->comment('會員等級 0 一般,1.銀會員,2金會員,9.測試人員'); // 會員等級
-            $table->string('reset_token')->nullable(); // 密碼重置 Token
-            $table->timestamp('email_verified_at')->nullable(); // 電子郵件驗證時間
-            $table->rememberToken(); // 記住登入 Token
-            $table->timestamps(); // 建立與更新時間
+            $table->string('reset_token')->nullable();                                                                    // 密碼重置 Token
+            $table->softDeletes();                                                                                        //軟刪除
+            $table->timestamp('email_verified_at')->nullable();                                                           // 電子郵件驗證時間
+            $table->rememberToken();                                                                                      // 記住登入 Token
+            $table->timestamps();                                                                                         // 建立與更新時間
         });
     }
 
diff --git a/database/migrations/2025_01_08_025554_create_order_table.php b/database/migrations/2025_01_08_025554_create_order_table.php
index c8b84f9..57aceaf 100644
--- a/database/migrations/2025_01_08_025554_create_order_table.php
+++ b/database/migrations/2025_01_08_025554_create_order_table.php
@@ -16,10 +16,10 @@ public function up(): void
             $table->string('order_no')->comment('訂單編號');
             $table->string('member_id')->comment('會員編號');
             $table->string('name')->comment('姓名');
-            $table->integer('goods_code', 8)->comment('提貨編號');
+            $table->integer('goods_code')->nullable()->comment('提貨編號');
             $table->string('goods')->comment('商品');
             $table->string('amount')->comment('金額');
-            $table->string('status')->comment('狀態0:未付款,1:已付款,2:已出貨,3:已完成,4:已取消');
+            $table->string('status')->comment('狀態0:未付款,1:已付款,2:已兌換 ,3:優惠碼兌換,4:已完成,5:已取消');
             $table->string('note')->comment('備註');
             $table->string('price')->comment('單一價格');
             $table->timestamps();
diff --git a/database/migrations/2025_01_13_154705_create_promocodes_table.php b/database/migrations/2025_01_13_154705_create_promocodes_table.php
new file mode 100644
index 0000000..1ffdc0e
--- /dev/null
+++ b/database/migrations/2025_01_13_154705_create_promocodes_table.php
@@ -0,0 +1,35 @@
+id(); // 自增主鍵
+            $table->string('code', 8)->unique()->comment('優惠碼');
+            $table->decimal('discount', 8, 2)->default(100)->comment('折扣金額或百分比');
+            $table->enum('type', ['amount', 'percent'])->default('percent')->comment('優惠類型: 金額或百分比');
+            $table->integer('usage_limit')->default(1)->comment('使用次數限制');
+            $table->integer('used_count')->default(0)->comment('已使用次數');
+            $table->date('valid_from')->nullable()->comment('有效期開始');
+            $table->date('valid_to')->nullable()->comment('有效期結束');
+            $table->boolean('is_active')->default(true)->comment('是否啟用');
+            $table->timestamps(); // 自動生成 created_at 和 updated_at
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('promocodes');
+    }
+};
diff --git a/database/migrations/2025_01_17_102838_create_email_verifications_table.php b/database/migrations/2025_01_17_102838_create_email_verifications_table.php
new file mode 100644
index 0000000..0a161d2
--- /dev/null
+++ b/database/migrations/2025_01_17_102838_create_email_verifications_table.php
@@ -0,0 +1,29 @@
+id();
+            $table->string('email')->unique();
+            $table->string('token');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('email_verifications');
+    }
+};
diff --git a/database/seeders/PromocodeSeeder.php b/database/seeders/PromocodeSeeder.php
new file mode 100644
index 0000000..a53e6c8
--- /dev/null
+++ b/database/seeders/PromocodeSeeder.php
@@ -0,0 +1,17 @@
+%eY_VrmXsxIf
z6-3n*o7&`;L;HE1bH0E4{Na`7@#MMh>$As(?71yG@Ql%`weXAXxUr;dP3Yl^gpj?
z`1PL;l(aCu{m)kf!@V#3^AStbqq={8hweX=Nd5JnSDf`4zx2;nyxf85C;WROLXW%@
z{`rXi6^Gb!|GYulS!eP;Z+uDo?@rJDcc&co|6auT-4gFVU*UfxrSadS{PbT^?yKzm
zo5$jkAAb4AJ6;aIob~_5^_excn{T22X4sAYp4;=s|E6T<|4{PZMV=N1{qx+;tSNa!
zZv2}TyZrx1*vpasNW)DotAEL$QP_XCo{ska|7`vD{~i-v+rL-&KT;d|sOH~1ro;W4
zda0+||7P*o?*AVp|6k4czxwxoWHRsLzqj#!#p%C?@a6n}Wx?-V!&D-fkq3WA0%91w=MD!>3~a0fzqC#&;wzZm#u3EsNvd3u-uaO`FXHhOaI0R%mJs#Z0
zPWzRotXUrG`gmJD`jY@_CRyL
z;_#-k{A?-$7a66vq#s*__z>GGJEb&i9-?%g0
zfWgJGo31%7+Apc~#-fw7K1OOAZpnqttURwBFzb|4l%93j#CoPBHNN&bHEz#`ZoWTN
zkF7Q(CMZMp(vZ8~f-A)qPa
zmplwc)7^D1@%FcCkI~sU35xbqDBNCJg;BQaP`^2TOgka|
zOZ&s`#Mk^m(9e+Y9R5*sutw35TnZn!HZhmvXecxrOQIqDYAy>iBh;j_Xc?%*U3KbyBnxNW`Z;
zI0<9f-qh^z4l7y7lRdoj3(Gtzp_WiAPmT8BqJRL!Wx{laVQe9jcpT4AC0G7Y?u&j0ibA)b`$$nyi51%GIez{RxFHxxBW|-Op6ScgOqn2&(~zXxcjTwYL#(`tSnM9-sPKL*4F(%T6ouo$pV9k<~*A12nO>|nz$hr(2il<>uo?PY=eR(<)
zo4Z~N-yS?v5Nha8zNK%b(x$1E0Ki5vY30?^Z*#uT-!d|E8@DiRMogo&%LL0)G=DqU
z+?w0^0Ck2MFz$SM*jDi>NI3v^WRvVjh;PNwb5H1}4vTTT>Z`;p$mm36oRMBvy4+MD
zV_!L)W3`d@L4Y4d-ng^=NKz93o-r4O}`0-I>54Y??A
za1L+6c5@%2;QP0g&i5@G=4I~Tng__iDo&^wxs9iG&NJH|juK;3^cDLvtxl74Jk9<6E
zZYmU_Vp9OX?;<2%^9o?@*7Tetn7z-^x8%Ss=f;_Dgr~9{kzMq+d0n$^*)*=Sd#FQT
z12c~`zy*8Hl;qN)w`a2+S@muXzUHrtb1hNcgXIXtb1@Am_`s(AatokjC602=jVtNO
zPb}2Yvz;&}__y5->LImeMe3AS;R`mU*;v{>4&s^%+SLfDdyG})cX1hRiNU5JXpSTD+bY%+?D97gWrs#!`Q12x|~HiMBLJ~55^mh9@Pd$`38ytwT7VLN+i_H
zCCxax$ZkCU4BGXtrf1v+$le?F{o1pgaw6_zlV++4q|~!2ik+kS)CmUtaDwJ#zF!!{
zq81%?)?2dNb23!>1c95(t%;JwJn7mu;Eb8We2hkaty3V?#=G!>ff82MzM(IbEB@Cu}}bd{KFi
zdOYzXVOjg*NsjL#BO_|beO2*Tj_^UZVqKSH@>o>qRR_OGSHPluBIn%_VR!OsiCe}M
zaNxwHM9V0_O4nloT~%6a+|I4I?F_8w6|a$Bc@6uLXPq^9fQ{W?B@tKh`0l)nir?cr
zi#<2rx!+F~|6daHvfwX4U|4EIZdNObvv~vY2#gJpGq&Nj?nLd^vo0dRb5=nq5pkc!|{8Ar=cuYF&i
zQt2MSdFM2Sd@19VWM;6raNJs=Rv*U%nbW!*7;xOT_)H`c(Dw8jfv+`2p2)l0Zm?jp
zM<^L<`|}<*)*dl6uJ&Ox?&cmtNb$te0wbQ7lp*=dq6zAlX|;oBg#KwV;~vII4LNon
zZamd?e=Ce2Gqe8rBCc&!(d<%CjFvxk*6qP-dr4U9C`Kp$plnd1ueD;Q<8H!BV6ystRiM
zZ;djJEb;X*Do`A3``R8Ze~zZtfbg(@l{<}veAWkeZwXdBO*)~=WY+eSwoM;>`qPlm
z?QZav@{!g5BsAD$aOb8%Kq+-il<=`4crS$)z?5S-=~SYD^c!9Y4z`qeWc2x*j!sm(
zh^sE|e(t)@$e`Vtj|1BUt;-LjL{u4W*hWhcctMMB?w(D_)f!0&qQ%%Y_s80J#_qQF
zB{cg-&T@Yb9#wGfHQ(~)
z7i+uh7{1D6hM6|)5OsXFiH*%*WqoE*$d;LNQT_(
zh_~grp*i`2$^g}`nl>>Mk&+3jR!9J&EtAn@%Q5Ve0T(dE*;yV^sepVJbso4WXw;j11#EiiL68vo4KlRy}b$==`{S8}?S5IDnAs7P9Uake8S3eFq_N
z!l@eBU9RtkxqHD?AUbmCaBZlAK=1mYHkmxYM$kuY8OkUhTaelNUyG;7n7(_R&C`C5
z91^&@q^8Wt2P;~ZRi$K?s=eZyX^S8*DsjHhQ-6P@i?U;4gKQ~U^vJ3&KyL=Y+
z5zhlbCzIrm(%b5Po{yG0+
zA0ewXkG{~rhk)y3erm3Adw?`3aoy$=L;
zTwk2IU>7QHb@+m~Fy6fqa&joomw$v#c6nkQE3NLanZfKT524mie&8W=eXvrGTaV3~dDNtF6G@$hZ`mgwnQXr|F${g-^tov9=)fhhEoT8N={gD#_gi6R5#b|
z^6GKpja99#zp{IWYZz|iYR|%t7mIYLfF60Qx;M-Cq;^3j)M8ojuxsl}Dx7#cGmznS
zd1Xc$@%4C>D$oQe($B^>lU9wK%Hc
zcY(ZJch6;EWSAOr=wkXhIiczvguuT^YMdw>--{Nx%HFt6X65?O(XzclPo3m%sQ6>_
zN;ZDHyIg4HsD~=uv%#KmFCNQqWA+OYbuI*}t+BcUpMlAid!DCh1_-$l@Z5A19
zezNWw9oP3#5PHDHG0<~s3mGCUmTJn&AjIU;R@8f3EMW`)H^R|51JUY0-&=

dT03AJLOfXNnWCaJJddJmsZeYDvq7Svy>;9wfc8Ro;qx zu%T?_T9u6r3s6!D-p!-(CQN~DkRMcSN&B{BNA>oTB!SG9~B9*ub6em@DG~|9s zXoNy0yBG_`7UA|{+plp(ig#u^&!{{IY=4V$*)`-qRIm)TZwSwf3gWS`f$RxOO-O_> zJG;Huiwm8J*~$4d=Ypa|^veE+mHd1Bv#($05lYLdn|FJU5_e`lovi&uc#`wGVjZeu z1jRPDLzTg5IuM^X`MqjqyN|{kiOrjBA?llip|FclE(_27=ITRWy5yEpUNFrsN!g_D z&T7F6w+96<)=a!gD6JeIMxs48^SG7TLV8u~AU!l%?JpKh@8{P<^)s}R+OXk5RJMz| z1|Mf85#8@tpIEwGDKAmWdnfyOcTOiUB@uRuIuqwnCsXw2VvY+aF`Cu^fVZ?4^-_t~ z3kI)ATlBC1<=q`U8|sgioAK9MqdJIS=Qw^J`x&x(xU-oRm3l1yh;1fudvsQhM0CN3 zBcxm|vr9MZ-heq=WdUV6T^&mgU|e_-DU ze&l-7N9D@;yf?XjX?k~LI3${>wZKlny-KZ|key_-O0~A5++t*Dd}}z>`62Vt%al8w0txQ*enzK}=a? zx${??mBAsH-_iwzueBz~A$gM`W__Maxrk}jAGx`|xu%#rD+1c9cn&gc&!i2xWj=anX~DYRe5XEr`wt*2;FS zR(_Ct(vEm(#g)f@S~cHg>D#92H0`;ID+h|1p?$sI;Aq}*`KgZvIKo7S)1Rf@2oNcz zw7-~X@+bWUT{$oJ;tXL+h8Ch?1qZbscgiO&2H=$KS$dcdIY|-r;OPqF<)k2u0wl^3 zJ`2426&TxYw$byk!KtWtU9YeK@qK{s?<^TAGB2sLhX+%EY|>D$rf zy#tzta-WOqk~3f8{;0`qDziSlAd_7YI5)NJ<5{F}l9askyZF7K5iE7h4zN!%pYbDo z*&Cu{ULWG;X(B5XBX7>7Yt!^zjy05pUGA0|e22bw|mM>q`LUMpt!zVit}ZG5}XA?JqZJJ)1kg!no%UNht!6hDwVA?t>|n zMF)fSrv;rg%8%ws^F^#WP;+Y<8G;y@%)Tf(t7>8s)8!VjN3Y`dJ4CmG#m44qe*ou%h-fe38 zFo7Y5<3To7DMD<_a4lbu*`yU_?fm&(l+#sOP0B!gDQo3$7wqmh&eL<@$1TzPLZ$ z>jJ;2bl9mDx$gP?Y7T%+@woFweTBzdQG@-dnyPvl4NaZKP;Q0Nzj4hjpQAG71tA10 ztUFW!oH}Oxf)C;X@-(6>Ax42^@9^qF-jada7FYW&^$^Lo>;?6PC-xiWw?Lx~K%FUG zx~c&SD-*&+SQ#caD6ZMDGoa)-b{hFueL(zv7fb>pq4nl3mws(Hi%Fk{qZ?w-bktrI z%hb5jv^}Jdq#v_+m(jlX#S)ACLAdh7QO|@xqu)==jEops-exNuqPc%lNR!%_2Du(y+KhdO z)#GQE_tvz_dC>}9VhcrXFMxrh)VPSmgbMz%o5xNP9C5z40ESn*T(~i@b4q0Z4b8=T zmp{AYOdxM|&Z5ZogzG@?Ms?^{N_l#0tY7A<^}dFS1a}=Zzrfa^odOlI0Fl3o;+GPz z8m|2M_w|SGpQVJJ7h6`^m9ag3+gwrSfArmU_xv!A?=Vc8Ex7Q_(C|$_Q-hm8$LirW z=Ro0|?89s2KiS!Qr8!p~z1YTvthGO6f32mCPKcHl4t&&vr38qR5Peg18)A>oXJb_s z%kc?Xno*WScHjN30QWb~IBb{p{zwmIg2arGo?N3#4mfjKrbujjZg}%2D-(oi7tGf%eUppYEyYGTZIcE7wgN>C;N}Vc#>j z@Jrv-RmlO1hkBMO2JZVXt9;$GdlX8K(r*`bH?0nYv%qiMN zBpZND$We6--02GW7)dZI#OiX-hVm&-#{zO1I<*ZjDF3S}FRp@fjH2vFPt;)>gGmpR z>JMa(@c67R&U!X_6!Q=YPQIWTez&|H%1}cO1M)3Uc z*bIQCi?BSPwXm)RNsq>E3MP#zixf?0mp|Nl;S#Urav4LrGK|mqV1-e?swjWi9vkYd zxky#(Yo*-CpJd^ESK@<|UMZXenFf23lidyDn9L z_BXa=WiFU#Twq4f@AXwY5&<$qUQnXEeQp3p@QN-lJAt=dR$s~qZu4R)7|yZjEjv+ z1&|ko$@a3C##IFDdDyJ7?4 zpJqs$yyBWFi#Asg*FcarW~^9~J`RQsjm^8@Z!-$2m4wecDAdi^IA8mz*4%Wz4WP;+ z25=Gb<6TFajX`P4S1~o`NHg#ZqZU!g6aV#8lV<*l=y9K z|J%_Jb3RbBFfc=7eI`!>(|E4Z^+*H&i~7Z0PJ?t!N=?1HFlyCO_E#G{m~-{2hD-Nk zmSawGZU9ER>(ks6&4ZSITTd3H+dr|?FX=;DkuUyc$xHe-Ok#?AD>{HA1isSBF} z-|kl^Gl3^)m4Y&S_uHP<&R;>G5j-Pa1&!X1X$_uFgE1vgi?+JUO|X_I{3n0iYeUQ7 zAqyf!@PJ_JZrfe!Kt+fyI*$HlHb5Q2op$cQZOJ^`y_))ovD8?4fx+8Vmg9lFp~#9ue`_h9@J5 zY%e)*0%=1JRe!-&VV)WW%7;kuu->H%VYeE zEb%0-iM`h4a9R}i))#%1QMCW28v?cIs2WvwC;qzaWx)qP$w>8RF+4+-|AhzWWCk=a zK3@zQ`FIqkO>3U}rCc#{j;R#!0NEq%c9iq<6loM`kf`f>jwiL=<3;L+**zEZHn{gySjYS zOU7@ZAC*{CpZ$Ke=o{X7Cs$o_YN}DPOzUz zIIFljSa?o8i1LX7S{Z3cxpz9sX6`$!P{elu8ilk*zOew8mN{}RePzx2Cled!n{wC? zj+2%c)$+(Ub~$Ebu|cOO0s4txSyycTFnFu-al&<#Ha6d|B5TtG>oT!tF=a^-_O`|` zSUr}h20E7_4e{hz5PU?^OQcMM%htb7F^*=h{Ow!YORa6w#oDh!P&fi35(jvNec0fT z>$m-DW#05QBxG~Gms*MF5z%g^B^_-hbxrk$EyHW7|X#ptL>j$o?MtnJZ zx2f1S_>i9QB6qKyP~%uCVR2Tix%NrQMpZHpx6XJjKxuy8nO=yJ(%Av^9HTXUUX0Fr zAHNZ^KO(b&h>HGOiLcZnRO}2v2fsV#UmM`KyBYOMjseVsht}9I=EhvZu=tK_5J~;2 zeO7^G9|2*xX*$@B4sUU%*#QP5zEmpeASbMR3-*=8EAVzlmm1MCH+uRi6JLv4RG!+v# zJ@+#gxSa}LN4-g()}~vUpLzM`1pF6Dxd=o{s$fpvD!Hln;TB%93M{-3Ac?Q@nczkxd3JT*{U_qC`aM8k^8qK zVuW!v$Im{dO~6Gslrqpfdc2*9%3+wXc_mr!FjFl^=T_mw-WCg=`)O@H=m)Y)>3S!= zKCY?ETH5hzo4E>%$@x#xK_<1REbN+uFL|Z%ceCgEy?K}^l5(a`VvtM;g>5Ad&rD5lC>?r97DjFT88ewJf4jd*YT}Z{*Vge5`0hfjH}yLqwif+v3X)n< ziWwO<349;kifj&s<#WH+M0aYEHPZaxZlaXS8*a*7^&ms@v0w}Bybtm-&kP9KX;^h; zgy|#K7f%jCxTIZwx;7)tHi!P0z2(>^+#gJ47lE`ru~p1Wn9}7~w48*#0r1yyFI?Hw zcCQ>2jm)V1R9_+hp;bMdq-hWuEk)6EP&y+xrjr|QKz!>$B8m3KIy*Zbfn1E%6sKIH zwOb_O-g1mP_cnbNQ`B(n zXr@rccu_PbK&B%qs@GI1({P{<3ca5hn^hv8dWSdG=J8x5#GN#Rvj07*{H|h^?>K1EzYSdp(*OF}xywdm~@E!AImo+D!}9H`MQ$D0-xN9*n=D=OV~{8(2g zah<%^FfW>CVlA4$AFsFe4JuB1ptHjROb84>XJ1tT^5sA*2i=AL$tImi!)_r!!Bt-qbzm80bc>Q~;eSte1fP+*qIB3r zRI^fQzF`S;HsgG;H%*~-b^{kfKl8k3`spu0iOib{S@wFwKO!3V58x5#{)&sb9ord>;R&5q3;+fy_l<-_}Jz~;vu@{%gBYmBEFd(%%cBFRH-rt zhi|gsOv4C=P=OXMCN8-8;EPp}826k@PYhE`-k)DLswb3Qf8-+SVhV;CR5w%UiSwabk@#~LoHU7Lj`q=s z*K0A+-QpkAX_YkPs!HHDsHwJEBlo)2)f~qK+~6!m80j#;&0f46R)9KYVrLI6vFH0B z9|yEaV;Rq>EOeMtcBBbkTpZF#yZsr8OhWbcqx}qXvVqy}yMdbcJ{cS$w4-kYD&EPQ zg;n*jR2#zat?g5RPrxb*PY)jW)p)L}3@I_vP>IL;YCRnY5QcSh>otF^#HcdVhgwbj zOXdsziGqF6`VIxPdrd@cNFtnuxQ?c==B@TfBewh zIQCl~trf4Q?PYY8I78%hZLYumaLq@*2g^6%6rsWHmnrl@7hO1?gW_f7+jP(hDs|n> z#dnV?2Pb~iOpVqscef32ytDePNJG>OFEa#%N|HlNKXtc(q}VDaKUQ2!l~76Rro8bE zJIaYEnly#80I#M6%E`H4Wf>tV5WA@ij|+@#4E9;Ab?Nx)aGsuejV|^b5xVF7{P^X+ zcmU#J>aw!wx0VUoboxSQ9_|6bDzAiVZ4YEHq&%me_dN6y9m%yR+Zd+!;)$cB$?2NM zd7JzF47n!E_4eYVpz?}fqi^FeKb;iiUJ8YOM|Q6Y8v>MM{ndLq3NQA)FqiNeq#qK{!`U1C zx$Pd>SDayUC97o9ANqN|lgLLaSP^+42Syg%uWe>|dcvHm!<@}%-kp{;Uoo7kezx1Fi(Vh*1{P4<(7klVoDVmcxL(%y)Be*)a+E89D$p zd76~qe`RFqb7T>L=&UjtzF5$2zk%Id4A8{;n7cpa-9yM4BcU43|a|0JAy zDf7qoafH>(swG<`B`hFFD+0OzShUxMANTLO@|q0xm=BA?Mm}f8(Wm5NZIcU@Igec_ zS;{q%V0dPlq&LxS*-j>(OT9lmB_&^EPA%?u`Vr2T>Mno83+BoluvS*SVId|awpXVx z5~9Gd9Q8QK??A|Gd`8NdnHzq6b}B13tpKahj~?xfBrgCY!`f-Kl$5HDRnLwp;nh?- z$9K@%x!}R4!xLuWl_t;_992}>8V>}iZ^9z?EV8a+TffZ5Co zx+#u^;dC*X!3Vtse$De&h9e$>VX$v`@Z6|`2$i-{P=B|~x9Q!dThqNF6t@@0agIs) zLG8g`%a#L7FY91uKh(#~@*OOdPwtN&cM2!-(82&k)Xn|6XOBRp-pPgtNq0_BF@qUR zv`l+V_B|8rs5ystdnsD|szzRxT=q5baRMO6YEZf{q_+Q0Yi#4QfaC~E)8N6`G*Fu8 z#Qw9o15_OAfsE6X&nMWq-r%vCoxQFBffIqP85uhWQarI%Ym`B06M6EBulcFFyXJ0s z&#H{~@?E3+8Z${aCNW+Sgpu(%<{nB)T_81FSu32P!Ol5@B7b#K8Li26tsZtuB*d*$ zjG(wANI`;P5u!Vs$C&1ZO3#B!ltOi6J7c9TlP=O!pmMzz?P#Hx8BJF;lx&jcHzz~o z?YPLjp(Q0NN7rOME4jLrEJFwrR9U5XvZbY6<^vgehY@*`=|GtDSQ z`*Emz>iFzF88vxjtkT3m@#CVouiHcp@Lp<6gOEB#dJo~gp+GfW(SwD%yMmWb#*=cqeelE8;zmY|{f|c|cGQicP z$E$|~G!9sCqjLp6sL8j`YR!&@-e**mk8~TSqESHu*Y?e`s=7Y{Qsed) zr(UN782-k+vDw;$d?(Yk#b}$uSeHZ{vv3_#{ z2<;F7%9eSWS+cRSfr*OE)?18iz6m%1-hh}HCp>>WLi1hTHFuiCKxuR1EB$q1xfWnr z6UJT(42O4>+mtTB3mZX?O%gvdc&!D?(EzzF`h|}%7y5y3cj^rm0@R;9hG>~v)#m_1 zD%T!^5e=hejTD^>E%lIXFF=|M*DzvXmxjR`YHm8gL7b_1@O{qcOJkq51-5J9(1Gt` z4%ttAuq%C`m=*OCMtr@pdB}bE4UfrktEm5O!$tK3;|rTv0RakNsa)YOF5RNE6j}j$ zbLF|z>J~yWWc$m6%Ga+gf~t%6$1^pzA2Qf`60>12-LBuqTh#qZ({_@~;V^t%ddAJA z$LB$5GpOJs9|ATV?T+2c#>`@AH{3$naz++J3{+sX%cXM#p3n*j*}x>W7$xZkq(AgI zZ`rTR61<7#a8Wk;rVM;oMr!g5a#7h z1XEuN;+&&R+9DJlBPiRIn0HXE1Yl|um=RaUi-1zE;M(&`QaSEPyv}cDU>REVsL{JpN8Jh^>%)tpFX=k{X`ppi9GT~<7nuAFKDqe3CTYfk+X)*WrHCzv zjKHDix06ZM8p0Q}Msn4;L55r5&LUl`;n{gZk2PIVBCwv~vi@>PBq6;!T$a5faeQv-M6Gc49bb6@u7sGzMX9mfH!-cpiTI9Bs zjB7YBfAA)W-WOYIyR!mO;3&;( zLHqAabDtlpTEaH)(rGS56S~}uVwDpHpGg4~6=dQ!6rJX$?3Zz2D@79rs@f=*Fjn zZ5H(e_0tUm&P=&lm9YCMj~=hYbr-VQdq_Rle|>XR*@E04D#Oe6+uw5dviW`EeuTw| zNY;qB*6GH^eb$-tX)ylMqS;*$c)$$MV*xbDx^Ij|7D#s4rZ7+wUkk+J%%4d=A(=Fe zn~_UJXp?XzzpCfq0#YJ?u#w@RmCz8#1*J$XaiVeZ2oG!G`lOqU&FoUQen<_me$#|} zBi*PypEy&IhI-}Hu1Onz*)r-By^}Dtf%Av`Q2bQI zD*rjyAtm!*sqrxiFuwAW_6bQB`M(Nlw1+N;9Uf)XH1P-Z=^C*HwL6N0iW`CT|B;UEs{I`iux&p6LnVoc$ztazylWr})2@NF7*B`c1Et9^~%W z+&)+5?2*oVVaRCWvVP)11v5ux@)gv$CO)vPCez{aun2#L+|+H?-@m~R7{v5NHSVuY zG#v$yV&(OCgB>GtvhnTRd3@n<)c1YKmJ$4A03Fu|CjPfJKBW~+Bl0?lX-Tk(^owG;m4O+N=|qTn%E$j2YJD1uF{A1c+#vMg#P$H(vJ~ua`li%B3PJ&6Ww9=Ro>DZEns6Ntu4+MY7uCHroh|eSnw$bL__-1x% z(&Ms95QX!!0ViqYPWdC;3z?yYv>00lbHl6SKUKHD@226}zR*e;h*pT|i_2w~(OX@J z#GM;EUaVR>+vB|kulACgJ5v%K8%eJy$dSr49}tAzK@%Qe5n0PQ-|BfHPiMEkgn6Am zMK-&Yw+-gdDr^9yk8Q}5d|0^;#a7Yz&dzMTzH93pMvOh*kjt0>F1MIBkkJlcZ*Lo; z!IWGhsk0f|wZTKVpFD5V;=0_+efxOR}9G8P{W=r=T`G<>69(vhh{!$cj(babtiL@ z+4#jN6lkH>ofcIYuPAa9lHEqU<|AYy1ODqPI;0HKr@>(B)Aq zVrIk5#_2+XDPu~QAO?x(awnv4DU%S6$Tl)O7+tx|jW_A*kw4N7k)>RY_JOeTT(i}L z&rU-g5H496bljM_yF*mwC?4kqzpze=&ydow1)vu?TGqGeV;?TJ)$(u_3-2U-ma{VA zQx3N1)n;PG;R&-`oQ0QVR{R1rh&d3ms3y!Dt-j0zeH=yJAfb3fwcW3Bx8hq47S;*V z&*jC+ij2RibPSe=Ej~ey-LR|PTjwnF@&-d5_yioSWVLcY?gJZ*-wkSg^{}NLEk z+nj{39sZtSycD||BaqD3paR|G6H0T_XcFvx8?$L^hfEe=d z3`m00Ia*pMP=np1&uonUVboIOqkO)<^G4L*TnE&^rG5HSZKkKvjs z#XRp_f`m;e`$A?Oycj#vwhqnJm&+L%$Uc)W2c5uz+T?S{s^v4)JV2 znkF&;bT7ov=1lPneC#_Rnb%MS9CA4{b6nv|S)Y`6UBE>)$hif-& zjWYCb4d~#$$HdDRgGOIP?_W>($QC=~VG=`^@j}f7G}T7%SHkxl|LsWnxrOE0>IyqSQc3{FLMbk%gcM_K6bmn>N&g=d(TQeU!n3y5p`UWo3cb~@5sqO z!>!&dMlf2s@*aK~=?N{B;8?bgwK31{o1P3V=6)=LNWyC8qOwK&iE1{)ZRbUcq!^|?88j?pP9d(dR+vV>Q(n5tI9zRK4}2HGxuj-RXu zq^h7ip&gomj+-0M%@?wD>0{qAbk9-gO~0msxhQ6Jw*^x$vgHs2t+2|zX`6CZPxn_1 zV0L$7w<^LFx>e89)2ltsvZ?|GB@^8g4}y1WT7AK&;g;8ky0o0VAwIJcDSi&V*?*FM zykyrTPW7k4vtiR)4=1^#njv$*ZhO*QTrH%R17w z2Y<~rH@M5ycAMMg*0i<@WRvV}0Z*5H483%~1<2*0@U-d8e%O>-H2H{6&+~;=;Cw0i znom#6a!uI}vkY)L*PAe4Ti|o!Yn!SyM#`s@y|psRj?<{TS8~~SK{0QmX&Xt;<6Z7Mw>86u+&B*l`g^=vhhKI78> z_`irOt?1@*l36+EA+U)y>vZHP?S^$!%$$KaqO;qc1{`VkS%LZw-`n>(TW-0$XVR5o z*NXGa+I5|A8)4~a$6?4%-bhNWBJpa z5k8)+}vPZ-mkv*;3ZuP4$U_?_w6(CVu2>FV1k^W+McM5K>#7&X<222 zF<#1Ynh$Xg^4UZPtKOd7m@Pj~YhWxymvl`X@oC8lbamX;*%%D#FQ}XBwEx?Thr4Kx zPB5;U+bUAI^@L7H|5tg%R*!l&`e6&?CiwhUC6QzVD<^z_uzJDAylopP2&jET5* zS;S>GQFn6IfbmMvN<0i!F)xhik-!RZlDuP5A11iD(W++0{b#>REV5&Ph1zmTeS<8o z&BWklhgg9*bigfT*2lcI`7PEp*E2DQh07kvvOG+hmBa%F4K@)+d7B;98PES8Pv0HS z_V)jOKi_+MJ5-gTO4X%8?ZzxMZjDyVioI*k*lKfc?Nv1+Vzfxqu00~OwMv33DrTa! z2}#W$#xL~V-@`xo&+EL;>zvnmKA&fI^fDvM^xAXC8H%qVr_J;K+Gbf#I>s!AQ5zZ2 z&!Q4_-)ltHOUGA(P#R?`R>eI;xt){#q3}FG>D5y1;+tF^8M(XVEgjAB0cEjT!Yp}O z8rA-N764=~%%aNNKDX$u&W#o!lb)}^Ti+Y)*AyP4I}OvZbX?8`#t4Bccb=Kg)%*HY zu|x?Zg*|?xpIXoD6*x_5WJ1yX^pIiWcmX&1Y0{XVTj}46KtxNYkOw|#_ zRu%Uw<|bpa10TB8a#Ym>#EXker-HK3&!U#i#+6U4gswMuuOst7*R@ZoGR=GyWG$XO zPSqfC)l}Wc?C^g{MT)B#x~KFBh!0h1r$Rh(hm+bK9fY2DJ~k0g`L!(X_-~G7i#BA8 zmiB|(t@7HX#T3McU~Tz#)0m3T3!Wh3DIb-f(M3#)3TB(^7Tp;Xh|EoR|JX{27_llE zAFTYga`#hQUF{&h#Prj2iYw^Ct$(=x%hs4x)X`Gl+HAOD{eaH^%*I*cC0Y?cRDI#c z{<(2;bZ~0Gm3H}=?iJ!?6GU?%C^3JD&p+^wiJ8`jpasSMfdS68rZoM|`uVcJVBnIh9uLur$f zElQqiPPv-Z+DV^;v!9JM-y`qRiBkfCG?BxIr%^v~|L}h6J?R%0>kXEIC>jo_N~J;F z&7}jI4GaS=Z)(14Y5zrlj)lC(quAW1^Q!R^ZmsnX@@){e5cjNwHN751G_xW%C;F|R zW6^@PTzd^qZLpVeg>*faQ-F%KsxMruyH;!ndE4*3uAj54J$Nj5EA zIqa7jj*X1W269dtK&Y0ci`h?~fK#b4vM%ebk&GGn;F2-Wm zwkB2g$099wa=Wyp;%a~l#3ArH^<8(<*&%KKy1H6FL%OWRg!T~@-+N4lmD|(ZEp5~ z9$g*Ytm_SRps?!;3nx84s`it2s9rg5)pZEiOW!>Y$uE}JnFnN~d&2H46LIZ4-V>kl zl}0@u>2K~XJ|ykd1_k~+jC}uUth7Ec%TCDi8~ilEx5CU|NcIc}$qCdfEwBiPr9l>W z?F;o^rxiuGm?3Qv=wOqquXGNn%XW75P+C<}X}wtvOZo$55&EPjt6x9j%>zIA#^?6k z6?_$=9wDneI2C4I6lL&p%L4xusrie`Mfu(mj4|8hps}Dps^AkRI{S(AppLqtGLegN z`c{1}cKSYGFdr~ao_>Z#q>dF8Oc*uo>C&6Gk z-a?c|(5vOY@r27L&+h92MsLCRb*)WG%_jh`y8Ze8)3BF$3`^TzX;|P3WSv*kLdC#~ zM4F7=UoAEQxmIZ>lefP&@DzN1AIgb%P-ifz7#QNdl3F2hH_WTzLDxfFBY-&3xgfk-W~^ zpvp}vzWOn$d@IwMyYprxfQgn`}N ztqu70kF_BBkz`x-E7#2n%;+H1&vFRzH4J>=QQiq0H~DG?b=HvE3}^^f0_|YZaq}Dz zhV(JJv*6_%zFVNLFC}i1w)IWWj3BtP9Az% z;D#-=pZq#*rRvmiA8F1O zV?{^vcvObaaUos=gvqsHt+Ig}%_^keSmsISOR%GfgJ`s3*8!FBR^sZwcfFw2r|R9~ zGx|ImR0ct<)HFw_8S{JBO(1!?X+iq?MWs3RS#%D65$V;PsK#r1u5a+}A5 z556c)$ul$7eMAe{EUC+`#qf(6d6O@WdJz9gRG;)z#PB1-~vY#_XE!4s2!%jUk{UG*-XtIl*I}CK$n4Ipbe#X7 zfFsCUPd|zHkH8x4NU8j(_$Jdi@`-sg+%KT<#M-^2=MhtF#8*fO+AHU)vR_?eU1&ez zaK3r}nCMv1GrK0%zoyq44*YGiv^hT|WBk>eqUF!BTIAKgGibR>w?M8He)i&QLT-7j zU&JxjLL24*0Aay?9iTd-!d!_3ns0_w=7# zUfM0Sd~~($ns40<6Tq@~OuKdg9j`(4P6+u>4{Dqu8tJ9!?H37r)l3k~?jX~pv2?6T zUuWsyXIcXVNxSs<@bJiX*q=K@pR*qWz2y$2!o^FT(q;rc0jrM}mDlXe8{WegJL&bR z8CjO6@87>8Q0Vf1o?w?pwq9XlC-Y2`*$LTIy043rEY|L9)g?u;msUUZi!*eolCjZI znBBP1l48f^6ln)e+ukCk`9_+>YgS-Ab5ngmqyC^`t)+mw$B|bUnSm%pk&NOm+ctTD zR(U{pvIm{qc#dbh_t?EMa5o@sEbLZdhk`&&-X!IKPNl$b1sP{CPK<|#?oL8)0rI}4 z+ql}5XriurFJRpIxH8tR(jrt*z9-)kk{C^uH^E!%9{PpVcS;oB`^3xs;bD|G`b z7#&_=E{6siqNUAREeEPqC)n54V18@=*ZoX$?wNK0KvJ<*XTlhEGBc!GR-`?;YD~X@ zyc2>GqKCg!q~PW8@Y$hTSAFq0B3qY@Yj*kQq{mOPGaBA+f__(Lg$s|nv#Z;4-Lp|% z(V~|kZTnlXsba4XJ$HcSL2D*1t)F`!fU&TD7%B2P5DW9&I13&*I!_=SW}hVr)Rh@R zsU5-I{*)Lc@|IEhZR;=gF#KCqf-&ZBG9lkZTYWfpddyy=9ZZ{vNbhYmP#DKEHU4HU&yblFvYPr0)IMuVm|o|C+su}| zZ;benpsBv@XZ1R*V(LMYdT~YL1Jlqbg;w;t_x1z#AW>bBXF=ivNuRb2n-OmNpd*c5<&C?hwhkvaQw9`Jfu>}O2*T5RB>y_hJON-{eZN)vc#NN*stly z;zG}PNjLr#Rs1;gAJ=oD_T-D=fr9jSuU9}-mcUc1iD~t{Ysw}r^DkX=@=FUARar_a zs*>-n+B0;@T2^4Dw)TVK=1UW+roBohK<@fTv#Hr>&HDL`(@lqvIw65#Wd5)~|I)#i z=RP@rKDUx&^|fem(@^GHa!(ZWZWKng_)=Q>CbLs%G=0(&7X=~o6-43y%gli*&P&-$ z-yt`RsxdQGT9Gdx>o5C8ET<*uG!Gc(I%@U$P{}QpDhWC3>saMEaJ}B&a8;)mSW%Q3 z?-4Ye!g>)3YPkQMELe5zJM1F!mdb@lK9SLOE-7M1>OCXbtmvs>ama?WPbjcUVJHXr zY-X;0u*1C3m9$uM)qZDbXr{#~qlwD^+}XiBhpk+5RaV*`@Az`ptx9$Ah0(65Vf8Kx z)=0JvE^}GG%espOkg6q|9=p#}cG;$ALhV7ukIQ{%O z>hh2pX$i{<-I>vXZ6yN2LQCcTIllr9aeeDPn*qh+#VH%zZnx>TL`a#SlbYzt0#toW zJwj?E>3`Edg>q+qBb(wAE^dTx&h}vUL0IDL-z9|PJvunxFL#s15T3BE4@~VLuyfc_9&MMvg|(6 zhb)&xEQ?rtM{RkF4|g5?4!#;JaM{WkmEs>VlpW%px_lT+zN39R?q{Yn?|88joMc^=?08IiahEpJ0U>l0q7=#Pb5C)Fh3S~` zXne@x#pYAE{=a46hMXom!(9DB4NZMZ+sK|Al-GwLPjo!#S)LjxVmeB_|~+vHlJ z$PuQDibLiNm6iA@WSHG9m*TUbPlmnJ{;yQ4_Nnno6Ew7xi<&DRC!lY=(97YnV;A)y zC-BIHdh%B^g1to}j8458UgzRre}-9)PRJ_7J-8ZRCAO6>hq!k< zuzo*zb5w6MB8Y*P&xucA_LLYm)w)|Q1(V8Wl*3c#+(;bOW#{XTEu93RtQp`g^ZP zVgzea;1wcZt@is*sp46m|HN-6bP^N7t(BqoKD@*A+gZHHVA-*ZB-JEOGt1AOe)w0Dy^1PV!eee+p!TjU9IWVVDIomU7XJ zN=?vw-&G%SDtVL7y@<`e{iyHOiiWeCa5bHcCoR&!V|!fpp1pi0aLp>T1b=}J{6Sju z`E-$w`V8eJzAs;S8Y7`DIh^-?xK*bdVnM~<=HrW>nX`oH55Bn01uZ@NkY99{tc1O5 z+5OakyC=C`_!gZCm+z7TbFa^`1kGkVPt{c+sawAA zqX)OTPJZ_Zy%mN9GPhMd=CM8s{6ls)4@pPo@V&h3J8V^Ffo#PXwsw8V;CqmAmTne zZWQM&COosfBfuPS+2gb_>&p*&*U_PO73S^^MwvIDP`Qk%23IXjEl7L)g9o9Om9O93 z;ZZbBHFq)F%}Mpuk^|Hlmph4_kpmq9c&Zi zDV2<~C0Ydxpsr>m4ovsJvIdf4dOznDyYB9VjQn|V3R{(z|CP}AQHhV#yqAakveC=Q z#m+X)KSU&xvlE1#Mm3(Gv)#e*$-LNkZDl5O?vxpn9o>QQ^aRsMS2J_*NO$klPx|^V zmji=Q9+5KiNuP+X$*!TcpA_9pttw_okrtJaqPr24G!*=7XX0A8k<3$`Wnhz(M=M;=VIf0W(AZvq7-hxpESV<9Tk%jQQOYd{qAV{9 zSsQ0GW4i?y4h|fa2fHPICT?-s@9Ms1Ot;%Nur|3_-mIY}_bVM6ukDX(T*Zpw^FFPg?Avwb(Y8xj&f9E~5`md-M3dbG$1|r=&5SFzflYz(Tq^~invUyi z$BbZ7fp2E-0AWDA*o4DnE6(OFR`CHi*nHUk2|$d6E4-le(sv2KMW$B6_Fo<#;!M{k zrOVW8e(Tf0*EbBe#v}|MMO$Y#1K{54qr*W@PpT4+2k9+7HW+DHR`*tBEgQiO)kK#h z6b15`qHwmViSe+SQ1nI>&@s8HFw^v{{->2Q>khXu1P7lgYBoZ|4+)9@nntfk!EnRo#MtUmQ7TNTM#zTr^2r7@zcVe0IW+OTFhCFnn9)Q_5L zhzr@{98G31?{>V-HItP&O1y92230IdQGjKWh94LS=|i5Q{Adk_yN?j=7Q`wXf}IXt z$lwWNBi9YDeSN)mudyD!}mQr{V=}MZ0`W8Df>qsn_O4g^fX~u6ctu&AYYmfGI{a zzY(9LXTI^)R=_@oAuHQnMcK;FE=tYS|J(@Pe8*;2HzT*N$c0z5qGDJ;J=B;oIitUz z@!6H~H{ub4z0J;8h%sGLQyjf}Z7^9moh8#-m{C{k^8_`d>%9P;L-wR84JS(19yTgf zgw3@EgXlV`PXuB80f8TCzW(kTKjojW!gD zJui9x{EyV0->?1z!OHySN*<+j5e%@)s^9c|tv-ah=~!!(Zd}4@FvZ}r(9^V$9=vn!0C!HN4ILu#(=Qa#If7PH?Ej!=Np%vvPN7{e)SeKRa|Be0n3WK&G{S@8Fx;QIDi}{{tB)$>5ICxfq z@&Ce>JWABnfd?yUza#tl3+nL2wBK;=^gn+EKGwA z4Aq>-TzbIFMK0|Nz@wts_zF_?rMLulg2%L=2?>cJJY%Kh7*HOSxODCI|1v7PweD+a z`SV@cVz>G>Y8;tx;u6?W#L4{D zhGbw^j{GidO_qRMG1v{1nM!8y_FR37Etgt4<`)aC2n7@{*>V zHoL=Xue;8Cl6WOka|HeD7?iNo{~U?`|GIwSS>p6M0^^Ng^ylx!dQaZf2PK+C^H5ay zaDQwkl|&Y^$Ygt0a70MxSKDd38{4yvC<;YPn?ok<<|*iUn#XrF4^;MJPd;lrwzB9P zHwmHRANX^)&d6Z+#Q6TZ%$u4cm+jFET0N|J)0}&%Z8G)@$T6*Ec&M>!$}Qt120*xH zz6@tffI&`BHNypc;b8B-13>ClFJ+0{>-d$UK{AsUgN2wj*dAY1xW&A-b()DCEybH+ zbF#j?w_pLV%!hFAHpcMlSIc0v@M7WsRYQ5q;PLCr2Um7J_@tw>Jz7Aqxq>BVb$a{L z%X9v%R*1WYME4$BadXOswVsXrT$cH~J$H&7oUQRotJmTom`}iY|A~z!lMtsXGx}l+ zKkoVb%bEYnwsyZEBK_lSVe_mn90JXoE#3#;qvW~F3-s3yEVj~EWQrk}&K|$KM*?~H zCptNcC(;z>kTS+!>|GBEqQ2DXL}NpSa^%S6!cuZ{uI9$2wnFCTwW=Ug2%o?jlQ$xS zV$t{eCEI40Ndj&_LEZa!J2Y%Mu#VASh+*L~f1iihPkmRb|6k`j7|0cuLP{ho0)BCD zau#sL?eKJ-;%A~9!y6$W%_X*l>wtPJJteTezSFoncol$dT=ia3a^9ImJM2Ck)~+S~ zk8PcOxYBa!pmj5k&I0oLk*itKQHom9GmHSEi=d@j@zN2qVFFa!T8Y$pfq27{b3z2CxQQWWKgb{ z5L?@xyQ!=)U$<&8@b!M=hr5_%W2PMf#_;wdYYViRdSkG~9528goc;~|K11N?11D(0 zI$uvmdL#FHjW|#t{7)ob($D8azFGX2Y3;eHh}{MwUN(=;FZjzqwlWUa;yVZNu!M@K zFT!jmJ)T{5| zAAaO)Y>=ZVUFm?z#opH2IQ z{r3|qY-;Y0jzt+q9nJ&-vNcO9jud!baq=06!OcRyH>biSnGrc-J&EqDgWGzjhitqC z5wxqZ!tx$dKHi6VdCL`_drD3O^)S9`b5+BnO~ahYoH8Nw`t_%UmiYqbTyb z8JX)S3XaOjPO{g=-e#z7+$0`2cX40bra$`rt6B^6;^!34o*crn+8RSx8t96ES9dC% zIg39}<5S*CWj%r`sP&BD7}{JFLR{WBTRT)|NCL}+yY|u!vcEiZDF?N~Lq-kRoTZeB zO_JQu??{umdEGVZEUWhYXI%KIE876T9)n51)O^3(943-E>%V_JboX@jqD1@_ z+DM=zB-nuC-W~t$t4=dpZj|z|v$`CTefJZmUVc*?tZg57?Xp$@2^r!7K{!<1=QB?K z79GPsu-o|eo%D`zaSxr@0kIXju86sD!qD#GUwI2|+;fZkbfm_w?XUWxwA`;tB*oS& ziWZn~i*fdgH6M<_os)oCu6&@JNzFTV?r)ZOSL`=d;`GP+zH70cf1+=p@*N@)o{Zs*%J zqhxyxvPIAb_IwsbugeqO;||}5IgfSzGJPWsYc-@-AA^Zw@zB97js1hSG)tC= z@zLdrgeJL;e{y0z!u|idFO;SWohv$AV}sTT+A2B+1Xp$Fdc2e0r%$FvGoO4~XcKhC zLDeO(SZp5vE1=G!YOU*#^|4gLy_)`b6zD$42-5L@P71%{O?6jIq_sgF*xF3tWCeui zT}$%>;NbX#HXUD_Z+1)G30kT7#-eGBH7Bt`ps)3ckB$EXrv{9%iF+e*s$QSxJxg?L z#Cy6v&?+F9jXAX<6#vJFk7dAkoK8hWTN;m0=d5o`JCLUzBexd z>V-X06si@|%}a%}bVSuFSTs_A-c1`CbOAx5(Hc)8z}R_TSLSh~z%)|Ew9DTmw^}I9 zQX^<>BOZ8wERjvRwi3>J$&$7} z2*D8b*o+BiybUT(&@DlzC0F7UV0k42HGo#3amQ){dsrc@2h^~1p;VRWyljXH$a@p~+WGDDEv-j? z?@8I{v!Kqp&UeJp6$!zsyf@$tcK!n8RQ&pU^|(pL_%u9RH_Oqv{-zo>goBPux&n+S zCm=x+_Z^mtTa*Pa@ znn3GyFn*q!tIe%PZw%k?XXC|6*@x#&mu&H5f7=Nh1igXT8f=HRVa1T~kNv2I97w~G zjxo1tHzyvjDS1`m=8V zWPWz6=ybc*UiY^2IX)P*-+Sbx6FQJh9NNGpLy~aLw4_@p3M(ao#~5cs!4kb zvHjAfXrFZ4%>bp}*GTwf@l1DENl10Xt@T>^_vezm4JT-5!dV-zdQRG>KR8HGc?j_s za~5<`$BFY^cGy@|$?mEw&sieAIDzm`LTDt6Z={Cl9U3O#a$Hb4?(UBQw^OT{PyyX}4EjC=3=FM3vQt(!FCvQr{sbw3hJllZ8la z1z|R{w<9Qs!lQ08L13`OxYG;Pzf|7#P!`UYfw{&WoeghiMtP;JY+n}oCunC&UODKr zQ|xwIWs79#KRHKM011H+Aq2rz?QSTA?&Wh+=O))ht8iuVEbn9Bay9)>al&>W&%{|X z{HSQP?DFxKpt(}NLMNMlE-N1^Q(j^jJ2*!#AZ&=^s7fTN_*)solYrK)4%wLxY6_DQRbn_9|W3g zRnvWRJ?d!UY_;0v^r&cR9p%6{cerTH+xuoacCiIbwwa!09<|2oMk;r}R~B57-)-0g zPVITvQJY%{ErcoOh__$G*=l8a_#-Bh$(O1cprImiO8ojdh>#mEBLrzjr(Ng0hhyLm z*twkdx7c2v+Va1qrtj8LiMtAO%0Y7Fcm#Fr(Zq_|`{hEzN%V=_0P*ao$b9dFI+DW= z3s-6K4U0Tl&wdDM52f1L9mXF893>v;#Y+ZKgx0qSQR9-N63ES{)-j)2q7Dvi0T5}5 z{gdasa`_g^d{N6tU{%9^Xi}6*7m0f%aS}?YAl&!uA{6hTzq%wj(pQ!hA_q^Vo*k=P z7J;hppYKLbZhUSZC8|pB;Xv49@|^WOj8*6vSxL}ST&!_zz36P^`!-MQ{TCUfM2inI zXO|BGTRzIzY){mmi#&fzdl1pZ^yz%j2Z~U*BfCY{g#BNbkejT?ae1b7wm${m-LjCVr@`C*X&Jfkkb!2Ae|f`u*6j}zO z>_;qr*HIYa4`tMOIeUh;Y&%$*6P!b2i8s4Rm2!9%3@%y-GPOndxBHz01i?gGMSp{@ zpl#Yk7D9K49wfq7{j|LPo20#EXhOWpb zIf6y}A&}XP&UUSS{gGYF+^NTvlXbIA`9U|G<|6GYG~Od`!zLb6)kTM-akW7%bm26> zt+2+A201(RImJZfqYo#B$oiPw&L$D66IQ6~4^w~d>J~B~P#A5|z|K%KVx^N21hZn- z`6L>*7xhUezFb@keX>*=I$HVN<6TbWcxahiA(pKqFwM_DV#HpYZs#wy83#S*b<_{A zPR1d)3tPbc7t7ibE2@*g8o6z=FIysYa#Ur zl9FYkEcEog8l&kKq2Fin97&K-kyg2NG&zb^bhDzogD#2-EIg?vSb2_|b|}&ODNQ+T zB6;=7wB=1$#o-1z~?oEsLaI<_`Mvhz2jw`z@ zzmo-KV-_9;@uQNY>Tl`*`4210WzMJ6r|)qht$&{fv(vYDVaAphz^5L)dH`v!ilNFR z($xRmhMpWMo`oK!?X;X#2nq^`n^PcX7ENUo_;TnJP#^>LRNHq=~v zYU_trOC9wx2!dT6qhCcw&p3y-gA3zy?~QB+zof+wk1Rfag@;jz1k~Iv)?XzXUj26_ z{F0Ou12B(~9czCD7!%xb-Y` zZu4I%;y+uw63!8Gv!%IyMlDObacu(@RIEm?#i0qtd(MSc|D zHYYKv1n_b=zyG1nE?yD*=G5lMyZF!TmJb4Q;!Q+CbvDbG&-D7tYZeFPESoTDb?isCcpTOP#H;yzzicj|CIUs5cyefi zog=?&uJh0?@*f+m=)u!v?aX%C%Yte4kL0)kt()JW)k9zqwH=4-AuDqZ7p#Hr_jCcAi_h6Yn@S7yRP9!N^}!q>XwAmT$N zp*RzEMwbyuXMq@L&t~(TaicPXb-_@2U%YwEs zYQToMDb%5}mT%T>1@fR&x)6P0+fUz$su|!ALJWbycEG0;Dm`?&-FK!d+h$+!8wSZq zU6N|>l4O{0aoP_22a3|J4kL92`!g&PChByMftq6$$}87^7S~>C5hHimBtd8~W_6KIOyYw3kF)c;fNP}jgn zOSXr#BzsyB4eFlMXERdy!IC?R#%p{Z9!VDI{icNZx>Wn_+jY9V2lusWmu1f%r9QZC zk^B$~z9M8H(o`_rR6c=+k8HaPI=1@}??E~yW2y1>&P|6)Mu>Z2G2cACYX#XRjr2}b zq`Qo;fgABQrvm(6kO(jF`r|!*8@fDfk9423*RT=h{I71Wx5~>f30TFrV?n773##79 zs%aP?tu93e(BZ=TnXFjV=U3>rP2-DY@))k&vf=Lb)UqdZ{+qQ*>-}Qw<@Kg7Vd$Nb zdG=yhnW!zM&SoU}JTM(Ik6yeo9c&-~a%Q*JSw=MOF$alMw{-3jRTJhS^P63}iGkr&Yc z3TYUX$gmJWi&tk)SA=a6+f6A1Yl6~mOB|{n0v9usW{Vd6LMS$Qs4!??%iG1mR|v(| zE;IStuIyfgdke`i_+OhXWaaNc{V03D-d)9#FLZ-{3BUi-(|g+-<-P6aP_a#)dvvNp zuDdtIe7`e~XcDqW@TKn0F+tBxmPKv3wSzL-t%G!Ek>;;3#EtFQc-O*`5k#kBl|!L@ zmD2AFxWMGri5`H|ro>sgno!}+2ktoQL5CFizI>I*j+SMjwRH{II-;Nd784wG9*_=3t-vX2 zwWg$F_*e-U&O5HKqNqIa4<8hKcX;l&_VBw=)ccRcr+J=~J zACu)M@d?IXY?DB|xgl?63HlmVwF4GP?Dp7qP4zt{wUIPqb~P;TGKZgzd!~H`>xmC(6=Cw)x$H(NDH>=|9?70L8zI(rZsHF= zoCqrQB4+yF=V5R9PMpxD&m2Bs-C^OhzCudDsknIpyrFAxOV_-{9qqTL`&zz0;ONU@ z&GeD4+uSML;399FQ8#(MmKJpOI5#M2ZTgn!!`Kf*MzkZmbEM%--iWrF|C%39yv-o1 zMYXI)4%Sb{t%D=38sqg$93;0^V7uZRB+*Keh56dLgdGNicWG;H6=EkY+b#ku)V_+> zHU+QBC12Ujw}%X%x0XStJ&I1uxmpPu0?4~# zMY1TBJrj=tbdvy7@e8Xer>g7Omv>@Iq~z4uh{vV4%?;?;#OXE#Wzc1vjVg(-iMs@1 zw+TB;HviCxOcNgihc#y5ZsIt`-ps!cs%{&dp8i4hpSV6iR{n4*h~kogm5U$VJX$kq*wxFOT z$04=i7h4{&VbJ`?q!uj-#VB79KQC zh>$~?EI&lLct2<%|8s&2%+vO>L&FHVxutvjDUC!9SoyYxAz5f*X?~Q!h zd&)}Ekkb}l8-7$XjULvx22Nuy-n;9((+jO!z_nvU<8G=Y)W2YNEMr0b5fnlhLho5v zdOO^ZkA170-I*mIHQ?}&8lXg5)6gUEi!D7;Jn)r!EWR23nCN-#uiu=0mN~V5gS5Jx ziCuC8_Umn`S4?t*(p=`sT^Gn73*qeHP|8{JK)Zqots*B}y!Y*0wb^3;6TGsr3-ZkR z-t@%gCe3Hh)UrKbkR}>~J0^QX5`G&2c#zTi2ivlKaLkIBczdbB(%BIi5icAl80Fa$#r-6J<{XW+33E9Xo%MoRYyvTN-H~ z2a94wwU~y=HHr^9Iv3pu4|D2=tCK)}> z;_y;w=KvAL@J44HE#5!JPTH;w=b0lA^AT;{!^4qV`FZ=9CrsFCU$ag^?zcie>qXhP=<&?0W@f_p1F0Og8v>(x(NH8o!1f*qlB_v^ z1rw__xymozFS3b-@>HHrB>pU;;@QRoen(k`;=)vBN-YE;R$9g<3V4{hApOtboi+F` zgpnX$_rr~2iHz4Y+m>h~F3PO=tF^VQSqH|QLZm^$xBT$gdht}uc$DqweiXOFStYiA ztVQ+uHRqy~q(T@C9QH`&ZCLu1e*W>LNgBEve*ADEzgcdE{_lSY_FapmAkKePSxJs` zJGX}hwfKDz)vUnS&F0&BQ>|~%bFyj7_@^#OOCRcH?lKF#3#S1VGn9bRh*3I!e5=V< z-FcBD^tJ8lNMm+obr6M^9J{z5EnKNQIC0wsf}Pffd~s4f9s1mbRLq-w1sm9SHro{Y z794)Ncu^uycQ&j%^Kwwv8q=Cu5+eRh{i58$r*msMs&->*E?^&#*P*31u87mOe}2RoULiVM zk&l&?C=v*u@A~jm3{zcsr}ACNSo>jH99S@L)!qv^}|bnH?VU zN1J)d69I;zL`^H+-skH;rkRO{!-9w*C)1>Ndy%;wSDN-%9BzF2d_Mya1iFXqr+fp12M8kh5TjHzFH@qfG#eZ3mp3 zoq1#4*GO2Gb!OSn>>5s-boXsOEahQ_L=kq^_Z|kyZT4AVfPMT7ypy-LC8!+Tht92v z;@V7v--YtNT2@97ugjMDgovIVdiJqJ%V-REz}AmzQ1;WQGs!$RI}0p`Z4yhXpL8RX zklMhQ1spLyHN&5Jo=XpsV-!lfFIOxk+Pb=p+yWDk>(>yt?wpa6W6fqlX_Vp$UASq{P0Wy>Q{;UtmE zdP>oIAA!p+HU*a5okrik_=Hua7Pl5b=%e;x!eMWh+4c46eNOD>n@;bj$`VkaW)4pa zWf*t6`E_>4E}2G+dOX+H*8HtnRA^#&e_p?tl0W;9XTdiJ>d$t!Iki_PhRGt5zkll-C? zwSPOh0b%^G;b!Q`cK@nX(x=yBsO01!k1t}M_g;wkQwU)a8KONSO8qDHa-w1s@zX^c z%=U~T&sjLo)9_8>*VEJIU}dg;hSb|*--}i(QAa%_doqE|fsFR*`$0D2U*ZU@94tF( zc2QYEx$v1+#{>Hj`!mmmR6pEp3EkR{J$G!fw%*}6a^Xi(E5?3W!X7~19>kU3smg0_cILQ&=M zhm`T4nVqPD{j*1N>m^q+FUv)JXzh3Xw`WpmOJa+1(c}X?`}QR*hknY>MJ2FYn?RTW$k}m z@rnz`-JIX#qIfy)?4E`F4?Z%w9CXg1%sMomsYjif+Fi9?r!5=nP-q> zjB?LUbnDhY+UJX-y@jX#qlN`C!g+}uwcbcX6VS4HEGQRUiuZW9BS@ZbBzHbO%XAd* zr(gm?a!J~OlKum;Sk)`QzW)3aU2Vea$VbOJp_e6=hwFwAO(QYpK0!P23|xNs>~n=D zYr%Uhw!`x(Ouk|JwL%b{(oknRj+gYEpiwZV-d!=>TP>SYUAr|uUPy(cu#4rz;xQ5{ z(V~d0k&s6;8<(&m7`-o38fNS*uKlU6<8j1!CiqPTbewnItL=~!pL)1aY)fFu5dGb9 zxiVkwG@o%B|Jw7UJpB!-2om3h;J6HhyD4e2>yqdKS5Y+Og%Q5Ei9*k zU)xYpPp=_Q>hjS9EwTj{&v~{OEcS1+6}qRpo8Lk!?|UIfDTfDGxkC)80uwuW27za9 z|6JBq{m|CDN#1N{p;Ql<#;^5iK}|>@rCDmhp1>TGu6EN)d40+(jj-%F2Z8a}e%T9M zq|XQyALQV9^84Q`jMtS(-zy6`+leG@5Vf|6H)v-AFEvg4Hk=94ElVxk<8y-@-hu1) z?5~e)oj8X@=E4b&KlHu;3PAfdXC8Gl-Hd!b=q&DL{u=d3%OePxdiYY4Hxf8@9&Ud2r43pH&Ea$!CiBA^oS_< zr64Jk?wQr}br9rz;2{aV#bfG~Gb_VASK$3wMPkKgda~I;XO!rrdVQ?1aej%1f^saW z6!D7pu^Jq@6Z_(cfw)jB$;f#3KABw?3}cdCi<}2YVGcc&e7!8sBg9191>@~wWkYi( zrW-c>m~f}b5s5njQ@ex3*I<#bAkek%Alfx#H@F2Al|IW)HOYx+fOfT+btiD_EEzL= z?|!Gj@eV@4~D;!;qVyQWbtV2VqMOJk{%mX?@^Xf`Q2WT>UMA)1*I zidrt9BDiCUfNQ9zeQ&hS?^oZ~_jz8Q`ycM>b=_R|xwdnk>zwyF2YYnt1f^#_Z^9-` zzAJg&dU)K-@?4t_sI}d<5%rw^fSXkYH3wGLjxxtF8*kwERp10ds=2(~$5TLAL>MPV zafA^CYsj!bBu!4UgJgcfJ;OdHt8QR(8g}lznFr~EHck_(Qd{4C^<{RFLi>fsRVrxO z1zh!|p&)qKLF;rYTk7=9pT}2gqQo8y&a<*fuc}VZ&~Qw`$?thGr!>)k=6-=kWL|#< z7%%+IHP9DOMCCiO$%lT}=ku78Y*4l4t#MHY{N9eQ6&2a@sM_JLRg{x=sOXds^^W}= zwz4;i>Q&<*nG;VUoQ)Ukd4V3<(FJRJqAwjxG0S4apt=4H?x2$J z9O?Ly7|s3jC7@)ldI%6V+weCv?CkMvb^y{x~&R5HTJ?YbZbY<-mRd-x10lF-C_@Q_G$|)1ynq#L8%o9y_x1tRZR`C_gRaH zH^V^oCKDd#1vB0LB_v_4K1-i15gn~1L^=xv2t<+GmBUx^v({pMOe8U=y1<#tGxt*o zxS5M-A0I|aO|GOr?pnNoDBa9V9nGk%2St@JJAPoRRtOXstKjau&f9>*JTo68!ZcFE z#N{5w_#Dh-Gs>`N91^(L@vbV$WO(A!IyFwOfjzsaA<}J#uNK1ou0FL4%^+>ATrQWT zmc+)Ak4Phjf$I3j+|+!dK#rdRAGQAXF%6jusL50?^am-guz14@nwh(`#k5o!NH0C`TcJe$gtjdDaF z8_@`QOiKgPUf2qJ#KQPN#~#4h@4oIQ!pTJ0E0y@l5?{a}Ge2*`O|jEgA>iaSU&U4s zzVjgY0?Ypi(^cl0@(Vf(w zJ7*B)If~YVu*Qn z^PF~7PH~Bk8PoUJVRUZ*ZMxI9^pG`Ape3H`&f%xGw;+CNm+RJM#05^Whg=;^_cUot zo0x`TN|=-04Z+HLah6V05xI$@G?>R8tnBS*4Ji^hwr1UhDEQsPUmS{6-)o{;gJ;4 z>_gQSx)5Uzb)9B!9g1c?n-BOy1``#{^Rm_-s;}A^YA*-j0*wpnH{3y0X9^Y6YR!sb zj53`N0z363`Lf_&>q)AoQL1=JzntA3G46sNFK}uw zlBL|$mt>T^w&+NgNVjvd-58KWMx1*}S4q_kYIWBZzWEMuf{2NJ)XhcrWJDvO4P)>=5!D)^A+{Zv(lLpD|wNIRE%VHYzgM6L0YIyljRWCyl@Ie2n%sP6@{)BB_D|hx3%&?C}ESX7BQk_3cZe2x>ocZ_p2Lj%vRsr^97T4g#gCVf`teyx$S&xrQAo&T$zGw8G%PR&9aDoiEJ zPQ`(Ak+y1f7@#A!@=uR}B7vKcM|uQu(&(7ZhGsTmZ3G+SIk>8&)gE#vLdoL2M{;x7 z_)SGfriG}Al5h8bE@yqCV$J8bD*__fC8OPsgA$Tf0)MVou`O~%1upBG|I==7!`bO! z9{(*YA~$e1vHBOxHn z>|;E&utnpOu-%jW0*n^k_x)-FQYr`N*N%F`G-~LSZI8$M!>uG#Hleb9_j223%s>FT7;5hG;{Lwa~ zyhNkcNu4OZ#l6P26EfeGO?d-S!3)Krh+uOqJwSs|t-bza>&T`08Y}@7?RbU3*19*} zjLQwI`NRQKVTk=%lQ%v&L}7Z{%((rizQb2yV4s*>p~38pf+M&K0oAglAfj(vIJ=50 zUR5JiRmq0go&wGfriH@usmR0Hf)2P%6` z{j3HRhHG&GmPgmyg@fcFGOCP!Y|>Dx#akd{f>-3Y+FL&Dp72lB(W|&Lm1zh{pR8vq ziJG2^kqlQXA)>Lr2=8djx7SSyL9^Co=p;CGXy&K!5251zhs?)!)Li~*svF?1<2fD_ zG8iGRVRl8TTivD(dcY49A9IfksdSCK@L-mC5W-SC^9370j zH$D}?N5Dvq*KjcgkJ43@Ptn+QauXSK)tei^YK+|z^Jh-2LR2kQ5Q6 z(bez@f+C0&KpB(uxGb+SuY;*YwFkATwDTHA$mEuC6x)b|=vt_xYe=fX`lRM6n|m&5SakU@6B3B3|hIu3bvOXIkLEfhxSNdg9p7!zN-e-Po^ zqg#BL1xJjsd%PE8Y6sS*)xJBGs@rSBzsAzh79!)2l>A+kuID1pHgU*1pMd=5X)b%R z*E))O*CHvn4}vM2*?~PU8w3>}7Z=l;cQpW1RI6n?g-fPGMD<5leJ{-1R=bu*A(aFL zYDk!K=e6$1oMaLw(zldY=!8ilmYpsi5(foV)RP|NqI3c&R9Oez$!elDUU3qzKq}bq zJl)FJPS70p&4I;JwdBMnhpbbw98q&}AVC9N7!N2%q+{RCFWj*A7rDpEID|TjxN&Cm zIMDGh5deGEP9ysd5WGy7L;*Gi&Y6 zF>F1socuML|G^n-J{pz%i>- zv^lIf5!6HhM}%vT08>nMX>qLicNjlct_Y_*EA&HYwOofzkFQ*c>*I?p_G-$8hU%<-}(du7KgHVOZNq-S{P;@(>+GdcZiLfOI*F zXddX-l5rYjVZueJaM!lX1;>}l!q8mqX;?!hqb!v^WZ6AdMrJ%thR|*CkE5xz8cFY> zF%t`3olA}J8z?DXI_^;N%{=FDp`e3;;gq15uCxi0zSG!&=#NcwjU-NLxDgz zKtIlqcEqaAvQJC_RBhSJnNa0V-V^8#)~7&}09(bCX|1KFsQKKoFT0NfWsXmE^J%gD7Bn&+rs z*B`QH9>*jIg1eG7av^)8K46^Mvs7q!ese(`3sY@bLmnjes0RR$BS}sK z9S-WOIW9S`$NfQD_1Nxfwo2lIsh=WoH^S>3yy&wtH9?^PaOsd6qD;f&sJebGE+fyM z0HQT5m*?*~pE|6_-7K(4L&8VpnBP}yy6=xhq>sf_(J*I}s1@V$%#IPShgY!rm`j1} zQB!f|ooBW7$Vag1-2v!oYE}ncMt#YX{u0}wgGi2!(g+=fhr;`;XY(l+l4-JctTSm@jkRejY z>E^j&4tJ60q1eVeS_B+ICI-2OK!Kg3rQV0TKk7K)6pA7FFV+G&IBD(rdtFL%tCLrm zzl2wKGwOf8pKqC+s8S~SI1LeI(5>MJ=6O$l^Oo$V98m9XOhoA0+y$Om-5?s8>U<1d?jUHMr{}sS)Oz8@jNYS?YO>tMsWS;6$PcyC*Aop=&-~QdZtKd<6FK1)Pd$$_aGO*Qef&XC2Bs-BX%lB^(Sb7w>U|OXtJX|G)(*wR$aSoQ7=m)_U#iVzA_{jB{9KvU0$wCjwnWn6XN& z2Y^DwMrRc@?ySH{(SaOkw(#e3Bj%K!1f3Fk3KH@Cj*}W<3!FuXoGorski@hb4wM)GIL6bO26P{ z%Hnos9s0x8I2cUHK*1@?adx*XQ-6w?06bDB%SI9^`~HD%~~CH zH$%&ugv9FGF)ps3+FMpw7aJ+6F$|Oq#;$e<@%nbv%}`6$UaBfC0SS^=GS@5rM{Z@- zL{a13PLV#!&NjI%lfs24LLkvkx248*+JTAC@>lmE0Dd5WId+Do!+Yb~R)=1Xl*%r| z1sEsp8a<8atg5X(t+nSpJ0FDpP^z2<4hV14jp3C#_@?0%_y~N4ZE0>7pfB1x|MPxn zJ#-1l-`st-KVfjMKY>z02F2=31cYy_Wk-U@u}9rRY_%*C+rtYk%N5-jwN<|BlV+Yl z?Pi~R2|_pXD$gPDnFxwt7$w9rHXw26#>W1&Y#XVFs9v31OXjrYIiA^@2m|vE@DDg$ zK46_Cu1B>~B{R8x?ygg+M8>r|iB{P|sO}gjYOvIZ9NTk}lphR$XcdyG>-?=?FvB-G zZ)764pm=Pd?CYAJXC_|^b?mU`xN5`G{7Yn~y7P%Gxncx5J@vkC#4`7)=lT)q4s2z< zofM;f=jjU5*nT>s?!!jxUdChfsTQf&Gu5NJr)ko4<;l7!-tJ>O=y@W|$!& z>1K8_IaZyrvt2zOr)rJ_@|(;sm~~14!ob9#j_L##q4^}JyIEfn>g-jQ>iZ9eft!`P zwJQ6jgDf|yj`rve2R{V$rNSR)`P#8qeCD~Cy6aqh`65{P}oK$>7mNOebFhiDC3FllU%uLV6>*=wl%ygQ6WV#Bjad{5?QgZtNEo;tqVUv= z)I3zieWobaIwIh(S<@~0df0@W`!LWNGuPd?5Fhz@m z5BT&H%S2Py>%055dJ?o#0tJPfi(dMbO=c*@L?BnDF7QT!dd0pJlr33|uon*`hp9yt zYfHYOb7!?pb2JtaqEa2&XbI9I!|bx3N~oh$oX#$TA9M@VLlE z9aDtZTxU-+loA;76{|CGPNyR$y-CZtorh{9pT~8J?K}c2)3xpP>IhL!Xq7GCcUTo_ z$c$^CQKv%>afX7{Cu7^}Q>uQD+TiOiBLVH*Qd;SvdVDUeAl&R zOD*s{Q+2!2Yns29JaUf`Zg>}!qJT62gNTKY&Z3F9oUIfeBgI*{!@RAVx{i?vdXaVz7yN(l=C%2HqL}(n2 z2KDOh(fbI@d~RfdAR~%^8TU>maFl8%rpPfyCuEMOZ7Jy+KZlfylUeUQt$C*$te(vl zUmPyncrj5~*ppE_6w5nW>?4`cvly`EWr zBXQc9EzNZEHtMkPq^>l+Xb~PQiw+YF)~&yz*rlIT*0p^p>vp75=oFq2>){2t?#fAa%el zr-Av*jdA*g087?{e{I|J6}XM)mp!&V$XuC&fU|>!SG=7`pFGK8m+AdzsVw{R998jL z4Uabxpxz1*Gb5&uwV^3EWyLAOz6afj>Yhp?rU7uk(VOleihts6!s2e|PKL#f)7ZxW z;^$D?q3P#L$1@;iZYh=@e!K>Q`uj=~y{6xPlLl5x^$CQH-hPbQz!mJ#OC*KSCT1w8 zK&K&sKVA1uP=r+D6@{ssE+(Xq7mFQ;D<$9Wi>SA#aO1&%K|$8{!v;W!r@+$`rYSZB zU+&Vl{`P8h_%{|sa|Z@8$lyWg=^)&sp|*O`;&oH#`Zpnt!j9Q~GDt*DjbyeM3X4gh zsp$ri<7Xr2uGfNOyAETZVAE>ifN~Bg&P~g=JMP&*a!j^J{jqI#fnBzrGRC#DdSheL z=ex>acV0-TauDOl{>XGIr(oGB{6}w=;3aSVv~JMH#nBkFh>8~z{tC>qdITxcYyn&$ z^Vur)tmYUqB~rd!WObPd3xcxyJ8BQ0ERbH6dl7RbUcgQ;7xdM{r40E2ZYQ}cNJr3K z-7?cT9(v8w@qja%Bm*NEl9jaJNnyFDl!L{0IxGe=WC8MDb){_M2ZYed-obKK<;IJl z4g9b@hPnX5$n+>D5tk;jt_E6G%T+s5OLm!y8UX+8%Y2J$V(J{nrt;GIJUP-i&Bt@_ zLBYh#DL3*v^+dkD6HeC&%;PZIinxl=Ak(D?05<zJ*rjulL6P z#LIuke|8mXlS<6_vH(Q>5o78n$k0shuHX%!t$LsH4O%@}e6cfPWn@aZ^&B~YKLL7i z6!cg^w@_-^<~K|{1WGQ*6DI9aI-xhcaJkAiIMyU~!v!>8l}08kNhtoa*xRa!&e*`J ze;B>~RQtJu#l-b26|`eP79x5qvD~Fi_VzyY(v#9K(z18x(Yp8tABLi?`1?v3POKa# z4#*%^%ZNVt3k2y}tWZF5tcJbsOyDzuraMgnEX7ANjGe_9;z%YI!iV>FF1b z0L!p^_p(-5WZXvAp&wQq5!Y}%r*$f7D|08}=45_)!a6=UGDvG)T{+;;LeY=pF}-4= zPypuNG5`u7RPE01o`Tsji#I&<@Vf%YgJ}^4eY;$q*s_3_uDg9!{%n`XrgH_V#l~9_ z0BSPSxtt%u5w_mU4&LKnKf^Arl^(!6UHPE%N`qvGXzk|CZ1_L=LrE)`=w@<2kR6U* z?J*%^Q9^`Nel1Bil^xlBiZU?S?)#7o;34XcLJ7N84f}U_EHI9rs0*F~>bUK`^Jmhp zgt`#fZ?s7>q`1yUS)oW?dz+^w zp;i3HR(gs#6iiJ|kM)QP=&L$$o3H>6FkHQpsGXts^S|EcC`{daLFH(GyBT?4}MuXa3_T5-S8(u|%p6yDI`j4rO(2mxbMbmq80)*=RY5?l_U`ZStD0^&Y3?3`yvI%d z;4`%#*X(bbZ;NsC_=XknSGry41i&`5-$!@$uFVH60g%a&JMJdKMa{jp`K4QNFXm8L zijm)K!RD`VPbG3dx{l{B;gWG$QAG@uC@Cad5q{HePtEo5Q6pd$MajuN%>@VXf>R<= zP@6}SoS(WYZ}~hRJ~j1{iuB_s%r1pq9ch87BRC!W%>P} zp8D?x5V(&}zF@(rYM0qg*ygHgo*|FZF`LR{d#ERkcPGhBI0YSBS$0hJk27O^I5q$g zu?-zk&#>B5mw8$exq3%j^)|9>^S1;%qxF!r6j!Ehg5>Gy^rDiKG_9*S;@)H^E+87% zd+k@NAps6Ln)ABocHk6Ay`+t$g|RO=rMuqok8OL>keBt2%$ZG6rj8GVBG#-6%=GSe z4}=(^J%W%HEoMsalh;YhJ#7sSqG)|};$x01q*PNv?Z!Vr00_=`aXLu+A_x$QZNU#$ zFG|JL{Yb*|Fg-^bn~*R4N{-C&$j*P|uG=zhFj=8DB{6H)%9Czugujgtgg z>e&u>YPs<~=d}ypQAm}vp}xS1Gevr^(OqonfJtY739J7MFRN9#itB+ZFY@!-@(5J= zH-7R7 zw319mncuRW=_cc=w2L*1II7`7r{}qAZyzVf*{^02!ep9IBIx_>+i<*r-zjXSJ#B(i z=^DL=Sde`xYSQ?iYxO|XAzKV-%%)4YT#6;vqI2@)IBd62T6M@Phn#L)=O*+mU%9&# z;Aw?@W%~$qMlQ&xGX#)2P`+98-mA{k(5httHC^UF9WT1_+`Dr;Z+XM<{jN7~G3vx9 zve>&)e_|!u^$>bUY^356zoe^FaYAp8;JwBST9Y@s*=TRqEeqctbg~PUPGNV4!P=lPQ>3(3GayX&y&#h>zE51*+S^BO6nogpbc4St`cQX6!3^fH+o z@3zssEWKgk6gnNUF=O$9PIdZqCf%hLFpmumB}|`Za;M#4yqnJskNtG}BQ*A$JhvNW zPpT8?US1-_Nut%iQnFvO07<0L9dX}UHP>g#c?gJ+WUq(FD2;2rIlLiWIb(k44{fFK z4E38w(xA2d+!EiA_}{xsoOd(UeuAI$irgO{LniXmCsUn3G&Y&}q~1{~y51?Tlkd?D zI(M$DoXk)O2N0xLrzr?Vg5gXSK*udhjcrFpnGSYGD6zm6r)+MY4V+rSMLz!^ z+SmH0A|ls{a6gpc7)vl5yYa#$!0o7xYbw(MXJ2{lpeV{{tUmc&LyfvD&@4DQa< z>0Fa<+6o9&+Ffa(GaLMP5L_QPGb1NpST%xgeXio7T zL(Wq1F}2Y&N+f7cX#D!+V(qfm4rH?|WhAmo6*{Xa*AX1Cx^P+0x{K%jq}|texNxB8663tR+HzNmf);k!;%2b2MsU?C zpu)9Om_i~SG`nAsB7J;vV`HfPD2lkem|U6uwJem=ZjbXQ{Y-4S>2gTLf= z1i(N&XU^Z44X$#Des|nS&EqIo2XEHi7Vgr1EwV0c>HI95Z0Wk!WLR3TR(>}D>$-S| z{yN6|maSEktBRuU6(H7ev(ufB`?yO_iEi<+O)^L;HrtE)78NFyJZNg%WMBv>h{bv#oiH zZEPreN`7xJ2~N1EXR0E^6fWI9$iUz7K;&>xUCX4Loo&7b{DrAi+L_>S{lvk_ql*z| zOIagt=^vrC?=`#R+f2^VV(JI0Ej{k3=fu}Vw*qWspH-H;OsZG1eH|_IxvM**`+}?f zBJMzJOL(-jn%)5Htn!eWS(8Rf`On?JY144PLu^ag%UP^eGb?ufCs|)u)zDj2DRX#? zrV0qz{#n(!zs2?ZC|L;Wj`*%2+}4sf_7aD?a}FHwC>7pdCWp2BaMc;W4|i5I*V8F@ zL7?2|X1OX`lj)GX-)$dpS$0sZ_|U8lbD0b?d<1*BNR;lGQ0zmm%?Vz%${8AKkYb;=9z|N%!=k6pEWL4jIL!81_B$&PWic z3^@1zw**E$)?0c zIwPxFkPZY1aHgsj8zI(ShLzET`f=iKK~b~joutHGdKjSV!&eP5Yk$WitG1N0`h6Z# zaAs9MMbEx}zIt3dK~(PO3(>96O_oc*M$3TtV&4!fwpOfGe2UGN7Znhx`dvNet>*R5 z(-1tOpmM2aDy7N-wHsX;_&EA6fE$*kdAe@g=*}ptfNO!h>|PqESDFq>B*9yz|AP>t zPG&?og};#Htr~hAO${siI|ut{Fc5x?ReuN1_+Xxci?zr$!k^4&m!teq9cQGU3TQbv z8#VfvJ^_Y$r5m=}x2nXK&>?n>TpZ~4^%#Q;j=|Z3Y=*Lp05DMsWmy5C4a4( z70=58O?--<9;ewnQ?CuwbnR{qqOs{(fQowAGnpm)Nn>l)@4Pv>MPgSdhHj(1`eFHs zsRDN}`qSl~p?8&Y`C++PoTsSX!%nekQgyLI9UbOT>B$Utc0yh-5HZ8k6_bWE@4N`J zks^tUQ!$D)G&@IL_;e5&Gf3Pg`azHK9EEv%RqfLn%E0YAbr2@`oo`UH>__ObOoFN{ zpk3%4677oWQj5JxkQfJUS^l)`fVc83d9y3fLgCp}(<2LUrFE9RG`g#(z4_(O8O01c zp(d8)8ncL(quMVlH)h$}vPH>?3G^@vSfp1#84)wcw6Yd_B>c-sX;e!cUvqSPv>(;6 zK>BXD;&`kQlpXI<$nvGY0Lq=@TBCCZ+$9(BrJ} za7!1ta;i})W!knv$&J#_ZC;u`RYbUe?lg?@v=jba{adv*CwishyrUP+HApiDZzF_Y z)Qfev9|WW*e~JN!eE%=HP~K)>`o{{n<_8J3$Z2Oxs1wgle3F*+mw@@|Vm zX!ej)Vj`iMt)@-FFq9?^!5ALEj-rPD0)_YWqQj2wTwB_Bds~=WwfxIYA#d|ysx#8r z+2|sFC6AJ`tF|yGl9%InbUsdIpqsyptc|v3TeH$u0|Js=Eg&x@GGai0JId$?5r&@a zwU@wEc0B&&GjwCU{y8RWw&N+F)}Fb{Xv<~=gHN68X!rRUGW0lc+&y}qAOt?HhF&eO zSgcChUspZ7_5i2;58HTb*9LoCAd1_3rrK!!sOLLfkPIBe-RRXyPsL6j8_1ZFGqf>L zU@ZFtm8Vz(m`v0U;c!Qs@dO|JyFaF8IF0W-C4Mt>*NLWkr-?^uQM>|^Dx$r-c2~d z0aD#o4Y#{xPB1;bmCW+UNfnD{5(#UBS6lXtqc*`=#EHPUyX6OBEH(btCG<9AWCk;%yd%H$SeKJc4O(UM8zwjcOYLAdR+K#O8c@H zd;P0vNPn@7aI&{yEN*^3@RA*7KX2*7cEsRVFgPPC?7F#%WX1{jh-sf0A4&9)7lqzr zxRL#7MT$$Hk7lQF-;ujJe&@AN?!UK}&uOucR=#XR2jWo8LYp!IO;rG#wosMG49ly0 z6E0C`&E5aJT5xQCo2ia~ijqO!ZVAwY6#nVDYR}|#hC-R;Jwn>e!NPmPF= zkpZjMnhr$YYhV{b!rhqdPbzM{rE>HoIX4nyX0#c1@i2h!3q}=iN$E{#-JIqRO|9*QB^Gk)N+u3U6o-;q3 z!~*Uvh8Xz-IQ7YSDsV>R&{5^$YE7Q((=+?7M{mqF)9D&DShuj$SP&N?uB@EY@0=-^ z;%mV}Q{ER5w9&5jBd&cK`Y4(6o1WX?#<`KEM+3_-hHAGgLDoSUJXWKsO z5K+g9a>ufLBP}~y+#cY}-gcC^=?!vB6SQe{tti>kp@BYX~%1Twl2n z^3cMW!KyIe2wreMabgWvbn9qGp~fn!vy_M9{U2xE1G^7 zNvEYD11a%F4sU0d&JZZQu%bh+jat2{@>6SmqMXcJoNk-u42 z#B)7qEAMV4W&VAa`d(uOW9n(i_?3)!lZ&nugxoQsH_h(pR8HVrmEtXL2@`)MW4)ym zyd@MOW{ySeAra1K|LwMr%03s6pB4Q~Set*pU;Qxz&T$RVLx;ZfIl=~D9cpN|vJ4jC z&&NDLzNl_$pt&Vx`Cr5{FG-(<@+bq#R>6xZ=n2@%5yd(zL<*<;5dr1{F_`$g(pheh zrO}i21b;mkIt^JOX4uu-XY7`o<94k7`>t}Cq*V}eHZz&nnSjqNv4ACO? z!jyP9kash~5FsZZ^>r8n}7TtIpt5E|PqS8(6B)tiXoQ!ZF)E&o=5 zy4!utbp$(dwM(8o@ty0z1@(+6uos2h~FzAN}G4VVuBr0r4@{){4+ApQt4#1UXbQ_Pz~51M$kfNB7oM3jn?8hR#9DN!!3KOY~B?XqZwm5;$m3WHeFJ zd&y3_qTVHVo)hppeoMB*WY(xl_UBypknqC9(lbw0s9TOIb~VCYJqcfh4~uN3u$DRn7$?cAU$y@oy|sMXP4U`sAo>eV zp&FJnCLiz@!s;4s7NSn6j5Du$y8#X9@t^T4_j3Jo;5J_N%3hvX@nEd0E8H^>8cYErW+JNXXpVWSh$*LO zG1Xi0%DMYLDgCv@)u83#Wi!AHEOfD`%Hoov!-t{~^t02pkT5;0i_Vcyd)>3Ve;7gtv<~ zBvdhth~E_$m+8M-<-biTJ&8`3P+KHBY$&2Ux2Ou(_T+gbOkuCjkDM1l zUAn^`_7I+aunGv<4~@03dnuMN?|(FG(Yoc1c568Q4MpO{ervc9S{TMUx*k3DKJR1n zTK9SZ*=?;kICjEH((eDL+iqFbvCd6{SKm#IOU$}ER&JkFGK`VjZC@6NpEGt!iZ>JH zwjF@C>Rxr-+0HVsRdRapW^PNRxK%Q9{dGH4iKO&ue7g@@H9MTPgC1-b%)aT{`uuN| zZhpI^dHY;r^%NwrgKb}m+O`v4JgBifrdxF*|N7~3@)k+)X8pvM59)vQ;FdXPyTQ5d zZ5_Ay;8xj8{!2O%e&D7Lf*Ix{V;g!Rnx;ZTo`nIo;YoAk`Y!%I{Lbng<+oi)_ zz52};W0;^)x1Ekr^5Dq(ZNtvip8)Cuz9h=_S8oZg+O7kV6@J;XZK-XmYVP~5N8tFD zjbQs<1^;;kSZ&)9wx1jSy7jM!|El#nn62%x^{*XqYG2iTJ@)^Z!vEUFaj*Zs&;Nz` zuh%bZJ7bB2s*!(fbKorsZykTKWdYbG_wg@x7rq$7!(T1EiO*S2w%Yi71pI%talT%1 za@ww<7JSwGw%hGi)yVvRA)|g9p}+OuoZhw~ZL0vRfXFWw`irkthwPWV%=ohXGvGU4 ztT3}LoA|$mW9wtP^)7%Re9@ERXP34@-))mIu6lPn1;SP_{q&bR_M7cU`dc-?h>m{o z;>zE*aA;dqx4s^m|H*PAsk`~@voDtU_y5bi_tks9YA)eFzxEf~-Y*92#ZS}!iN7RF zWPb7Bf1CfW*U(oxW!vFqtNT0Bsax^Dw+m)g8PLWrmd(>Ir{UGt5ANP_q}ux5+~xn= z;x}KtnP&UNh+h9{SANCK9(=|1zIslj_{%BZMi^{U|M=Fx7n7Wz^5rJ_-+piYJLmke z#jiQ%S0sMU-Xfvu*737Xzoa*7_ZI{3U)Z_q=lEP(JzK$kJvg~vw)n?ai~g(8{_30f zzg_hI^&39qpC*CSZC$shUoDTXcj>l019)!kQzeoL$ecQRn;*|p&7?Yld;U4R!<)OE voNvd!Z!~y%YWqk)u~j literal 0 HcmV?d00001 diff --git a/public/assets/js/form-validation.js b/public/assets/js/form-validation.js index ee4431e..f898b25 100644 --- a/public/assets/js/form-validation.js +++ b/public/assets/js/form-validation.js @@ -84,30 +84,30 @@ document.addEventListener('DOMContentLoaded', function (e) { formValidationEmail: { validators: { notEmpty: { - message: 'Please enter your email' + message: '請輸入您的電子郵件' }, emailAddress: { - message: 'The value is not a valid email address' + message: '這不是有效的電子郵件' } } }, formValidationPass: { validators: { notEmpty: { - message: 'Please enter your password' + message: '請輸入您的密碼' } } }, formValidationConfirmPass: { validators: { notEmpty: { - message: 'Please confirm password' + message: '請確認您的密碼' }, identical: { compare: function () { return formValidationExamples.querySelector('[name="formValidationPass"]').value; }, - message: 'The password and its confirm are not the same' + message: '密碼與確認密碼不相符' } } }, diff --git a/public/assets/js/pages-account-settings-billing.js b/public/assets/js/pages-account-settings-billing.js index f5ddb64..888232e 100644 --- a/public/assets/js/pages-account-settings-billing.js +++ b/public/assets/js/pages-account-settings-billing.js @@ -64,7 +64,7 @@ document.addEventListener('DOMContentLoaded', function (e) { message: 'Please enter billing email' }, emailAddress: { - message: 'Please enter valid email address' + message: '請輸入正確的email地址' } } } diff --git a/public/assets/js/pages-auth.js b/public/assets/js/pages-auth.js index b27ae44..e423950 100644 --- a/public/assets/js/pages-auth.js +++ b/public/assets/js/pages-auth.js @@ -14,7 +14,7 @@ document.addEventListener('DOMContentLoaded', function (e) { username: { validators: { notEmpty: { - message: 'Please enter username' + message: '請輸入您的名字' }, stringLength: { min: 6, @@ -25,10 +25,10 @@ document.addEventListener('DOMContentLoaded', function (e) { email: { validators: { notEmpty: { - message: 'Please enter your email' + message: '請輸入電子郵件' }, emailAddress: { - message: 'Please enter valid email address' + message: '請輸入有效的電子郵件' } } }, @@ -46,28 +46,28 @@ document.addEventListener('DOMContentLoaded', function (e) { password: { validators: { notEmpty: { - message: 'Please enter your password' + message: '請輸入您的密碼' }, stringLength: { min: 6, - message: 'Password must be more than 6 characters' + message: '密碼字元必須大於 6 個字元' } } }, 'confirm-password': { validators: { notEmpty: { - message: 'Please confirm password' + message: '請確認密碼' }, identical: { compare: function () { return formAuthentication.querySelector('[name="password"]').value; }, - message: 'The password and its confirm are not the same' + message: '密碼與確認密碼不相符' }, stringLength: { min: 6, - message: 'Password must be more than 6 characters' + message: '密碼必須大於6個字元' } } }, diff --git a/resources/menu/horizontalMenu.json b/resources/menu/horizontalMenu.json deleted file mode 100644 index fd66ed0..0000000 --- a/resources/menu/horizontalMenu.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "name": "Profile", - "icon": "menu-icon tf-icons ri-user-line", - "slug": "profile", - "url": "/profile" - }, - { - "name": "Help", - "icon": "menu-icon tf-icons ri-question-line", - "slug": "help", - "url": "/help" - } -] diff --git a/resources/menu/memberMenu.json b/resources/menu/memberMenu.json new file mode 100644 index 0000000..2cd7383 --- /dev/null +++ b/resources/menu/memberMenu.json @@ -0,0 +1,15 @@ +[ + { + "name": "個人資訊", + "icon": "menu-icon tf-icons ri-user-line", + "slug": "profile", + "url": "member/page-profile" + }, + { + "name": "登 出", + "icon": "menu-icon tf-icons ri-logout-circle-line", + "slug": "logout", + "url": "member/logout" + } + +] diff --git a/resources/menu/verticalMenu.json b/resources/menu/verticalMenu.json index d09abac..ea4b091 100644 --- a/resources/menu/verticalMenu.json +++ b/resources/menu/verticalMenu.json @@ -5,21 +5,32 @@ "slug": "dashboard", "submenu": [ { - "url": "/", - "name": "Analytics", + "url": "admin/memberlist", + "name": "會員列表", "slug": "dashboard-analytics" - }, + } + + ] + }, + { + "name": "設 定", + "icon": "menu-icon tf-icons ri-settings-line", + "slug": "setting", + "submenu": [ { - "url": "/dashboard/crm", - "name": "CRM", - "slug": "dashboard-crm" + "url": "admin/setting/promocode", + "name": "優惠代碼", + "slug": "setting-promocode" } ] }, { - "name": "Settings", - "icon": "menu-icon tf-icons ri-settings-line", - "slug": "settings", - "submenu": [] + "name": "登 出", + "icon": "menu-icon tf-icons ri-logout-circle-line", + "slug": "logout", + "url": "admin/logout", + "submenu": [ + + ] } ] diff --git a/resources/views/admin/dasdborad/index.blade.php b/resources/views/admin/dasdborad/index.blade.php deleted file mode 100644 index e69de29..0000000 diff --git a/resources/views/admin/dashboard/auth-register.blade.php b/resources/views/admin/dashboard/auth-register.blade.php new file mode 100644 index 0000000..7f87651 --- /dev/null +++ b/resources/views/admin/dashboard/auth-register.blade.php @@ -0,0 +1,326 @@ + + + + + + + + + + + 卡菲姬後台註冊 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+
+ + +
+ + + +
+

由此註冊後臺 🚀

+

您好 !管理者 請花幾分鐘註冊

+ +
+ @csrf +
+ + +
請輸入稱呼。
+
+
+ + +
請輸入有效的 Email 地址。
+
+
+
+
+ + +
請輸入至少 6 個字符的密碼。
+
+
+
+
+ + +
請輸入有效的 10 位手機號碼。
+
+
+
+ + +
請同意條款。
+
+
+ +
+ + +

+ 已經有帳號? + + 由此登入 + +

+ +
+
or
+
+ +
+ + + + + +
+
+
+ + mask +
+
+
+ + + + {{-- +
+ Buy Now +
+ --}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/views/admin/dashboard/index.blade.php b/resources/views/admin/dashboard/index.blade.php new file mode 100644 index 0000000..92fe55e --- /dev/null +++ b/resources/views/admin/dashboard/index.blade.php @@ -0,0 +1,27 @@ +@extends('layouts.admin_app') +@section('header') +@endsection +@section('content') +
+
+
+ + +
+
+ + +
+ @endsection + @section('scripts') + @endsection diff --git a/resources/views/admin/dashboard/profile.blade.php b/resources/views/admin/dashboard/profile.blade.php new file mode 100644 index 0000000..b2f672c --- /dev/null +++ b/resources/views/admin/dashboard/profile.blade.php @@ -0,0 +1,435 @@ + + + + + + + + + 卡菲姬後台登入 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + + + +
+

卡菲姬個人資料

+

Hi, {{$data->name }} 管理者 歡迎你 ! ,請花幾分鐘完善資料

+ +
+
+
+
+

編輯您的資訊

+

更新用戶詳細資訊

+
+
+ +
+
+ + +
+
+ + +
+
+ + +
請輸入有效的 Email
+
+
+ + +
+
+
+
+ + +
請輸入有效密碼
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ + +
密碼與確認密碼不相符
+ +
+ + + +
+
+
+ + +
+
+ +
+ + +
請輸入有效電話
+ +
+
+ +
+ + +
+ + +
+
+
+
+
+ + + {{--

+ 新的裝置? + + 創建新的帳號 + +

+ +
+
+
+ +
+ + + + + + + + + + + --}} +
+
+
+ +
+
+
+ + + + + + {{--
+ Buy Now +
--}} + + + + + + + + + + + + + + + + + + +{{-- --}} +{{-- --}} + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/views/admin/login.blade.php b/resources/views/admin/login.blade.php index ff478d9..6fe89bd 100644 --- a/resources/views/admin/login.blade.php +++ b/resources/views/admin/login.blade.php @@ -3,46 +3,62 @@ - - + + - Login Basic - Pages | - Materialize - - Materialize - Bootstrap 5 HTML Laravel Admin Template - - - - - - - - + 卡菲姬後台登入 + + + + + + + - - - - - - - + + + + + + + - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + + + + + + + + - + - + - + + + + + + + + + + + + + + +{{-- --}} +{{-- --}} + + + - + + - + + + + + + + + diff --git a/resources/views/admin/member/index.blade.php b/resources/views/admin/member/index.blade.php new file mode 100644 index 0000000..e020cbb --- /dev/null +++ b/resources/views/admin/member/index.blade.php @@ -0,0 +1,194 @@ +@extends('layouts.admin_app') +@section('header') +@endsection +@section('content') +
+
+
+ + +
+
+ + +
+ + + +
+ + + +
+
+
+
+
+
+

會員共計

+
+

21,459

+

(+29%)

+
+ Total Users +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

普通會員

+
+

4,567

+

(+18%)

+
+ Last week analytics +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

白銀會員

+
+

19,860

+

(-14%)

+
+ Last week analytics +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

白金會員

+
+

237

+

(+42%)

+
+ Last week analytics +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
Filters
+
+
+
+
+
+
+
+ + + + + + + + + + + + + @foreach($data as $item) + + + + + + + + + + @endforeach + +
會員id會員名稱手機號碼會員等級兌換碼操 作
{{$item->id}} +
+
+
+ Avatar +
+
+
+ + {{$item->name}} + {{$item->email}} +
+
+
{{$item->phone}} + + + @if($item->level == 0) + + @elseif($item->level == 1) + + @elseif($item->level == 2) + + + @endif + + {{$item->Level_Name}} + + + + 未實作
+
+
+
+ {{$data->links()}} +
+ +
+ +
+ +@endsection +@section('scripts') +@endsection diff --git a/resources/views/admin/profile/index.blade.php b/resources/views/admin/profile/index.blade.php index df93b3e..22b7c6d 100644 --- a/resources/views/admin/profile/index.blade.php +++ b/resources/views/admin/profile/index.blade.php @@ -1,160 +1,343 @@ -@extends('layouts.app') +@extends('layouts.admin_app') @section('header') @endsection @section('content') -
-
-
- -
- -
- - -
-
-
-
- - - - - -
- -
-
Selina Kyle
- - - -
admin
- - -
-
-
-
-
-
-
-
1,230
Task Done -
-
-
-
-
-
-
568
Project Done -
-
-
-
-
Details
- -
-
- - -
- - -
Username: @catwomen1940
-
- -
-
- - -
- - -
Billing Email: irena.dubrovna@wayne.com
-
- -
-
- - -
- - -
Status: Active
-
- -
-
- - -
- - -
Role: admin
-
- -
-
- - -
- - -
Tax ID: Tax-8894
-
- -
-
- - -
- - -
Contact: (829) 537-0057
-
- -
-
- - -
- - -
Language: English
-
- -
-
- - -
- - -
Country: United States
-
- -
-
-
-
- - + + + +
+
+
+ + +
+ + + + +
+

卡菲姬個人資料

+

Hi, {{$data->name }} 管理者 歡迎你 ! ,請花幾分鐘完善資料

+ +
+
+
+
+

編輯您的資訊

+

更新用戶詳細資訊

+
+
+ +
+
+ + +
+
+ + +
+
+ + +
請輸入有效的 Email
+
+
+ + +
+
+
+
+ + +
請輸入有效密碼
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ + +
密碼與確認密碼不相符
+ +
+ + + +
+
+
+ + +
+
+ +
+ + +
請輸入有效電話
+ +
+
+ +
+ + +
+ + +
+
+
-@endsection -@section('scripts') + + + {{--

+ 新的裝置? + + 創建新的帳號 + +

+ +
+
+
+ +
+ + + + + + + + + + + --}} +
+
+
+ +
+
+
+ + + + + + {{--
+ Buy Now +
--}} + + + + + + + + + + + + + + + + + + +{{-- --}} +{{-- --}} + + + + + + + + + + + + + + + + + + + + @endsection diff --git a/resources/views/admin/setting/promocode.blade.php b/resources/views/admin/setting/promocode.blade.php new file mode 100644 index 0000000..f4385fc --- /dev/null +++ b/resources/views/admin/setting/promocode.blade.php @@ -0,0 +1,168 @@ +@extends('layouts.admin_app') +@section('header') +@endsection +@section('content') + + +
+
+
+
+ + +
+
+ + + +
+
+
+ +
+
+ @csrf + +
輸入檔案
+
+
+ + +
+ + +
+ + +
+
+
+
+ + +
+
+ + + + + + + + + + + + + @foreach($data as $item) + + + + + + + + @endforeach + + + +
優惠碼優惠類型折扣比例 是否派發生效期間
{{$item->code}}{{$item->type}} {{ number_format($item->discount, 0) }}{{$item->used_count}}        {{$item->valid_from}}          
+   +
+
+
+ + {{$data->links()}} + +
+ @endsection + @section('scripts') + @if (session('success')) + + @endif + @if (session('error')) + + @endif + + @endsection diff --git a/resources/views/emails/custom.blade.php b/resources/views/emails/custom.blade.php new file mode 100644 index 0000000..4f26b52 --- /dev/null +++ b/resources/views/emails/custom.blade.php @@ -0,0 +1,11 @@ + + + + {{ $subject }} + + +

{{ $subject }}

+

{!! nl2br(e($emailMessage)) !!}

+ + + diff --git a/resources/views/front/login.blade.php b/resources/views/front/login.blade.php index 21ed85c..b75fdf1 100644 --- a/resources/views/front/login.blade.php +++ b/resources/views/front/login.blade.php @@ -1,6 +1,6 @@ - + @@ -24,41 +24,41 @@ - - + + - - - - - - - + + + + + + - - + + - + - + + + - - + + {{-- --}} {{-- --}} - + + @@ -225,7 +226,38 @@ + + + + + @if (session('success')) + + @endif + @if (session('error')) + + @endif + diff --git a/resources/views/front/member/auth-register.blade.php b/resources/views/front/member/auth-register.blade.php new file mode 100644 index 0000000..c8873f7 --- /dev/null +++ b/resources/views/front/member/auth-register.blade.php @@ -0,0 +1,375 @@ + + + + + + + + + + + 卡菲姬APP註冊 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + + +
+

由此註冊卡菲姬 APP 🚀

+

您好 !客戶 請花幾分鐘註冊

+ +
+ @csrf +
+ + +
請輸入稱呼。
+
+
+ + +
請輸入有效的 Email 地址。
+
+
+
+
+ + +
請輸入至少 6 個字符的密碼。
+
+
+
+
+ + +
請輸入有效的 10 位手機號碼。
+
+
+
+ + +
請同意條款。
+
+
+ +
+ + +

+ 已經有帳號? + + 由此登入 + +

+ +
+
or
+
+ +
+ + + + + +
+
+
+ + mask +
+
+
+ + + + {{-- +
+ Buy Now +
+ --}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/views/front/member/index.blade.php b/resources/views/front/member/index.blade.php index 52a9ad5..a1f98ba 100644 --- a/resources/views/front/member/index.blade.php +++ b/resources/views/front/member/index.blade.php @@ -1 +1,202 @@ -

hello world

\ No newline at end of file +@extends('layouts.app') + +@section('content') + + + + + + +
+ + +
+ + +
+
+
+ + +
+
+
+ +
+
+ QRCode +
+
+
+ +
+
+ +
+
+
消費紀錄
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
訂單號日期品項金額狀態
0000012025/01/01大杯 冰拿鐵60成功
0000022025/01/01大杯 冰拿鐵60成功
+
+
+
+
+ +
+
+
+
+ + + + + + +
+ + +
+ + + + + + + + +@endsection diff --git a/resources/views/front/member/page-profile.blade.php b/resources/views/front/member/page-profile.blade.php new file mode 100644 index 0000000..d4d63be --- /dev/null +++ b/resources/views/front/member/page-profile.blade.php @@ -0,0 +1,391 @@ +@extends('layouts.app') + +@section('content') + + +
+
+
+ + +
+ + + + @php + if(empty($data)){ + $data = Auth::guard('member')->user(); + unset($data['password']); + } + @endphp +
+

卡菲姬個人資料

+

Hi, {{$data->name }} 用戶 歡迎你 ! ,請花幾分鐘完善資料

+ +
+
+
+
+

編輯您的資訊

+

更新用戶詳細資訊

+
+
+ +
+
+ + +
+
+ + +
+
+ + +
請輸入有效的 Email
+
+
+ + +
+
+
+
+ + +
請輸入有效密碼
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ + +
密碼與確認密碼不相符
+ +
+ + + +
+
+
+ + +
+
+ +
+ + +
請輸入有效電話
+ +
+
+ +
+ + +
+ + +
+
+
+
+
+ + + +
+
+
+
+
+
+ + + + + +{{--
+ Buy Now +
--}} + + + + + + + + + + + + + + + + + + +{{-- --}} +{{-- --}} + + + + + + + + + + + + + + + + + + + + + + +@endsection diff --git a/resources/views/front/member/profile.blade.php b/resources/views/front/member/profile.blade.php index bfea666..6cfcd7e 100644 --- a/resources/views/front/member/profile.blade.php +++ b/resources/views/front/member/profile.blade.php @@ -1 +1,540 @@ -

需完善profile

\ No newline at end of file + + + + + + + + + 卡菲姬APP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{{-- --}} + + + + + + + + + +
+
+
+ + +
+ + + + @php + if(empty($data)){ + $data = Auth::guard('member')->user(); + unset($data['password']); + } + @endphp +
+

卡菲姬個人資料

+

Hi, {{$data->name }} 用戶 歡迎你 ! ,請花幾分鐘完善資料

+ +
+
+
+
+

編輯您的資訊

+

更新用戶詳細資訊

+
+
+ +
+
+ + +
+
+ + +
+
+ + +
請輸入有效的 Email
+
+
+ + +
+
+
+
+ + +
請輸入有效密碼
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ + +
密碼與確認密碼不相符
+ +
+ + + +
+
+
+ + +
+
+ +
+ + +
請輸入有效電話
+ +
+
+ +
+ + +
+ + +
+
+
+
+
+ + + +
+
+
+
+
+
+ + + + + + {{--
+ Buy Now +
--}} + + + + + + + + + + + + + + + + + + +{{-- --}} +{{-- --}} + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/views/layouts/admin_app.blade.php b/resources/views/layouts/admin_app.blade.php new file mode 100644 index 0000000..af5cffa --- /dev/null +++ b/resources/views/layouts/admin_app.blade.php @@ -0,0 +1,124 @@ + + + + + + + + + + 卡菲姬後台管理 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @yield('header') + + + + +
+
+ + + @include('layouts.admin_aside') + + + +
+ + + @include('layouts.admin_navbar') + + + + +
+ + +
+ @yield('content') +
+ + + @include('layouts.admin_footer') + +
+
+ +
+ +
+ + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + @yield('scripts') + + + + + diff --git a/resources/views/layouts/admin_aside.blade.php b/resources/views/layouts/admin_aside.blade.php new file mode 100644 index 0000000..603b0ae --- /dev/null +++ b/resources/views/layouts/admin_aside.blade.php @@ -0,0 +1,61 @@ + diff --git a/resources/views/layouts/admin_footer.blade.php b/resources/views/layouts/admin_footer.blade.php new file mode 100644 index 0000000..3adab9d --- /dev/null +++ b/resources/views/layouts/admin_footer.blade.php @@ -0,0 +1,19 @@ + + + diff --git a/resources/views/layouts/admin_navbar.blade.php b/resources/views/layouts/admin_navbar.blade.php new file mode 100644 index 0000000..808e509 --- /dev/null +++ b/resources/views/layouts/admin_navbar.blade.php @@ -0,0 +1,159 @@ + diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 5368be7..8c40ee1 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -1,13 +1,16 @@ - + - + + + + @if (Auth::guard('member')->check()) + 卡菲姬APP + @else + 卡菲姬後台管理 + @endif - ADMIN @@ -17,8 +20,7 @@ - + @@ -28,8 +30,7 @@ - + @@ -44,6 +45,8 @@ class="template-customizer-theme-css" /> + + @yield('header') @@ -117,6 +120,7 @@ class="template-customizer-theme-css" /> $(document).ready(function() { console.log('Document ready'); }); + diff --git a/resources/views/layouts/aside.blade.php b/resources/views/layouts/aside.blade.php index 2dfca28..279dcdd 100644 --- a/resources/views/layouts/aside.blade.php +++ b/resources/views/layouts/aside.blade.php @@ -3,11 +3,10 @@ -     {{asset('img/logo/cafeg-logo.png')}} +     {{asset('img/logo/cafeg-logo.png')}} @@ -24,33 +23,34 @@
- diff --git a/resources/views/layouts/footer.blade.php b/resources/views/layouts/footer.blade.php index 31ae709..3adab9d 100644 --- a/resources/views/layouts/footer.blade.php +++ b/resources/views/layouts/footer.blade.php @@ -10,12 +10,9 @@ class="footer-container d-flex align-items-center justify-content-between py-4 f , made with by - Pixinvent -
- + diff --git a/resources/views/layouts/navbar.blade.php b/resources/views/layouts/navbar.blade.php index ff9c824..48208b0 100644 --- a/resources/views/layouts/navbar.blade.php +++ b/resources/views/layouts/navbar.blade.php @@ -1,5 +1,4 @@ -