commit fb53e00c35896546077d46c79109d0f677eef3e8 Author: Ahmad Hidayat Date: Wed Jun 26 12:58:28 2024 +0700 Alhamdulillah Finish Project TA diff --git a/BackEnd/laravel-pos-ecommerce-backend/.editorconfig b/BackEnd/laravel-pos-ecommerce-backend/.editorconfig new file mode 100644 index 0000000..8f0de65 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 4 diff --git a/BackEnd/laravel-pos-ecommerce-backend/.env.example b/BackEnd/laravel-pos-ecommerce-backend/.env.example new file mode 100644 index 0000000..4c8a03a --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/.env.example @@ -0,0 +1,68 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=laravel_pos_ecommerce_backend +DB_USERNAME=root +DB_PASSWORD= + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +FILESYSTEM_DISK=local +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=mailpit +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_HOST= +PUSHER_PORT=443 +PUSHER_SCHEME=https +PUSHER_APP_CLUSTER=mt1 + +VITE_APP_NAME="${APP_NAME}" +VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +VITE_PUSHER_HOST="${PUSHER_HOST}" +VITE_PUSHER_PORT="${PUSHER_PORT}" +VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" +VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" + +MIDTRANS_MERCHAT_ID=GXXXXXXX +MIDTRANS_CLIENT_KEY=SB-Mid-client-XXXXXXXXXXX +MIDTRANS_SERVER_KEY=SB-Mid-server-XXXXXXXXXXX + +# You can find the database URL for your project at +# https://console.firebase.google.com/project/_/database +FIREBASE_DATABASE_URL=https://.firebaseio.com +FIREBASE_CREDENTIALS=storage/app/firebase-auth.json diff --git a/BackEnd/laravel-pos-ecommerce-backend/.gitattributes b/BackEnd/laravel-pos-ecommerce-backend/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/BackEnd/laravel-pos-ecommerce-backend/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/.gitignore new file mode 100644 index 0000000..7fe978f --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/.gitignore @@ -0,0 +1,19 @@ +/.phpunit.cache +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/vendor +.env +.env.backup +.env.production +.phpunit.result.cache +Homestead.json +Homestead.yaml +auth.json +npm-debug.log +yarn-error.log +/.fleet +/.idea +/.vscode diff --git a/BackEnd/laravel-pos-ecommerce-backend/README.md b/BackEnd/laravel-pos-ecommerce-backend/README.md new file mode 100644 index 0000000..1a4c26b --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/README.md @@ -0,0 +1,66 @@ +

Laravel Logo

+ +

+Build Status +Total Downloads +Latest Stable Version +License +

+ +## About Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: + +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. + +You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch. + +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. + +## Laravel Sponsors + +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). + +### Premium Partners + +- **[Vehikl](https://vehikl.com/)** +- **[Tighten Co.](https://tighten.co)** +- **[WebReinvent](https://webreinvent.com/)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel/)** +- **[Cyber-Duck](https://cyber-duck.co.uk)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Jump24](https://jump24.co.uk)** +- **[Redberry](https://redberry.international/laravel/)** +- **[Active Logic](https://activelogic.com)** +- **[byte5](https://byte5.de)** +- **[OP.GG](https://op.gg)** + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). + +## Security Vulnerabilities + +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Console/Kernel.php b/BackEnd/laravel-pos-ecommerce-backend/app/Console/Kernel.php new file mode 100644 index 0000000..e6b9960 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Console/Kernel.php @@ -0,0 +1,27 @@ +command('inspire')->hourly(); + } + + /** + * Register the commands for the application. + */ + protected function commands(): void + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Events/MessageSent.php b/BackEnd/laravel-pos-ecommerce-backend/app/Events/MessageSent.php new file mode 100644 index 0000000..0967df3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Events/MessageSent.php @@ -0,0 +1,52 @@ +message->channel_id); + // } + // public function broadcastWith() + // { + // return [ + // 'message' => $this->message->load('user') + // ]; + // } + public function via() + { + return [OneSignalChannel::class]; + } + + public function toOneSignal() + { + $messageData = $this->data['messageData']; + + return OneSignalMessage::create() + ->setSubject($messageData['senderName'] . " sent you a message.") + ->setBody($messageData['message']) + ->setData('data', $messageData); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Events/NewMessageSent.php b/BackEnd/laravel-pos-ecommerce-backend/app/Events/NewMessageSent.php new file mode 100644 index 0000000..b9623fd --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Events/NewMessageSent.php @@ -0,0 +1,49 @@ + + */ + public function broadcastOn() + { + return new PrivateChannel('chat.' . $this->chatMessage->chat_id); + } + + public function broadcastAs(): string + { + return 'message.sent'; + } + + public function broadcastWith(): array + { + return [ + 'chat_id' => $this->chatMessage->chat_id, + 'message' => $this->chatMessage->toArray(), + ]; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Exceptions/Handler.php b/BackEnd/laravel-pos-ecommerce-backend/app/Exceptions/Handler.php new file mode 100644 index 0000000..56af264 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Exceptions/Handler.php @@ -0,0 +1,30 @@ + + */ + protected $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; + + /** + * Register the exception handling callbacks for the application. + */ + public function register(): void + { + $this->reportable(function (Throwable $e) { + // + }); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/AddressController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/AddressController.php new file mode 100644 index 0000000..9ec39bd --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/AddressController.php @@ -0,0 +1,76 @@ +user()->address; + return response()->json([ + 'status' => 'success', + 'data' => $addresses + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + $address = DB::table('addresses')->insert([ + 'name' => $request->name, + 'full_address' => $request->full_address, + 'phone' => $request->phone, + 'prov_id' => $request->prov_id, + 'city_id' => $request->city_id, + 'district_id' => $request->district_id, + 'postal_code' => $request->postal_code, + 'user_id' => $request->user()->id, + 'is_default' => $request->is_default + ]); + + if ($address) { + return response()->json([ + 'status' => 'success', + 'message' => 'address saved' + ], 201); + } else { + return response()->json([ + 'status' => 'error', + 'message' => 'address failed to save' + ], 400); + } + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/AuthController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/AuthController.php new file mode 100644 index 0000000..56883ee --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/AuthController.php @@ -0,0 +1,85 @@ +validate([ + 'name' => 'required|max:100', + 'email' => 'required|unique:users|max:100', + 'phone' => 'required|max:25', + 'password' => 'required' + ]); + + $validated['password'] = Hash::make($validated['password']); + + $user = User::create($validated); + + $token = $user->createToken('auth_token')->plainTextToken; + + return response()->json([ + 'access_token' => $token, + 'user' => $user + ], 201); + } + + public function login(Request $request) + { + $validated = $request->validate([ + 'email' => 'required', + 'password' => 'required', + ]); + + $user = User::where('email', $validated['email'])->first(); + + if (!$user) { + return response()->json([ + 'message' => 'user not found', + ], 401); + } + + if (!Hash::check($validated['password'], $user->password)) { + return response()->json([ + 'message' => 'invalid password' + ], 401); + } + + $token = $user->createToken('auth_token')->plainTextToken; + + return response()->json([ + 'access_token' => $token, + 'user' => $user, + ], 200); + } + + public function logout(Request $request) + { + $request->user()->currentAccessToken()->delete(); + return response()->json([ + 'message' => 'Logout Success', + ], 200); + } + + public function updateFcmId(Request $request) + { + // Validate the request... + $validated = $request->validate([ + 'fcm_id' => 'required', + ]); + + $user = $request->user(); + $user->fcm_id = $validated['fcm_id']; + $user->save(); + + return response()->json([ + 'message' => 'FCM ID updated', + ], 200); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/CallbackController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/CallbackController.php new file mode 100644 index 0000000..930462f --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/CallbackController.php @@ -0,0 +1,44 @@ +getOrder(); + + // if ($callback->isSignatureKeyVerified()) { + if ($callback->isSuccess()) { + $order->update([ + 'status' => 'paid', + ]); + } else if ($callback->isExpire()) { + $order->update([ + 'status' => 'expired', + ]); + } else if ($callback->isCancelled()) { + $order->update([ + 'status' => 'cancelled', + ]); + } + return response()->json([ + 'meta' => [ + 'code' => 200, + 'message' => 'Callback success', + ], + ]); + // } + // return response()->json([ + // 'meta' => [ + // 'code' => 400, + // 'message' => 'Callback failed', + // ], + // ]); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/CategoryController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/CategoryController.php new file mode 100644 index 0000000..a7964e7 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/CategoryController.php @@ -0,0 +1,54 @@ +json([ + 'message' => 'Success', + 'data' => $categories + ], 200); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ChatController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ChatController.php new file mode 100644 index 0000000..dab1bac --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ChatController.php @@ -0,0 +1,121 @@ +validated(); + + $isPrivate = 1; + if ($request->has('is_private')) { + $isPrivate = (int)$data['is_private']; + } + + $chats = Chat::where('is_private', $isPrivate) + ->hasPartisipant(auth()->user()->id) + ->whereHas('messages') + ->with('lastMessage.user', 'partisipants.user') + ->latest('updated_at') + ->get(); + return $this->success($chats); + } + + /** + * Store a newly created resource in storage. + */ + public function store(StoreChatRequest $request): JsonResponse + { + $data = $this->prepareStoreData($request); + if ($data['userId'] === $data['otherUserId']) { + return $this->error('You can not create a chat with your own'); + } + + $previousChat = $this->getPreviousChat($data['otherUserId']); + + if ($previousChat === null) { + + $chat = Chat::create($data['data']); + $chat->partisipants()->createMany([ + [ + 'user_id' => $data['userId'] + ], + [ + 'user_id' => $data['otherUserId'] + ] + ]); + + $chat->refresh()->load('lastMessage.user', 'partisipants.user'); + return $this->success($chat); + } + + return $this->success($previousChat->load('lastMessage.user', 'partisipants.user')); + } + + private function getPreviousChat(int $otherUserId): mixed + { + + $userId = auth()->user()->id; + + return Chat::where('is_private', 1) + ->whereHas('partisipants', function ($query) use ($userId) { + $query->where('user_id', $userId); + }) + ->whereHas('partisipants', function ($query) use ($otherUserId) { + $query->where('user_id', $otherUserId); + }) + ->first(); + } + + + private function prepareStoreData(StoreChatRequest $request): array + { + $data = $request->validated(); + $otherUserId = (int)$data['user_id']; + unset($data['user_id']); + $data['created_by'] = auth()->user()->id; + + return [ + 'otherUserId' => $otherUserId, + 'userId' => auth()->user()->id, + 'data' => $data, + ]; + } + + + /** + * Display the specified resource. + */ + public function show(Chat $chat): JsonResponse + { + $chat->load('lastMessage.user', 'partisipants.user'); + return $this->success($chat); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ChatMessageController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ChatMessageController.php new file mode 100644 index 0000000..9994764 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ChatMessageController.php @@ -0,0 +1,78 @@ +validated(); + $chatId = $data['chat_id']; + $currentPage = $data['page']; + $pageSize = $data['page_size'] ?? 15; + + $messages = ChatMessage::where('chat_id', $chatId) + ->with('user') + ->latest('created_at') + ->simplePaginate( + $pageSize, + ['*'], + 'page', + $currentPage + ); + + return $this->success($messages->getCollection()); + } + + public function store(StoreMessageRequest $request): JsonResponse + { + $data = $request->validated(); + $data['user_id'] = auth()->user()->id; + + $chatMessage = ChatMessage::create($data); + $chatMessage->load('user'); + + /// TODO send broadcast event to pusher and send notification to onesignal services + $this->sendNotificationToOther($chatMessage); + + return $this->success($chatMessage, 'Message has been sent successfully.'); + } + + private function sendNotificationToOther(ChatMessage $chatMessage): void + { + + // TODO move this event broadcast to observer + broadcast(new NewMessageSent($chatMessage))->toOthers(); + + $user = auth()->user(); + $userId = $user->id; + + $chat = Chat::where('id', $chatMessage->chat_id) + ->with(['partisipants' => function ($query) use ($userId) { + $query->where('user_id', '!=', $userId); + }]) + ->first(); + if (count($chat->partisipants) > 0) { + $otherUserId = $chat->partisipants[0]->user_id; + + $otherUser = User::where('id', $otherUserId)->first(); + $otherUser->sendNewMessageNotification([ + 'messageData' => [ + 'senderName' => $user->username, + 'message' => $chatMessage->message, + 'chatId' => $chatMessage->chat_id + ] + ]); + } + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/DiscountController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/DiscountController.php new file mode 100644 index 0000000..9662ac5 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/DiscountController.php @@ -0,0 +1,58 @@ +json([ + 'status' => 'success', + 'data' => $discounts + ], 200); + } + + public function store(Request $request) + { + + $request->validate([ + 'name' => 'required', + 'description' => 'required', + 'value' => 'required', + ]); + //create discount + $discount = Discount::create($request->all()); + return response()->json([ + 'status' => 'success', + 'data' => $discount + ], 201); + } + + public function update(Request $request, $id) + { + $discount = Discount::findOrFail($id); + $data = $request->all(); + + $discount->update($data); + return response()->json([ + 'status' => true, + 'message' => 'Discount updated successfully', + 'data' => $discount + ]); + } + + public function destroy($id) + { + Discount::findOrFail($id)->delete(); + return response()->json([ + 'success' => true, + 'message' => 'Discount deleted successfully', + ]); + + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/OrderApiController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/OrderApiController.php new file mode 100644 index 0000000..5902a43 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/OrderApiController.php @@ -0,0 +1,229 @@ +validate([ + 'address_id' => 'required', + 'payment_method' => 'required', + 'shipping_service' => 'nullable', + 'shipping_cost' => 'nullable', + 'total_cost' => 'nullable', + 'items' => 'required|array', + ]); + + $subtotal = 0; + foreach ($request->items as $item) { + $product = Product::find($item['product_id']); + if ($product->stock < $item['quantity']) { + return response()->json([ + 'message' => 'Insufficient stock for product ' . $product->name, + ], 400); + } + $subtotal += $product->price * $item['quantity']; + } + + $jumlahDiskon = (($request->discount) / 100) * $subtotal; + $totalCost = $subtotal + $request->shipping_cost - $jumlahDiskon; + + // Log perhitungan untuk debugging + Log::info("Subtotal: $subtotal"); + Log::info("Shipping Cost: {$request->shipping_cost}"); + Log::info("Discount: {$request->discount}"); + Log::info("Total Cost: $totalCost"); + + // Buat pesanan + $order = Order::create([ + 'payment_amount' => $request->payment_amount, + 'tax' => $request->tax, + 'discount' => $request->discount, + 'service_charge' => $request->service_charge, + 'payment_method' => $request->payment_method, + 'total_item' => $request->total_item, + 'id_kasir' => $request->id_kasir, + 'nama_kasir' => $request->nama_kasir, + 'transaction_time' => $request->transaction_time, + 'user_id' => $request->user()->id, + 'address_id' => $request->address_id, + 'subtotal' => $subtotal, + 'shipping_cost' => $request->shipping_cost, + 'total_cost' => $totalCost, + 'status' => 'pending', + 'shipping_service' => $request->shipping_service, + 'transaction_number' => 'TRX' . rand(100000, 999999), + ]); + + // Jika payment_va_name tidak null + if ($request->payment_va_name) { + $order->update([ + 'payment_va_name' => $request->payment_va_name, + ]); + } + + // Buat item pesanan + foreach ($request->items as $item) { + $product = Product::find($item['product_id']); + $product->stock -= $item['quantity']; + $product->save(); + + OrderItem::create([ + 'order_id' => $order->id, + 'product_id' => $item['product_id'], + 'quantity' => $item['quantity'], + ]); + } + + // Request ke midtrans + $midtrans = new CreateVAService($order->load('user', 'orderItems')); + $apiResponse = $midtrans->getVA(); + + // Log respons dari Midtrans untuk debugging + Log::info('Midtrans response: ', (array) $apiResponse); + + // Pastikan va_numbers ada di dalam respons + if (isset($apiResponse->va_numbers[0]->va_number)) { + $order->payment_va_number = $apiResponse->va_numbers[0]->va_number; + $order->save(); + + return response()->json([ + 'message' => 'Order created successfully', + 'order' => $order, + ], 200); + } else { + return response()->json([ + 'message' => 'Failed to create order with Midtrans', + 'error' => $apiResponse, + ], 400); + } + } + + + + + + + + public function orderApiPos(Request $request) + { + $request->validate([ + 'payment_amount' => 'required', + 'subtotal' => 'required', + 'tax' => 'required', + 'discount' => 'required', + 'service_charge' => 'required', + 'total_cost' => 'nullable', + 'payment_method' => 'required', + 'total_item' => 'required', + 'id_kasir' => 'required', + 'nama_kasir' => 'required', + 'order_items.*.id_product' => 'required|exists:products,id', + 'transaction_time' => 'required', + 'order_items' => 'required|array', + ]); + + $jumlahDiskon = (($request->discount) / 100 * $request->subtotal); + + // Start database transaction + DB::beginTransaction(); + + try { + // Create order + $order = Order::create([ + 'user_id' => $request->user()->id, + 'address_id' => $request->address_id, + 'payment_amount' => $request->payment_amount, + 'subtotal' => $request->subtotal, + 'tax' => $request->tax, + 'discount' => $request->discount, + 'service_charge' => $request->service_charge, + 'total_cost' => $request->subtotal - $jumlahDiskon, + 'payment_method' => $request->payment_method, + 'total_item' => $request->total_item, + 'id_kasir' => $request->id_kasir, + 'nama_kasir' => $request->nama_kasir, + 'status' => 'delivered', + 'transaction_time' => $request->transaction_time + ]); + + // Create order items and reduce product stock + foreach ($request->order_items as $item) { + $product = Product::find($item['id_product']); + $product->stock -= $item['quantity']; + $product->save(); + + OrderItem::create([ + 'order_id' => $order->id, + 'product_id' => $item['id_product'], + 'quantity' => $item['quantity'], + 'price' => $item['price'] + ]); + } + + // Commit the transaction + DB::commit(); + + return response()->json([ + 'status' => 'success', + 'data' => $order + ], 200); + } catch (\Exception $e) { + // Rollback the transaction if any error occurs + DB::rollBack(); + + return response()->json([ + 'status' => 'error', + 'message' => 'Failed to create order: ' . $e->getMessage(), + ], 500); + } + } + + public function getOrderById($id) + { + $order = Order::with('orderItems.product')->find($id); + $order->load('user', 'address'); + return response()->json([ + 'order' => $order, + ]); + } + + public function checkStatusOrder($id) + { + $order = Order::find($id); + return response()->json([ + 'status' => $order->status, + ]); + } + // function for get all order by user + public function getOrderByUser(Request $request) + { + $orders = Order::where('user_id', $request->user()->id)->get(); + + return response()->json([ + 'orders' => $orders, + ]); + } + + public function getTransactionCount(Request $request) + { + + $userId = $request->user()->id; + $transactionCount = Order::where('user_id', $userId)->count(); + + return response()->json([ + 'transaction_count' => $transactionCount, + ]); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/OrderController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/OrderController.php new file mode 100644 index 0000000..7c7d61a --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/OrderController.php @@ -0,0 +1,72 @@ +validate([ + 'address_id' => 'required', + 'payment_method' => 'required', + 'shipping_service' => 'nullable', + 'shipping_cost' => 'nullable', + 'total_cost' => 'required', + 'items' => 'required', + ]); + + $subtotal = 0; + foreach ($request->items as $item) { + $product = Product::find($item['product_id']); + $subtotal += $product->price * $item['quantity']; + } + + $order = Order::create([ + 'user_id' => $request->user()->id, + 'address_id' => $request->address_id, + 'subtotal' => $subtotal, + 'shipping_cost' => $request->shipping_cost, + 'total_cost' => $subtotal + $request->shipping_cost, + 'status' => 'pending', + 'payment_method' => $request->payment_method, + 'shipping_service' => $request->shipping_service, + 'transaction_number' => 'TRX' . rand(100000, 999999), + ]); + + // if payamen_va_name is not null + if ($request->payment_va_name) { + $order->update([ + 'payment_va_name' => $request->payment_va_name, + ]); + } + // create order items + foreach ($request->items as $item) { + OrderItem::create([ + 'order_id' => $order->id, + 'product_id' => $item['product_id'], + 'quantity' => $item['quantity'], + ]); + } + + // request ke midtrans + $midtrans = new CreateVAService($order->load('user', 'orderItems')); + $apiResponse = $midtrans->getVA(); + + $order->payment_va_number = $apiResponse->va_numbers[0]->va_number; + $order->save(); + + return response()->json([ + 'message' => 'Order created successfully', + 'order' => $order, + ]); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ProductApiController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ProductApiController.php new file mode 100644 index 0000000..b862eb6 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ProductApiController.php @@ -0,0 +1,119 @@ +category_id, function ($query) use ($request) { + return $query->where('category_id', $request->category_id); + })->get(); + $products->load('category'); + return response()->json([ + 'status' => 'Success', + 'data' => $products + ], 200); + } + + + public function store(Request $request) + { + $validatedData = $request->validate([ + 'name' => 'required|string', + 'price' => 'required|numeric', + 'stock' => 'required|integer', + 'image' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048', + 'is_available' => 'required|boolean', + 'description' => 'required|string', + 'category_id' => 'required|exists:categories,id' + ]); + + $imagePath = $request->file('image')->store('products', 'public'); + + $product = Product::create([ + 'name' => $validatedData['name'], + 'price' => $validatedData['price'], + 'stock' => $validatedData['stock'], + 'image' => $imagePath, + 'is_available' => $validatedData['is_available'], + 'description' => $validatedData['description'], + 'category_id' => $validatedData['category_id'] + ]); + + if ($product) { + return response()->json([ + 'success' => true, + 'message' => 'Product Created', + 'data' => $product + ], 201); + } else { + return response()->json([ + 'success' => false, + 'message' => 'Product failed to Save' + ], 409); + } + } + + + + // $request->validate( + // [ + // 'name' => 'required|min:3', + // 'price' => 'required|integer', + // 'stock' => 'required|integer', + // 'image' => 'required|image|mimes:png,jpg,jpeg', + // 'is_available' => 'required|integer', + // 'description' => '', + // 'category_id' => 'required|integer' + // ] + // ); + /** + * Display the specified resource. + */ + public function show(string $id) + { + $product = Product::find($id); + return response()->json([ + 'message' => 'Success', + 'data' => $product + ], 200); + } + + /** + * Update the specified resource in storage. + */ + public function updateProduct(Request $request, $id) + { + $product = Product::findOrFail($id); + $data = $request->all(); + + if (!empty($data['image'])) { + $data['image'] = $request->file('image')->store('products', 'public'); + } else { + unset($data['image']); + } + + $product->update($data); + + return response()->json([ + 'success' => true, + 'message' => 'Product Updated successfully', + 'data' => $product + ]); + } + + public function destroyProduct($id) + { + Product::findOrFail($id)->delete(); + return response()->json([ + 'success' => true, + 'message' => 'Product Deleted successfully', + ]); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ProfileController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ProfileController.php new file mode 100644 index 0000000..8b284bf --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/ProfileController.php @@ -0,0 +1,89 @@ +json([ + 'message' => 'Profile retrieved successfully', + 'user' => $user + ], 200); + } + + public function updateProfile(Request $request) + { + $name = $request->get('name'); + $email = $request->get('email'); + $phone = $request->get('phone'); + + // print_r($request->all()); + // die(); + + Log::info('Name: ' . $name); + Log::info('Email: ' . $email); + Log::info('Phone: ' . $phone); + + $validator = Validator::make($request->all(), [ + 'name' => 'required|string|max:255', + 'email' => 'required|string|email|max:255|unique:users,email,' . Auth::id(), + 'phone' => 'required|string|max:15', + 'foto' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + ]); + + if ($validator->fails()) { + Log::error('Validation Error: ', $validator->errors()->toArray()); + + return response()->json([ + 'message' => 'Validation Error', + 'errors' => $validator->errors() + ], 422); + } + + $user = Auth::user(); + $user->name = $name; + $user->email = $email; + $user->phone = $phone; + + if ($request->hasFile('foto')) { + $file = $request->file('foto'); + $filename = time() . '_' . $file->getClientOriginalName(); + $file->storeAs('public/foto', $filename); + $user->foto = $filename; + } + + $user->save(); + + return response()->json([ + 'message' => 'Profile updated successfully', + 'user' => $user + ], 200); + } + + + // public function update(Request $request) + // { + // $user = Auth::user(); + + // $request->validate([ + // 'name' => 'required', + // 'email' => 'required|email|unique:profiles,email,' . $user->id, + // 'phone' => 'required', + // 'foto' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + // ]); + + // $user->profile->update($request->all()); + + // return response()->json($user->profile, 200); + // } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/PromoApiController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/PromoApiController.php new file mode 100644 index 0000000..66b061b --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/PromoApiController.php @@ -0,0 +1,77 @@ +json([ + 'status' => 'success', + 'data' => $promo + ], 200); + } + + + public function store(Request $request) + { + $request->validate([ + 'judul' => 'required', + 'deskripsi' => 'required', + ]); + + // Create discount + $promo = Promo::create($request->all()); + // Assuming $promo->user_id exists and is correct + $userId = $promo->first()->user_id; + // Check if user exists before sending notification + if ($userId) { + $this->sendNotificationToUserPromo($userId, $request->judul, $request->deskripsi); + } + + return response()->json([ + 'status' => 'success', + 'data' => $promo + ], 201); + } + + public function sendNotificationToUserPromo($userId, $judul, $message) + { + // Dapatkan FCM token user dari tabel 'users' + $user = User::find($userId); + + // Check if user existPPs + if ($user) { + $token = $user->fcm_id; + + // Check if user has a valid FCM token + if ($token) { + // Kirim notifikasi ke perangkat Android + $messaging = app('firebase.messaging'); + $notification = Notification::create($judul, $message); + + $message = CloudMessage::withTarget('token', $token) + ->withNotification($notification); + + $messaging->send($message); + } else { + // Handle case where user does not have an FCM token + // Log the issue or take appropriate action + Log::warning("User with ID $userId does not have an FCM token."); + } + } else { + // Handle case where user is not found + // Log the issue or take appropriate action + Log::warning("User with ID $userId not found."); + } + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/UserApiController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/UserApiController.php new file mode 100644 index 0000000..6ba90d1 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Api/UserApiController.php @@ -0,0 +1,17 @@ +user()->id)->get(); + return $this->success($users); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/ConfirmPasswordController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/ConfirmPasswordController.php new file mode 100644 index 0000000..3559954 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/ConfirmPasswordController.php @@ -0,0 +1,39 @@ +middleware('auth'); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/ForgotPasswordController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/ForgotPasswordController.php new file mode 100644 index 0000000..465c39c --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -0,0 +1,22 @@ +middleware('guest')->except('logout'); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/RegisterController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/RegisterController.php new file mode 100644 index 0000000..f85ed28 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/RegisterController.php @@ -0,0 +1,72 @@ +middleware('guest'); + } + + /** + * Get a validator for an incoming registration request. + * + * @param array $data + * @return \Illuminate\Contracts\Validation\Validator + */ + protected function validator(array $data) + { + return Validator::make($data, [ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'password' => ['required', 'string', 'min:8', 'confirmed'], + ]); + } + + /** + * Create a new user instance after a valid registration. + * + * @param array $data + * @return \App\Models\User + */ + protected function create(array $data) + { + return User::create([ + 'name' => $data['name'], + 'email' => $data['email'], + 'password' => Hash::make($data['password']), + ]); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/ResetPasswordController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/ResetPasswordController.php new file mode 100644 index 0000000..fe965b2 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Auth/ResetPasswordController.php @@ -0,0 +1,29 @@ +middleware('auth'); + $this->middleware('signed')->only('verify'); + $this->middleware('throttle:6,1')->only('verify', 'resend'); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/CategoryController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/CategoryController.php new file mode 100644 index 0000000..1eb9dcb --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/CategoryController.php @@ -0,0 +1,43 @@ +get(); + return view('admin.category.index', compact('categories')); + } + + + public function store(Request $request) + { + $data = $request->all(); + $data['image'] = $request->file('image')->store('category', 'public'); + Category::create($data); + return redirect('/admin/category'); + } + + public function update(Request $request, $id) + { + $data = $request->all(); + if (!empty($data['image'])) { + $data['image'] = $request->file('image')->store('category', 'public'); + } else { + unset($data['image']); + } + Category::findOrFail($id)->update($data); + return redirect('/admin/category'); + } + + public function destroy($id) + { + Category::findOrFail($id)->delete(); + return redirect('/admin/category'); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/ChannelController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/ChannelController.php new file mode 100644 index 0000000..e89cbe8 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/ChannelController.php @@ -0,0 +1,30 @@ +validate([ + 'name' => 'required|string|max:255', + ]); + + $channel = Channel::create([ + 'name' => $validatedData['name'], + 'user_id' => Auth::id(), + ]); + + return response()->json(['channel' => $channel], 201); + } + + public function index() + { + $channels = Channel::all(); + return response()->json($channels); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Controller.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..6b39dbe --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/Controller.php @@ -0,0 +1,30 @@ +json([ + 'data' => $data, + 'success' => true, + 'message' => $message, + ], $statusCode); + } + + public function error(string $message, int $statusCode = 400): JsonResponse + { + return response()->json([ + 'data' => null, + 'success' => false, + 'message' => $message, + ], $statusCode); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/DashboardController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/DashboardController.php new file mode 100644 index 0000000..517692b --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/DashboardController.php @@ -0,0 +1,112 @@ +leftJoin('order_items', 'orders.id', '=', 'order_items.order_id') + ->leftJoin('products', 'products.id', '=', 'order_items.product_id') + ->where('orders.status', 'delivered') + ->whereMonth('orders.created_at', $month) + ->whereYear('orders.created_at', Carbon::now()->year) + ->sum('orders.total_cost'); + + $jumlah_pendapatan[] = (object)[ + 'total_pendapatan' => $total_pendapatan, + 'bulan' => $nama_bulan[$month - 1], + 'bulan_num' => $month + ]; + } + + // Extracting labels and values for further use + $label = array_column($jumlah_pendapatan, 'bulan'); + $jumlah_pendapatan_values = array_column($jumlah_pendapatan, 'total_pendapatan'); + + + // dd($jumlah_pendapatan_values); + + // total pendapatan + // $totalPendapatan = DB::table('orders') + // ->leftJoin('order_items', 'orders.id', '=', 'order_items.order_id') + // ->where('orders.status', 'delivered') + // ->whereDate('orders.transaction_time', date('Y-m-d')) + // ->select( + // DB::raw('SUM(order_items.quantity * order_items.price) as total_pemesanan') + // )->get(); + + $thirtyDaysAgo = Carbon::now()->subDays(30); + + $jumlahUserAktif = DB::table('users') + ->where('created_at', '>=', $thirtyDaysAgo) + ->where('roles', 'member') + ->count(); + + // Get the current date + $currentDate = Carbon::now()->toDateString(); + + // Count the number of transactions for today + $totalTransaksi = DB::table('orders') + ->whereDate('created_at', $currentDate) + ->count(); + + // dd($totalTransaksi); + + + + $totalPemesanan = DB::table('orders') + ->join('order_items', 'orders.id', '=', 'order_items.order_id') + ->join('products', 'order_items.product_id', '=', 'products.id') + ->select( + DB::raw('DATE(orders.transaction_time) as hari_pemesanan'), + DB::raw('SUM(order_items.quantity) as total_pemesanan') + ) + ->whereDate('orders.transaction_time', date('Y-m-d')) + ->where('status', 'delivered') + ->groupBy(DB::raw('DATE(orders.transaction_time)')) + ->get(); + + // dd($totalPemesanan); + + $totalPendapatanBulanan = DB::table('orders') + ->leftJoin('order_items', 'orders.id', '=', 'order_items.order_id') + ->where('orders.status', 'delivered') + ->whereMonth('orders.transaction_time', now()->month) + ->whereYear('orders.transaction_time', now()->year) + ->select( + DB::raw('SUM(order_items.quantity * order_items.price) as total_pendapatan') + ) + ->value('total_pendapatan'); + // dd($totalPendapatanBulanan); + + $totalPendapatanHarian = DB::table('orders') + ->where('orders.status', 'delivered') + ->whereDate('orders.created_at', Carbon::today()) + ->sum('orders.total_cost'); + + // dd($totalPendapatanHarian); + + return view('admin.dashboard.index', compact('totalPendapatanBulanan', 'jumlah_pendapatan_values', 'totalPendapatanHarian', 'label', 'jumlah_pendapatan', 'jumlahUserAktif', 'totalTransaksi')); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/HomeController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/HomeController.php new file mode 100644 index 0000000..7cbc2c3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/HomeController.php @@ -0,0 +1,28 @@ +middleware('auth'); + } + + /** + * Show the application dashboard. + * + * @return \Illuminate\Contracts\Support\Renderable + */ + public function index() + { + return view('home'); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/MessageController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/MessageController.php new file mode 100644 index 0000000..817d8f5 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/MessageController.php @@ -0,0 +1,30 @@ + $request->channel_id, + 'user_id' => Auth::id(), + 'message' => $request->message, + ]); + + broadcast(new MessageSent($message))->toOthers(); + + return response()->json(['message' => $message, 'channel_id' => $request->channel_id], 201); + } + + public function getMessages($channel_id) + { + $messages = Message::where('channel_id', $channel_id)->get(); + return response()->json($messages); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/OrderController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/OrderController.php new file mode 100644 index 0000000..38db991 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/OrderController.php @@ -0,0 +1,65 @@ +get(); + return view('admin.order.index', compact('orders')); + } + + public function store(Request $request) + { + $data = $request->all(); + Order::create($data); + return redirect('/admin/order'); + } + + public function update(Request $request, $id) + { + $order = DB::table('orders')->where('id', $id); + $order->update([ + 'status' => $request->status, + 'shipping_resi' => $request->shipping_resi + ]); + //send notification to user + if ($request->status == 'on_delivery') { + $this->sendNotificationToUser($order->first()->user_id, 'Paket Dikirim Dengan Nomor Resi ' . $request->shipping_resi); + } + return redirect('/admin/order'); + } + + public function destroy($id) + { + Order::findOrFail($id)->delete(); + return redirect('/admin/order'); + } + + + public function sendNotificationToUser($userId, $message) + { + // Dapatkan FCM token user dari tabel 'users' + $user = User::find($userId); + $token = $user->fcm_id; + // Kirim notifikasi ke perangkat Android + $messaging = app('firebase.messaging'); + $notification = Notification::create('Paket Dikirim, Nantikan Promo Diskon Menarik lainnya', $message); + + $message = CloudMessage::withTarget('token', $token) + ->withNotification($notification) + ->withData(['message' => $message]); + + $messaging->send($message); + } + + +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/ProductController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/ProductController.php new file mode 100644 index 0000000..94ad307 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/ProductController.php @@ -0,0 +1,93 @@ +get(); + $categories = Category::all(); + return view('admin.product.index', compact('products', 'categories')); + } + + public function store(Request $request) + { + + $data = $request->all(); + $data['image'] = $request->file('image')->store('products', 'public'); + Product::create($data); + return redirect('/admin/product'); + } + + public function update(Request $request, $id) + { + try { + $data = $request->all(); + if (!empty($data['image'])) { + $data['image'] = $request->file('image')->store('products', 'public'); + } else { + unset($data['image']); + } + + // Menambahkan pembaruan untuk category_id + if (isset($data['category'])) { + $data['category_id'] = $data['category']; + unset($data['category']); + } + + // Update stok produk jika ada perubahan jumlah + if (isset($data['stock'])) { + $product = Product::findOrFail($id); + $stockChange = $data['stock'] - $product->stock; + $product->stock += $stockChange; + $product->save(); + } + + Product::findOrFail($id)->update($data); + return redirect('/admin/product'); + } catch (\Exception $e) { + dd($e->getMessage()); // Tampilkan pesan error + } + } + + + // public function update(Request $request, $id) + // { + // try { + // $data = $request->all(); + // // $oldImagePath = Product::findOrFail($id)->image; + // if (!empty($data['image'])) { + // $data['image'] = $request->file('image')->store('products', 'public'); + // // Hapus gambar lama jika ada + // // if ($oldImagePath) { + // // Storage::disk('public')->delete($oldImagePath); + // // } + // } else { + // unset($data['image']); + // // Hapus gambar lama jika ada + // // if ($oldImagePath) { + // // Storage::disk('public')->delete($oldImagePath); + // // } + // } + // Product::findOrFail($id)->update($data); + // return redirect('/admin/product'); + // } catch (\Exception $e) { + // dd($e->getMessage()); // Tampilkan pesan error + // } + // } + + + public function destroy($id) + { + Product::findOrFail($id)->delete(); + return redirect('/admin/product'); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/PromoController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/PromoController.php new file mode 100644 index 0000000..9e4594e --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/PromoController.php @@ -0,0 +1,54 @@ +get(); + return view('admin.promo.index', compact('promos')); + } + + public function store(Request $request) + { + $data = $request->all(); + Promo::create($data); + $this->sendNotificationToUser($data['user_id'], 'Promo Baru : ' . $request->deskripsi); + return redirect('/admin/promo'); + } + + public function update(Request $request, $id) + { + $data = $request->all(); + Promo::findOrFail($id)->update($data); + return redirect('/admin/promo'); + } + + public function destroy($id) + { + Promo::findOrFail($id)->delete(); + return redirect('/admin/promo'); + } + + public function sendNotificationToUser($userId, $message) + { + // Dapatkan FCM token user dari tabel 'users' + $user = User::find($userId); + $token = $user->fcm_id; + // Kirim notifikasi ke perangkat Android + $messaging = app('firebase.messaging'); + $notification = Notification::create('Paket Dikirim', $message); + + $message = CloudMessage::withTarget('token', $token) + ->withNotification($notification); + + $messaging->send($message); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/ReportController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/ReportController.php new file mode 100644 index 0000000..b0d95e1 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/ReportController.php @@ -0,0 +1,114 @@ +leftJoin('users', 'users.id', '=', 'orders.user_id') + ->leftJoin('order_items', 'orders.id', '=', 'order_items.order_id') + ->leftJoin('products', 'products.id', '=', 'order_items.product_id') + ->whereDate('orders.created_at', '>=', $tglMulai) + ->whereDate('orders.created_at', '<=', $tglSelesai) + ->where('orders.status', $status) + ->select( + 'orders.created_at as tanggal', + 'users.name as kasir', + 'products.name as pesanan', + 'order_items.price as harga_satuan', + 'order_items.quantity as jumlah', + 'orders.discount as diskon', + 'orders.status as status' + ) + ->orderBy('orders.id', 'desc') + ->get(); + // dd($data); + + $jumlah = DB::table('orders') + ->leftJoin('order_items', 'orders.id', '=', 'order_items.order_id') + ->whereBetween('orders.transaction_time', [$tglMulai, $tglSelesai]) + ->where('orders.status', $status) + ->sum('order_items.quantity'); + + $sumTotal = DB::table('order_items') + ->leftJoin('orders', 'orders.id', '=', 'order_items.order_id') + ->where('orders.status', $status) + ->whereBetween('orders.transaction_time', [$tglMulai, $tglSelesai]) + ->selectRaw('SUM(IF( + orders.discount IS NULL OR orders.discount = 0, + order_items.price * order_items.quantity, + (order_items.price * order_items.quantity) - (orders.discount / 100 * (order_items.price * order_items.quantity)) + )) as total') + ->value('total'); + + return view('admin.report.cekLaporan', [ + 'data' => $data, + 'sumTotal' => $sumTotal, + 'jumlah' => $jumlah, + 'tglMulai' => $tglMulai, + 'tglSelesai' => $tglSelesai, + 'status' => $status + ]); + } + + public function cetak($tglMulai, $tglSelesai, $status) + { + $data = DB::table('orders') + ->leftJoin('users', 'users.id', '=', 'orders.user_id') + ->leftJoin('order_items', 'orders.id', '=', 'order_items.order_id') + ->leftJoin('products', 'products.id', '=', 'order_items.product_id') + ->whereDate('orders.created_at', '>=', $tglMulai) + ->whereDate('orders.created_at', '<=', $tglSelesai) + ->where('orders.status', $status) + ->select( + 'orders.created_at as tanggal', + 'orders.id as nomer_penjualan', + 'users.name as kasir', + 'products.name as pesanan', + 'order_items.price as harga_satuan', + 'order_items.quantity as jumlah', + 'orders.discount as diskon', + 'orders.status as status' + ) + ->orderBy('orders.id', 'desc') + ->get(); + + $jumlah = DB::table('orders') + ->leftJoin('order_items', 'orders.id', '=', 'order_items.order_id') + ->whereBetween('orders.transaction_time', [$tglMulai, $tglSelesai]) + ->where('orders.status', $status) + ->sum('order_items.quantity'); + + $sumTotal = DB::table('order_items') + ->leftJoin('orders', 'orders.id', '=', 'order_items.order_id') + ->where('orders.status', $status) + ->whereBetween('orders.transaction_time', [$tglMulai, $tglSelesai]) + ->selectRaw('SUM(IF( + orders.discount IS NULL OR orders.discount = 0, + order_items.price * order_items.quantity, + (order_items.price * order_items.quantity) - (orders.discount / 100 * (order_items.price * order_items.quantity)) + )) as total') + ->value('total'); + + return view('admin.report.cetak', [ + 'data' => $data, + 'sumTotal' => $sumTotal, + 'jumlah' => $jumlah, + 'tglMulai' => $tglMulai, + 'tglSelesai' => $tglSelesai, + 'status' => $status + ]); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/UserController.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/UserController.php new file mode 100644 index 0000000..aef3b00 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Controllers/UserController.php @@ -0,0 +1,43 @@ +get(); + return view('admin.user.index', compact('users')); + } + + + public function store(Request $request) + { + $data = $request->all(); + $data['foto'] = $request->file('foto')->store('user', 'public'); + User::create($data); + return redirect('/admin/user'); + } + + public function update(Request $request, $id) + { + $data = $request->all(); + if (!empty($data['foto'])) { + $data['foto'] = $request->file('foto')->store('user', 'public'); + } else { + unset($data['foto']); + } + User::findOrFail($id)->update($data); + return redirect('/admin/user'); + } + + public function destroy($id) + { + User::findOrFail($id)->delete(); + return redirect('/admin/user'); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Kernel.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Kernel.php new file mode 100644 index 0000000..494c050 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Kernel.php @@ -0,0 +1,68 @@ + + */ + protected $middleware = [ + // \App\Http\Middleware\TrustHosts::class, + \App\Http\Middleware\TrustProxies::class, + \Illuminate\Http\Middleware\HandleCors::class, + \App\Http\Middleware\PreventRequestsDuringMaintenance::class, + \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, + \App\Http\Middleware\TrimStrings::class, + \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + ]; + + /** + * The application's route middleware groups. + * + * @var array> + */ + protected $middlewareGroups = [ + 'web' => [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's middleware aliases. + * + * Aliases may be used instead of class names to conveniently assign middleware to routes and groups. + * + * @var array + */ + protected $middlewareAliases = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class, + 'signed' => \App\Http\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + ]; +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/Authenticate.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..d4ef644 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/Authenticate.php @@ -0,0 +1,17 @@ +expectsJson() ? null : route('login'); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/EncryptCookies.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 0000000..867695b --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/PreventRequestsDuringMaintenance.php new file mode 100644 index 0000000..74cbd9a --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/PreventRequestsDuringMaintenance.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/RedirectIfAuthenticated.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/RedirectIfAuthenticated.php new file mode 100644 index 0000000..afc78c4 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/RedirectIfAuthenticated.php @@ -0,0 +1,30 @@ +check()) { + return redirect(RouteServiceProvider::HOME); + } + } + + return $next($request); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/TrimStrings.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000..88cadca --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,19 @@ + + */ + protected $except = [ + 'current_password', + 'password', + 'password_confirmation', + ]; +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/TrustHosts.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/TrustHosts.php new file mode 100644 index 0000000..c9c58bd --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/TrustHosts.php @@ -0,0 +1,20 @@ + + */ + public function hosts(): array + { + return [ + $this->allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/TrustProxies.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/TrustProxies.php new file mode 100644 index 0000000..3391630 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,28 @@ +|string|null + */ + protected $proxies; + + /** + * The headers that should be used to detect proxies. + * + * @var int + */ + protected $headers = + Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_HOST | + Request::HEADER_X_FORWARDED_PORT | + Request::HEADER_X_FORWARDED_PROTO | + Request::HEADER_X_FORWARDED_AWS_ELB; +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/ValidateSignature.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/ValidateSignature.php new file mode 100644 index 0000000..093bf64 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/ValidateSignature.php @@ -0,0 +1,22 @@ + + */ + protected $except = [ + // 'fbclid', + // 'utm_campaign', + // 'utm_content', + // 'utm_medium', + // 'utm_source', + // 'utm_term', + ]; +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/VerifyCsrfToken.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 0000000..9e86521 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/GetChartRequest.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/GetChartRequest.php new file mode 100644 index 0000000..8d0f489 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/GetChartRequest.php @@ -0,0 +1,28 @@ +|string> + */ + public function rules(): array + { + return [ + 'is_private' => 'nullable|boolean' + ]; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/GetMessageRequest.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/GetMessageRequest.php new file mode 100644 index 0000000..25e0c50 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/GetMessageRequest.php @@ -0,0 +1,32 @@ +|string> + */ + public function rules(): array + { + $chatModel = get_class(new Chat()); + return [ + 'chat_id' => "required|exists:{$chatModel},id", + 'page' => 'required|numeric', + 'page_size' => 'nullable|numeric', + ]; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/StoreChatRequest.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/StoreChatRequest.php new file mode 100644 index 0000000..e99b4ba --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/StoreChatRequest.php @@ -0,0 +1,33 @@ +|string> + */ + public function rules(): array + { + $userModel = get_class(new User()); + + return [ + 'user_id'=> "required|exists:{$userModel},id", + 'name'=>'nullable', + 'is_private'=>'nullable|boolean', + ]; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/StoreMessageRequest.php b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/StoreMessageRequest.php new file mode 100644 index 0000000..d2da84f --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Http/Requests/StoreMessageRequest.php @@ -0,0 +1,31 @@ +|string> + */ + public function rules(): array + { + $chatModel = get_class(new Chat()); + return [ + 'chat_id' => "required|exists:{$chatModel},id", + 'message' => 'required|string', + ]; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Models/Address.php b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Address.php new file mode 100644 index 0000000..ba3666c --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Address.php @@ -0,0 +1,17 @@ +belongsTo(User::class); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Models/Category.php b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Category.php new file mode 100644 index 0000000..159bad8 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Category.php @@ -0,0 +1,12 @@ +belongsTo(User::class); + } + + public function messages() + { + return $this->hasMany(Message::class); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Models/Chat.php b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Chat.php new file mode 100644 index 0000000..6fb44c8 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Chat.php @@ -0,0 +1,38 @@ +hasMany(ChatPartisipant::class, 'chat_id'); + } + + public function messages(): HasMany + { + return $this->hasMany(ChatMessage::class, 'chat_id'); + } + + public function lastMessage(): HasOne + { + return $this->hasOne(ChatMessage::class, 'chat_id')->latest('updated_at'); + } + + public function scopeHasPartisipant($query, int $userId) + { + return $query->whereHas('partisipants', function ($q) use ($userId) { + $q->where('user_id', $userId); + }); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Models/ChatMessage.php b/BackEnd/laravel-pos-ecommerce-backend/app/Models/ChatMessage.php new file mode 100644 index 0000000..fdd4e77 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Models/ChatMessage.php @@ -0,0 +1,26 @@ +belongsTo(User::class, 'user_id'); + } + + public function chat(): BelongsTo + { + return $this->belongsTo(Chat::class, 'chat_id'); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Models/ChatPartisipant.php b/BackEnd/laravel-pos-ecommerce-backend/app/Models/ChatPartisipant.php new file mode 100644 index 0000000..70e140a --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Models/ChatPartisipant.php @@ -0,0 +1,20 @@ +belongsTo(User::class, 'user_id'); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Models/Discount.php b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Discount.php new file mode 100644 index 0000000..1ed6f78 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Discount.php @@ -0,0 +1,13 @@ +belongsTo(User::class); + } + + public function channel() + { + return $this->belongsTo(Channel::class); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Models/Order.php b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Order.php new file mode 100644 index 0000000..970c289 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Order.php @@ -0,0 +1,27 @@ +belongsTo(User::class); + } + + public function orderItems() + { + return $this->hasMany(OrderItem::class); + } + + public function address() + { + return $this->belongsTo(Address::class); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Models/OrderItem.php b/BackEnd/laravel-pos-ecommerce-backend/app/Models/OrderItem.php new file mode 100644 index 0000000..b9a832f --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Models/OrderItem.php @@ -0,0 +1,22 @@ +belongsTo(Product::class); + } + + public function order(){ + return $this->belongsTo(Order::class); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Models/Product.php b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Product.php new file mode 100644 index 0000000..5debd1d --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Product.php @@ -0,0 +1,23 @@ +belongsTo(Category::class); + } +} + + + + diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Models/Promo.php b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Promo.php new file mode 100644 index 0000000..270bca0 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Models/Promo.php @@ -0,0 +1,18 @@ +belongsTo(User::class); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Models/User.php b/BackEnd/laravel-pos-ecommerce-backend/app/Models/User.php new file mode 100644 index 0000000..d17b0f5 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Models/User.php @@ -0,0 +1,72 @@ + + */ + // protected $fillable = [ + // 'name', + // 'email', + // 'password', + + // ]; + + protected $table = "users"; + protected $guarded = ['id']; + /** + * The attributes that should be hidden for serialization. + * + * @var array + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + + const USER_TOKEN = "userToken"; + + public function address() + { + return $this->hasMany(Address::class); + } + + public function chats(): HasMany + { + return $this->hasMany(Chat::class, 'created_by'); + } + + public function routeNotificationForOneSignal(): array + { + return ['tags' => ['key' => 'userId', 'relation' => '=', 'value' => (string)($this->id)]]; + } + + public function sendNewMessageNotification(array $data): void + { + $this->notify(new MessageSent($data)); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Notifications/MessageSent.php b/BackEnd/laravel-pos-ecommerce-backend/app/Notifications/MessageSent.php new file mode 100644 index 0000000..4cc57bd --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Notifications/MessageSent.php @@ -0,0 +1,54 @@ + + */ + public function via(object $notifiable): array + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + */ + public function toMail(object $notifiable): MailMessage + { + return (new MailMessage) + ->line('The introduction to the notification.') + ->action('Notification Action', url('/')) + ->line('Thank you for using our application!'); + } + + /** + * Get the array representation of the notification. + * + * @return array + */ + public function toArray(object $notifiable): array + { + return [ + // + ]; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Providers/AppServiceProvider.php b/BackEnd/laravel-pos-ecommerce-backend/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..452e6b6 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Providers/AppServiceProvider.php @@ -0,0 +1,24 @@ + + */ + protected $policies = [ + // + ]; + + /** + * Register any authentication / authorization services. + */ + public function boot(): void + { + // + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Providers/BroadcastServiceProvider.php b/BackEnd/laravel-pos-ecommerce-backend/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..2be04f5 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,19 @@ +> + */ + protected $listen = [ + Registered::class => [ + SendEmailVerificationNotification::class, + ], + ]; + + /** + * Register any events for your application. + */ + public function boot(): void + { + // + } + + /** + * Determine if events and listeners should be automatically discovered. + */ + public function shouldDiscoverEvents(): bool + { + return false; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Providers/RouteServiceProvider.php b/BackEnd/laravel-pos-ecommerce-backend/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..1cf5f15 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Providers/RouteServiceProvider.php @@ -0,0 +1,40 @@ +by($request->user()?->id ?: $request->ip()); + }); + + $this->routes(function () { + Route::middleware('api') + ->prefix('api') + ->group(base_path('routes/api.php')); + + Route::middleware('web') + ->group(base_path('routes/web.php')); + }); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Services/Midtrans/CallbackService.php b/BackEnd/laravel-pos-ecommerce-backend/app/Services/Midtrans/CallbackService.php new file mode 100644 index 0000000..b62878d --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Services/Midtrans/CallbackService.php @@ -0,0 +1,79 @@ +serverKey = config('midtrans.server_key'); + $this->_handleNotification(); + } + + public function isSignatureKeyVerified() + { + return ($this->_createLocalSignatureKey() == $this->notification->signature_key); + } + + public function isSuccess() + { + $statusCode = $this->notification->status_code; + $transactionStatus = $this->notification->transaction_status; + $fraudStatus = !empty($this->notification->fraud_status) ? ($this->notification->fraud_status == 'accept') : true; + + return ($statusCode == 200 && $fraudStatus && ($transactionStatus == 'capture' || $transactionStatus == 'settlement')); + } + + public function isExpire() + { + return ($this->notification->transaction_status == 'expire'); + } + + public function isCancelled() + { + return ($this->notification->transaction_status == 'cancel'); + } + + public function getNotification() + { + return $this->notification; + } + + public function getOrder() + { + return $this->order; + } + + protected function _createLocalSignatureKey() + { + $orderId = $this->order->number; + $statusCode = $this->notification->status_code; + $grossAmount = $this->order->total_price; + $serverKey = $this->serverKey; + $input = $orderId . $statusCode . $grossAmount . $serverKey; + $signature = openssl_digest($input, 'sha512'); + + return $signature; + } + + protected function _handleNotification() + { + $notification = new Notification(); + + $orderNumber = $notification->order_id; + $order = Order::where('transaction_number', $orderNumber)->first(); + + $this->notification = $notification; + $this->order = $order; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Services/Midtrans/CreateVAService.php b/BackEnd/laravel-pos-ecommerce-backend/app/Services/Midtrans/CreateVAService.php new file mode 100644 index 0000000..98603bd --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Services/Midtrans/CreateVAService.php @@ -0,0 +1,84 @@ +order = $order; + } + + protected function initializeMidtrans() + { + // Konfigurasi Midtrans + Config::$serverKey = env('MIDTRANS_SERVER_KEY'); + Config::$isProduction = false; // Ubah ke true jika menggunakan lingkungan produksi + Config::$isSanitized = true; + Config::$is3ds = true; + } + + public function getVA() + { + $itemDetails = []; + + foreach ($this->order->orderItems as $orderItem) { + $itemDetails[] = [ + 'id' => $orderItem->product->id, + 'price' => $orderItem->product->price, + 'quantity' => $orderItem->quantity, + 'name' => $orderItem->product->name, + ]; + } + + // Menambahkan biaya pengiriman ke item details + $itemDetails[] = [ + 'id' => 'SHIPPING_COST', + 'price' => $this->order->shipping_cost, + 'quantity' => 1, + 'name' => 'SHIPPING_COST', + ]; + + $itemDetails[] = [ + 'id' => 'DISCOUNT', + 'price' => (($this->order->discount / 100) * $this->order->subtotal) * -1, + 'quantity' => 1, + 'name' => 'DISCOUNT', + ]; + + $grossAmount = array_reduce($itemDetails, function ($sum, $item) { + return $sum + ($item['price'] * $item['quantity']); + }, 0); + + Log::info('Calculated Gross Amount:', ['gross_amount' => $grossAmount]); + Log::info('Item Details:', $itemDetails); + + $params = [ + 'payment_type' => 'bank_transfer', + 'transaction_details' => [ + 'order_id' => $this->order->transaction_number, + 'gross_amount' => $this->order->total_cost, + ], + 'item_details' => $itemDetails, + 'customer_details' => [ + 'first_name' => $this->order->user->name, + 'email' => $this->order->user->email + ], + 'bank_transfer' => [ + 'bank' => $this->order->payment_va_name, + ], + ]; + + $response = CoreApi::charge($params); + + return $response; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/app/Services/Midtrans/Midtrans.php b/BackEnd/laravel-pos-ecommerce-backend/app/Services/Midtrans/Midtrans.php new file mode 100644 index 0000000..956d344 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/app/Services/Midtrans/Midtrans.php @@ -0,0 +1,31 @@ +serverKey = config('midtrans.server_key'); + $this->isProduction = config('midtrans.is_production'); + $this->isSanitized = config('midtrans.is_sanitized'); + $this->is3ds = config('midtrans.is_3ds'); + + $this->_configureMidtrans(); + } + + public function _configureMidtrans() + { + Config::$serverKey = $this->serverKey; + Config::$isProduction = $this->isProduction; + Config::$isSanitized = $this->isSanitized; + Config::$is3ds = $this->is3ds; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/artisan b/BackEnd/laravel-pos-ecommerce-backend/artisan new file mode 100644 index 0000000..67a3329 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/artisan @@ -0,0 +1,53 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/BackEnd/laravel-pos-ecommerce-backend/bootstrap/app.php b/BackEnd/laravel-pos-ecommerce-backend/bootstrap/app.php new file mode 100644 index 0000000..037e17d --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/BackEnd/laravel-pos-ecommerce-backend/bootstrap/cache/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/BackEnd/laravel-pos-ecommerce-backend/composer.json b/BackEnd/laravel-pos-ecommerce-backend/composer.json new file mode 100644 index 0000000..fe61195 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/composer.json @@ -0,0 +1,71 @@ +{ + "name": "laravel/laravel", + "type": "project", + "description": "The skeleton application for the Laravel framework.", + "keywords": ["laravel", "framework"], + "license": "MIT", + "require": { + "php": "^8.1", + "guzzlehttp/guzzle": "^7.2", + "kreait/laravel-firebase": "^5.8", + "laravel-notification-channels/onesignal": "^2.5", + "laravel/framework": "^10.10", + "laravel/sanctum": "^3.3", + "laravel/tinker": "^2.8", + "laravel/ui": "^4.4", + "midtrans/midtrans-php": "^2.5", + "pusher/pusher-php-server": "^7.2" + }, + "require-dev": { + "fakerphp/faker": "^1.9.1", + "laravel/pint": "^1.0", + "laravel/sail": "^1.18", + "mockery/mockery": "^1.4.4", + "nunomaduro/collision": "^7.0", + "phpunit/phpunit": "^10.1", + "spatie/laravel-ignition": "^2.0" + }, + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "scripts": { + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi" + ], + "post-update-cmd": [ + "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi" + ] + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true, + "php-http/discovery": true + } + }, + "minimum-stability": "stable", + "prefer-stable": true +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/composer.lock b/BackEnd/laravel-pos-ecommerce-backend/composer.lock new file mode 100644 index 0000000..ace0f15 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/composer.lock @@ -0,0 +1,10217 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "1e48981737699ada5016bd515b594bfd", + "packages": [ + { + "name": "berkayk/onesignal-laravel", + "version": "v2.1", + "source": { + "type": "git", + "url": "https://github.com/berkayk/laravel-onesignal.git", + "reference": "292973c63914b7b6a6b788a7849c1060abfe9079" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/berkayk/laravel-onesignal/zipball/292973c63914b7b6a6b788a7849c1060abfe9079", + "reference": "292973c63914b7b6a6b788a7849c1060abfe9079", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.2|^7.4.1|^7.2", + "illuminate/support": "~5.5|~6.0|~7.0|~8.0|~9.0|^10.0|^11.0", + "php": ">=5.4.0", + "symfony/psr-http-message-bridge": "1.*|2.*|^7.0" + }, + "require-dev": { + "vlucas/phpdotenv": "^2.2|^5.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Berkayk\\OneSignal\\OneSignalServiceProvider" + ], + "aliases": { + "OneSignal": "Berkayk\\OneSignal\\OneSignalFacade" + } + } + }, + "autoload": { + "psr-4": { + "Berkayk\\OneSignal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Berkay Kaya", + "email": "berkayk@gmail.com", + "homepage": "http://berkaykaya.com" + }, + { + "name": "Maykonn Welington Candido", + "email": "maykonn@outlook.com" + } + ], + "description": "OneSignal Push Wrapper Laravel", + "keywords": [ + "WebPush", + "laravel", + "laravel 5", + "onesignal", + "push" + ], + "support": { + "issues": "https://github.com/berkayk/laravel-onesignal/issues", + "source": "https://github.com/berkayk/laravel-onesignal/tree/v2.1" + }, + "time": "2024-03-26T12:15:06+00:00" + }, + { + "name": "beste/clock", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/beste/clock.git", + "reference": "7004b55fcd54737b539886244b3a3b2188181974" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beste/clock/zipball/7004b55fcd54737b539886244b3a3b2188181974", + "reference": "7004b55fcd54737b539886244b3a3b2188181974", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9.1", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^9.5.26", + "psalm/plugin-phpunit": "^0.16.1", + "vimeo/psalm": "^4.29" + }, + "type": "library", + "autoload": { + "files": [ + "src/Clock.php" + ], + "psr-4": { + "Beste\\Clock\\": "src/Clock" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérôme Gamez", + "email": "jerome@gamez.name" + } + ], + "description": "A collection of Clock implementations", + "keywords": [ + "clock", + "clock-interface", + "psr-20", + "psr20" + ], + "support": { + "issues": "https://github.com/beste/clock/issues", + "source": "https://github.com/beste/clock/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/jeromegamez", + "type": "github" + } + ], + "time": "2022-11-26T18:03:05+00:00" + }, + { + "name": "beste/in-memory-cache", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/beste/in-memory-cache-php.git", + "reference": "f2d504b4f15ac841b1d8b34046619505ba4c9e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beste/in-memory-cache-php/zipball/f2d504b4f15ac841b1d8b34046619505ba4c9e77", + "reference": "f2d504b4f15ac841b1d8b34046619505ba4c9e77", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/cache": "^2.0 || ^3.0", + "psr/clock": "^1.0" + }, + "provide": { + "psr/cache-implementation": "2.0 || 3.0" + }, + "require-dev": { + "beste/clock": "^3.0", + "friendsofphp/php-cs-fixer": "^3.41.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.10.48", + "phpstan/phpstan-deprecation-rules": "^1.1.4", + "phpstan/phpstan-phpunit": "^1.3.15", + "phpstan/phpstan-strict-rules": "^1.5.2", + "phpunit/phpunit": "^10.5.2", + "symfony/var-dumper": "^6.4.0" + }, + "suggest": { + "psr/clock-implementation": "Allows injecting a Clock, for example a frozen clock for testing" + }, + "type": "library", + "autoload": { + "psr-4": { + "Beste\\Cache\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérôme Gamez", + "email": "jerome@gamez.name" + } + ], + "description": "A PSR-6 In-Memory cache that can be used as a fallback implementation and/or in tests.", + "keywords": [ + "beste", + "cache", + "psr-6" + ], + "support": { + "issues": "https://github.com/beste/in-memory-cache-php/issues", + "source": "https://github.com/beste/in-memory-cache-php/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/jeromegamez", + "type": "github" + } + ], + "time": "2024-03-01T23:43:56+00:00" + }, + { + "name": "beste/json", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/beste/json.git", + "reference": "2d7aea5a7ceeb428350ba450e4a227ac581359b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beste/json/zipball/2d7aea5a7ceeb428350ba450e4a227ac581359b4", + "reference": "2d7aea5a7ceeb428350ba450e4a227ac581359b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-strict-rules": "^1.5", + "phpunit/phpunit": "^10.4.2", + "rector/rector": "^0.18.10" + }, + "type": "library", + "autoload": { + "files": [ + "src/Json.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérôme Gamez", + "email": "jerome@gamez.name" + } + ], + "description": "A simple JSON helper to decode and encode JSON", + "keywords": [ + "helper", + "json" + ], + "support": { + "issues": "https://github.com/beste/json/issues", + "source": "https://github.com/beste/json/tree/1.4.0" + }, + "funding": [ + { + "url": "https://github.com/jeromegamez", + "type": "github" + } + ], + "time": "2023-11-30T22:41:32+00:00" + }, + { + "name": "brick/math", + "version": "0.12.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.1" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-11-29T23:19:16+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-11T17:09:12+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2023-08-10T19:36:49+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "fig/http-message-util", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message-util.git", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "suggest": { + "psr/http-message": "The package containing the PSR-7 interfaces" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Fig\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-message-util/issues", + "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" + }, + "time": "2020-11-24T22:02:12+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v6.10.1", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "500501c2ce893c824c801da135d02661199f60c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", + "reference": "500501c2ce893c824c801da135d02661199f60c5", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.10.1" + }, + "time": "2024-05-18T18:05:11+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "google/auth", + "version": "v1.39.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-auth-library-php.git", + "reference": "23e8e696d87f8d7dfefbd347ca1c99ce17ecb368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/23e8e696d87f8d7dfefbd347ca1c99ce17ecb368", + "reference": "23e8e696d87f8d7dfefbd347ca1c99ce17ecb368", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "^6.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.4.5", + "php": "^8.0", + "psr/cache": "^2.0||^3.0", + "psr/http-message": "^1.1||^2.0" + }, + "require-dev": { + "guzzlehttp/promises": "^2.0", + "kelvinmo/simplejwt": "0.7.1", + "phpseclib/phpseclib": "^3.0.35", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", + "sebastian/comparator": ">=1.2.3", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^6.0||^7.0", + "webmozart/assert": "^1.11" + }, + "suggest": { + "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Auth\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google Auth Library for PHP", + "homepage": "http://github.com/google/google-auth-library-php", + "keywords": [ + "Authentication", + "google", + "oauth2" + ], + "support": { + "docs": "https://googleapis.github.io/google-auth-library-php/main/", + "issues": "https://github.com/googleapis/google-auth-library-php/issues", + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.39.0" + }, + "time": "2024-05-02T16:03:51+00:00" + }, + { + "name": "google/cloud-core", + "version": "v1.58.1", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-cloud-php-core.git", + "reference": "db3e0ab25103e0ca953f6e1e0ca5a39e363b8988" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/db3e0ab25103e0ca953f6e1e0ca5a39e363b8988", + "reference": "db3e0ab25103e0ca953f6e1e0ca5a39e363b8988", + "shasum": "" + }, + "require": { + "google/auth": "^1.34", + "google/gax": "^1.30", + "guzzlehttp/guzzle": "^6.5.8|^7.4.4", + "guzzlehttp/promises": "^1.4||^2.0", + "guzzlehttp/psr7": "^2.6", + "monolog/monolog": "^2.9|^3.0", + "php": "^8.0", + "psr/http-message": "^1.0|^2.0", + "rize/uri-template": "~0.3" + }, + "require-dev": { + "erusev/parsedown": "^1.6", + "google/cloud-common-protos": "~0.5", + "opis/closure": "^3", + "phpdocumentor/reflection": "^5.3.3", + "phpdocumentor/reflection-docblock": "^5.3", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.0", + "squizlabs/php_codesniffer": "2.*" + }, + "suggest": { + "opis/closure": "May be used to serialize closures to process jobs in the batch daemon. Please require version ^3.", + "symfony/lock": "Required for the Spanner cached based session pool. Please require the following commit: 3.3.x-dev#1ba6ac9" + }, + "bin": [ + "bin/google-cloud-batch" + ], + "type": "library", + "extra": { + "component": { + "id": "cloud-core", + "target": "googleapis/google-cloud-php-core.git", + "path": "Core", + "entry": "src/ServiceBuilder.php" + } + }, + "autoload": { + "psr-4": { + "Google\\Cloud\\Core\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google Cloud PHP shared dependency, providing functionality useful to all components.", + "support": { + "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.58.1" + }, + "time": "2024-05-03T18:32:44+00:00" + }, + { + "name": "google/cloud-storage", + "version": "v1.41.4", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-cloud-php-storage.git", + "reference": "304b3ef6a1bd827774faa1deea315b5844826af2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-storage/zipball/304b3ef6a1bd827774faa1deea315b5844826af2", + "reference": "304b3ef6a1bd827774faa1deea315b5844826af2", + "shasum": "" + }, + "require": { + "google/cloud-core": "^1.55", + "php": "^8.0", + "ramsey/uuid": "^4.2.3" + }, + "require-dev": { + "erusev/parsedown": "^1.6", + "google/cloud-pubsub": "^2.0", + "phpdocumentor/reflection": "^5.3.3", + "phpdocumentor/reflection-docblock": "^5.3", + "phpseclib/phpseclib": "^2.0||^3.0", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.0", + "squizlabs/php_codesniffer": "2.*" + }, + "suggest": { + "google/cloud-pubsub": "May be used to register a topic to receive bucket notifications.", + "phpseclib/phpseclib": "May be used in place of OpenSSL for creating signed Cloud Storage URLs. Please require version ^2." + }, + "type": "library", + "extra": { + "component": { + "id": "cloud-storage", + "target": "googleapis/google-cloud-php-storage.git", + "path": "Storage", + "entry": "src/StorageClient.php" + } + }, + "autoload": { + "psr-4": { + "Google\\Cloud\\Storage\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Cloud Storage Client for PHP", + "support": { + "source": "https://github.com/googleapis/google-cloud-php-storage/tree/v1.41.4" + }, + "time": "2024-05-03T18:32:44+00:00" + }, + { + "name": "google/common-protos", + "version": "v4.6.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/common-protos-php.git", + "reference": "f8588298a0a204aef2db15ce501530e476ec883f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/f8588298a0a204aef2db15ce501530e476ec883f", + "reference": "f8588298a0a204aef2db15ce501530e476ec883f", + "shasum": "" + }, + "require": { + "google/protobuf": "^v3.25.3||^4.26.1", + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Api\\": "src/Api", + "Google\\Iam\\": "src/Iam", + "Google\\Rpc\\": "src/Rpc", + "Google\\Type\\": "src/Type", + "Google\\Cloud\\": "src/Cloud", + "GPBMetadata\\Google\\Api\\": "metadata/Api", + "GPBMetadata\\Google\\Iam\\": "metadata/Iam", + "GPBMetadata\\Google\\Rpc\\": "metadata/Rpc", + "GPBMetadata\\Google\\Type\\": "metadata/Type", + "GPBMetadata\\Google\\Cloud\\": "metadata/Cloud", + "GPBMetadata\\Google\\Logging\\": "metadata/Logging" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google API Common Protos for PHP", + "homepage": "https://github.com/googleapis/common-protos-php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/common-protos-php/issues", + "source": "https://github.com/googleapis/common-protos-php/tree/v4.6.0" + }, + "time": "2024-04-03T19:11:54+00:00" + }, + { + "name": "google/gax", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/gax-php.git", + "reference": "12a158e9b503df0087ebf9e218e8d75dc815a521" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/gax-php/zipball/12a158e9b503df0087ebf9e218e8d75dc815a521", + "reference": "12a158e9b503df0087ebf9e218e8d75dc815a521", + "shasum": "" + }, + "require": { + "google/auth": "^1.34.0", + "google/common-protos": "^4.4", + "google/grpc-gcp": "^0.4", + "google/longrunning": "~0.4", + "google/protobuf": "^v3.25.3||^4.26.1", + "grpc/grpc": "^1.13", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.0", + "php": "^8.0", + "ramsey/uuid": "^4.0" + }, + "conflict": { + "ext-protobuf": "<3.7.0" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.1", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\ApiCore\\": "src", + "GPBMetadata\\ApiCore\\": "metadata/ApiCore" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Google API Core for PHP", + "homepage": "https://github.com/googleapis/gax-php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/gax-php/issues", + "source": "https://github.com/googleapis/gax-php/tree/v1.33.0" + }, + "time": "2024-05-14T14:55:14+00:00" + }, + { + "name": "google/grpc-gcp", + "version": "v0.4.0", + "source": { + "type": "git", + "url": "https://github.com/GoogleCloudPlatform/grpc-gcp-php.git", + "reference": "2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GoogleCloudPlatform/grpc-gcp-php/zipball/2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9", + "reference": "2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9", + "shasum": "" + }, + "require": { + "google/auth": "^1.3", + "google/protobuf": "^v3.25.3||^4.26.1", + "grpc/grpc": "^v1.13.0", + "php": "^8.0", + "psr/cache": "^1.0.1||^2.0.0||^3.0.0" + }, + "require-dev": { + "google/cloud-spanner": "^1.7", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\Gcp\\": "src/" + }, + "classmap": [ + "src/generated/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC GCP library for channel management", + "support": { + "issues": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/issues", + "source": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/tree/v0.4.0" + }, + "time": "2024-04-03T16:37:55+00:00" + }, + { + "name": "google/longrunning", + "version": "0.4.2", + "source": { + "type": "git", + "url": "https://github.com/googleapis/php-longrunning.git", + "reference": "dd38c97ee348ad73bfb581aa276a536161f4b181" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/php-longrunning/zipball/dd38c97ee348ad73bfb581aa276a536161f4b181", + "reference": "dd38c97ee348ad73bfb581aa276a536161f4b181", + "shasum": "" + }, + "require-dev": { + "google/gax": "^1.30", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "component": { + "id": "longrunning", + "path": "LongRunning", + "entry": null, + "target": "googleapis/php-longrunning" + } + }, + "autoload": { + "psr-4": { + "Google\\LongRunning\\": "src/LongRunning", + "Google\\ApiCore\\LongRunning\\": "src/ApiCore/LongRunning", + "GPBMetadata\\Google\\Longrunning\\": "metadata/Longrunning" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google LongRunning Client for PHP", + "support": { + "source": "https://github.com/googleapis/php-longrunning/tree/v0.4.2" + }, + "time": "2024-05-03T18:32:44+00:00" + }, + { + "name": "google/protobuf", + "version": "v4.26.1", + "source": { + "type": "git", + "url": "https://github.com/protocolbuffers/protobuf-php.git", + "reference": "5c46b0eb09e7ad3e6efef3c5a85e2a34108c52ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/5c46b0eb09e7ad3e6efef3c5a85e2a34108c52ae", + "reference": "5c46b0eb09e7ad3e6efef3c5a85e2a34108c52ae", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": ">=5.0.0" + }, + "suggest": { + "ext-bcmath": "Need to support JSON deserialization" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Protobuf\\": "src/Google/Protobuf", + "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "proto library for PHP", + "homepage": "https://developers.google.com/protocol-buffers/", + "keywords": [ + "proto" + ], + "support": { + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.26.1" + }, + "time": "2024-03-27T19:56:50+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:16:48+00:00" + }, + { + "name": "grpc/grpc", + "version": "1.57.0", + "source": { + "type": "git", + "url": "https://github.com/grpc/grpc-php.git", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grpc/grpc-php/zipball/b610c42022ed3a22f831439cb93802f2a4502fdf", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "google/auth": "^v1.3.0" + }, + "suggest": { + "ext-protobuf": "For better performance, install the protobuf C extension.", + "google/protobuf": "To get started using grpc quickly, install the native protobuf library." + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC library for PHP", + "homepage": "https://grpc.io", + "keywords": [ + "rpc" + ], + "support": { + "source": "https://github.com/grpc/grpc-php/tree/v1.57.0" + }, + "time": "2023-08-14T23:57:54+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:35:24+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:19:20+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:05:35+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2023-12-03T19:50:20+00:00" + }, + { + "name": "kreait/firebase-php", + "version": "7.11.0", + "source": { + "type": "git", + "url": "https://github.com/kreait/firebase-php.git", + "reference": "022c3e8cd78f035557ad114fb374eca05af6c922" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kreait/firebase-php/zipball/022c3e8cd78f035557ad114fb374eca05af6c922", + "reference": "022c3e8cd78f035557ad114fb374eca05af6c922", + "shasum": "" + }, + "require": { + "beste/clock": "^3.0", + "beste/in-memory-cache": "^1.0", + "beste/json": "^1.2.1", + "ext-ctype": "*", + "ext-filter": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "fig/http-message-util": "^1.1.5", + "firebase/php-jwt": "^6.3.2", + "google/auth": "^1.24", + "google/cloud-storage": "^1.30.1", + "guzzlehttp/guzzle": "^7.5", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.6", + "kreait/firebase-tokens": "^5.1", + "lcobucci/jwt": "^4.3.0|^5.0", + "mtdowling/jmespath.php": "^2.6.1", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/cache": "^1.0.1|^2.0|^3.0", + "psr/clock": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "psr/log": "^1.1|^2.0|^3.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.57.1", + "google/cloud-firestore": "^1.43.2", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.11.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpunit/phpunit": "^10.5.20", + "rector/rector": "^1.0.5", + "shipmonk/composer-dependency-analyser": "^1.5.3", + "symfony/var-dumper": "^6.3.5 || ^7.0.7" + }, + "suggest": { + "google/cloud-firestore": "^1.0 to use the Firestore component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-7.x": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Kreait\\Firebase\\": "src/Firebase" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérôme Gamez", + "homepage": "https://github.com/jeromegamez" + } + ], + "description": "Firebase Admin SDK", + "homepage": "https://github.com/kreait/firebase-php", + "keywords": [ + "api", + "database", + "firebase", + "google", + "sdk" + ], + "support": { + "docs": "https://firebase-php.readthedocs.io", + "issues": "https://github.com/kreait/firebase-php/issues", + "source": "https://github.com/kreait/firebase-php" + }, + "funding": [ + { + "url": "https://github.com/sponsors/jeromegamez", + "type": "github" + } + ], + "time": "2024-05-15T23:01:16+00:00" + }, + { + "name": "kreait/firebase-tokens", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/kreait/firebase-tokens-php.git", + "reference": "94a3ab1bff7937adc31b4aa8c5c171a153ffe0a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kreait/firebase-tokens-php/zipball/94a3ab1bff7937adc31b4aa8c5c171a153ffe0a7", + "reference": "94a3ab1bff7937adc31b4aa8c5c171a153ffe0a7", + "shasum": "" + }, + "require": { + "beste/clock": "^3.0", + "ext-json": "*", + "ext-openssl": "*", + "fig/http-message-util": "^1.1.5", + "guzzlehttp/guzzle": "^7.8", + "lcobucci/jwt": "^5.2", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/cache": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.56.1", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.10.67", + "phpstan/phpstan-phpunit": "^1.3.16", + "phpunit/phpunit": "^10.5.20", + "rector/rector": "^1.0.5", + "symfony/cache": "^6.4.3 || ^7.0.7", + "symfony/var-dumper": "^6.4.3 || ^7.0.7" + }, + "suggest": { + "psr/cache-implementation": "to cache fetched remote public keys" + }, + "type": "library", + "autoload": { + "psr-4": { + "Kreait\\Firebase\\JWT\\": "src/JWT" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérôme Gamez", + "homepage": "https://github.com/jeromegamez" + } + ], + "description": "A library to work with Firebase tokens", + "homepage": "https://github.com/kreait/firebase-token-php", + "keywords": [ + "Authentication", + "auth", + "firebase", + "google", + "token" + ], + "support": { + "issues": "https://github.com/kreait/firebase-tokens-php/issues", + "source": "https://github.com/kreait/firebase-tokens-php/tree/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/jeromegamez", + "type": "github" + } + ], + "time": "2024-05-10T21:47:37+00:00" + }, + { + "name": "kreait/laravel-firebase", + "version": "5.8.0", + "source": { + "type": "git", + "url": "https://github.com/kreait/laravel-firebase.git", + "reference": "a028cb6ad58c534f763fca03e7dcc392074631da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kreait/laravel-firebase/zipball/a028cb6ad58c534f763fca03e7dcc392074631da", + "reference": "a028cb6ad58c534f763fca03e7dcc392074631da", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^9.0 || ^10.0 || ^11.0", + "illuminate/support": "^9.0 || ^10.0 || ^11.0", + "kreait/firebase-php": "^7.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "symfony/cache": "^6.1.2 || ^7.0.3" + }, + "require-dev": { + "laravel/pint": "^1.14", + "orchestra/testbench": "^7.0 || ^8.0 || ^9.0", + "phpunit/phpunit": "^9.6.17 || ^10.5.13" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Kreait\\Laravel\\Firebase\\ServiceProvider" + ], + "aliases": { + "Firebase": "Kreait\\Laravel\\Firebase\\Facades\\Firebase" + } + } + }, + "autoload": { + "psr-4": { + "Kreait\\Laravel\\Firebase\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérôme Gamez", + "email": "jerome@gamez.name" + } + ], + "description": "A Laravel package for the Firebase PHP Admin SDK", + "keywords": [ + "FCM", + "api", + "database", + "firebase", + "gcm", + "laravel", + "sdk" + ], + "support": { + "issues": "https://github.com/kreait/laravel-firebase/issues", + "source": "https://github.com/kreait/laravel-firebase/tree/5.8.0" + }, + "funding": [ + { + "url": "https://github.com/jeromegamez", + "type": "github" + } + ], + "time": "2024-03-13T18:33:13+00:00" + }, + { + "name": "laravel-notification-channels/onesignal", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/laravel-notification-channels/onesignal.git", + "reference": "9f85640e066834808c060a66f14f05bc417cd98b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-notification-channels/onesignal/zipball/9f85640e066834808c060a66f14f05bc417cd98b", + "reference": "9f85640e066834808c060a66f14f05bc417cd98b", + "shasum": "" + }, + "require": { + "berkayk/onesignal-laravel": "^2.0.0", + "illuminate/notifications": "5.*|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "5.*|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3|^1.4", + "orchestra/testbench": "^4.0|^5.0|^7.0|^8.0|^9.0", + "phpunit/phpunit": "^8.0|^9.5.10|^10.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NotificationChannels\\OneSignal\\OneSignalServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "NotificationChannels\\OneSignal\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marcel Pociot", + "email": "hello@marcelpociot.com", + "homepage": "http://marcelpociot.com" + }, + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be" + }, + { + "name": "Lukas Kämmerling", + "email": "kontakt@lukas-kaemmerling.de", + "homepage": "https://lukas-kaemmerling.de" + }, + { + "name": "David Llop", + "email": "hello@davidllop.com", + "homepage": "http://davidllop.com" + } + ], + "description": "OneSignal Notifications driver", + "homepage": "https://github.com/laravel-notification-channels/onesignal", + "support": { + "issues": "https://github.com/laravel-notification-channels/onesignal/issues", + "source": "https://github.com/laravel-notification-channels/onesignal/tree/v2.5.0" + }, + "time": "2024-04-01T04:13:47+00:00" + }, + { + "name": "laravel/framework", + "version": "v10.48.10", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "91e2b9e218afa4e5c377510faa11957042831ba3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/91e2b9e218afa4e5c377510faa11957042831ba3", + "reference": "91e2b9e218afa4e5c377510faa11957042831ba3", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.9", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.67", + "nunomaduro/termwind": "^1.13", + "php": "^8.1", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.4", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "carbonphp/carbon-doctrine-types": ">=3.0", + "doctrine/dbal": ">=4.0", + "mockery/mockery": "1.6.8", + "phpunit/phpunit": ">=11.0.0", + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "nyholm/psr7": "^1.2", + "orchestra/testbench-core": "^8.23.4", + "pda/pheanstalk": "^4.0", + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4", + "symfony/psr-http-message-bridge": "^2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.2).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-04-30T12:52:59+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.21", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/23ea808e8a145653e0ab29e30d4385e49f40a920", + "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.21" + }, + "time": "2024-04-30T12:46:16+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/8c104366459739f3ada0e994bcd3e6fd681ce3d5", + "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.21|^10.0", + "illuminate/contracts": "^9.21|^10.0", + "illuminate/database": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "php": "^8.0.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.28.2|^8.8.3", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2023-12-19T18:44:48+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2023-11-08T14:08:06+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.9.0" + }, + "time": "2024-01-04T16:10:04+00:00" + }, + { + "name": "laravel/ui", + "version": "v4.4.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/ui.git", + "reference": "7335d7049b2cde345c029e9d2de839b80af62bc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/ui/zipball/7335d7049b2cde345c029e9d2de839b80af62bc0", + "reference": "7335d7049b2cde345c029e9d2de839b80af62bc0", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.21|^10.0|^11.0", + "illuminate/filesystem": "^9.21|^10.0|^11.0", + "illuminate/support": "^9.21|^10.0|^11.0", + "illuminate/validation": "^9.21|^10.0|^11.0", + "php": "^8.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0", + "phpunit/phpunit": "^9.3|^10.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Ui\\UiServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Ui\\": "src/", + "Illuminate\\Foundation\\Auth\\": "auth-backend/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel UI utilities and presets.", + "keywords": [ + "laravel", + "ui" + ], + "support": { + "source": "https://github.com/laravel/ui/tree/v4.4.0" + }, + "time": "2024-01-12T15:56:45+00:00" + }, + { + "name": "lcobucci/jwt", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", + "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-sodium": "*", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/clock": "^1.0" + }, + "require-dev": { + "infection/infection": "^0.27.0", + "lcobucci/clock": "^3.0", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2.9", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^10.2.6" + }, + "suggest": { + "lcobucci/clock": ">= 3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/5.3.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2024-04-11T23:07:54+00:00" + }, + { + "name": "league/commonmark", + "version": "2.4.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.3", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 || ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2024-02-02T11:59:32+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.27.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4729745b1ab737908c7d055148c9a6b3e959832f", + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.27.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2024-04-07T19:17:50+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.25.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.25.1" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2024-03-15T19:58:44+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.15.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-01-28T23:22:08+00:00" + }, + { + "name": "midtrans/midtrans-php", + "version": "2.5.2", + "source": { + "type": "git", + "url": "https://github.com/Midtrans/midtrans-php.git", + "reference": "a1ad0c824449ca8c68c4cf11b3417ad518311d2b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Midtrans/midtrans-php/zipball/a1ad0c824449ca8c68c4cf11b3417ad518311d2b", + "reference": "a1ad0c824449ca8c68c4cf11b3417ad518311d2b", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "5.7.*", + "psy/psysh": "0.4.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Midtrans\\": "Midtrans/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andri Setiawan", + "email": "andri.setiawan@veritrans.co.id" + }, + { + "name": "Alvin Litani", + "email": "alvin.litani@veritrans.co.id" + }, + { + "name": "Ismail Faruqi", + "email": "ismail.faruqi@veritrans.co.id" + } + ], + "description": "PHP Wrapper for Midtrans Payment API.", + "homepage": "https://midtrans.com", + "support": { + "issues": "https://github.com/Midtrans/midtrans-php/issues", + "source": "https://github.com/Midtrans/midtrans-php/tree/2.5.2" + }, + "time": "2021-08-23T08:52:05+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.6.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.5.17", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.6.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-04-12T21:02:21+00:00" + }, + { + "name": "mtdowling/jmespath.php", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" + }, + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "files": [ + "src/JmesPath.php" + ], + "psr-4": { + "JmesPath\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "support": { + "issues": "https://github.com/jmespath/jmespath.php/issues", + "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" + }, + "time": "2023-08-25T10:54:48+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.72.3", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2024-01-25T10:35:09+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.3" + }, + "require-dev": { + "nette/tester": "^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.0" + }, + "time": "2023-12-11T11:54:22+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.4", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.4" + }, + "time": "2024-01-17T16:50:36+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" + }, + "time": "2024-03-05T20:51:40+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.15.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^1.0.", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "laravel/pint": "^1.0.0", + "pestphp/pest": "^1.21.0", + "pestphp/pest-plugin-mock": "^1.0", + "phpstan/phpstan": "^1.4.6", + "phpstan/phpstan-strict-rules": "^1.1.0", + "symfony/var-dumper": "^5.2.7|^6.0.0", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2023-02-08T01:06:31+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "paragonie/sodium_compat", + "version": "v1.21.1", + "source": { + "type": "git", + "url": "https://github.com/paragonie/sodium_compat.git", + "reference": "bb312875dcdd20680419564fe42ba1d9564b9e37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/bb312875dcdd20680419564fe42ba1d9564b9e37", + "reference": "bb312875dcdd20680419564fe42ba1d9564b9e37", + "shasum": "" + }, + "require": { + "paragonie/random_compat": ">=1", + "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^3|^4|^5|^6|^7|^8|^9" + }, + "suggest": { + "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.", + "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." + }, + "type": "library", + "autoload": { + "files": [ + "autoload.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com" + }, + { + "name": "Frank Denis", + "email": "jedisct1@pureftpd.org" + } + ], + "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists", + "keywords": [ + "Authentication", + "BLAKE2b", + "ChaCha20", + "ChaCha20-Poly1305", + "Chapoly", + "Curve25519", + "Ed25519", + "EdDSA", + "Edwards-curve Digital Signature Algorithm", + "Elliptic Curve Diffie-Hellman", + "Poly1305", + "Pure-PHP cryptography", + "RFC 7748", + "RFC 8032", + "Salpoly", + "Salsa20", + "X25519", + "XChaCha20-Poly1305", + "XSalsa20-Poly1305", + "Xchacha20", + "Xsalsa20", + "aead", + "cryptography", + "ecdh", + "elliptic curve", + "elliptic curve cryptography", + "encryption", + "libsodium", + "php", + "public-key cryptography", + "secret-key cryptography", + "side-channel resistant" + ], + "support": { + "issues": "https://github.com/paragonie/sodium_compat/issues", + "source": "https://github.com/paragonie/sodium_compat/tree/v1.21.1" + }, + "time": "2024-04-22T22:05:04+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-11-12T21:59:55+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.0", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "750bf031a48fd07c673dbe3f11f72362ea306d0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/750bf031a48fd07c673dbe3f11f72362ea306d0d", + "reference": "750bf031a48fd07c673dbe3f11f72362ea306d0d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.12.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.0" + }, + "time": "2023-12-20T15:28:09+00:00" + }, + { + "name": "pusher/pusher-php-server", + "version": "7.2.4", + "source": { + "type": "git", + "url": "https://github.com/pusher/pusher-http-php.git", + "reference": "de2f72296808f9cafa6a4462b15a768ff130cddb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pusher/pusher-http-php/zipball/de2f72296808f9cafa6a4462b15a768ff130cddb", + "reference": "de2f72296808f9cafa6a4462b15a768ff130cddb", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "guzzlehttp/guzzle": "^7.2", + "paragonie/sodium_compat": "^1.6", + "php": "^7.3|^8.0", + "psr/log": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "overtrue/phplint": "^2.3", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Pusher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Library for interacting with the Pusher REST API", + "keywords": [ + "events", + "messaging", + "php-pusher-server", + "publish", + "push", + "pusher", + "real time", + "real-time", + "realtime", + "rest", + "trigger" + ], + "support": { + "issues": "https://github.com/pusher/pusher-http-php/issues", + "source": "https://github.com/pusher/pusher-http-php/tree/7.2.4" + }, + "time": "2023-12-15T10:58:53+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + }, + { + "name": "rize/uri-template", + "version": "0.3.6", + "source": { + "type": "git", + "url": "https://github.com/rize/UriTemplate.git", + "reference": "34efe65c79710eed0883884f2285ae6d4a0aad19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rize/UriTemplate/zipball/34efe65c79710eed0883884f2285ae6d4a0aad19", + "reference": "34efe65c79710eed0883884f2285ae6d4a0aad19", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "Rize\\": "src/Rize" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marut K", + "homepage": "http://twitter.com/rezigned" + } + ], + "description": "PHP URI Template (RFC 6570) supports both expansion & extraction", + "keywords": [ + "RFC 6570", + "template", + "uri" + ], + "support": { + "issues": "https://github.com/rize/UriTemplate/issues", + "source": "https://github.com/rize/UriTemplate/tree/0.3.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/rezigned", + "type": "custom" + }, + { + "url": "https://github.com/rezigned", + "type": "github" + }, + { + "url": "https://opencollective.com/rize-uri-template", + "type": "open_collective" + } + ], + "time": "2024-03-10T08:07:49+00:00" + }, + { + "name": "symfony/cache", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "b9e9b93c9817ec6c789c7943f5e54b57a041c16a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/b9e9b93c9817ec6c789c7943f5e54b57a041c16a", + "reference": "b9e9b93c9817ec6c789c7943f5e54b57a041c16a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.3.6|^7.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "classmap": [ + "Traits/ValueWrapper.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", + "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "1c5d5c2103c3762aff27a27e1e2409e30a79083b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c5d5c2103c3762aff27a27e1e2409e30a79083b", + "reference": "1c5d5c2103c3762aff27a27e1e2409e30a79083b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "667a072466c6a53827ed7b119af93806b884cbb3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/667a072466c6a53827ed7b119af93806b884cbb3", + "reference": "667a072466c6a53827ed7b119af93806b884cbb3", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d84384f3f67de3cb650db64d685d70395dacfc3f", + "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "511c48990be17358c23bf45c5d71ab85d40fb764" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/511c48990be17358c23bf45c5d71ab85d40fb764", + "reference": "511c48990be17358c23bf45c5d71ab85d40fb764", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-23T10:36:43+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "b4db6b833035477cb70e18d0ae33cb7c2b521759" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b4db6b833035477cb70e18d0ae33cb7c2b521759", + "reference": "b4db6b833035477cb70e18d0ae33cb7c2b521759", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.3" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b7b5e6cdef670a0c82d015a966ffc7e855861a98", + "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.3", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-29T11:24:44+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/2c446d4e446995bed983c0b5bb9ff837e8de7dbd", + "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "decadcf3865918ecfcbfa90968553994ce935a5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/decadcf3865918ecfcbfa90968553994ce935a5e", + "reference": "decadcf3865918ecfcbfa90968553994ce935a5e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.3.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3.2|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/cdb1c81c145fd5aa9b0038bab694035020943381", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v2.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/581ca6067eb62640de5ff08ee1ba6850a0ee472e", + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/http-foundation": "^5.4 || ^6.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "psr/log": "^1.1 || ^2 || ^3", + "symfony/browser-kit": "^5.4 || ^6.0", + "symfony/config": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/framework-bundle": "^5.4 || ^6.0", + "symfony/http-kernel": "^5.4 || ^6.0", + "symfony/phpunit-bridge": "^6.2" + }, + "suggest": { + "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-main": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/symfony/psr-http-message-bridge/issues", + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.3.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-26T11:53:26+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "276e06398f71fa2a973264d94f28150f93cfb907" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/276e06398f71fa2a973264d94f28150f93cfb907", + "reference": "276e06398f71fa2a973264d94f28150f93cfb907", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ffeb9591c61f65a68d47f77d12b83fa530227a69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ffeb9591c61f65a68d47f77d12b83fa530227a69", + "reference": "ffeb9591c61f65a68d47f77d12b83fa530227a69", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "7495687c58bfd88b7883823747b0656d90679123" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/7495687c58bfd88b7883823747b0656d90679123", + "reference": "7495687c58bfd88b7883823747b0656d90679123", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/a66efcb71d8bc3a207d9d78e0bd67f3321510355", + "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7a9cd977cd1c5fed3694bee52990866432af07d7", + "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "825f9b00c37bbe1c1691cc1aff9b5451fc9b4405" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/825f9b00c37bbe1c1691cc1aff9b5451fc9b4405", + "reference": "825f9b00c37bbe1c1691cc1aff9b5451fc9b4405", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.2.7", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" + }, + "time": "2023-12-08T13:03:43+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:43:29+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" + }, + "time": "2024-01-02T13:46:09+00:00" + }, + { + "name": "filp/whoops", + "version": "2.15.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.15.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2023-11-03T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.13.11", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "60a163c3e7e3346a1dec96d3e6f02e6465452552" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/60a163c3e7e3346a1dec96d3e6f02e6465452552", + "reference": "60a163c3e7e3346a1dec96d3e6f02e6465452552", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.49.0", + "illuminate/view": "^10.43.0", + "larastan/larastan": "^2.8.1", + "laravel-zero/framework": "^10.3.0", + "mockery/mockery": "^1.6.7", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.33.6" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2024-02-13T17:20:13+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.27.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "3047e1a157fad968cc5f6e620d5cbe5c0867fffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/3047e1a157fad968cc5f6e620d5cbe5c0867fffd", + "reference": "3047e1a157fad968cc5f6e620d5cbe5c0867fffd", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0", + "illuminate/support": "^9.52.16|^10.0|^11.0", + "php": "^8.0", + "symfony/yaml": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2024-02-08T15:24:21+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.7", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", + "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.10", + "symplify/easy-coding-standard": "^12.0.8" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2023-12-10T02:24:34+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v7.10.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "49ec67fa7b002712da8526678abd651c09f375b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/49ec67fa7b002712da8526678abd651c09f375b2", + "reference": "49ec67fa7b002712da8526678abd651c09f375b2", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.15.3", + "nunomaduro/termwind": "^1.15.1", + "php": "^8.1.0", + "symfony/console": "^6.3.4" + }, + "conflict": { + "laravel/framework": ">=11.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.3.0", + "laravel/framework": "^10.28.0", + "laravel/pint": "^1.13.3", + "laravel/sail": "^1.25.0", + "laravel/sanctum": "^3.3.1", + "laravel/tinker": "^2.8.2", + "nunomaduro/larastan": "^2.6.4", + "orchestra/testbench-core": "^8.13.0", + "pestphp/pest": "^2.23.2", + "phpunit/phpunit": "^10.4.1", + "sebastian/environment": "^6.0.1", + "spatie/laravel-ignition": "^2.3.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2023-10-11T15:45:01+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.14", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-12T15:33:41+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.20", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.5", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.1", + "sebastian/global-state": "^6.0.1", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-04-24T06:32:35+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:12:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-14T13:18:12+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:47:14+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:17:12+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:19:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/483f76a82964a0431aa836b6ed0edde0c248e3ab", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.5.3" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-06-28T12:59:17+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.4.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "17082e780752d346c2db12ef5d6bee8e835e399c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/17082e780752d346c2db12ef5d6bee8e835e399c", + "reference": "17082e780752d346c2db12ef5d6bee8e835e399c", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", + "php": "^8.0", + "spatie/backtrace": "^1.5.2", + "symfony/http-foundation": "^5.2|^6.0|^7.0", + "symfony/mime": "^5.2|^6.0|^7.0", + "symfony/process": "^5.2|^6.0|^7.0", + "symfony/var-dumper": "^5.2|^6.0|^7.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.5.0", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.4.4" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-01-31T14:18:45+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "5b6f801c605a593106b623e45ca41496a6e7d56d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/5b6f801c605a593106b623e45ca41496a6e7d56d", + "reference": "5b6f801c605a593106b623e45ca41496a6e7d56d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "spatie/backtrace": "^1.5.3", + "spatie/flare-client-php": "^1.4.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "illuminate/cache": "^9.52|^10.0|^11.0", + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "psr/simple-cache-implementation": "*", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-01-03T15:49:39+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "2.4.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "351504f4570e32908839fc5a2dc53bf77d02f85e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/351504f4570e32908839fc5a2dc53bf77d02f85e", + "reference": "351504f4570e32908839fc5a2dc53bf77d02f85e", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^10.0|^11.0", + "php": "^8.1", + "spatie/flare-client-php": "^1.3.5", + "spatie/ignition": "^1.9", + "symfony/console": "^6.2.3|^7.0", + "symfony/var-dumper": "^6.2.3|^7.0" + }, + "require-dev": { + "livewire/livewire": "^2.11|^3.3.5", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.8.1", + "orchestra/testbench": "^8.0|^9.0", + "pestphp/pest": "^2.30", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.3", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/laravel-ignition/issues", + "source": "https://github.com/spatie/laravel-ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-02-09T16:08:40+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d75715985f0f94f978e3a8fa42533e10db921b90", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.1" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/app.php b/BackEnd/laravel-pos-ecommerce-backend/config/app.php new file mode 100644 index 0000000..9207160 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/app.php @@ -0,0 +1,188 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | 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'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | 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), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + 'asset_url' => env('ASSET_URL'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'en_US', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => 'file', + // 'store' => 'redis', + ], + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => ServiceProvider::defaultProviders()->merge([ + /* + * Package Service Providers... + */ + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + ])->toArray(), + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => Facade::defaultAliases()->merge([ + // 'Example' => App\Facades\Example::class, + ])->toArray(), + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/auth.php b/BackEnd/laravel-pos-ecommerce-backend/config/auth.php new file mode 100644 index 0000000..9548c15 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => 'web', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_reset_tokens', + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | times out and the user is prompted to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => 10800, + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/broadcasting.php b/BackEnd/laravel-pos-ecommerce-backend/config/broadcasting.php new file mode 100644 index 0000000..2410485 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/broadcasting.php @@ -0,0 +1,71 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', + 'port' => env('PUSHER_PORT', 443), + 'scheme' => env('PUSHER_SCHEME', 'https'), + 'encrypted' => true, + 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', + ], + 'client_options' => [ + // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html + ], + ], + + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/cache.php b/BackEnd/laravel-pos-ecommerce-backend/config/cache.php new file mode 100644 index 0000000..d4171e2 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/cache.php @@ -0,0 +1,111 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + 'lock_connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'cache', + 'lock_connection' => 'default', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, or DynamoDB cache + | stores there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/cors.php b/BackEnd/laravel-pos-ecommerce-backend/config/cors.php new file mode 100644 index 0000000..8a39e6d --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/cors.php @@ -0,0 +1,34 @@ + ['api/*', 'sanctum/csrf-cookie'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/database.php b/BackEnd/laravel-pos-ecommerce-backend/config/database.php new file mode 100644 index 0000000..137ad18 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/database.php @@ -0,0 +1,151 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/filesystems.php b/BackEnd/laravel-pos-ecommerce-backend/config/filesystems.php new file mode 100644 index 0000000..e9d9dbd --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/filesystems.php @@ -0,0 +1,76 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been set up for each driver as an example of the required values. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + 'throw' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/firebase.php b/BackEnd/laravel-pos-ecommerce-backend/config/firebase.php new file mode 100644 index 0000000..12310de --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/firebase.php @@ -0,0 +1,221 @@ + env('FIREBASE_PROJECT', 'app'), + + /* + * ------------------------------------------------------------------------ + * Firebase project configurations + * ------------------------------------------------------------------------ + */ + + 'projects' => [ + 'app' => [ + + /* + * ------------------------------------------------------------------------ + * Credentials / Service Account + * ------------------------------------------------------------------------ + * + * In order to access a Firebase project and its related services using a + * server SDK, requests must be authenticated. For server-to-server + * communication this is done with a Service Account. + * + * If you don't already have generated a Service Account, you can do so by + * following the instructions from the official documentation pages at + * + * https://firebase.google.com/docs/admin/setup#initialize_the_sdk + * + * Once you have downloaded the Service Account JSON file, you can use it + * to configure the package. + * + * If you don't provide credentials, the Firebase Admin SDK will try to + * auto-discover them + * + * - by checking the environment variable FIREBASE_CREDENTIALS + * - by checking the environment variable GOOGLE_APPLICATION_CREDENTIALS + * - by trying to find Google's well known file + * - by checking if the application is running on GCE/GCP + * + * If no credentials file can be found, an exception will be thrown the + * first time you try to access a component of the Firebase Admin SDK. + * + */ + + 'credentials' => env('FIREBASE_CREDENTIALS', env('GOOGLE_APPLICATION_CREDENTIALS')), + + /* + * ------------------------------------------------------------------------ + * Firebase Auth Component + * ------------------------------------------------------------------------ + */ + + 'auth' => [ + 'tenant_id' => env('FIREBASE_AUTH_TENANT_ID'), + ], + + /* + * ------------------------------------------------------------------------ + * Firestore Component + * ------------------------------------------------------------------------ + */ + + 'firestore' => [ + + /* + * If you want to access a Firestore database other than the default database, + * enter its name here. + * + * By default, the Firestore client will connect to the `(default)` database. + * + * https://firebase.google.com/docs/firestore/manage-databases + */ + + // 'database' => env('FIREBASE_FIRESTORE_DATABASE'), + ], + + /* + * ------------------------------------------------------------------------ + * Firebase Realtime Database + * ------------------------------------------------------------------------ + */ + + 'database' => [ + + /* + * In most of the cases the project ID defined in the credentials file + * determines the URL of your project's Realtime Database. If the + * connection to the Realtime Database fails, you can override + * its URL with the value you see at + * + * https://console.firebase.google.com/u/1/project/_/database + * + * Please make sure that you use a full URL like, for example, + * https://my-project-id.firebaseio.com + */ + + 'url' => env('FIREBASE_DATABASE_URL'), + + /* + * As a best practice, a service should have access to only the resources it needs. + * To get more fine-grained control over the resources a Firebase app instance can access, + * use a unique identifier in your Security Rules to represent your service. + * + * https://firebase.google.com/docs/database/admin/start#authenticate-with-limited-privileges + */ + + // 'auth_variable_override' => [ + // 'uid' => 'my-service-worker' + // ], + + ], + + 'dynamic_links' => [ + + /* + * Dynamic links can be built with any URL prefix registered on + * + * https://console.firebase.google.com/u/1/project/_/durablelinks/links/ + * + * You can define one of those domains as the default for new Dynamic + * Links created within your project. + * + * The value must be a valid domain, for example, + * https://example.page.link + */ + + 'default_domain' => env('FIREBASE_DYNAMIC_LINKS_DEFAULT_DOMAIN'), + ], + + /* + * ------------------------------------------------------------------------ + * Firebase Cloud Storage + * ------------------------------------------------------------------------ + */ + + 'storage' => [ + + /* + * Your project's default storage bucket usually uses the project ID + * as its name. If you have multiple storage buckets and want to + * use another one as the default for your application, you can + * override it here. + */ + + 'default_bucket' => env('FIREBASE_STORAGE_DEFAULT_BUCKET'), + + ], + + /* + * ------------------------------------------------------------------------ + * Caching + * ------------------------------------------------------------------------ + * + * The Firebase Admin SDK can cache some data returned from the Firebase + * API, for example Google's public keys used to verify ID tokens. + * + */ + + 'cache_store' => env('FIREBASE_CACHE_STORE', 'file'), + + /* + * ------------------------------------------------------------------------ + * Logging + * ------------------------------------------------------------------------ + * + * Enable logging of HTTP interaction for insights and/or debugging. + * + * Log channels are defined in config/logging.php + * + * Successful HTTP messages are logged with the log level 'info'. + * Failed HTTP messages are logged with the log level 'notice'. + * + * Note: Using the same channel for simple and debug logs will result in + * two entries per request and response. + */ + + 'logging' => [ + 'http_log_channel' => env('FIREBASE_HTTP_LOG_CHANNEL'), + 'http_debug_log_channel' => env('FIREBASE_HTTP_DEBUG_LOG_CHANNEL'), + ], + + /* + * ------------------------------------------------------------------------ + * HTTP Client Options + * ------------------------------------------------------------------------ + * + * Behavior of the HTTP Client performing the API requests + */ + + 'http_client_options' => [ + + /* + * Use a proxy that all API requests should be passed through. + * (default: none) + */ + + 'proxy' => env('FIREBASE_HTTP_CLIENT_PROXY'), + + /* + * Set the maximum amount of seconds (float) that can pass before + * a request is considered timed out + * + * The default time out can be reviewed at + * https://github.com/kreait/firebase-php/blob/6.x/src/Firebase/Http/HttpClientOptions.php + */ + + 'timeout' => env('FIREBASE_HTTP_CLIENT_TIMEOUT'), + + 'guzzle_middlewares' => [], + ], + ], + ], +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/hashing.php b/BackEnd/laravel-pos-ecommerce-backend/config/hashing.php new file mode 100644 index 0000000..0e8a0bb --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/hashing.php @@ -0,0 +1,54 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 12), + 'verify' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 65536, + 'threads' => 1, + 'time' => 4, + 'verify' => true, + ], + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/logging.php b/BackEnd/laravel-pos-ecommerce-backend/config/logging.php new file mode 100644 index 0000000..c44d276 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/logging.php @@ -0,0 +1,131 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => LOG_USER, + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + ], + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/mail.php b/BackEnd/laravel-pos-ecommerce-backend/config/mail.php new file mode 100644 index 0000000..e894b2e --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/mail.php @@ -0,0 +1,134 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "log", "array", "failover", "roundrobin" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'port' => env('MAIL_PORT', 587), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN'), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => null, + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/midtrans.php b/BackEnd/laravel-pos-ecommerce-backend/config/midtrans.php new file mode 100644 index 0000000..38abfc0 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/midtrans.php @@ -0,0 +1,11 @@ + env('MIDTRANS_MERCHAT_ID'), + 'client_key' => env('MIDTRANS_CLIENT_KEY'), + 'server_key' => env('MIDTRANS_SERVER_KEY'), + + 'is_production' => false, + 'is_sanitized' => false, + 'is_3ds' => false, +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/queue.php b/BackEnd/laravel-pos-ecommerce-backend/config/queue.php new file mode 100644 index 0000000..01c6b05 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/queue.php @@ -0,0 +1,109 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/sanctum.php b/BackEnd/laravel-pos-ecommerce-backend/config/sanctum.php new file mode 100644 index 0000000..35d75b3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/sanctum.php @@ -0,0 +1,83 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort() + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. This will override any values set in the token's + | "expires_at" attribute, but first-party sessions are not affected. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Token Prefix + |-------------------------------------------------------------------------- + | + | Sanctum can prefix new tokens in order to take advantage of numerous + | security scanning initiatives maintained by open source platforms + | that notify developers if they commit tokens into repositories. + | + | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning + | + */ + + 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + ], + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/services.php b/BackEnd/laravel-pos-ecommerce-backend/config/services.php new file mode 100644 index 0000000..37d9fcd --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/services.php @@ -0,0 +1,39 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + 'scheme' => 'https', + ], + + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + 'onesignal' => [ + 'app_id' => env('ONESIGNAL_APP_ID'), + 'rest_api_key' => env('ONESIGNAL_REST_API_KEY'), + 'guzzle_client_timeout' => env('ONESIGNAL_GUZZLE_CLIENT_TIMEOUT', 0), + ], + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/session.php b/BackEnd/laravel-pos-ecommerce-backend/config/session.php new file mode 100644 index 0000000..e738cb3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/session.php @@ -0,0 +1,214 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | While using one of the framework's cache driven session backends you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" since this is a secure default value. + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => 'lax', + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => false, + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/config/view.php b/BackEnd/laravel-pos-ecommerce-backend/config/view.php new file mode 100644 index 0000000..22b8a18 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/config/view.php @@ -0,0 +1,36 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + +]; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/factories/AddressFactory.php b/BackEnd/laravel-pos-ecommerce-backend/database/factories/AddressFactory.php new file mode 100644 index 0000000..e1e1374 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/factories/AddressFactory.php @@ -0,0 +1,31 @@ + + */ +class AddressFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => $this->faker->name, + 'full_address' => $this->faker->address, + 'phone' => $this->faker->phoneNumber, + 'prov_id' => $this->faker->numberBetween(1, 34), + 'city_id' => $this->faker->numberBetween(1, 100), + 'district_id' => $this->faker->numberBetween(1, 100), + 'postal_code' => $this->faker->postcode, + 'user_id' => $this->faker->numberBetween(1, 10), + 'is_default' => $this->faker->boolean, + ]; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/factories/CategoryFactory.php b/BackEnd/laravel-pos-ecommerce-backend/database/factories/CategoryFactory.php new file mode 100644 index 0000000..01a789b --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/factories/CategoryFactory.php @@ -0,0 +1,25 @@ + + */ +class CategoryFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'description' => fake()->text(), + 'image' => fake()->imageUrl() + ]; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/factories/ProductFactory.php b/BackEnd/laravel-pos-ecommerce-backend/database/factories/ProductFactory.php new file mode 100644 index 0000000..19ae250 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/factories/ProductFactory.php @@ -0,0 +1,28 @@ + + */ +class ProductFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'description' => fake()->text(), + 'image' => fake()->imageUrl(), + 'price' => fake()->randomNumber(2), + 'stock' => fake()->randomNumber(2), + 'category_id' => fake()->numberBetween(1, 4) + ]; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/factories/UserFactory.php b/BackEnd/laravel-pos-ecommerce-backend/database/factories/UserFactory.php new file mode 100644 index 0000000..584104c --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/factories/UserFactory.php @@ -0,0 +1,44 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2014_10_12_000000_create_users_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2014_10_12_000000_create_users_table.php new file mode 100644 index 0000000..444fafb --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2014_10_12_000000_create_users_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php new file mode 100644 index 0000000..81a7229 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php @@ -0,0 +1,28 @@ +string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('password_reset_tokens'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2014_10_12_100000_create_password_resets_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2014_10_12_100000_create_password_resets_table.php new file mode 100644 index 0000000..fcacb80 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2014_10_12_100000_create_password_resets_table.php @@ -0,0 +1,32 @@ +string('email')->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('password_resets'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2019_08_19_000000_create_failed_jobs_table.php new file mode 100644 index 0000000..249da81 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php new file mode 100644 index 0000000..e828ad8 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_20_053314_add_phone_roles_foto_at_users.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_20_053314_add_phone_roles_foto_at_users.php new file mode 100644 index 0000000..2a7dda7 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_20_053314_add_phone_roles_foto_at_users.php @@ -0,0 +1,33 @@ +string('phone')->nullable()->after('email'); + $table->enum('roles', ['owner', 'kasir', 'member'])->nullable()->after('phone')->default('member'); + $table->string('foto')->nullable()->after('roles'); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('phone'); + $table->dropColumn('roles'); + $table->dropColumn('foto'); + }); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_20_091118_create_products_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_20_091118_create_products_table.php new file mode 100644 index 0000000..f3a747f --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_20_091118_create_products_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('name'); + $table->integer('price')->default(0); + $table->integer('stock')->default(0); + $table->enum('category', ['benih', 'pupuk','pestisida','alat pertanian']); + $table->string('image')->nullable(); + $table->text('description')->nullable(); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('products'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_26_025509_drop_products_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_26_025509_drop_products_table.php new file mode 100644 index 0000000..e2957e9 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_26_025509_drop_products_table.php @@ -0,0 +1,24 @@ +id(); + $table->string('name'); + $table->string('image')->nullable(); + $table->text('description')->nullable(); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('categories'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_26_031711_create_products_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_26_031711_create_products_table.php new file mode 100644 index 0000000..423c75f --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_02_26_031711_create_products_table.php @@ -0,0 +1,35 @@ +id(); + $table->foreignId('category_id')->constrained('categories')->onDelete('cascade'); + $table->string('name'); + $table->integer('price'); + $table->integer('stock'); + $table->string('image')->nullable(); + $table->boolean('is_available')->default(true); + $table->text('description')->nullable(); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('products'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_03_13_071207_drop_addresses_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_03_13_071207_drop_addresses_table.php new file mode 100644 index 0000000..759ab77 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_03_13_071207_drop_addresses_table.php @@ -0,0 +1,24 @@ +id(); + $table->string('name'); + $table->string('full_address'); + $table->string('phone'); + $table->string('prov_id'); + $table->string('city_id'); + $table->string('district_id'); + $table->string('postal_code'); + $table->foreignId('user_id')->constrained('users')->onDelete('cascade'); + $table->boolean('is_default')->default(false); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('addresses'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_03_14_004719_create_orders_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_03_14_004719_create_orders_table.php new file mode 100644 index 0000000..f97f80b --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_03_14_004719_create_orders_table.php @@ -0,0 +1,50 @@ +id(); + $table->foreignId('user_id')->constrained('users')->onDelete('cascade'); + $table->foreignId('address_id')->constrained('addresses')->onDelete('cascade')->default(0); + $table->integer('id_kasir')->nullable(); + $table->string('nama_kasir')->nullable(); + $table->integer('subtotal'); + $table->integer('shipping_cost')->nullable(); + $table->integer('total_cost'); + $table->integer('tax')->nullable(); + $table->integer('service_charge')->nullable(); + $table->integer('discount')->nullable(); + $table->integer('total_item')->nullable(); + $table->enum('status', ['pending', 'paid', 'on_delivery', 'delivered', 'expired', 'cancelled']); + $table->enum('payment_method', ['bank_transfer', 'ewallet', 'cash', 'qris']); + $table->string('payment_va_name')->nullable(); + $table->string('payment_va_number')->nullable(); + $table->string('payment_ewallet')->nullable(); + $table->integer('payment_amount')->nullable(); + $table->string('shipping_service')->nullable(); + $table->string('shipping_resi')->nullable(); + $table->string('transaction_number')->nullable(); + $table->string('transaction_time')->nullable(); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('orders'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_03_14_004747_create_order_items_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_03_14_004747_create_order_items_table.php new file mode 100644 index 0000000..9073d18 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_03_14_004747_create_order_items_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('order_id')->constrained('orders')->onDelete('cascade'); + $table->foreignId('product_id')->constrained('products')->onDelete('cascade'); + $table->integer('quantity'); + $table->integer('price')->nullable(); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('order_items'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_09_145835_create_discounts_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_09_145835_create_discounts_table.php new file mode 100644 index 0000000..e09595f --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_09_145835_create_discounts_table.php @@ -0,0 +1,38 @@ +id(); + $table->string('name'); + //description + $table->text('description')->nullable(); + //type + $table->enum('type', ['percentage', 'fixed'])->default('percentage'); + //value + $table->decimal('value', 15, 2); + //status + $table->enum('status', ['active', 'inactive'])->default('active'); + //expired date + $table->date('expired_date')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('discounts'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_13_231046_create_channels_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_13_231046_create_channels_table.php new file mode 100644 index 0000000..0b5c1eb --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_13_231046_create_channels_table.php @@ -0,0 +1,31 @@ +id(); + $table->string('name'); + // $table->unsignedBigInteger('user_id'); // User yang membuat channel + // Tambahkan foreign key + // $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('channels'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_13_231243_create_messages_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_13_231243_create_messages_table.php new file mode 100644 index 0000000..dd301bf --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_13_231243_create_messages_table.php @@ -0,0 +1,32 @@ +id(); + $table->unsignedBigInteger('channel_id'); + $table->unsignedBigInteger('user_id'); + $table->text('message'); + $table->foreign('channel_id')->references('id')->on('channels')->onDelete('cascade'); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('messages'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_13_232057_drop_messages_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_13_232057_drop_messages_table.php new file mode 100644 index 0000000..009aa26 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_13_232057_drop_messages_table.php @@ -0,0 +1,24 @@ +id(); + // $table->unsignedBigInteger('channel_id'); + // $table->unsignedBigInteger('user_id'); + $table->text('message'); + // $table->foreign('channel_id')->references('id')->on('channels')->onDelete('cascade'); + // $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('messages'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_14_064257_create_chats_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_14_064257_create_chats_table.php new file mode 100644 index 0000000..210383a --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_14_064257_create_chats_table.php @@ -0,0 +1,30 @@ +id(); + $table->foreignId('created_by')->constrained('users')->cascadeOnDelete(); + $table->string('name')->nullable(); + $table->boolean('is_private')->default(true); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('chats'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_14_064344_create_chat_partisipants_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_14_064344_create_chat_partisipants_table.php new file mode 100644 index 0000000..dac6655 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_14_064344_create_chat_partisipants_table.php @@ -0,0 +1,33 @@ +id(); + // $table->foreignId('chat_id')->constrained('chats')->cascadeOnDelete(); + // $table->foreignId('user_id')->constrained('users')->cascadeOnDelete(); + // $table->unique([ + // 'chat_id', + // 'user_id' + // ]); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('chat_partisipants'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_14_064422_create_chat_messages_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_14_064422_create_chat_messages_table.php new file mode 100644 index 0000000..0aa3b8b --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_14_064422_create_chat_messages_table.php @@ -0,0 +1,30 @@ +id(); + // $table->foreignId('chat_id')->constrained('chats')->cascadeOnDelete(); + // $table->foreignId('user_id')->constrained('users')->cascadeOnDelete(); + $table->text('message')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('chat_messages'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_19_061435_add_fcm_id__at_user.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_19_061435_add_fcm_id__at_user.php new file mode 100644 index 0000000..5fcea73 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_19_061435_add_fcm_id__at_user.php @@ -0,0 +1,28 @@ +string('fcm_id')->after('email')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn(['fcm_id']); + }); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_19_100016_create_promos_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_19_100016_create_promos_table.php new file mode 100644 index 0000000..1bd4356 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_19_100016_create_promos_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('user_id')->constrained('users')->onDelete('cascade'); + $table->string('judul'); + $table->string('deskripsi'); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('promos'); + } +}; diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_21_152848_drop_channels_table.php b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_21_152848_drop_channels_table.php new file mode 100644 index 0000000..ad9d447 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/migrations/2024_05_21_152848_drop_channels_table.php @@ -0,0 +1,24 @@ +count(10)->create(); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/seeders/CategorySeeder.php b/BackEnd/laravel-pos-ecommerce-backend/database/seeders/CategorySeeder.php new file mode 100644 index 0000000..4c20b2d --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/seeders/CategorySeeder.php @@ -0,0 +1,18 @@ +create(); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/seeders/DatabaseSeeder.php b/BackEnd/laravel-pos-ecommerce-backend/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..ed105e9 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/seeders/DatabaseSeeder.php @@ -0,0 +1,33 @@ +create(); + + // \App\Models\User::factory()->create([ + // 'name' => 'Test User', + // 'email' => 'test@example.com', + // ]); + + + $this->call([ + UserSeeder::class, + CategorySeeder::class, + ProductSeeder::class, + AddressSeeder::class, + DiscountSeeder::class, + ]); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/seeders/DiscountSeeder.php b/BackEnd/laravel-pos-ecommerce-backend/database/seeders/DiscountSeeder.php new file mode 100644 index 0000000..002c863 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/seeders/DiscountSeeder.php @@ -0,0 +1,42 @@ + 'Diskon Hari Tani', + 'description' => 'Hari Tani Nasional', + 'type' => 'percentage', + 'value' => 20, + 'status' => 'active', + 'expired_date' => '2025-01-31' + ]); + + \App\Models\Discount::create([ + 'name' => 'Diskon 1 Tahun Toko', + 'description' => '1 Tahun Toko', + 'type' => 'percentage', + 'value' => 10, + 'status' => 'active', + 'expired_date' => '2025-01-07' + ]); + + \App\Models\Discount::create([ + 'name' => 'Diskon Jumat Berkah', + 'description' => 'Jumat Berkah', + 'type' => 'percentage', + 'value' => 15, + 'status' => 'active', + 'expired_date' => '2025-12-31' + ]); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/seeders/ProductSeeder.php b/BackEnd/laravel-pos-ecommerce-backend/database/seeders/ProductSeeder.php new file mode 100644 index 0000000..20808bd --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/seeders/ProductSeeder.php @@ -0,0 +1,18 @@ +create(); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/database/seeders/UserSeeder.php b/BackEnd/laravel-pos-ecommerce-backend/database/seeders/UserSeeder.php new file mode 100644 index 0000000..b94123f --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/database/seeders/UserSeeder.php @@ -0,0 +1,25 @@ +create(); + + $user = User::factory()->create([ + 'name' => 'admin', + 'email' => 'admin@gmail.com', + 'password' => Hash::make('12345678') + ]); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/package-lock.json b/BackEnd/laravel-pos-ecommerce-backend/package-lock.json new file mode 100644 index 0000000..c849228 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/package-lock.json @@ -0,0 +1,1109 @@ +{ + "name": "laravel-pos-ecommerce-backend", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@popperjs/core": "^2.11.6", + "axios": "^1.6.4", + "bootstrap": "^5.2.3", + "laravel-vite-plugin": "^1.0.0", + "sass": "^1.56.1", + "vite": "^5.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.0.1.tgz", + "integrity": "sha512-laLEZUnSskIDZtLb2FNRdcjsRUhh1VOVvapbVGVTeaBPJTCF/b6gbPiX2dZdcH1RKoOE0an7L+2gnInk6K33Zw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/sass": { + "version": "1.71.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.0.tgz", + "integrity": "sha512-HKKIKf49Vkxlrav3F/w6qRuPcmImGVbIXJ2I3Kg0VMA+3Bav+8yE9G5XmP5lMj6nl4OlqbPftGAscNaNu28b8w==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/vite": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.3.tgz", + "integrity": "sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.1.0.tgz", + "integrity": "sha512-3cObNDzX6DdfhD9E7kf6w2mNunFpD7drxyNgHLw+XwIYAgb+Xt16SEXo0Up4VH+TMf3n+DSVJZtW2POBGcBYAA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + } + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/package.json b/BackEnd/laravel-pos-ecommerce-backend/package.json new file mode 100644 index 0000000..9a0b5bf --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/package.json @@ -0,0 +1,16 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "@popperjs/core": "^2.11.6", + "axios": "^1.6.4", + "bootstrap": "^5.2.3", + "laravel-vite-plugin": "^1.0.0", + "sass": "^1.56.1", + "vite": "^5.0.0" + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/phpunit.xml b/BackEnd/laravel-pos-ecommerce-backend/phpunit.xml new file mode 100644 index 0000000..bc86714 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/phpunit.xml @@ -0,0 +1,32 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + diff --git a/BackEnd/laravel-pos-ecommerce-backend/public/.htaccess b/BackEnd/laravel-pos-ecommerce-backend/public/.htaccess new file mode 100644 index 0000000..3aec5e2 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/public/.htaccess @@ -0,0 +1,21 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/BackEnd/laravel-pos-ecommerce-backend/public/.htaccess copy b/BackEnd/laravel-pos-ecommerce-backend/public/.htaccess copy new file mode 100644 index 0000000..3aec5e2 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/public/.htaccess copy @@ -0,0 +1,21 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/BackEnd/laravel-pos-ecommerce-backend/public/assets/css/style.css b/BackEnd/laravel-pos-ecommerce-backend/public/assets/css/style.css new file mode 100644 index 0000000..dee851a --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/public/assets/css/style.css @@ -0,0 +1,19785 @@ +/*------------------------------------------------------------------- + ===== Table of Contents ===== + + * Bootstrap functions + * Template variables + * SCSS Compass Functions + * Boostrap Main SCSS + * Template mixins + + Animation Mixins + + Background Mixins + + Badge Mixins + + Button Mixins + + Miscellaneous Mixins + + BlockQuote Mixins + + Cards Mixins + + Color Functions Mixins + + Tooltips + + popovers + * Core Styles + + Reset Styles + + Fonts + + Functions + + Backgrounds + + Typography + + Miscellaneous + + Footer + + Layouts + + Utilities + + Demo styles + * Components + + Badges + + Boostrap Progress + + Buttons + + Breadcrumbs + + Cards + + Checkboxes and Radios + + Dropdowns + + Forms + + Icons + + Preview + + Tables + + Todo List + * Landing screens + + Auth +-------------------------------------------------------------------*/ +/*-------------------------------------------------------------------*/ +/* === Import Bootstrap functions and variables === */ +/*-------------------------------------------------------------------*/ +/* === Import template variables === */ +/*-------------------------------------------------------------------*/ +/* === SCSS Compass Functions === */ + +@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&display=swap"); + +@import url("https://fonts.googleapis.com/css2?family=Pacifico&display=swap"); + +@-webkit-keyframes flash { + 0% { + opacity: 1; + } + 25% { + opacity: 0; + } + 50% { + opacity: 1; + } + 75% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@keyframes flash { + 0% { + opacity: 1; + } + 25% { + opacity: 0; + } + 50% { + opacity: 1; + } + 75% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@-webkit-keyframes bounce { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 20% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 40% { + -webkit-transform: translateY(-30px); + transform: translateY(-30px); + } + 50% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 60% { + -webkit-transform: translateY(-15px); + transform: translateY(-15px); + } + 80% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes bounce { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 20% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 40% { + -webkit-transform: translateY(-30px); + transform: translateY(-30px); + } + 50% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 60% { + -webkit-transform: translateY(-15px); + transform: translateY(-15px); + } + 80% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@-webkit-keyframes shake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 10% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 20% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 30% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 40% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 50% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 60% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 70% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 80% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 90% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes shake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 10% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 20% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 30% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 40% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 50% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 60% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 70% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 80% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 90% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@-webkit-keyframes tada { + 0% { + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } + 10% { + -webkit-transform: scale(0.9) rotate(-3deg); + transform: scale(0.9) rotate(-3deg); + } + 20% { + -webkit-transform: scale(0.9) rotate(-3deg); + transform: scale(0.9) rotate(-3deg); + } + 30% { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + 40% { + -webkit-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + 50% { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + 60% { + -webkit-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + 70% { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + 80% { + -webkit-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + 90% { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + 100% { + -webkit-transform: scale(1) rotate(0); + transform: scale(1) rotate(0); + } +} + +@keyframes tada { + 0% { + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } + 10% { + -webkit-transform: scale(0.9) rotate(-3deg); + transform: scale(0.9) rotate(-3deg); + } + 20% { + -webkit-transform: scale(0.9) rotate(-3deg); + transform: scale(0.9) rotate(-3deg); + } + 30% { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + 40% { + -webkit-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + 50% { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + 60% { + -webkit-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + 70% { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + 80% { + -webkit-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + 90% { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + 100% { + -webkit-transform: scale(1) rotate(0); + transform: scale(1) rotate(0); + } +} + +@-webkit-keyframes swing { + 20%, + 40%, + 60%, + 80%, + 100% { + -webkit-transform-origin: top center 50%; + transform-origin: top center 50%; + } + 20% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); + } + 40% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + 60% { + -webkit-transform: rotate(5deg); + transform: rotate(5deg); + } + 80% { + -webkit-transform: rotate(-5deg); + transform: rotate(-5deg); + } + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} + +@keyframes swing { + 20%, + 40%, + 60%, + 80%, + 100% { + -webkit-transform-origin: top center 50%; + transform-origin: top center 50%; + } + 20% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); + } + 40% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + 60% { + -webkit-transform: rotate(5deg); + transform: rotate(5deg); + } + 80% { + -webkit-transform: rotate(-5deg); + transform: rotate(-5deg); + } + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} + +@-webkit-keyframes wobble { + 0% { + -webkit-transform: translateX(0%); + transform: translateX(0%); + } + 15% { + -webkit-transform: translateX(-25%) rotate(-5deg); + transform: translateX(-25%) rotate(-5deg); + } + 30% { + -webkit-transform: translateX(20%) rotate(3deg); + transform: translateX(20%) rotate(3deg); + } + 45% { + -webkit-transform: translateX(-15%) rotate(-3deg); + transform: translateX(-15%) rotate(-3deg); + } + 60% { + -webkit-transform: translateX(10%) rotate(2deg); + transform: translateX(10%) rotate(2deg); + } + 75% { + -webkit-transform: translateX(-5%) rotate(-1deg); + transform: translateX(-5%) rotate(-1deg); + } + 100% { + -webkit-transform: translateX(0%); + transform: translateX(0%); + } +} + +@keyframes wobble { + 0% { + -webkit-transform: translateX(0%); + transform: translateX(0%); + } + 15% { + -webkit-transform: translateX(-25%) rotate(-5deg); + transform: translateX(-25%) rotate(-5deg); + } + 30% { + -webkit-transform: translateX(20%) rotate(3deg); + transform: translateX(20%) rotate(3deg); + } + 45% { + -webkit-transform: translateX(-15%) rotate(-3deg); + transform: translateX(-15%) rotate(-3deg); + } + 60% { + -webkit-transform: translateX(10%) rotate(2deg); + transform: translateX(10%) rotate(2deg); + } + 75% { + -webkit-transform: translateX(-5%) rotate(-1deg); + transform: translateX(-5%) rotate(-1deg); + } + 100% { + -webkit-transform: translateX(0%); + transform: translateX(0%); + } +} + +@-webkit-keyframes pulse { + 0% { + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } + 50% { + -webkit-transform: scale(1.1, 1.1); + transform: scale(1.1, 1.1); + } + 100% { + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } +} + +@keyframes pulse { + 0% { + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } + 50% { + -webkit-transform: scale(1.1, 1.1); + transform: scale(1.1, 1.1); + } + 100% { + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } +} + +@-webkit-keyframes wiggle { + 0% { + -webkit-transform: skewX(9deg); + transform: skewX(9deg); + } + 10% { + -webkit-transform: skewX(-8deg); + transform: skewX(-8deg); + } + 20% { + -webkit-transform: skewX(7deg); + transform: skewX(7deg); + } + 30% { + -webkit-transform: skewX(-6deg); + transform: skewX(-6deg); + } + 40% { + -webkit-transform: skewX(5deg); + transform: skewX(5deg); + } + 50% { + -webkit-transform: skewX(-4deg); + transform: skewX(-4deg); + } + 60% { + -webkit-transform: skewX(3deg); + transform: skewX(3deg); + } + 70% { + -webkit-transform: skewX(-2deg); + transform: skewX(-2deg); + } + 80% { + -webkit-transform: skewX(1deg); + transform: skewX(1deg); + } + 90% { + -webkit-transform: skewX(0deg); + transform: skewX(0deg); + } + 100% { + -webkit-transform: skewX(0deg); + transform: skewX(0deg); + } +} + +@keyframes wiggle { + 0% { + -webkit-transform: skewX(9deg); + transform: skewX(9deg); + } + 10% { + -webkit-transform: skewX(-8deg); + transform: skewX(-8deg); + } + 20% { + -webkit-transform: skewX(7deg); + transform: skewX(7deg); + } + 30% { + -webkit-transform: skewX(-6deg); + transform: skewX(-6deg); + } + 40% { + -webkit-transform: skewX(5deg); + transform: skewX(5deg); + } + 50% { + -webkit-transform: skewX(-4deg); + transform: skewX(-4deg); + } + 60% { + -webkit-transform: skewX(3deg); + transform: skewX(3deg); + } + 70% { + -webkit-transform: skewX(-2deg); + transform: skewX(-2deg); + } + 80% { + -webkit-transform: skewX(1deg); + transform: skewX(1deg); + } + 90% { + -webkit-transform: skewX(0deg); + transform: skewX(0deg); + } + 100% { + -webkit-transform: skewX(0deg); + transform: skewX(0deg); + } +} + +@-webkit-keyframes bounceOut { + 0% { + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } + 25% { + -webkit-transform: scale(0.95, 0.95); + transform: scale(0.95, 0.95); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.1, 1.1); + transform: scale(1.1, 1.1); + } + 100% { + opacity: 0; + -webkit-transform: scale(0.3, 0.3); + transform: scale(0.3, 0.3); + } +} + +@keyframes bounceOut { + 0% { + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } + 25% { + -webkit-transform: scale(0.95, 0.95); + transform: scale(0.95, 0.95); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.1, 1.1); + transform: scale(1.1, 1.1); + } + 100% { + opacity: 0; + -webkit-transform: scale(0.3, 0.3); + transform: scale(0.3, 0.3); + } +} + +@-webkit-keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + transform: translateY(20px); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +@keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + transform: translateY(20px); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +@-webkit-keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +@keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +@-webkit-keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + transform: translateX(20px); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +@keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + transform: translateX(20px); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +@-webkit-keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +@keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +@-webkit-keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(0.3, 0.3); + transform: scale(0.3, 0.3); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.05, 1.05); + transform: scale(1.05, 1.05); + } + 70% { + -webkit-transform: scale(0.9, 0.9); + transform: scale(0.9, 0.9); + } + 100% { + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } +} + +@keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(0.3, 0.3); + transform: scale(0.3, 0.3); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.05, 1.05); + transform: scale(1.05, 1.05); + } + 70% { + -webkit-transform: scale(0.9, 0.9); + transform: scale(0.9, 0.9); + } + 100% { + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } +} + +@-webkit-keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + transform: translateY(30px); + } + 80% { + -webkit-transform: translateY(-10px); + transform: translateY(-10px); + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + transform: translateY(30px); + } + 80% { + -webkit-transform: translateY(-10px); + transform: translateY(-10px); + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@-webkit-keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + transform: translateY(-30px); + } + 80% { + -webkit-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + transform: translateY(-30px); + } + 80% { + -webkit-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@-webkit-keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + transform: translateX(-30px); + } + 80% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + transform: translateX(-30px); + } + 80% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@-webkit-keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + transform: translateX(30px); + } + 80% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + transform: translateX(30px); + } + 80% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@-webkit-keyframes fadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +@keyframes fadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +@-webkit-keyframes fadeOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } + 100% { + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + opacity: 0; + } +} + +@keyframes fadeOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } + 100% { + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + opacity: 0; + } +} + +@-webkit-keyframes fadeOutDown { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } + 100% { + -webkit-transform: translateY(20px); + transform: translateY(20px); + opacity: 0; + } +} + +@keyframes fadeOutDown { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } + 100% { + -webkit-transform: translateY(20px); + transform: translateY(20px); + opacity: 0; + } +} + +@-webkit-keyframes fadeOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } + 100% { + -webkit-transform: translateX(20px); + transform: translateX(20px); + opacity: 0; + } +} + +@keyframes fadeOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } + 100% { + -webkit-transform: translateX(20px); + transform: translateX(20px); + opacity: 0; + } +} + +@-webkit-keyframes fadeOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } + 100% { + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + opacity: 0; + } +} + +@keyframes fadeOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } + 100% { + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + opacity: 0; + } +} + +@-webkit-keyframes fadeOutUpBig { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } + 100% { + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + opacity: 0; + } +} + +@keyframes fadeOutUpBig { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } + 100% { + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + opacity: 0; + } +} + +@-webkit-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +@keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +@-webkit-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +@keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +@-webkit-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +@keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +@-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@-webkit-keyframes fadeInUp { + 0% { + -webkit-transform: translateY(20px); + transform: translateY(20px); + opacity: 0; + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } +} + +@keyframes fadeInUp { + 0% { + -webkit-transform: translateY(20px); + transform: translateY(20px); + opacity: 0; + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } +} + +@-webkit-keyframes fadeInDown { + 0% { + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + opacity: 0; + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } +} + +@keyframes fadeInDown { + 0% { + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + opacity: 0; + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } +} + +@-webkit-keyframes fadeInRight { + 0% { + -webkit-transform: translateX(20px); + transform: translateX(20px); + opacity: 0; + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } +} + +@keyframes fadeInRight { + 0% { + -webkit-transform: translateX(20px); + transform: translateX(20px); + opacity: 0; + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } +} + +@-webkit-keyframes fadeInLeft { + 0% { + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + opacity: 0; + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } +} + +@keyframes fadeInLeft { + 0% { + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + opacity: 0; + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } +} + +@-webkit-keyframes fadeInUpBig { + 0% { + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + opacity: 0; + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } +} + +@keyframes fadeInUpBig { + 0% { + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + opacity: 0; + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } +} + +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@-webkit-keyframes flip { + 0% { + -webkit-transform: perspective(400px) rotateY(0); + transform: perspective(400px) rotateY(0); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg); + transform: perspective(400px) translateZ(150px) rotateY(170deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) + scale(1); + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 80% { + -webkit-transform: perspective(400px) rotateY(360deg) scale(0.95); + transform: perspective(400px) rotateY(360deg) scale(0.95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px) scale(1); + transform: perspective(400px) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@keyframes flip { + 0% { + -webkit-transform: perspective(400px) rotateY(0); + transform: perspective(400px) rotateY(0); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg); + transform: perspective(400px) translateZ(150px) rotateY(170deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) + scale(1); + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 80% { + -webkit-transform: perspective(400px) rotateY(360deg) scale(0.95); + transform: perspective(400px) rotateY(360deg) scale(0.95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px) scale(1); + transform: perspective(400px) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + transform: perspective(400px) rotateX(-10deg); + } + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + transform: perspective(400px) rotateX(10deg); + } + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } +} + +@keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + transform: perspective(400px) rotateX(-10deg); + } + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + transform: perspective(400px) rotateX(10deg); + } + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } +} + +@-webkit-keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } +} + +@keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } +} + +@-webkit-keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + transform: perspective(400px) rotateY(-10deg); + } + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + transform: perspective(400px) rotateY(10deg); + } + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } +} + +@keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + transform: perspective(400px) rotateY(-10deg); + } + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + transform: perspective(400px) rotateY(10deg); + } + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } +} + +@-webkit-keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } +} + +@keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } +} + +@-webkit-keyframes lightSpeedIn { + 0% { + -webkit-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } + 60% { + -webkit-transform: translateX(-20%) skewX(30deg); + transform: translateX(-20%) skewX(30deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } + 80% { + -webkit-transform: translateX(0%) skewX(-15deg); + transform: translateX(0%) skewX(-15deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } + 100% { + -webkit-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } +} + +@keyframes lightSpeedIn { + 0% { + -webkit-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } + 60% { + -webkit-transform: translateX(-20%) skewX(30deg); + transform: translateX(-20%) skewX(30deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } + 80% { + -webkit-transform: translateX(0%) skewX(-15deg); + transform: translateX(0%) skewX(-15deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } + 100% { + -webkit-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } +} + +@-webkit-keyframes lightSpeedOut { + 0% { + -webkit-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } + 100% { + -webkit-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } +} + +@keyframes lightSpeedOut { + 0% { + -webkit-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } + 100% { + -webkit-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } +} + +@-webkit-keyframes rotateOut { + 0% { + -webkit-transform-origin: center center 50%; + transform-origin: center center 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: center center 50%; + transform-origin: center center 50%; + -webkit-transform: rotate(200deg); + transform: rotate(200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + 0% { + -webkit-transform-origin: center center 50%; + transform-origin: center center 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: center center 50%; + transform-origin: center center 50%; + -webkit-transform: rotate(200deg); + transform: rotate(200deg); + opacity: 0; + } +} + +@-webkit-keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +@-webkit-keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +@-webkit-keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +@-webkit-keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +@-webkit-keyframes rotateIn { + 0% { + -webkit-transform-origin: center center 50%; + transform-origin: center center 50%; + -webkit-transform: rotate(-200deg); + transform: rotate(-200deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: center center 50%; + transform-origin: center center 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateIn { + 0% { + -webkit-transform-origin: center center 50%; + transform-origin: center center 50%; + -webkit-transform: rotate(-200deg); + transform: rotate(-200deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: center center 50%; + transform-origin: center center 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@-webkit-keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@-webkit-keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: left bottom 50%; + transform-origin: left bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@-webkit-keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@-webkit-keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: right bottom 50%; + transform-origin: right bottom 50%; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + -webkit-transform-origin: top left 50%; + transform-origin: top left 50%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 20%, + 60% { + -webkit-transform: rotate(80deg); + transform: rotate(80deg); + -webkit-transform-origin: top left 50%; + transform-origin: top left 50%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 40% { + -webkit-transform: rotate(60deg); + transform: rotate(60deg); + -webkit-transform-origin: top left 50%; + transform-origin: top left 50%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 80% { + -webkit-transform: rotate(60deg) translateY(0); + transform: rotate(60deg) translateY(0); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + -webkit-transform-origin: top left 50%; + transform-origin: top left 50%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 100% { + -webkit-transform: translateY(700px); + transform: translateY(700px); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } +} + +@keyframes hinge { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + -webkit-transform-origin: top left 50%; + transform-origin: top left 50%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 20%, + 60% { + -webkit-transform: rotate(80deg); + transform: rotate(80deg); + -webkit-transform-origin: top left 50%; + transform-origin: top left 50%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 40% { + -webkit-transform: rotate(60deg); + transform: rotate(60deg); + -webkit-transform-origin: top left 50%; + transform-origin: top left 50%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 80% { + -webkit-transform: rotate(60deg) translateY(0); + transform: rotate(60deg) translateY(0); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + -webkit-transform-origin: top left 50%; + transform-origin: top left 50%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 100% { + -webkit-transform: translateY(700px); + transform: translateY(700px); + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + } +} + +@-webkit-keyframes rollIn { + 0% { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + -webkit-transform: translateX(-100%) rotate(-120deg); + transform: translateX(-100%) rotate(-120deg); + } + 100% { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } +} + +@keyframes rollIn { + 0% { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + -webkit-transform: translateX(-100%) rotate(-120deg); + transform: translateX(-100%) rotate(-120deg); + } + 100% { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } +} + +@-webkit-keyframes rollOut { + 0% { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } + 100% { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + -webkit-transform: translateX(-100%) rotate(-120deg); + transform: translateX(-100%) rotate(-120deg); + } +} + +@keyframes rollOut { + 0% { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } + 100% { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + -webkit-transform: translateX(-100%) rotate(-120deg); + transform: translateX(-100%) rotate(-120deg); + } +} + +/*-------------------------------------------------------------------*/ +/* === Boostrap Main SCSS === */ +/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root { + --bs-blue: #5e50f9; + --bs-indigo: #6610f2; + --bs-purple: #6a008a; + --bs-pink: #e91e63; + --bs-red: #f96868; + --bs-orange: #f2a654; + --bs-yellow: #f6e84e; + --bs-green: #46c35f; + --bs-teal: #58d8a3; + --bs-cyan: #57c7d4; + --bs-white: #ffffff; + --bs-gray: #434a54; + --bs-gray-light: #aab2bd; + --bs-gray-lighter: #e8eff4; + --bs-gray-lightest: #e6e9ed; + --bs-gray-dark: #0f1531; + --bs-black: #000000; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #6bc1f3; + --bs-secondary: #c3bdbd; + --bs-success: #1bcfb4; + --bs-info: #198ae3; + --bs-warning: #fed713; + --bs-danger: #fe7c96; + --bs-light: #f8f9fa; + --bs-dark: #3e4b5b; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-body-color-rgb: 52, 58, 64; + --bs-body-bg-rgb: 255, 255, 255; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, + "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", + "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, + "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.15), + rgba(255, 255, 255, 0) + ); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #343a40; + --bs-body-bg: #fff; +} + +*, +*::before, +*::after { + font-family: "poppins"; + font-size: 14; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} + +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +hr { + margin: 1rem 0; + color: inherit; + background-color: currentColor; + border: 0; + opacity: 0.25; +} + +hr:not([size]) { + height: 1px; +} + +h1, +.h1, +h2, +.h2, +h3, +.h3, +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h1, +.h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + h1, + .h1 { + font-size: 2.5rem; + } +} + +h2, +.h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + h2, + .h2 { + font-size: 2rem; + } +} + +h3, +.h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + h3, + .h3 { + font-size: 1.75rem; + } +} + +h4, +.h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + h4, + .h4 { + font-size: 1.5rem; + } +} + +h5, +.h5 { + font-size: 1.25rem; +} + +h6, +.h6 { + font-size: 1rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-bs-original-title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul { + padding-left: 2rem; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small, +.small { + font-size: 0.875em; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: #0d6efd; + text-decoration: underline; +} +a:hover { + color: #0a58ca; +} + +a:not([href]):not([class]), +a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; + direction: ltr /* rtl:ignore */; + unicode-bidi: bidi-override; +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +code { + font-size: 0.875em; + color: #d63384; + word-wrap: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 0.875em; + color: #fff; + background-color: #212529; + border-radius: 0.2rem; +} +kbd kbd { + padding: 0; + font-size: 1em; + font-weight: 700; +} + +figure { + margin: 0 0 1rem; +} + +img, +svg { + vertical-align: middle; +} + +table { + caption-side: bottom; + border-collapse: collapse; +} + +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: #6c757d; + text-align: left; +} + +th { + text-align: inherit; + text-align: -webkit-match-parent; +} + +thead, +tbody, +tfoot, +tr, +td, +th { + border-color: inherit; + border-style: solid; + border-width: 0; +} + +label { + display: inline-block; +} + +button { + border-radius: 0; +} + +button:focus:not(:focus-visible) { + outline: 0; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +select { + text-transform: none; +} + +[role="button"] { + cursor: pointer; +} + +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} + +[list]::-webkit-calendar-picker-indicator { + display: none; +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; +} + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +textarea { + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} + +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-year-field { + padding: 0; +} + +::-webkit-inner-spin-button { + height: auto; +} + +/* [type="search"] { + outline-offset: -2px; + -webkit-appearance: textfield; */ +/* } + */ + +/* rtl:raw: +[type="tel"], +[type="url"], +[type="email"], +[type="number"] { + direction: ltr; +} +*/ +::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-color-swatch-wrapper { + padding: 0; +} + +::file-selector-button { + font: inherit; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +iframe { + border: 0; +} + +summary { + display: list-item; + cursor: pointer; +} + +progress { + vertical-align: baseline; +} + +[hidden] { + display: none !important; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } +} + +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } +} + +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } +} + +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } +} + +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } +} + +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} + +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #6c757d; +} +.blockquote-footer::before { + content: "\2014\00A0"; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 0.875em; + color: #6c757d; +} + +.container, +.container-fluid, +.container-sm, +.container-md, +.container-lg, +.container-xl, +.container-xxl { + width: 100%; + padding-right: var(--bs-gutter-x, 0.75rem); + padding-left: var(--bs-gutter-x, 0.75rem); + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container, + .container-sm { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .container, + .container-sm, + .container-md { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .container, + .container-sm, + .container-md, + .container-lg { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .container, + .container-sm, + .container-md, + .container-lg, + .container-xl { + max-width: 1140px; + } +} + +@media (min-width: 1400px) { + .container, + .container-sm, + .container-md, + .container-lg, + .container-xl, + .container-xxl { + max-width: 1320px; + } +} + +.row { + --bs-gutter-x: 40px; + --bs-gutter-y: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} +.row > * { + -ms-flex-negative: 0; + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); +} + +.col { + -webkit-box-flex: 1; + -ms-flex: 1 0 0%; + flex: 1 0 0%; +} + +.row-cols-auto > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; +} + +.row-cols-1 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; +} + +.row-cols-4 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; +} + +.col-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; +} + +.col-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.33333%; +} + +.col-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; +} + +.col-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; +} + +.col-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.66667%; +} + +.col-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.33333%; +} + +.col-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.66667%; +} + +.col-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.33333%; +} + +.col-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.66667%; +} + +.col-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; +} + +.offset-1 { + margin-left: 8.33333%; +} + +.offset-2 { + margin-left: 16.66667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333%; +} + +.offset-5 { + margin-left: 41.66667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333%; +} + +.offset-8 { + margin-left: 66.66667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333%; +} + +.offset-11 { + margin-left: 91.66667%; +} + +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} + +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} + +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} + +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} + +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} + +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} + +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} + +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} + +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} + +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} + +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} + +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} + +@media (min-width: 576px) { + .col-sm { + -webkit-box-flex: 1; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + } + .row-cols-sm-auto > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .row-cols-sm-1 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .row-cols-sm-2 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .row-cols-sm-3 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; + } + .row-cols-sm-4 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .row-cols-sm-5 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; + } + .row-cols-sm-6 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; + } + .col-sm-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-sm-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.33333%; + } + .col-sm-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; + } + .col-sm-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .col-sm-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; + } + .col-sm-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.66667%; + } + .col-sm-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .col-sm-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.33333%; + } + .col-sm-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.66667%; + } + .col-sm-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; + } + .col-sm-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.33333%; + } + .col-sm-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.66667%; + } + .col-sm-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333%; + } + .offset-sm-2 { + margin-left: 16.66667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333%; + } + .offset-sm-5 { + margin-left: 41.66667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333%; + } + .offset-sm-8 { + margin-left: 66.66667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333%; + } + .offset-sm-11 { + margin-left: 91.66667%; + } + .g-sm-0, + .gx-sm-0 { + --bs-gutter-x: 0; + } + .g-sm-0, + .gy-sm-0 { + --bs-gutter-y: 0; + } + .g-sm-1, + .gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + .g-sm-1, + .gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + .g-sm-2, + .gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + .g-sm-2, + .gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + .g-sm-3, + .gx-sm-3 { + --bs-gutter-x: 1rem; + } + .g-sm-3, + .gy-sm-3 { + --bs-gutter-y: 1rem; + } + .g-sm-4, + .gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + .g-sm-4, + .gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + .g-sm-5, + .gx-sm-5 { + --bs-gutter-x: 3rem; + } + .g-sm-5, + .gy-sm-5 { + --bs-gutter-y: 3rem; + } +} + +@media (min-width: 768px) { + .col-md { + -webkit-box-flex: 1; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + } + .row-cols-md-auto > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .row-cols-md-1 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .row-cols-md-2 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .row-cols-md-3 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; + } + .row-cols-md-4 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .row-cols-md-5 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; + } + .row-cols-md-6 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; + } + .col-md-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-md-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.33333%; + } + .col-md-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; + } + .col-md-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .col-md-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; + } + .col-md-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.66667%; + } + .col-md-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .col-md-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.33333%; + } + .col-md-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.66667%; + } + .col-md-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; + } + .col-md-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.33333%; + } + .col-md-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.66667%; + } + .col-md-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333%; + } + .offset-md-2 { + margin-left: 16.66667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333%; + } + .offset-md-5 { + margin-left: 41.66667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333%; + } + .offset-md-8 { + margin-left: 66.66667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333%; + } + .offset-md-11 { + margin-left: 91.66667%; + } + .g-md-0, + .gx-md-0 { + --bs-gutter-x: 0; + } + .g-md-0, + .gy-md-0 { + --bs-gutter-y: 0; + } + .g-md-1, + .gx-md-1 { + --bs-gutter-x: 0.25rem; + } + .g-md-1, + .gy-md-1 { + --bs-gutter-y: 0.25rem; + } + .g-md-2, + .gx-md-2 { + --bs-gutter-x: 0.5rem; + } + .g-md-2, + .gy-md-2 { + --bs-gutter-y: 0.5rem; + } + .g-md-3, + .gx-md-3 { + --bs-gutter-x: 1rem; + } + .g-md-3, + .gy-md-3 { + --bs-gutter-y: 1rem; + } + .g-md-4, + .gx-md-4 { + --bs-gutter-x: 1.5rem; + } + .g-md-4, + .gy-md-4 { + --bs-gutter-y: 1.5rem; + } + .g-md-5, + .gx-md-5 { + --bs-gutter-x: 3rem; + } + .g-md-5, + .gy-md-5 { + --bs-gutter-y: 3rem; + } +} + +@media (min-width: 992px) { + .col-lg { + -webkit-box-flex: 1; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + } + .row-cols-lg-auto > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .row-cols-lg-1 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .row-cols-lg-2 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .row-cols-lg-3 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; + } + .row-cols-lg-4 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .row-cols-lg-5 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; + } + .row-cols-lg-6 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; + } + .col-lg-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-lg-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.33333%; + } + .col-lg-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; + } + .col-lg-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .col-lg-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; + } + .col-lg-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.66667%; + } + .col-lg-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .col-lg-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.33333%; + } + .col-lg-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.66667%; + } + .col-lg-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; + } + .col-lg-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.33333%; + } + .col-lg-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.66667%; + } + .col-lg-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333%; + } + .offset-lg-2 { + margin-left: 16.66667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333%; + } + .offset-lg-5 { + margin-left: 41.66667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333%; + } + .offset-lg-8 { + margin-left: 66.66667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333%; + } + .offset-lg-11 { + margin-left: 91.66667%; + } + .g-lg-0, + .gx-lg-0 { + --bs-gutter-x: 0; + } + .g-lg-0, + .gy-lg-0 { + --bs-gutter-y: 0; + } + .g-lg-1, + .gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + .g-lg-1, + .gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + .g-lg-2, + .gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + .g-lg-2, + .gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + .g-lg-3, + .gx-lg-3 { + --bs-gutter-x: 1rem; + } + .g-lg-3, + .gy-lg-3 { + --bs-gutter-y: 1rem; + } + .g-lg-4, + .gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + .g-lg-4, + .gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + .g-lg-5, + .gx-lg-5 { + --bs-gutter-x: 3rem; + } + .g-lg-5, + .gy-lg-5 { + --bs-gutter-y: 3rem; + } +} + +@media (min-width: 1200px) { + .col-xl { + -webkit-box-flex: 1; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + } + .row-cols-xl-auto > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .row-cols-xl-1 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .row-cols-xl-2 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .row-cols-xl-3 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; + } + .row-cols-xl-4 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .row-cols-xl-5 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; + } + .row-cols-xl-6 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; + } + .col-xl-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-xl-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.33333%; + } + .col-xl-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; + } + .col-xl-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .col-xl-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; + } + .col-xl-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.66667%; + } + .col-xl-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .col-xl-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.33333%; + } + .col-xl-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.66667%; + } + .col-xl-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; + } + .col-xl-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.33333%; + } + .col-xl-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.66667%; + } + .col-xl-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333%; + } + .offset-xl-2 { + margin-left: 16.66667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333%; + } + .offset-xl-5 { + margin-left: 41.66667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333%; + } + .offset-xl-8 { + margin-left: 66.66667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333%; + } + .offset-xl-11 { + margin-left: 91.66667%; + } + .g-xl-0, + .gx-xl-0 { + --bs-gutter-x: 0; + } + .g-xl-0, + .gy-xl-0 { + --bs-gutter-y: 0; + } + .g-xl-1, + .gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xl-1, + .gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xl-2, + .gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xl-2, + .gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xl-3, + .gx-xl-3 { + --bs-gutter-x: 1rem; + } + .g-xl-3, + .gy-xl-3 { + --bs-gutter-y: 1rem; + } + .g-xl-4, + .gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xl-4, + .gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xl-5, + .gx-xl-5 { + --bs-gutter-x: 3rem; + } + .g-xl-5, + .gy-xl-5 { + --bs-gutter-y: 3rem; + } +} + +@media (min-width: 1400px) { + .col-xxl { + -webkit-box-flex: 1; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + } + .row-cols-xxl-auto > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .row-cols-xxl-1 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .row-cols-xxl-2 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .row-cols-xxl-3 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; + } + .row-cols-xxl-4 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .row-cols-xxl-5 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; + } + .row-cols-xxl-6 > * { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; + } + .col-xxl-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-xxl-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.33333%; + } + .col-xxl-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.66667%; + } + .col-xxl-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .col-xxl-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.33333%; + } + .col-xxl-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.66667%; + } + .col-xxl-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .col-xxl-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.33333%; + } + .col-xxl-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.66667%; + } + .col-xxl-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; + } + .col-xxl-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.33333%; + } + .col-xxl-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.66667%; + } + .col-xxl-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .offset-xxl-0 { + margin-left: 0; + } + .offset-xxl-1 { + margin-left: 8.33333%; + } + .offset-xxl-2 { + margin-left: 16.66667%; + } + .offset-xxl-3 { + margin-left: 25%; + } + .offset-xxl-4 { + margin-left: 33.33333%; + } + .offset-xxl-5 { + margin-left: 41.66667%; + } + .offset-xxl-6 { + margin-left: 50%; + } + .offset-xxl-7 { + margin-left: 58.33333%; + } + .offset-xxl-8 { + margin-left: 66.66667%; + } + .offset-xxl-9 { + margin-left: 75%; + } + .offset-xxl-10 { + margin-left: 83.33333%; + } + .offset-xxl-11 { + margin-left: 91.66667%; + } + .g-xxl-0, + .gx-xxl-0 { + --bs-gutter-x: 0; + } + .g-xxl-0, + .gy-xxl-0 { + --bs-gutter-y: 0; + } + .g-xxl-1, + .gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xxl-1, + .gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xxl-2, + .gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xxl-2, + .gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xxl-3, + .gx-xxl-3 { + --bs-gutter-x: 1rem; + } + .g-xxl-3, + .gy-xxl-3 { + --bs-gutter-y: 1rem; + } + .g-xxl-4, + .gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xxl-4, + .gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xxl-5, + .gx-xxl-5 { + --bs-gutter-x: 3rem; + } + .g-xxl-5, + .gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} + +.table { + --bs-table-bg: transparent; + --bs-table-accent-bg: transparent; + --bs-table-striped-color: #212529; + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: #212529; + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: #212529; + --bs-table-hover-bg: #f2edf3; + width: 100%; + margin-bottom: 1rem; + color: #212529; + vertical-align: top; + border-color: #ebedf2; +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + background-color: var(--bs-table-bg); + border-bottom-width: 1px; + -webkit-box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} +.table > :not(:first-child) { + border-top: 2px solid currentColor; +} + +.caption-top { + caption-side: top; +} + +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} + +.table-bordered > :not(caption) > * { + border-width: 1px 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 1px; +} + +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} + +.table-borderless > :not(:first-child) { + border-top-width: 0; +} + +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); +} + +.table-active { + --bs-table-accent-bg: var(--bs-table-active-bg); + color: var(--bs-table-active-color); +} + +.table-hover > tbody > tr:hover > * { + --bs-table-accent-bg: var(--bs-table-hover-bg); + color: var(--bs-table-hover-color); +} + +.table-primary { + --bs-table-bg: #cfe2ff; + --bs-table-striped-bg: #c5d7f2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bacbe6; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfd1ec; + --bs-table-hover-color: #000; + color: #000; + border-color: #bacbe6; +} + +.table-secondary { + --bs-table-bg: #e2e3e5; + --bs-table-striped-bg: #d7d8da; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cbccce; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d1d2d4; + --bs-table-hover-color: #000; + color: #000; + border-color: #cbccce; +} + +.table-success { + --bs-table-bg: #d1e7dd; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: #000; + border-color: #bcd0c7; +} + +.table-info { + --bs-table-bg: #cff4fc; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: #000; + border-color: #badce3; +} + +.table-warning { + --bs-table-bg: #fff3cd; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: #000; + border-color: #e6dbb9; +} + +.table-danger { + --bs-table-bg: #f8d7da; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: #000; + border-color: #dfc2c4; +} + +.table-light { + --bs-table-bg: #f8f9fa; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: #000; + border-color: #dfe0e1; +} + +.table-dark { + --bs-table-bg: #212529; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #373b3e; +} + +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} + +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} + +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} + +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} + +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} + +.form-label { + margin-bottom: 0.5rem; +} + +.col-form-label { + padding-top: calc(0.94rem + 1px); + padding-bottom: calc(0.94rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1; +} + +.col-form-label-lg { + padding-top: calc(0.94rem + 1px); + padding-bottom: calc(0.94rem + 1px); + font-size: 1.25rem; +} + +.col-form-label-sm { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 0.875rem; +} + +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: #6c757d; +} + +.form-control { + display: block; + width: 100%; + padding: 0.94rem 1.375rem; + font-size: 0.8125rem; + font-weight: 400; + line-height: 1; + color: #212529; + background-color: color(white); + background-clip: padding-box; + border: 1px solid #ced4da; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 2px; + -webkit-transition: border-color 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + -webkit-transition: none; + transition: none; + } +} +.form-control[type="file"] { + overflow: hidden; +} +.form-control[type="file"]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: #212529; + background-color: #fff; + border-color: #86b7fe; + outline: 0; + -webkit-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-control::-webkit-date-and-time-value { + height: 1em; +} +.form-control::-webkit-input-placeholder { + color: #c9c8c8; + opacity: 1; +} +.form-control::-moz-placeholder { + color: #c9c8c8; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #c9c8c8; + opacity: 1; +} +.form-control::-ms-input-placeholder { + color: #c9c8c8; + opacity: 1; +} +.form-control::placeholder { + color: #c9c8c8; + opacity: 1; +} +.form-control:disabled, +.form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} +.form-control::file-selector-button { + padding: 0.94rem 1.375rem; + margin: -0.94rem -1.375rem; + -webkit-margin-end: 1.375rem; + margin-inline-end: 1.375rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + -webkit-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::file-selector-button { + -webkit-transition: none; + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: #dde0e3; +} +.form-control::-webkit-file-upload-button { + padding: 0.94rem 1.375rem; + margin: -0.94rem -1.375rem; + -webkit-margin-end: 1.375rem; + margin-inline-end: 1.375rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + -webkit-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: #dde0e3; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.94rem 0; + margin-bottom: 0; + line-height: 1; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext.form-control-sm, +.form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + min-height: 2.575rem; + padding: 0.5rem 0.81rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} +.form-control-sm::file-selector-button { + padding: 0.5rem 0.81rem; + margin: -0.5rem -0.81rem; + -webkit-margin-end: 0.81rem; + margin-inline-end: 0.81rem; +} +.form-control-sm::-webkit-file-upload-button { + padding: 0.5rem 0.81rem; + margin: -0.5rem -0.81rem; + -webkit-margin-end: 0.81rem; + margin-inline-end: 0.81rem; +} + +.form-control-lg { + min-height: 3.175rem; + padding: 0.94rem 1.94rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} +.form-control-lg::file-selector-button { + padding: 0.94rem 1.94rem; + margin: -0.94rem -1.94rem; + -webkit-margin-end: 1.94rem; + margin-inline-end: 1.94rem; +} +.form-control-lg::-webkit-file-upload-button { + padding: 0.94rem 1.94rem; + margin: -0.94rem -1.94rem; + -webkit-margin-end: 1.94rem; + margin-inline-end: 1.94rem; +} + +textarea.form-control { + min-height: 2.875rem; +} + +textarea.form-control-sm { + min-height: 2.575rem; +} + +textarea.form-control-lg { + min-height: 3.175rem; +} + +.form-control-color { + width: 3rem; + height: auto; + padding: 0.94rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + height: 1em; + border-radius: 2px; +} +.form-control-color::-webkit-color-swatch { + height: 1em; + border-radius: 2px; +} + +.form-select { + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + -moz-padding-start: calc(0.75rem - 3px); + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-transition: border-color 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-select { + -webkit-transition: none; + transition: none; + } +} +.form-select:focus { + border-color: #86b7fe; + outline: 0; + -webkit-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-select[multiple], +.form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: #e9ecef; +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #212529; +} + +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} + +.form-check-input { + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: 1px solid rgba(0, 0, 0, 0.25); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-print-color-adjust: exact; + color-adjust: exact; +} +.form-check-input[type="checkbox"] { + border-radius: 0.25em; +} +.form-check-input[type="radio"] { + border-radius: 50%; +} +.form-check-input:active { + -webkit-filter: brightness(90%); + filter: brightness(90%); +} +.form-check-input:focus { + border-color: #86b7fe; + outline: 0; + -webkit-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; +} +.form-check-input:checked[type="checkbox"] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type="radio"] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type="checkbox"]:indeterminate { + background-color: #0d6efd; + border-color: #0d6efd; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + -webkit-filter: none; + filter: none; + opacity: 0.5; +} +.form-check-input[disabled] ~ .form-check-label, +.form-check-input:disabled ~ .form-check-label { + opacity: 0.5; +} + +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + width: 2em; + margin-left: -2.5em; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + background-position: left center; + border-radius: 2em; + -webkit-transition: background-position 0.15s ease-in-out; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + -webkit-transition: none; + transition: none; + } +} +.form-switch .form-check-input:focus { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} + +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} + +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check[disabled] + .btn, +.btn-check:disabled + .btn { + pointer-events: none; + -webkit-filter: none; + filter: none; + opacity: 0.65; +} + +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} +.form-range::-webkit-slider-thumb:active { + background-color: #b6d4fe; +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} +.form-range::-moz-range-thumb:active { + background-color: #b6d4fe; +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} +.form-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-select { + height: calc(3.5rem + 2px); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + height: 100%; + padding: 1rem 0.75rem; + pointer-events: none; + border: 1px solid transparent; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transition: opacity 0.1s ease-in-out, + -webkit-transform 0.1s ease-in-out; + transition: opacity 0.1s ease-in-out, -webkit-transform 0.1s ease-in-out; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out, + -webkit-transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + -webkit-transition: none; + transition: none; + } +} +.form-floating > .form-control { + padding: 1rem 0.75rem; +} +.form-floating > .form-control::-webkit-input-placeholder { + color: transparent; +} +.form-floating > .form-control::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control:-ms-input-placeholder { + color: transparent; +} +.form-floating > .form-control::-ms-input-placeholder { + color: transparent; +} +.form-floating > .form-control::placeholder { + color: transparent; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-ms-input-placeholder) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:focus, +.form-floating > .form-control:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:not(:-ms-input-placeholder) ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-select ~ label { + opacity: 0.65; + -webkit-transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:-webkit-autofill ~ label { + opacity: 0.65; + -webkit-transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} + +.input-group { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-select { + position: relative; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-select:focus { + z-index: 3; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 3; +} + +.input-group-text { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 0.8125rem; + font-weight: 400; + line-height: 1; + color: #212529; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 2px; +} + +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text, +.input-group-lg > .btn { + padding: 0.94rem 1.94rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text, +.input-group-sm > .btn { + padding: 0.5rem 0.81rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} + +.input-group:not(.has-validation) + > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu), +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group.has-validation + > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu), +.input-group.has-validation > .dropdown-toggle:nth-last-child(n + 4) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group + > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not( + .valid-feedback + ):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: -1px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #198754; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(25, 135, 84, 0.9); + border-radius: 0.25rem; +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, +.form-control.is-valid { + border-color: #198754; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:valid:focus, +.form-control.is-valid:focus { + border-color: #198754; + -webkit-box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated textarea.form-control:valid, +textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:valid, +.form-select.is-valid { + border-color: #198754; +} +.was-validated .form-select:valid:not([multiple]):not([size]), +.was-validated .form-select:valid:not([multiple])[size="1"], +.form-select.is-valid:not([multiple]):not([size]), +.form-select.is-valid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:valid:focus, +.form-select.is-valid:focus { + border-color: #198754; + -webkit-box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated .form-check-input:valid, +.form-check-input.is-valid { + border-color: #198754; +} +.was-validated .form-check-input:valid:checked, +.form-check-input.is-valid:checked { + background-color: #198754; +} +.was-validated .form-check-input:valid:focus, +.form-check-input.is-valid:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} +.was-validated .form-check-input:valid ~ .form-check-label, +.form-check-input.is-valid ~ .form-check-label { + color: #198754; +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group .form-control:valid, +.input-group .form-control.is-valid, +.was-validated .input-group .form-select:valid, +.input-group .form-select.is-valid { + z-index: 1; +} +.was-validated .input-group .form-control:valid:focus, +.input-group .form-control.is-valid:focus, +.was-validated .input-group .form-select:valid:focus, +.input-group .form-select.is-valid:focus { + z-index: 3; +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.25rem; +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, +.form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:invalid:focus, +.form-control.is-invalid:focus { + border-color: #dc3545; + -webkit-box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated textarea.form-control:invalid, +textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:invalid, +.form-select.is-invalid { + border-color: #dc3545; +} +.was-validated .form-select:invalid:not([multiple]):not([size]), +.was-validated .form-select:invalid:not([multiple])[size="1"], +.form-select.is-invalid:not([multiple]):not([size]), +.form-select.is-invalid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:invalid:focus, +.form-select.is-invalid:focus { + border-color: #dc3545; + -webkit-box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated .form-check-input:invalid, +.form-check-input.is-invalid { + border-color: #dc3545; +} +.was-validated .form-check-input:invalid:checked, +.form-check-input.is-invalid:checked { + background-color: #dc3545; +} +.was-validated .form-check-input:invalid:focus, +.form-check-input.is-invalid:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} +.was-validated .form-check-input:invalid ~ .form-check-label, +.form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group .form-control:invalid, +.input-group .form-control.is-invalid, +.was-validated .input-group .form-select:invalid, +.input-group .form-select.is-invalid { + z-index: 2; +} +.was-validated .input-group .form-control:invalid:focus, +.input-group .form-control.is-invalid:focus, +.was-validated .input-group .form-select:invalid:focus, +.input-group .form-select.is-invalid:focus { + z-index: 3; +} + +.btn { + display: inline-block; + font-weight: 400; + line-height: 1; + color: #343a40; + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.875rem 2.5rem; + font-size: 0.875rem; + border-radius: 0.1875rem; + -webkit-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + -webkit-transition: none; + transition: none; + } +} +.btn:hover { + color: #343a40; +} +.btn-check:focus + .btn, +.btn:focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.btn:disabled, +.btn.disabled, +fieldset:disabled .btn { + pointer-events: none; + opacity: 0.65; +} + +.btn-primary { + color: #000; + background-color: #6bc1f3; + border-color: #6bc1f3; +} +.btn-primary:hover { + color: #000; + background-color: #6bc1f3; + border-color: #6bc1f3; +} +.btn-check:focus + .btn-primary, +.btn-primary:focus { + color: #000; + background-color: #6bc1f3; + border-color: #6bc1f3; + -webkit-box-shadow: 0 0 0 0.25rem rgba(155, 93, 217, 0.5); + box-shadow: 0 0 0 0.25rem rgba(155, 93, 217, 0.5); +} +.btn-check:checked + .btn-primary, +.btn-check:active + .btn-primary, +.btn-primary:active, +.btn-primary.active, +.show > .btn-primary.dropdown-toggle { + color: #000; + background-color: #6bc1f3; + border-color: #6bc1f3; +} +.btn-check:checked + .btn-primary:focus, +.btn-check:active + .btn-primary:focus, +.btn-primary:active:focus, +.btn-primary.active:focus, +.show > .btn-primary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(155, 93, 217, 0.5); + box-shadow: 0 0 0 0.25rem rgba(155, 93, 217, 0.5); +} +.btn-primary:disabled, +.btn-primary.disabled { + color: #000; + background-color: #6bc1f3; + border-color: #6bc1f3; +} + +.btn-secondary { + color: #000; + background-color: #c3bdbd; + border-color: #c3bdbd; +} +.btn-secondary:hover { + color: #000; + background-color: #ccc7c7; + border-color: #c9c4c4; +} +.btn-check:focus + .btn-secondary, +.btn-secondary:focus { + color: #000; + background-color: #ccc7c7; + border-color: #c9c4c4; + -webkit-box-shadow: 0 0 0 0.25rem rgba(166, 161, 161, 0.5); + box-shadow: 0 0 0 0.25rem rgba(166, 161, 161, 0.5); +} +.btn-check:checked + .btn-secondary, +.btn-check:active + .btn-secondary, +.btn-secondary:active, +.btn-secondary.active, +.show > .btn-secondary.dropdown-toggle { + color: #000; + background-color: #cfcaca; + border-color: #c9c4c4; +} +.btn-check:checked + .btn-secondary:focus, +.btn-check:active + .btn-secondary:focus, +.btn-secondary:active:focus, +.btn-secondary.active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(166, 161, 161, 0.5); + box-shadow: 0 0 0 0.25rem rgba(166, 161, 161, 0.5); +} +.btn-secondary:disabled, +.btn-secondary.disabled { + color: #000; + background-color: #c3bdbd; + border-color: #c3bdbd; +} + +.btn-success { + color: #000; + background-color: #3dd6bf; + border-color: #32d4bc; +} +.btn-success:hover { + color: #000; + background-color: #3dd6bf; + border-color: #32d4bc; +} +.btn-check:focus + .btn-success, +.btn-success:focus { + color: #000; + background-color: #3dd6bf; + border-color: #32d4bc; + -webkit-box-shadow: 0 0 0 0.25rem rgba(23, 176, 153, 0.5); + box-shadow: 0 0 0 0.25rem rgba(23, 176, 153, 0.5); +} +.btn-check:checked + .btn-success, +.btn-check:active + .btn-success, +.btn-success:active, +.btn-success.active, +.show > .btn-success.dropdown-toggle { + color: #000; + background-color: #49d9c3; + border-color: #32d4bc; +} +.btn-check:checked + .btn-success:focus, +.btn-check:active + .btn-success:focus, +.btn-success:active:focus, +.btn-success.active:focus, +.show > .btn-success.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(23, 176, 153, 0.5); + box-shadow: 0 0 0 0.25rem rgba(23, 176, 153, 0.5); +} +.btn-success:disabled, +.btn-success.disabled { + color: #000; + background-color: #1bcfb4; + border-color: #1bcfb4; +} + +.btn-info { + color: #000; + background-color: #198ae3; + border-color: #198ae3; +} +.btn-info:hover { + color: #000; + background-color: #3c9ce7; + border-color: #3096e6; +} +.btn-check:focus + .btn-info, +.btn-info:focus { + color: #000; + background-color: #3c9ce7; + border-color: #3096e6; + -webkit-box-shadow: 0 0 0 0.25rem rgba(21, 117, 193, 0.5); + box-shadow: 0 0 0 0.25rem rgba(21, 117, 193, 0.5); +} +.btn-check:checked + .btn-info, +.btn-check:active + .btn-info, +.btn-info:active, +.btn-info.active, +.show > .btn-info.dropdown-toggle { + color: #000; + background-color: #47a1e9; + border-color: #3096e6; +} +.btn-check:checked + .btn-info:focus, +.btn-check:active + .btn-info:focus, +.btn-info:active:focus, +.btn-info.active:focus, +.show > .btn-info.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(21, 117, 193, 0.5); + box-shadow: 0 0 0 0.25rem rgba(21, 117, 193, 0.5); +} +.btn-info:disabled, +.btn-info.disabled { + color: #000; + background-color: #198ae3; + border-color: #198ae3; +} + +.btn-warning { + color: #000; + background-color: #fed713; + border-color: #fed713; +} +.btn-warning:hover { + color: #000; + background-color: #fedd36; + border-color: #fedb2b; +} +.btn-check:focus + .btn-warning, +.btn-warning:focus { + color: #000; + background-color: #fedd36; + border-color: #fedb2b; + -webkit-box-shadow: 0 0 0 0.25rem rgba(216, 183, 16, 0.5); + box-shadow: 0 0 0 0.25rem rgba(216, 183, 16, 0.5); +} +.btn-check:checked + .btn-warning, +.btn-check:active + .btn-warning, +.btn-warning:active, +.btn-warning.active, +.show > .btn-warning.dropdown-toggle { + color: #000; + background-color: #fedf42; + border-color: #fedb2b; +} +.btn-check:checked + .btn-warning:focus, +.btn-check:active + .btn-warning:focus, +.btn-warning:active:focus, +.btn-warning.active:focus, +.show > .btn-warning.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(216, 183, 16, 0.5); + box-shadow: 0 0 0 0.25rem rgba(216, 183, 16, 0.5); +} +.btn-warning:disabled, +.btn-warning.disabled { + color: #000; + background-color: #fed713; + border-color: #fed713; +} + +.btn-danger { + color: #000; + background-color: #fe7c96; + border-color: #fe7c96; +} +.btn-danger:hover { + color: #000; + background-color: #fe90a6; + border-color: #fe89a1; +} +.btn-check:focus + .btn-danger, +.btn-danger:focus { + color: #000; + background-color: #fe90a6; + border-color: #fe89a1; + -webkit-box-shadow: 0 0 0 0.25rem rgba(216, 105, 128, 0.5); + box-shadow: 0 0 0 0.25rem rgba(216, 105, 128, 0.5); +} +.btn-check:checked + .btn-danger, +.btn-check:active + .btn-danger, +.btn-danger:active, +.btn-danger.active, +.show > .btn-danger.dropdown-toggle { + color: #000; + background-color: #fe96ab; + border-color: #fe89a1; +} +.btn-check:checked + .btn-danger:focus, +.btn-check:active + .btn-danger:focus, +.btn-danger:active:focus, +.btn-danger.active:focus, +.show > .btn-danger.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(216, 105, 128, 0.5); + box-shadow: 0 0 0 0.25rem rgba(216, 105, 128, 0.5); +} +.btn-danger:disabled, +.btn-danger.disabled { + color: #000; + background-color: #fe7c96; + border-color: #fe7c96; +} + +.btn-light { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-light:hover { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; +} +.btn-check:focus + .btn-light, +.btn-light:focus { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; + -webkit-box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); + box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); +} +.btn-check:checked + .btn-light, +.btn-check:active + .btn-light, +.btn-light:active, +.btn-light.active, +.show > .btn-light.dropdown-toggle { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; +} +.btn-check:checked + .btn-light:focus, +.btn-check:active + .btn-light:focus, +.btn-light:active:focus, +.btn-light.active:focus, +.show > .btn-light.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); + box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); +} +.btn-light:disabled, +.btn-light.disabled { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-dark { + color: #fff; + background-color: #3e4b5b; + border-color: #3e4b5b; +} +.btn-dark:hover { + color: #fff; + background-color: #35404d; + border-color: #323c49; +} +.btn-check:focus + .btn-dark, +.btn-dark:focus { + color: #fff; + background-color: #35404d; + border-color: #323c49; + -webkit-box-shadow: 0 0 0 0.25rem rgba(91, 102, 116, 0.5); + box-shadow: 0 0 0 0.25rem rgba(91, 102, 116, 0.5); +} +.btn-check:checked + .btn-dark, +.btn-check:active + .btn-dark, +.btn-dark:active, +.btn-dark.active, +.show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #323c49; + border-color: #2f3844; +} +.btn-check:checked + .btn-dark:focus, +.btn-check:active + .btn-dark:focus, +.btn-dark:active:focus, +.btn-dark.active:focus, +.show > .btn-dark.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(91, 102, 116, 0.5); + box-shadow: 0 0 0 0.25rem rgba(91, 102, 116, 0.5); +} +.btn-dark:disabled, +.btn-dark.disabled { + color: #fff; + background-color: #3e4b5b; + border-color: #3e4b5b; +} + +.btn-outline-primary { + color: #6bc1f3; + border-color: #6bc1f3; +} +.btn-outline-primary:hover { + color: #000; + background-color: #6bc1f3; + border-color: #6bc1f3; +} +.btn-check:focus + .btn-outline-primary, +.btn-outline-primary:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(182, 109, 255, 0.5); + box-shadow: 0 0 0 0.25rem rgba(182, 109, 255, 0.5); +} +.btn-check:checked + .btn-outline-primary, +.btn-check:active + .btn-outline-primary, +.btn-outline-primary:active, +.btn-outline-primary.active, +.btn-outline-primary.dropdown-toggle.show { + color: #000; + background-color: #6bc1f3; + border-color: #6bc1f3; +} +.btn-check:checked + .btn-outline-primary:focus, +.btn-check:active + .btn-outline-primary:focus, +.btn-outline-primary:active:focus, +.btn-outline-primary.active:focus, +.btn-outline-primary.dropdown-toggle.show:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(182, 109, 255, 0.5); + box-shadow: 0 0 0 0.25rem rgba(182, 109, 255, 0.5); +} +.btn-outline-primary:disabled, +.btn-outline-primary.disabled { + color: #6bc1f3; + background-color: transparent; +} + +.btn-outline-secondary { + color: #c3bdbd; + border-color: #c3bdbd; +} +.btn-outline-secondary:hover { + color: #000; + background-color: #c3bdbd; + border-color: #c3bdbd; +} +.btn-check:focus + .btn-outline-secondary, +.btn-outline-secondary:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(195, 189, 189, 0.5); + box-shadow: 0 0 0 0.25rem rgba(195, 189, 189, 0.5); +} +.btn-check:checked + .btn-outline-secondary, +.btn-check:active + .btn-outline-secondary, +.btn-outline-secondary:active, +.btn-outline-secondary.active, +.btn-outline-secondary.dropdown-toggle.show { + color: #000; + background-color: #c3bdbd; + border-color: #c3bdbd; +} +.btn-check:checked + .btn-outline-secondary:focus, +.btn-check:active + .btn-outline-secondary:focus, +.btn-outline-secondary:active:focus, +.btn-outline-secondary.active:focus, +.btn-outline-secondary.dropdown-toggle.show:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(195, 189, 189, 0.5); + box-shadow: 0 0 0 0.25rem rgba(195, 189, 189, 0.5); +} +.btn-outline-secondary:disabled, +.btn-outline-secondary.disabled { + color: #c3bdbd; + background-color: transparent; +} + +.btn-outline-success { + color: #1bcfb4; + border-color: #1bcfb4; +} +.btn-outline-success:hover { + color: #000; + background-color: #1bcfb4; + border-color: #1bcfb4; +} +.btn-check:focus + .btn-outline-success, +.btn-outline-success:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(27, 207, 180, 0.5); + box-shadow: 0 0 0 0.25rem rgba(27, 207, 180, 0.5); +} +.btn-check:checked + .btn-outline-success, +.btn-check:active + .btn-outline-success, +.btn-outline-success:active, +.btn-outline-success.active, +.btn-outline-success.dropdown-toggle.show { + color: #000; + background-color: #1bcfb4; + border-color: #1bcfb4; +} +.btn-check:checked + .btn-outline-success:focus, +.btn-check:active + .btn-outline-success:focus, +.btn-outline-success:active:focus, +.btn-outline-success.active:focus, +.btn-outline-success.dropdown-toggle.show:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(27, 207, 180, 0.5); + box-shadow: 0 0 0 0.25rem rgba(27, 207, 180, 0.5); +} +.btn-outline-success:disabled, +.btn-outline-success.disabled { + color: #1bcfb4; + background-color: transparent; +} + +.btn-outline-info { + color: #198ae3; + border-color: #198ae3; +} +.btn-outline-info:hover { + color: #000; + background-color: #198ae3; + border-color: #198ae3; +} +.btn-check:focus + .btn-outline-info, +.btn-outline-info:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(25, 138, 227, 0.5); + box-shadow: 0 0 0 0.25rem rgba(25, 138, 227, 0.5); +} +.btn-check:checked + .btn-outline-info, +.btn-check:active + .btn-outline-info, +.btn-outline-info:active, +.btn-outline-info.active, +.btn-outline-info.dropdown-toggle.show { + color: #000; + background-color: #198ae3; + border-color: #198ae3; +} +.btn-check:checked + .btn-outline-info:focus, +.btn-check:active + .btn-outline-info:focus, +.btn-outline-info:active:focus, +.btn-outline-info.active:focus, +.btn-outline-info.dropdown-toggle.show:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(25, 138, 227, 0.5); + box-shadow: 0 0 0 0.25rem rgba(25, 138, 227, 0.5); +} +.btn-outline-info:disabled, +.btn-outline-info.disabled { + color: #198ae3; + background-color: transparent; +} + +.btn-outline-warning { + color: #fed713; + border-color: #fed713; +} +.btn-outline-warning:hover { + color: #000; + background-color: #fed713; + border-color: #fed713; +} +.btn-check:focus + .btn-outline-warning, +.btn-outline-warning:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(254, 215, 19, 0.5); + box-shadow: 0 0 0 0.25rem rgba(254, 215, 19, 0.5); +} +.btn-check:checked + .btn-outline-warning, +.btn-check:active + .btn-outline-warning, +.btn-outline-warning:active, +.btn-outline-warning.active, +.btn-outline-warning.dropdown-toggle.show { + color: #000; + background-color: #fed713; + border-color: #fed713; +} +.btn-check:checked + .btn-outline-warning:focus, +.btn-check:active + .btn-outline-warning:focus, +.btn-outline-warning:active:focus, +.btn-outline-warning.active:focus, +.btn-outline-warning.dropdown-toggle.show:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(254, 215, 19, 0.5); + box-shadow: 0 0 0 0.25rem rgba(254, 215, 19, 0.5); +} +.btn-outline-warning:disabled, +.btn-outline-warning.disabled { + color: #fed713; + background-color: transparent; +} + +.btn-outline-danger { + color: #fe7c96; + border-color: #fe7c96; +} +.btn-outline-danger:hover { + color: #000; + background-color: #fe7c96; + border-color: #fe7c96; +} +.btn-check:focus + .btn-outline-danger, +.btn-outline-danger:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(254, 124, 150, 0.5); + box-shadow: 0 0 0 0.25rem rgba(254, 124, 150, 0.5); +} +.btn-check:checked + .btn-outline-danger, +.btn-check:active + .btn-outline-danger, +.btn-outline-danger:active, +.btn-outline-danger.active, +.btn-outline-danger.dropdown-toggle.show { + color: #000; + background-color: #fe7c96; + border-color: #fe7c96; +} +.btn-check:checked + .btn-outline-danger:focus, +.btn-check:active + .btn-outline-danger:focus, +.btn-outline-danger:active:focus, +.btn-outline-danger.active:focus, +.btn-outline-danger.dropdown-toggle.show:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(254, 124, 150, 0.5); + box-shadow: 0 0 0 0.25rem rgba(254, 124, 150, 0.5); +} +.btn-outline-danger:disabled, +.btn-outline-danger.disabled { + color: #fe7c96; + background-color: transparent; +} + +.btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-outline-light:hover { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-check:focus + .btn-outline-light, +.btn-outline-light:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); +} +.btn-check:checked + .btn-outline-light, +.btn-check:active + .btn-outline-light, +.btn-outline-light:active, +.btn-outline-light.active, +.btn-outline-light.dropdown-toggle.show { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-check:checked + .btn-outline-light:focus, +.btn-check:active + .btn-outline-light:focus, +.btn-outline-light:active:focus, +.btn-outline-light.active:focus, +.btn-outline-light.dropdown-toggle.show:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); +} +.btn-outline-light:disabled, +.btn-outline-light.disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-dark { + color: #3e4b5b; + border-color: #3e4b5b; +} +.btn-outline-dark:hover { + color: #fff; + background-color: #3e4b5b; + border-color: #3e4b5b; +} +.btn-check:focus + .btn-outline-dark, +.btn-outline-dark:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(62, 75, 91, 0.5); + box-shadow: 0 0 0 0.25rem rgba(62, 75, 91, 0.5); +} +.btn-check:checked + .btn-outline-dark, +.btn-check:active + .btn-outline-dark, +.btn-outline-dark:active, +.btn-outline-dark.active, +.btn-outline-dark.dropdown-toggle.show { + color: #fff; + background-color: #3e4b5b; + border-color: #3e4b5b; +} +.btn-check:checked + .btn-outline-dark:focus, +.btn-check:active + .btn-outline-dark:focus, +.btn-outline-dark:active:focus, +.btn-outline-dark.active:focus, +.btn-outline-dark.dropdown-toggle.show:focus { + -webkit-box-shadow: 0 0 0 0.25rem rgba(62, 75, 91, 0.5); + box-shadow: 0 0 0 0.25rem rgba(62, 75, 91, 0.5); +} +.btn-outline-dark:disabled, +.btn-outline-dark.disabled { + color: #3e4b5b; + background-color: transparent; +} + +.btn-link { + font-weight: 400; + color: #0d6efd; + text-decoration: underline; +} +.btn-link:hover { + color: #0a58ca; +} +.btn-link:disabled, +.btn-link.disabled { + color: #6c757d; +} + +.btn-lg, +.btn-group-lg > .btn { + padding: 1rem 3rem; + font-size: 0.875rem; + border-radius: 0.1875rem; +} + +.btn-sm, +.btn-group-sm > .btn { + padding: 0.5rem 0.81rem; + font-size: 0.875rem; + border-radius: 0.1875rem; +} + +.fade { + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +@media (prefers-reduced-motion: reduce) { + .fade { + -webkit-transition: none; + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + transition: height 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + -webkit-transition: none; + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + -webkit-transition: width 0.35s ease; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + -webkit-transition: none; + transition: none; + } +} + +.dropup, +.dropend, +.dropdown, +.dropstart { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + z-index: 1000; + display: none; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ebedf2; + border-radius: 0.25rem; +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: 0.125rem; +} + +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; +} + +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } +} + +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } +} + +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } +} + +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } +} + +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } +} + +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} + +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} + +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropend .dropdown-toggle::after { + vertical-align: 0; +} + +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} + +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} + +.dropstart .dropdown-toggle::after { + display: none; +} + +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} + +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #ebedf2; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1rem; + clear: both; + font-weight: 400; + color: #343a40; + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:hover, +.dropdown-item:focus { + color: #1e2125; + background-color: #e9ecef; +} +.dropdown-item.active, +.dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #0d6efd; +} +.dropdown-item.disabled, +.dropdown-item:disabled { + color: #adb5bd; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #343a40; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1rem; + color: #343a40; +} + +.dropdown-menu-dark { + color: #dee2e6; + background-color: #343a40; + border-color: rgba(0, 0, 0, 0.15); +} +.dropdown-menu-dark .dropdown-item { + color: #dee2e6; +} +.dropdown-menu-dark .dropdown-item:hover, +.dropdown-menu-dark .dropdown-item:focus { + color: #fff; + background-color: rgba(255, 255, 255, 0.15); +} +.dropdown-menu-dark .dropdown-item.active, +.dropdown-menu-dark .dropdown-item:active { + color: #fff; + background-color: #0d6efd; +} +.dropdown-menu-dark .dropdown-item.disabled, +.dropdown-menu-dark .dropdown-item:disabled { + color: #adb5bd; +} +.dropdown-menu-dark .dropdown-divider { + border-color: rgba(0, 0, 0, 0.15); +} +.dropdown-menu-dark .dropdown-item-text { + color: #dee2e6; +} +.dropdown-menu-dark .dropdown-header { + color: #adb5bd; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} + +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn:nth-child(n + 3), +.btn-group > :not(.btn-check) + .btn, +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 1.875rem; + padding-left: 1.875rem; +} +.dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after, +.dropend .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, +.btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.6075rem; + padding-left: 0.6075rem; +} + +.btn-lg + .dropdown-toggle-split, +.btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 2.25rem; + padding-left: 2.25rem; +} + +.btn-group-vertical { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn ~ .btn, +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; + color: #0d6efd; + text-decoration: none; + -webkit-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + -webkit-transition: none; + transition: none; + } +} +.nav-link:hover, +.nav-link:focus { + color: #0a58ca; +} +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #ebedf2; +} +.nav-tabs .nav-link { + margin-bottom: -1px; + background: none; + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.nav-tabs .nav-link:hover, +.nav-tabs .nav-link:focus { + border-color: #ebedf2 #ebedf2 #ebedf2; + isolation: isolate; +} +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #343a40; + background-color: #ffffff; + border-color: #ebedf2 #ebedf2 #ffffff; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + background: none; + border: 0; + border-radius: 0.25rem; +} + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #0d6efd; +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + text-align: center; +} + +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-sm, +.navbar > .container-md, +.navbar > .container-lg, +.navbar > .container-xl, +.navbar > .container-xxl { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: inherit; + flex-wrap: inherit; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.navbar-brand { + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + text-decoration: none; + white-space: nowrap; +} + +.navbar-nav { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} +.navbar-nav .dropdown-menu { + position: static; +} + +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + -ms-flex-preferred-size: 100%; + flex-basis: 100%; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; + -webkit-transition: -webkit-box-shadow 0.15s ease-in-out; + transition: -webkit-box-shadow 0.15s ease-in-out; + transition: box-shadow 0.15s ease-in-out; + transition: box-shadow 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + -webkit-transition: none; + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + -webkit-box-shadow: 0 0 0 0.25rem; + box-shadow: 0 0 0 0.25rem; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} + +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} + +@media (min-width: 576px) { + .navbar-expand-sm { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + -webkit-transition: none; + transition: none; + -webkit-transform: none; + transform: none; + } + .navbar-expand-sm .offcanvas-top, + .navbar-expand-sm .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-sm .offcanvas-body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + -webkit-transition: none; + transition: none; + -webkit-transform: none; + transform: none; + } + .navbar-expand-md .offcanvas-top, + .navbar-expand-md .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-md .offcanvas-body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + -webkit-transition: none; + transition: none; + -webkit-transform: none; + transform: none; + } + .navbar-expand-lg .offcanvas-top, + .navbar-expand-lg .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-lg .offcanvas-body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} + +@media (min-width: 1200px) { + .navbar-expand-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + -webkit-transition: none; + transition: none; + -webkit-transform: none; + transform: none; + } + .navbar-expand-xl .offcanvas-top, + .navbar-expand-xl .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-xl .offcanvas-body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} + +@media (min-width: 1400px) { + .navbar-expand-xxl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + -webkit-transition: none; + transition: none; + -webkit-transform: none; + transform: none; + } + .navbar-expand-xxl .offcanvas-top, + .navbar-expand-xxl .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-xxl .offcanvas-body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} + +.navbar-expand { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + -webkit-transition: none; + transition: none; + -webkit-transform: none; + transform: none; +} +.navbar-expand .offcanvas-top, +.navbar-expand .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; +} +.navbar-expand .offcanvas-body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-brand:hover, +.navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.55); +} +.navbar-light .navbar-nav .nav-link:hover, +.navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.55); + border-color: rgba(0, 0, 0, 0.1); +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.55); +} +.navbar-light .navbar-text a, +.navbar-light .navbar-text a:hover, +.navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #fff; +} +.navbar-dark .navbar-brand:hover, +.navbar-dark .navbar-brand:focus { + color: #fff; +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.55); +} +.navbar-dark .navbar-nav .nav-link:hover, +.navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.55); + border-color: rgba(255, 255, 255, 0.1); +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.55); +} +.navbar-dark .navbar-text a, +.navbar-dark .navbar-text a:hover, +.navbar-dark .navbar-text a:focus { + color: #fff; +} + +.card { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.3125rem; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1rem 1rem; +} + +.card-title { + margin-bottom: 0.5rem; +} + +.card-subtitle { + margin-top: -0.25rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link + .card-link { + margin-left: 1rem; +} + +.card-header { + padding: 0.5rem 1rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} + +.card-footer { + padding: 0.5rem 1rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.5rem; + margin-bottom: -0.5rem; + margin-left: -0.5rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.5rem; + margin-left: -0.5rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1rem; + border-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-group > .card { + margin-bottom: 0.75rem; +} + +@media (min-width: 576px) { + .card-group { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + } + .card-group > .card { + -webkit-box-flex: 1; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.accordion-button { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: 100%; + padding: 1rem 1.25rem; + font-size: 1rem; + color: #212529; + text-align: left; + background-color: #fff; + border: 0; + border-radius: 0; + overflow-anchor: none; + -webkit-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + border-radius 0.15s ease, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, border-radius 0.15s ease, + -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, + border-radius 0.15s ease; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, + border-radius 0.15s ease, -webkit-box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + -webkit-transition: none; + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: #0c63e4; + background-color: #e7f1ff; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125); +} +.accordion-button:not(.collapsed)::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + -webkit-transform: rotate(-180deg); + transform: rotate(-180deg); +} +.accordion-button::after { + -ms-flex-negative: 0; + flex-shrink: 0; + width: 1.25rem; + height: 1.25rem; + margin-left: auto; + content: ""; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-size: 1.25rem; + -webkit-transition: -webkit-transform 0.2s ease-in-out; + transition: -webkit-transform 0.2s ease-in-out; + transition: transform 0.2s ease-in-out; + transition: transform 0.2s ease-in-out, -webkit-transform 0.2s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + -webkit-transition: none; + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: #86b7fe; + outline: 0; + -webkit-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.accordion-item:first-of-type { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.accordion-body { + padding: 1rem 1.25rem; +} + +.accordion-flush .accordion-collapse { + border-width: 0; +} + +.accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.accordion-flush .accordion-item:first-child { + border-top: 0; +} +.accordion-flush .accordion-item:last-child { + border-bottom: 0; +} +.accordion-flush .accordion-item .accordion-button { + border-radius: 0; +} + +.breadcrumb { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding: 0.56rem 1.13rem; + margin-bottom: 1rem; + font-size: 0.875rem; + list-style: none; + background-color: transparent; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: 0.5rem; + color: #6c757d; + content: var(--bs-breadcrumb-divider, "/") + /* rtl: var(--bs-breadcrumb-divider, "/") */; +} + +.breadcrumb-item.active { + color: #495057; +} + +.pagination { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding-left: 0; + list-style: none; +} + +.page-link { + position: relative; + display: block; + color: #0d6efd; + text-decoration: none; + background-color: #fff; + border: 1px solid #dee2e6; + -webkit-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, + -webkit-box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + -webkit-transition: none; + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: #0a58ca; + background-color: #e9ecef; + border-color: #dee2e6; +} +.page-link:focus { + z-index: 3; + color: #0a58ca; + background-color: #e9ecef; + outline: 0; + -webkit-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} + +.page-item:not(:first-child) .page-link { + margin-left: -1px; +} + +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} + +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + background-color: #fff; + border-color: #dee2e6; +} + +.page-link { + padding: 0.375rem 0.75rem; +} + +.page-item:first-child .page-link { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.35em 0.65em; + font-size: 0.75em; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; +} +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.alert { + position: relative; + padding: 1rem 1rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} + +.alert-primary { + color: #6d4199; + background-color: #f0e2ff; + border-color: #e9d3ff; +} +.alert-primary .alert-link { + color: #57347a; +} + +.alert-secondary { + color: #4e4c4c; + background-color: #f3f2f2; + border-color: #edebeb; +} +.alert-secondary .alert-link { + color: #3e3d3d; +} + +.alert-success { + color: #0b5348; + background-color: #d1f5f0; + border-color: #bbf1e9; +} +.alert-success .alert-link { + color: #09423a; +} + +.alert-info { + color: #0f5388; + background-color: #d1e8f9; + border-color: #badcf7; +} +.alert-info .alert-link { + color: #0c426d; +} + +.alert-warning { + color: #665608; + background-color: #fff7d0; + border-color: #fff3b8; +} +.alert-warning .alert-link { + color: #524506; +} + +.alert-danger { + color: #984a5a; + background-color: #ffe5ea; + border-color: #ffd8e0; +} +.alert-danger .alert-link { + color: #7a3b48; +} + +.alert-light { + color: #636464; + background-color: #fefefe; + border-color: #fdfdfe; +} +.alert-light .alert-link { + color: #4f5050; +} + +.alert-dark { + color: #252d37; + background-color: #d8dbde; + border-color: #c5c9ce; +} +.alert-dark .alert-link { + color: #1e242c; +} + +@-webkit-keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} + +.progress { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.progress-bar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #0d6efd; + -webkit-transition: width 0.6s ease; + transition: width 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + -webkit-transition: none; + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient( + 45deg, + rgba(255, 255, 255, 0.15) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.15) 50%, + rgba(255, 255, 255, 0.15) 75%, + transparent 75%, + transparent + ); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + -webkit-animation: 1s linear infinite progress-bar-stripes; + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none; + } +} + +.list-group { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: 0.25rem; +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > li::before { + content: counters(section, ".") ". "; + counter-increment: section; +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; +} +.list-group-item-action:hover, +.list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; +} +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.5rem 1rem; + color: #212529; + text-decoration: none; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, +.list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; +} +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px; +} + +.list-group-horizontal { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 768px) { + .list-group-horizontal-md { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 992px) { + .list-group-horizontal-lg { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 1px; +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + color: #6d4199; + background-color: #f0e2ff; +} +.list-group-item-primary.list-group-item-action:hover, +.list-group-item-primary.list-group-item-action:focus { + color: #6d4199; + background-color: #d8cbe6; +} +.list-group-item-primary.list-group-item-action.active { + color: #ffffff; + background-color: #6d4199; + border-color: #6d4199; +} + +.list-group-item-secondary { + color: #4e4c4c; + background-color: #f3f2f2; +} +.list-group-item-secondary.list-group-item-action:hover, +.list-group-item-secondary.list-group-item-action:focus { + color: #4e4c4c; + background-color: #dbdada; +} +.list-group-item-secondary.list-group-item-action.active { + color: #ffffff; + background-color: #4e4c4c; + border-color: #4e4c4c; +} + +.list-group-item-success { + color: #0b5348; + background-color: #d1f5f0; +} +.list-group-item-success.list-group-item-action:hover, +.list-group-item-success.list-group-item-action:focus { + color: #0b5348; + background-color: #bcddd8; +} +.list-group-item-success.list-group-item-action.active { + color: #ffffff; + background-color: #0b5348; + border-color: #0b5348; +} + +.list-group-item-info { + color: #0f5388; + background-color: #d1e8f9; +} +.list-group-item-info.list-group-item-action:hover, +.list-group-item-info.list-group-item-action:focus { + color: #0f5388; + background-color: #bcd1e0; +} +.list-group-item-info.list-group-item-action.active { + color: #ffffff; + background-color: #0f5388; + border-color: #0f5388; +} + +.list-group-item-warning { + color: #665608; + background-color: #fff7d0; +} +.list-group-item-warning.list-group-item-action:hover, +.list-group-item-warning.list-group-item-action:focus { + color: #665608; + background-color: #e6debb; +} +.list-group-item-warning.list-group-item-action.active { + color: #ffffff; + background-color: #665608; + border-color: #665608; +} + +.list-group-item-danger { + color: #984a5a; + background-color: #ffe5ea; +} +.list-group-item-danger.list-group-item-action:hover, +.list-group-item-danger.list-group-item-action:focus { + color: #984a5a; + background-color: #e6ced3; +} +.list-group-item-danger.list-group-item-action.active { + color: #ffffff; + background-color: #984a5a; + border-color: #984a5a; +} + +.list-group-item-light { + color: #636464; + background-color: #fefefe; +} +.list-group-item-light.list-group-item-action:hover, +.list-group-item-light.list-group-item-action:focus { + color: #636464; + background-color: #e5e5e5; +} +.list-group-item-light.list-group-item-action.active { + color: #ffffff; + background-color: #636464; + border-color: #636464; +} + +.list-group-item-dark { + color: #252d37; + background-color: #d8dbde; +} +.list-group-item-dark.list-group-item-action:hover, +.list-group-item-dark.list-group-item-action:focus { + color: #252d37; + background-color: #c2c5c8; +} +.list-group-item-dark.list-group-item-action.active { + color: #ffffff; + background-color: #252d37; + border-color: #252d37; +} + +.btn-close { + -webkit-box-sizing: content-box; + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: #000; + background: transparent + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") + center/1em auto no-repeat; + border: 0; + border-radius: 0.25rem; + opacity: 0.5; +} +.btn-close:hover { + color: #000; + text-decoration: none; + opacity: 0.75; +} +.btn-close:focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + opacity: 1; +} +.btn-close:disabled, +.btn-close.disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + opacity: 0.25; +} + +.btn-close-white { + -webkit-filter: invert(1) grayscale(100%) brightness(200%); + filter: invert(1) grayscale(100%) brightness(200%); +} + +.toast { + width: 350px; + max-width: 100%; + font-size: 0.875rem; + pointer-events: auto; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + -webkit-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} + +.toast-container { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: 0.75rem; +} + +.toast-header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 0.5rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.toast-header .btn-close { + margin-right: -0.375rem; + margin-left: 0.75rem; +} + +.toast-body { + padding: 0.75rem; + word-wrap: break-word; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1055; + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 10px; + pointer-events: none; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform 0.4s ease; + transition: -webkit-transform 0.4s ease; + transition: transform 0.4s ease; + transition: transform 0.4s ease, -webkit-transform 0.4s ease; + -webkit-transform: translate(0, -50px); + transform: translate(0, -50px); +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + -webkit-transition: none; + transition: none; + } +} +.modal.show .modal-dialog { + -webkit-transform: none; + transform: none; +} +.modal.modal-static .modal-dialog { + -webkit-transform: scale(1.02); + transform: scale(1.02); +} + +.modal-dialog-scrollable { + height: calc(100% - 20px); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + min-height: calc(100% - 20px); +} + +.modal-content { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #f2edf3; + background-clip: padding-box; + border: 1px solid #ebedf2; + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + width: 100vw; + height: 100vh; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #ebedf2; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.modal-header .btn-close { + padding: 12.5px 13px; + margin: -12.5px -13px -12.5px auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 0.9375rem; +} + +.modal-footer { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 0.6875rem; + border-top: 1px solid #ebedf2; + border-bottom-right-radius: calc(0.3rem - 1px); + border-bottom-left-radius: calc(0.3rem - 1px); +} +.modal-footer > * { + margin: 0.25rem; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 30px auto; + } + .modal-dialog-scrollable { + height: calc(100% - 60px); + } + .modal-dialog-centered { + min-height: calc(100% - 60px); + } + .modal-sm { + max-width: 300px; + } +} + +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + max-width: 90%; + } +} + +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} + +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; +} +.modal-fullscreen .modal-header { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} +.modal-fullscreen .modal-footer { + border-radius: 0; +} + +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0; + } +} + +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-md-down .modal-footer { + border-radius: 0; + } +} + +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0; + } +} + +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0; + } +} + +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0; + } +} + +.tooltip { + position: absolute; + z-index: 1080; + display: block; + margin: 0; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.75rem; + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: 0.9; +} +.tooltip .tooltip-arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, +.bs-tooltip-auto[data-popper-placement^="top"] { + padding: 0.4rem 0; +} +.bs-tooltip-top .tooltip-arrow, +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow { + bottom: 0; +} +.bs-tooltip-top .tooltip-arrow::before, +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before { + top: -1px; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-end, +.bs-tooltip-auto[data-popper-placement^="right"] { + padding: 0 0.4rem; +} +.bs-tooltip-end .tooltip-arrow, +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-end .tooltip-arrow::before, +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before { + right: -1px; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, +.bs-tooltip-auto[data-popper-placement^="bottom"] { + padding: 0.4rem 0; +} +.bs-tooltip-bottom .tooltip-arrow, +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow { + top: 0; +} +.bs-tooltip-bottom .tooltip-arrow::before, +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before { + bottom: -1px; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-start, +.bs-tooltip-auto[data-popper-placement^="left"] { + padding: 0 0.4rem; +} +.bs-tooltip-start .tooltip-arrow, +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-start .tooltip-arrow::before, +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before { + left: -1px; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.4rem 0.75rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.375rem; +} + +.popover { + position: absolute; + top: 0; + left: 0 /* rtl:ignore */; + z-index: 1070; + display: block; + max-width: 276px; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} +.popover .popover-arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; +} +.popover .popover-arrow::before, +.popover .popover-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top > .popover-arrow, +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow { + bottom: calc(-0.5rem - 1px); +} +.bs-popover-top > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-top > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; +} + +.bs-popover-end > .popover-arrow, +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow { + left: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; +} +.bs-popover-end > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-end > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; +} + +.bs-popover-bottom > .popover-arrow, +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow { + top: calc(-0.5rem - 1px); +} +.bs-popover-bottom > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-bottom > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; +} + +.bs-popover-bottom .popover-header::before, +.bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f0f0f0; +} + +.bs-popover-start > .popover-arrow, +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow { + right: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; +} +.bs-popover-start > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-start > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; +} + +.popover-header { + padding: 0.5rem 1rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f0f0f0; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 1rem 1rem; + color: #212529; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + -ms-touch-action: pan-y; + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transition: -webkit-transform 0.6s ease-in-out; + transition: -webkit-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .carousel-item { + -webkit-transition: none; + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +/* rtl:begin:ignore */ +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + -webkit-transform: translateX(100%); + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); +} + +/* rtl:end:ignore */ +.carousel-fade .carousel-item { + opacity: 0; + -webkit-transition-property: opacity; + transition-property: opacity; + -webkit-transform: none; + transform: none; +} + +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-start, +.carousel-fade .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; +} + +.carousel-fade .active.carousel-item-start, +.carousel-fade .active.carousel-item-end { + z-index: 0; + opacity: 0; + -webkit-transition: opacity 0s 0.6s; + transition: opacity 0s 0.6s; +} +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-start, + .carousel-fade .active.carousel-item-end { + -webkit-transition: none; + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: none; + border: 0; + opacity: 0.5; + -webkit-transition: opacity 0.15s ease; + transition: opacity 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + -webkit-transition: none; + transition: none; + } +} +.carousel-control-prev:hover, +.carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +/* rtl:options: { + "autoRename": true, + "stringMap":[ { + "name" : "prev-next", + "search" : "prev", + "replace" : "next" + } ] +} */ +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; + list-style: none; +} +.carousel-indicators [data-bs-target] { + -webkit-box-sizing: content-box; + box-sizing: content-box; + -webkit-box-flex: 0; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + -webkit-transition: opacity 0.6s ease; + transition: opacity 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + -webkit-transition: none; + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center; +} + +.carousel-dark .carousel-control-prev-icon, +.carousel-dark .carousel-control-next-icon { + -webkit-filter: invert(1) grayscale(100); + filter: invert(1) grayscale(100); +} + +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; +} + +.carousel-dark .carousel-caption { + color: #000; +} + +@-webkit-keyframes spinner-border { + to { + -webkit-transform: rotate(360deg) /* rtl:ignore */; + transform: rotate(360deg) /* rtl:ignore */; + } +} + +@keyframes spinner-border { + to { + -webkit-transform: rotate(360deg) /* rtl:ignore */; + transform: rotate(360deg) /* rtl:ignore */; + } +} + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: 0.75s linear infinite spinner-border; + animation: 0.75s linear infinite spinner-border; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@-webkit-keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: 0.75s linear infinite spinner-grow; + animation: 0.75s linear infinite spinner-grow; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s; + } +} + +.offcanvas { + position: fixed; + bottom: 0; + z-index: 1045; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + max-width: 100%; + visibility: hidden; + background-color: #fff; + background-clip: padding-box; + outline: 0; + -webkit-transition: -webkit-transform 0.3s ease-in-out; + transition: -webkit-transform 0.3s ease-in-out; + transition: transform 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + -webkit-transition: none; + transition: none; + } +} + +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.offcanvas-backdrop.fade { + opacity: 0; +} +.offcanvas-backdrop.show { + opacity: 0.5; +} + +.offcanvas-header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 1rem 1rem; +} +.offcanvas-header .btn-close { + padding: 0.5rem 0.5rem; + margin-top: -0.5rem; + margin-right: -0.5rem; + margin-bottom: -0.5rem; +} + +.offcanvas-title { + margin-bottom: 0; + line-height: 1.5; +} + +.offcanvas-body { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + padding: 1rem 1rem; + overflow-y: auto; +} + +.offcanvas-start { + top: 0; + left: 0; + width: 400px; + border-right: 1px solid rgba(0, 0, 0, 0.2); + -webkit-transform: translateX(-100%); + transform: translateX(-100%); +} + +.offcanvas-end { + top: 0; + right: 0; + width: 400px; + border-left: 1px solid rgba(0, 0, 0, 0.2); + -webkit-transform: translateX(100%); + transform: translateX(100%); +} + +.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + -webkit-transform: translateY(-100%); + transform: translateY(-100%); +} + +.offcanvas-bottom { + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-top: 1px solid rgba(0, 0, 0, 0.2); + -webkit-transform: translateY(100%); + transform: translateY(100%); +} + +.offcanvas.show { + -webkit-transform: none; + transform: none; +} + +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentColor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} + +.placeholder-xs { + min-height: 0.6em; +} + +.placeholder-sm { + min-height: 0.8em; +} + +.placeholder-lg { + min-height: 1.2em; +} + +.placeholder-glow .placeholder { + -webkit-animation: placeholder-glow 2s ease-in-out infinite; + animation: placeholder-glow 2s ease-in-out infinite; +} + +@-webkit-keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} + +@keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} + +.placeholder-wave { + -webkit-mask-image: linear-gradient( + 130deg, + #000000 55%, + rgba(0, 0, 0, 0.8) 75%, + #000000 95% + ); + mask-image: linear-gradient( + 130deg, + #000000 55%, + rgba(0, 0, 0, 0.8) 75%, + #000000 95% + ); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + -webkit-animation: placeholder-wave 2s linear infinite; + animation: placeholder-wave 2s linear infinite; +} + +@-webkit-keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} + +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.link-primary { + color: #6bc1f3; +} +.link-primary:hover, +.link-primary:focus { + color: #c58aff; +} + +.link-secondary { + color: #c3bdbd; +} +.link-secondary:hover, +.link-secondary:focus { + color: #cfcaca; +} + +.link-success { + color: #1bcfb4; +} +.link-success:hover, +.link-success:focus { + color: #49d9c3; +} + +.link-info { + color: #198ae3; +} +.link-info:hover, +.link-info:focus { + color: #47a1e9; +} + +.link-warning { + color: #fed713; +} +.link-warning:hover, +.link-warning:focus { + color: #fedf42; +} + +.link-danger { + color: #fe7c96; +} +.link-danger:hover, +.link-danger:focus { + color: #fe96ab; +} + +.link-light { + color: #f8f9fa; +} +.link-light:hover, +.link-light:focus { + color: #f9fafb; +} + +.link-dark { + color: #3e4b5b; +} +.link-dark:hover, +.link-dark:focus { + color: #323c49; +} + +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} + +.ratio-4x3 { + --bs-aspect-ratio: calc(3 / 4 * 100%); +} + +.ratio-16x9 { + --bs-aspect-ratio: calc(9 / 16 * 100%); +} + +.ratio-21x9 { + --bs-aspect-ratio: calc(9 / 21 * 100%); +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +.sticky-top { + position: sticky; + top: 0; + z-index: 1020; +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: sticky; + top: 0; + z-index: 1020; + } +} + +@media (min-width: 768px) { + .sticky-md-top { + position: sticky; + top: 0; + z-index: 1020; + } +} + +@media (min-width: 992px) { + .sticky-lg-top { + position: sticky; + top: 0; + z-index: 1020; + } +} + +@media (min-width: 1200px) { + .sticky-xl-top { + position: sticky; + top: 0; + z-index: 1020; + } +} + +@media (min-width: 1400px) { + .sticky-xxl-top { + position: sticky; + top: 0; + z-index: 1020; + } +} + +.hstack { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -ms-flex-item-align: stretch; + align-self: stretch; +} + +.vstack { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-item-align: stretch; + align-self: stretch; +} + +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.vr { + display: inline-block; + -ms-flex-item-align: stretch; + align-self: stretch; + width: 1px; + min-height: 1em; + background-color: currentColor; + opacity: 0.25; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.float-start { + float: left !important; +} + +.float-end { + float: right !important; +} + +.float-none { + float: none !important; +} + +.opacity-0 { + opacity: 0 !important; +} + +.opacity-25 { + opacity: 0.25 !important; +} + +.opacity-50 { + opacity: 0.5 !important; +} + +.opacity-75 { + opacity: 0.75 !important; +} + +.opacity-100 { + opacity: 1 !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-visible { + overflow: visible !important; +} + +.overflow-scroll { + overflow: scroll !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-grid { + display: grid !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex, +.page-header, +.loader-demo-box, +.list-wrapper ul li, +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .dropdown-menu.navbar-dropdown + .dropdown-item, +.navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; +} + +.d-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; +} + +.d-none { + display: none !important; +} + +.shadow { + -webkit-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-sm { + -webkit-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow-lg { + -webkit-box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.top-0 { + top: 0 !important; +} + +.top-50 { + top: 50% !important; +} + +.top-100 { + top: 100% !important; +} + +.bottom-0 { + bottom: 0 !important; +} + +.bottom-50 { + bottom: 50% !important; +} + +.bottom-100 { + bottom: 100% !important; +} + +.start-0 { + left: 0 !important; +} + +.start-50 { + left: 50% !important; +} + +.start-100 { + left: 100% !important; +} + +.end-0 { + right: 0 !important; +} + +.end-50 { + right: 50% !important; +} + +.end-100 { + right: 100% !important; +} + +.translate-middle { + -webkit-transform: translate(-50%, -50%) !important; + transform: translate(-50%, -50%) !important; +} + +.translate-middle-x { + -webkit-transform: translateX(-50%) !important; + transform: translateX(-50%) !important; +} + +.translate-middle-y { + -webkit-transform: translateY(-50%) !important; + transform: translateY(-50%) !important; +} + +.border, +.loader-demo-box { + border: 1px solid #ebedf2 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top { + border-top: 1px solid #ebedf2 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-end { + border-right: 1px solid #ebedf2 !important; +} + +.border-end-0 { + border-right: 0 !important; +} + +.border-bottom { + border-bottom: 1px solid #ebedf2 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-start { + border-left: 1px solid #ebedf2 !important; +} + +.border-start-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #6bc1f3 !important; +} + +.border-secondary, +.loader-demo-box { + border-color: #c3bdbd !important; +} + +.border-success { + border-color: #1bcfb4 !important; +} + +.border-info { + border-color: #198ae3 !important; +} + +.border-warning { + border-color: #fed713 !important; +} + +.border-danger { + border-color: #fe7c96 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #3e4b5b !important; +} + +.border-white { + border-color: #ffffff !important; +} + +.border-1 { + border-width: 1px !important; +} + +.border-2 { + border-width: 2px !important; +} + +.border-3 { + border-width: 3px !important; +} + +.border-4 { + border-width: 4px !important; +} + +.border-5 { + border-width: 5px !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.vw-100 { + width: 100vw !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.vh-100 { + height: 100vh !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.flex-fill { + -webkit-box-flex: 1 !important; + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; +} + +.flex-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; +} + +.flex-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; +} + +.flex-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + -webkit-box-flex: 0 !important; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; +} + +.flex-grow-1 { + -webkit-box-flex: 1 !important; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; +} + +.flex-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; +} + +.flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; +} + +.flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; +} + +.gap-0 { + gap: 0 !important; +} + +.gap-1 { + gap: 0.25rem !important; +} + +.gap-2 { + gap: 0.5rem !important; +} + +.gap-3 { + gap: 1rem !important; +} + +.gap-4 { + gap: 1.5rem !important; +} + +.gap-5 { + gap: 3rem !important; +} + +.justify-content-start, +.list-wrapper ul li { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; +} + +.justify-content-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; +} + +.justify-content-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; +} + +.justify-content-between, +.page-header { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; +} + +.justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; +} + +.justify-content-evenly { + -webkit-box-pack: space-evenly !important; + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; +} + +.align-items-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; +} + +.align-items-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; +} + +.align-items-center, +.page-header, +.loader-demo-box, +.list-wrapper ul li, +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .dropdown-menu.navbar-dropdown + .dropdown-item { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; +} + +.align-items-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; +} + +.align-items-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; +} + +.align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; +} + +.align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; +} + +.align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important; +} + +.align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; +} + +.align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; +} + +.align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; +} + +.align-self-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; +} + +.align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; +} + +.align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; +} + +.align-self-center { + -ms-flex-item-align: center !important; + align-self: center !important; +} + +.align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; +} + +.align-self-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; +} + +.order-first { + -webkit-box-ordinal-group: 0 !important; + -ms-flex-order: -1 !important; + order: -1 !important; +} + +.order-0 { + -webkit-box-ordinal-group: 1 !important; + -ms-flex-order: 0 !important; + order: 0 !important; +} + +.order-1 { + -webkit-box-ordinal-group: 2 !important; + -ms-flex-order: 1 !important; + order: 1 !important; +} + +.order-2 { + -webkit-box-ordinal-group: 3 !important; + -ms-flex-order: 2 !important; + order: 2 !important; +} + +.order-3 { + -webkit-box-ordinal-group: 4 !important; + -ms-flex-order: 3 !important; + order: 3 !important; +} + +.order-4 { + -webkit-box-ordinal-group: 5 !important; + -ms-flex-order: 4 !important; + order: 4 !important; +} + +.order-5 { + -webkit-box-ordinal-group: 6 !important; + -ms-flex-order: 5 !important; + order: 5 !important; +} + +.order-last { + -webkit-box-ordinal-group: 7 !important; + -ms-flex-order: 6 !important; + order: 6 !important; +} + +.m-0 { + margin: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0, +.demo-modal .modal-dialog { + margin-top: 0 !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mt-2, +.template-demo > .btn-group, +.template-demo > .btn-group-vertical, +.template-demo .circle-progress { + margin-top: 0.5rem !important; +} + +.mt-3, +.template-demo > .btn, +.template-demo > .btn-toolbar { + margin-top: 1rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.me-0, +.rtl + .navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .dropdown-menu.navbar-dropdown + .dropdown-item + i { + margin-right: 0 !important; +} + +.me-1 { + margin-right: 0.25rem !important; +} + +.me-2, +.template-demo > .btn-group, +.template-demo > .btn-group-vertical, +.template-demo > .dropdown { + margin-right: 0.5rem !important; +} + +.me-3, +.template-demo > .btn, +.template-demo > .btn-toolbar { + margin-right: 1rem !important; +} + +.me-4, +.rtl .navbar .navbar-menu-wrapper .search-field { + margin-right: 1.5rem !important; +} + +.me-5 { + margin-right: 3rem !important; +} + +.me-auto, +.rtl .list-wrapper .remove { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.mb-3, +.template-demo .circle-progress-block { + margin-bottom: 1rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ms-0, +.rtl .preview-list .preview-item .preview-thumbnail .preview-icon i, +.rtl .list-wrapper .remove, +.rtl .navbar .navbar-menu-wrapper .search-field { + margin-left: 0 !important; +} + +.ms-1 { + margin-left: 0.25rem !important; +} + +.ms-2, +.btn-toolbar .btn-group + .btn-group { + margin-left: 0.5rem !important; +} + +.ms-3 { + margin-left: 1rem !important; +} + +.ms-4 { + margin-left: 1.5rem !important; +} + +.ms-5 { + margin-left: 3rem !important; +} + +.ms-auto, +.list-wrapper .remove { + margin-left: auto !important; +} + +.p-0 { + padding: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.px-2, +.template-demo .circle-progress-block { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.py-3, +.card-revenue-table .revenue-item { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-0, +.card-revenue-table .revenue-item:first-child { + padding-top: 0 !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.pe-1 { + padding-right: 0.25rem !important; +} + +.pe-2 { + padding-right: 0.5rem !important; +} + +.pe-3 { + padding-right: 1rem !important; +} + +.pe-4 { + padding-right: 1.5rem !important; +} + +.pe-5 { + padding-right: 3rem !important; +} + +.pb-0, +.card-revenue-table .revenue-item:last-child { + padding-bottom: 0 !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.ps-1 { + padding-left: 0.25rem !important; +} + +.ps-2 { + padding-left: 0.5rem !important; +} + +.ps-3 { + padding-left: 1rem !important; +} + +.ps-4 { + padding-left: 1.5rem !important; +} + +.ps-5 { + padding-left: 3rem !important; +} + +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} + +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} + +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} + +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} + +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} + +.fs-5 { + font-size: 1.25rem !important; +} + +.fs-6 { + font-size: 1rem !important; +} + +.fst-italic { + font-style: italic !important; +} + +.fst-normal { + font-style: normal !important; +} + +.fw-light { + font-weight: 300 !important; +} + +.fw-lighter { + font-weight: lighter !important; +} + +.fw-normal { + font-weight: 400 !important; +} + +.fw-bold { + font-weight: 700 !important; +} + +.fw-bolder { + font-weight: bolder !important; +} + +.lh-1 { + line-height: 1 !important; +} + +.lh-sm { + line-height: 1.25 !important; +} + +.lh-base { + line-height: 1.5 !important; +} + +.lh-lg { + line-height: 2 !important; +} + +.text-start { + text-align: left !important; +} + +.text-end { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-decoration-underline { + text-decoration: underline !important; +} + +.text-decoration-line-through { + text-decoration: line-through !important; +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +/* rtl:begin:remove */ +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} + +/* rtl:end:remove */ +.text-primary, +.list-wrapper .completed .remove { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} + +.text-secondary, +.list-wrapper .remove { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} + +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} + +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} + +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} + +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} + +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} + +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} + +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} + +.text-white, +.navbar.navbar-primary .navbar-menu-wrapper .nav-profile-text p, +.navbar.navbar-secondary .navbar-menu-wrapper .nav-profile-text p, +.navbar.navbar-success .navbar-menu-wrapper .nav-profile-text p, +.navbar.navbar-info .navbar-menu-wrapper .nav-profile-text p, +.navbar.navbar-warning .navbar-menu-wrapper .nav-profile-text p, +.navbar.navbar-danger .navbar-menu-wrapper .nav-profile-text p, +.navbar.navbar-light .navbar-menu-wrapper .nav-profile-text p, +.navbar.navbar-dark .navbar-menu-wrapper .nav-profile-text p { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} + +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} + +.text-muted, +.preview-list .preview-item .preview-item-content p .content-category { + --bs-text-opacity: 1; + color: #9c9fa6 !important; +} + +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} + +.text-opacity-25 { + --bs-text-opacity: 0.25; +} + +.text-opacity-50 { + --bs-text-opacity: 0.5; +} + +.text-opacity-75 { + --bs-text-opacity: 0.75; +} + +.text-opacity-100 { + --bs-text-opacity: 1; +} + +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-primary-rgb), + var(--bs-bg-opacity) + ) !important; +} + +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-secondary-rgb), + var(--bs-bg-opacity) + ) !important; +} + +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-success-rgb), + var(--bs-bg-opacity) + ) !important; +} + +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-warning-rgb), + var(--bs-bg-opacity) + ) !important; +} + +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-danger-rgb), + var(--bs-bg-opacity) + ) !important; +} + +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-light-rgb), + var(--bs-bg-opacity) + ) !important; +} + +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-black-rgb), + var(--bs-bg-opacity) + ) !important; +} + +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-white-rgb), + var(--bs-bg-opacity) + ) !important; +} + +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-body-bg-rgb), + var(--bs-bg-opacity) + ) !important; +} + +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} + +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} + +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} + +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} + +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} + +.bg-opacity-100 { + --bs-bg-opacity: 1; +} + +.bg-gradient { + background-image: var(--bs-gradient) !important; +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + -ms-user-select: all !important; + user-select: all !important; +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + -ms-user-select: auto !important; + user-select: auto !important; +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + -ms-user-select: none !important; + user-select: none !important; +} + +.pe-none { + pointer-events: none !important; +} + +.pe-auto { + pointer-events: auto !important; +} + +.rounded, +.loader-demo-box { + border-radius: 0.25rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.rounded-1 { + border-radius: 0.2rem !important; +} + +.rounded-2 { + border-radius: 0.25rem !important; +} + +.rounded-3 { + border-radius: 0.3rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-end { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-start { + border-bottom-left-radius: 0.25rem !important; + border-top-left-radius: 0.25rem !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + .float-sm-end { + float: right !important; + } + .float-sm-none { + float: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-grid { + display: grid !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } + .d-sm-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-sm-none { + display: none !important; + } + .flex-sm-fill { + -webkit-box-flex: 1 !important; + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-sm-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-sm-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-sm-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + -webkit-box-flex: 0 !important; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + -webkit-box-flex: 1 !important; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .justify-content-sm-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-sm-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-sm-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-sm-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .justify-content-sm-evenly { + -webkit-box-pack: space-evenly !important; + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; + } + .align-items-sm-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-sm-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-sm-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-sm-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-sm-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-sm-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-sm-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } + .order-sm-first { + -webkit-box-ordinal-group: 0 !important; + -ms-flex-order: -1 !important; + order: -1 !important; + } + .order-sm-0 { + -webkit-box-ordinal-group: 1 !important; + -ms-flex-order: 0 !important; + order: 0 !important; + } + .order-sm-1 { + -webkit-box-ordinal-group: 2 !important; + -ms-flex-order: 1 !important; + order: 1 !important; + } + .order-sm-2 { + -webkit-box-ordinal-group: 3 !important; + -ms-flex-order: 2 !important; + order: 2 !important; + } + .order-sm-3 { + -webkit-box-ordinal-group: 4 !important; + -ms-flex-order: 3 !important; + order: 3 !important; + } + .order-sm-4 { + -webkit-box-ordinal-group: 5 !important; + -ms-flex-order: 4 !important; + order: 4 !important; + } + .order-sm-5 { + -webkit-box-ordinal-group: 6 !important; + -ms-flex-order: 5 !important; + order: 5 !important; + } + .order-sm-last { + -webkit-box-ordinal-group: 7 !important; + -ms-flex-order: 6 !important; + order: 6 !important; + } + .m-sm-0 { + margin: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mt-sm-3 { + margin-top: 1rem !important; + } + .mt-sm-4 { + margin-top: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 3rem !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .me-sm-0 { + margin-right: 0 !important; + } + .me-sm-1 { + margin-right: 0.25rem !important; + } + .me-sm-2 { + margin-right: 0.5rem !important; + } + .me-sm-3 { + margin-right: 1rem !important; + } + .me-sm-4 { + margin-right: 1.5rem !important; + } + .me-sm-5 { + margin-right: 3rem !important; + } + .me-sm-auto { + margin-right: auto !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .mb-sm-3 { + margin-bottom: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 3rem !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ms-sm-0 { + margin-left: 0 !important; + } + .ms-sm-1 { + margin-left: 0.25rem !important; + } + .ms-sm-2 { + margin-left: 0.5rem !important; + } + .ms-sm-3 { + margin-left: 1rem !important; + } + .ms-sm-4 { + margin-left: 1.5rem !important; + } + .ms-sm-5 { + margin-left: 3rem !important; + } + .ms-sm-auto { + margin-left: auto !important; + } + .p-sm-0 { + padding: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pt-sm-3 { + padding-top: 1rem !important; + } + .pt-sm-4 { + padding-top: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 3rem !important; + } + .pe-sm-0 { + padding-right: 0 !important; + } + .pe-sm-1 { + padding-right: 0.25rem !important; + } + .pe-sm-2 { + padding-right: 0.5rem !important; + } + .pe-sm-3 { + padding-right: 1rem !important; + } + .pe-sm-4 { + padding-right: 1.5rem !important; + } + .pe-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pb-sm-3 { + padding-bottom: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 3rem !important; + } + .ps-sm-0 { + padding-left: 0 !important; + } + .ps-sm-1 { + padding-left: 0.25rem !important; + } + .ps-sm-2 { + padding-left: 0.5rem !important; + } + .ps-sm-3 { + padding-left: 1rem !important; + } + .ps-sm-4 { + padding-left: 1.5rem !important; + } + .ps-sm-5 { + padding-left: 3rem !important; + } + .text-sm-start { + text-align: left !important; + } + .text-sm-end { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} + +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + .float-md-end { + float: right !important; + } + .float-md-none { + float: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-grid { + display: grid !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } + .d-md-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-md-none { + display: none !important; + } + .flex-md-fill { + -webkit-box-flex: 1 !important; + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-md-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-md-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-md-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + -webkit-box-flex: 0 !important; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-md-grow-1 { + -webkit-box-flex: 1 !important; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .justify-content-md-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-md-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-md-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-md-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .justify-content-md-evenly { + -webkit-box-pack: space-evenly !important; + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; + } + .align-items-md-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-md-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-md-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-md-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-md-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-md-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-md-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-md-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } + .order-md-first { + -webkit-box-ordinal-group: 0 !important; + -ms-flex-order: -1 !important; + order: -1 !important; + } + .order-md-0 { + -webkit-box-ordinal-group: 1 !important; + -ms-flex-order: 0 !important; + order: 0 !important; + } + .order-md-1 { + -webkit-box-ordinal-group: 2 !important; + -ms-flex-order: 1 !important; + order: 1 !important; + } + .order-md-2 { + -webkit-box-ordinal-group: 3 !important; + -ms-flex-order: 2 !important; + order: 2 !important; + } + .order-md-3 { + -webkit-box-ordinal-group: 4 !important; + -ms-flex-order: 3 !important; + order: 3 !important; + } + .order-md-4 { + -webkit-box-ordinal-group: 5 !important; + -ms-flex-order: 4 !important; + order: 4 !important; + } + .order-md-5 { + -webkit-box-ordinal-group: 6 !important; + -ms-flex-order: 5 !important; + order: 5 !important; + } + .order-md-last { + -webkit-box-ordinal-group: 7 !important; + -ms-flex-order: 6 !important; + order: 6 !important; + } + .m-md-0 { + margin: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mt-md-3 { + margin-top: 1rem !important; + } + .mt-md-4 { + margin-top: 1.5rem !important; + } + .mt-md-5 { + margin-top: 3rem !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .me-md-0 { + margin-right: 0 !important; + } + .me-md-1 { + margin-right: 0.25rem !important; + } + .me-md-2 { + margin-right: 0.5rem !important; + } + .me-md-3 { + margin-right: 1rem !important; + } + .me-md-4 { + margin-right: 1.5rem !important; + } + .me-md-5 { + margin-right: 3rem !important; + } + .me-md-auto { + margin-right: auto !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .mb-md-3 { + margin-bottom: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 3rem !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ms-md-0 { + margin-left: 0 !important; + } + .ms-md-1 { + margin-left: 0.25rem !important; + } + .ms-md-2 { + margin-left: 0.5rem !important; + } + .ms-md-3 { + margin-left: 1rem !important; + } + .ms-md-4 { + margin-left: 1.5rem !important; + } + .ms-md-5 { + margin-left: 3rem !important; + } + .ms-md-auto { + margin-left: auto !important; + } + .p-md-0 { + padding: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pt-md-3 { + padding-top: 1rem !important; + } + .pt-md-4 { + padding-top: 1.5rem !important; + } + .pt-md-5 { + padding-top: 3rem !important; + } + .pe-md-0 { + padding-right: 0 !important; + } + .pe-md-1 { + padding-right: 0.25rem !important; + } + .pe-md-2 { + padding-right: 0.5rem !important; + } + .pe-md-3 { + padding-right: 1rem !important; + } + .pe-md-4 { + padding-right: 1.5rem !important; + } + .pe-md-5 { + padding-right: 3rem !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pb-md-3 { + padding-bottom: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 3rem !important; + } + .ps-md-0 { + padding-left: 0 !important; + } + .ps-md-1 { + padding-left: 0.25rem !important; + } + .ps-md-2 { + padding-left: 0.5rem !important; + } + .ps-md-3 { + padding-left: 1rem !important; + } + .ps-md-4 { + padding-left: 1.5rem !important; + } + .ps-md-5 { + padding-left: 3rem !important; + } + .text-md-start { + text-align: left !important; + } + .text-md-end { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} + +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + .float-lg-end { + float: right !important; + } + .float-lg-none { + float: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-grid { + display: grid !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } + .d-lg-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-lg-none { + display: none !important; + } + .flex-lg-fill { + -webkit-box-flex: 1 !important; + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-lg-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-lg-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-lg-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + -webkit-box-flex: 0 !important; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + -webkit-box-flex: 1 !important; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .justify-content-lg-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-lg-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-lg-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-lg-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .justify-content-lg-evenly { + -webkit-box-pack: space-evenly !important; + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; + } + .align-items-lg-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-lg-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-lg-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-lg-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-lg-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-lg-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-lg-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } + .order-lg-first { + -webkit-box-ordinal-group: 0 !important; + -ms-flex-order: -1 !important; + order: -1 !important; + } + .order-lg-0 { + -webkit-box-ordinal-group: 1 !important; + -ms-flex-order: 0 !important; + order: 0 !important; + } + .order-lg-1 { + -webkit-box-ordinal-group: 2 !important; + -ms-flex-order: 1 !important; + order: 1 !important; + } + .order-lg-2 { + -webkit-box-ordinal-group: 3 !important; + -ms-flex-order: 2 !important; + order: 2 !important; + } + .order-lg-3 { + -webkit-box-ordinal-group: 4 !important; + -ms-flex-order: 3 !important; + order: 3 !important; + } + .order-lg-4 { + -webkit-box-ordinal-group: 5 !important; + -ms-flex-order: 4 !important; + order: 4 !important; + } + .order-lg-5 { + -webkit-box-ordinal-group: 6 !important; + -ms-flex-order: 5 !important; + order: 5 !important; + } + .order-lg-last { + -webkit-box-ordinal-group: 7 !important; + -ms-flex-order: 6 !important; + order: 6 !important; + } + .m-lg-0 { + margin: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mt-lg-3 { + margin-top: 1rem !important; + } + .mt-lg-4 { + margin-top: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 3rem !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .me-lg-0 { + margin-right: 0 !important; + } + .me-lg-1 { + margin-right: 0.25rem !important; + } + .me-lg-2 { + margin-right: 0.5rem !important; + } + .me-lg-3 { + margin-right: 1rem !important; + } + .me-lg-4 { + margin-right: 1.5rem !important; + } + .me-lg-5 { + margin-right: 3rem !important; + } + .me-lg-auto { + margin-right: auto !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .mb-lg-3 { + margin-bottom: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 3rem !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ms-lg-0 { + margin-left: 0 !important; + } + .ms-lg-1 { + margin-left: 0.25rem !important; + } + .ms-lg-2 { + margin-left: 0.5rem !important; + } + .ms-lg-3 { + margin-left: 1rem !important; + } + .ms-lg-4 { + margin-left: 1.5rem !important; + } + .ms-lg-5 { + margin-left: 3rem !important; + } + .ms-lg-auto { + margin-left: auto !important; + } + .p-lg-0 { + padding: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pt-lg-3 { + padding-top: 1rem !important; + } + .pt-lg-4 { + padding-top: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 3rem !important; + } + .pe-lg-0 { + padding-right: 0 !important; + } + .pe-lg-1 { + padding-right: 0.25rem !important; + } + .pe-lg-2 { + padding-right: 0.5rem !important; + } + .pe-lg-3 { + padding-right: 1rem !important; + } + .pe-lg-4 { + padding-right: 1.5rem !important; + } + .pe-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pb-lg-3 { + padding-bottom: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 3rem !important; + } + .ps-lg-0 { + padding-left: 0 !important; + } + .ps-lg-1 { + padding-left: 0.25rem !important; + } + .ps-lg-2 { + padding-left: 0.5rem !important; + } + .ps-lg-3 { + padding-left: 1rem !important; + } + .ps-lg-4 { + padding-left: 1.5rem !important; + } + .ps-lg-5 { + padding-left: 3rem !important; + } + .text-lg-start { + text-align: left !important; + } + .text-lg-end { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} + +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + .float-xl-end { + float: right !important; + } + .float-xl-none { + float: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-grid { + display: grid !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } + .d-xl-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-xl-none { + display: none !important; + } + .flex-xl-fill { + -webkit-box-flex: 1 !important; + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-xl-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-xl-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-xl-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + -webkit-box-flex: 0 !important; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + -webkit-box-flex: 1 !important; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .justify-content-xl-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-xl-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-xl-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-xl-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .justify-content-xl-evenly { + -webkit-box-pack: space-evenly !important; + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; + } + .align-items-xl-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-xl-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-xl-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-xl-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-xl-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-xl-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-xl-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } + .order-xl-first { + -webkit-box-ordinal-group: 0 !important; + -ms-flex-order: -1 !important; + order: -1 !important; + } + .order-xl-0 { + -webkit-box-ordinal-group: 1 !important; + -ms-flex-order: 0 !important; + order: 0 !important; + } + .order-xl-1 { + -webkit-box-ordinal-group: 2 !important; + -ms-flex-order: 1 !important; + order: 1 !important; + } + .order-xl-2 { + -webkit-box-ordinal-group: 3 !important; + -ms-flex-order: 2 !important; + order: 2 !important; + } + .order-xl-3 { + -webkit-box-ordinal-group: 4 !important; + -ms-flex-order: 3 !important; + order: 3 !important; + } + .order-xl-4 { + -webkit-box-ordinal-group: 5 !important; + -ms-flex-order: 4 !important; + order: 4 !important; + } + .order-xl-5 { + -webkit-box-ordinal-group: 6 !important; + -ms-flex-order: 5 !important; + order: 5 !important; + } + .order-xl-last { + -webkit-box-ordinal-group: 7 !important; + -ms-flex-order: 6 !important; + order: 6 !important; + } + .m-xl-0 { + margin: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mt-xl-3 { + margin-top: 1rem !important; + } + .mt-xl-4 { + margin-top: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 3rem !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .me-xl-0 { + margin-right: 0 !important; + } + .me-xl-1 { + margin-right: 0.25rem !important; + } + .me-xl-2 { + margin-right: 0.5rem !important; + } + .me-xl-3 { + margin-right: 1rem !important; + } + .me-xl-4 { + margin-right: 1.5rem !important; + } + .me-xl-5 { + margin-right: 3rem !important; + } + .me-xl-auto { + margin-right: auto !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xl-3 { + margin-bottom: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 3rem !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ms-xl-0 { + margin-left: 0 !important; + } + .ms-xl-1 { + margin-left: 0.25rem !important; + } + .ms-xl-2 { + margin-left: 0.5rem !important; + } + .ms-xl-3 { + margin-left: 1rem !important; + } + .ms-xl-4 { + margin-left: 1.5rem !important; + } + .ms-xl-5 { + margin-left: 3rem !important; + } + .ms-xl-auto { + margin-left: auto !important; + } + .p-xl-0 { + padding: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pt-xl-3 { + padding-top: 1rem !important; + } + .pt-xl-4 { + padding-top: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 3rem !important; + } + .pe-xl-0 { + padding-right: 0 !important; + } + .pe-xl-1 { + padding-right: 0.25rem !important; + } + .pe-xl-2 { + padding-right: 0.5rem !important; + } + .pe-xl-3 { + padding-right: 1rem !important; + } + .pe-xl-4 { + padding-right: 1.5rem !important; + } + .pe-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xl-3 { + padding-bottom: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 3rem !important; + } + .ps-xl-0 { + padding-left: 0 !important; + } + .ps-xl-1 { + padding-left: 0.25rem !important; + } + .ps-xl-2 { + padding-left: 0.5rem !important; + } + .ps-xl-3 { + padding-left: 1rem !important; + } + .ps-xl-4 { + padding-left: 1.5rem !important; + } + .ps-xl-5 { + padding-left: 3rem !important; + } + .text-xl-start { + text-align: left !important; + } + .text-xl-end { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} + +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + .float-xxl-end { + float: right !important; + } + .float-xxl-none { + float: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-grid { + display: grid !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } + .d-xxl-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-xxl-none { + display: none !important; + } + .flex-xxl-fill { + -webkit-box-flex: 1 !important; + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-xxl-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-xxl-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-xxl-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + -webkit-box-flex: 0 !important; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + -webkit-box-flex: 1 !important; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .justify-content-xxl-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-xxl-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-xxl-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-xxl-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-xxl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .justify-content-xxl-evenly { + -webkit-box-pack: space-evenly !important; + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; + } + .align-items-xxl-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-xxl-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-xxl-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-xxl-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-xxl-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-xxl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-xxl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-xxl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-xxl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-xxl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-xxl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-xxl-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-xxl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-xxl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-xxl-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-xxl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-xxl-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } + .order-xxl-first { + -webkit-box-ordinal-group: 0 !important; + -ms-flex-order: -1 !important; + order: -1 !important; + } + .order-xxl-0 { + -webkit-box-ordinal-group: 1 !important; + -ms-flex-order: 0 !important; + order: 0 !important; + } + .order-xxl-1 { + -webkit-box-ordinal-group: 2 !important; + -ms-flex-order: 1 !important; + order: 1 !important; + } + .order-xxl-2 { + -webkit-box-ordinal-group: 3 !important; + -ms-flex-order: 2 !important; + order: 2 !important; + } + .order-xxl-3 { + -webkit-box-ordinal-group: 4 !important; + -ms-flex-order: 3 !important; + order: 3 !important; + } + .order-xxl-4 { + -webkit-box-ordinal-group: 5 !important; + -ms-flex-order: 4 !important; + order: 4 !important; + } + .order-xxl-5 { + -webkit-box-ordinal-group: 6 !important; + -ms-flex-order: 5 !important; + order: 5 !important; + } + .order-xxl-last { + -webkit-box-ordinal-group: 7 !important; + -ms-flex-order: 6 !important; + order: 6 !important; + } + .m-xxl-0 { + margin: 0 !important; + } + .m-xxl-1 { + margin: 0.25rem !important; + } + .m-xxl-2 { + margin: 0.5rem !important; + } + .m-xxl-3 { + margin: 1rem !important; + } + .m-xxl-4 { + margin: 1.5rem !important; + } + .m-xxl-5 { + margin: 3rem !important; + } + .m-xxl-auto { + margin: auto !important; + } + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xxl-0 { + margin-top: 0 !important; + } + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + .mt-xxl-3 { + margin-top: 1rem !important; + } + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + .mt-xxl-5 { + margin-top: 3rem !important; + } + .mt-xxl-auto { + margin-top: auto !important; + } + .me-xxl-0 { + margin-right: 0 !important; + } + .me-xxl-1 { + margin-right: 0.25rem !important; + } + .me-xxl-2 { + margin-right: 0.5rem !important; + } + .me-xxl-3 { + margin-right: 1rem !important; + } + .me-xxl-4 { + margin-right: 1.5rem !important; + } + .me-xxl-5 { + margin-right: 3rem !important; + } + .me-xxl-auto { + margin-right: auto !important; + } + .mb-xxl-0 { + margin-bottom: 0 !important; + } + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + .mb-xxl-auto { + margin-bottom: auto !important; + } + .ms-xxl-0 { + margin-left: 0 !important; + } + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + .ms-xxl-3 { + margin-left: 1rem !important; + } + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + .ms-xxl-5 { + margin-left: 3rem !important; + } + .ms-xxl-auto { + margin-left: auto !important; + } + .p-xxl-0 { + padding: 0 !important; + } + .p-xxl-1 { + padding: 0.25rem !important; + } + .p-xxl-2 { + padding: 0.5rem !important; + } + .p-xxl-3 { + padding: 1rem !important; + } + .p-xxl-4 { + padding: 1.5rem !important; + } + .p-xxl-5 { + padding: 3rem !important; + } + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xxl-0 { + padding-top: 0 !important; + } + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + .pt-xxl-3 { + padding-top: 1rem !important; + } + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + .pt-xxl-5 { + padding-top: 3rem !important; + } + .pe-xxl-0 { + padding-right: 0 !important; + } + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + .pe-xxl-3 { + padding-right: 1rem !important; + } + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + .pe-xxl-5 { + padding-right: 3rem !important; + } + .pb-xxl-0 { + padding-bottom: 0 !important; + } + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + .ps-xxl-0 { + padding-left: 0 !important; + } + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + .ps-xxl-3 { + padding-left: 1rem !important; + } + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + .ps-xxl-5 { + padding-left: 3rem !important; + } + .text-xxl-start { + text-align: left !important; + } + .text-xxl-end { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } +} + +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + .fs-2 { + font-size: 2rem !important; + } + .fs-3 { + font-size: 1.75rem !important; + } + .fs-4 { + font-size: 1.5rem !important; + } +} + +@media print { + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-grid { + display: grid !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } + .d-print-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-print-none { + display: none !important; + } +} + +/*-------------------------------------------------------------------*/ +/* === Template mixins === */ +/* Miscellaneous Mixins */ +.list-wrapper ul li .form-check, +.list-wrapper ul li .form-check .form-check-label { + text-overflow: ellipsis; + overflow: hidden; + max-width: 100%; + white-space: nowrap; +} + +/* Animation Mixins */ +@-webkit-keyframes dropdownAnimation { + from { + opacity: 0; + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + -webkit-transform: translate3d(0, 0px, 0); + transform: translate3d(0, 0px, 0); + } +} +@keyframes dropdownAnimation { + from { + opacity: 0; + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + -webkit-transform: translate3d(0, 0px, 0); + transform: translate3d(0, 0px, 0); + } +} + +.dropdownAnimation, +.navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu { + -webkit-animation-name: dropdownAnimation; + animation-name: dropdownAnimation; + -webkit-animation-duration: 0.25s; + animation-duration: 0.25s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +@keyframes fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +.infinite-spin { + -webkit-animation-name: spin; + animation-name: spin; + -webkit-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; +} + +@-webkit-keyframes spin { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes spin { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +/*-------------------------------------------------------------------*/ +/* === Core Styles === */ +/* Reset Styles */ +body { + padding: 0; + margin: 0; + overflow-x: hidden; +} + +.form-control, +.form-control:focus { + -webkit-box-shadow: none; + -moz-box-shadow: none; +} + +.form-control { + -webkit-box-shadow: none; + box-shadow: none; +} + +.form-control:focus { + outline: 0; + -webkit-box-shadow: none; + box-shadow: none; +} + +a, +div, +h1, +.h1, +h2, +.h2, +h3, +.h3, +h4, +.h4, +h5, +.h5, +p, +span { + text-shadow: none; +} + +[type="button"]:focus, +a:active, +a:focus, +a:visited, +button::-moz-focus-inner, +input[type="reset"]::-moz-focus-inner, +input[type="button"]::-moz-focus-inner, +input[type="submit"]::-moz-focus-inner, +input[type="file"] > input[type="button"]::-moz-focus-inner, +select::-moz-focus-inner { + outline: 0; +} + +input, +.form-control:focus, +input:focus, +select:focus, +textarea:focus, +button:focus { + outline: none; + outline-width: 0; + outline-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + outline-style: none; +} + +textarea { + resize: none; + overflow-x: hidden; +} + +.btn, +.btn-group.open .dropdown-toggle, +.btn:active, +.btn:focus, +.btn:hover, +.btn:visited, +a, +a:active, +a:checked, +a:focus, +a:hover, +a:visited, +body, +button, +button:active, +button:hover, +button:visited, +div, +input, +input:active, +input:focus, +input:hover, +input:visited, +select, +select:active, +select:focus, +select:visited, +textarea, +textarea:active, +textarea:focus, +textarea:hover, +textarea:visited { + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn.active.focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn:active:focus, +.btn:focus, +button, +button:active, +button:checked, +button:focus, +button:hover, +button:visited { + outline: 0; + outline-offset: 0; +} + +.bootstrap-select .dropdown-toggle:focus { + outline: 0; + outline-offset: 0; +} + +.dropdown-menu > li > a:active, +.dropdown-menu > li > a:focus, +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:visited { + outline: 0; +} + +a:focus, +input:focus { + border-color: transparent; + outline: none; +} + +/* Fonts */ +@font-face { + font-family: "ubuntu-light"; + src: url("../fonts/Ubuntu/Ubuntu-Light.eot"); + /* IE9 Compat Modes */ + src: url("../fonts/Ubuntu/Ubuntu-Light.woff2") format("woff2"), + url("../fonts/Ubuntu/Ubuntu-Light.woff") format("woff"), + url("../fonts/Ubuntu/Ubuntu-Light.ttf") format("truetype"); +} + +@font-face { + font-family: "ubuntu-regular"; + src: url("../fonts/Ubuntu/Ubuntu-Regular.eot"); + /* IE9 Compat Modes */ + src: url("../fonts/Ubuntu/Ubuntu-Regular.woff2") format("woff2"), + url("../fonts/Ubuntu/Ubuntu-Regular.woff") format("woff"), + url("../fonts/Ubuntu/Ubuntu-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: "ubuntu-medium"; + src: url("../fonts/Ubuntu/Ubuntu-Medium.eot"); + /* IE9 Compat Modes */ + src: url("../fonts/Ubuntu/Ubuntu-Medium.woff2") format("woff2"), + url("../fonts/Ubuntu/Ubuntu-Medium.woff") format("woff"), + url("../fonts/Ubuntu/Ubuntu-Medium.ttf") format("truetype"); +} + +@font-face { + font-family: "ubuntu-bold"; + src: url("../fonts/Ubuntu/Ubuntu-Bold.eot"); + /* IE9 Compat Modes */ + src: url("../fonts/Ubuntu/Ubuntu-Bold.woff2") format("woff2"), + url("../fonts/Ubuntu/Ubuntu-Bold.woff") format("woff"), + url("../fonts/Ubuntu/Ubuntu-Bold.ttf") format("truetype"); +} + +.text-twitter { + color: #2caae1; +} + +.text-facebook { + color: #3b579d; +} + +.text-google { + color: #dc4a38; +} + +.text-linkedin { + color: #0177b5; +} + +.text-pinterest { + color: #cc2127; +} + +.text-youtube { + color: #e52d27; +} + +.text-github { + color: #333333; +} + +.text-behance { + color: #1769ff; +} + +.text-dribbble { + color: #ea4c89; +} + +.text-reddit { + color: #ff4500; +} + +.bg-twitter { + background: #2caae1; +} + +.bg-facebook { + background: #3b579d; +} + +.bg-google { + background: #dc4a38; +} + +.bg-linkedin { + background: #0177b5; +} + +.bg-pinterest { + background: #cc2127; +} + +.bg-youtube { + background: #e52d27; +} + +.bg-github { + background: #333333; +} + +.bg-behance { + background: #1769ff; +} + +.bg-dribbble { + background: #ea4c89; +} + +.bg-reddit { + background: #ff4500; +} + +/* Typography */ +body { + font-size: 1rem; + font-family: "ubuntu-regular", sans-serif; + font-weight: initial; + line-height: normal; + -webkit-font-smoothing: antialiased; +} + +h1, +.h1, +h2, +.h2, +h3, +.h3, +h4, +.h4, +h5, +.h5, +h6, +.h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: "ubuntu-medium", sans-serif; +} + +p { + font-size: 0.875rem; +} + +h1, +.h1, +.h1 { + font-size: 2.19rem; +} + +h2, +.h2, +.h2 { + font-size: 1.88rem; +} + +h3, +.h3, +.h3 { + font-size: 1.56rem; +} + +h4, +.h4, +.h4 { + font-size: 1.13rem; +} + +h5, +.h5, +.h5 { + font-size: 1rem; +} + +h6, +.h6, +.h6 { + font-size: 0.9375rem; +} + +p { + font-size: 0.9375rem; + line-height: 1.5; +} + +.display-1 { + font-size: 3.75rem; +} +@media (max-width: 991px) { + .display-1 { + font-size: 3rem; + } +} + +.display-2 { + font-size: 3.125rem; +} +@media (max-width: 991px) { + .display-2 { + font-size: 2.5rem; + } +} + +.display-3 { + font-size: 2.5rem; +} +@media (max-width: 991px) { + .display-3 { + font-size: 2rem; + } +} + +.display-4 { + font-size: 1.875rem; +} +@media (max-width: 991px) { + .display-4 { + font-size: 1.5rem; + } +} + +.display-5 { + font-size: 1.25rem; +} +@media (max-width: 991px) { + .display-5 { + font-size: 1rem; + } +} + +.blockquote { + padding: 1.25rem; + border: 1px solid #ebedf2; +} + +address p { + margin-bottom: 0; +} + +.blockquote-primary { + border-color: #6bc1f3; +} +.blockquote-primary .blockquote-footer { + color: #6bc1f3; +} + +.blockquote-secondary { + border-color: #c3bdbd; +} +.blockquote-secondary .blockquote-footer { + color: #c3bdbd; +} + +.blockquote-success { + border-color: #1bcfb4; +} +.blockquote-success .blockquote-footer { + color: #1bcfb4; +} + +.blockquote-info { + border-color: #198ae3; +} +.blockquote-info .blockquote-footer { + color: #198ae3; +} + +.blockquote-warning { + border-color: #fed713; +} +.blockquote-warning .blockquote-footer { + color: #fed713; +} + +.blockquote-danger { + border-color: #fe7c96; +} +.blockquote-danger .blockquote-footer { + color: #fe7c96; +} + +.blockquote-light { + border-color: #f8f9fa; +} +.blockquote-light .blockquote-footer { + color: #f8f9fa; +} + +.blockquote-dark { + border-color: #3e4b5b; +} +.blockquote-dark .blockquote-footer { + color: #3e4b5b; +} + +.error-page h1, +.error-page .h1 { + font-size: 12rem; +} +@media (max-width: 991px) { + .error-page h1, + .error-page .h1 { + font-size: 8rem; + } +} + +.icon-lg { + font-size: 2.5rem; +} + +.icon-md { + font-size: 1.875rem; +} + +.icon-sm { + font-size: 1rem; +} + +/* Miscellanoeous */ +body, +html { + overflow-x: hidden; + padding-right: 0 !important; +} + +*:-moz-full-screen, +*:-webkit-full-screen, +*:fullscreen *:-ms-fullscreen { + overflow: auto; +} + +.container-scroller { + overflow: hidden; +} + +pre { + background: color(gray-lighter); + padding: 15px; + font-size: 14px; +} + +code { + padding: 5px; + color: #fe7c96; + font-family: "ubuntu-light", sans-serif; + font-size: 0.875rem; + border-radius: 4px; +} + +.page-header { + margin: 0 0 1.5rem 0; +} +.page-header .breadcrumb { + border: 0; + margin-bottom: 0; +} + +.page-title { + color: #343a40; + font-size: 1.125rem; + margin-bottom: 0; +} +.page-title .page-title-icon { + display: inline-block; + width: 36px; + height: 36px; + border-radius: 4px; + text-align: center; + -webkit-box-shadow: 0px 3px 8.3px 0.7px rgba(163, 93, 255, 0.35); + box-shadow: 0px 3px 8.3px 0.7px rgba(163, 93, 255, 0.35); +} +.page-title .page-title-icon i { + font-size: 0.9375rem; + line-height: 36px; +} + +/* Footer */ +.footer { + background: #f2edf3; + color: color(dark); + border-top: 1px solid #e7dee9; + padding: 30px 1rem; + transition: all 0.25s ease; + -moz-transition: all 0.25s ease; + -webkit-transition: all 0.25s ease; + -ms-transition: all 0.25s ease; + font-size: calc(0.875rem - 0.05rem); + font-family: "ubuntu-regular", sans-serif; +} +.footer a { + color: #1bcfb4; + font-size: inherit; +} +@media (max-width: 991px) { + .footer { + margin-left: 0; + width: 100%; + } +} + +/* Utilities */ +.grid-margin, +.purchase-popup { + margin-bottom: 2.5rem; +} + +@media (min-width: 576px) { + .grid-margin-sm-0 { + margin-bottom: 0; + } +} + +@media (min-width: 768px) { + .grid-margin-md-0 { + margin-bottom: 0; + } +} + +@media (min-width: 992px) { + .grid-margin-lg-0 { + margin-bottom: 0; + } +} + +@media (min-width: 1200px) { + .grid-margin-xl-0 { + margin-bottom: 0; + } +} + +.img-lg { + width: 92px; + height: 92px; +} + +.img-sm { + width: 43px; + height: 43px; +} + +.img-xs { + width: 37px; + height: 37px; +} + +.img-ss, +.image-grouped .text-avatar, +.image-grouped img { + width: 35px; + height: 35px; +} + +.stretch-card { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + -webkit-box-pack: stretch; + -ms-flex-pack: stretch; + justify-content: stretch; +} +.stretch-card > .card { + width: 100%; + min-width: 100%; +} + +@media (min-width: 576px) { + .border-right-sm { + border-right: 1px solid #ebedf2; + } +} + +@media (min-width: 768px) { + .border-right-md { + border-right: 1px solid #ebedf2; + } +} + +@media (min-width: 992px) { + .border-right-lg { + border-right: 1px solid #ebedf2; + } +} + +@media (min-width: 576px) { + .border-left-sm { + border-left: 1px solid #ebedf2; + } +} + +@media (min-width: 768px) { + .border-left-md { + border-left: 1px solid #ebedf2; + } +} + +@media (min-width: 992px) { + .border-left-lg { + border-left: 1px solid #ebedf2; + } +} + +.text-gray, +.card .card-subtitle { + color: #8c8c8c; +} + +.text-black { + color: #000000; +} + +.text-small { + font-size: 12px; +} + +.flex-grow { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.font-weight-light { + font-family: "ubuntu-light", sans-serif; +} + +.font-weight-bold { + font-family: "ubuntu-bold", sans-serif; +} + +.font-weight-normal { + font-family: "ubuntu-regular", sans-serif; +} + +.image-grouped { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.image-grouped .text-avatar, +.image-grouped img { + border-radius: 100%; + margin-left: -10px; + z-index: 0; + border: 4px solid #fff; + -webkit-transform: scale(1); + transform: scale(1); + -webkit-transition-duration: 0.3s; + transition-duration: 0.3s; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-property: "box-shadow", "z-index", "transform", + "border-width", "box-shadow", "transform"; + transition-property: "box-shadow", "z-index", "transform", "border-width", + "box-shadow", "transform"; + transition-property: "box-shadow", "z-index", "transform", "border-width"; +} +.image-grouped .text-avatar:first-child, +.image-grouped img:first-child { + margin-left: 0; +} +.image-grouped .text-avatar:hover, +.image-grouped img:hover { + z-index: 1; + -webkit-box-shadow: 0 0 5px -2px rgba(0, 0, 0, 0.5); + box-shadow: 0 0 5px -2px rgba(0, 0, 0, 0.5); + -webkit-transform: scale(1.05); + transform: scale(1.05); + border-width: 0; +} +.image-grouped .text-avatar { + color: #6bc1f3; + font-size: 11px; + font-weight: 600; +} + +.aligner-wrapper { + position: relative; +} +.aligner-wrapper .absolute { + position: absolute; +} +.aligner-wrapper .absolute.absolute-center { + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + bottom: 0; + right: 0; + left: 0; + margin: auto; +} +.aligner-wrapper .absolute.left { + left: 0; +} +.aligner-wrapper .absolute.right { + right: 0; +} +.aligner-wrapper .absolute.bottom { + bottom: 0; +} +.aligner-wrapper .absolute.top { + top: 0; +} + +.v-strock-1 { + width: 2px; +} + +.v-strock-2 { + width: 3px; +} + +.v-strock-3 { + width: 4px; +} + +.v-strock-4 { + width: 5px; +} + +.dot-indicator { + width: 10px; + height: 10px; + border-radius: 100%; +} +.dot-indicator.dot-indicator-sm { + width: 6px; + height: 6px; +} + +.bg-gradient-primary { + background: -webkit-gradient( + linear, + left top, + right top, + from(#da8cff), + to(#9a55ff) + ) !important; + background: linear-gradient(to right, #da8cff, #9a55ff) !important; +} + +.bg-gradient-secondary { + background: -webkit-gradient( + linear, + left top, + right top, + from(#e7ebf0), + to(#868e96) + ) !important; + background: linear-gradient(to right, #e7ebf0, #868e96) !important; +} + +.bg-gradient-success { + background: -webkit-gradient( + linear, + left top, + right top, + from(#84d9d2), + to(#07cdae) + ) !important; + background: linear-gradient(to right, #84d9d2, #07cdae) !important; +} + +.bg-gradient-info { + background: -webkit-gradient( + linear, + left top, + right top, + from(#90caf9), + color-stop(99%, #047edf) + ) !important; + background: linear-gradient(to right, #90caf9, #047edf 99%) !important; +} + +.bg-gradient-warning { + background: -webkit-gradient( + linear, + left top, + right top, + from(#f6e384), + to(#ffd500) + ) !important; + background: linear-gradient(to right, #f6e384, #ffd500) !important; +} + +.bg-gradient-danger { + background: -webkit-gradient( + linear, + left top, + right top, + from(#ffbf96), + to(#fe7096) + ) !important; + background: linear-gradient(to right, #ffbf96, #fe7096) !important; +} + +.bg-gradient-light { + background: -webkit-gradient( + linear, + left top, + left bottom, + from(#f4f4f4), + to(#e4e4e9) + ) !important; + background: linear-gradient(to bottom, #f4f4f4, #e4e4e9) !important; +} + +.bg-gradient-dark { + background: linear-gradient(89deg, #5e7188, #3e4b5b) !important; +} + +/* Demo Styles */ +.template-demo .slider-wrap { + height: 100px; +} + +.template-demo .progress { + margin-top: 1.5rem; +} + +.template-demo > h2, +.template-demo > .h2, +.template-demo > h3, +.template-demo > .h3, +.template-demo > h4, +.template-demo > .h4, +.template-demo > h5, +.template-demo > .h5, +.template-demo > h6, +.template-demo > .h6, +.template-demo > h1, +.template-demo > .h1 { + border-top: 1px solid #ebedf2; + padding: 0.5rem 0 0; +} + +.template-demo .ul-slider.noUi-horizontal { + margin-top: 2rem; +} + +.template-demo .ul-slider.noUi-vertical { + margin-right: 2rem; +} + +.template-demo > .dropdown { + display: inline-block; + margin-bottom: 0.5rem; +} + +.template-demo nav .breadcrumb { + margin-bottom: 1.375rem; +} + +.template-demo nav:last-child .breadcrumb { + margin-bottom: 0; +} + +.template-demo .editable-form > .form-group { + border-bottom: 1px solid #ebedf2; + padding-bottom: 0.8rem; + margin-bottom: 0.8rem; +} + +.template-demo .circle-progress { + padding: 15px; +} + +.demo-modal { + position: static; + display: block; +} +.demo-modal .modal-dialog.modal-lg { + max-width: 100%; +} + +.loader-demo-box { + width: 100%; + height: 200px; +} + +.dropdown-menu-static-demo { + height: 250px; + margin-bottom: 20px; +} + +.rounded-legend ul li { + list-style-type: none; + color: #9c9fa6; + font-size: 0.75rem; +} +.rounded-legend ul li .legend-dots { + width: 1rem; + height: 1rem; + border-radius: 100%; + display: inline-block; + vertical-align: text-bottom; + margin-right: 0.5rem; +} +.rtl .rounded-legend ul li .legend-dots { + margin-left: 0.5rem; +} + +.rounded-legend.legend-horizontal { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.rounded-legend.legend-horizontal ul li { + display: inline-block; + margin-right: 1.5rem; +} +.rtl .rounded-legend.legend-horizontal ul li { + margin-right: auto; + margin-left: 1.5rem; +} + +.rounded-legend.legend-top-right ul { + float: right; +} +.rtl .rounded-legend.legend-top-right ul { + float: left; +} + +.rounded-legend.legend-vertical ul li { + margin-top: 1rem; +} + +#proBanner { + position: fixed; + left: 0; + top: 0; + width: 100%; + z-index: 9999; + background: #000; +} +#proBanner .card-body-padding { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 2rem; + padding-right: 2rem; +} +@media (max-width: 766px) { + #proBanner .card-body-padding { + padding-left: 1rem; + padding-right: 1rem; + } +} +#proBanner .buy-now-text { + color: #ffffff; +} +@media (max-width: 766px) { + #proBanner .buy-now-text { + font-size: 10px; + line-height: 1.5; + } +} +#proBanner .btn.buy-now-btn { + background: transparent; + color: #88b6ff; + border-radius: 10px; + padding: 1rem 0; + border-radius: 4px; + font-weight: bold; + font-size: 1rem; +} +@media (max-width: 766px) { + #proBanner .btn.buy-now-btn { + min-width: 80px; + padding: 1rem 0.5rem; + font-size: 12px; + } +} +#proBanner .btn#bannerClose i { + margin-right: 1rem; + font-size: 1.25rem; +} +@media (max-width: 766px) { + #proBanner .btn#bannerClose i { + font-size: 1rem; + margin-right: 0; + } +} +#proBanner a { + text-decoration: none; +} +#proBanner a i { + font-size: 1.25rem; +} +@media (max-width: 766px) { + #proBanner a i { + font-size: 1rem; + } +} + +.proBanner-padding-top { + padding-top: 80px !important; +} + +/* Dashboard */ +.card-statistics .highlight-icon { + height: 53px; + width: 53px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + border-radius: 50px; +} +.card-statistics .highlight-icon i { + font-size: 27px; +} + +.card-statistics .card-col { + border-right: 1px solid #ebedf2; +} +.card-statistics .card-col:last-child { + border-right: none; +} +@media (max-width: 575.98px) { + .card-statistics .card-col { + padding-left: 0; + padding-right: 0; + position: relative; + border: none; + } + .card-statistics .card-col:first-child:after, + .card-statistics .card-col:first-child:before, + .card-statistics .card-col:nth-child(2):after, + .card-statistics .card-col:nth-child(2):before, + .card-statistics .card-col:nth-child(3):after, + .card-statistics .card-col:nth-child(3):before { + content: ""; + position: absolute; + background: #ebedf2; + } + .card-statistics .card-col:first-child:before { + bottom: 0; + width: 94.2%; + height: 1px; + right: 0; + } + .card-statistics .card-col:first-child:after { + bottom: 0; + width: 1px; + height: 100%; + right: 0; + } + .card-statistics .card-col:nth-child(2):before { + bottom: 0; + width: 94.2%; + height: 1px; + left: 0; + } + .card-statistics .card-col:nth-child(3):before { + width: 1px; + height: 100%; + right: 0; + } +} + +.card-revenue-table .revenue-item { + border-bottom: 1px solid #ebedf2; +} +.card-revenue-table .revenue-item:last-child { + border-bottom: 0; +} +.card-revenue-table .revenue-item .revenue-desc { + margin-right: auto; + width: 80%; +} +.card-revenue-table .revenue-item .revenue-desc p { + margin-bottom: 0; +} +.card-revenue-table .revenue-item .revenue-amount { + margin-left: auto; + width: 40%; +} +.card-revenue-table .revenue-item .revenue-amount p { + font-size: 1.25rem; + font-family: "roboto", sans-serif; + font-weight: 600; + text-align: right; +} +.rtl .card-revenue-table .revenue-item .revenue-amount p { + text-align: left; +} + +.card-revenue { + background: linear-gradient(120deg, #556cdc, #128bfc, #18bef1); + background-size: cover; + color: color(white); +} +.card-revenue .highlight-text { + font-size: 1.875rem; + font-family: "roboto", sans-serif; + font-weight: 500; +} +.card-revenue .badge { + background-color: rgba(255, 255, 255, 0.2); + font-size: 1.125rem; + padding: 0.5rem 1.25rem; +} + +.product-chart-wrapper { + height: 92%; +} + +#dashboardTrendingProgress { + width: 60px; +} + +.dashboard-bar-chart-legend .col { + text-align: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.dashboard-bar-chart-legend .col .bg { + margin-left: auto; + margin-right: auto; + height: 5px; + width: 30px; + display: block; + margin-top: 5px; +} +.dashboard-bar-chart-legend .col:nth-child(1) .bg { + background: #198ae3; +} +.dashboard-bar-chart-legend .col:nth-child(2) .bg { + background: #6bc1f3; +} +.dashboard-bar-chart-legend .col:nth-child(3) .bg { + background: #fe7c96; +} + +.intro-banner { + background: #dbe4ec; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 20px; + border-radius: 2px; +} +.intro-banner .banner-image { + width: 24%; + max-width: 100%; +} +.intro-banner .banner-image img { + display: block; + margin: auto; +} +.intro-banner .content-area { + width: 58%; + color: #000000; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: end; + -ms-flex-align: end; + align-items: end; +} + +.sales-mini-tabs { + border-bottom: none; +} +.sales-mini-tabs .nav-item .nav-link { + border: none; + font-weight: 500; + padding: 5px 15px; + border-radius: 2px; + -webkit-transition-duration: 0.7s; + transition-duration: 0.7s; + -webkit-transition-property: "color"; + transition-property: "color"; +} +.sales-mini-tabs .nav-item .nav-link.active { + font-weight: 600; + background: white; + color: #6bc1f3; +} + +.purchase-popup { + background: #fff; + padding: 15px 20px; + border-radius: 3px; +} +.purchase-popup .btn { + margin-right: 20px; + font-weight: 500; + color: #ffffff; + border-radius: 5px; + -webkit-transition-duration: 0.2s; + transition-duration: 0.2s; +} +.purchase-popup .btn.download-button { + background: rgba(249, 249, 249, 0.7); + color: #969292; + border: 1px solid #d7d7d7; +} +.purchase-popup .btn.purchase-button { + background-color: rgba(172, 50, 228, 0.9); + background-image: -owg-linear-gradient(to right, #da8cff, #9a55ff); + background-image: -webkit-gradient( + linear, + left top, + right top, + from(#da8cff), + to(#9a55ff) + ); + background-image: linear-gradient(to right, #da8cff, #9a55ff); + color: #ffffff; + border: none; + line-height: 1; + vertical-align: middle; +} +.purchase-popup p { + margin-bottom: auto; + margin-top: auto; + color: #7e7e7e; + font-weight: 400; + vertical-align: middle; + line-height: 1; +} +.purchase-popup i { + vertical-align: middle; + line-height: 1; + margin: auto 0; + color: #b1b1b1; +} + +/*-------------------------------------------------------------------*/ +/* === Components === */ +/* Badges */ +.badge { + border-radius: 0.125rem; + font-size: 11px; + font-weight: initial; + line-height: 1; + padding: 0.375rem 0.5625rem; + font-family: "ubuntu-medium", sans-serif; +} +.badge.badge-pill { + border-radius: 10rem; +} + +/*Badge variations*/ +.badge-primary { + border: 1px solid #6bc1f3; + background: #6bc1f3; + color: #ffffff; +} + +.badge-secondary { + border: 1px solid #c3bdbd; + background: #c3bdbd; + color: #ffffff; +} + +.badge-success, +.preview-list .preview-item .preview-thumbnail .badge.badge-online { + border: 1px solid #1bcfb4; + background: #1bcfb4; + color: #ffffff; +} + +.badge-info, +.preview-list .preview-item .preview-thumbnail .badge.badge-offline { + border: 1px solid #198ae3; + background: #198ae3; + color: #ffffff; +} + +.badge-warning, +.preview-list .preview-item .preview-thumbnail .badge.badge-busy { + border: 1px solid #fed713; + background: #fed713; + color: #ffffff; +} + +.badge-danger { + border: 1px solid #fe7c96; + background: #fe7c96; + color: #ffffff; +} + +.badge-light { + border: 1px solid #f8f9fa; + background: #f8f9fa; + color: #ffffff; +} + +.badge-dark { + border: 1px solid #3e4b5b; + background: #3e4b5b; + color: #ffffff; +} + +/*Badge gradient variations*/ +.badge-gradient-primary { + background: -webkit-gradient( + linear, + left top, + right top, + from(#da8cff), + to(#9a55ff) + ); + background: linear-gradient(to right, #da8cff, #9a55ff); + color: #ffffff; +} + +.badge-gradient-secondary { + background: -webkit-gradient( + linear, + left top, + right top, + from(#e7ebf0), + to(#868e96) + ); + background: linear-gradient(to right, #e7ebf0, #868e96); + color: #ffffff; +} + +.badge-gradient-success { + background: -webkit-gradient( + linear, + left top, + right top, + from(#84d9d2), + to(#07cdae) + ); + background: linear-gradient(to right, #84d9d2, #07cdae); + color: #ffffff; +} + +.badge-gradient-info { + background: -webkit-gradient( + linear, + left top, + right top, + from(#90caf9), + color-stop(99%, #047edf) + ); + background: linear-gradient(to right, #90caf9, #047edf 99%); + color: #ffffff; +} + +.badge-gradient-warning { + background: -webkit-gradient( + linear, + left top, + right top, + from(#f6e384), + to(#ffd500) + ); + background: linear-gradient(to right, #f6e384, #ffd500); + color: #ffffff; +} + +.badge-gradient-danger { + background: -webkit-gradient( + linear, + left top, + right top, + from(#ffbf96), + to(#fe7096) + ); + background: linear-gradient(to right, #ffbf96, #fe7096); + color: #ffffff; +} + +.badge-gradient-light { + background: -webkit-gradient( + linear, + left top, + left bottom, + from(#f4f4f4), + to(#e4e4e9) + ); + background: linear-gradient(to bottom, #f4f4f4, #e4e4e9); + color: #ffffff; +} + +.badge-gradient-dark { + background: linear-gradient(89deg, #5e7188, #3e4b5b); + color: #ffffff; +} + +/*Badge outlined variations*/ +.badge-outline-primary { + color: #6bc1f3; + border: 1px solid #6bc1f3; +} + +.badge-outline-secondary { + color: #c3bdbd; + border: 1px solid #c3bdbd; +} + +.badge-outline-success { + color: #1bcfb4; + border: 1px solid #1bcfb4; +} + +.badge-outline-info { + color: #198ae3; + border: 1px solid #198ae3; +} + +.badge-outline-warning { + color: #fed713; + border: 1px solid #fed713; +} + +.badge-outline-danger { + color: #fe7c96; + border: 1px solid #fe7c96; +} + +.badge-outline-light { + color: #f8f9fa; + border: 1px solid #f8f9fa; +} + +.badge-outline-dark { + color: #3e4b5b; + border: 1px solid #3e4b5b; +} + +/* Bootstrap Progress */ +.progress { + border-radius: 3px; + height: 8px; +} +.progress .progress-bar { + border-radius: 3px; +} +.progress.progress-sm { + height: 0.375rem; +} +.progress.progress-md { + height: 8px; +} +.progress.progress-lg { + height: 15px; +} +.progress.progress-xl { + height: 18px; +} + +/* Buttons */ +.btn { + font-size: 0.875rem; + line-height: 1; + font-family: "ubuntu-bold", sans-serif; + /* Buttons with only icons */ + /* Buttons with icon and text */ +} +.btn i { + font-size: 1rem; +} +.btn.btn-rounded { + border-radius: 50px; +} +.btn.btn-fw { + min-width: 150px; +} +.btn.btn-sm, +.btn-group-sm > .btn { + font-size: 0.875rem; +} +.btn.btn-lg, +.btn-group-lg > .btn { + font-size: 0.875rem; +} +.btn.btn-xs { + padding: 0.5rem 0.75rem; + font-size: 0.625rem; +} +.btn.btn-icon { + width: 42px; + height: 42px; + padding: 0; +} +.btn.btn-icon-text .btn-icon-prepend { + margin-right: 0.5rem; +} +.btn.btn-icon-text .btn-icon-append { + margin-left: 0.5rem; +} +.btn.btn-social-icon { + width: 50px; + height: 50px; + padding: 0; +} + +.btn-group .btn + .btn { + border-left: 0; +} + +/*social buttons*/ +.btn-twitter { + background: #2caae1; + color: #ffffff; +} +.btn-twitter:hover, +.btn-twitter:focus { + background: #1b8dbf; + color: #ffffff; +} +.btn-twitter.btn-social-icon-text { + padding: 0 1.5rem 0 0; + background: #59bce7; +} +.btn-twitter.btn-social-icon-text i { + background: #2caae1; + padding: 0.75rem; + display: inline-block; + margin-right: 1.5rem; +} + +.btn-outline-twitter { + border: 1px solid #2caae1; + color: #2caae1; +} +.btn-outline-twitter:hover { + background: #2caae1; + color: #ffffff; +} + +.btn-facebook { + background: #3b579d; + color: #ffffff; +} +.btn-facebook:hover, +.btn-facebook:focus { + background: #2d4278; + color: #ffffff; +} +.btn-facebook.btn-social-icon-text { + padding: 0 1.5rem 0 0; + background: #4e6ebd; +} +.btn-facebook.btn-social-icon-text i { + background: #3b579d; + padding: 0.75rem; + display: inline-block; + margin-right: 1.5rem; +} + +.btn-outline-facebook { + border: 1px solid #3b579d; + color: #3b579d; +} +.btn-outline-facebook:hover { + background: #3b579d; + color: #ffffff; +} + +.btn-google { + background: #dc4a38; + color: #ffffff; +} +.btn-google:hover, +.btn-google:focus { + background: #bf3322; + color: #ffffff; +} +.btn-google.btn-social-icon-text { + padding: 0 1.5rem 0 0; + background: #e47163; +} +.btn-google.btn-social-icon-text i { + background: #dc4a38; + padding: 0.75rem; + display: inline-block; + margin-right: 1.5rem; +} + +.btn-outline-google { + border: 1px solid #dc4a38; + color: #dc4a38; +} +.btn-outline-google:hover { + background: #dc4a38; + color: #ffffff; +} + +.btn-linkedin { + background: #0177b5; + color: #ffffff; +} +.btn-linkedin:hover, +.btn-linkedin:focus { + background: #015682; + color: #ffffff; +} +.btn-linkedin.btn-social-icon-text { + padding: 0 1.5rem 0 0; + background: #0198e8; +} +.btn-linkedin.btn-social-icon-text i { + background: #0177b5; + padding: 0.75rem; + display: inline-block; + margin-right: 1.5rem; +} + +.btn-outline-linkedin { + border: 1px solid #0177b5; + color: #0177b5; +} +.btn-outline-linkedin:hover { + background: #0177b5; + color: #ffffff; +} + +.btn-pinterest { + background: #cc2127; + color: #ffffff; +} +.btn-pinterest:hover, +.btn-pinterest:focus { + background: #a01a1f; + color: #ffffff; +} +.btn-pinterest.btn-social-icon-text { + padding: 0 1.5rem 0 0; + background: #e04046; +} +.btn-pinterest.btn-social-icon-text i { + background: #cc2127; + padding: 0.75rem; + display: inline-block; + margin-right: 1.5rem; +} + +.btn-outline-pinterest { + border: 1px solid #cc2127; + color: #cc2127; +} +.btn-outline-pinterest:hover { + background: #cc2127; + color: #ffffff; +} + +.btn-youtube { + background: #e52d27; + color: #ffffff; +} +.btn-youtube:hover, +.btn-youtube:focus { + background: #c21d17; + color: #ffffff; +} +.btn-youtube.btn-social-icon-text { + padding: 0 1.5rem 0 0; + background: #ea5955; +} +.btn-youtube.btn-social-icon-text i { + background: #e52d27; + padding: 0.75rem; + display: inline-block; + margin-right: 1.5rem; +} + +.btn-outline-youtube { + border: 1px solid #e52d27; + color: #e52d27; +} +.btn-outline-youtube:hover { + background: #e52d27; + color: #ffffff; +} + +.btn-github { + background: #333333; + color: #ffffff; +} +.btn-github:hover, +.btn-github:focus { + background: #1a1a1a; + color: #ffffff; +} +.btn-github.btn-social-icon-text { + padding: 0 1.5rem 0 0; + background: #4d4d4d; +} +.btn-github.btn-social-icon-text i { + background: #333333; + padding: 0.75rem; + display: inline-block; + margin-right: 1.5rem; +} + +.btn-outline-github { + border: 1px solid #333333; + color: #333333; +} +.btn-outline-github:hover { + background: #333333; + color: #ffffff; +} + +.btn-behance { + background: #1769ff; + color: #ffffff; +} +.btn-behance:hover, +.btn-behance:focus { + background: #0050e3; + color: #ffffff; +} +.btn-behance.btn-social-icon-text { + padding: 0 1.5rem 0 0; + background: #4a8aff; +} +.btn-behance.btn-social-icon-text i { + background: #1769ff; + padding: 0.75rem; + display: inline-block; + margin-right: 1.5rem; +} + +.btn-outline-behance { + border: 1px solid #1769ff; + color: #1769ff; +} +.btn-outline-behance:hover { + background: #1769ff; + color: #ffffff; +} + +.btn-dribbble { + background: #ea4c89; + color: #ffffff; +} +.btn-dribbble:hover, +.btn-dribbble:focus { + background: #e51e6b; + color: #ffffff; +} +.btn-dribbble.btn-social-icon-text { + padding: 0 1.5rem 0 0; + background: #ef7aa7; +} +.btn-dribbble.btn-social-icon-text i { + background: #ea4c89; + padding: 0.75rem; + display: inline-block; + margin-right: 1.5rem; +} + +.btn-outline-dribbble { + border: 1px solid #ea4c89; + color: #ea4c89; +} +.btn-outline-dribbble:hover { + background: #ea4c89; + color: #ffffff; +} + +.btn-reddit { + background: #ff4500; + color: #ffffff; +} +.btn-reddit:hover, +.btn-reddit:focus { + background: #cc3700; + color: #ffffff; +} +.btn-reddit.btn-social-icon-text { + padding: 0 1.5rem 0 0; + background: #ff6a33; +} +.btn-reddit.btn-social-icon-text i { + background: #ff4500; + padding: 0.75rem; + display: inline-block; + margin-right: 1.5rem; +} + +.btn-outline-reddit { + border: 1px solid #ff4500; + color: #ff4500; +} +.btn-outline-reddit:hover { + background: #ff4500; + color: #ffffff; +} + +/* inverse buttons */ +.btn-inverse-primary { + background-color: rgba(182, 109, 255, 0.2); + background-image: none; + border-color: rgba(182, 109, 255, 0); +} +.btn-inverse-primary:not(.btn-inverse-light) { + color: #6bc1f3; +} +.btn-inverse-primary:hover { + color: #ffffff; + background-color: #6bc1f3; + border-color: #6bc1f3; +} +.btn-inverse-primary.focus, +.btn-inverse-primary:focus { + -webkit-box-shadow: 0 0 0 3px rgba(182, 109, 255, 0.5); + box-shadow: 0 0 0 3px rgba(182, 109, 255, 0.5); +} +.btn-inverse-primary.disabled, +.btn-inverse-primary:disabled { + color: #6bc1f3; + background-color: transparent; +} +.btn-inverse-primary.active, +.btn-inverse-primary:active, +.show > .btn-inverse-primary.dropdown-toggle { + color: #ffffff; + background-color: #6bc1f3; + border-color: #6bc1f3; +} + +.btn-primary:not(.btn-light) { + color: #ffffff; +} +.btn-primary:not(.btn-light):hover, +.btn-primary:not(.btn-light):focus, +.btn-primary:not(.btn-light):active { + color: #ffffff; +} +.btn-primary:not(.btn-light):focus, +.btn-primary:not(.btn-light):active { + background: #6bc1f3; + border-color: #6bc1f3; +} + +.btn-outline-primary:hover, +.btn-outline-primary:focus, +.btn-outline-primary:active { + background: -webkit-gradient( + linear, + left top, + right top, + from(#da8cff), + to(#9a55ff) + ); + background: linear-gradient(to right, #da8cff, #9a55ff); + color: #000000; +} + +.btn-inverse-secondary { + background-color: rgba(195, 189, 189, 0.2); + background-image: none; + border-color: rgba(195, 189, 189, 0); +} +.btn-inverse-secondary:not(.btn-inverse-light) { + color: #c3bdbd; +} +.btn-inverse-secondary:hover { + color: #ffffff; + background-color: #c3bdbd; + border-color: #c3bdbd; +} +.btn-inverse-secondary.focus, +.btn-inverse-secondary:focus { + -webkit-box-shadow: 0 0 0 3px rgba(195, 189, 189, 0.5); + box-shadow: 0 0 0 3px rgba(195, 189, 189, 0.5); +} +.btn-inverse-secondary.disabled, +.btn-inverse-secondary:disabled { + color: #c3bdbd; + background-color: transparent; +} +.btn-inverse-secondary.active, +.btn-inverse-secondary:active, +.show > .btn-inverse-secondary.dropdown-toggle { + color: #ffffff; + background-color: #c3bdbd; + border-color: #c3bdbd; +} + +.btn-secondary:not(.btn-light) { + color: #ffffff; +} +.btn-secondary:not(.btn-light):hover, +.btn-secondary:not(.btn-light):focus, +.btn-secondary:not(.btn-light):active { + color: #ffffff; +} +.btn-secondary:not(.btn-light):focus, +.btn-secondary:not(.btn-light):active { + background: #c3bdbd; + border-color: #c3bdbd; +} + +.btn-outline-secondary:hover, +.btn-outline-secondary:focus, +.btn-outline-secondary:active { + background: -webkit-gradient( + linear, + left top, + right top, + from(#e7ebf0), + to(#868e96) + ); + background: linear-gradient(to right, #e7ebf0, #868e96); + color: #000000; +} + +.btn-inverse-success { + background-color: rgba(27, 207, 180, 0.2); + background-image: none; + border-color: rgba(27, 207, 180, 0); +} +.btn-inverse-success:not(.btn-inverse-light) { + color: #1bcfb4; +} +.btn-inverse-success:hover { + color: #ffffff; + background-color: #1bcfb4; + border-color: #1bcfb4; +} +.btn-inverse-success.focus, +.btn-inverse-success:focus { + -webkit-box-shadow: 0 0 0 3px rgba(27, 207, 180, 0.5); + box-shadow: 0 0 0 3px rgba(27, 207, 180, 0.5); +} +.btn-inverse-success.disabled, +.btn-inverse-success:disabled { + color: #1bcfb4; + background-color: transparent; +} +.btn-inverse-success.active, +.btn-inverse-success:active, +.show > .btn-inverse-success.dropdown-toggle { + color: #ffffff; + background-color: #1bcfb4; + border-color: #1bcfb4; +} + +.btn-success:not(.btn-light) { + color: #ffffff; +} +.btn-success:not(.btn-light):hover, +.btn-success:not(.btn-light):focus, +.btn-success:not(.btn-light):active { + color: #ffffff; +} +.btn-success:not(.btn-light):focus, +.btn-success:not(.btn-light):active { + background: #1bcfb4; + border-color: #1bcfb4; +} + +.btn-outline-success:hover, +.btn-outline-success:focus, +.btn-outline-success:active { + background: -webkit-gradient( + linear, + left top, + right top, + from(#84d9d2), + to(#07cdae) + ); + background: linear-gradient(to right, #84d9d2, #07cdae); + color: #000000; +} + +.btn-inverse-info { + background-color: rgba(25, 138, 227, 0.2); + background-image: none; + border-color: rgba(25, 138, 227, 0); +} +.btn-inverse-info:not(.btn-inverse-light) { + color: #198ae3; +} +.btn-inverse-info:hover { + color: #ffffff; + background-color: #198ae3; + border-color: #198ae3; +} +.btn-inverse-info.focus, +.btn-inverse-info:focus { + -webkit-box-shadow: 0 0 0 3px rgba(25, 138, 227, 0.5); + box-shadow: 0 0 0 3px rgba(25, 138, 227, 0.5); +} +.btn-inverse-info.disabled, +.btn-inverse-info:disabled { + color: #198ae3; + background-color: transparent; +} +.btn-inverse-info.active, +.btn-inverse-info:active, +.show > .btn-inverse-info.dropdown-toggle { + color: #ffffff; + background-color: #198ae3; + border-color: #198ae3; +} + +.btn-info:not(.btn-light) { + color: #ffffff; +} +.btn-info:not(.btn-light):hover, +.btn-info:not(.btn-light):focus, +.btn-info:not(.btn-light):active { + color: #ffffff; +} +.btn-info:not(.btn-light):focus, +.btn-info:not(.btn-light):active { + background: #198ae3; + border-color: #198ae3; +} + +.btn-outline-info:hover, +.btn-outline-info:focus, +.btn-outline-info:active { + background: -webkit-gradient( + linear, + left top, + right top, + from(#90caf9), + color-stop(99%, #047edf) + ); + background: linear-gradient(to right, #90caf9, #047edf 99%); + color: #000000; +} + +.btn-inverse-warning { + background-color: rgba(254, 215, 19, 0.2); + background-image: none; + border-color: rgba(254, 215, 19, 0); +} +.btn-inverse-warning:not(.btn-inverse-light) { + color: #fed713; +} +.btn-inverse-warning:hover { + color: #ffffff; + background-color: #fed713; + border-color: #fed713; +} +.btn-inverse-warning.focus, +.btn-inverse-warning:focus { + -webkit-box-shadow: 0 0 0 3px rgba(254, 215, 19, 0.5); + box-shadow: 0 0 0 3px rgba(254, 215, 19, 0.5); +} +.btn-inverse-warning.disabled, +.btn-inverse-warning:disabled { + color: #fed713; + background-color: transparent; +} +.btn-inverse-warning.active, +.btn-inverse-warning:active, +.show > .btn-inverse-warning.dropdown-toggle { + color: #ffffff; + background-color: #fed713; + border-color: #fed713; +} + +.btn-warning:not(.btn-light) { + color: #ffffff; +} +.btn-warning:not(.btn-light):hover, +.btn-warning:not(.btn-light):focus, +.btn-warning:not(.btn-light):active { + color: #ffffff; +} +.btn-warning:not(.btn-light):focus, +.btn-warning:not(.btn-light):active { + background: #fed713; + border-color: #fed713; +} + +.btn-outline-warning:hover, +.btn-outline-warning:focus, +.btn-outline-warning:active { + background: -webkit-gradient( + linear, + left top, + right top, + from(#f6e384), + to(#ffd500) + ); + background: linear-gradient(to right, #f6e384, #ffd500); + color: #000000; +} + +.btn-inverse-danger { + background-color: rgba(254, 124, 150, 0.2); + background-image: none; + border-color: rgba(254, 124, 150, 0); +} +.btn-inverse-danger:not(.btn-inverse-light) { + color: #fe7c96; +} +.btn-inverse-danger:hover { + color: #ffffff; + background-color: #fe7c96; + border-color: #fe7c96; +} +.btn-inverse-danger.focus, +.btn-inverse-danger:focus { + -webkit-box-shadow: 0 0 0 3px rgba(254, 124, 150, 0.5); + box-shadow: 0 0 0 3px rgba(254, 124, 150, 0.5); +} +.btn-inverse-danger.disabled, +.btn-inverse-danger:disabled { + color: #fe7c96; + background-color: transparent; +} +.btn-inverse-danger.active, +.btn-inverse-danger:active, +.show > .btn-inverse-danger.dropdown-toggle { + color: #ffffff; + background-color: #fe7c96; + border-color: #fe7c96; +} + +.btn-danger:not(.btn-light) { + color: #ffffff; +} +.btn-danger:not(.btn-light):hover, +.btn-danger:not(.btn-light):focus, +.btn-danger:not(.btn-light):active { + color: #ffffff; +} +.btn-danger:not(.btn-light):focus, +.btn-danger:not(.btn-light):active { + background: #fe7c96; + border-color: #fe7c96; +} + +.btn-outline-danger:hover, +.btn-outline-danger:focus, +.btn-outline-danger:active { + background: -webkit-gradient( + linear, + left top, + right top, + from(#ffbf96), + to(#fe7096) + ); + background: linear-gradient(to right, #ffbf96, #fe7096); + color: #000000; +} + +.btn-inverse-light { + background-color: rgba(248, 249, 250, 0.2); + background-image: none; + border-color: rgba(248, 249, 250, 0); +} +.btn-inverse-light:not(.btn-inverse-light) { + color: #f8f9fa; +} +.btn-inverse-light:hover { + color: #ffffff; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-inverse-light.focus, +.btn-inverse-light:focus { + -webkit-box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5); +} +.btn-inverse-light.disabled, +.btn-inverse-light:disabled { + color: #f8f9fa; + background-color: transparent; +} +.btn-inverse-light.active, +.btn-inverse-light:active, +.show > .btn-inverse-light.dropdown-toggle { + color: #ffffff; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:not(.btn-light) { + color: #ffffff; +} +.btn-light:not(.btn-light):hover, +.btn-light:not(.btn-light):focus, +.btn-light:not(.btn-light):active { + color: #ffffff; +} +.btn-light:not(.btn-light):focus, +.btn-light:not(.btn-light):active { + background: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:hover, +.btn-outline-light:focus, +.btn-outline-light:active { + background: -webkit-gradient( + linear, + left top, + left bottom, + from(#f4f4f4), + to(#e4e4e9) + ); + background: linear-gradient(to bottom, #f4f4f4, #e4e4e9); + color: #000000; +} + +.btn-inverse-dark { + background-color: rgba(62, 75, 91, 0.2); + background-image: none; + border-color: rgba(62, 75, 91, 0); +} +.btn-inverse-dark:not(.btn-inverse-light) { + color: #3e4b5b; +} +.btn-inverse-dark:hover { + color: #ffffff; + background-color: #3e4b5b; + border-color: #3e4b5b; +} +.btn-inverse-dark.focus, +.btn-inverse-dark:focus { + -webkit-box-shadow: 0 0 0 3px rgba(62, 75, 91, 0.5); + box-shadow: 0 0 0 3px rgba(62, 75, 91, 0.5); +} +.btn-inverse-dark.disabled, +.btn-inverse-dark:disabled { + color: #3e4b5b; + background-color: transparent; +} +.btn-inverse-dark.active, +.btn-inverse-dark:active, +.show > .btn-inverse-dark.dropdown-toggle { + color: #ffffff; + background-color: #3e4b5b; + border-color: #3e4b5b; +} + +.btn-dark:not(.btn-light) { + color: #ffffff; +} +.btn-dark:not(.btn-light):hover, +.btn-dark:not(.btn-light):focus, +.btn-dark:not(.btn-light):active { + color: #ffffff; +} +.btn-dark:not(.btn-light):focus, +.btn-dark:not(.btn-light):active { + background: #3e4b5b; + border-color: #3e4b5b; +} + +.btn-outline-dark:hover, +.btn-outline-dark:focus, +.btn-outline-dark:active { + background: linear-gradient(89deg, #5e7188, #3e4b5b); + color: #000000; +} + +/* gradient buttons */ +.btn-gradient-primary { + background: -webkit-gradient( + linear, + left top, + right top, + from(#da8cff), + to(#9a55ff) + ); + background: linear-gradient(to right, #da8cff, #9a55ff); + border: 0; + -webkit-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} +.btn-gradient-primary:not([disabled]):not(.disabled):active, +.btn-gradient-primary:not([disabled]):not(.disabled).active, +.show > .btn-gradient-primary.dropdown-toggle { + background: -webkit-gradient( + linear, + left top, + right top, + from(#da8cff), + to(#9a55ff) + ); + background: linear-gradient(to right, #da8cff, #9a55ff); +} +.btn-gradient-primary:hover { + opacity: 0.8; +} +.btn-gradient-primary:not(.btn-gradient-light) { + color: #ffffff; +} +.btn-gradient-primary:not(.btn-gradient-light):hover, +.btn-gradient-primary:not(.btn-gradient-light):focus, +.btn-gradient-primary:not(.btn-gradient-light):active { + color: #ffffff; +} + +.btn-gradient-secondary { + background: -webkit-gradient( + linear, + left top, + right top, + from(#e7ebf0), + to(#868e96) + ); + background: linear-gradient(to right, #e7ebf0, #868e96); + border: 0; + -webkit-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} +.btn-gradient-secondary:not([disabled]):not(.disabled):active, +.btn-gradient-secondary:not([disabled]):not(.disabled).active, +.show > .btn-gradient-secondary.dropdown-toggle { + background: -webkit-gradient( + linear, + left top, + right top, + from(#e7ebf0), + to(#868e96) + ); + background: linear-gradient(to right, #e7ebf0, #868e96); +} +.btn-gradient-secondary:hover { + opacity: 0.8; +} +.btn-gradient-secondary:not(.btn-gradient-light) { + color: #ffffff; +} +.btn-gradient-secondary:not(.btn-gradient-light):hover, +.btn-gradient-secondary:not(.btn-gradient-light):focus, +.btn-gradient-secondary:not(.btn-gradient-light):active { + color: #ffffff; +} + +.btn-gradient-success { + background: -webkit-gradient( + linear, + left top, + right top, + from(#84d9d2), + to(#07cdae) + ); + background: linear-gradient(to right, #84d9d2, #07cdae); + border: 0; + -webkit-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} +.btn-gradient-success:not([disabled]):not(.disabled):active, +.btn-gradient-success:not([disabled]):not(.disabled).active, +.show > .btn-gradient-success.dropdown-toggle { + background: -webkit-gradient( + linear, + left top, + right top, + from(#84d9d2), + to(#07cdae) + ); + background: linear-gradient(to right, #84d9d2, #07cdae); +} +.btn-gradient-success:hover { + opacity: 0.8; +} +.btn-gradient-success:not(.btn-gradient-light) { + color: #ffffff; +} +.btn-gradient-success:not(.btn-gradient-light):hover, +.btn-gradient-success:not(.btn-gradient-light):focus, +.btn-gradient-success:not(.btn-gradient-light):active { + color: #ffffff; +} + +.btn-gradient-info { + background: -webkit-gradient( + linear, + left top, + right top, + from(#90caf9), + color-stop(99%, #047edf) + ); + background: linear-gradient(to right, #90caf9, #047edf 99%); + border: 0; + -webkit-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} +.btn-gradient-info:not([disabled]):not(.disabled):active, +.btn-gradient-info:not([disabled]):not(.disabled).active, +.show > .btn-gradient-info.dropdown-toggle { + background: -webkit-gradient( + linear, + left top, + right top, + from(#90caf9), + color-stop(99%, #047edf) + ); + background: linear-gradient(to right, #90caf9, #047edf 99%); +} +.btn-gradient-info:hover { + opacity: 0.8; +} +.btn-gradient-info:not(.btn-gradient-light) { + color: #ffffff; +} +.btn-gradient-info:not(.btn-gradient-light):hover, +.btn-gradient-info:not(.btn-gradient-light):focus, +.btn-gradient-info:not(.btn-gradient-light):active { + color: #ffffff; +} + +.btn-gradient-warning { + background: -webkit-gradient( + linear, + left top, + right top, + from(#f6e384), + to(#ffd500) + ); + background: linear-gradient(to right, #f6e384, #ffd500); + border: 0; + -webkit-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} +.btn-gradient-warning:not([disabled]):not(.disabled):active, +.btn-gradient-warning:not([disabled]):not(.disabled).active, +.show > .btn-gradient-warning.dropdown-toggle { + background: -webkit-gradient( + linear, + left top, + right top, + from(#f6e384), + to(#ffd500) + ); + background: linear-gradient(to right, #f6e384, #ffd500); +} +.btn-gradient-warning:hover { + opacity: 0.8; +} +.btn-gradient-warning:not(.btn-gradient-light) { + color: #ffffff; +} +.btn-gradient-warning:not(.btn-gradient-light):hover, +.btn-gradient-warning:not(.btn-gradient-light):focus, +.btn-gradient-warning:not(.btn-gradient-light):active { + color: #ffffff; +} + +.btn-gradient-danger { + background: -webkit-gradient( + linear, + left top, + right top, + from(#ffbf96), + to(#fe7096) + ); + background: linear-gradient(to right, #ffbf96, #fe7096); + border: 0; + -webkit-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} +.btn-gradient-danger:not([disabled]):not(.disabled):active, +.btn-gradient-danger:not([disabled]):not(.disabled).active, +.show > .btn-gradient-danger.dropdown-toggle { + background: -webkit-gradient( + linear, + left top, + right top, + from(#ffbf96), + to(#fe7096) + ); + background: linear-gradient(to right, #ffbf96, #fe7096); +} +.btn-gradient-danger:hover { + opacity: 0.8; +} +.btn-gradient-danger:not(.btn-gradient-light) { + color: #ffffff; +} +.btn-gradient-danger:not(.btn-gradient-light):hover, +.btn-gradient-danger:not(.btn-gradient-light):focus, +.btn-gradient-danger:not(.btn-gradient-light):active { + color: #ffffff; +} + +.btn-gradient-light { + background: -webkit-gradient( + linear, + left top, + left bottom, + from(#f4f4f4), + to(#e4e4e9) + ); + background: linear-gradient(to bottom, #f4f4f4, #e4e4e9); + border: 0; + -webkit-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} +.btn-gradient-light:not([disabled]):not(.disabled):active, +.btn-gradient-light:not([disabled]):not(.disabled).active, +.show > .btn-gradient-light.dropdown-toggle { + background: -webkit-gradient( + linear, + left top, + left bottom, + from(#f4f4f4), + to(#e4e4e9) + ); + background: linear-gradient(to bottom, #f4f4f4, #e4e4e9); +} +.btn-gradient-light:hover { + opacity: 0.8; +} +.btn-gradient-light:not(.btn-gradient-light) { + color: #ffffff; +} +.btn-gradient-light:not(.btn-gradient-light):hover, +.btn-gradient-light:not(.btn-gradient-light):focus, +.btn-gradient-light:not(.btn-gradient-light):active { + color: #ffffff; +} + +.btn-gradient-dark { + background: linear-gradient(89deg, #5e7188, #3e4b5b); + border: 0; + -webkit-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} +.btn-gradient-dark:not([disabled]):not(.disabled):active, +.btn-gradient-dark:not([disabled]):not(.disabled).active, +.show > .btn-gradient-dark.dropdown-toggle { + background: linear-gradient(89deg, #5e7188, #3e4b5b); +} +.btn-gradient-dark:hover { + opacity: 0.8; +} +.btn-gradient-dark:not(.btn-gradient-light) { + color: #ffffff; +} +.btn-gradient-dark:not(.btn-gradient-light):hover, +.btn-gradient-dark:not(.btn-gradient-light):focus, +.btn-gradient-dark:not(.btn-gradient-light):active { + color: #ffffff; +} + +/* Breadcrumbs */ +.breadcrumb { + border: 1px solid #ebedf2; +} +.breadcrumb .breadcrumb-item { + font-size: 0.875rem; +} +.breadcrumb .breadcrumb-item.active { + color: rgba(52, 58, 64, 0.8); +} +.breadcrumb.breadcrumb-custom { + padding: 0 0; + border-color: #dbe3e6; +} +.breadcrumb.breadcrumb-custom .breadcrumb-item { + font-size: 0.875rem; + background: #dbe3e6; + padding: 0.56rem 10px; + color: #000000; + display: inline-block; + vertical-align: top; +} +.breadcrumb.breadcrumb-custom .breadcrumb-item:last-child { + background: transparent; +} +.breadcrumb.breadcrumb-custom .breadcrumb-item:before { + content: ""; +} +.breadcrumb.breadcrumb-custom .breadcrumb-item a { + position: relative; + color: inherit; + border: 1px solid #dbe3e6; + display: inline-block; + vertical-align: top; +} +.breadcrumb.breadcrumb-custom .breadcrumb-item a:before, +.breadcrumb.breadcrumb-custom .breadcrumb-item a:after { + position: absolute; + top: -9px; + width: 0; + height: 0; + content: ""; + border-top: 21px solid transparent; + border-bottom: 21px solid transparent; +} +.breadcrumb.breadcrumb-custom .breadcrumb-item a:before { + right: -22px; + z-index: 3; + border-left-color: #dbe3e6; + border-left-style: solid; + border-left-width: 12px; +} +.breadcrumb.breadcrumb-custom .breadcrumb-item a:after { + border-top: 21px solid transparent; + border-bottom: 22px solid transparent; + border-left: 12px solid #ffffff; + top: -9px; + right: -23px; +} +.breadcrumb.breadcrumb-custom .breadcrumb-item span { + display: inline-block; + vertical-align: top; +} +.breadcrumb.breadcrumb-custom .breadcrumb-item.active { + color: rgba(52, 58, 64, 0.8); +} +.breadcrumb.bg-success, +.breadcrumb.bg-dark, +.breadcrumb.bg-danger, +.breadcrumb.bg-warning, +.breadcrumb.bg-primary, +.breadcrumb.bg-info { + border: none; +} +.breadcrumb.bg-success .breadcrumb-item, +.breadcrumb.bg-dark .breadcrumb-item, +.breadcrumb.bg-danger .breadcrumb-item, +.breadcrumb.bg-warning .breadcrumb-item, +.breadcrumb.bg-primary .breadcrumb-item, +.breadcrumb.bg-info .breadcrumb-item { + color: #ffffff; +} +.breadcrumb.bg-success .breadcrumb-item:before, +.breadcrumb.bg-dark .breadcrumb-item:before, +.breadcrumb.bg-danger .breadcrumb-item:before, +.breadcrumb.bg-warning .breadcrumb-item:before, +.breadcrumb.bg-primary .breadcrumb-item:before, +.breadcrumb.bg-info .breadcrumb-item:before { + color: inherit; +} +.breadcrumb.bg-success .breadcrumb-item a, +.breadcrumb.bg-success .breadcrumb-item span, +.breadcrumb.bg-dark .breadcrumb-item a, +.breadcrumb.bg-dark .breadcrumb-item span, +.breadcrumb.bg-danger .breadcrumb-item a, +.breadcrumb.bg-danger .breadcrumb-item span, +.breadcrumb.bg-warning .breadcrumb-item a, +.breadcrumb.bg-warning .breadcrumb-item span, +.breadcrumb.bg-primary .breadcrumb-item a, +.breadcrumb.bg-primary .breadcrumb-item span, +.breadcrumb.bg-info .breadcrumb-item a, +.breadcrumb.bg-info .breadcrumb-item span { + color: inherit; +} + +/* inverse breadcrumb */ +.bg-inverse-primary, +.image-grouped .text-avatar { + background: #f6edff; + border-color: #6bc1f3; +} +.bg-inverse-primary .breadcrumb-item, +.image-grouped .text-avatar .breadcrumb-item { + color: #6bc1f3; +} +.bg-inverse-primary .breadcrumb-item:before, +.image-grouped .text-avatar .breadcrumb-item:before { + color: inherit; +} +.bg-inverse-primary .breadcrumb-item a, +.image-grouped .text-avatar .breadcrumb-item a { + color: inherit; +} +.bg-inverse-primary.breadcrumb-custom, +.image-grouped .breadcrumb-custom.text-avatar { + background: transparent; +} +.bg-inverse-primary.breadcrumb-custom .breadcrumb-item, +.image-grouped .breadcrumb-custom.text-avatar .breadcrumb-item { + background: #f6edff; +} +.bg-inverse-primary.breadcrumb-custom .breadcrumb-item a, +.image-grouped .breadcrumb-custom.text-avatar .breadcrumb-item a { + color: #6bc1f3; + border: none; +} +.bg-inverse-primary.breadcrumb-custom .breadcrumb-item a:before, +.image-grouped .breadcrumb-custom.text-avatar .breadcrumb-item a:before { + border-left-color: #f6edff; +} +.bg-inverse-primary.breadcrumb-custom .breadcrumb-item span, +.image-grouped .breadcrumb-custom.text-avatar .breadcrumb-item span { + color: #6bc1f3; +} +.bg-inverse-primary.breadcrumb-custom .breadcrumb-item:last-child, +.image-grouped .breadcrumb-custom.text-avatar .breadcrumb-item:last-child { + background: transparent; +} + +.bg-inverse-secondary { + background: white; + border-color: #c3bdbd; +} +.bg-inverse-secondary .breadcrumb-item { + color: #c3bdbd; +} +.bg-inverse-secondary .breadcrumb-item:before { + color: inherit; +} +.bg-inverse-secondary .breadcrumb-item a { + color: inherit; +} +.bg-inverse-secondary.breadcrumb-custom { + background: transparent; +} +.bg-inverse-secondary.breadcrumb-custom .breadcrumb-item { + background: white; +} +.bg-inverse-secondary.breadcrumb-custom .breadcrumb-item a { + color: #c3bdbd; + border: none; +} +.bg-inverse-secondary.breadcrumb-custom .breadcrumb-item a:before { + border-left-color: white; +} +.bg-inverse-secondary.breadcrumb-custom .breadcrumb-item span { + color: #c3bdbd; +} +.bg-inverse-secondary.breadcrumb-custom .breadcrumb-item:last-child { + background: transparent; +} + +.bg-inverse-success { + background: #7ceedd; + border-color: #1bcfb4; +} +.bg-inverse-success .breadcrumb-item { + color: #1bcfb4; +} +.bg-inverse-success .breadcrumb-item:before { + color: inherit; +} +.bg-inverse-success .breadcrumb-item a { + color: inherit; +} +.bg-inverse-success.breadcrumb-custom { + background: transparent; +} +.bg-inverse-success.breadcrumb-custom .breadcrumb-item { + background: #7ceedd; +} +.bg-inverse-success.breadcrumb-custom .breadcrumb-item a { + color: #1bcfb4; + border: none; +} +.bg-inverse-success.breadcrumb-custom .breadcrumb-item a:before { + border-left-color: #7ceedd; +} +.bg-inverse-success.breadcrumb-custom .breadcrumb-item span { + color: #1bcfb4; +} +.bg-inverse-success.breadcrumb-custom .breadcrumb-item:last-child { + background: transparent; +} + +.bg-inverse-info { + background: #89c4f2; + border-color: #198ae3; +} +.bg-inverse-info .breadcrumb-item { + color: #198ae3; +} +.bg-inverse-info .breadcrumb-item:before { + color: inherit; +} +.bg-inverse-info .breadcrumb-item a { + color: inherit; +} +.bg-inverse-info.breadcrumb-custom { + background: transparent; +} +.bg-inverse-info.breadcrumb-custom .breadcrumb-item { + background: #89c4f2; +} +.bg-inverse-info.breadcrumb-custom .breadcrumb-item a { + color: #198ae3; + border: none; +} +.bg-inverse-info.breadcrumb-custom .breadcrumb-item a:before { + border-left-color: #89c4f2; +} +.bg-inverse-info.breadcrumb-custom .breadcrumb-item span { + color: #198ae3; +} +.bg-inverse-info.breadcrumb-custom .breadcrumb-item:last-child { + background: transparent; +} + +.bg-inverse-warning { + background: #ffed92; + border-color: #fed713; +} +.bg-inverse-warning .breadcrumb-item { + color: #fed713; +} +.bg-inverse-warning .breadcrumb-item:before { + color: inherit; +} +.bg-inverse-warning .breadcrumb-item a { + color: inherit; +} +.bg-inverse-warning.breadcrumb-custom { + background: transparent; +} +.bg-inverse-warning.breadcrumb-custom .breadcrumb-item { + background: #ffed92; +} +.bg-inverse-warning.breadcrumb-custom .breadcrumb-item a { + color: #fed713; + border: none; +} +.bg-inverse-warning.breadcrumb-custom .breadcrumb-item a:before { + border-left-color: #ffed92; +} +.bg-inverse-warning.breadcrumb-custom .breadcrumb-item span { + color: #fed713; +} +.bg-inverse-warning.breadcrumb-custom .breadcrumb-item:last-child { + background: transparent; +} + +.bg-inverse-danger { + background: #fffbfb; + border-color: #fe7c96; +} +.bg-inverse-danger .breadcrumb-item { + color: #fe7c96; +} +.bg-inverse-danger .breadcrumb-item:before { + color: inherit; +} +.bg-inverse-danger .breadcrumb-item a { + color: inherit; +} +.bg-inverse-danger.breadcrumb-custom { + background: transparent; +} +.bg-inverse-danger.breadcrumb-custom .breadcrumb-item { + background: #fffbfb; +} +.bg-inverse-danger.breadcrumb-custom .breadcrumb-item a { + color: #fe7c96; + border: none; +} +.bg-inverse-danger.breadcrumb-custom .breadcrumb-item a:before { + border-left-color: #fffbfb; +} +.bg-inverse-danger.breadcrumb-custom .breadcrumb-item span { + color: #fe7c96; +} +.bg-inverse-danger.breadcrumb-custom .breadcrumb-item:last-child { + background: transparent; +} + +.bg-inverse-light { + background: white; + border-color: #f8f9fa; +} +.bg-inverse-light .breadcrumb-item { + color: #f8f9fa; +} +.bg-inverse-light .breadcrumb-item:before { + color: inherit; +} +.bg-inverse-light .breadcrumb-item a { + color: inherit; +} +.bg-inverse-light.breadcrumb-custom { + background: transparent; +} +.bg-inverse-light.breadcrumb-custom .breadcrumb-item { + background: white; +} +.bg-inverse-light.breadcrumb-custom .breadcrumb-item a { + color: #f8f9fa; + border: none; +} +.bg-inverse-light.breadcrumb-custom .breadcrumb-item a:before { + border-left-color: white; +} +.bg-inverse-light.breadcrumb-custom .breadcrumb-item span { + color: #f8f9fa; +} +.bg-inverse-light.breadcrumb-custom .breadcrumb-item:last-child { + background: transparent; +} + +.bg-inverse-dark { + background: #778aa2; + border-color: #3e4b5b; +} +.bg-inverse-dark .breadcrumb-item { + color: #3e4b5b; +} +.bg-inverse-dark .breadcrumb-item:before { + color: inherit; +} +.bg-inverse-dark .breadcrumb-item a { + color: inherit; +} +.bg-inverse-dark.breadcrumb-custom { + background: transparent; +} +.bg-inverse-dark.breadcrumb-custom .breadcrumb-item { + background: #778aa2; +} +.bg-inverse-dark.breadcrumb-custom .breadcrumb-item a { + color: #3e4b5b; + border: none; +} +.bg-inverse-dark.breadcrumb-custom .breadcrumb-item a:before { + border-left-color: #778aa2; +} +.bg-inverse-dark.breadcrumb-custom .breadcrumb-item span { + color: #3e4b5b; +} +.bg-inverse-dark.breadcrumb-custom .breadcrumb-item:last-child { + background: transparent; +} + +/* Cards */ +.card { + border: 0; + background: #fff; +} +.card .card-body { + padding: 2.5rem 2.5rem; +} +.card .card-body + .card-body { + padding-top: 1rem; +} +.card .card-title { + color: #343a40; + margin-bottom: 0.75rem; + text-transform: capitalize; + font-family: "ubuntu-medium", sans-serif; + font-size: 1.125rem; +} +.card .card-subtitle { + font-family: "ubuntu-regular", sans-serif; + margin-top: 0.625rem; + margin-bottom: 0.625rem; +} +.card .card-description { + color: #76838f; + margin-bottom: 1.5rem; + font-family: "ubuntu-regular", sans-serif; +} +.card.card-outline-success { + border: 1px solid theme-color("success"); +} +.card.card-outline-primary { + border: 1px solid theme-color("primary"); +} +.card.card-outline-warning { + border: 1px solid theme-color("warning"); +} +.card.card-outline-danger { + border: 1px solid theme-color("danger"); +} +.card.card-rounded { + border-radius: 5px; +} +.card.card-faded { + background: #b5b0b2; + border-color: #b5b0b2; +} +.card.card-circle-progress { + color: #ffffff; + text-align: center; +} +.card.card-img-holder { + position: relative; +} +.card.card-img-holder .card-img-absolute { + position: absolute; + top: 0; + right: 0; + height: 100%; +} +.card.bg-blue-gradient { + background: -webkit-gradient( + linear, + left top, + right top, + from(#065efd), + color-stop(#3169fd), + to(#6f79fc) + ); + background: linear-gradient(to right, #065efd, #3169fd, #6f79fc); + color: #fff; +} +.card.bg-orange-gradient { + background: -webkit-gradient( + linear, + left top, + right top, + from(#ff7f2e), + to(#fe7452) + ); + background: linear-gradient(to right, #ff7f2e, #fe7452); + color: #fff; +} +.card.bg-green-gradient { + background: -webkit-gradient( + linear, + left top, + right top, + from(#24e8a6), + to(#09cdd1) + ); + background: linear-gradient(to right, #24e8a6, #09cdd1); + color: #fff; +} +.card.card-no-shadow { + -webkit-box-shadow: none; + box-shadow: none; +} + +@media (min-width: 576px) { + .card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns .card { + display: inline-block; + width: 100%; + margin-bottom: 0.75rem; + } +} + +.card-inverse-primary { + background: rgba(182, 109, 255, 0.2); + border: 1px solid theme-color-level(#6bc1f3, 1); + color: theme-color-level(#6bc1f3, 3); +} + +.card-inverse-secondary { + background: rgba(195, 189, 189, 0.2); + border: 1px solid theme-color-level(#c3bdbd, 1); + color: theme-color-level(#c3bdbd, 3); +} + +.card-inverse-success { + background: rgba(27, 207, 180, 0.2); + border: 1px solid theme-color-level(#1bcfb4, 1); + color: theme-color-level(#1bcfb4, 3); +} + +.card-inverse-info { + background: rgba(25, 138, 227, 0.2); + border: 1px solid theme-color-level(#198ae3, 1); + color: theme-color-level(#198ae3, 3); +} + +.card-inverse-warning { + background: rgba(254, 215, 19, 0.2); + border: 1px solid theme-color-level(#fed713, 1); + color: theme-color-level(#fed713, 3); +} + +.card-inverse-danger { + background: rgba(254, 124, 150, 0.2); + border: 1px solid theme-color-level(#fe7c96, 1); + color: theme-color-level(#fe7c96, 3); +} + +.card-inverse-light { + background: rgba(248, 249, 250, 0.2); + border: 1px solid theme-color-level(#f8f9fa, 1); + color: theme-color-level(#f8f9fa, 3); +} + +.card-inverse-dark { + background: rgba(62, 75, 91, 0.2); + border: 1px solid theme-color-level(#3e4b5b, 1); + color: theme-color-level(#3e4b5b, 3); +} + +/* Checkboxes and Radios */ +.form-check { + position: relative; + display: block; + margin-top: 15px; + margin-bottom: 10px; + padding-left: 0; +} +.form-check .form-check-label { + display: block; + margin-left: 1.75rem; + font-size: 0.875rem; + line-height: 1.5; +} +.rtl .form-check .form-check-label { + margin-left: 0; + margin-right: 1.75rem; +} +.form-check .form-check-label input { + position: absolute; + top: 0; + left: 0; + margin-left: 0; + margin-top: 0; + z-index: 1; + cursor: pointer; + opacity: 0; + filter: alpha(opacity=0); +} +.rtl .form-check .form-check-label input { + left: auto; + right: 0; +} +.form-check .form-check-label input[type="checkbox"] + .input-helper:before, +.form-check .form-check-label input[type="checkbox"] + .input-helper:after { + position: absolute; + top: 0; + left: 0; +} +.rtl + .form-check + .form-check-label + input[type="checkbox"] + + .input-helper:before, +.rtl + .form-check + .form-check-label + input[type="checkbox"] + + .input-helper:after { + left: auto; + right: 0; +} +.form-check .form-check-label input[type="checkbox"] + .input-helper:before { + content: ""; + width: 18px; + height: 18px; + border-radius: 2px; + border: solid #6bc1f3; + border-width: 2px; + -webkit-transition: all; + transition: all; + transition-duration: 0s; + -webkit-transition-duration: 250ms; + transition-duration: 250ms; +} +.form-check .form-check-label input[type="checkbox"] + .input-helper:after { + -webkit-transition: all; + transition: all; + transition-duration: 0s; + -webkit-transition-duration: 250ms; + transition-duration: 250ms; + font-family: Material Design Icons; + opacity: 0; + filter: alpha(opacity=0); + -webkit-transform: scale(0); + transform: scale(0); + content: "\F12C"; + font-size: 0.9375rem; + font-weight: bold; + color: #ffffff; +} +.form-check + .form-check-label + input[type="checkbox"]:checked + + .input-helper:before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#da8cff), + to(#9a55ff) + ); + background: linear-gradient(to right, #da8cff, #9a55ff); + border-width: 0; +} +.form-check + .form-check-label + input[type="checkbox"]:checked + + .input-helper:after { + width: 18px; + opacity: 1; + line-height: 18px; + filter: alpha(opacity=100); + -webkit-transform: scale(1); + transform: scale(1); +} +.form-check + .form-check-label + input[type="checkbox"]:disabled + + .input-helper:before { + border-color: #ebedf2; +} +.form-check + .form-check-label + input[type="checkbox"]:disabled:checked + + .input-helper:after { + background: #ebedf2; + color: #ffffff; +} +.form-check .form-check-label input[type="radio"] + .input-helper:before { + position: absolute; + content: ""; + top: 0; + left: 0; + border: solid #6bc1f3; + border-width: 2px; + width: 20px; + height: 20px; + border-radius: 50%; + -webkit-transition: all; + transition: all; + transition-duration: 0s; + -webkit-transition-duration: 250ms; + transition-duration: 250ms; +} +.rtl .form-check .form-check-label input[type="radio"] + .input-helper:before { + left: auto; + right: 0; +} +.form-check .form-check-label input[type="radio"] + .input-helper:after { + content: ""; + width: 8px; + height: 8px; + background: #ffffff; + border-radius: 50%; + top: 6px; + left: 6px; + -webkit-transition: all; + transition: all; + transition-duration: 0s; + -webkit-transition-duration: 250ms; + transition-duration: 250ms; + opacity: 0; + filter: alpha(opacity=0); + -webkit-transform: scale(0); + transform: scale(0); + position: absolute; +} +.rtl .form-check .form-check-label input[type="radio"] + .input-helper:after { + left: auto; + right: 6px; +} +.form-check + .form-check-label + input[type="radio"]:checked + + .input-helper:before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#da8cff), + to(#9a55ff) + ); + background: linear-gradient(to right, #da8cff, #9a55ff); + border-width: 0; +} +.form-check + .form-check-label + input[type="radio"]:checked + + .input-helper:after { + opacity: 1; + line-height: 1.5; + filter: alpha(opacity=100); + -webkit-transform: scale(1); + transform: scale(1); +} +.form-check + .form-check-label + input[type="radio"]:disabled + + .input-helper:before { + border-color: #ebedf2; +} +.form-check + .form-check-label + input[type="radio"]:disabled:checked + + .input-helper:before { + background: #ebedf2; +} +.form-check + .form-check-label + input[type="radio"]:disabled:checked + + .input-helper:after { + background: #ffffff; +} + +.form-check-primary.form-check + label + input[type="checkbox"] + + .input-helper:before, +.form-check-primary.form-check + label + input[type="radio"] + + .input-helper:before { + border-color: theme-color(primary); +} + +.form-check-primary.form-check + label + input[type="checkbox"]:checked + + .input-helper:before, +.form-check-primary.form-check + label + input[type="radio"]:checked + + .input-helper:before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#da8cff), + to(#9a55ff) + ); + background: linear-gradient(to right, #da8cff, #9a55ff); +} + +.form-check-secondary.form-check + label + input[type="checkbox"] + + .input-helper:before, +.form-check-secondary.form-check + label + input[type="radio"] + + .input-helper:before { + border-color: theme-color(secondary); +} + +.form-check-secondary.form-check + label + input[type="checkbox"]:checked + + .input-helper:before, +.form-check-secondary.form-check + label + input[type="radio"]:checked + + .input-helper:before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#e7ebf0), + to(#868e96) + ); + background: linear-gradient(to right, #e7ebf0, #868e96); +} + +.form-check-success.form-check + label + input[type="checkbox"] + + .input-helper:before, +.form-check-success.form-check + label + input[type="radio"] + + .input-helper:before { + border-color: theme-color(success); +} + +.form-check-success.form-check + label + input[type="checkbox"]:checked + + .input-helper:before, +.form-check-success.form-check + label + input[type="radio"]:checked + + .input-helper:before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#84d9d2), + to(#07cdae) + ); + background: linear-gradient(to right, #84d9d2, #07cdae); +} + +.form-check-info.form-check label input[type="checkbox"] + .input-helper:before, +.form-check-info.form-check label input[type="radio"] + .input-helper:before { + border-color: theme-color(info); +} + +.form-check-info.form-check + label + input[type="checkbox"]:checked + + .input-helper:before, +.form-check-info.form-check + label + input[type="radio"]:checked + + .input-helper:before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#90caf9), + color-stop(99%, #047edf) + ); + background: linear-gradient(to right, #90caf9, #047edf 99%); +} + +.form-check-warning.form-check + label + input[type="checkbox"] + + .input-helper:before, +.form-check-warning.form-check + label + input[type="radio"] + + .input-helper:before { + border-color: theme-color(warning); +} + +.form-check-warning.form-check + label + input[type="checkbox"]:checked + + .input-helper:before, +.form-check-warning.form-check + label + input[type="radio"]:checked + + .input-helper:before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#f6e384), + to(#ffd500) + ); + background: linear-gradient(to right, #f6e384, #ffd500); +} + +.form-check-danger.form-check + label + input[type="checkbox"] + + .input-helper:before, +.form-check-danger.form-check label input[type="radio"] + .input-helper:before { + border-color: theme-color(danger); +} + +.form-check-danger.form-check + label + input[type="checkbox"]:checked + + .input-helper:before, +.form-check-danger.form-check + label + input[type="radio"]:checked + + .input-helper:before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#ffbf96), + to(#fe7096) + ); + background: linear-gradient(to right, #ffbf96, #fe7096); +} + +.form-check-light.form-check + label + input[type="checkbox"] + + .input-helper:before, +.form-check-light.form-check label input[type="radio"] + .input-helper:before { + border-color: theme-color(light); +} + +.form-check-light.form-check + label + input[type="checkbox"]:checked + + .input-helper:before, +.form-check-light.form-check + label + input[type="radio"]:checked + + .input-helper:before { + background: -webkit-gradient( + linear, + left top, + left bottom, + from(#f4f4f4), + to(#e4e4e9) + ); + background: linear-gradient(to bottom, #f4f4f4, #e4e4e9); +} + +.form-check-dark.form-check label input[type="checkbox"] + .input-helper:before, +.form-check-dark.form-check label input[type="radio"] + .input-helper:before { + border-color: theme-color(dark); +} + +.form-check-dark.form-check + label + input[type="checkbox"]:checked + + .input-helper:before, +.form-check-dark.form-check + label + input[type="radio"]:checked + + .input-helper:before { + background: linear-gradient(89deg, #5e7188, #3e4b5b); +} + +/* Dropdowns */ +.dropdown .dropdown-toggle:after { + border-top: 0; + border-right: 0; + border-left: 0; + border-bottom: 0; + font: normal normal normal 24px/1 "Material Design Icons"; + content: "\f140"; + width: auto; + height: auto; + vertical-align: baseline; + font-size: 0.75rem; +} + +.dropdown .dropdown-menu { + margin-top: 0.75rem; + font-size: 0.875rem; + -webkit-box-shadow: 0px 1px 15px 1px rgba(230, 234, 236, 0.35); + box-shadow: 0px 1px 15px 1px rgba(230, 234, 236, 0.35); +} +.dropdown .dropdown-menu .dropdown-item { + font-size: 1rem; + padding: 0.25rem 1.5rem; +} +.dropdown .dropdown-menu .dropdown-item:active { + background: initial; +} +.dropdown .dropdown-menu .dropdown-item:hover { + background-color: #f8f9fa; + color: #ffffff; +} + +/* Forms */ +.form-group { + margin-bottom: 1.5rem; +} + +.input-group-append, +.input-group-prepend { + color: #c9c8c8; + width: auto; + border: none; +} +.input-group-append .input-group-text, +.input-group-prepend .input-group-text { + border-color: #ebedf2; + padding: 0.94rem 0.75rem; + color: #c9c8c8; +} + +.form-control { + border: 1px solid #ebedf2; + font-family: "ubuntu-regular", sans-serif; + font-size: 0.8125rem; +} +.form-control:focus { + background-color: #ffffff; + color: #000000; + outline: none; +} + +select.form-control { + padding: 0.4375rem 0.75rem; + border: 0; + outline: 1px solid #ebedf2; + color: #c9c8c8; +} +select.form-control:focus { + outline: 1px solid #ebedf2; +} +select.form-control.border-primary { + outline: 1px solid #6bc1f3; +} +select.form-control.border-primary:focus { + outline: 1px solid #6bc1f3; +} +select.form-control.border-secondary, +select.form-control.loader-demo-box { + outline: 1px solid #c3bdbd; +} +select.form-control.border-secondary:focus, +select.form-control.loader-demo-box:focus { + outline: 1px solid #c3bdbd; +} +select.form-control.border-success { + outline: 1px solid #1bcfb4; +} +select.form-control.border-success:focus { + outline: 1px solid #1bcfb4; +} +select.form-control.border-info { + outline: 1px solid #198ae3; +} +select.form-control.border-info:focus { + outline: 1px solid #198ae3; +} +select.form-control.border-warning { + outline: 1px solid #fed713; +} +select.form-control.border-warning:focus { + outline: 1px solid #fed713; +} +select.form-control.border-danger { + outline: 1px solid #fe7c96; +} +select.form-control.border-danger:focus { + outline: 1px solid #fe7c96; +} +select.form-control.border-light { + outline: 1px solid #f8f9fa; +} +select.form-control.border-light:focus { + outline: 1px solid #f8f9fa; +} +select.form-control.border-dark { + outline: 1px solid #3e4b5b; +} +select.form-control.border-dark:focus { + outline: 1px solid #3e4b5b; +} + +.form-group label { + font-size: 0.875rem; + line-height: 1; + vertical-align: top; + margin-bottom: 0.5rem; +} + +.form-group.has-danger .form-control { + border-color: #fe7c96; +} + +.form-group .file-upload-default { + visibility: hidden; + position: absolute; +} + +.form-group .file-upload-info { + background: transparent; +} + +/* Icons */ +.icons-list { + border-left: 1px solid #ebedf2; + border-top: 1px solid #ebedf2; +} +.icons-list > div { + border-bottom: 1px solid #ebedf2; + border-right: 1px solid #ebedf2; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 15px 15px; + font-family: "ubuntu-regular", sans-serif; + font-size: 0.875rem; +} +.icons-list > div i { + display: inline-block; + font-size: 20px; + width: 40px; + text-align: left; + color: #6bc1f3; +} + +/* Lists */ +ul, +ol, +dl { + padding-left: 1rem; + font-size: 0.875rem; +} +ul li, +ol li, +dl li { + line-height: 1.8; +} + +.list-ticked, +.list-arrow, +.list-star { + list-style: none; + padding: 0; +} +.list-ticked li, +.list-arrow li, +.list-star li { + padding-left: 1.5rem; +} +.list-ticked li:before, +.list-arrow li:before, +.list-star li:before { + font-family: "Material Design Icons"; + margin-left: -1.5rem; + width: 1.5rem; + margin-right: 0.5rem; +} + +.list-ticked li:before { + content: "\F12D"; + color: #fe7c96; +} + +.list-arrow li:before { + content: "\F142"; + color: #1bcfb4; +} + +.list-star li:before { + content: "\F4CE"; + color: #fed713; +} + +.gradient-bullet-list { + padding-left: 0; +} +.rtl .gradient-bullet-list { + padding-right: 0; +} +.gradient-bullet-list li { + position: relative; + list-style-type: none; + padding-left: 25px; + line-height: 1; + padding-bottom: 25px; +} +.gradient-bullet-list li:before, +.gradient-bullet-list li:after { + content: ""; + position: absolute; +} +.gradient-bullet-list li:before { + top: 0; + left: 0; + width: 15px; + height: 15px; + border-radius: 100%; +} +.gradient-bullet-list li:after { + width: 11px; + height: 11px; + top: 2px; + left: 2px; + background: #fff; + border-radius: 100%; +} +.gradient-bullet-list li:nth-child(1):before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#ffbf96), + to(#fe7096) + ); + background: linear-gradient(to right, #ffbf96, #fe7096); +} +.gradient-bullet-list li:nth-child(2):before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#90caf9), + color-stop(99%, #047edf) + ); + background: linear-gradient(to right, #90caf9, #047edf 99%); +} +.gradient-bullet-list li:nth-child(3):before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#f6e384), + to(#ffd500) + ); + background: linear-gradient(to right, #f6e384, #ffd500); +} +.gradient-bullet-list li:nth-child(4):before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#84d9d2), + to(#07cdae) + ); + background: linear-gradient(to right, #84d9d2, #07cdae); +} +.gradient-bullet-list li:nth-child(5):before { + background: -webkit-gradient( + linear, + left top, + right top, + from(#da8cff), + to(#9a55ff) + ); + background: linear-gradient(to right, #da8cff, #9a55ff); +} + +.bullet-line-list { + padding-left: 30px; + margin-bottom: 0; + position: relative; + list-style-type: none; +} +.rtl .bullet-line-list { + padding-right: 0px; +} +.bullet-line-list li { + position: relative; + line-height: 1; + padding-bottom: 10px; +} +.bullet-line-list li:before { + content: ""; + position: absolute; + border-radius: 100%; + width: 12px; + height: 12px; + left: -28px; + top: 6px; + border: 3px solid #6bc1f3; + margin-right: 15px; + z-index: 2; + background: color(white); +} +.bullet-line-list li:after { + content: ""; + border: 1px solid #ebedf2; + position: absolute; + bottom: 0; + left: -23px; + height: 100%; +} +.bullet-line-list li:first-child:after { + content: ""; + height: 80%; +} +.bullet-line-list li:last-child { + padding-bottom: 0; +} +.bullet-line-list li:last-child:after { + content: ""; + top: 0; + height: 30%; +} + +/* Preview */ +.preview-list .preview-item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + padding: 0.75rem 1.5rem; + font-size: 0.875rem; +} +.preview-list .preview-item:last-child { + border-bottom: 0; +} +.preview-list .preview-item:hover { + background: #e9ecef; +} +.preview-list .preview-item .form-check { + margin-top: 8px; + margin-right: 1rem; +} +.preview-list .preview-item .preview-thumbnail { + color: color(white); + position: relative; +} +.preview-list .preview-item .preview-thumbnail img, +.preview-list .preview-item .preview-thumbnail .preview-icon { + width: 36px; + height: 36px; + border-radius: 100%; +} +.preview-list .preview-item .preview-thumbnail .preview-icon { + padding: 6px; + text-align: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.preview-list .preview-item .preview-thumbnail .preview-icon i { + font-size: 1.125rem; + margin: 0; +} +.preview-list .preview-item .preview-thumbnail .badge { + border: 2px solid color(white); + border-radius: 100%; + bottom: 5px; + display: block; + height: 14px; + left: -5px; + padding: 0; + position: absolute; + width: 14px; +} +.preview-list .preview-item .preview-item-content { + line-height: 1; + padding-left: 15px; +} +.preview-list .preview-item .preview-item-content:first-child { + padding-left: 0; +} +.preview-list .preview-item .preview-item-content p { + margin-bottom: 10px; +} +.preview-list .preview-item .preview-item-content p .content-category { + font-family: "source-sans-pro-semibold", sans-serif; + padding-right: 15px; + border-right: 1px solid #ebedf2; +} +.rtl .preview-list .preview-item .preview-item-content { + padding-left: 0; + padding-right: 1rem; + margin-right: 0; + margin-left: auto; +} +.preview-list .preview-item .preview-actions { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; +} +.preview-list .preview-item .preview-actions i { + width: 29px; + color: color(gray-lightest); + height: 29px; + border: 2px solid color(gray-lightest); + border-radius: 100%; + padding: 3px 6px; + display: inline-block; +} +.preview-list .preview-item .preview-actions i:first-child { + margin-right: 10px; +} + +.preview-list.comment-preview .preview-item { + padding: 0.87rem 0; +} +.preview-list.comment-preview .preview-item:first-child { + padding-top: 0; +} +.preview-list.comment-preview .preview-item p { + line-height: 27px; +} + +.preview-list.bordered .preview-item { + border-bottom: 1px solid #ebedf2; +} +.preview-list.bordered .preview-item:last-child { + border-bottom: 0; +} + +/* Tables */ +.table { + margin-bottom: 0; +} +.table thead th { + border-top: 0; + border-bottom-width: 1px; + font-family: "ubuntu-medium", sans-serif; + font-weight: initial; +} +.table thead th i { + margin-left: 0.325rem; +} +.table th, +.table td { + vertical-align: middle; + font-size: 0.875rem; + line-height: 1; + white-space: nowrap; + padding: 0.9375rem; +} +.table th img, +.table td img { + width: 36px; + height: 36px; + border-radius: 100%; +} +.table th .badge, +.table td .badge { + margin-bottom: 0; +} +.table.table-borderless { + border: none; +} +.table.table-borderless tr, +.table.table-borderless td, +.table.table-borderless th { + border: none; +} + +.table > :not(:last-child) > :last-child > *, +.jsgrid .jsgrid-table > :not(:last-child) > :last-child > * { + border-bottom-color: #ebedf2; +} + +.table > :not(:first-child), +.jsgrid .jsgrid-table > :not(:first-child) { + border-top: none; +} + +/* Tabs */ +.add-items { + margin-bottom: 1.5rem; + overflow: hidden; +} +.add-items input[type="text"] { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + width: 100%; + background: transparent; +} +.add-items .btn { + margin-left: 0.5rem; +} +.rtl .add-items .btn { + margin-left: auto; + margin-right: 0.5rem; +} + +.list-wrapper { + height: 100%; + max-height: 100%; +} +.list-wrapper ul { + padding: 0; + text-align: left; + list-style: none; + margin-bottom: 0; +} +.list-wrapper ul li { + font-size: 0.9375rem; + padding: 0.4rem 0; + border-bottom: 1px solid #ebedf2; +} +.list-wrapper ul li:first-child { + border-bottom: none; +} +.list-wrapper ul li .form-check { + max-width: 90%; + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} +.list-wrapper input[type="checkbox"] { + margin-right: 15px; +} +.list-wrapper .remove { + cursor: pointer; + font-size: 1.438rem; + font-weight: 600; + width: 1.25rem; + height: 1.25rem; + line-height: 20px; + text-align: center; +} +.list-wrapper .completed { + text-decoration: line-through; + -webkit-text-decoration-color: #198ae3; + text-decoration-color: #198ae3; +} + +/*-------------------------------------------------------------------*/ +/* === Landing screens === */ +/* Auth */ +.auth .auth-form-light { + background: #ffffff; +} +.auth .auth-form-light select { + color: #c9c8c8; +} +.auth .auth-form-light .input-group .form-control:focus, +.auth .auth-form-light .input-group .form-control:active { + border-color: #ebedf2; +} + +.auth .brand-logo { + margin-bottom: 2rem; +} +.auth .brand-logo img { + width: 150px; +} + +.auth form .form-group { + margin-bottom: 1.5rem; +} +.auth form .form-group label { + font-size: 0.8125rem; +} +.auth form .form-group .form-control { + background: transparent; + border-radius: 0; + font-size: 0.9375rem; +} + +.auth form .auth-form-btn { + height: 50px; + line-height: 1.5; +} + +.auth form .auth-link { + font-size: 0.875rem; +} +.auth form .auth-link:hover { + color: initial; +} + +/* Navbar */ +.navbar { + font-family: "ubuntu-light", sans-serif; + background: #fff; + transition: background 0.25s ease; + -webkit-transition: background 0.25s ease; + -moz-transition: background 0.25s ease; + -ms-transition: background 0.25s ease; +} +.navbar .navbar-brand { + width: 110px; +} +.navbar .navbar-brand-wrapper { + transition: width 0.25s ease, background 0.25s ease; + -webkit-transition: width 0.25s ease, background 0.25s ease; + -moz-transition: width 0.25s ease, background 0.25s ease; + -ms-transition: width 0.25s ease, background 0.25s ease; + background: #fff; + width: 260px; + height: 70px; +} +@media (max-width: 991px) { + .navbar .navbar-brand-wrapper { + width: 55px; + } +} +.navbar .navbar-brand-wrapper .navbar-brand { + color: #27367f; + font-size: 1.5rem; + line-height: 48px; + margin-right: 0; + padding: 0.25rem 0; + width: 100%; +} +.navbar .navbar-brand-wrapper .navbar-brand:active, +.navbar .navbar-brand-wrapper .navbar-brand:focus, +.navbar .navbar-brand-wrapper .navbar-brand:hover { + color: #1b2658; +} +.navbar .navbar-brand-wrapper .navbar-brand img { + width: calc(260px - 120px); + max-width: 100%; + height: 28px; + margin: auto; + vertical-align: middle; +} +.navbar .navbar-brand-wrapper .navbar-brand.brand-logo-mini { + display: none; +} +.navbar .navbar-brand-wrapper .navbar-brand.brand-logo-mini img { + width: calc(80px - 50px); + max-width: 100%; + height: 50px; + margin: auto; + object-fit: cover; +} +.navbar .navbar-menu-wrapper { + transition: width 0.25s ease; + -webkit-transition: width 0.25s ease; + -moz-transition: width 0.25s ease; + -ms-transition: width 0.25s ease; + color: #9c9fa6; + padding-left: 24px; + padding-right: 24px; + width: calc(100% - 260px); + height: 70px; +} +@media (max-width: 991px) { + .navbar .navbar-menu-wrapper { + width: auto; + padding-left: 15px; + padding-right: 15px; + } +} +.navbar .navbar-menu-wrapper .navbar-toggler { + border: 0; + color: inherit; + height: 70px; + border-radius: 0px; + padding-left: 5px; + padding-right: 20px; +} +.navbar .navbar-menu-wrapper .navbar-toggler:focus { + -webkit-box-shadow: none; + box-shadow: none; +} +.navbar .navbar-menu-wrapper .navbar-toggler:not(.navbar-toggler-right) { + font-size: 1.5rem; +} +@media (max-width: 991px) { + .navbar .navbar-menu-wrapper .navbar-toggler:not(.navbar-toggler-right) { + display: none; + } +} +@media (max-width: 991px) { + .navbar .navbar-menu-wrapper .navbar-toggler.navbar-toggler-right { + padding-left: 15px; + padding-right: 11px; + border-right: none; + } +} +.navbar .navbar-menu-wrapper .search-field .input-group input { + font-size: 0.875rem; + padding: 0.5rem; +} +.navbar + .navbar-menu-wrapper + .search-field + .input-group + input:-ms-input-placeholder { + font-size: 0.875rem; + color: #9c9fa6; + font-family: "ubuntu-light", sans-serif; +} +.navbar .navbar-menu-wrapper .search-field .input-group input:-moz-placeholder { + font-size: 0.875rem; + color: #9c9fa6; + font-family: "ubuntu-light", sans-serif; +} +.navbar + .navbar-menu-wrapper + .search-field + .input-group + input::-moz-placeholder { + font-size: 0.875rem; + color: #9c9fa6; + font-family: "ubuntu-light", sans-serif; +} +.navbar + .navbar-menu-wrapper + .search-field + .input-group + input::-webkit-input-placeholder { + font-size: 0.875rem; + color: #9c9fa6; + font-family: "ubuntu-light", sans-serif; +} +.navbar .navbar-menu-wrapper .search-field .input-group i { + font-size: 17px; + margin-right: 0; + color: #9c9fa6; +} +.navbar .navbar-menu-wrapper .search-field .input-group .input-group-text { + background: transparent; +} +.navbar .navbar-menu-wrapper .count-indicator { + position: relative; +} +.navbar .navbar-menu-wrapper .count-indicator .count-symbol, +.navbar .navbar-menu-wrapper .count-indicator .count-number { + position: absolute; + border-radius: 100%; + border: 2px solid #ffffff; +} +.navbar .navbar-menu-wrapper .count-indicator .count-symbol { + top: 17px; + right: -3px; + width: 10px; + height: 10px; +} +.navbar .navbar-menu-wrapper .count-indicator .count-number { + min-width: 14px; + height: 14px; + font-size: 0.5rem; + color: #ffffff; + bottom: 16px; + right: -5px; + line-height: 1; + text-align: center; +} +.navbar .navbar-menu-wrapper .count-indicator:after { + display: none; +} +.navbar .navbar-menu-wrapper .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.navbar .navbar-menu-wrapper .navbar-nav .nav-item .nav-link { + color: inherit; + font-size: 0.875rem; + margin-left: 1.5rem; + margin-right: 1.5rem; + height: 70px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +@media (max-width: 767px) { + .navbar .navbar-menu-wrapper .navbar-nav .nav-item .nav-link { + margin-left: 0.8rem; + margin-right: 0.8rem; + } +} +.navbar .navbar-menu-wrapper .navbar-nav .nav-item .nav-link i { + font-size: 1.25rem; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .dropdown-toggle:after { + color: #6bc1f3; + font-size: 1rem; +} +.navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu { + border: none; + border-radius: 5px; + -webkit-box-shadow: 0px 3px 21px 0px rgba(0, 0, 0, 0.2); + box-shadow: 0px 3px 21px 0px rgba(0, 0, 0, 0.2); +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .dropdown-menu.navbar-dropdown { + position: absolute; + font-size: 0.9rem; + margin-top: 0; + padding: 0; +} +.rtl + .navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .dropdown-menu.navbar-dropdown { + right: auto; + left: 0; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .dropdown-menu.navbar-dropdown + .dropdown-item { + margin-bottom: 0; + padding: 11px 13px; + cursor: pointer; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .dropdown-menu.navbar-dropdown + .dropdown-item + i { + font-size: 17px; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .dropdown-menu.navbar-dropdown + .dropdown-item + .ellipsis { + max-width: 200px; + overflow: hidden; + text-overflow: ellipsis; +} +.rtl + .navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .dropdown-menu.navbar-dropdown + .dropdown-item + i { + margin-left: 10px; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .dropdown-menu.navbar-dropdown + .dropdown-divider { + margin: 0; +} +@media (max-width: 991px) { + .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown { + position: static; + } + .navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.dropdown + .navbar-dropdown { + left: 20px; + right: 20px; + top: 70px; + width: calc(100% - 40px); + } +} +.navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-settings { + padding-left: 20px; + padding-right: 5px; +} +.navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-settings .nav-link { + margin-right: 0; + margin-left: 0; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.nav-profile + .nav-link + .nav-profile-img { + position: relative; + width: 32px; + height: 32px; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.nav-profile + .nav-link + .nav-profile-img + img { + width: 32px; + height: 32px; + border-radius: 100%; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.nav-profile + .nav-link + .nav-profile-img + .availability-status { + position: absolute; + width: 10px; + height: 10px; + border-radius: 100%; + border: 2px solid #ffffff; + bottom: 5px; + right: -5px; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.nav-profile + .nav-link + .nav-profile-img + .availability-status.online { + background: #1bcfb4; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.nav-profile + .nav-link + .nav-profile-img + .availability-status.offline { + background: #fe7c96; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.nav-profile + .nav-link + .nav-profile-img + .availability-status.busy { + background: #fed713; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.nav-profile + .nav-link + .nav-profile-text { + margin-left: 1.25rem; +} +.rtl + .navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.nav-profile + .nav-link + .nav-profile-text { + margin-left: 0; + margin-right: 1.25rem; +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.nav-profile + .nav-link + .nav-profile-text + p { + line-height: 1; +} +@media (max-width: 767px) { + .navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.nav-profile + .nav-link + .nav-profile-text { + display: none; + } +} +.navbar + .navbar-menu-wrapper + .navbar-nav + .nav-item.nav-profile + .nav-link.dropdown-toggle:after { + line-height: 2; +} +@media (min-width: 992px) { + .navbar .navbar-menu-wrapper .navbar-nav.navbar-nav-right { + margin-left: auto; + } + .rtl .navbar .navbar-menu-wrapper .navbar-nav.navbar-nav-right { + margin-left: 0; + margin-right: auto; + } +} + +@media (max-width: 991px) { + .navbar { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar .navbar-brand-wrapper { + width: 75px; + } + .navbar .navbar-brand-wrapper .navbar-brand.brand-logo { + display: none; + } + .navbar .navbar-brand-wrapper .navbar-brand.brand-logo-mini { + display: inline-block; + } + .navbar-collapse { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin-top: 0.5rem; + } +} + +@media (max-width: 480px) { + .navbar .navbar-brand-wrapper { + width: 55px; + } + .navbar .navbar-brand-wrapper .brand-logo-mini { + padding-top: 0px; + } +} + +/* Navbar color variations */ +.navbar.navbar-primary .navbar-menu-wrapper { + background: -webkit-gradient( + linear, + left top, + right top, + from(#da8cff), + to(#9a55ff) + ); + background: linear-gradient(to right, #da8cff, #9a55ff); + color: #ffffff; +} +.navbar.navbar-primary + .navbar-menu-wrapper + .search-field + .input-group + input:-ms-input-placeholder { + color: #ffffff; +} +.navbar.navbar-primary + .navbar-menu-wrapper + .search-field + .input-group + input:-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-primary + .navbar-menu-wrapper + .search-field + .input-group + input::-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-primary + .navbar-menu-wrapper + .search-field + .input-group + input::-webkit-input-placeholder { + color: #ffffff; +} +.navbar.navbar-primary .navbar-menu-wrapper .search-field .input-group i { + color: #ffffff; +} + +.navbar.navbar-secondary .navbar-menu-wrapper { + background: -webkit-gradient( + linear, + left top, + right top, + from(#e7ebf0), + to(#868e96) + ); + background: linear-gradient(to right, #e7ebf0, #868e96); + color: #ffffff; +} +.navbar.navbar-secondary + .navbar-menu-wrapper + .search-field + .input-group + input:-ms-input-placeholder { + color: #ffffff; +} +.navbar.navbar-secondary + .navbar-menu-wrapper + .search-field + .input-group + input:-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-secondary + .navbar-menu-wrapper + .search-field + .input-group + input::-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-secondary + .navbar-menu-wrapper + .search-field + .input-group + input::-webkit-input-placeholder { + color: #ffffff; +} +.navbar.navbar-secondary .navbar-menu-wrapper .search-field .input-group i { + color: #ffffff; +} + +.navbar.navbar-success .navbar-menu-wrapper { + background: -webkit-gradient( + linear, + left top, + right top, + from(#84d9d2), + to(#07cdae) + ); + background: linear-gradient(to right, #84d9d2, #07cdae); + color: #ffffff; +} +.navbar.navbar-success + .navbar-menu-wrapper + .search-field + .input-group + input:-ms-input-placeholder { + color: #ffffff; +} +.navbar.navbar-success + .navbar-menu-wrapper + .search-field + .input-group + input:-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-success + .navbar-menu-wrapper + .search-field + .input-group + input::-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-success + .navbar-menu-wrapper + .search-field + .input-group + input::-webkit-input-placeholder { + color: #ffffff; +} +.navbar.navbar-success .navbar-menu-wrapper .search-field .input-group i { + color: #ffffff; +} + +.navbar.navbar-info .navbar-menu-wrapper { + background: -webkit-gradient( + linear, + left top, + right top, + from(#90caf9), + color-stop(99%, #047edf) + ); + background: linear-gradient(to right, #90caf9, #047edf 99%); + color: #ffffff; +} +.navbar.navbar-info + .navbar-menu-wrapper + .search-field + .input-group + input:-ms-input-placeholder { + color: #ffffff; +} +.navbar.navbar-info + .navbar-menu-wrapper + .search-field + .input-group + input:-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-info + .navbar-menu-wrapper + .search-field + .input-group + input::-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-info + .navbar-menu-wrapper + .search-field + .input-group + input::-webkit-input-placeholder { + color: #ffffff; +} +.navbar.navbar-info .navbar-menu-wrapper .search-field .input-group i { + color: #ffffff; +} + +.navbar.navbar-warning .navbar-menu-wrapper { + background: -webkit-gradient( + linear, + left top, + right top, + from(#f6e384), + to(#ffd500) + ); + background: linear-gradient(to right, #f6e384, #ffd500); + color: #ffffff; +} +.navbar.navbar-warning + .navbar-menu-wrapper + .search-field + .input-group + input:-ms-input-placeholder { + color: #ffffff; +} +.navbar.navbar-warning + .navbar-menu-wrapper + .search-field + .input-group + input:-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-warning + .navbar-menu-wrapper + .search-field + .input-group + input::-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-warning + .navbar-menu-wrapper + .search-field + .input-group + input::-webkit-input-placeholder { + color: #ffffff; +} +.navbar.navbar-warning .navbar-menu-wrapper .search-field .input-group i { + color: #ffffff; +} + +.navbar.navbar-danger .navbar-menu-wrapper { + background: -webkit-gradient( + linear, + left top, + right top, + from(#ffbf96), + to(#fe7096) + ); + background: linear-gradient(to right, #ffbf96, #fe7096); + color: #ffffff; +} +.navbar.navbar-danger + .navbar-menu-wrapper + .search-field + .input-group + input:-ms-input-placeholder { + color: #ffffff; +} +.navbar.navbar-danger + .navbar-menu-wrapper + .search-field + .input-group + input:-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-danger + .navbar-menu-wrapper + .search-field + .input-group + input::-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-danger + .navbar-menu-wrapper + .search-field + .input-group + input::-webkit-input-placeholder { + color: #ffffff; +} +.navbar.navbar-danger .navbar-menu-wrapper .search-field .input-group i { + color: #ffffff; +} + +.navbar.navbar-light .navbar-menu-wrapper { + background: -webkit-gradient( + linear, + left top, + left bottom, + from(#f4f4f4), + to(#e4e4e9) + ); + background: linear-gradient(to bottom, #f4f4f4, #e4e4e9); + color: #ffffff; +} +.navbar.navbar-light + .navbar-menu-wrapper + .search-field + .input-group + input:-ms-input-placeholder { + color: #ffffff; +} +.navbar.navbar-light + .navbar-menu-wrapper + .search-field + .input-group + input:-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-light + .navbar-menu-wrapper + .search-field + .input-group + input::-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-light + .navbar-menu-wrapper + .search-field + .input-group + input::-webkit-input-placeholder { + color: #ffffff; +} +.navbar.navbar-light .navbar-menu-wrapper .search-field .input-group i { + color: #ffffff; +} + +.navbar.navbar-dark .navbar-menu-wrapper { + background: linear-gradient(89deg, #5e7188, #3e4b5b); + color: #ffffff; +} +.navbar.navbar-dark + .navbar-menu-wrapper + .search-field + .input-group + input:-ms-input-placeholder { + color: #ffffff; +} +.navbar.navbar-dark + .navbar-menu-wrapper + .search-field + .input-group + input:-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-dark + .navbar-menu-wrapper + .search-field + .input-group + input::-moz-placeholder { + color: #ffffff; +} +.navbar.navbar-dark + .navbar-menu-wrapper + .search-field + .input-group + input::-webkit-input-placeholder { + color: #ffffff; +} +.navbar.navbar-dark .navbar-menu-wrapper .search-field .input-group i { + color: #ffffff; +} + +/* Sidebar */ +.sidebar { + min-height: calc(100vh - 70px); + background: #ffffff; + font-family: "ubuntu-regular", sans-serif; + padding: 0; + width: 260px; + z-index: 11; + transition: width 0.25s ease, background 0.25s ease; + -webkit-transition: width 0.25s ease, background 0.25s ease; + -moz-transition: width 0.25s ease, background 0.25s ease; + -ms-transition: width 0.25s ease, background 0.25s ease; +} +.sidebar .nav { + overflow: hidden; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + margin-bottom: 60px; +} +.sidebar .nav .nav-item { + padding: 0 2.25rem; + -webkit-transition-duration: 0.25s; + transition-duration: 0.25s; + transition-property: background; + -webkit-transition-property: background; +} +.sidebar .nav .nav-item .collapse { + z-index: 999; +} +.sidebar .nav .nav-item .nav-link { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + white-space: nowrap; + padding: 1.125rem 0 1.125rem 0; + color: #3e4b5b; + -webkit-transition-duration: 0.45s; + transition-duration: 0.45s; + transition-property: color; + -webkit-transition-property: color; +} +.sidebar .nav .nav-item .nav-link i { + color: inherit; +} +.sidebar .nav .nav-item .nav-link i.menu-icon { + font-size: 1.125rem; + line-height: 1; + margin-left: auto; + color: #bba8bff5; +} +.rtl .sidebar .nav .nav-item .nav-link i.menu-icon { + margin-left: 0; + margin-right: auto; +} +.sidebar .nav .nav-item .nav-link i.menu-icon:before { + vertical-align: middle; +} +.sidebar .nav .nav-item .nav-link i.menu-arrow { + font: normal normal normal 24px/1 "Material Design Icons"; + line-height: 1; + font-size: 1.125rem; + margin-left: auto; + color: #9e9da0; +} +.rtl .sidebar .nav .nav-item .nav-link i.menu-arrow { + margin-left: 0; + margin-right: auto; +} +.sidebar .nav .nav-item .nav-link i.menu-arrow:before { + content: "\f141"; + font-size: inherit; + color: inherit; +} +.sidebar .nav .nav-item .nav-link i.menu-arrow + .menu-icon { + margin-left: 0.25rem; +} +.rtl .sidebar .nav .nav-item .nav-link i.menu-arrow + .menu-icon { + margin-left: 0; + margin-right: 0.25rem; +} +.sidebar .nav .nav-item .nav-link .menu-title { + color: inherit; + display: inline-block; + font-size: 0.875rem; + line-height: 1; + vertical-align: middle; +} +.sidebar .nav .nav-item .nav-link .badge { + margin-right: auto; + margin-left: 1rem; +} +.sidebar .nav .nav-item .nav-link[aria-expanded="true"] .menu-arrow:before { + content: "\f140"; +} +.sidebar .nav .nav-item.active { + background: #ffffff; +} +.sidebar .nav .nav-item.active > .nav-link .menu-title { + color: #6bc1f3; + font-family: "ubuntu-medium", sans-serif; +} +.sidebar .nav .nav-item.active > .nav-link i { + color: #6bc1f3; +} +.sidebar .nav .nav-item:hover { + background: #fcfcfc; +} +.sidebar .nav .nav-item.nav-profile .nav-link { + height: auto; + line-height: 1; + border-top: 0; + padding: 1.25rem 0; +} +.sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-image { + width: 44px; + height: 44px; +} +.sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-image img { + width: 44px; + height: 44px; + border-radius: 100%; +} +.sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-text { + margin-left: 1rem; +} +.rtl .sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-text { + margin-left: auto; + margin-right: 1rem; +} +.sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-badge { + font-size: 1.125rem; + margin-left: auto; +} +.rtl .sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-badge { + margin-left: 0; + margin-right: auto; +} +.sidebar .nav .nav-item.sidebar-actions { + margin-top: 1rem; +} +.sidebar .nav .nav-item.sidebar-actions .nav-link { + border-top: 0; + display: block; + height: auto; +} +.sidebar .nav .nav-item.sidebar-actions:hover { + background: initial; +} +.sidebar .nav .nav-item.sidebar-actions:hover .nav-link { + color: initial; +} +.sidebar + .nav:not(.sub-menu) + > .nav-item:hover:not(.nav-category):not(.nav-profile) + > .nav-link { + color: #29323d; +} +.sidebar .nav.sub-menu { + margin-bottom: 20px; + margin-top: 0; + list-style: none; +} +.sidebar .nav.sub-menu .nav-item { + padding: 0; +} +.sidebar .nav.sub-menu .nav-item .nav-link { + color: #888; + padding: 0.75rem 2rem 0.75rem 2rem; + position: relative; + font-size: 0.8125rem; + line-height: 1; + height: auto; + border-top: 0; +} +.sidebar .nav.sub-menu .nav-item .nav-link:before { + content: "\F054"; + font-family: "Material Design Icons"; + display: block; + position: absolute; + left: 0px; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + color: #a2a2a2; + font-size: 0.75rem; +} +.rtl .sidebar .nav.sub-menu .nav-item .nav-link:before { + left: auto; + right: 0; +} +.sidebar .nav.sub-menu .nav-item .nav-link.active { + color: #6bc1f3; + background: transparent; +} +.sidebar .nav.sub-menu .nav-item .nav-link:hover { + color: #555555; +} +.sidebar .nav.sub-menu .nav-item:hover { + background: transparent; +} + +/* style for off-canvas menu*/ +@media screen and (max-width: 991px) { + .sidebar-offcanvas { + position: fixed; + max-height: calc(100vh - 70px); + top: 70px; + bottom: 0; + overflow: auto; + right: -260px; + -webkit-transition: all 0.25s ease-out; + transition: all 0.25s ease-out; + } + .sidebar-offcanvas.active { + right: 0; + } +} + +/* Layouts */ +.navbar.fixed-top + .page-body-wrapper { + padding-top: 70px; +} + +@media (min-width: 992px) { + .sidebar-icon-only .navbar .navbar-brand-wrapper { + width: 70px; + } + .sidebar-icon-only .navbar .navbar-brand-wrapper .brand-logo { + display: none; + } + .sidebar-icon-only .navbar .navbar-brand-wrapper .brand-logo-mini { + display: inline-block; + } + .sidebar-icon-only .navbar .navbar-menu-wrapper { + width: calc(100% - 70px); + } + .sidebar-icon-only .sidebar { + width: 70px; + } + .sidebar-icon-only .sidebar .nav { + overflow: visible; + } + .sidebar-icon-only .sidebar .nav .nav-item { + position: relative; + padding: 0; + } + .sidebar-icon-only .sidebar .nav .nav-item .nav-link { + display: block; + text-align: center; + } + .sidebar-icon-only .sidebar .nav .nav-item .nav-link .menu-title, + .sidebar-icon-only .sidebar .nav .nav-item .nav-link .badge, + .sidebar-icon-only .sidebar .nav .nav-item .nav-link .menu-sub-title { + display: none; + } + .sidebar-icon-only .sidebar .nav .nav-item .nav-link .menu-title { + border-radius: 0 5px 5px 0px; + } + .rtl.sidebar-icon-only .sidebar .nav .nav-item .nav-link .menu-title { + border-radius: 5px 0 0 5px; + } + .sidebar-icon-only .sidebar .nav .nav-item .nav-link i.menu-icon { + margin-right: 0; + margin-left: 0; + } + .sidebar-icon-only .sidebar .nav .nav-item .nav-link i.menu-arrow { + display: none; + } + .sidebar-icon-only + .sidebar + .nav + .nav-item + .nav-link[aria-expanded] + .menu-title { + border-radius: 0 5px 0 0px; + } + .rtl.sidebar-icon-only + .sidebar + .nav + .nav-item + .nav-link[aria-expanded] + .menu-title { + border-radius: 5px 0 0 0; + } + .sidebar-icon-only .sidebar .nav .nav-item.nav-profile { + display: none; + } + .sidebar-icon-only .sidebar .nav .nav-item.nav-category { + display: none; + } + .sidebar-icon-only .sidebar .nav .nav-item.nav-doc { + margin: 0; + } + .sidebar-icon-only .sidebar .nav .nav-item.nav-doc i { + display: block; + } + .sidebar-icon-only .sidebar .nav .nav-item .collapse { + display: none; + } + .sidebar-icon-only + .sidebar + .nav + .nav-item.hover-open + .nav-link + .menu-title { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background: #fcfcfc; + padding: 0.5rem 1.4rem; + left: 70px; + position: absolute; + text-align: left; + top: 0; + bottom: 0; + width: 190px; + z-index: 1; + line-height: 1.8; + } + .rtl.sidebar-icon-only + .sidebar + .nav + .nav-item.hover-open + .nav-link + .menu-title { + left: auto; + right: 70px; + text-align: left; + } + .sidebar-icon-only + .sidebar + .nav + .nav-item.hover-open + .nav-link + .menu-title:after { + display: none; + } + .sidebar-icon-only .sidebar .nav .nav-item.hover-open .collapse, + .sidebar-icon-only .sidebar .nav .nav-item.hover-open .collapsing { + display: block; + padding: 0.5rem 0; + background: #fcfcfc; + border-radius: 0 0 5px 0; + position: absolute; + left: 70px; + width: 190px; + } + .rtl.sidebar-icon-only .sidebar .nav .nav-item.hover-open .collapse, + .rtl.sidebar-icon-only .sidebar .nav .nav-item.hover-open .collapsing { + left: auto; + right: 70px; + border-radius: 0 0 0 5px; + } + .sidebar-icon-only .sidebar .nav.sub-menu { + padding: 0 0 0 1.5rem; + } + .sidebar-icon-only .sidebar .nav.sub-menu .nav-item .nav-link { + text-align: left; + padding-left: 20px; + } + .rtl.sidebar-icon-only .sidebar .nav.sub-menu .nav-item { + margin-right: auto; + margin-left: 0; + } + .rtl.sidebar-icon-only .sidebar .nav.sub-menu .nav-item .nav-link { + text-align: right; + } + .rtl.sidebar-icon-only .sidebar .nav.sub-menu .nav-item .nav-link:before { + left: 0; + right: unset; + } + .sidebar-icon-only .sidebar .sidebar-actions { + display: none; + } + .sidebar-icon-only .main-panel { + width: calc(100% - 70px); + } +} + +.rtl { + direction: rtl; + text-align: right; +} +.rtl .sidebar .nav { + padding-right: 0; +} +.rtl .product-chart-wrapper::-webkit-scrollbar, +.rtl .sidebar-fixed .nav::-webkit-scrollbar, +.rtl .table-responsive::-webkit-scrollbar, +.rtl ul.chats::-webkit-scrollbar { + width: 0.5em; +} +.rtl .product-chart-wrapper::-webkit-scrollbar-track, +.rtl .sidebar-fixed .nav::-webkit-scrollbar-track, +.rtl .table-responsive::-webkit-scrollbar-track, +.rtl ul.chats::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); +} +.rtl .product-chart-wrapper::-webkit-scrollbar-thumb, +.rtl .sidebar-fixed .nav::-webkit-scrollbar-thumb, +.rtl .table-responsive::-webkit-scrollbar-thumb, +.rtl ul.chats::-webkit-scrollbar-thumb { + background-color: darkgrey; + outline: 1px solid slategrey; +} + +.page-body-wrapper { + min-height: calc(100vh - 70px); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + padding-left: 0; + padding-right: 0; +} +.page-body-wrapper.full-page-wrapper { + width: 100%; + min-height: 100vh; +} + +.main-panel { + -webkit-transition: width 0.25s ease, margin 0.25s ease; + transition: width 0.25s ease, margin 0.25s ease; + /* width: calc(100% - 260px); */ + min-height: calc(100vh - 70px); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +@media (max-width: 991px) { + .main-panel { + margin-left: 0; + width: 100%; + } +} + +.content-wrapper { + background: #e8f4fb; + padding: 0rem 2.25rem; + width: 0%; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +/*# sourceMappingURL=style.css.map */ diff --git a/BackEnd/laravel-pos-ecommerce-backend/public/assets/css/style.css.map b/BackEnd/laravel-pos-ecommerce-backend/public/assets/css/style.css.map new file mode 100644 index 0000000..3827ea9 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/public/assets/css/style.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["style.scss","style.css","../../node_modules/compass-mixins/lib/animation/_core.scss","../../node_modules/compass-mixins/lib/animation/animate/_attention-seekers.scss","../../node_modules/compass-mixins/lib/compass/css3/_shared.scss","../../node_modules/compass-mixins/lib/compass/css3/_transform.scss","../../node_modules/compass-mixins/lib/animation/animate/bouncing/_bouncing-exits.scss","../../node_modules/compass-mixins/lib/animation/animate/bouncing/_bouncing-entrances.scss","../../node_modules/compass-mixins/lib/animation/animate/fading/_fading-exits.scss","../../node_modules/compass-mixins/lib/animation/animate/fading/_fading-entrances.scss","../../node_modules/compass-mixins/lib/animation/animate/_flippers.scss","../../node_modules/compass-mixins/lib/compass/css3/_opacity.scss","../../node_modules/compass-mixins/lib/animation/animate/_lightspeed.scss","../../node_modules/compass-mixins/lib/animation/animate/rotating/_rotating-exits.scss","../../node_modules/compass-mixins/lib/animation/animate/rotating/_rotating-entrances.scss","../../node_modules/compass-mixins/lib/animation/animate/_specials.scss","../../node_modules/bootstrap/scss/bootstrap.scss","../../node_modules/bootstrap/scss/_root.scss","../../node_modules/bootstrap/scss/_reboot.scss","../../node_modules/bootstrap/scss/vendor/_rfs.scss","_variables.scss","../../node_modules/bootstrap/scss/_variables.scss","../../node_modules/bootstrap/scss/_functions.scss","../../node_modules/bootstrap/scss/mixins/_border-radius.scss","../../node_modules/bootstrap/scss/_type.scss","../../node_modules/bootstrap/scss/mixins/_lists.scss","../../node_modules/bootstrap/scss/_images.scss","../../node_modules/bootstrap/scss/mixins/_image.scss","../../node_modules/bootstrap/scss/_containers.scss","../../node_modules/bootstrap/scss/mixins/_container.scss","../../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../../node_modules/bootstrap/scss/_grid.scss","../../node_modules/bootstrap/scss/mixins/_grid.scss","../../node_modules/bootstrap/scss/_tables.scss","../../node_modules/bootstrap/scss/mixins/_table-variants.scss","../../node_modules/bootstrap/scss/forms/_labels.scss","../../node_modules/bootstrap/scss/forms/_form-text.scss","../../node_modules/bootstrap/scss/forms/_form-control.scss","../../node_modules/bootstrap/scss/mixins/_transition.scss","../../node_modules/bootstrap/scss/mixins/_gradients.scss","../../node_modules/bootstrap/scss/forms/_form-select.scss","../../node_modules/bootstrap/scss/forms/_form-check.scss","../../node_modules/bootstrap/scss/forms/_form-range.scss","../../node_modules/bootstrap/scss/forms/_floating-labels.scss","../../node_modules/bootstrap/scss/forms/_input-group.scss","../../node_modules/bootstrap/scss/mixins/_forms.scss","../../node_modules/bootstrap/scss/_buttons.scss","../../node_modules/bootstrap/scss/mixins/_buttons.scss","../../node_modules/bootstrap/scss/_transitions.scss","../../node_modules/bootstrap/scss/_dropdown.scss","../../node_modules/bootstrap/scss/mixins/_caret.scss","../../node_modules/bootstrap/scss/_button-group.scss","../../node_modules/bootstrap/scss/_nav.scss","../../node_modules/bootstrap/scss/_navbar.scss","../../node_modules/bootstrap/scss/_card.scss","../../node_modules/bootstrap/scss/_accordion.scss","../../node_modules/bootstrap/scss/_breadcrumb.scss","../../node_modules/bootstrap/scss/_pagination.scss","../../node_modules/bootstrap/scss/mixins/_pagination.scss","../../node_modules/bootstrap/scss/_badge.scss","../../node_modules/bootstrap/scss/_alert.scss","../../node_modules/bootstrap/scss/mixins/_alert.scss","../../node_modules/bootstrap/scss/_progress.scss","../../node_modules/bootstrap/scss/_list-group.scss","../../node_modules/bootstrap/scss/mixins/_list-group.scss","../../node_modules/bootstrap/scss/_close.scss","../../node_modules/bootstrap/scss/_toasts.scss","../../node_modules/bootstrap/scss/_modal.scss","../../node_modules/bootstrap/scss/mixins/_backdrop.scss","../../node_modules/bootstrap/scss/_tooltip.scss","../../node_modules/bootstrap/scss/mixins/_reset-text.scss","../../node_modules/bootstrap/scss/_popover.scss","../../node_modules/bootstrap/scss/_carousel.scss","../../node_modules/bootstrap/scss/mixins/_clearfix.scss","../../node_modules/bootstrap/scss/_spinners.scss","../../node_modules/bootstrap/scss/_offcanvas.scss","../../node_modules/bootstrap/scss/_placeholders.scss","../../node_modules/bootstrap/scss/helpers/_colored-links.scss","../../node_modules/bootstrap/scss/helpers/_ratio.scss","../../node_modules/bootstrap/scss/helpers/_position.scss","../../node_modules/bootstrap/scss/helpers/_stacks.scss","../../node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../../node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../../node_modules/bootstrap/scss/helpers/_stretched-link.scss","../../node_modules/bootstrap/scss/helpers/_text-truncation.scss","../../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../../node_modules/bootstrap/scss/helpers/_vr.scss","../../node_modules/bootstrap/scss/mixins/_utilities.scss","../../node_modules/bootstrap/scss/utilities/_api.scss","mixins/_misc.scss","mixins/_animation.scss","_reset.scss","_fonts.scss","_functions.scss","mixins/_text.scss","_typography.scss","mixins/_blockqoute.scss","_misc.scss","_footer.scss","_utilities.scss","_demo.scss","_dashboard.scss","../../node_modules/compass-mixins/lib/compass/css3/_images.scss","../../node_modules/compass-mixins/lib/compass/functions/_cross_browser_support.scss","components/_badges.scss","mixins/_badges.scss","components/_bootstrap-progress.scss","components/_buttons.scss","mixins/_buttons.scss","components/_breadcrumbs.scss","mixins/_breadcrumbs.scss","components/_cards.scss","mixins/_cards.scss","components/_checkbox-radio.scss","components/_dropdown.scss","components/_forms.scss","components/_icons.scss","components/_lists.scss","components/_preview.scss","components/_tables.scss","components/_todo-list.scss","landing-screens/_auth.scss","_navbar.scss","../../node_modules/compass-mixins/lib/compass/css3/_user-interface.scss","_sidebar.scss","_layouts.scss","_vertical-wrapper.scss"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oEC4CoE;ADEpE,sEAAA;AACA,qDAAA;AAIA,sEAAA;AACA,sCAAA;AAGA,sEAAA;AACA,mCAAA;;AEJM;EClDJ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA,EAAA;;AD6DR;ECtEJ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA,EAAA;;ADyCR;ECpCJ;ICFuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EFtZ5B;ICJuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EFpZ5B;ICNuD,oCC0Z3B;IDrZmC,4BCqZnC,EAAA;EFlZ5B;ICRuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EFhZ5B;ICVuD,oCC0Z3B;IDrZmC,4BCqZnC,EAAA;EF9Y5B;ICZuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EF5Y5B;ICduD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA,EAAA;;AHhWxB;ECxDJ;ICFuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EFtZ5B;ICJuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EFpZ5B;ICNuD,oCC0Z3B;IDrZmC,4BCqZnC,EAAA;EFlZ5B;ICRuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EFhZ5B;ICVuD,oCC0Z3B;IDrZmC,4BCqZnC,EAAA;EF9Y5B;ICZuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EF5Y5B;ICduD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA,EAAA;;AHpXxB;EClBJ;ICpBuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA;EFtX5B;ICtBuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EFpX5B;ICxBuD,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EFlX5B;IC1BuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EFhX5B;IC5BuD,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EF9W5B;IC9BuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EF5W5B;IChCuD,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EF1W5B;IClCuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EFxW5B;ICpCuD,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EFtW5B;ICtCuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EFpW5B;ICxCuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA,EAAA;;AHlVxB;ECtCJ;ICpBuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA;EFtX5B;ICtBuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EFpX5B;ICxBuD,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EFlX5B;IC1BuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EFhX5B;IC5BuD,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EF9W5B;IC9BuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EF5W5B;IChCuD,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EF1W5B;IClCuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EFxW5B;ICpCuD,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EFtW5B;ICtCuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EFpW5B;ICxCuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA,EAAA;;AHtWxB;ECQJ;IC9CuD,8BCuOtB;IDlO8B,sBCkO9B,EAAA;EFvLjC;IChDuD,2CDiDV;IC5CkB,mCD4ClB,EAAA;EAC7C;IClDuD,2CDmDV;IC9CkB,mCD8ClB,EAAA;EAC7C;ICpDuD,0CDqDX;IChDmB,kCDgDnB,EAAA;EAC5C;ICtDuD,2CDuDV;IClDkB,mCDkDlB,EAAA;EAC7C;ICxDuD,0CDyDX;ICpDmB,kCDoDnB,EAAA;EAC5C;IC1DuD,2CD2DV;ICtDkB,mCDsDlB,EAAA;EAC7C;IC5DuD,0CD6DX;ICxDmB,kCDwDnB,EAAA;EAC5C;IC9DuD,2CD+DV;IC1DkB,mCD0DlB,EAAA;EAC7C;IChEuD,0CDiEX;IC5DmB,kCD4DnB,EAAA;EAC5C;IClEuD,qCDmEhB;IC9DwB,6BD8DxB,EAAA,EAAA;;ADTnC;ECZJ;IC9CuD,8BCuOtB;IDlO8B,sBCkO9B,EAAA;EFvLjC;IChDuD,2CDiDV;IC5CkB,mCD4ClB,EAAA;EAC7C;IClDuD,2CDmDV;IC9CkB,mCD8ClB,EAAA;EAC7C;ICpDuD,0CDqDX;IChDmB,kCDgDnB,EAAA;EAC5C;ICtDuD,2CDuDV;IClDkB,mCDkDlB,EAAA;EAC7C;ICxDuD,0CDyDX;ICpDmB,kCDoDnB,EAAA;EAC5C;IC1DuD,2CD2DV;ICtDkB,mCDsDlB,EAAA;EAC7C;IC5DuD,0CD6DX;ICxDmB,kCDwDnB,EAAA;EAC5C;IC9DuD,2CD+DV;IC1DkB,mCD0DlB,EAAA;EAC7C;IChEuD,0CDiEX;IC5DmB,kCD4DnB,EAAA;EAC5C;IClEuD,qCDmEhB;IC9DwB,6BD8DxB,EAAA,EAAA;;AD7BnC;ECkCJ;ICxEuD,wCCsC/B;IDjCuC,gCCiCvC,EAAA;EFoCxB;IC1EuD,gCCkThC;ID7SwC,wBC6SxC,EAAA;EFtOvB;IC5EuD,iCCkThC;ID7SwC,yBC6SxC,EAAA;EFpOvB;IC9EuD,+BCkThC;ID7SwC,uBC6SxC,EAAA;EFlOvB;IChFuD,gCCkThC;ID7SwC,wBC6SxC,EAAA;EFhOvB;IClFuD,+BCkThC;ID7SwC,uBC6SxC,EAAA,EAAA;;AHxPnB;ECcJ;ICxEuD,wCCsC/B;IDjCuC,gCCiCvC,EAAA;EFoCxB;IC1EuD,gCCkThC;ID7SwC,wBC6SxC,EAAA;EFtOvB;IC5EuD,iCCkThC;ID7SwC,yBC6SxC,EAAA;EFpOvB;IC9EuD,+BCkThC;ID7SwC,uBC6SxC,EAAA;EFlOvB;IChFuD,gCCkThC;ID7SwC,wBC6SxC,EAAA;EFhOvB;IClFuD,+BCkThC;ID7SwC,uBC6SxC,EAAA,EAAA;;AH5QnB;ECkDJ;ICxFuD,iCC4Y3B;IDvYmC,yBCuYnC,EAAA;EFlT5B;IC1FuD,iDD2FJ;ICtFY,yCDsFZ,EAAA;EACnD;IC5FuD,+CD6FN;ICxFc,uCDwFd,EAAA;EACjD;IC9FuD,iDD+FJ;IC1FY,yCD0FZ,EAAA;EACnD;IChGuD,+CDiGN;IC5Fc,uCD4Fd,EAAA;EACjD;IClGuD,gDDmGL;IC9Fa,wCD8Fb,EAAA;EAClD;ICpGuD,iCDqGpB;IChG4B,yBDgG5B,EAAA,EAAA;;AD3C/B;EC8BJ;ICxFuD,iCC4Y3B;IDvYmC,yBCuYnC,EAAA;EFlT5B;IC1FuD,iDD2FJ;ICtFY,yCDsFZ,EAAA;EACnD;IC5FuD,+CD6FN;ICxFc,uCDwFd,EAAA;EACjD;IC9FuD,iDD+FJ;IC1FY,yCD0FZ,EAAA;EACnD;IChGuD,+CDiGN;IC5Fc,uCD4Fd,EAAA;EACjD;IClGuD,gDDmGL;IC9Fa,wCD8Fb,EAAA;EAClD;ICpGuD,iCDqGpB;IChG4B,yBDgG5B,EAAA,EAAA;;AD/D/B;ECoEJ;IC1GuD,8BCuOtB;IDlO8B,sBCkO9B,EAAA;EF3HjC;IC5GuD,kCCuOtB;IDlO8B,0BCkO9B,EAAA;EFzHjC;IC9GuD,8BCuOtB;IDlO8B,sBCkO9B,EAAA,EAAA;;AH7K7B;ECgDJ;IC1GuD,8BCuOtB;IDlO8B,sBCkO9B,EAAA;EF3HjC;IC5GuD,kCCuOtB;IDlO8B,0BCkO9B,EAAA;EFzHjC;IC9GuD,8BCuOtB;IDlO8B,sBCkO9B,EAAA,EAAA;;AHjM7B;EC8EJ;ICpHuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EFlWtB;ICtHuD,+BCwdjC;IDndyC,uBCmdzC,EAAA;EFhWtB;ICxHuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EF9VtB;IC1HuD,+BCwdjC;IDndyC,uBCmdzC,EAAA;EF5VtB;IC5HuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EF1VtB;IC9HuD,+BCwdjC;IDndyC,uBCmdzC,EAAA;EFxVtB;IChIuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EFtVtB;IClIuD,+BCwdjC;IDndyC,uBCmdzC,EAAA;EFpVtB;ICpIuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EFlVtB;ICtIuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EFhVtB;ICxIuD,8BCwdjC;IDndyC,sBCmdzC,EAAA,EAAA;;AH9ZlB;EC0DJ;ICpHuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EFlWtB;ICtHuD,+BCwdjC;IDndyC,uBCmdzC,EAAA;EFhWtB;ICxHuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EF9VtB;IC1HuD,+BCwdjC;IDndyC,uBCmdzC,EAAA;EF5VtB;IC5HuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EF1VtB;IC9HuD,+BCwdjC;IDndyC,uBCmdzC,EAAA;EFxVtB;IChIuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EFtVtB;IClIuD,+BCwdjC;IDndyC,uBCmdzC,EAAA;EFpVtB;ICpIuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EFlVtB;ICtIuD,8BCwdjC;IDndyC,sBCmdzC,EAAA;EFhVtB;ICxIuD,8BCwdjC;IDndyC,sBCmdzC,EAAA,EAAA;;AHlblB;EIlDJ;IFYuD,8BCuOtB;IDlO8B,sBCkO9B,EAAA;ECjPjC;IFUuD,oCCuOtB;IDlO8B,4BCkO9B,EAAA;EC/OjC;IACE,UAAU;IFO2C,kCCuOtB;IDlO8B,0BCkO9B,EAAA;EC5OjC;IACE,UAAU;IFI2C,kCCuOtB;IDlO8B,0BCkO9B,EAAA,EAAA;;AH7K7B;EItEJ;IFYuD,8BCuOtB;IDlO8B,sBCkO9B,EAAA;ECjPjC;IFUuD,oCCuOtB;IDlO8B,4BCkO9B,EAAA;EC/OjC;IACE,UAAU;IFO2C,kCCuOtB;IDlO8B,0BCkO9B,EAAA;EC5OjC;IACE,UAAU;IFI2C,kCCuOtB;IDlO8B,0BCkO9B,EAAA,EAAA;;AHjM7B;EIpCJ;IFFuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;ECtZ5B;IACE,UAAU;IFL2C,mCC0Z3B;IDrZmC,2BCqZnC,EAAA;ECnZ5B;IACE,UAAU;IFR2C,sCC0Z3B;IDrZmC,8BCqZnC,EAAA,EAAA;;AHhWxB;EIxDJ;IFFuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;ECtZ5B;IACE,UAAU;IFL2C,mCC0Z3B;IDrZmC,2BCqZnC,EAAA;ECnZ5B;IACE,UAAU;IFR2C,sCC0Z3B;IDrZmC,8BCqZnC,EAAA,EAAA;;AHpXxB;EIxBJ;IFduD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EC1Y5B;IACE,UAAU;IFjB2C,oCC0Z3B;IDrZmC,4BCqZnC,EAAA;ECvY5B;IACE,UAAU;IFpB2C,qCC0Z3B;IDrZmC,6BCqZnC,EAAA,EAAA;;AHhWxB;EI5CJ;IFduD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EC1Y5B;IACE,UAAU;IFjB2C,oCC0Z3B;IDrZmC,4BCqZnC,EAAA;ECvY5B;IACE,UAAU;IFpB2C,qCC0Z3B;IDrZmC,6BCqZnC,EAAA,EAAA;;AHpXxB;EIZJ;IF1BuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA;EChX5B;IACE,UAAU;IF7B2C,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EC7W5B;IACE,UAAU;IFhC2C,sCC4Y3B;IDvYmC,8BCuYnC,EAAA,EAAA;;AHlVxB;EIhCJ;IF1BuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA;EChX5B;IACE,UAAU;IF7B2C,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EC7W5B;IACE,UAAU;IFhC2C,sCC4Y3B;IDvYmC,8BCuYnC,EAAA,EAAA;;AHtWxB;EIAJ;IFtCuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA;ECpW5B;IACE,UAAU;IFzC2C,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;ECjW5B;IACE,UAAU;IF5C2C,qCC4Y3B;IDvYmC,6BCuYnC,EAAA,EAAA;;AHlVxB;EIpBJ;IFtCuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA;ECpW5B;IACE,UAAU;IFzC2C,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;ECjW5B;IACE,UAAU;IF5C2C,qCC4Y3B;IDvYmC,6BCuYnC,EAAA,EAAA;;AHtWxB;EKlDJ;IACE,UAAU;IHW2C,kCCuOtB;IDlO8B,0BCkO9B,EAAA;EEhPjC;IACE,UAAU;IHQ2C,oCCuOtB;IDlO8B,4BCkO9B,EAAA;EE7OjC;IHMuD,kCCuOtB;IDlO8B,0BCkO9B,EAAA;EE3OjC;IHIuD,8BCuOtB;IDlO8B,sBCkO9B,EAAA,EAAA;;AH7K7B;EKtEJ;IACE,UAAU;IHW2C,kCCuOtB;IDlO8B,0BCkO9B,EAAA;EEhPjC;IACE,UAAU;IHQ2C,oCCuOtB;IDlO8B,4BCkO9B,EAAA;EE7OjC;IHMuD,kCCuOtB;IDlO8B,0BCkO9B,EAAA;EE3OjC;IHIuD,8BCuOtB;IDlO8B,sBCkO9B,EAAA,EAAA;;AHjM7B;EKpCJ;IACE,UAAU;IHH2C,sCC0Z3B;IDrZmC,8BCqZnC,EAAA;EErZ5B;IACE,UAAU;IHN2C,mCC0Z3B;IDrZmC,2BCqZnC,EAAA;EElZ5B;IHRuD,oCC0Z3B;IDrZmC,4BCqZnC,EAAA;EEhZ5B;IHVuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA,EAAA;;AHhWxB;EKxDJ;IACE,UAAU;IHH2C,sCC0Z3B;IDrZmC,8BCqZnC,EAAA;EErZ5B;IACE,UAAU;IHN2C,mCC0Z3B;IDrZmC,2BCqZnC,EAAA;EElZ5B;IHRuD,oCC0Z3B;IDrZmC,4BCqZnC,EAAA;EEhZ5B;IHVuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA,EAAA;;AHpXxB;EKtBJ;IACE,UAAU;IHjB2C,qCC0Z3B;IDrZmC,6BCqZnC,EAAA;EEvY5B;IACE,UAAU;IHpB2C,oCC0Z3B;IDrZmC,4BCqZnC,EAAA;EEpY5B;IHtBuD,mCC0Z3B;IDrZmC,2BCqZnC,EAAA;EElY5B;IHxBuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA,EAAA;;AHhWxB;EK1CJ;IACE,UAAU;IHjB2C,qCC0Z3B;IDrZmC,6BCqZnC,EAAA;EEvY5B;IACE,UAAU;IHpB2C,oCC0Z3B;IDrZmC,4BCqZnC,EAAA;EEpY5B;IHtBuD,mCC0Z3B;IDrZmC,2BCqZnC,EAAA;EElY5B;IHxBuD,gCC0Z3B;IDrZmC,wBCqZnC,EAAA,EAAA;;AHpXxB;EKRJ;IACE,UAAU;IH/B2C,qCC4Y3B;IDvYmC,6BCuYnC,EAAA;EE3W5B;IACE,UAAU;IHlC2C,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EExW5B;IHpCuD,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EEtW5B;IHtCuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA,EAAA;;AHlVxB;EK5BJ;IACE,UAAU;IH/B2C,qCC4Y3B;IDvYmC,6BCuYnC,EAAA;EE3W5B;IACE,UAAU;IHlC2C,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EExW5B;IHpCuD,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EEtW5B;IHtCuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA,EAAA;;AHtWxB;EKMJ;IACE,UAAU;IH7C2C,sCC4Y3B;IDvYmC,8BCuYnC,EAAA;EE7V5B;IACE,UAAU;IHhD2C,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EE1V5B;IHlDuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EExV5B;IHpDuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA,EAAA;;AHlVxB;EKdJ;IACE,UAAU;IH7C2C,sCC4Y3B;IDvYmC,8BCuYnC,EAAA;EE7V5B;IACE,UAAU;IHhD2C,mCC4Y3B;IDvYmC,2BCuYnC,EAAA;EE1V5B;IHlDuD,oCC4Y3B;IDvYmC,4BCuYnC,EAAA;EExV5B;IHpDuD,gCC4Y3B;IDvYmC,wBCuYnC,EAAA,EAAA;;AHtWxB;EMlDJ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA,EAAA;;ANmER;EMtEJ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA,EAAA;;AN+CR;EM1CJ;IJIuD,gCC0Z3B;IDrZmC,wBCqZnC;IG5Z1B,UAAU,EAAA;EACZ;IJCuD,oCC0Z3B;IDrZmC,4BCqZnC;IGzZ1B,UAAU,EAAA,EAAA;;ANyDR;EM9DJ;IJIuD,gCC0Z3B;IDrZmC,wBCqZnC;IG5Z1B,UAAU,EAAA;EACZ;IJCuD,oCC0Z3B;IDrZmC,4BCqZnC;IGzZ1B,UAAU,EAAA,EAAA;;ANqCR;EMhCJ;IJNuD,gCC0Z3B;IDrZmC,wBCqZnC;IGlZ1B,UAAU,EAAA;EACZ;IJTuD,mCC0Z3B;IDrZmC,2BCqZnC;IG/Y1B,UAAU,EAAA,EAAA;;AN+CR;EMpDJ;IJNuD,gCC0Z3B;IDrZmC,wBCqZnC;IGlZ1B,UAAU,EAAA;EACZ;IJTuD,mCC0Z3B;IDrZmC,2BCqZnC;IG/Y1B,UAAU,EAAA,EAAA;;AN2BR;EMtBJ;IJhBuD,gCC4Y3B;IDvYmC,wBCuYnC;IG1X1B,UAAU,EAAA;EACZ;IJnBuD,mCC4Y3B;IDvYmC,2BCuYnC;IGvX1B,UAAU,EAAA,EAAA;;ANqCR;EM1CJ;IJhBuD,gCC4Y3B;IDvYmC,wBCuYnC;IG1X1B,UAAU,EAAA;EACZ;IJnBuD,mCC4Y3B;IDvYmC,2BCuYnC;IGvX1B,UAAU,EAAA,EAAA;;ANiBR;EMZJ;IJ1BuD,gCC4Y3B;IDvYmC,wBCuYnC;IGhX1B,UAAU,EAAA;EACZ;IJ7BuD,oCC4Y3B;IDvYmC,4BCuYnC;IG7W1B,UAAU,EAAA,EAAA;;AN2BR;EMhCJ;IJ1BuD,gCC4Y3B;IDvYmC,wBCuYnC;IGhX1B,UAAU,EAAA;EACZ;IJ7BuD,oCC4Y3B;IDvYmC,4BCuYnC;IG7W1B,UAAU,EAAA,EAAA;;ANOR;EMFJ;IJpCuD,gCC0Z3B;IDrZmC,wBCqZnC;IGpX1B,UAAU,EAAA;EACZ;IJvCuD,sCC0Z3B;IDrZmC,8BCqZnC;IGjX1B,UAAU,EAAA,EAAA;;ANiBR;EMtBJ;IJpCuD,gCC0Z3B;IDrZmC,wBCqZnC;IGpX1B,UAAU,EAAA;EACZ;IJvCuD,sCC0Z3B;IDrZmC,8BCqZnC;IGjX1B,UAAU,EAAA,EAAA;;ANHR;EMQJ;IACE,UAAU;IJ/C2C,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EGzW5B;IACE,UAAU;IJlD2C,qCC0Z3B;IDrZmC,6BCqZnC,EAAA,EAAA;;AHhWxB;EMZJ;IACE,UAAU;IJ/C2C,gCC0Z3B;IDrZmC,wBCqZnC,EAAA;EGzW5B;IACE,UAAU;IJlD2C,qCC0Z3B;IDrZmC,6BCqZnC,EAAA,EAAA;;AHpXxB;EMkBJ;IACE,UAAU;IJzD2C,gCC4Y3B;IDvYmC,wBCuYnC,EAAA;EGjV5B;IACE,UAAU;IJ5D2C,qCC4Y3B;IDvYmC,6BCuYnC,EAAA,EAAA;;AHlVxB;EMFJ;IACE,UAAU;IJzD2C,gCC4Y3B;IDvYmC,wBCuYnC,EAAA;EGjV5B;IACE,UAAU;IJ5D2C,qCC4Y3B;IDvYmC,6BCuYnC,EAAA,EAAA;;AHtWxB;EM4BJ;IACE,UAAU;IJnE2C,gCC4Y3B;IDvYmC,wBCuYnC,EAAA;EGvU5B;IACE,UAAU;IJtE2C,sCC4Y3B;IDvYmC,8BCuYnC,EAAA,EAAA;;AHlVxB;EMQJ;IACE,UAAU;IJnE2C,gCC4Y3B;IDvYmC,wBCuYnC,EAAA;EGvU5B;IACE,UAAU;IJtE2C,sCC4Y3B;IDvYmC,8BCuYnC,EAAA,EAAA;;AHtWxB;EOlDJ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA,EAAA;;APmER;EOtEJ;IACE,UAAU,EAAA;EACZ;IACE,UAAU,EAAA,EAAA;;AP+CR;EO1CJ;ILIuD,mCC0Z3B;IDrZmC,2BCqZnC;II5Z1B,UAAU,EAAA;EACZ;ILCuD,gCC0Z3B;IDrZmC,wBCqZnC;IIzZ1B,UAAU,EAAA,EAAA;;APyDR;EO9DJ;ILIuD,mCC0Z3B;IDrZmC,2BCqZnC;II5Z1B,UAAU,EAAA;EACZ;ILCuD,gCC0Z3B;IDrZmC,wBCqZnC;IIzZ1B,UAAU,EAAA,EAAA;;APqCR;EOhCJ;ILNuD,oCC0Z3B;IDrZmC,4BCqZnC;IIlZ1B,UAAU,EAAA;EACZ;ILTuD,gCC0Z3B;IDrZmC,wBCqZnC;II/Y1B,UAAU,EAAA,EAAA;;AP+CR;EOpDJ;ILNuD,oCC0Z3B;IDrZmC,4BCqZnC;IIlZ1B,UAAU,EAAA;EACZ;ILTuD,gCC0Z3B;IDrZmC,wBCqZnC;II/Y1B,UAAU,EAAA,EAAA;;AP2BR;EOtBJ;ILhBuD,mCC4Y3B;IDvYmC,2BCuYnC;II1X1B,UAAU,EAAA;EACZ;ILnBuD,gCC4Y3B;IDvYmC,wBCuYnC;IIvX1B,UAAU,EAAA,EAAA;;APqCR;EO1CJ;ILhBuD,mCC4Y3B;IDvYmC,2BCuYnC;II1X1B,UAAU,EAAA;EACZ;ILnBuD,gCC4Y3B;IDvYmC,wBCuYnC;IIvX1B,UAAU,EAAA,EAAA;;APiBR;EOZJ;IL1BuD,oCC4Y3B;IDvYmC,4BCuYnC;IIhX1B,UAAU,EAAA;EACZ;IL7BuD,gCC4Y3B;IDvYmC,wBCuYnC;II7W1B,UAAU,EAAA,EAAA;;AP2BR;EOhCJ;IL1BuD,oCC4Y3B;IDvYmC,4BCuYnC;IIhX1B,UAAU,EAAA;EACZ;IL7BuD,gCC4Y3B;IDvYmC,wBCuYnC;II7W1B,UAAU,EAAA,EAAA;;APOR;EOFJ;ILpCuD,qCC0Z3B;IDrZmC,6BCqZnC;IIpX1B,UAAU,EAAA;EACZ;ILvCuD,gCC0Z3B;IDrZmC,wBCqZnC;IIjX1B,UAAU,EAAA,EAAA;;APiBR;EOtBJ;ILpCuD,qCC0Z3B;IDrZmC,6BCqZnC;IIpX1B,UAAU,EAAA;EACZ;ILvCuD,gCC0Z3B;IDrZmC,wBCqZnC;IIjX1B,UAAU,EAAA,EAAA;;APHR;EOQJ;IACE,UAAU;IL/C2C,sCC0Z3B;IDrZmC,8BCqZnC,EAAA;EIzW5B;IACE,UAAU;ILlD2C,gCC0Z3B;IDrZmC,wBCqZnC,EAAA,EAAA;;AHhWxB;EOZJ;IACE,UAAU;IL/C2C,sCC0Z3B;IDrZmC,8BCqZnC,EAAA;EIzW5B;IACE,UAAU;ILlD2C,gCC0Z3B;IDrZmC,wBCqZnC,EAAA,EAAA;;AHpXxB;EOkBJ;IACE,UAAU;ILzD2C,qCC4Y3B;IDvYmC,6BCuYnC,EAAA;EIjV5B;IACE,UAAU;IL5D2C,gCC4Y3B;IDvYmC,wBCuYnC,EAAA,EAAA;;AHlVxB;EOFJ;IACE,UAAU;ILzD2C,qCC4Y3B;IDvYmC,6BCuYnC,EAAA;EIjV5B;IACE,UAAU;IL5D2C,gCC4Y3B;IDvYmC,wBCuYnC,EAAA,EAAA;;AHtWxB;EO4BJ;IACE,UAAU;ILnE2C,sCC4Y3B;IDvYmC,8BCuYnC,EAAA;EIvU5B;IACE,UAAU;ILtE2C,gCC4Y3B;IDvYmC,wBCuYnC,EAAA,EAAA;;AHlVxB;EOQJ;IACE,UAAU;ILnE2C,sCC4Y3B;IDvYmC,8BCuYnC,EAAA;EIvU5B;IACE,UAAU;ILtE2C,gCC4Y3B;IDvYmC,wBCuYnC,EAAA,EAAA;;AHtWxB;EQlDJ;INYuD,gDMXL;INgBa,wCMhBb;INWK,2CMVV;INekB,mCMflB,EAAA;EAE7C;INQuD,uEMPkB;INYV,+DMZU;INOlB,2CMNV;INWkB,mCMXlB,EAAA;EAE7C;INIuD,gFMH2B;INQnB,wEMRmB;ING3B,0CMFX;INOmB,kCMPnB,EAAA;EAE5C;INAuD,iEMCY;INIJ,yDMJI;INDZ,0CMEX;INGmB,kCMHnB,EAAA;EAE5C;INJuD,8CMKP;INAe,sCMAf;INLO,0CMMX;INDmB,kCMCnB,EAAA,EAAA;;ARoDxC;EQtEJ;INYuD,gDMXL;INgBa,wCMhBb;INWK,2CMVV;INekB,mCMflB,EAAA;EAE7C;INQuD,uEMPkB;INYV,+DMZU;INOlB,2CMNV;INWkB,mCMXlB,EAAA;EAE7C;INIuD,gFMH2B;INQnB,wEMRmB;ING3B,0CMFX;INOmB,kCMPnB,EAAA;EAE5C;INAuD,iEMCY;INIJ,yDMJI;INDZ,0CMEX;INGmB,kCMHnB,EAAA;EAE5C;INJuD,8CMKP;INAe,sCMAf;INLO,0CMMX;INDmB,kCMCnB,EAAA,EAAA;;ARgCxC;EQzBJ;INbuD,oDMcD;INTS,4CMST;ICnBpD,0DAA4F;IAE9F,UDkBoB,EAAA;EAEpB;INjBuD,qDMkBA;INbQ,6CMaR,EAAA;EAEvD;INpBuD,oDMqBD;INhBS,4CMgBT,EAAA;EAEtD;INvBuD,mDMwBF;INnBU,2CMmBV;IC7BnD,4DAA4F;IAE9F,UD4BoB,EAAA,EAAA;;ARiChB;EQ7CJ;INbuD,oDMcD;INTS,4CMST;ICnBpD,0DAA4F;IAE9F,UDkBoB,EAAA;EAEpB;INjBuD,qDMkBA;INbQ,6CMaR,EAAA;EAEvD;INpBuD,oDMqBD;INhBS,4CMgBT,EAAA;EAEtD;INvBuD,mDMwBF;INnBU,2CMmBV;IC7BnD,4DAA4F;IAE9F,UD4BoB,EAAA,EAAA;;ARahB;EQNJ;INhCuD,mDMiCF;IN5BU,2CM4BV;ICtCnD,4DAA4F;IAE9F,UDqCoB,EAAA;EAEpB;INpCuD,oDMqCD;INhCS,4CMgCT;IC1CpD,0DAA4F;IAE9F,UDyCoB,EAAA,EAAA;;ARoBhB;EQ1BJ;INhCuD,mDMiCF;IN5BU,2CM4BV;ICtCnD,4DAA4F;IAE9F,UDqCoB,EAAA;EAEpB;INpCuD,oDMqCD;INhCS,4CMgCT;IC1CpD,0DAA4F;IAE9F,UDyCoB,EAAA,EAAA;;ARAhB;EQOJ;IN7CuD,oDM8CD;INzCS,4CMyCT;ICnDpD,0DAA4F;IAE9F,UDkDoB,EAAA;EAEpB;INjDuD,qDMkDA;IN7CQ,6CM6CR,EAAA;EAEvD;INpDuD,oDMqDD;INhDS,4CMgDT,EAAA;EAEtD;INvDuD,mDMwDF;INnDU,2CMmDV;IC7DnD,4DAA4F;IAE9F,UD4DoB,EAAA,EAAA;;ARChB;EQbJ;IN7CuD,oDM8CD;INzCS,4CMyCT;ICnDpD,0DAA4F;IAE9F,UDkDoB,EAAA;EAEpB;INjDuD,qDMkDA;IN7CQ,6CM6CR,EAAA;EAEvD;INpDuD,oDMqDD;INhDS,4CMgDT,EAAA;EAEtD;INvDuD,mDMwDF;INnDU,2CMmDV;IC7DnD,4DAA4F;IAE9F,UD4DoB,EAAA,EAAA;;ARnBhB;EQ0BJ;INhEuD,mDMiEF;IN5DU,2CM4DV;ICtEnD,4DAA4F;IAE9F,UDqEoB,EAAA;EAEpB;INpEuD,oDMqED;INhES,4CMgET;IC1EpD,0DAA4F;IAE9F,UDyEoB,EAAA,EAAA;;ARZhB;EQMJ;INhEuD,mDMiEF;IN5DU,2CM4DV;ICtEnD,4DAA4F;IAE9F,UDqEoB,EAAA;EAEpB;INpEuD,oDMqED;INhES,4CMgET;IC1EpD,0DAA4F;IAE9F,UDyEoB,EAAA,EAAA;;ARhChB;EUlDJ;IRYuD,iDQXJ;IRgBY,yCQhBZ;IDMjD,0DAA4F;IAE9F,UCPoB,EAAA;EACpB;IRSuD,gDQRL;IRaa,wCQbb;IDGhD,4DAA4F;IAE9F,UCJoB,EAAA;EACpB;IRMuD,+CQLN;IRUc,uCQVd;IDA/C,4DAA4F;IAE9F,UCDoB,EAAA;EACpB;IRGuD,6CQFR;IROgB,qCQPhB;IDH7C,4DAA4F;IAE9F,UCEoB,EAAA,EAAA;;AV2DhB;EUtEJ;IRYuD,iDQXJ;IRgBY,yCQhBZ;IDMjD,0DAA4F;IAE9F,UCPoB,EAAA;EACpB;IRSuD,gDQRL;IRaa,wCQbb;IDGhD,4DAA4F;IAE9F,UCJoB,EAAA;EACpB;IRMuD,+CQLN;IRUc,uCQVd;IDA/C,4DAA4F;IAE9F,UCDoB,EAAA;EACpB;IRGuD,6CQFR;IROgB,qCQPhB;IDH7C,4DAA4F;IAE9F,UCEoB,EAAA,EAAA;;AVuChB;EUlCJ;IRJuD,6CQKR;IRAgB,qCQAhB;IDV7C,4DAA4F;IAE9F,UCSoB,EAAA;EACpB;IRPuD,iDQQJ;IRHY,yCQGZ;IDbjD,0DAA4F;IAE9F,UCYoB,EAAA,EAAA;;AViDhB;EUtDJ;IRJuD,6CQKR;IRAgB,qCQAhB;IDV7C,4DAA4F;IAE9F,UCSoB,EAAA;EACpB;IRPuD,iDQQJ;IRHY,yCQGZ;IDbjD,0DAA4F;IAE9F,UCYoB,EAAA,EAAA;;AV6BhB;EWlDJ;ITYuD,2CCsC/B;IDjCuC,mCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IQ3TrB,UAAU,EAAA;EACZ;ITQuD,2CCsC/B;IDjCuC,mCCiCvC;IDtC+B,iCCkThC;ID7SwC,yBC6SxC;IQvTrB,UAAU,EAAA,EAAA;;AX+DR;EWtEJ;ITYuD,2CCsC/B;IDjCuC,mCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IQ3TrB,UAAU,EAAA;EACZ;ITQuD,2CCsC/B;IDjCuC,mCCiCvC;IDtC+B,iCCkThC;ID7SwC,yBC6SxC;IQvTrB,UAAU,EAAA,EAAA;;AX2CR;EWtCJ;ITAuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IQ/SrB,UAAU,EAAA;EACZ;ITJuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,gCCkThC;ID7SwC,wBC6SxC;IQ3SrB,UAAU,EAAA,EAAA;;AXmDR;EW1DJ;ITAuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IQ/SrB,UAAU,EAAA;EACZ;ITJuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,gCCkThC;ID7SwC,wBC6SxC;IQ3SrB,UAAU,EAAA,EAAA;;AX+BR;EW1BJ;ITZuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IQnSrB,UAAU,EAAA;EACZ;IThBuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,iCCkThC;ID7SwC,yBC6SxC;IQ/RrB,UAAU,EAAA,EAAA;;AXuCR;EW9CJ;ITZuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IQnSrB,UAAU,EAAA;EACZ;IThBuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,iCCkThC;ID7SwC,yBC6SxC;IQ/RrB,UAAU,EAAA,EAAA;;AXmBR;EWdJ;ITxBuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IQvRrB,UAAU,EAAA;EACZ;IT5BuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,iCCkThC;ID7SwC,yBC6SxC;IQnRrB,UAAU,EAAA,EAAA;;AX2BR;EWlCJ;ITxBuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IQvRrB,UAAU,EAAA;EACZ;IT5BuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,iCCkThC;ID7SwC,yBC6SxC;IQnRrB,UAAU,EAAA,EAAA;;AXOR;EWFJ;ITpCuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IQ3QrB,UAAU,EAAA;EACZ;ITxCuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,gCCkThC;ID7SwC,wBC6SxC;IQvQrB,UAAU,EAAA,EAAA;;AXeR;EWtBJ;ITpCuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IQ3QrB,UAAU,EAAA;EACZ;ITxCuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,gCCkThC;ID7SwC,wBC6SxC;IQvQrB,UAAU,EAAA,EAAA;;AXLR;EYlDJ;IVYuD,2CCsC/B;IDjCuC,mCCiCvC;IDtC+B,kCCkThC;ID7SwC,0BC6SxC;IS3TrB,UAAU,EAAA;EACZ;IVQuD,2CCsC/B;IDjCuC,mCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;ISvTrB,UAAU,EAAA,EAAA;;AZ+DR;EYtEJ;IVYuD,2CCsC/B;IDjCuC,mCCiCvC;IDtC+B,kCCkThC;ID7SwC,0BC6SxC;IS3TrB,UAAU,EAAA;EACZ;IVQuD,2CCsC/B;IDjCuC,mCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;ISvTrB,UAAU,EAAA,EAAA;;AZ2CR;EYtCJ;IVAuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,iCCkThC;ID7SwC,yBC6SxC;IS/SrB,UAAU,EAAA;EACZ;IVJuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IS3SrB,UAAU,EAAA,EAAA;;AZmDR;EY1DJ;IVAuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,iCCkThC;ID7SwC,yBC6SxC;IS/SrB,UAAU,EAAA;EACZ;IVJuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IS3SrB,UAAU,EAAA,EAAA;;AZ+BR;EY1BJ;IVZuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,gCCkThC;ID7SwC,wBC6SxC;ISnSrB,UAAU,EAAA;EACZ;IVhBuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IS/RrB,UAAU,EAAA,EAAA;;AZuCR;EY9CJ;IVZuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,gCCkThC;ID7SwC,wBC6SxC;ISnSrB,UAAU,EAAA;EACZ;IVhBuD,yCCsC/B;IDjCuC,iCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;IS/RrB,UAAU,EAAA,EAAA;;AZmBR;EYdJ;IVxBuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,iCCkThC;ID7SwC,yBC6SxC;ISvRrB,UAAU,EAAA;EACZ;IV5BuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;ISnRrB,UAAU,EAAA,EAAA;;AZ2BR;EYlCJ;IVxBuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,iCCkThC;ID7SwC,yBC6SxC;ISvRrB,UAAU,EAAA;EACZ;IV5BuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;ISnRrB,UAAU,EAAA,EAAA;;AZOR;EYFJ;IVpCuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,gCCkThC;ID7SwC,wBC6SxC;IS3QrB,UAAU,EAAA;EACZ;IVxCuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;ISvQrB,UAAU,EAAA,EAAA;;AZeR;EYtBJ;IVpCuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,gCCkThC;ID7SwC,wBC6SxC;IS3QrB,UAAU,EAAA;EACZ;IVxCuD,0CCsC/B;IDjCuC,kCCiCvC;IDtC+B,4BCkThC;ID7SwC,oBC6SxC;ISvQrB,UAAU,EAAA,EAAA;;AZLR;EalDJ;IXYuD,4BCkThC;ID7SwC,oBC6SxC;IDlTgC,sCCsC/B;IDjCuC,8BCiCvC;IDtC+B,8CWTP;IXce,sCWdf,EAAA;EAChD;IXQuD,gCCkThC;ID7SwC,wBC6SxC;IDlTgC,sCCsC/B;IDjCuC,8BCiCvC;IDtC+B,8CWLP;IXUe,sCWVf,EAAA;EAChD;IXIuD,gCCkThC;ID7SwC,wBC6SxC;IDlTgC,sCCsC/B;IDjCuC,8BCiCvC;IDtC+B,8CWDP;IXMe,sCWNf,EAAA;EAChD;IXAuD,8CWCP;IXIe,sCWJf;IJN9C,4DAA4F;IAE9F,UIKoB;IXFmC,sCCsC/B;IDjCuC,8BCiCvC;IDtC+B,8CWIP;IXCe,sCWDf,EAAA;EAChD;IXLuD,oCC0Z3B;IDrZmC,4BCqZnC;IM/Z1B,0DAA4F;IAE9F,UIUoB,EAAA,EAAA;;AbmDhB;EatEJ;IXYuD,4BCkThC;ID7SwC,oBC6SxC;IDlTgC,sCCsC/B;IDjCuC,8BCiCvC;IDtC+B,8CWTP;IXce,sCWdf,EAAA;EAChD;IXQuD,gCCkThC;ID7SwC,wBC6SxC;IDlTgC,sCCsC/B;IDjCuC,8BCiCvC;IDtC+B,8CWLP;IXUe,sCWVf,EAAA;EAChD;IXIuD,gCCkThC;ID7SwC,wBC6SxC;IDlTgC,sCCsC/B;IDjCuC,8BCiCvC;IDtC+B,8CWDP;IXMe,sCWNf,EAAA;EAChD;IXAuD,8CWCP;IXIe,sCWJf;IJN9C,4DAA4F;IAE9F,UIKoB;IXFmC,sCCsC/B;IDjCuC,8BCiCvC;IDtC+B,8CWIP;IXCe,sCWDf,EAAA;EAChD;IXLuD,oCC0Z3B;IDrZmC,4BCqZnC;IM/Z1B,0DAA4F;IAE9F,UIUoB,EAAA,EAAA;;Ab+BhB;Ea1BJ;IJjBE,0DAA4F;IAE9F,UIgBoB;IXbmC,oDWcD;IXTS,4CWST,EAAA;EACtD;IJpBE,4DAA4F;IAE9F,UImBoB;IXhBmC,+CWiBN;IXZc,uCWYd,EAAA,EAAA;;AbyC7C;Ea9CJ;IJjBE,0DAA4F;IAE9F,UIgBoB;IXbmC,oDWcD;IXTS,4CWST,EAAA;EACtD;IJpBE,4DAA4F;IAE9F,UImBoB;IXhBmC,+CWiBN;IXZc,uCWYd,EAAA,EAAA;;AbqB7C;EahBJ;IJ3BE,4DAA4F;IAE9F,UI0BoB;IXvBmC,+CWwBN;IXnBc,uCWmBd,EAAA;EACjD;IJ9BE,0DAA4F;IAE9F,UI6BoB;IX1BmC,oDW2BD;IXtBS,4CWsBT,EAAA,EAAA;;Ab+BlD;EapCJ;IJ3BE,4DAA4F;IAE9F,UI0BoB;IXvBmC,+CWwBN;IXnBc,uCWmBd,EAAA;EACjD;IJ9BE,0DAA4F;IAE9F,UI6BoB;IX1BmC,oDW2BD;IXtBS,4CWsBT,EAAA,EAAA;;AfmBxD,sEAAA;AACA,+BAAA;AgB7DA;;;;;Ef6sOE;AgB7sOF;EAQI,kBAAiC;EAAjC,oBAAiC;EAAjC,oBAAiC;EAAjC,kBAAiC;EAAjC,iBAAiC;EAAjC,oBAAiC;EAAjC,oBAAiC;EAAjC,mBAAiC;EAAjC,kBAAiC;EAAjC,kBAAiC;EAAjC,mBAAiC;EAAjC,kBAAiC;EAAjC,wBAAiC;EAAjC,0BAAiC;EAAjC,2BAAiC;EAAjC,uBAAiC;EAAjC,mBAAiC;EAIjC,sBAA2C;EAA3C,sBAA2C;EAA3C,sBAA2C;EAA3C,sBAA2C;EAA3C,sBAA2C;EAA3C,sBAA2C;EAA3C,sBAA2C;EAA3C,sBAA2C;EAA3C,sBAA2C;EAI3C,qBAAiC;EAAjC,uBAAiC;EAAjC,qBAAiC;EAAjC,kBAAiC;EAAjC,qBAAiC;EAAjC,oBAAiC;EAAjC,mBAAiC;EAAjC,kBAAiC;EAIjC,8BAAyC;EAAzC,iCAAyC;EAAzC,6BAAyC;EAAzC,2BAAyC;EAAzC,6BAAyC;EAAzC,4BAAyC;EAAzC,6BAAyC;EAAzC,yBAAyC;EAG3C,6BAA0C;EAC1C,uBAA0C;EAC1C,+BAAoD;EACpD,+BAA8C;EAM9C,qNAAsD;EACtD,yGAAoD;EACpD,yFAAwC;EAQxC,gDAAwD;EACxD,yBAAoD;EACpD,0BAAwD;EACxD,0BAAwD;EACxD,wBAA4C;EAI5C,kBAAsC,EAAA;;ACnCxC;;;EAGE,8BAAsB;EAAtB,sBAAsB,EAAA;;AAepB;EDjCJ;ICkCM,uBAAuB,EAAA,EAG5B;;AAWD;EACE,SAAS;EACT,uCAAyE;ECmPrE,mCAvE+B;ED1KnC,uCAAyE;EACzE,uCAAyE;EACzE,2BAAuD;EACvD,qCAAsE;EACtE,mCAA4D;EAC5D,8BAA8B;EAC9B,6CEFe,EAAA;;AFYjB;EACE,cAAsB;EACtB,cG+kBmC;EH9kBnC,8BAA8B;EAC9B,SAAS;EACT,aG8kB+B,EAAA;;AH3kBjC;EACE,WGwb+B,EAAA;;AH9ajC;EACE,aAAa;EACb,qBGohBwC;EHjhBxC,gBGohB+B;EHnhB/B,gBGohB+B,EAAA;;AHhhBjC;ECwMQ,iCAf6B,EAAA;EAnJjC;IDtCJ;MC+MQ,iBAlF6B,EAAA,ED1HpC;;AAED;ECmMQ,iCAf6B,EAAA;EAnJjC;IDjCJ;MC0MQ,eAlF6B,EAAA,EDrHpC;;AAED;EC8LQ,+BAf6B,EAAA;EAnJjC;ID5BJ;MCqMQ,kBAlF6B,EAAA,EDhHpC;;AAED;ECyLQ,iCAf6B,EAAA;EAnJjC;IDvBJ;MCgMQ,iBAlF6B,EAAA,ED3GpC;;AAED;ECgLM,kBAvE+B,EAAA;;ADpGrC;EC2KM,eAvE+B,EAAA;;ADzFrC;EACE,aAAa;EACb,mBGkU8B,EAAA;;AHvThC;;EAEE,yCAAiC;EAAjC,iCAAiC;EACjC,YAAY;EACZ,sCAA8B;EAA9B,8BAA8B,EAAA;;AAMhC;EACE,mBAAmB;EACnB,kBAAkB;EAClB,oBAAoB,EAAA;;AAMtB;;EAEE,kBAAkB,EAAA;;AAGpB;;;EAGE,aAAa;EACb,mBAAmB,EAAA;;AAGrB;;;;EAIE,gBAAgB,EAAA;;AAGlB;EACE,gBGuZ+B,EAAA;;AHlZjC;EACE,oBAAoB;EACpB,cAAc,EAAA;;AAMhB;EACE,gBAAgB,EAAA;;AAQlB;;EAEE,mBGgYkC,EAAA;;AHxXpC;EC4EM,kBAvE+B,EAAA;;ADErC;EACE,cG4bgC;EH3bhC,yBGmcmC,EAAA;;AH1brC;;EAEE,kBAAkB;ECwDd,iBAvE+B;EDiBnC,cAAc;EACd,wBAAwB,EAAA;;AAG1B;EAAM,cAAc,EAAA;;AACpB;EAAM,UAAU,EAAA;;AAKhB;EACE,cGpNe;EHqNf,0BGkMiD,EAAA;EHpMnD;IAKI,cI3CiC,EAAA;;AJqDrC;EAGI,cAAc;EACd,qBAAqB,EAAA;;AAOzB;;;;EAIE,qCG6SoF;EF/RhF,cAvE+B;ED2DnC,+BAAoC;EACpC,2BAA2B,EAAA;;AAO7B;EACE,cAAc;EACd,aAAa;EACb,mBAAmB;EACnB,cAAc;ECAV,kBAvE+B,EAAA;EDmErC;ICIM,kBAvE+B;ID8EjC,cAAc;IACd,kBAAkB,EAAA;;AAItB;ECZM,kBAvE+B;EDqFnC,cG1Qe;EH2Qf,qBAAqB,EAAA;EAGrB;IACE,cAAc,EAAA;;AAIlB;EACE,sBGsyCuC;EF9zCnC,kBAvE+B;EDiGnC,WGvTa;EHwTb,yBG/SgB;EEEd,qBFggB+B,EAAA;EHvNnC;IAQI,UAAU;IC/BR,cAvE+B;IDwGjC,gBG0Q6B,EAAA;;AHjQjC;EACE,gBAAgB,EAAA;;AAMlB;;EAEE,sBAAsB,EAAA;;AAQxB;EACE,oBAAoB;EACpB,yBAAyB,EAAA;;AAG3B;EACE,mBGwUiC;EHvUjC,sBGuUiC;EHtUjC,cG1VgB;EH2VhB,gBAAgB,EAAA;;AAOlB;EAEE,mBAAmB;EACnB,gCAAgC,EAAA;;AAGlC;;;;;;EAME,qBAAqB;EACrB,mBAAmB;EACnB,eAAe,EAAA;;AAQjB;EACE,qBAAqB,EAAA;;AAMvB;EAEE,gBAAgB,EAAA;;AAQlB;EACE,UAAU,EAAA;;AAKZ;;;;;EAKE,SAAS;EACT,oBAAoB;EC9HhB,kBAvE+B;EDuMnC,oBAAoB,EAAA;;AAItB;;EAEE,oBAAoB,EAAA;;AjBskOtB;EiBhkOE,eAAe,EAAA;;AAGjB;EAGE,iBAAiB,EAAA;EAHnB;IAOI,UAAU,EAAA;;AjB8jOd;EiBtjOE,aAAa,EAAA;;AAQf;;;;EAIE,0BAA0B,EAAA;EAJ5B;;;;IAQM,eAAe,EAAA;;AAOrB;EACE,UAAU;EACV,kBAAkB,EAAA;;AAKpB;EACE,gBAAgB,EAAA;;AAUlB;EACE,YAAY;EACZ,UAAU;EACV,SAAS;EACT,SAAS,EAAA;;AAQX;EACE,WAAW;EACX,WAAW;EACX,UAAU;EACV,qBG6JiC;EFhX3B,iCAf6B;EDqOnC,oBAAoB,EAAA;ECxXlB;IDiXJ;MCxMQ,iBAlF6B,EAAA,EDsSpC;EAZD;IAUI,WAAW,EAAA;;AAOf;;;;;;;EAOE,UAAU,EAAA;;AAGZ;EACE,YAAY,EAAA;;AjByhOd;EiB/gOE,oBAAoB;EACpB,6BAA6B,EAAA;;AAQ/B;;;;;;;CjBihOC;AiBtgOD;EACE,wBAAwB,EAAA;;AAK1B;EACE,UAAU,EAAA;;AAMZ;EACE,aAAa,EAAA;;AAMf;EACE,aAAa;EACb,0BAA0B,EAAA;;AAK5B;EACE,qBAAqB,EAAA;;AAKvB;EACE,SAAS,EAAA;;AAOX;EACE,kBAAkB;EAClB,eAAe,EAAA;;AAQjB;EACE,wBAAwB,EAAA;;AjB6+N1B;EiBp+NE,wBAAwB,EAAA;;AMnlB1B;ELyQM,kBAvE+B;EKhMnC,gBHumB+B,EAAA;;AGlmB/B;ELsQM,iCAf6B;EKrPjC,gBH0lBqB;EGzlBrB,gBH2kB6B,EAAA;EF1e7B;IKpGF;ML6QM,eAlF6B,EAAA,EKvLlC;;AAJD;ELsQM,iCAf6B;EKrPjC,gBH0lBqB;EGzlBrB,gBH2kB6B,EAAA;EF1e7B;IKpGF;ML6QM,iBAlF6B,EAAA,EKvLlC;;AAJD;ELsQM,iCAf6B;EKrPjC,gBH0lBqB;EGzlBrB,gBH2kB6B,EAAA;EF1e7B;IKpGF;ML6QM,eAlF6B,EAAA,EKvLlC;;AAJD;ELsQM,iCAf6B;EKrPjC,gBH0lBqB;EGzlBrB,gBH2kB6B,EAAA;EF1e7B;IKpGF;ML6QM,iBAlF6B,EAAA,EKvLlC;;AAJD;ELsQM,iCAf6B;EKrPjC,gBH0lBqB;EGzlBrB,gBH2kB6B,EAAA;EF1e7B;IKpGF;ML6QM,eAlF6B,EAAA,EKvLlC;;AAJD;ELsQM,iCAf6B;EKrPjC,gBH0lBqB;EGzlBrB,gBH2kB6B,EAAA;EF1e7B;IKpGF;ML6QM,iBAlF6B,EAAA,EKvLlC;;AAkBH;ECrDE,eAAe;EACf,gBAAgB,EAAA;;ADyDlB;EC1DE,eAAe;EACf,gBAAgB,EAAA;;AD4DlB;EACE,qBAAqB,EAAA;EADvB;IAII,oBH8lB+B,EAAA;;AGplBnC;ELsNM,kBAvE+B;EK7InC,yBAAyB,EAAA;;AAI3B;EACE,mBHgSW;EFjFP,kBAvE+B,EAAA;EKzIrC;IAKI,gBAAgB,EAAA;;AAIpB;EACE,iBHuRW;EGtRX,mBHsRW;EFjFP,kBAvE+B;EK5HnC,cHpFgB,EAAA;EGgFlB;IAOI,qBAAqB,EAAA;;AE9FzB;ECIE,eAAe;EAGf,YAAY,EAAA;;ADDd;EACE,gBLs9CwC;EKr9CxC,sBLPa;EKQb,yBLLgB;EEQd,sBF+fgC;EMvgBlC,eAAe;EAGf,YAAY,EAAA;;ADcd;EAEE,qBAAqB,EAAA;;AAGvB;EACE,qBAA2B;EAC3B,cAAc,EAAA;;AAGhB;EP+PM,kBAvE+B;EOtLnC,cL1BgB,EAAA;;AORhB;;;;;;;ECHA,WAAW;EACX,0CAAuE;EACvE,yCAAsE;EACtE,kBAAkB;EAClB,iBAAiB,EAAA;;ACwDf;EF5CE;IACE,gBPkdG,EAAA,EOjdJ;;AE0CH;EF5CE;IACE,gBPmdG,EAAA,EOldJ;;AE0CH;EF5CE;IACE,gBPodG,EAAA,EOndJ;;AE0CH;EF5CE;IACE,iBPqdI,EAAA,EOpdL;;AE0CH;EF5CE;IACE,iBPsdK,EAAA,EOrdN;;AGhBL;ECAA,mBAAwC;EACxC,gBAAwC;EACxC,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EAEf,yCAAmE;EACnE,4CAAsE;EACtE,2CAAqE,EAAA;EDPrE;ICgBA,oBAAc;IAAd,cAAc;IACd,WAAW;IACX,eAAe;IACf,4CAAsE;IACtE,2CAAqE;IACrE,8BAAwD,EAAA;;AA+CpD;EACE,mBAAY;EAAZ,gBAAY;EAAZ,YAAY,EAAA;;AAGd;EApCJ,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,WAAW,EAAA;;AAcX;EACE,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,WbiCqD,EAAA;;AanCvD;EACE,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,UbiCqD,EAAA;;AanCvD;EACE,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,gBbiCqD,EAAA;;AanCvD;EACE,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,UbiCqD,EAAA;;AanCvD;EACE,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,UbiCqD,EAAA;;AanCvD;EACE,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,gBbiCqD,EAAA;;AaFnD;EAhDJ,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,WAAW,EAAA;;AAqDH;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,eAA0C,EAAA;;AA+DpC;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,gBAA0C,EAAA;;AA+DpC;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,UAA0C,EAAA;;AA+DpC;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,gBAA0C,EAAA;;AA+DpC;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,gBAA0C,EAAA;;AA+DpC;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,UAA0C,EAAA;;AA+DpC;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,gBAA0C,EAAA;;AA+DpC;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,gBAA0C,EAAA;;AA+DpC;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,UAA0C,EAAA;;AA+DpC;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,gBAA0C,EAAA;;AA+DpC;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,gBAA0C,EAAA;;AA+DpC;EAhEN,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,WAA0C,EAAA;;AAuElC;EAxDV,qBAA8C,EAAA;;AAwDpC;EAxDV,sBAA8C,EAAA;;AAwDpC;EAxDV,gBAA8C,EAAA;;AAwDpC;EAxDV,sBAA8C,EAAA;;AAwDpC;EAxDV,sBAA8C,EAAA;;AAwDpC;EAxDV,gBAA8C,EAAA;;AAwDpC;EAxDV,sBAA8C,EAAA;;AAwDpC;EAxDV,sBAA8C,EAAA;;AAwDpC;EAxDV,gBAA8C,EAAA;;AAwDpC;EAxDV,sBAA8C,EAAA;;AAwDpC;EAxDV,sBAA8C,EAAA;;AAmExC;;EAEE,gBAAwC,EAAA;;AAG1C;;EAEE,gBAAwC,EAAA;;AAP1C;;EAEE,sBAAwC,EAAA;;AAG1C;;EAEE,sBAAwC,EAAA;;AAP1C;;EAEE,qBAAwC,EAAA;;AAG1C;;EAEE,qBAAwC,EAAA;;AAP1C;;EAEE,mBAAwC,EAAA;;AAG1C;;EAEE,mBAAwC,EAAA;;AAP1C;;EAEE,qBAAwC,EAAA;;AAG1C;;EAEE,qBAAwC,EAAA;;AAP1C;;EAEE,mBAAwC,EAAA;;AAG1C;;EAEE,mBAAwC,EAAA;;AF1D9C;EEUE;IACE,mBAAY;IAAZ,gBAAY;IAAZ,YAAY,EAAA;EAGd;IApCJ,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAAW,EAAA;EAcX;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBbiCqD,EAAA;EaFnD;IAhDJ,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAAW,EAAA;EAqDH;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,eAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAA0C,EAAA;EAuElC;IAxDV,cAA4B,EAAA;EAwDlB;IAxDV,qBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAmExC;;IAEE,gBAAwC,EAAA;EAG1C;;IAEE,gBAAwC,EAAA;EAP1C;;IAEE,sBAAwC,EAAA;EAG1C;;IAEE,sBAAwC,EAAA;EAP1C;;IAEE,qBAAwC,EAAA;EAG1C;;IAEE,qBAAwC,EAAA;EAP1C;;IAEE,mBAAwC,EAAA;EAG1C;;IAEE,mBAAwC,EAAA;EAP1C;;IAEE,qBAAwC,EAAA;EAG1C;;IAEE,qBAAwC,EAAA;EAP1C;;IAEE,mBAAwC,EAAA;EAG1C;;IAEE,mBAAwC,EAAA,EACzC;;AF3DL;EEUE;IACE,mBAAY;IAAZ,gBAAY;IAAZ,YAAY,EAAA;EAGd;IApCJ,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAAW,EAAA;EAcX;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBbiCqD,EAAA;EaFnD;IAhDJ,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAAW,EAAA;EAqDH;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,eAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAA0C,EAAA;EAuElC;IAxDV,cAA4B,EAAA;EAwDlB;IAxDV,qBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAmExC;;IAEE,gBAAwC,EAAA;EAG1C;;IAEE,gBAAwC,EAAA;EAP1C;;IAEE,sBAAwC,EAAA;EAG1C;;IAEE,sBAAwC,EAAA;EAP1C;;IAEE,qBAAwC,EAAA;EAG1C;;IAEE,qBAAwC,EAAA;EAP1C;;IAEE,mBAAwC,EAAA;EAG1C;;IAEE,mBAAwC,EAAA;EAP1C;;IAEE,qBAAwC,EAAA;EAG1C;;IAEE,qBAAwC,EAAA;EAP1C;;IAEE,mBAAwC,EAAA;EAG1C;;IAEE,mBAAwC,EAAA,EACzC;;AF3DL;EEUE;IACE,mBAAY;IAAZ,gBAAY;IAAZ,YAAY,EAAA;EAGd;IApCJ,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAAW,EAAA;EAcX;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBbiCqD,EAAA;EaFnD;IAhDJ,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAAW,EAAA;EAqDH;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,eAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAA0C,EAAA;EAuElC;IAxDV,cAA4B,EAAA;EAwDlB;IAxDV,qBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAmExC;;IAEE,gBAAwC,EAAA;EAG1C;;IAEE,gBAAwC,EAAA;EAP1C;;IAEE,sBAAwC,EAAA;EAG1C;;IAEE,sBAAwC,EAAA;EAP1C;;IAEE,qBAAwC,EAAA;EAG1C;;IAEE,qBAAwC,EAAA;EAP1C;;IAEE,mBAAwC,EAAA;EAG1C;;IAEE,mBAAwC,EAAA;EAP1C;;IAEE,qBAAwC,EAAA;EAG1C;;IAEE,qBAAwC,EAAA;EAP1C;;IAEE,mBAAwC,EAAA;EAG1C;;IAEE,mBAAwC,EAAA,EACzC;;AF3DL;EEUE;IACE,mBAAY;IAAZ,gBAAY;IAAZ,YAAY,EAAA;EAGd;IApCJ,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAAW,EAAA;EAcX;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBbiCqD,EAAA;EaFnD;IAhDJ,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAAW,EAAA;EAqDH;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,eAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAA0C,EAAA;EAuElC;IAxDV,cAA4B,EAAA;EAwDlB;IAxDV,qBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAmExC;;IAEE,gBAAwC,EAAA;EAG1C;;IAEE,gBAAwC,EAAA;EAP1C;;IAEE,sBAAwC,EAAA;EAG1C;;IAEE,sBAAwC,EAAA;EAP1C;;IAEE,qBAAwC,EAAA;EAG1C;;IAEE,qBAAwC,EAAA;EAP1C;;IAEE,mBAAwC,EAAA;EAG1C;;IAEE,mBAAwC,EAAA;EAP1C;;IAEE,qBAAwC,EAAA;EAG1C;;IAEE,qBAAwC,EAAA;EAP1C;;IAEE,mBAAwC,EAAA;EAG1C;;IAEE,mBAAwC,EAAA,EACzC;;AF3DL;EEUE;IACE,mBAAY;IAAZ,gBAAY;IAAZ,YAAY,EAAA;EAGd;IApCJ,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAAW,EAAA;EAcX;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UbiCqD,EAAA;EanCvD;IACE,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBbiCqD,EAAA;EaFnD;IAhDJ,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAAW,EAAA;EAqDH;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,eAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,UAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,gBAA0C,EAAA;EA+DpC;IAhEN,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WAA0C,EAAA;EAuElC;IAxDV,cAA4B,EAAA;EAwDlB;IAxDV,qBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,gBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAwDpC;IAxDV,sBAA8C,EAAA;EAmExC;;IAEE,gBAAwC,EAAA;EAG1C;;IAEE,gBAAwC,EAAA;EAP1C;;IAEE,sBAAwC,EAAA;EAG1C;;IAEE,sBAAwC,EAAA;EAP1C;;IAEE,qBAAwC,EAAA;EAG1C;;IAEE,qBAAwC,EAAA;EAP1C;;IAEE,mBAAwC,EAAA;EAG1C;;IAEE,mBAAwC,EAAA;EAP1C;;IAEE,qBAAwC,EAAA;EAG1C;;IAEE,qBAAwC,EAAA;EAP1C;;IAEE,mBAAwC,EAAA;EAG1C;;IAEE,mBAAwC,EAAA,EACzC;;ACtHT;EACE,0BAAwC;EACxC,iCAAsD;EACtD,iCAA8D;EAC9D,0CAAwD;EACxD,gCAA4D;EAC5D,wCAAsD;EACtD,+BAA0D;EAC1D,4BAAoD;EAEpD,WAAW;EACX,mBZuWW;EYtWX,cZCgB;EYAhB,mBZkqB+B;EYjqB/B,qBb4EoB,EAAA;Ea1FtB;IAsBI,sBZqpB+B;IYppB/B,oCAA8D;IAC9D,wBZye6B;IYxe7B,gEAAyF;IAAzF,wDAAyF,EAAA;EAzB7F;IA6BI,uBAAuB,EAAA;EA7B3B;IAiCI,sBAAsB,EAAA;EAjC1B;IAsCI,kCZmqBsC,EAAA;;AY1pB1C;EACE,iBAAiB,EAAA;;AAQnB;EAGI,wBZknBgC,EAAA;;AYpmBpC;EAEI,mBAAmC,EAAA;EAFvC;IAMM,mBZkb2B,EAAA;;AY7ajC;EAGI,sBAAsB,EAAA;;AAH1B;EAOI,mBAAmB,EAAA;;AAQvB;EAEI,gDAAsD;EACtD,oCAAyE,EAAA;;AAQ7E;EACE,+CAAsD;EACtD,mCAAuE,EAAA;;AAOzE;EAEI,8CAAsD;EACtD,kCAAqE,EAAA;;AC5HvE;EAME,sBAAwC;EACxC,8BAAwD;EACxD,8BAA8D;EAC9D,6BAAsD;EACtD,6BAA4D;EAC5D,4BAAoD;EACpD,4BAA0D;EAE1D,WbEW;EaDX,qBAAwE,EAAA;;AAf1E;EAME,sBAAwC;EACxC,8BAAwD;EACxD,8BAA8D;EAC9D,6BAAsD;EACtD,6BAA4D;EAC5D,4BAAoD;EACpD,4BAA0D;EAE1D,WbEW;EaDX,qBAAwE,EAAA;;AAf1E;EAME,sBAAwC;EACxC,8BAAwD;EACxD,8BAA8D;EAC9D,6BAAsD;EACtD,6BAA4D;EAC5D,4BAAoD;EACpD,4BAA0D;EAE1D,WbEW;EaDX,qBAAwE,EAAA;;AAf1E;EAME,sBAAwC;EACxC,8BAAwD;EACxD,8BAA8D;EAC9D,6BAAsD;EACtD,6BAA4D;EAC5D,4BAAoD;EACpD,4BAA0D;EAE1D,WbEW;EaDX,qBAAwE,EAAA;;AAf1E;EAME,sBAAwC;EACxC,8BAAwD;EACxD,8BAA8D;EAC9D,6BAAsD;EACtD,6BAA4D;EAC5D,4BAAoD;EACpD,4BAA0D;EAE1D,WbEW;EaDX,qBAAwE,EAAA;;AAf1E;EAME,sBAAwC;EACxC,8BAAwD;EACxD,8BAA8D;EAC9D,6BAAsD;EACtD,6BAA4D;EAC5D,4BAAoD;EACpD,4BAA0D;EAE1D,WbEW;EaDX,qBAAwE,EAAA;;AAf1E;EAME,sBAAwC;EACxC,8BAAwD;EACxD,8BAA8D;EAC9D,6BAAsD;EACtD,6BAA4D;EAC5D,4BAAoD;EACpD,4BAA0D;EAE1D,WbEW;EaDX,qBAAwE,EAAA;;AAf1E;EAME,sBAAwC;EACxC,8BAAwD;EACxD,8BAA8D;EAC9D,6BAAsD;EACtD,6BAA4D;EAC5D,4BAAoD;EACpD,4BAA0D;EAE1D,WbRW;EaSX,qBAAwE,EAAA;;ADoIxE;EACE,gBAAgB;EAChB,iCAAiC,EAAA;;AH3EnC;EGyEA;IACE,gBAAgB;IAChB,iCAAiC,EAAA,EAClC;;AH5ED;EGyEA;IACE,gBAAgB;IAChB,iCAAiC,EAAA,EAClC;;AH5ED;EGyEA;IACE,gBAAgB;IAChB,iCAAiC,EAAA,EAClC;;AH5ED;EGyEA;IACE,gBAAgB;IAChB,iCAAiC,EAAA,EAClC;;AH5ED;EGyEA;IACE,gBAAgB;IAChB,iCAAiC,EAAA,EAClC;;AEpJL;EACE,qBdwzB2C,EAAA;;Ac/yB7C;EACE,gCb2N8D;Ea1N9D,mCb0N8D;EazN9D,gBAAgB;EhBoRZ,kBAvE+B;EgBzMnC,cfoMmB,EAAA;;AehMrB;EACE,gCbgN8D;Ea/M9D,mCb+M8D;EH2D1D,kBAvE+B,EAAA;;AgB/LrC;EACE,+Bb0M8D;EazM9D,kCbyM8D;EH2D1D,mBAvE+B,EAAA;;AiB1NrC;EACE,mBfgzB4C;EFhhBxC,kBAvE+B;EiBrNnC,cfKgB,EAAA;;AgBVlB;EACE,cAAc;EACd,WAAW;EACX,yBjBiNwB;ED6EpB,oBAvE+B;EkBpNnC,gBhBqkB+B;EgBpkB/B,cjB8MmB;EiB7MnB,chBKgB;EgBJhB,8BjBqMqB;EiBpMrB,4BAA4B;EAC5B,yBhBHgB;EgBIhB,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;EdGd,kBHgMqB;EkBnMnB,wFjBo2B4F;EiBp2B5F,gFjBo2B4F;EiBp2B5F,wEjBo2B4F;EiBp2B5F,8GjBo2B4F,EAAA;EiBh2B5F;IDhBN;MCiBQ,wBAAgB;MAAhB,gBAAgB,EAAA,ED2FvB;EA5GD;IAqBI,gBAAgB,EAAA;IArBpB;MAwBM,eAAe,EAAA;EAxBrB;IA8BI,chBjBc;IgBkBd,sBhB3BW;IgB4BX,qBf0KiC;IezKjC,UAAU;IAKR,0DhBJW;IgBIX,kDhBJW,EAAA;EgBlCjB;IA+CI,WAAmE,EAAA;EA/CvE;IAoDI,cjB4J6B;IiB1J7B,UAAU,EAAA;EAtDd;IAoDI,cjB4J6B;IiB1J7B,UAAU,EAAA;EAtDd;IAoDI,cjB4J6B;IiB1J7B,UAAU,EAAA;EAtDd;IAoDI,cjB4J6B;IiB1J7B,UAAU,EAAA;EAtDd;IAoDI,cjB4J6B;IiB1J7B,UAAU,EAAA;EAtDd;IAgEI,yBhB1Dc;IgB6Dd,UAAU,EAAA;EAnEd;IAwEI,yBjB4IsB;IiB3ItB,0BjB2IsB;IiB1ItB,4BjB0IsB;IiB1ItB,2BjB0IsB;IiBzItB,chB9Dc;IkBbhB,yBlBMgB;IgBuEd,oBAAoB;IACpB,qBAAqB;IACrB,mBAAmB;IACnB,eAAe;IACf,4BhBgb6B;IgB/a7B,gBAAgB;ICtEd,qJjBqxB6I;IiBrxB7I,6IjBqxB6I;IiBrxB7I,qIjBqxB6I;IiBrxB7I,2KjBqxB6I,EAAA;IiBjxB7I;MDhBN;QCiBQ,wBAAgB;QAAhB,gBAAgB,EAAA,EDmErB;EApFH;IAuFI,yBfwHiC,EAAA;Ee/MrC;IA2FI,yBjByHsB;IiBxHtB,0BjBwHsB;IiBvHtB,4BjBuHsB;IiBvHtB,2BjBuHsB;IiBtHtB,chBjFc;IkBbhB,yBlBMgB;IgB0Fd,oBAAoB;IACpB,qBAAqB;IACrB,mBAAmB;IACnB,eAAe;IACf,4BhB6Z6B;IgB5Z7B,gBAAgB;ICzFd,qJjBqxB6I;IiBrxB7I,6IjBqxB6I;IiBrxB7I,qIjBqxB6I;IiBrxB7I,2KjBqxB6I,EAAA;IiBjxB7I;MDhBN;QCiBQ,wBAAgB;QAAhB,gBAAgB,EAAA,EDsFrB;EAvGH;IA0GI,yBfqGiC,EAAA;;Ae5FrC;EACE,cAAc;EACd,WAAW;EACX,kBAA2B;EAC3B,gBAAgB;EAChB,cjB6FmB;EiB5FnB,chB5GgB;EgB6GhB,6BAA6B;EAC7B,yBAAyB;EACzB,mBAAmC,EAAA;EATrC;IAaI,gBAAgB;IAChB,eAAe,EAAA;;AAWnB;EACE,oBjBoF8B;EiBnF9B,uBjB6EyB;EDsErB,mBAvE+B;EI3MjC,qBFggB+B,EAAA;EgBnYnC;IAOI,uBjBwEuB;IiBvEvB,wBjBuEuB;IiBtEvB,2BjBsEuB;IiBtEvB,0BjBsEuB,EAAA;EiB/E3B;IAaI,uBjBkEuB;IiBjEvB,wBjBiEuB;IiBhEvB,2BjBgEuB;IiBhEvB,0BjBgEuB,EAAA;;AiB5D3B;EACE,oBjBkE8B;EiBjE9B,wBjB6D0B;EDmEtB,kBAvE+B;EI3MjC,qBFigB+B,EAAA;EgBjXnC;IAOI,wBjBwDwB;IiBvDxB,yBjBuDwB;IiBtDxB,2BjBsDwB;IiBtDxB,0BjBsDwB,EAAA;EiB/D5B;IAaI,wBjBkDwB;IiBjDxB,yBjBiDwB;IiBhDxB,2BjBgDwB;IiBhDxB,0BjBgDwB,EAAA;;AiBzC5B;EAEI,oBjByC4B,EAAA;;AiB3ChC;EAMI,oBjBsC4B,EAAA;;AiB5ChC;EAUI,oBjBmC4B,EAAA;;AiB9BhC;EACE,WhB6qB0C;EgB5qB1C,YAAY;EACZ,gBjBYuB,EAAA;EiBfzB;IAMI,eAAe,EAAA;EANnB;IAUI,WAAmE;Id/LnE,kBHgMqB,EAAA;EiBXzB;IAeI,WAAmE;IdpMnE,kBHgMqB,EAAA;;AoB9MzB;EACE,cAAc;EACd,WAAW;EACX,0CnBguBkC;EmB9tBlC,uClBwP8D;EHmC1D,eAvE+B;EqBjNnC,gBnBkkB+B;EmBjkB/B,gBnBukB+B;EmBtkB/B,cnBEgB;EmBDhB,sBnBRa;EmBSb,iPlBsHgF;EkBrHhF,4BAA4B;EAC5B,yCnBg7BqE;EmB/6BrE,0BnBg7B2C;EmB/6B3C,yBnBTgB;EEOd,sBF+fgC;EiBlgB9B,wFjBo2B4F;EiBp2B5F,gFjBo2B4F;EiBp2B5F,wEjBo2B4F;EiBp2B5F,8GjBo2B4F;EmB31BhG,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB,EAAA;EFLZ;IEfN;MFgBQ,wBAAgB;MAAhB,gBAAgB,EAAA,EEkCvB;EAlDD;IAuBI,qBlBkLiC;IkBjLjC,UAAU;IAKR,0DnBIW;ImBJX,kDnBIW,EAAA;EmBjCjB;IAmCI,sBnBgsBgC;ImB/rBhC,sBAAsB,EAAA;EApC1B;IAyCI,yBnBpCc,EAAA;EmBLlB;IA+CI,kBAAkB;IAClB,0BnBpCc,EAAA;;AmBwClB;EACE,oBnByrBkC;EmBxrBlC,uBnBwrBkC;EmBvrBlC,oBnBwrBiC;EF/c7B,mBAvE+B;EI3MjC,qBFggB+B,EAAA;;AmBldnC;EACE,mBnBqrBiC;EmBprBjC,sBnBorBiC;EmBnrBjC,kBnBorBgC;EFnd5B,kBAvE+B;EI3MjC,qBFigB+B,EAAA;;AoBhhBnC;EACE,cAAc;EACd,kBpBq3B2E;EoBp3B3E,mBpBq3BsE;EoBp3BtE,uBpBq3B+C,EAAA;EoBz3BjD;IAOI,WAAW;IACX,mBAA2C,EAAA;;AAI/C;EACE,UpBy2B2C;EoBx2B3C,WpBw2B2C;EoBv2B3C,kBAA8D;EAC9D,mBAAmB;EACnB,sBpBba;EoBcb,4BAA4B;EAC5B,2BAA2B;EAC3B,wBAAwB;EACxB,qCpBPa;EoBQb,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;EAChB,iCAAmB;EAAnB,mBAAmB,EAAA;EAXrB;IlBGI,qBFm3B2C,EAAA;EoBt3B/C;IAoBI,kBpBm2ByC,EAAA;EoBv3B7C;IAwBI,+BpB01BqD;IoB11BrD,uBpB01BqD,EAAA;EoBl3BzD;IA4BI,qBnBkKiC;ImBjKjC,UAAU;IACV,0DpBRa;IoBQb,kDpBRa,EAAA;EoBtBjB;IAkCI,yBpBZa;IoBab,qBpBba,EAAA;IoBtBjB;MAyCQ,+OnB8E0E,EAAA;ImBvHlF;MAiDQ,uJnBsE0E,EAAA;EmBvHlF;IAuDI,yBpBjCa;IoBkCb,qBpBlCa;IoBuCX,yOnB0D4E,EAAA;EmBvHlF;IAkEI,oBAAoB;IACpB,oBAAY;IAAZ,YAAY;IACZ,YpBk0ByC,EAAA;EoBt4B7C;IA4EM,YpB0zBuC,EAAA;;AoB5yB7C;EACE,mBpBqzByD,EAAA;EoBtzB3D;IAII,UpBizBiC;IoBhzBjC,mBAA4C;IAC5C,wKnBuB8E;ImBtB9E,gCAAgC;IlB9FhC,kBF44BiC;IiB/4B/B,yDjBm5BgE;IiBn5BhE,iDjBm5BgE,EAAA;IiB/4BhE;MGsFN;QHrFQ,wBAAgB;QAAhB,gBAAgB,EAAA,EG6GrB;IAxBH;MAYM,0JnBiB4E,EAAA;ImB7BlF;MAgBM,iCpBgzBwC;MoB3yBtC,uJnBQ0E,EAAA;;AmBFlF;EACE,qBAAqB;EACrB,kBpBmxBoC,EAAA;;AoBhxBtC;EACE,kBAAkB;EAClB,sBAAsB;EACtB,oBAAoB,EAAA;EAHtB;IAQM,oBAAoB;IACpB,oBAAY;IAAZ,YAAY;IACZ,apBqoB2B,EAAA;;AqBnxBjC;EACE,WAAW;EACX,cpB+N2B;EoB9N3B,UAAU;EACV,6BAA6B;EAC7B,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB,EAAA;EALlB;IAQI,UAAU,EAAA;IARd;MAY8B,0ErBoBb;MqBpBa,kErBoBb,EAAA;IqBhCjB;MAa8B,kErBmBb,EAAA;EqBhCjB;IAiBI,SAAS,EAAA;EAjBb;IAqBI,WrB+8B2C;IqB98B3C,YrB88B2C;IqB78B3C,oBAAsE;IHzBxE,yBlBkCe;IqBPb,SrB88BwC;IE19BxC,mBF29B2C;IiB99BzC,4HjBo+BkI;IiBp+BlI,oHjBo+BkI;IiBp+BlI,4GjBo+BkI;IiBp+BlI,kJjBo+BkI;IqBj9BpI,wBAAgB;IAAhB,gBAAgB,EAAA;IJfd;MIdN;QJeQ,wBAAgB;QAAhB,gBAAgB,EAAA,EImBrB;IAlCH;MHFE,yBjB0MmC,EAAA;EoBxMrC;IAqCI,WrBw7BkC;IqBv7BlC,crBw7BmC;IqBv7BnC,kBAAkB;IAClB,erBu7BqC;IqBt7BrC,yBrBpCc;IqBqCd,yBAAyB;InB7BzB,mBFo9BkC,EAAA;EqBj+BtC;IAgDI,WrBo7B2C;IqBn7B3C,YrBm7B2C;IkBt+B7C,yBlBkCe;IqBmBb,SrBo7BwC;IE19BxC,mBF29B2C;IiB99BzC,iHjBo+BkI;IiBp+BlI,4GjBo+BkI;IqBv7BpI,qBAAgB;IAAhB,gBAAgB,EAAA;IJzCd;MIdN;QJeQ,qBAAgB;QAAhB,gBAAgB,EAAA,EI6CrB;IA5DH;MHFE,yBjB0MmC,EAAA;EoBxMrC;IA+DI,WrB85BkC;IqB75BlC,crB85BmC;IqB75BnC,kBAAkB;IAClB,erB65BqC;IqB55BrC,yBrB9Dc;IqB+Dd,yBAAyB;InBvDzB,mBFo9BkC,EAAA;EqBj+BtC;IA0EI,oBAAoB,EAAA;IA1ExB;MA6EM,yBrBtEY,EAAA;IqBPlB;MAiFM,yBrB1EY,EAAA;;AsBblB;EACE,kBAAkB,EAAA;EADpB;;IAKI,0BrBqO4D;IqBpO5D,iBtBy/BkC,EAAA;EsB//BtC;IAUI,kBAAkB;IAClB,MAAM;IACN,OAAO;IACP,YAAY;IACZ,qBtB0tBgC;IsBztBhC,oBAAoB;IACpB,6BAA6C;IAC7C,6BAAqB;IAArB,qBAAqB;ILDnB,gFjBs/B8E;IiBt/B9E,wEjBs/B8E;IiBt/B9E,gEjBs/B8E;IiBt/B9E,oGjBs/B8E,EAAA;IiBl/B9E;MKpBN;QLqBQ,wBAAgB;QAAhB,gBAAgB,EAAA,EKFrB;EAnBH;IAuBI,qBtBitBgC,EAAA;IsBxuBpC;MA0BM,kBAAkB,EAAA;IA1BxB;MA0BM,kBAAkB,EAAA;IA1BxB;MA0BM,kBAAkB,EAAA;IA1BxB;MA0BM,kBAAkB,EAAA;IA1BxB;MA0BM,kBAAkB,EAAA;IA1BxB;MA+BM,qBtBm+BoC;MsBl+BpC,wBtBm+BmC,EAAA;IsBngCzC;MA+BM,qBtBm+BoC;MsBl+BpC,wBtBm+BmC,EAAA;IsBngCzC;MA+BM,qBtBm+BoC;MsBl+BpC,wBtBm+BmC,EAAA;IsBngCzC;MAoCM,qBtB89BoC;MsB79BpC,wBtB89BmC,EAAA;EsBngCzC;IA0CI,qBtBw9BsC;IsBv9BtC,wBtBw9BqC,EAAA;EsBngCzC;IAkDM,atBk9B+B;IsBj9B/B,8DtBk9B4E,EAAA;EsBrgClF;IAkDM,atBk9B+B;IsBj9B/B,8DtBk9B4E,EAAA;EsBrgClF;;;IAkDM,atBk9B+B;IsBj9B/B,sEtBk9B4E;IsBl9B5E,8DtBk9B4E,EAAA;EsBrgClF;IAyDM,atB28B+B;IsB18B/B,sEtB28B4E;IsB38B5E,8DtB28B4E,EAAA;;AuBjgClF;EACE,kBAAkB;EAClB,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,0BAAoB;EAApB,uBAAoB;EAApB,oBAAoB;EACpB,WAAW,EAAA;EALb;;IASI,kBAAkB;IAClB,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,SAAS;IACT,YAAY,EAAA;EAZhB;;IAkBI,UAAU,EAAA;EAlBd;IAyBI,kBAAkB;IAClB,UAAU,EAAA;IA1Bd;MA6BM,UAAU,EAAA;;AAWhB;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,yBvByrBkC;EFnc9B,oBAvE+B;EyB7KnC,gBvB8hB+B;EuB7hB/B,cxBuKmB;EwBtKnB,cvBlCgB;EuBmChB,kBAAkB;EAClB,mBAAmB;EACnB,yBvB5CgB;EuB6ChB,yBvB3CgB;EEOd,kBHgMqB,EAAA;;AwBlJzB;;;;EAIE,wBxB6J0B;EDmEtB,kBAvE+B;EI3MjC,qBFigB+B,EAAA;;AuB1cnC;;;;EAIE,uBxBiJyB;EDsErB,mBAvE+B;EI3MjC,qBFggB+B,EAAA;;AuBhcnC;;EAEE,mBAAsE,EAAA;;AAWxE;;ErB7DI,0BqBiE8B;ErBhE9B,6BqBgE8B,EAAA;;AAJlC;;ErB7DI,0BqBwE8B;ErBvE9B,6BqBuE8B,EAAA;;AAXlC;EAqBI,iBvBgZ6B;EEpd7B,yBqBqE8B;ErBpE9B,4BqBoE8B,EAAA;;AAF4B;EC1F1D,aAAa;EACb,WAAW;EACX,mBxByxB0C;EFhhBxC,kBAvE+B;E0B/LjC,cxBca,EAAA;;AuBuEyB;ECjFtC,kBAAkB;EAClB,SAAS;EACT,UAAU;EACV,aAAa;EACb,eAAe;EACf,uBxB8vC4C;EwB7vC5C,iBAAiB;E1B4Pf,mBAvE+B;E0BlLjC,WxBpCW;EwBqCX,wCxBAa;EE1Bb,sBF+fgC,EAAA;;AwB5gBhC;;;;EA8CE,cAAc,EAAA;;AA9ChB;EAoDE,qBxBbW;EwBgBT,oCvB6KwD;EuB5KxD,4PvByE0E;EuBxE1E,4BAA4B;EAC5B,2DAA6D;EAC7D,gEvByKwD,EAAA;EuBpO5D;IA+DI,qBxBxBS;IwByBT,yDxBzBS;IwByBT,iDxBzBS,EAAA;;AwBvCb;EAyEI,oCvB2JwD;EuB1JxD,kFvB0JwD,EAAA;;AuBpO5D;EAiFE,qBxB1CW,EAAA;EwBvCb;IAsFM,uBxB42B2F;IwB32B3F,6dvB0CwE;IuBzCxE,+DxB61BoD;IwB51BpD,2EvB2IsD,EAAA;EuBpO5D;IA8FI,qBxBvDS;IwBwDT,yDxBxDS;IwBwDT,iDxBxDS,EAAA;;AwBvCb;EAsGE,qBxB/DW,EAAA;EwBvCb;IAyGI,yBxBlES,EAAA;EwBvCb;IA6GI,yDxBtES;IwBsET,iDxBtES,EAAA;EwBvCb;IAiHI,cxB1ES,EAAA;;AwB8Ef;EAEI,iBAAiB,EAAA;;AAvHnB;;;EA+HI,UAAU,EAAA;EA/Hd;;;IAoII,UAAU,EAAA;;ADtBuF;EC1FrG,aAAa;EACb,WAAW;EACX,mBxByxB0C;EFhhBxC,kBAvE+B;E0B/LjC,cxBWa,EAAA;;AuB0EkE;ECjF/E,kBAAkB;EAClB,SAAS;EACT,UAAU;EACV,aAAa;EACb,eAAe;EACf,uBxB8vC4C;EwB7vC5C,iBAAiB;E1B4Pf,mBAvE+B;E0BlLjC,WxBpCW;EwBqCX,wCxBHa;EEvBb,sBF+fgC,EAAA;;AwB5gBhC;;;;EA8CE,cAAc,EAAA;;AA9ChB;EAoDE,qBxBhBW;EwBmBT,oCvB6KwD;EuB5KxD,4UvByE0E;EuBxE1E,4BAA4B;EAC5B,2DAA6D;EAC7D,gEvByKwD,EAAA;EuBpO5D;IA+DI,qBxB3BS;IwB4BT,yDxB5BS;IwB4BT,iDxB5BS,EAAA;;AwBpCb;EAyEI,oCvB2JwD;EuB1JxD,kFvB0JwD,EAAA;;AuBpO5D;EAiFE,qBxB7CW,EAAA;EwBpCb;IAsFM,uBxB42B2F;IwB32B3F,6iBvB0CwE;IuBzCxE,+DxB61BoD;IwB51BpD,2EvB2IsD,EAAA;EuBpO5D;IA8FI,qBxB1DS;IwB2DT,yDxB3DS;IwB2DT,iDxB3DS,EAAA;;AwBpCb;EAsGE,qBxBlEW,EAAA;EwBpCb;IAyGI,yBxBrES,EAAA;EwBpCb;IA6GI,yDxBzES;IwByET,iDxBzES,EAAA;EwBpCb;IAiHI,cxB7ES,EAAA;;AwBiFf;EAEI,iBAAiB,EAAA;;AAvHnB;;;EAiII,UAAU,EAAA;EAjId;;;IAoII,UAAU,EAAA;;ACtIlB;EACE,qBAAqB;EAErB,gBzBwkB+B;EyBvkB/B,c1BmKiB;E0BlKjB,c1BwHkB;E0BvHlB,kBAAkB;EAClB,qBAAwD;EAExD,sBAAsB;EACtB,eAA2C;EAC3C,yBAAiB;EAAjB,sBAAiB;EAAjB,qBAAiB;EAAjB,iBAAiB;EACjB,6BAA6B;EAC7B,6BAA2C;EC8G3C,wB3B2CoB;ED2HhB,mBAvE+B;EI3MjC,wBHwKwB;EkB3KtB,qJjBqxB6I;EiBrxB7I,6IjBqxB6I;EiBrxB7I,qIjBqxB6I;EiBrxB7I,2KjBqxB6I,EAAA;EiBjxB7I;IQhBN;MRiBQ,wBAAgB;MAAhB,gBAAgB,EAAA,EQ6BvB;EA9CD;IAkBI,c1B2GgB,EAAA;E0BvGlB;IAEE,UAAU;IACV,0DzBSa;IyBTb,kDzBSa,EAAA;EyBlCjB;;IA0CI,oBAAoB;IACpB,azB0uB6B,EAAA;;AyB9tB/B;ECvCA,W1BFa;EkBdb,yBnBuDgB;E2BrChB,qB3BqCgB,EAAA;E2BlChB;IACE,W1BRW;IkBdb,yBjB0MmC;IyBlLjC,qBzBkLiC,EAAA;EyB/KnC;IAEE,W1BfW;IkBdb,yBjB0MmC;IyB3KjC,qBzB2KiC;IyBtK/B,yDAAiE;IAAjE,iDAAiE,EAAA;EAIrE;;;IAKE,W1B/BW;I0BgCX,yBzB4JiC;IyBzJjC,qBzByJiC,EAAA;IyBlKnC;;;MAgBM,yDAAiE;MAAjE,iDAAiE,EAAA;EAKvE;IAEE,W1BjDW;I0BkDX,yB3BTc;I2BYd,qB3BZc,EAAA;;A0BAhB;ECvCA,W1BFa;EkBdb,yBnBwDkB;E2BtClB,qB3BsCkB,EAAA;E2BnClB;IACE,W1BRW;IkBdb,yBjB0MmC;IyBlLjC,qBzBkLiC,EAAA;EyB/KnC;IAEE,W1BfW;IkBdb,yBjB0MmC;IyB3KjC,qBzB2KiC;IyBtK/B,0DAAiE;IAAjE,kDAAiE,EAAA;EAIrE;;;IAKE,W1B/BW;I0BgCX,yBzB4JiC;IyBzJjC,qBzByJiC,EAAA;IyBlKnC;;;MAgBM,0DAAiE;MAAjE,kDAAiE,EAAA;EAKvE;IAEE,W1BjDW;I0BkDX,yB3BRgB;I2BWhB,qB3BXgB,EAAA;;A0BDlB;ECvCA,W1BFa;EkBdb,yBnByDgB;E2BvChB,qB3BuCgB,EAAA;E2BpChB;IACE,W1BRW;IkBdb,yBjB0MmC;IyBlLjC,qBzBkLiC,EAAA;EyB/KnC;IAEE,W1BfW;IkBdb,yBjB0MmC;IyB3KjC,qBzB2KiC;IyBtK/B,yDAAiE;IAAjE,iDAAiE,EAAA;EAIrE;;;IAKE,W1B/BW;I0BgCX,yBzB4JiC;IyBzJjC,qBzByJiC,EAAA;IyBlKnC;;;MAgBM,yDAAiE;MAAjE,iDAAiE,EAAA;EAKvE;IAEE,W1BjDW;I0BkDX,yB3BPc;I2BUd,qB3BVc,EAAA;;A0BFhB;ECvCA,W1BFa;EkBdb,yBnB0Da;E2BxCb,qB3BwCa,EAAA;E2BrCb;IACE,W1BRW;IkBdb,yBjB0MmC;IyBlLjC,qBzBkLiC,EAAA;EyB/KnC;IAEE,W1BfW;IkBdb,yBjB0MmC;IyB3KjC,qBzB2KiC;IyBtK/B,yDAAiE;IAAjE,iDAAiE,EAAA;EAIrE;;;IAKE,W1B/BW;I0BgCX,yBzB4JiC;IyBzJjC,qBzByJiC,EAAA;IyBlKnC;;;MAgBM,yDAAiE;MAAjE,iDAAiE,EAAA;EAKvE;IAEE,W1BjDW;I0BkDX,yB3BNW;I2BSX,qB3BTW,EAAA;;A0BHb;ECvCA,W1BFa;EkBdb,yBnB2DgB;E2BzChB,qB3ByCgB,EAAA;E2BtChB;IACE,W1BRW;IkBdb,yBjB0MmC;IyBlLjC,qBzBkLiC,EAAA;EyB/KnC;IAEE,W1BfW;IkBdb,yBjB0MmC;IyB3KjC,qBzB2KiC;IyBtK/B,yDAAiE;IAAjE,iDAAiE,EAAA;EAIrE;;;IAKE,W1B/BW;I0BgCX,yBzB4JiC;IyBzJjC,qBzByJiC,EAAA;IyBlKnC;;;MAgBM,yDAAiE;MAAjE,iDAAiE,EAAA;EAKvE;IAEE,W1BjDW;I0BkDX,yB3BLc;I2BQd,qB3BRc,EAAA;;A0BJhB;ECvCA,W1BFa;EkBdb,yBnB4De;E2B1Cf,qB3B0Ce,EAAA;E2BvCf;IACE,W1BRW;IkBdb,yBjB0MmC;IyBlLjC,qBzBkLiC,EAAA;EyB/KnC;IAEE,W1BfW;IkBdb,yBjB0MmC;IyB3KjC,qBzB2KiC;IyBtK/B,0DAAiE;IAAjE,kDAAiE,EAAA;EAIrE;;;IAKE,W1B/BW;I0BgCX,yBzB4JiC;IyBzJjC,qBzByJiC,EAAA;IyBlKnC;;;MAgBM,0DAAiE;MAAjE,kDAAiE,EAAA;EAKvE;IAEE,W1BjDW;I0BkDX,yB3BJa;I2BOb,qB3BPa,EAAA;;A0BLf;ECvCA,W1BFa;EkBdb,yBnB6Dc;E2B3Cd,qB3B2Cc,EAAA;E2BxCd;IACE,W1BRW;IkBdb,yBjB0MmC;IyBlLjC,qBzBkLiC,EAAA;EyB/KnC;IAEE,W1BfW;IkBdb,yBjB0MmC;IyB3KjC,qBzB2KiC;IyBtK/B,0DAAiE;IAAjE,kDAAiE,EAAA;EAIrE;;;IAKE,W1B/BW;I0BgCX,yBzB4JiC;IyBzJjC,qBzByJiC,EAAA;IyBlKnC;;;MAgBM,0DAAiE;MAAjE,kDAAiE,EAAA;EAKvE;IAEE,W1BjDW;I0BkDX,yB3BHY;I2BMZ,qB3BNY,EAAA;;A0BNd;ECvCA,W1BZa;EkBJb,yBnB8Da;E2B5Cb,qB3B4Ca,EAAA;E2BzCb;IACE,W1BlBW;IkBJb,yBjB+MmC;IyBvLjC,qBzBuLiC,EAAA;EyBpLnC;IAEE,W1BzBW;IkBJb,yBjB+MmC;IyBhLjC,qBzBgLiC;IyB3K/B,yDAAiE;IAAjE,iDAAiE,EAAA;EAIrE;;;IAKE,W1BzCW;I0B0CX,yBzBiKiC;IyB9JjC,qBzB8JiC,EAAA;IyBvKnC;;;MAgBM,yDAAiE;MAAjE,iDAAiE,EAAA;EAKvE;IAEE,W1B3DW;I0B4DX,yB3BFW;I2BKX,qB3BLW,EAAA;;A0BDb;ECmBA,c3BzBgB;E2B0BhB,qB3B1BgB,EAAA;E2B4BhB;IACE,W1BtEW;I0BuEX,yB3B9Bc;I2B+Bd,qB3B/Bc,EAAA;E2BkChB;IAEE,0D3BpCc;I2BoCd,kD3BpCc,EAAA;E2BuChB;;IAKE,W1BrFW;I0BsFX,yB3B7Cc;I2B8Cd,qB3B9Cc,EAAA;I2BuChB;;MAcM,0D3BrDU;M2BqDV,kD3BrDU,EAAA;E2B0DhB;IAEE,c3B5Dc;I2B6Dd,6BAA6B,EAAA;;ADvD/B;ECmBA,c3BxBkB;E2ByBlB,qB3BzBkB,EAAA;E2B2BlB;IACE,W1BtEW;I0BuEX,yB3B7BgB;I2B8BhB,qB3B9BgB,EAAA;E2BiClB;IAEE,0D3BnCgB;I2BmChB,kD3BnCgB,EAAA;E2BsClB;;IAKE,W1BrFW;I0BsFX,yB3B5CgB;I2B6ChB,qB3B7CgB,EAAA;I2BsClB;;MAcM,0D3BpDY;M2BoDZ,kD3BpDY,EAAA;E2ByDlB;IAEE,c3B3DgB;I2B4DhB,6BAA6B,EAAA;;ADvD/B;ECmBA,c3BvBgB;E2BwBhB,qB3BxBgB,EAAA;E2B0BhB;IACE,W1BtEW;I0BuEX,yB3B5Bc;I2B6Bd,qB3B7Bc,EAAA;E2BgChB;IAEE,yD3BlCc;I2BkCd,iD3BlCc,EAAA;E2BqChB;;IAKE,W1BrFW;I0BsFX,yB3B3Cc;I2B4Cd,qB3B5Cc,EAAA;I2BqChB;;MAcM,yD3BnDU;M2BmDV,iD3BnDU,EAAA;E2BwDhB;IAEE,c3B1Dc;I2B2Dd,6BAA6B,EAAA;;ADvD/B;ECmBA,c3BtBa;E2BuBb,qB3BvBa,EAAA;E2ByBb;IACE,W1BtEW;I0BuEX,yB3B3BW;I2B4BX,qB3B5BW,EAAA;E2B+Bb;IAEE,yD3BjCW;I2BiCX,iD3BjCW,EAAA;E2BoCb;;IAKE,W1BrFW;I0BsFX,yB3B1CW;I2B2CX,qB3B3CW,EAAA;I2BoCb;;MAcM,yD3BlDO;M2BkDP,iD3BlDO,EAAA;E2BuDb;IAEE,c3BzDW;I2B0DX,6BAA6B,EAAA;;ADvD/B;ECmBA,c3BrBgB;E2BsBhB,qB3BtBgB,EAAA;E2BwBhB;IACE,W1BtEW;I0BuEX,yB3B1Bc;I2B2Bd,qB3B3Bc,EAAA;E2B8BhB;IAEE,yD3BhCc;I2BgCd,iD3BhCc,EAAA;E2BmChB;;IAKE,W1BrFW;I0BsFX,yB3BzCc;I2B0Cd,qB3B1Cc,EAAA;I2BmChB;;MAcM,yD3BjDU;M2BiDV,iD3BjDU,EAAA;E2BsDhB;IAEE,c3BxDc;I2ByDd,6BAA6B,EAAA;;ADvD/B;ECmBA,c3BpBe;E2BqBf,qB3BrBe,EAAA;E2BuBf;IACE,W1BtEW;I0BuEX,yB3BzBa;I2B0Bb,qB3B1Ba,EAAA;E2B6Bf;IAEE,0D3B/Ba;I2B+Bb,kD3B/Ba,EAAA;E2BkCf;;IAKE,W1BrFW;I0BsFX,yB3BxCa;I2ByCb,qB3BzCa,EAAA;I2BkCf;;MAcM,0D3BhDS;M2BgDT,kD3BhDS,EAAA;E2BqDf;IAEE,c3BvDa;I2BwDb,6BAA6B,EAAA;;ADvD/B;ECmBA,c3BnBc;E2BoBd,qB3BpBc,EAAA;E2BsBd;IACE,W1BtEW;I0BuEX,yB3BxBY;I2ByBZ,qB3BzBY,EAAA;E2B4Bd;IAEE,0D3B9BY;I2B8BZ,kD3B9BY,EAAA;E2BiCd;;IAKE,W1BrFW;I0BsFX,yB3BvCY;I2BwCZ,qB3BxCY,EAAA;I2BiCd;;MAcM,0D3B/CQ;M2B+CR,kD3B/CQ,EAAA;E2BoDd;IAEE,c3BtDY;I2BuDZ,6BAA6B,EAAA;;ADvD/B;ECmBA,c3BlBa;E2BmBb,qB3BnBa,EAAA;E2BqBb;IACE,W1BhFW;I0BiFX,yB3BvBW;I2BwBX,qB3BxBW,EAAA;E2B2Bb;IAEE,uD3B7BW;I2B6BX,+C3B7BW,EAAA;E2BgCb;;IAKE,W1B/FW;I0BgGX,yB3BtCW;I2BuCX,qB3BvCW,EAAA;I2BgCb;;MAcM,uD3B9CO;M2B8CP,+C3B9CO,EAAA;E2BmDb;IAEE,c3BrDW;I2BsDX,6BAA6B,EAAA;;AD3CjC;EACE,gBzBigB+B;EyBhgB/B,czBzCe;EyB0Cf,0BzB6WiD,EAAA;EyBhXnD;IAMI,cxBgIiC,EAAA;EwBtIrC;IAgBI,czB/Ec,EAAA;;AyB0FlB;ECuBE,kB3BqDqB;EDiHjB,mBAvE+B;EI3MjC,wBH2K2B,EAAA;;A0BlF/B;ECmBE,uB3BkDuB;EDoHnB,mBAvE+B;EI3MjC,wBH0K2B,EAAA;;A4B7L/B;EVgBM,wCjByhB2C;EiBzhB3C,gCjByhB2C,EAAA;EiBrhB3C;IUpBN;MVqBQ,wBAAgB;MAAhB,gBAAgB,EAAA,EUfvB;EAND;IAII,UAAU,EAAA;;AAKd;EAEI,aAAa,EAAA;;AAIjB;EACE,SAAS;EACT,gBAAgB;EVDZ,qCjB2hBwC;EiB3hBxC,6BjB2hBwC,EAAA;EiBvhBxC;IULN;MVMQ,wBAAgB;MAAhB,gBAAgB,EAAA,EUIvB;EAVD;IAMI,QAAQ;IACR,YAAY;IVNV,oCjB4hBuC;IiB5hBvC,4BjB4hBuC,EAAA;IiBxhBvC;MULN;QVMQ,wBAAgB;QAAhB,gBAAgB,EAAA,EUGrB;;ACvBH;;;;EAIE,kBAAkB,EAAA;;AL6FG;EKzFrB,mBAAmB,EAAA;ECqBjB;IACE,qBAAqB;IACrB,oB7BqgB0C;I6BpgB1C,uB7BmgB0C;I6BlgB1C,WAAW;IAhCf,uBAA8B;IAC9B,qCAA4C;IAC5C,gBAAgB;IAChB,oCAA2C,EAAA;EAqDzC;IACE,cAAc,EAAA;;ANuCyB;EKjF3C,kBAAkB;EAClB,a5ByhCsC;E4BxhCtC,aAAa;EACb,gB5B+mCuC;E4B9mCvC,iB5B+mCmC;E4B9mCnC,SAAS;E9B+QL,eAvE+B;E8BtMnC,c5BPgB;E4BQhB,gBAAgB;EAChB,gBAAgB;EAChB,sB5BnBa;E4BoBb,4BAA4B;EAC5B,yB7BiEoB;EG3ElB,sBF+fgC,EAAA;E4BlgBpC;IAkBI,SAAS;IACT,OAAO;IACP,oB5BkmCuC,EAAA;;A4BtlCvC;EACE,oBAAc,EAAA;EADhB;IAII,WAAW;IACX,OAAO,EAAA;;AAIX;EACE,kBAAc,EAAA;EADhB;IAII,QAAQ;IACR,UAAU,EAAA;;AnBCd;EmBfA;IACE,oBAAc,EAAA;IADhB;MAII,WAAW;MACX,OAAO,EAAA;EAIX;IACE,kBAAc,EAAA;IADhB;MAII,QAAQ;MACR,UAAU,EAAA,EACX;;AnBAH;EmBfA;IACE,oBAAc,EAAA;IADhB;MAII,WAAW;MACX,OAAO,EAAA;EAIX;IACE,kBAAc,EAAA;IADhB;MAII,QAAQ;MACR,UAAU,EAAA,EACX;;AnBAH;EmBfA;IACE,oBAAc,EAAA;IADhB;MAII,WAAW;MACX,OAAO,EAAA;EAIX;IACE,kBAAc,EAAA;IADhB;MAII,QAAQ;MACR,UAAU,EAAA,EACX;;AnBAH;EmBfA;IACE,oBAAc,EAAA;IADhB;MAII,WAAW;MACX,OAAO,EAAA;EAIX;IACE,kBAAc,EAAA;IADhB;MAII,QAAQ;MACR,UAAU,EAAA,EACX;;AnBAH;EmBfA;IACE,oBAAc,EAAA;IADhB;MAII,WAAW;MACX,OAAO,EAAA;EAIX;IACE,kBAAc,EAAA;IADhB;MAII,QAAQ;MACR,UAAU,EAAA,EACX;;AAQP;EAEI,SAAS;EACT,YAAY;EACZ,aAAa;EACb,uB5B0jCuC,EAAA;;A6BxmCvC;EACE,qBAAqB;EACrB,oB7BqgB0C;E6BpgB1C,uB7BmgB0C;E6BlgB1C,WAAW;EAzBf,aAAa;EACb,qCAA4C;EAC5C,0BAAiC;EACjC,oCAA2C,EAAA;;AA8CzC;EACE,cAAc,EAAA;;ADyBpB;EAEI,MAAM;EACN,WAAW;EACX,UAAU;EACV,aAAa;EACb,qB5B4iCuC,EAAA;;A6BxmCvC;EACE,qBAAqB;EACrB,oB7BqgB0C;E6BpgB1C,uB7BmgB0C;E6BlgB1C,WAAW;EAlBf,mCAA0C;EAC1C,eAAe;EACf,sCAA6C;EAC7C,wBAA+B,EAAA;;AAuC7B;EACE,cAAc,EAAA;;AA7BhB;EDkEE,iBAAiB,EAAA;;AAKvB;EAEI,MAAM;EACN,WAAW;EACX,UAAU;EACV,aAAa;EACb,sB5B2hCuC,EAAA;;A6BxmCvC;EACE,qBAAqB;EACrB,oB7BqgB0C;E6BpgB1C,uB7BmgB0C;E6BlgB1C,WAAW,EAAA;;AAJb;EAgBI,aAAa,EAAA;;AAGf;EACE,qBAAqB;EACrB,qB7BkfwC;E6BjfxC,uB7BgfwC;E6B/exC,WAAW;EA9BjB,mCAA0C;EAC1C,yBAAgC;EAChC,sCAA6C,EAAA;;AAiC3C;EACE,cAAc,EAAA;;AAVd;EDgEA,iBAAiB,EAAA;;AAOvB;EACE,SAAS;EACT,gBAAoC;EACpC,gBAAgB;EAChB,6B7B9BoB,EAAA;;A6BoCtB;EACE,cAAc;EACd,WAAW;EACX,qB5BiPW;E4BhPX,WAAW;EACX,gB5Bwc+B;E4Bvc/B,c7BPkB;E6BQlB,mBAAmB;EACnB,qBAAwD;EACxD,mBAAmB;EACnB,6BAA6B;EAC7B,SAAS,EAAA;EAXX;IA2BI,c3BsDiC;IiB/MnC,yBlBMgB,EAAA;E4BwHlB;IAkCI,W5B5JW;I4B6JX,qBAAqB;IVjKvB,yBlBkCe,EAAA;E4B4FjB;IAyCI,c5B9Jc;I4B+Jd,oBAAoB;IACpB,6BAA6B,EAAA;;AAMjC;EACE,cAAc,EAAA;;AAIhB;EACE,cAAc;EACd,oB5B4LW;E4B3LX,gBAAgB;E9B0GZ,mBAvE+B;E8BjCnC,c7B5DkB;E6B6DlB,mBAAmB,EAAA;;AAIrB;EACE,cAAc;EACd,qB5BkLW;E4BjLX,c7BpEkB,EAAA;;A6BwEpB;EACE,c5B/LgB;E4BgMhB,yB5B3LgB;E4B4LhB,iC5B1La,EAAA;E4BuLf;IAOI,c5BrMc,EAAA;I4B8LlB;MAWM,W5B5MS;MkBJb,2ClBIa,EAAA;I4BiMf;MAiBM,W5BlNS;MkBJb,yBlBkCe,EAAA;I4BmKjB;MAuBM,c5BnNY,EAAA;E4B4LlB;IA4BI,iC5BnNW,EAAA;E4BuLf;IAgCI,c5B9Nc,EAAA;E4B8LlB;IAoCI,c5BhOc,EAAA;;A8BZlB;;EAEE,kBAAkB;EAClB,2BAAoB;EAApB,2BAAoB;EAApB,oBAAoB;EACpB,sBAAsB,EAAA;EAJxB;;IAOI,kBAAkB;IAClB,mBAAc;IAAd,kBAAc;IAAd,cAAc,EAAA;EARlB;;;;;;;;;;;;IAmBI,UAAU,EAAA;;AAKd;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,uBAA2B;EAA3B,oBAA2B;EAA3B,2BAA2B,EAAA;EAH7B;IAMI,WAAW,EAAA;;AAIf;;EAII,iB9B8d6B,EAAA;;A8BlejC;;E5BAI,0B4BU4B;E5BT5B,6B4BS4B,EAAA;;AAVhC;;;E5BcI,yB4BM8B;E5BL9B,4B4BK8B,EAAA;;AAgBlC;EACE,uBAAmC;EACnC,sBAAkC,EAAA;EAFpC;;;IAOI,cAAc,EAAA;EAGhB;IACE,eAAe,EAAA;;AAInB;EACE,wBAAsC;EACtC,uBAAqC,EAAA;;AAGvC;EACE,sBAAsC;EACtC,qBAAqC,EAAA;;AAoBvC;EACE,4BAAsB;EAAtB,6BAAsB;EAAtB,0BAAsB;EAAtB,sBAAsB;EACtB,wBAAuB;EAAvB,qBAAuB;EAAvB,uBAAuB;EACvB,wBAAuB;EAAvB,qBAAuB;EAAvB,uBAAuB,EAAA;EAHzB;;IAOI,WAAW,EAAA;EAPf;;IAYI,gB9BwY6B,EAAA;E8BpZjC;;I5BvEI,6B4ByF+B;I5BxF/B,4B4BwF+B,EAAA;EAlBnC;;I5BrFI,yB4B4G4B;I5B3G5B,0B4B2G4B,EAAA;;ACnIhC;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,gBAAgB,EAAA;;AAGlB;EACE,cAAc;EACd,oB/B4iCsC;E+BziCtC,c/BoBe;E+BnBf,qBAAwD;EdHpD,+GjBgjCsH;EiBhjCtH,uGjBgjCsH,EAAA;EiB5iCtH;IcPN;MdQQ,wBAAgB;MAAhB,gBAAgB,EAAA,EcavB;EArBD;IAWI,c9B2LiC,EAAA;E8BtMrC;IAiBI,c/BhBc;I+BiBd,oBAAoB;IACpB,eAAe,EAAA;;AAQnB;EACE,gChCoR6B,EAAA;EgCrR/B;IAII,mB/Byd6B;I+Bxd7B,gBAAgB;IAChB,6BAAgD;I7BlBhD,+BFsfgC;IErfhC,gCFqfgC,EAAA;I+B1epC;MAWM,qChC0QyB;MgCxQzB,kBAAkB,EAAA;IAbxB;MAiBM,c/B3CY;M+B4CZ,6BAA6B;MAC7B,yBAAyB,EAAA;EAnB/B;;IAyBI,chCgEgB;IgC/DhB,yBhCrDW;IgCsDX,qChCtDW,EAAA;EgC2Bf;IAgCI,gB/B6b6B;IEze7B,yB6B8C4B;I7B7C5B,0B6B6C4B,EAAA;;AAShC;EAEI,gBAAgB;EAChB,SAAS;E7BnET,sBF+fgC,EAAA;;A+B/bpC;;EASI,W/BpFW;EkBJb,yBlBkCe,EAAA;;A+BgEjB;;EAGI,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,kBAAkB,EAAA;;AAItB;;EAGI,0BAAa;EAAb,aAAa;EACb,mBAAY;EAAZ,oBAAY;EAAZ,YAAY;EACZ,kBAAkB,EAAA;;AAItB;;EAGI,WAAW,EAAA;;AASf;EAEI,aAAa,EAAA;;AAFjB;EAKI,cAAc,EAAA;;ACxHlB;EACE,kBAAkB;EAClB,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,yBAA8B;EAA9B,sBAA8B;EAA9B,8BAA8B;EAC9B,mBhC8jC8C;EgC5jC9C,sBhC4jC8C,EAAA;EgCpkChD;;IAgBI,oBAAa;IAAb,oBAAa;IAAb,aAAa;IACb,sBAAkB;IAAlB,kBAAkB;IAClB,yBAAmB;IAAnB,sBAAmB;IAAnB,mBAAmB;IACnB,yBAA8B;IAA9B,sBAA8B;IAA9B,8BAA8B,EAAA;;AAoBlC;EACE,sBhCqiCgF;EgCpiChF,yBhCoiCgF;EgCniChF,kBhCoiCsC;EFzzBlC,kBAvE+B;EkClKnC,qBAAwD;EACxD,mBAAmB,EAAA;;AAarB;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,4BAAsB;EAAtB,6BAAsB;EAAtB,0BAAsB;EAAtB,sBAAsB;EACtB,eAAe;EACf,gBAAgB;EAChB,gBAAgB,EAAA;EALlB;IAQI,gBAAgB;IAChB,eAAe,EAAA;EATnB;IAaI,gBAAgB,EAAA;;AASpB;EACE,mBhCy9BuC;EgCx9BvC,sBhCw9BuC,EAAA;;AgC58BzC;EACE,6BAAgB;EAAhB,gBAAgB;EAChB,mBAAY;EAAZ,oBAAY;EAAZ,YAAY;EAGZ,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB,EAAA;;AAIrB;EACE,wBhCy+BwC;EF5zBpC,kBAvE+B;EkCpGnC,cAAc;EACd,6BAA6B;EAC7B,6BAAuC;E9BzGrC,sBF+fgC;EiBlgB9B,wDjBqlCyD;EiBrlCzD,gDjBqlCyD;EiBrlCzD,wCjBqlCyD;EiBrlCzD,8EjBqlCyD,EAAA;EiBjlCzD;IemGN;MflGQ,wBAAgB;MAAhB,gBAAgB,EAAA,EeoHvB;EAlBD;IAUI,qBAAqB,EAAA;EAVzB;IAcI,qBAAqB;IACrB,UAAU;IACV,iChCsmBkC;IgCtmBlC,yBhCsmBkC,EAAA;;AgChmBtC;EACE,qBAAqB;EACrB,YAAY;EACZ,aAAa;EACb,sBAAsB;EACtB,4BAA4B;EAC5B,2BAA2B;EAC3B,qBAAqB,EAAA;;AAGvB;EACE,yCAAwE;EACxE,gBAAgB,EAAA;;AvB1Fd;EuBsGA;IAEI,qBAAiB;IAAjB,iBAAiB;IACjB,uBAA2B;IAA3B,oBAA2B;IAA3B,2BAA2B,EAAA;IAH9B;MAMK,8BAAmB;MAAnB,6BAAmB;MAAnB,uBAAmB;MAAnB,mBAAmB,EAAA;MANxB;QASO,kBAAkB,EAAA;MATzB;QAaO,qBhCq6B6B;QgCp6B7B,oBhCo6B6B,EAAA;IgCl7BpC;MAmBK,iBAAiB,EAAA;IAnBtB;MAuBK,+BAAwB;MAAxB,+BAAwB;MAAxB,wBAAwB;MACxB,6BAAgB;MAAhB,gBAAgB,EAAA;IAxBrB;MA4BK,aAAa,EAAA;IA5BlB;MAgCK,aAAa,EAAA;IAhClB;MAoCK,iBAAiB;MACjB,SAAS;MACT,aAAa;MACb,mBAAY;MAAZ,oBAAY;MAAZ,YAAY;MACZ,8BAA8B;MAC9B,6BAA6B;MAC7B,eAAe;MACf,cAAc;MfhMlB,wBeiM4B;MfjM5B,gBeiM4B;MACxB,uBAAe;MAAf,eAAe,EAAA;IA7CpB;;MAiDK,YAAY;MACZ,aAAa;MACb,gBAAgB,EAAA;IAnDrB;MAuDK,oBAAa;MAAb,oBAAa;MAAb,aAAa;MACb,mBAAY;MAAZ,oBAAY;MAAZ,YAAY;MACZ,UAAU;MACV,mBAAmB,EAAA,EACpB;;AvBjKL;EuBsGA;IAEI,qBAAiB;IAAjB,iBAAiB;IACjB,uBAA2B;IAA3B,oBAA2B;IAA3B,2BAA2B,EAAA;IAH9B;MAMK,8BAAmB;MAAnB,6BAAmB;MAAnB,uBAAmB;MAAnB,mBAAmB,EAAA;MANxB;QASO,kBAAkB,EAAA;MATzB;QAaO,qBhCq6B6B;QgCp6B7B,oBhCo6B6B,EAAA;IgCl7BpC;MAmBK,iBAAiB,EAAA;IAnBtB;MAuBK,+BAAwB;MAAxB,+BAAwB;MAAxB,wBAAwB;MACxB,6BAAgB;MAAhB,gBAAgB,EAAA;IAxBrB;MA4BK,aAAa,EAAA;IA5BlB;MAgCK,aAAa,EAAA;IAhClB;MAoCK,iBAAiB;MACjB,SAAS;MACT,aAAa;MACb,mBAAY;MAAZ,oBAAY;MAAZ,YAAY;MACZ,8BAA8B;MAC9B,6BAA6B;MAC7B,eAAe;MACf,cAAc;MfhMlB,wBeiM4B;MfjM5B,gBeiM4B;MACxB,uBAAe;MAAf,eAAe,EAAA;IA7CpB;;MAiDK,YAAY;MACZ,aAAa;MACb,gBAAgB,EAAA;IAnDrB;MAuDK,oBAAa;MAAb,oBAAa;MAAb,aAAa;MACb,mBAAY;MAAZ,oBAAY;MAAZ,YAAY;MACZ,UAAU;MACV,mBAAmB,EAAA,EACpB;;AvBjKL;EuBsGA;IAEI,qBAAiB;IAAjB,iBAAiB;IACjB,uBAA2B;IAA3B,oBAA2B;IAA3B,2BAA2B,EAAA;IAH9B;MAMK,8BAAmB;MAAnB,6BAAmB;MAAnB,uBAAmB;MAAnB,mBAAmB,EAAA;MANxB;QASO,kBAAkB,EAAA;MATzB;QAaO,qBhCq6B6B;QgCp6B7B,oBhCo6B6B,EAAA;IgCl7BpC;MAmBK,iBAAiB,EAAA;IAnBtB;MAuBK,+BAAwB;MAAxB,+BAAwB;MAAxB,wBAAwB;MACxB,6BAAgB;MAAhB,gBAAgB,EAAA;IAxBrB;MA4BK,aAAa,EAAA;IA5BlB;MAgCK,aAAa,EAAA;IAhClB;MAoCK,iBAAiB;MACjB,SAAS;MACT,aAAa;MACb,mBAAY;MAAZ,oBAAY;MAAZ,YAAY;MACZ,8BAA8B;MAC9B,6BAA6B;MAC7B,eAAe;MACf,cAAc;MfhMlB,wBeiM4B;MfjM5B,gBeiM4B;MACxB,uBAAe;MAAf,eAAe,EAAA;IA7CpB;;MAiDK,YAAY;MACZ,aAAa;MACb,gBAAgB,EAAA;IAnDrB;MAuDK,oBAAa;MAAb,oBAAa;MAAb,aAAa;MACb,mBAAY;MAAZ,oBAAY;MAAZ,YAAY;MACZ,UAAU;MACV,mBAAmB,EAAA,EACpB;;AvBjKL;EuBsGA;IAEI,qBAAiB;IAAjB,iBAAiB;IACjB,uBAA2B;IAA3B,oBAA2B;IAA3B,2BAA2B,EAAA;IAH9B;MAMK,8BAAmB;MAAnB,6BAAmB;MAAnB,uBAAmB;MAAnB,mBAAmB,EAAA;MANxB;QASO,kBAAkB,EAAA;MATzB;QAaO,qBhCq6B6B;QgCp6B7B,oBhCo6B6B,EAAA;IgCl7BpC;MAmBK,iBAAiB,EAAA;IAnBtB;MAuBK,+BAAwB;MAAxB,+BAAwB;MAAxB,wBAAwB;MACxB,6BAAgB;MAAhB,gBAAgB,EAAA;IAxBrB;MA4BK,aAAa,EAAA;IA5BlB;MAgCK,aAAa,EAAA;IAhClB;MAoCK,iBAAiB;MACjB,SAAS;MACT,aAAa;MACb,mBAAY;MAAZ,oBAAY;MAAZ,YAAY;MACZ,8BAA8B;MAC9B,6BAA6B;MAC7B,eAAe;MACf,cAAc;MfhMlB,wBeiM4B;MfjM5B,gBeiM4B;MACxB,uBAAe;MAAf,eAAe,EAAA;IA7CpB;;MAiDK,YAAY;MACZ,aAAa;MACb,gBAAgB,EAAA;IAnDrB;MAuDK,oBAAa;MAAb,oBAAa;MAAb,aAAa;MACb,mBAAY;MAAZ,oBAAY;MAAZ,YAAY;MACZ,UAAU;MACV,mBAAmB,EAAA,EACpB;;AvBjKL;EuBsGA;IAEI,qBAAiB;IAAjB,iBAAiB;IACjB,uBAA2B;IAA3B,oBAA2B;IAA3B,2BAA2B,EAAA;IAH9B;MAMK,8BAAmB;MAAnB,6BAAmB;MAAnB,uBAAmB;MAAnB,mBAAmB,EAAA;MANxB;QASO,kBAAkB,EAAA;MATzB;QAaO,qBhCq6B6B;QgCp6B7B,oBhCo6B6B,EAAA;IgCl7BpC;MAmBK,iBAAiB,EAAA;IAnBtB;MAuBK,+BAAwB;MAAxB,+BAAwB;MAAxB,wBAAwB;MACxB,6BAAgB;MAAhB,gBAAgB,EAAA;IAxBrB;MA4BK,aAAa,EAAA;IA5BlB;MAgCK,aAAa,EAAA;IAhClB;MAoCK,iBAAiB;MACjB,SAAS;MACT,aAAa;MACb,mBAAY;MAAZ,oBAAY;MAAZ,YAAY;MACZ,8BAA8B;MAC9B,6BAA6B;MAC7B,eAAe;MACf,cAAc;MfhMlB,wBeiM4B;MfjM5B,gBeiM4B;MACxB,uBAAe;MAAf,eAAe,EAAA;IA7CpB;;MAiDK,YAAY;MACZ,aAAa;MACb,gBAAgB,EAAA;IAnDrB;MAuDK,oBAAa;MAAb,oBAAa;MAAb,aAAa;MACb,mBAAY;MAAZ,oBAAY;MAAZ,YAAY;MACZ,UAAU;MACV,mBAAmB,EAAA,EACpB;;AAjET;EAQQ,qBAAiB;EAAjB,iBAAiB;EACjB,uBAA2B;EAA3B,oBAA2B;EAA3B,2BAA2B,EAAA;EATnC;IAYU,8BAAmB;IAAnB,6BAAmB;IAAnB,uBAAmB;IAAnB,mBAAmB,EAAA;IAZ7B;MAeY,kBAAkB,EAAA;IAf9B;MAmBY,qBhCq6B6B;MgCp6B7B,oBhCo6B6B,EAAA;EgCx7BzC;IAyBU,iBAAiB,EAAA;EAzB3B;IA6BU,+BAAwB;IAAxB,+BAAwB;IAAxB,wBAAwB;IACxB,6BAAgB;IAAhB,gBAAgB,EAAA;EA9B1B;IAkCU,aAAa,EAAA;EAlCvB;IAsCU,aAAa,EAAA;EAtCvB;IA0CU,iBAAiB;IACjB,SAAS;IACT,aAAa;IACb,mBAAY;IAAZ,oBAAY;IAAZ,YAAY;IACZ,8BAA8B;IAC9B,6BAA6B;IAC7B,eAAe;IACf,cAAc;IfhMlB,wBeiM4B;IfjM5B,gBeiM4B;IACxB,uBAAe;IAAf,eAAe,EAAA;EAnDzB;;IAuDU,YAAY;IACZ,aAAa;IACb,gBAAgB,EAAA;EAzD1B;IA6DU,oBAAa;IAAb,oBAAa;IAAb,aAAa;IACb,mBAAY;IAAZ,oBAAY;IAAZ,YAAY;IACZ,UAAU;IACV,mBAAmB,EAAA;;AAa7B;EAEI,yBhC5NW,EAAA;EgC0Nf;IAMM,yBhChOS,EAAA;;AgC0Nf;EAYM,0BhCtOS,EAAA;EgC0Nf;IAgBQ,yBhC1OO,EAAA;EgC0Nf;IAoBQ,yBhC9OO,EAAA;;AgC0Nf;;EA0BM,yBhCpPS,EAAA;;AgC0Nf;EA+BI,0BhCzPW;EgC0PX,gChC1PW,EAAA;;AgC0Nf;EAoCI,6P/BzI8E,EAAA;;A+BqGlF;EAwCI,0BhClQW,EAAA;EgC0Nf;;;IA6CM,yBhCvQS,EAAA;;AgC6Qf;EAEI,WhCzRW,EAAA;EgCuRf;IAMM,WhC7RS,EAAA;;AgCuRf;EAYM,gChCnSS,EAAA;EgCuRf;IAgBQ,gChCvSO,EAAA;EgCuRf;IAoBQ,gChC3SO,EAAA;;AgCuRf;;EA0BM,WhCjTS,EAAA;;AgCuRf;EA+BI,gChCtTW;EgCuTX,sChCvTW,EAAA;;AgCuRf;EAoCI,mQ/B5L8E,EAAA;;A+BwJlF;EAwCI,gChC/TW,EAAA;EgCuRf;;;IA4CM,WhCnUS,EAAA;;AiCJf;EACE,kBAAkB;EAClB,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,4BAAsB;EAAtB,6BAAsB;EAAtB,0BAAsB;EAAtB,sBAAsB;EACtB,YAAY;EAEZ,qBAAqB;EACrB,sBlC2HY;EkC1HZ,2BAA2B;EAC3B,sCjCKa;EECX,wBHwOyB,EAAA;EkCvP7B;IAcI,eAAe;IACf,cAAc,EAAA;EAflB;IAmBI,mBAAmB;IACnB,sBAAsB,EAAA;IApB1B;MAuBM,mBAAmB;M/BCrB,2CDsO4D;MCrO5D,4CDqO4D,EAAA;IgC9PhE;MA4BM,sBAAsB;M/BUxB,+CDwN4D;MCvN5D,8CDuN4D,EAAA;EgC9PhE;;IAqCI,aAAa,EAAA;;AAIjB;EAGE,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,kBjCqUW,EAAA;;AiCjUb;EACE,qBjCirC8C,EAAA;;AiC9qChD;EACE,oBAAsC;EACtC,gBAAgB,EAAA;;AAGlB;EACE,gBAAgB,EAAA;;AAGlB;EAMI,iBjC8SS,EAAA;;AiCtSb;EACE,oBjCqSW;EiCpSX,gBAAgB;EAEhB,qCjClEa;EiCmEb,6CjCnEa,EAAA;EiC8Df;I/B7DI,0D+BqE8E,EAAA;;AAIlF;EACE,oBjCyRW;EiCvRX,qCjC7Ea;EiC8Eb,0CjC9Ea,EAAA;EiC0Ef;I/BzEI,0DD+O4D,EAAA;;AgCtJhE;EACE,qBAAuC;EACvC,sBjC+nCqD;EiC9nCrD,oBAAsC;EACtC,gBAAgB,EAAA;;AAUlB;EACE,qBAAuC;EACvC,oBAAsC,EAAA;;AAIxC;EACE,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,OAAO;EACP,ajCgPW;EEnWT,kCD+O4D,EAAA;;AgCxHhE;;;EAGE,WAAW,EAAA;;AAGb;;E/BpHI,2CDsO4D;ECrO5D,4CDqO4D,EAAA;;AgC7GhE;;E/B3GI,+CDwN4D;ECvN5D,8CDuN4D,EAAA;;AgCnGhE;EAII,sBjCklCuD,EAAA;;AStrCvD;EwBgGJ;IAQI,oBAAa;IAAb,oBAAa;IAAb,aAAa;IACb,8BAAmB;IAAnB,6BAAmB;IAAnB,uBAAmB;IAAnB,mBAAmB,EAAA;IATvB;MAcM,mBAAY;MAAZ,gBAAY;MAAZ,YAAY;MACZ,gBAAgB,EAAA;MAftB;QAkBQ,cAAc;QACd,cAAc,EAAA;MAnBtB;Q/B5HI,0B+BqJkC;Q/BpJlC,6B+BoJkC,EAAA;QAzBtC;;UA8BY,0BAA0B,EAAA;QA9BtC;;UAmCY,6BAA6B,EAAA;MAnCzC;Q/B9GI,yB+BsJoC;Q/BrJpC,4B+BqJoC,EAAA;QAxCxC;;UA6CY,yBAAyB,EAAA;QA7CrC;;UAkDY,4BAA4B,EAAA,EAC7B;;AC9MX;EACE,kBAAkB;EAClB,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,WAAW;EACX,qBlCmvC+C;EFv9B3C,eAvE+B;EoCnNnC,clCMgB;EkCLhB,gBAAgB;EAChB,sBlCLa;EkCMb,SAAS;EhCKP,gBgCJsB;EACxB,qBAAqB;EjBAjB,+KjB2vC4E;EiB3vC5E,uKjB2vC4E;EiB3vC5E,+JjB2vC4E;EiB3vC5E,qMjB2vC4E,EAAA;EiBvvC5E;IiBhBN;MjBiBQ,wBAAgB;MAAhB,gBAAgB,EAAA,EiBgCvB;EAjDD;IAgBI,cjC+LiC;IiC9LjC,yBjCyLiC;IiCxLjC,uDlCJW;IkCIX,+ClCJW,EAAA;IkCdf;MAqBM,iSjC8G4E;MiC7G5E,kClC4vCmD;MkC5vCnD,0BlC4vCmD,EAAA;EkClxCzD;IA4BI,oBAAc;IAAd,cAAc;IACd,clCivC6C;IkChvC7C,elCgvC6C;IkC/uC7C,iBAAiB;IACjB,WAAW;IACX,iSjCkG8E;IiCjG9E,4BAA4B;IAC5B,wBlC2uC6C;IiBlwC3C,sDjBqwC6D;IiBrwC7D,8CjBqwC6D;IiBrwC7D,sCjBqwC6D;IiBrwC7D,0EjBqwC6D,EAAA;IiBjwC7D;MiBhBN;QjBiBQ,wBAAgB;QAAhB,gBAAgB,EAAA,EiBoBrB;EArCH;IAwCI,UAAU,EAAA;EAxCd;IA4CI,UAAU;IACV,qBjC6JiC;IiC5JjC,UAAU;IACV,0DlCba;IkCab,kDlCba,EAAA;;AkCiBjB;EACE,gBAAgB,EAAA;;AAGlB;EACE,sBlCpDa;EkCqDb,sClC3Ca,EAAA;EkCyCf;IhC/BI,+BFsfgC;IErfhC,gCFqfgC,EAAA;IkCvdpC;MhC/BI,2CDsO4D;MCrO5D,4CDqO4D,EAAA;EiCvMhE;IAaI,aAAa,EAAA;EAbjB;IhCjBI,mCFwegC;IEvehC,kCFuegC,EAAA;IkCvdpC;MhCjBI,+CDwN4D;MCvN5D,8CDuN4D,EAAA;IiCvMhE;MhCjBI,mCFwegC;MEvehC,kCFuegC,EAAA;;AkCvbpC;EACE,qBlCgqC+C,EAAA;;AkCxpCjD;EAEI,eAAe,EAAA;;AAFnB;EAMI,eAAe;EACf,cAAc;EhCxFd,gBgCyFwB,EAAA;EAR5B;IAUoB,aAAa,EAAA;EAVjC;IAWmB,gBAAgB,EAAA;EAXnC;IhCjFI,gBgC+F0B,EAAA;;AClH9B;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,wBpCkQ4B;EoCjQ5B,mBpCmQ6B;ED8BzB,mBAvE+B;EqCxNnC,gBAAgB;EAChB,6BpCkQyB,EAAA;;AoC9P3B;EAGI,oBnC6+CqC,EAAA;EmCh/CzC;IAMM,WAAW;IACX,qBnCy+CmC;ImCx+CnC,cnCLY;ImCMZ,uFAAyO,EAAA;;AAT/O;EAcI,cnCVc,EAAA;;AoCflB;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EhCGb,eAAe;EACf,gBAAgB,EAAA;;AgCAlB;EACE,kBAAkB;EAClB,cAAc;EACd,cpC8Be;EoC7Bf,qBAAwD;EACxD,sBpCFa;EoCGb,yBpCAgB;EiBKZ,qJjBosCoJ;EiBpsCpJ,6IjBosCoJ;EiBpsCpJ,qIjBosCoJ;EiBpsCpJ,2KjBosCoJ,EAAA;EiBhsCpJ;ImBfN;MnBgBQ,wBAAgB;MAAhB,gBAAgB,EAAA,EmBQvB;EAxBD;IAUI,UAAU;IACV,cnCmMiC;ImCjMjC,yBpCRc;IoCSd,qBpCRc,EAAA;EoCNlB;IAkBI,UAAU;IACV,cnC2LiC;ImC1LjC,yBpCfc;IoCgBd,UpC4qCiC;IoC3qCjC,0DpCWa;IoCXb,kDpCWa,EAAA;;AoCPjB;EAEI,iBpCoe6B,EAAA;;AoCtejC;EAMI,UAAU;EACV,WpC9BW;EkBJb,yBlBkCe;EoCEb,qBpCFa,EAAA;;AoCPjB;EAaI,cpC9Bc;EoC+Bd,oBAAoB;EACpB,sBpCtCW;EoCuCX,qBpCpCc,EAAA;;AoCNlB;ECAI,yBrCirCsC,EAAA;;AqC7qCxC;EnCwCE,+BFiegC;EEhehC,kCFgegC,EAAA;;AqCzgBlC;EnC0BE,gCF+egC;EE9ehC,mCF8egC,EAAA;;AqC9gBlC;EACE,uBrCqrCsC;EFr5BpC,kBAvE+B,EAAA;;AuClN7B;EnCqCJ,8BFme+B;EEle/B,iCFke+B,EAAA;;AqClgB3B;EnCiBJ,+BFif+B;EEhf/B,kCFgf+B,EAAA;;AqChhBjC;EACE,uBrCmrCqC;EFn5BnC,mBAvE+B,EAAA;;AuClN7B;EnCqCJ,8BFke+B;EEje/B,iCFie+B,EAAA;;AqCjgB3B;EnCiBJ,+BFgf+B;EE/e/B,kCF+e+B,EAAA;;AsC9gBnC;EACE,qBAAqB;EACrB,sBtC22CuC;EF7kCnC,iBAvE+B;EwCrNnC,gBtCukB+B;EsCtkB/B,cAAc;EACd,WtCHa;EsCIb,kBAAkB;EAClB,mBAAmB;EACnB,wBAAwB;EpCKtB,sBF+fgC,EAAA;EsC7gBpC;IAeI,aAAa,EAAA;;AAKjB;EACE,kBAAkB;EAClB,SAAS,EAAA;;ACvBX;EACE,kBAAkB;EAClB,kBvCgXW;EuC/WX,mBvCk6CkC;EuCj6ClC,6BAA6C;ErCW3C,sBF+fgC,EAAA;;AuCrgBpC;EAEE,cAAc,EAAA;;AAIhB;EACE,gBvC4jB+B,EAAA;;AuCpjBjC;EACE,mBvCm5CkD,EAAA;EuCp5CpD;IAKI,kBAAkB;IAClB,MAAM;IACN,QAAQ;IACR,UvC+ZuC;IuC9ZvC,qBvCiVS,EAAA;;AuClUX;EClDA,cvCiNmC;EiB/MnC,yBjB0MmC;EuC1MnC,qBvC0MmC,EAAA;EuCxMnC;IACE,cvC4MiC,EAAA;;AsC/JnC;EClDA,cDgDuF;ErB9CvF,yBjB0MmC;EuC1MnC,qBvC0MmC,EAAA;EuCxMnC;IACE,cvC4MiC,EAAA;;AsC/JnC;EClDA,cDgDuF;ErB9CvF,yBjB0MmC;EuC1MnC,qBvC0MmC,EAAA;EuCxMnC;IACE,cvC4MiC,EAAA;;AsC/JnC;EClDA,cvCiNmC;EiB/MnC,yBjB0MmC;EuC1MnC,qBvC0MmC,EAAA;EuCxMnC;IACE,cvC4MiC,EAAA;;AsC/JnC;EClDA,cDgDuF;ErB9CvF,yBjB0MmC;EuC1MnC,qBvC0MmC,EAAA;EuCxMnC;IACE,cvC4MiC,EAAA;;AsC/JnC;EClDA,cvCiNmC;EiB/MnC,yBjB0MmC;EuC1MnC,qBvC0MmC,EAAA;EuCxMnC;IACE,cvC4MiC,EAAA;;AsC/JnC;EClDA,cDgDuF;ErB9CvF,yBjB0MmC;EuC1MnC,qBvC0MmC,EAAA;EuCxMnC;IACE,cvC4MiC,EAAA;;AsC/JnC;EClDA,cvCiNmC;EiB/MnC,yBjB0MmC;EuC1MnC,qBvC0MmC,EAAA;EuCxMnC;IACE,cvC4MiC,EAAA;;AwC/MnC;EACE;IAAK,2BzCk7C+B,EAAA,EAAA;;AyCn7CtC;EACE;IAAK,2BzCk7C+B,EAAA,EAAA;;AyC76CxC;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,YzC26CsC;EyC16CtC,gBAAgB;E3CwRZ,kBAvE+B;E2C/MnC,yBzCLgB;EESd,sBF+fgC,EAAA;;AyC9fpC;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,4BAAsB;EAAtB,6BAAsB;EAAtB,0BAAsB;EAAtB,sBAAsB;EACtB,wBAAuB;EAAvB,qBAAuB;EAAvB,uBAAuB;EACvB,gBAAgB;EAChB,WzCjBa;EyCkBb,kBAAkB;EAClB,mBAAmB;EACnB,yBzCUe;EiBtBX,mCjB+6C4C;EiB/6C5C,2BjB+6C4C,EAAA;EiB36C5C;IwBAN;MxBCQ,wBAAgB;MAAhB,gBAAgB,EAAA,EwBSvB;;AAED;EvBYE,qMAA6I;EuBV7I,0BzCq5CsC,EAAA;;AyCj5CtC;EACE,0DAA8D;EAA9D,kDAA8D,EAAA;EAG5D;IAJJ;MAKM,uBAAe;MAAf,eAAe,EAAA,EAGpB;;AC1CH;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,4BAAsB;EAAtB,6BAAsB;EAAtB,0BAAsB;EAAtB,sBAAsB;EAGtB,eAAe;EACf,gBAAgB;ExCSd,sBF+fgC,EAAA;;A0CpgBpC;EACE,qBAAqB;EACrB,sBAAsB,EAAA;EAFxB;IAMI,oCAAoC;IACpC,0BAA0B,EAAA;;AAU9B;EACE,WAAW;EACX,c1ClBgB;E0CmBhB,mBAAmB,EAAA;EAHrB;IAQI,UAAU;IACV,c1CzBc;I0C0Bd,qBAAqB;IACrB,yB1CjCc,EAAA;E0CsBlB;IAeI,c1C7Bc;I0C8Bd,yB1CrCc,EAAA;;A0C8ClB;EACE,kBAAkB;EAClB,cAAc;EACd,oB1C2TW;E0C1TX,c1C3CgB;E0C4ChB,qBAAwD;EACxD,sB1CtDa;E0CuDb,sC1C7Ca,EAAA;E0CsCf;IxC5BI,+BwCsCkC;IxCrClC,gCwCqCkC,EAAA;EAVtC;IxCdI,mCwC4BqC;IxC3BrC,kCwC2BqC,EAAA;EAdzC;IAmBI,c1C7Dc;I0C8Dd,oBAAoB;IACpB,sB1CrEW,EAAA;E0CgDf;IA0BI,UAAU;IACV,W1C3EW;I0C4EX,yB1C9Ca;I0C+Cb,qB1C/Ca,EAAA;E0CkBjB;IAiCI,mBAAmB,EAAA;IAjCvB;MAoCM,gB1Cya2B;M0Cxa3B,qB1Cwa2B,EAAA;;A0C1Z7B;EACE,8BAAmB;EAAnB,6BAAmB;EAAnB,uBAAmB;EAAnB,mBAAmB,EAAA;EADrB;IxCjCA,kCFwcgC;IEpdhC,0BwCmDsC,EAAA;EANtC;IxC7CA,gCFodgC;IExchC,4BwC4C2C,EAAA;EAX3C;IAeM,aAAa,EAAA;EAfnB;IAmBM,qB1CuYuB;I0CtYvB,oBAAoB,EAAA;IApB1B;MAuBQ,iB1CmYqB;M0ClYrB,sB1CkYqB,EAAA;;AStc7B;EiC4CA;IACE,8BAAmB;IAAnB,6BAAmB;IAAnB,uBAAmB;IAAnB,mBAAmB,EAAA;IADrB;MxCjCA,kCFwcgC;MEpdhC,0BwCmDsC,EAAA;IANtC;MxC7CA,gCFodgC;MExchC,4BwC4C2C,EAAA;IAX3C;MAeM,aAAa,EAAA;IAfnB;MAmBM,qB1CuYuB;M0CtYvB,oBAAoB,EAAA;MApB1B;QAuBQ,iB1CmYqB;Q0ClYrB,sB1CkYqB,EAAA,E0CjYtB;;AjCrEP;EiC4CA;IACE,8BAAmB;IAAnB,6BAAmB;IAAnB,uBAAmB;IAAnB,mBAAmB,EAAA;IADrB;MxCjCA,kCFwcgC;MEpdhC,0BwCmDsC,EAAA;IANtC;MxC7CA,gCFodgC;MExchC,4BwC4C2C,EAAA;IAX3C;MAeM,aAAa,EAAA;IAfnB;MAmBM,qB1CuYuB;M0CtYvB,oBAAoB,EAAA;MApB1B;QAuBQ,iB1CmYqB;Q0ClYrB,sB1CkYqB,EAAA,E0CjYtB;;AjCrEP;EiC4CA;IACE,8BAAmB;IAAnB,6BAAmB;IAAnB,uBAAmB;IAAnB,mBAAmB,EAAA;IADrB;MxCjCA,kCFwcgC;MEpdhC,0BwCmDsC,EAAA;IANtC;MxC7CA,gCFodgC;MExchC,4BwC4C2C,EAAA;IAX3C;MAeM,aAAa,EAAA;IAfnB;MAmBM,qB1CuYuB;M0CtYvB,oBAAoB,EAAA;MApB1B;QAuBQ,iB1CmYqB;Q0ClYrB,sB1CkYqB,EAAA,E0CjYtB;;AjCrEP;EiC4CA;IACE,8BAAmB;IAAnB,6BAAmB;IAAnB,uBAAmB;IAAnB,mBAAmB,EAAA;IADrB;MxCjCA,kCFwcgC;MEpdhC,0BwCmDsC,EAAA;IANtC;MxC7CA,gCFodgC;MExchC,4BwC4C2C,EAAA;IAX3C;MAeM,aAAa,EAAA;IAfnB;MAmBM,qB1CuYuB;M0CtYvB,oBAAoB,EAAA;MApB1B;QAuBQ,iB1CmYqB;Q0ClYrB,sB1CkYqB,EAAA,E0CjYtB;;AjCrEP;EiC4CA;IACE,8BAAmB;IAAnB,6BAAmB;IAAnB,uBAAmB;IAAnB,mBAAmB,EAAA;IADrB;MxCjCA,kCFwcgC;MEpdhC,0BwCmDsC,EAAA;IANtC;MxC7CA,gCFodgC;MExchC,4BwC4C2C,EAAA;IAX3C;MAeM,aAAa,EAAA;IAfnB;MAmBM,qB1CuYuB;M0CtYvB,oBAAoB,EAAA;MApB1B;QAuBQ,iB1CmYqB;Q0ClYrB,sB1CkYqB,EAAA,E0CjYtB;;AAaX;ExC9HI,gBwC+HsB,EAAA;EAD1B;IAII,qB1CgX6B,EAAA;I0CpXjC;MAOM,sBAAsB,EAAA;;ACpJ1B;EACE,c1C8MiC;E0C7MjC,yB1CwMiC,EAAA;E0C1MnC;IAOM,c1CwM6B;I0CvM7B,yB1CuM6B,EAAA;E0C/MnC;IAYM,c5CHO;I4CIP,yB1CkM6B;I0CjM7B,qB1CiM6B,EAAA;;A0C/MnC;EACE,cDmKiH;EClKjH,yB1CwMiC,EAAA;E0C1MnC;IAOM,cD6J6G;IC5J7G,yB1CuM6B,EAAA;E0C/MnC;IAYM,c5CHO;I4CIP,yBDuJ6G;ICtJ7G,qBDsJ6G,EAAA;;ACpKnH;EACE,cDmKiH;EClKjH,yB1CwMiC,EAAA;E0C1MnC;IAOM,cD6J6G;IC5J7G,yB1CuM6B,EAAA;E0C/MnC;IAYM,c5CHO;I4CIP,yBDuJ6G;ICtJ7G,qBDsJ6G,EAAA;;ACpKnH;EACE,c1C8MiC;E0C7MjC,yB1CwMiC,EAAA;E0C1MnC;IAOM,c1CwM6B;I0CvM7B,yB1CuM6B,EAAA;E0C/MnC;IAYM,c5CHO;I4CIP,yB1CkM6B;I0CjM7B,qB1CiM6B,EAAA;;A0C/MnC;EACE,cDmKiH;EClKjH,yB1CwMiC,EAAA;E0C1MnC;IAOM,cD6J6G;IC5J7G,yB1CuM6B,EAAA;E0C/MnC;IAYM,c5CHO;I4CIP,yBDuJ6G;ICtJ7G,qBDsJ6G,EAAA;;ACpKnH;EACE,c1C8MiC;E0C7MjC,yB1CwMiC,EAAA;E0C1MnC;IAOM,c1CwM6B;I0CvM7B,yB1CuM6B,EAAA;E0C/MnC;IAYM,c5CHO;I4CIP,yB1CkM6B;I0CjM7B,qB1CiM6B,EAAA;;A0C/MnC;EACE,cDmKiH;EClKjH,yB1CwMiC,EAAA;E0C1MnC;IAOM,cD6J6G;IC5J7G,yB1CuM6B,EAAA;E0C/MnC;IAYM,c5CHO;I4CIP,yBDuJ6G;ICtJ7G,qBDsJ6G,EAAA;;ACpKnH;EACE,c1C8MiC;E0C7MjC,yB1CwMiC,EAAA;E0C1MnC;IAOM,c1CwM6B;I0CvM7B,yB1CuM6B,EAAA;E0C/MnC;IAYM,c5CHO;I4CIP,yB1CkM6B;I0CjM7B,qB1CiM6B,EAAA;;A2C9MrC;EACE,+BAAuB;EAAvB,uBAAuB;EACvB,U5CqjD8B;E4CpjD9B,W5CojD8B;E4CnjD9B,sB5CqjDgC;E4CpjDhC,W5CQa;E4CPb,2WAA0F;EAC1F,SAAS;E1COP,sBF+fgC;E4CpgBlC,Y5CqjD6B,EAAA;E4C9jD/B;IAaI,W5CAW;I4CCX,qBAAqB;IACrB,a5CgjD4B,EAAA;E4C/jDhC;IAmBI,UAAU;IACV,0D5Caa;I4Cbb,kD5Caa;I4CZb,U5C2iD0B,EAAA;E4ChkD9B;IA0BI,oBAAoB;IACpB,yBAAiB;IAAjB,sBAAiB;IAAjB,qBAAiB;IAAjB,iBAAiB;IACjB,a5CqiD4B,EAAA;;A4CjiDhC;EACE,0D5CiiDqE;E4CjiDrE,kD5CiiDqE,EAAA;;A6CvkDvE;EACE,Y7Cw1CuC;E6Cv1CvC,eAAe;E/CmSX,mBAvE+B;E+CzNnC,oBAAoB;EACpB,2C7CEa;E6CDb,4BAA4B;EAC5B,oC7CUa;E6CTb,qD7CSa;E6CTb,6C7CSa;EECX,sBF+fgC,EAAA;E6ClhBpC;IAaI,UAAU,EAAA;EAbd;IAiBI,aAAa,EAAA;;AAIjB;EACE,0BAAkB;EAAlB,uBAAkB;EAAlB,kBAAkB;EAClB,eAAe;EACf,oBAAoB,EAAA;EAHtB;IAMI,sB7CkeyC,EAAA;;A6C9d7C;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,uB7CwzCwC;E6CvzCxC,c7CrBgB;E6CsBhB,2C7C5Ba;E6C6Bb,4BAA4B;EAC5B,4C7CpBa;EEUX,2CDsO4D;ECrO5D,4CDqO4D,EAAA;E4CnOhE;IAWI,uBAAoC;IACpC,oB7C+yCsC,EAAA;;A6C3yC1C;EACE,gB7C0yCwC;E6CzyCxC,qBAAqB,EAAA;;AC1CvB;EACE,eAAe;EACf,MAAM;EACN,OAAO;EACP,a9CsiCsC;E8CriCtC,aAAa;EACb,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,gBAAgB;EAGhB,UAAU,EAAA;;AAOZ;EACE,kBAAkB;EAClB,WAAW;EACX,Y/C8PwB;E+C5PxB,oBAAoB,EAAA;EAGpB;I7BlBI,+ClBwS+B;IkBxS/B,uClBwS+B;IkBxS/B,+BlBwS+B;IkBxS/B,4DlBwS+B;I+CpRjC,sC9Cu3CmD;I8Cv3CnD,8B9Cu3CmD,EAAA;IiBv4CjD;M6BcJ;Q7BbM,wBAAgB;QAAhB,gBAAgB,EAAA,E6BgBrB;EACD;IACE,uB9Cq3CoC;I8Cr3CpC,e9Cq3CoC,EAAA;E8Cj3CtC;IACE,8B9Ck3C2C;I8Cl3C3C,sB9Ck3C2C,EAAA;;A8C92C/C;EACE,yB7CiN8D,EAAA;E6ClNhE;IAII,gBAAgB;IAChB,gBAAgB,EAAA;EALpB;IASI,gBAAgB,EAAA;;AAIpB;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,6B7CkM8D,EAAA;;A6C9LhE;EACE,kBAAkB;EAClB,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,4BAAsB;EAAtB,6BAAsB;EAAtB,0BAAsB;EAAtB,sBAAsB;EACtB,WAAW;EAGX,oBAAoB;EACpB,yB/CekB;E+CdlB,4BAA4B;EAC5B,yB/CgBoB;EG3ElB,qBFigB+B;E8ClcjC,UAAU,EAAA;;AAIZ;ECpFE,eAAe;EACf,MAAM;EACN,OAAO;EACP,a/C2iCsC;E+C1iCtC,YAAY;EACZ,aAAa;EACb,yBhDgDe,EAAA;EgD7Cf;IAAS,UAAU,EAAA;EACnB;IAAS,YhDsRgB,EAAA;;A+CtM3B;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,oBAAc;EAAd,cAAc;EACd,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,yBAA8B;EAA9B,sBAA8B;EAA9B,8BAA8B;EAC9B,kB9CqRW;E8CpRX,gC/CJoB;EGlElB,0CDsO4D;ECrO5D,2CDqO4D,EAAA;E6CtKhE;IAUI,oBAAsE;IACtE,kCAA4G,EAAA;;AAKhH;EACE,gBAAgB;EAChB,gB9Cue+B,EAAA;;A8ClejC;EACE,kBAAkB;EAGlB,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,kB/CkK4B,EAAA;;A+C9J9B;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,oBAAc;EAAd,cAAc;EACd,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,qBAAyB;EAAzB,kBAAyB;EAAzB,yBAAyB;EACzB,kBAAiE;EACjE,6B/CrCoB;EGpDlB,8CDwN4D;ECvN5D,6CDuN4D,EAAA;E6CtIhE;IAcI,eAAyC,EAAA;;ArC3EzC;EqCrCJ;IAwHI,gB/CoKY;I+CnKZ,iBAAyC,EAAA;EAnG7C;IAuGI,yB7C2G4D,EAAA;E6CrMhE;IA8FI,6B7CuG4D,EAAA;E6ChG9D;IAAY,gB/CqJE,EAAA,E+CrJsB;;ArCnGlC;EqCuGF;;IAEE,c/C6IU,EAAA,E+C5IX;;ArC1GC;EqC8GF;IAAY,iB9C4uC4B,EAAA,E8C5uCJ;;AASlC;EACE,YAAY;EACZ,eAAe;EACf,YAAY;EACZ,SAAS,EAAA;EAJX;IAOI,YAAY;IACZ,SAAS;I5C3Kb,gB4C4K4B,EAAA;EAT5B;I5CnKA,gB4CgL4B,EAAA;EAb5B;IAiBI,gBAAgB,EAAA;EAjBpB;I5CnKA,gB4CwL4B,EAAA;;ArC/H5B;EqC0GA;IACE,YAAY;IACZ,eAAe;IACf,YAAY;IACZ,SAAS,EAAA;IAJX;MAOI,YAAY;MACZ,SAAS;M5C3Kb,gB4C4K4B,EAAA;IAT5B;M5CnKA,gB4CgL4B,EAAA;IAb5B;MAiBI,gBAAgB,EAAA;IAjBpB;M5CnKA,gB4CwL4B,EAAA,EACzB;;ArChIH;EqC0GA;IACE,YAAY;IACZ,eAAe;IACf,YAAY;IACZ,SAAS,EAAA;IAJX;MAOI,YAAY;MACZ,SAAS;M5C3Kb,gB4C4K4B,EAAA;IAT5B;M5CnKA,gB4CgL4B,EAAA;IAb5B;MAiBI,gBAAgB,EAAA;IAjBpB;M5CnKA,gB4CwL4B,EAAA,EACzB;;ArChIH;EqC0GA;IACE,YAAY;IACZ,eAAe;IACf,YAAY;IACZ,SAAS,EAAA;IAJX;MAOI,YAAY;MACZ,SAAS;M5C3Kb,gB4C4K4B,EAAA;IAT5B;M5CnKA,gB4CgL4B,EAAA;IAb5B;MAiBI,gBAAgB,EAAA;IAjBpB;M5CnKA,gB4CwL4B,EAAA,EACzB;;ArChIH;EqC0GA;IACE,YAAY;IACZ,eAAe;IACf,YAAY;IACZ,SAAS,EAAA;IAJX;MAOI,YAAY;MACZ,SAAS;M5C3Kb,gB4C4K4B,EAAA;IAT5B;M5CnKA,gB4CgL4B,EAAA;IAb5B;MAiBI,gBAAgB,EAAA;IAjBpB;M5CnKA,gB4CwL4B,EAAA,EACzB;;ArChIH;EqC0GA;IACE,YAAY;IACZ,eAAe;IACf,YAAY;IACZ,SAAS,EAAA;IAJX;MAOI,YAAY;MACZ,SAAS;M5C3Kb,gB4C4K4B,EAAA;IAT5B;M5CnKA,gB4CgL4B,EAAA;IAb5B;MAiBI,gBAAgB,EAAA;IAjBpB;M5CnKA,gB4CwL4B,EAAA,EACzB;;AE3MP;EACE,kBAAkB;EAClB,ahDgjCsC;EgD/iCtC,cAAc;EACd,ShDkyCmC;EiDtyCnC,sCjDkkBsF;EiDhkBtF,kBAAkB;EAClB,gBjD2kB+B;EiD1kB/B,gBjDglB+B;EiD/kB/B,gBAAgB;EAChB,iBAAiB;EACjB,qBAAqB;EACrB,iBAAiB;EACjB,oBAAoB;EACpB,sBAAsB;EACtB,kBAAkB;EAClB,oBAAoB;EACpB,mBAAmB;EACnB,gBAAgB;EnDsRZ,kBAvE+B;EkDnNnC,qBAAqB;EACrB,UAAU,EAAA;EAXZ;IAaW,YhDsxC2B,EAAA;EgDnyCtC;IAgBI,kBAAkB;IAClB,cAAc;IACd,ahDsxCqC;IgDrxCrC,chDsxCqC,EAAA;IgDzyCzC;MAsBM,kBAAkB;MAClB,WAAW;MACX,yBAAyB;MACzB,mBAAmB,EAAA;;AAKzB;EACE,iBAAgC,EAAA;EADlC;IAII,SAAS,EAAA;IAJb;MAOM,SAAS;MACT,6BAAiE;MACjE,sBhDtBS,EAAA;;AgD2Bf;EACE,iBhD4vCuC,EAAA;EgD7vCzC;IAII,OAAO;IACP,ahDwvCqC;IgDvvCrC,chDsvCqC,EAAA;IgD5vCzC;MASM,WAAW;MACX,oCAA6F;MAC7F,wBhDtCS,EAAA;;AgD2Cf;EACE,iBAAgC,EAAA;EADlC;IAII,MAAM,EAAA;IAJV;MAOM,YAAY;MACZ,6BhDquCmC;MgDpuCnC,yBhDpDS,EAAA;;AgDyDf;EACE,iBhD8tCuC,EAAA;EgD/tCzC;IAII,QAAQ;IACR,ahD0tCqC;IgDztCrC,chDwtCqC,EAAA;IgD9tCzC;MASM,UAAU;MACV,oChDqtCmC;MgDptCnC,uBhDpES,EAAA;;AgDyFf;EACE,gBhDorCuC;EgDnrCvC,uBjD4FwB;EiD3FxB,WhDtGa;EgDuGb,kBAAkB;EAClB,sBhD9Fa;EECX,uBHuL2B,EAAA;;AmD1M/B;EACE,kBAAkB;EAClB,MAAM;EACN,wBAA6B;EAC7B,alD8iCsC;EkD7iCtC,cAAc;EACd,gBlDwzCuC;EiD7zCvC,sCjDkkBsF;EiDhkBtF,kBAAkB;EAClB,gBjD2kB+B;EiD1kB/B,gBjDglB+B;EiD/kB/B,gBAAgB;EAChB,iBAAiB;EACjB,qBAAqB;EACrB,iBAAiB;EACjB,oBAAoB;EACpB,sBAAsB;EACtB,kBAAkB;EAClB,oBAAoB;EACpB,mBAAmB;EACnB,gBAAgB;EnDsRZ,mBAvE+B;EoDlNnC,qBAAqB;EACrB,sBlDLa;EkDMb,4BAA4B;EAC5B,oClDGa;EECX,qBFigB+B,EAAA;EkDphBnC;IAoBI,kBAAkB;IAClB,cAAc;IACd,WlDwzCoC;IkDvzCpC,clDwzCqC,EAAA;IkD/0CzC;MA2BM,kBAAkB;MAClB,cAAc;MACd,WAAW;MACX,yBAAyB;MACzB,mBAAmB,EAAA;;AAKzB;EAEI,2BjD4N4D,EAAA;EiD9NhE;IAKM,SAAS;IACT,6BAAiE;IACjE,qClDuyCiE,EAAA;EkD9yCvE;IAWM,WlDsd2B;IkDrd3B,6BAAiE;IACjE,sBlDzCS,EAAA;;AkD8Cf;EAEI,yBjD0M4D;EiDzM5D,alDsxCqC;EkDrxCrC,YlDoxCoC,EAAA;EkDxxCxC;IAOM,OAAO;IACP,oCAA6F;IAC7F,uClDmxCiE,EAAA;EkD5xCvE;IAaM,SlDkc2B;IkDjc3B,oCAA6F;IAC7F,wBlD7DS,EAAA;;AkDkEf;EAEI,wBjDsL4D,EAAA;EiDxLhE;IAKM,MAAM;IACN,oCAA6F;IAC7F,wClDiwCiE,EAAA;EkDxwCvE;IAWM,QlDgb2B;IkD/a3B,oCAA6F;IAC7F,yBlD/ES,EAAA;;AkDkEf;EAmBI,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,cAAc;EACd,WlD6uCoC;EkD5uCpC,oBAAuC;EACvC,WAAW;EACX,gCjD+GiC,EAAA;;AiD3GrC;EAEI,0BjDwJ4D;EiDvJ5D,alDouCqC;EkDnuCrC,YlDkuCoC,EAAA;EkDtuCxC;IAOM,QAAQ;IACR,oClD+tCmC;IkD9tCnC,sClDiuCiE,EAAA;EkD1uCvE;IAaM,UlDgZ2B;IkD/Y3B,oClDytCmC;IkDxtCnC,uBlD/GS,EAAA;;AkDoIf;EACE,oBlDyOW;EkDxOX,gBAAgB;EpDuJZ,eAvE+B;EoD7EnC,yBjDkEmC;EiDjEnC,2ClDhIa;EEUX,0CDsO4D;ECrO5D,2CDqO4D,EAAA;EiDtHhE;IAUI,aAAa,EAAA;;AAIjB;EACE,kBlD2NW;EkD1NX,clD3IgB,EAAA;;AmDJlB;EACE,kBAAkB,EAAA;;AAGpB;EACE,uBAAmB;EAAnB,mBAAmB,EAAA;;AAGrB;EACE,kBAAkB;EAClB,WAAW;EACX,gBAAgB,EAAA;ECtBhB;IACE,cAAc;IACd,WAAW;IACX,WAAW,EAAA;;ADuBf;EACE,kBAAkB;EAClB,aAAa;EACb,WAAW;EACX,WAAW;EACX,mBAAmB;EACnB,mCAA2B;EAA3B,2BAA2B;ElClBvB,sDjBkhDkF;EiBlhDlF,8CjBkhDkF;EiBlhDlF,sCjBkhDkF;EiBlhDlF,0EjBkhDkF,EAAA;EiB9gDlF;IkCQN;MlCPQ,wBAAgB;MAAhB,gBAAgB,EAAA,EkCevB;;AAED;;;EAGE,cAAc,EAAA;;AAGhB,qBAAA;AACA;;EAEE,mCAA2B;EAA3B,2BAA2B,EAAA;;AAG7B;;EAEE,oCAA4B;EAA5B,4BAA4B,EAAA;;AAG9B,mBAAA;AAOA;EAEI,UAAU;EACV,oCAA4B;EAA5B,4BAA4B;EAC5B,uBAAe;EAAf,eAAe,EAAA;;AAJnB;;;EAUI,UAAU;EACV,UAAU,EAAA;;AAXd;;EAgBI,UAAU;EACV,UAAU;ElC/DR,mCjBihDkC;EiBjhDlC,2BjBihDkC,EAAA;EiB7gDlC;IkC0CN;;MlCzCQ,wBAAgB;MAAhB,gBAAgB,EAAA,EkC4DrB;;AAQH;;EAEE,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,UAAU;EAEV,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,wBAAuB;EAAvB,qBAAuB;EAAvB,uBAAuB;EACvB,UnDs6CsC;EmDr6CtC,UAAU;EACV,WnD7Fa;EmD8Fb,kBAAkB;EAClB,gBAAgB;EAChB,SAAS;EACT,YnDi6CqC;EiB1/CjC,sCjB4/CgD;EiB5/ChD,8BjB4/CgD,EAAA;EiBx/ChD;IkCqEN;;MlCpEQ,wBAAgB;MAAhB,gBAAgB,EAAA,EkC+FvB;EA3BD;;;IAsBI,WnDvGW;ImDwGX,qBAAqB;IACrB,UAAU;IACV,YnDy5CmC,EAAA;;AmDt5CvC;EACE,OAAO,EAAA;;AAGT;EACE,QAAQ,EAAA;;AAKV;;EAEE,qBAAqB;EACrB,WnD05CuC;EmDz5CvC,YnDy5CuC;EmDx5CvC,4BAA4B;EAC5B,wBAAwB;EACxB,0BAA0B,EAAA;;AAG5B;;;;;;;GvEwoXG;AuEhoXH;EACE,yQlDXgF,EAAA;;AkDalF;EACE,0QlDdgF,EAAA;;AkDsBlF;EACE,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,OAAO;EACP,UAAU;EACV,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,wBAAuB;EAAvB,qBAAuB;EAAvB,uBAAuB;EACvB,UAAU;EAEV,iBnDk2CsC;EmDj2CtC,mBAAmB;EACnB,gBnDg2CsC;EmD/1CtC,gBAAgB,EAAA;EAblB;IAgBI,+BAAuB;IAAvB,uBAAuB;IACvB,mBAAc;IAAd,kBAAc;IAAd,cAAc;IACd,WnD+1CqC;ImD91CrC,WnD+1CoC;ImD91CpC,UAAU;IACV,iBnD+1CoC;ImD91CpC,gBnD81CoC;ImD71CpC,mBAAmB;IACnB,eAAe;IACf,sBnD9KW;ImD+KX,4BAA4B;IAC5B,SAAS;IAET,kCAAiE;IACjE,qCAAoE;IACpE,YnDs1CmC;IiBlgDjC,qCjBqgD+C;IiBrgD/C,6BjBqgD+C,EAAA;IiBjgD/C;MkCyIN;QlCxIQ,wBAAgB;QAAhB,gBAAgB,EAAA,EkCyKrB;EAjCH;IAoCI,UnDm1CkC,EAAA;;AmD10CtC;EACE,kBAAkB;EAClB,UAA4C;EAC5C,enD60C0C;EmD50C1C,SAA2C;EAC3C,oBnD00C0C;EmDz0C1C,uBnDy0C0C;EmDx0C1C,WnDzMa;EmD0Mb,kBAAkB,EAAA;;AAKpB;;EAGI,wCnD40CyD;EmD50CzD,gCnD40CyD,EAAA;;AmD/0C7D;EAOI,sBnD5MW,EAAA;;AmDqMf;EAWI,WnDhNW,EAAA;;AqDbf;EACE;IAAK,kDAA+C;IAA/C,0CAA+C,EAAA,EAAA;;AADtD;EACE;IAAK,kDAA+C;IAA/C,0CAA+C,EAAA,EAAA;;AAItD;EACE,qBAAqB;EACrB,WrDiiD4B;EqDhiD5B,YrDgiD4B;EqD/hD5B,wBrDiiD+B;EqDhiD/B,iCAAgD;EAChD,+BAA+B;EAE/B,kBAAkB;EAClB,uDAAkE;EAAlE,+CAAkE,EAAA;;AAGpE;EACE,WrD4hD4B;EqD3hD5B,YrD2hD4B;EqD1hD5B,mBrD4hD4B,EAAA;;AqDphD9B;EACE;IACE,2BAAmB;IAAnB,mBAAmB,EAAA;EAErB;IACE,UAAU;IACV,uBAAe;IAAf,eAAe,EAAA,EAAA;;AANnB;EACE;IACE,2BAAmB;IAAnB,mBAAmB,EAAA;EAErB;IACE,UAAU;IACV,uBAAe;IAAf,eAAe,EAAA,EAAA;;AAKnB;EACE,qBAAqB;EACrB,WrD+/C4B;EqD9/C5B,YrD8/C4B;EqD7/C5B,wBrD+/C+B;EqD9/C/B,8BAA8B;EAE9B,kBAAkB;EAClB,UAAU;EACV,qDAAgE;EAAhE,6CAAgE,EAAA;;AAGlE;EACE,WrD0/C4B;EqDz/C5B,YrDy/C4B,EAAA;;AqDr/C5B;EACE;;IAEE,gCAAgD;IAAhD,wBAAgD,EAAA,EACjD;;AClEL;EACE,eAAe;EACf,SAAS;EACT,atD4iCsC;EsD3iCtC,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,4BAAsB;EAAtB,6BAAsB;EAAtB,0BAAsB;EAAtB,sBAAsB;EACtB,eAAe;EAEf,kBAAkB;EAClB,sBtDDa;EsDEb,4BAA4B;EAC5B,UAAU;ErCKN,sDqCHoE;ErCGpE,8CqCHoE;ErCGpE,sCqCHoE;ErCGpE,0EqCHoE,EAAA;ErCOpE;IqCpBN;MrCqBQ,wBAAgB;MAAhB,gBAAgB,EAAA,EqCPvB;;AAED;EPdE,eAAe;EACf,MAAM;EACN,OAAO;EACP,a/CyiCsC;E+CxiCtC,YAAY;EACZ,aAAa;EACb,sB/CUa,EAAA;E+CPb;IAAS,UAAU,EAAA;EACnB;IAAS,Y/Ci4C2B,EAAA;;AsDz3CtC;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,yBAA8B;EAA9B,sBAA8B;EAA9B,8BAA8B;EAC9B,kBtD8VW,EAAA;EsDlWb;IAOI,sBAAgE;IAChE,mBAAsC;IACtC,qBAAwC;IACxC,sBAAyC,EAAA;;AAI7C;EACE,gBAAgB;EAChB,gBtDijB+B,EAAA;;AsD9iBjC;EACE,mBAAY;EAAZ,oBAAY;EAAZ,YAAY;EACZ,kBtD6UW;EsD5UX,gBAAgB,EAAA;;AAGlB;EACE,MAAM;EACN,OAAO;EACP,YtDgiDuC;EsD/hDvC,0CtD/Ba;EsDgCb,oCAA4B;EAA5B,4BAA4B,EAAA;;AAG9B;EACE,MAAM;EACN,QAAQ;EACR,YtDwhDuC;EsDvhDvC,yCtDvCa;EsDwCb,mCAA2B;EAA3B,2BAA2B,EAAA;;AAG7B;EACE,MAAM;EACN,QAAQ;EACR,OAAO;EACP,YtDghDsC;EsD/gDtC,gBAAgB;EAChB,2CtDjDa;EsDkDb,oCAA4B;EAA5B,4BAA4B,EAAA;;AAG9B;EACE,QAAQ;EACR,OAAO;EACP,YtDugDsC;EsDtgDtC,gBAAgB;EAChB,wCtD1Da;EsD2Db,mCAA2B;EAA3B,2BAA2B,EAAA;;AAG7B;EACE,uBAAe;EAAf,eAAe,EAAA;;ACjFjB;EACE,qBAAqB;EACrB,eAAe;EACf,sBAAsB;EACtB,YAAY;EACZ,8BAA8B;EAC9B,YvDwtCoC,EAAA;EuD9tCtC;IASI,qBAAqB;IACrB,WAAW,EAAA;;AAKf;EACE,gBAAgB,EAAA;;AAGlB;EACE,gBAAgB,EAAA;;AAGlB;EACE,iBAAiB,EAAA;;AAInB;EAEI,2DAAmD;EAAnD,mDAAmD,EAAA;;AAIvD;EACE;IACE,YvD2rCkC,EAAA,EAAA;;AuD7rCtC;EACE;IACE,YvD2rCkC,EAAA,EAAA;;AuDvrCtC;EACE,6FAA8G;EAA9G,qFAA8G;EAC9G,4BAAoB;EAApB,oBAAoB;EACpB,sDAA8C;EAA9C,8CAA8C,EAAA;;AAGhD;EACE;IACE,+BAAuB;IAAvB,uBAAuB,EAAA,EAAA;;AAF3B;EACE;IACE,+BAAuB;IAAvB,uBAAuB,EAAA,EAAA;;AH9CzB;EACE,cAAc;EACd,WAAW;EACX,WAAW,EAAA;;AIJb;EACE,czDyDc,EAAA;EyD1DhB;IAMM,cvDuM6B,EAAA;;AuD7MnC;EACE,czD0DgB,EAAA;EyD3DlB;IAMM,cvDuM6B,EAAA;;AuD7MnC;EACE,czD2Dc,EAAA;EyD5DhB;IAMM,cvDuM6B,EAAA;;AuD7MnC;EACE,czD4DW,EAAA;EyD7Db;IAMM,cvDuM6B,EAAA;;AuD7MnC;EACE,czD6Dc,EAAA;EyD9DhB;IAMM,cvDuM6B,EAAA;;AuD7MnC;EACE,czD8Da,EAAA;EyD/Df;IAMM,cvDuM6B,EAAA;;AuD7MnC;EACE,czD+DY,EAAA;EyDhEd;IAMM,cvDuM6B,EAAA;;AuD7MnC;EACE,czDgEW,EAAA;EyDjEb;IAMM,cvD4M6B,EAAA;;AwDjNrC;EACE,kBAAkB;EAClB,WAAW,EAAA;EAFb;IAKI,cAAc;IACd,mCAAiE;IACjE,WAAW,EAAA;EAPf;IAWI,kBAAkB;IAClB,MAAM;IACN,OAAO;IACP,WAAW;IACX,YAAY,EAAA;;AAKd;EACE,uBAAgD,EAAA;;AADlD;EACE,qCAAgD,EAAA;;AADlD;EACE,sCAAgD,EAAA;;AADlD;EACE,sCAAgD,EAAA;;ACrBpD;EACE,eAAe;EACf,MAAM;EACN,QAAQ;EACR,OAAO;EACP,a1DsiCsC,EAAA;;A0DniCxC;EACE,eAAe;EACf,QAAQ;EACR,SAAS;EACT,OAAO;EACP,a1D8hCsC,EAAA;;A0DthCpC;EACE,gBAAgB;EAChB,MAAM;EACN,a1DkhCkC,EAAA;;AS7+BpC;EiDxCA;IACE,gBAAgB;IAChB,MAAM;IACN,a1DkhCkC,EAAA,E0DjhCnC;;AjDoCD;EiDxCA;IACE,gBAAgB;IAChB,MAAM;IACN,a1DkhCkC,EAAA,E0DjhCnC;;AjDoCD;EiDxCA;IACE,gBAAgB;IAChB,MAAM;IACN,a1DkhCkC,EAAA,E0DjhCnC;;AjDoCD;EiDxCA;IACE,gBAAgB;IAChB,MAAM;IACN,a1DkhCkC,EAAA,E0DjhCnC;;AjDoCD;EiDxCA;IACE,gBAAgB;IAChB,MAAM;IACN,a1DkhCkC,EAAA,E0DjhCnC;;AC1BL;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,8BAAmB;EAAnB,6BAAmB;EAAnB,uBAAmB;EAAnB,mBAAmB;EACnB,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,4BAAmB;EAAnB,mBAAmB,EAAA;;AAGrB;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,mBAAc;EAAd,kBAAc;EAAd,cAAc;EACd,4BAAsB;EAAtB,6BAAsB;EAAtB,0BAAsB;EAAtB,sBAAsB;EACtB,4BAAmB;EAAnB,mBAAmB,EAAA;;ACRrB;;ECIE,6BAA6B;EAC7B,qBAAqB;EACrB,sBAAsB;EACtB,qBAAqB;EACrB,uBAAuB;EACvB,2BAA2B;EAC3B,iCAAiC;EACjC,8BAA8B;EAC9B,oBAAoB,EAAA;;ACZtB;EAEI,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,OAAO;EACP,U9DwbuC;E8DvbvC,WAAW,EAAA;;ACRf;ECAE,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB,EAAA;;ACNrB;EACE,qBAAqB;EACrB,4BAAmB;EAAnB,mBAAmB;EACnB,UAAU;EACV,eAAe;EACf,8BAA8B;EAC9B,ajEipB+B,EAAA;;AkExlBzB;EAOI,mCAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,iCAA+D,EAAA;;AAPnE;EAOI,iCAA+D,EAAA;;AAPnE;EAOI,sCAA+D,EAAA;;AAPnE;EAOI,mCAA+D,EAAA;;AAPnE;EAOI,sBAA+D,EAAA;;AAPnE;EAOI,uBAA+D,EAAA;;AAPnE;EAOI,sBAA+D,EAAA;;AAPnE;EAOI,qBAA+D,EAAA;;AAPnE;EAOI,wBAA+D,EAAA;;AAPnE;EAOI,uBAA+D,EAAA;;AAPnE;EAOI,wBAA+D,EAAA;;AAPnE;EAOI,qBAA+D,EAAA;;AAPnE;EAOI,yBAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,0BAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,yBAA+D,EAAA;;AAPnE;EAOI,wBAA+D,EAAA;;AAPnE;EAOI,yBAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,+BAA+D;EAA/D,+BAA+D;EAA/D,wBAA+D,EAAA;;AAPnE;EAOI,sCAA+D;EAA/D,sCAA+D;EAA/D,+BAA+D,EAAA;;AAPnE;EAOI,wBAA+D,EAAA;;AAPnE;EAOI,gEAA+D;EAA/D,wDAA+D,EAAA;;AAPnE;EAOI,sEAA+D;EAA/D,8DAA+D,EAAA;;AAPnE;EAOI,+DAA+D;EAA/D,uDAA+D,EAAA;;AAPnE;EAOI,mCAA+D;EAA/D,2BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,0BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,iBAA+D,EAAA;;AAPnE;EAOI,mBAA+D,EAAA;;AAPnE;EAOI,oBAA+D,EAAA;;AAPnE;EAOI,oBAA+D,EAAA;;AAPnE;EAOI,sBAA+D,EAAA;;AAPnE;EAOI,uBAA+D,EAAA;;AAPnE;EAOI,kBAA+D,EAAA;;AAPnE;EAOI,oBAA+D,EAAA;;AAPnE;EAOI,qBAA+D,EAAA;;AAPnE;EAOI,mBAA+D,EAAA;;AAPnE;EAOI,qBAA+D,EAAA;;AAPnE;EAOI,sBAA+D,EAAA;;AAPnE;EAOI,mDAA+D;EAA/D,2CAA+D,EAAA;;AAPnE;EAOI,8CAA+D;EAA/D,sCAA+D,EAAA;;AAPnE;EAOI,8CAA+D;EAA/D,sCAA+D,EAAA;;AAPnE;EAOI,oCAA+D,EAAA;;AAPnE;EAOI,oBAA+D,EAAA;;AAPnE;EAOI,wCAA+D,EAAA;;AAPnE;EAOI,wBAA+D,EAAA;;AAPnE;EAOI,0CAA+D,EAAA;;AAPnE;EAOI,0BAA+D,EAAA;;AAPnE;EAOI,2CAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,yCAA+D,EAAA;;AAPnE;EAOI,yBAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,qBAA+D,EAAA;;AAPnE;EAOI,qBAA+D,EAAA;;AAPnE;EAOI,qBAA+D,EAAA;;AAPnE;EAOI,sBAA+D,EAAA;;AAPnE;EAOI,sBAA+D,EAAA;;AAPnE;EAOI,0BAA+D,EAAA;;AAPnE;EAOI,uBAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,sBAA+D,EAAA;;AAPnE;EAOI,sBAA+D,EAAA;;AAPnE;EAOI,sBAA+D,EAAA;;AAPnE;EAOI,uBAA+D,EAAA;;AAPnE;EAOI,uBAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,wBAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,8BAA+D;EAA/D,6BAA+D;EAA/D,yBAA+D,EAAA;;AAPnE;EAOI,yCAA+D;EAA/D,wCAA+D;EAA/D,kCAA+D;EAA/D,8BAA+D,EAAA;;AAPnE;EAOI,uCAA+D;EAA/D,wCAA+D;EAA/D,qCAA+D;EAA/D,iCAA+D,EAAA;;AAPnE;EAOI,yCAA+D;EAA/D,yCAA+D;EAA/D,0CAA+D;EAA/D,sCAA+D,EAAA;;AAPnE;EAOI,uCAA+D;EAA/D,yCAA+D;EAA/D,6CAA+D;EAA/D,yCAA+D,EAAA;;AAPnE;EAOI,8BAA+D;EAA/D,+BAA+D;EAA/D,uBAA+D,EAAA;;AAPnE;EAOI,8BAA+D;EAA/D,+BAA+D;EAA/D,uBAA+D,EAAA;;AAPnE;EAOI,+BAA+D;EAA/D,yBAA+D,EAAA;;AAPnE;EAOI,+BAA+D;EAA/D,yBAA+D,EAAA;;AAPnE;EAOI,8BAA+D;EAA/D,0BAA+D,EAAA;;AAPnE;EAOI,gCAA+D;EAA/D,4BAA+D,EAAA;;AAPnE;EAOI,sCAA+D;EAA/D,kCAA+D,EAAA;;AAPnE;EAOI,iBAA+D,EAAA;;AAPnE;EAOI,uBAA+D,EAAA;;AAPnE;EAOI,sBAA+D,EAAA;;AAPnE;EAOI,oBAA+D,EAAA;;AAPnE;EAOI,sBAA+D,EAAA;;AAPnE;EAOI,oBAA+D,EAAA;;AAPnE;EAOI,kCAA+D;EAA/D,+BAA+D;EAA/D,sCAA+D,EAAA;;AAPnE;EAOI,gCAA+D;EAA/D,6BAA+D;EAA/D,oCAA+D,EAAA;;AAPnE;EAOI,mCAA+D;EAA/D,gCAA+D;EAA/D,kCAA+D,EAAA;;AAPnE;EAOI,oCAA+D;EAA/D,iCAA+D;EAA/D,yCAA+D,EAAA;;AAPnE;EAOI,oCAA+D;EAA/D,wCAA+D,EAAA;;AAPnE;EAOI,yCAA+D;EAA/D,sCAA+D;EAA/D,wCAA+D,EAAA;;AAPnE;EAOI,mCAA+D;EAA/D,gCAA+D;EAA/D,kCAA+D,EAAA;;AAPnE;EAOI,iCAA+D;EAA/D,8BAA+D;EAA/D,gCAA+D,EAAA;;AAPnE;EAOI,oCAA+D;EAA/D,iCAA+D;EAA/D,8BAA+D,EAAA;;AAPnE;EAOI,sCAA+D;EAA/D,mCAA+D;EAA/D,gCAA+D,EAAA;;AAPnE;EAOI,qCAA+D;EAA/D,kCAA+D;EAA/D,+BAA+D,EAAA;;AAPnE;EAOI,oCAA+D;EAA/D,oCAA+D,EAAA;;AAPnE;EAOI,kCAA+D;EAA/D,kCAA+D,EAAA;;AAPnE;EAOI,qCAA+D;EAA/D,gCAA+D,EAAA;;AAPnE;EAOI,sCAA+D;EAA/D,uCAA+D,EAAA;;AAPnE;EAOI,yCAA+D;EAA/D,sCAA+D,EAAA;;AAPnE;EAOI,sCAA+D;EAA/D,iCAA+D,EAAA;;AAPnE;EAOI,oCAA+D;EAA/D,2BAA+D,EAAA;;AAPnE;EAOI,qCAA+D;EAA/D,iCAA+D,EAAA;;AAPnE;EAOI,mCAA+D;EAA/D,+BAA+D,EAAA;;AAPnE;EAOI,sCAA+D;EAA/D,6BAA+D,EAAA;;AAPnE;EAOI,wCAA+D;EAA/D,+BAA+D,EAAA;;AAPnE;EAOI,uCAA+D;EAA/D,8BAA+D,EAAA;;AAPnE;EAOI,uCAA+D;EAA/D,6BAA+D;EAA/D,oBAA+D,EAAA;;AAPnE;EAOI,uCAA+D;EAA/D,4BAA+D;EAA/D,mBAA+D,EAAA;;AAPnE;EAOI,uCAA+D;EAA/D,4BAA+D;EAA/D,mBAA+D,EAAA;;AAPnE;EAOI,uCAA+D;EAA/D,4BAA+D;EAA/D,mBAA+D,EAAA;;AAPnE;EAOI,uCAA+D;EAA/D,4BAA+D;EAA/D,mBAA+D,EAAA;;AAPnE;EAOI,uCAA+D;EAA/D,4BAA+D;EAA/D,mBAA+D,EAAA;;AAPnE;EAOI,uCAA+D;EAA/D,4BAA+D;EAA/D,mBAA+D,EAAA;;AAPnE;EAOI,uCAA+D;EAA/D,4BAA+D;EAA/D,mBAA+D,EAAA;;AAPnE;EAOI,oBAA+D,EAAA;;AAPnE;EAOI,0BAA+D,EAAA;;AAPnE;EAOI,yBAA+D,EAAA;;AAPnE;EAOI,uBAA+D,EAAA;;AAPnE;EAOI,yBAA+D,EAAA;;AAPnE;EAOI,uBAA+D,EAAA;;AAPnE;EAOI,uBAA+D,EAAA;;AAPnE;EAOI,0BAA+D;EAA/D,yBAA+D,EAAA;;AAPnE;EAOI,gCAA+D;EAA/D,+BAA+D,EAAA;;AAPnE;EAOI,+BAA+D;EAA/D,8BAA+D,EAAA;;AAPnE;EAOI,6BAA+D;EAA/D,4BAA+D,EAAA;;AAPnE;EAOI,+BAA+D;EAA/D,8BAA+D,EAAA;;AAPnE;EAOI,6BAA+D;EAA/D,4BAA+D,EAAA;;AAPnE;EAOI,6BAA+D;EAA/D,4BAA+D,EAAA;;AAPnE;EAOI,wBAA+D;EAA/D,2BAA+D,EAAA;;AAPnE;EAOI,8BAA+D;EAA/D,iCAA+D,EAAA;;AAPnE;EAOI,6BAA+D;EAA/D,gCAA+D,EAAA;;AAPnE;EAOI,2BAA+D;EAA/D,8BAA+D,EAAA;;AAPnE;EAOI,6BAA+D;EAA/D,gCAA+D,EAAA;;AAPnE;EAOI,2BAA+D;EAA/D,8BAA+D,EAAA;;AAPnE;EAOI,2BAA+D;EAA/D,8BAA+D,EAAA;;AAPnE;EAOI,wBAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,0BAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,iCAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,yBAA+D,EAAA;;AAPnE;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,qBAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,0BAA+D,EAAA;;AAPnE;EAOI,wBAA+D,EAAA;;AAPnE;EAOI,0BAA+D,EAAA;;AAPnE;EAOI,wBAA+D,EAAA;;AAPnE;EAOI,2BAA+D;EAA/D,0BAA+D,EAAA;;AAPnE;EAOI,iCAA+D;EAA/D,gCAA+D,EAAA;;AAPnE;EAOI,gCAA+D;EAA/D,+BAA+D,EAAA;;AAPnE;EAOI,8BAA+D;EAA/D,6BAA+D,EAAA;;AAPnE;EAOI,gCAA+D;EAA/D,+BAA+D,EAAA;;AAPnE;EAOI,8BAA+D;EAA/D,6BAA+D,EAAA;;AAPnE;EAOI,yBAA+D;EAA/D,4BAA+D,EAAA;;AAPnE;EAOI,+BAA+D;EAA/D,kCAA+D,EAAA;;AAPnE;EAOI,8BAA+D;EAA/D,iCAA+D,EAAA;;AAPnE;EAOI,4BAA+D;EAA/D,+BAA+D,EAAA;;AAPnE;EAOI,8BAA+D;EAA/D,iCAA+D,EAAA;;AAPnE;EAOI,4BAA+D;EAA/D,+BAA+D,EAAA;;AAPnE;EAOI,yBAA+D,EAAA;;AAPnE;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,iCAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,kCAA+D,EAAA;;AAPnE;EAOI,iCAA+D,EAAA;;AAPnE;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,iCAA+D,EAAA;;AAPnE;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,0BAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,gDAA+D,EAAA;;AAPnE;EAOI,4CAA+D,EAAA;;AAPnE;EAOI,4CAA+D,EAAA;;AAPnE;EAOI,0CAA+D,EAAA;;AAPnE;EAOI,4CAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,0BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,yBAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,yBAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,4BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,qCAA+D,EAAA;;AAPnE;EAOI,wCAA+D,EAAA;;AAPnE;EAOI,oCAA+D,EAAA;;AAPnE;EAOI,oCAA+D,EAAA;;AAPnE;EAOI,qCAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AArBnE,qBAAA;AAcA;EAOI,gCAA+D;EAA/D,iCAA+D,EAAA;;AAcnE,mBAAA;AArBA;EAIQ,oBAAqC;EAGzC,qEAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,uEAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,qEAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,kEAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,qEAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,oEAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,mEAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,kEAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,mEAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,mEAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,wEAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,yBAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,oCAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,0CAA+D,EAAA;;AAPnE;EAIQ,oBAAqC;EAGzC,yBAA+D,EAAA;;AAjBnE;EACE,uBAA0C,EAAA;;AAD5C;EACE,sBAA0C,EAAA;;AAD5C;EACE,uBAA0C,EAAA;;AAD5C;EACE,oBAA0C,EAAA;;AAS5C;EAIQ,kBAAqC;EAGzC,8EAA+D,EAAA;;AAPnE;EAIQ,kBAAqC;EAGzC,gFAA+D,EAAA;;AAPnE;EAIQ,kBAAqC;EAGzC,8EAA+D,EAAA;;AAPnE;EAIQ,kBAAqC;EAGzC,2EAA+D,EAAA;;AAPnE;EAIQ,kBAAqC;EAGzC,8EAA+D,EAAA;;AAPnE;EAIQ,kBAAqC;EAGzC,6EAA+D,EAAA;;AAPnE;EAIQ,kBAAqC;EAGzC,4EAA+D,EAAA;;AAPnE;EAIQ,kBAAqC;EAGzC,2EAA+D,EAAA;;AAPnE;EAIQ,kBAAqC;EAGzC,4EAA+D,EAAA;;AAPnE;EAIQ,kBAAqC;EAGzC,4EAA+D,EAAA;;AAPnE;EAIQ,kBAAqC;EAGzC,8EAA+D,EAAA;;AAPnE;EAIQ,kBAAqC;EAGzC,wCAA+D,EAAA;;AAjBnE;EACE,oBAA0C,EAAA;;AAD5C;EACE,qBAA0C,EAAA;;AAD5C;EACE,oBAA0C,EAAA;;AAD5C;EACE,qBAA0C,EAAA;;AAD5C;EACE,kBAA0C,EAAA;;AAS5C;EAOI,+CAA+D,EAAA;;AAPnE;EAOI,mCAA+D;EAA/D,gCAA+D;EAA/D,+BAA+D;EAA/D,2BAA+D,EAAA;;AAPnE;EAOI,oCAA+D;EAA/D,iCAA+D;EAA/D,gCAA+D;EAA/D,4BAA+D,EAAA;;AAPnE;EAOI,oCAA+D;EAA/D,iCAA+D;EAA/D,gCAA+D;EAA/D,4BAA+D,EAAA;;AAPnE;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,iCAA+D,EAAA;;AAPnE;EAOI,2BAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,iCAA+D,EAAA;;AAPnE;EAOI,gCAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AAPnE;EAOI,+BAA+D,EAAA;;AAPnE;EAOI,0CAA+D;EAA/D,2CAA+D,EAAA;;AAPnE;EAOI,2CAA+D;EAA/D,8CAA+D,EAAA;;AAPnE;EAOI,8CAA+D;EAA/D,6CAA+D,EAAA;;AAPnE;EAOI,6CAA+D;EAA/D,0CAA+D,EAAA;;AAPnE;EAOI,8BAA+D,EAAA;;AAPnE;EAOI,6BAA+D,EAAA;;AzDPvE;EyDAI;IAOI,sBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,+BAA+D;IAA/D,wBAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,sCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,wCAA+D;IAA/D,kCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,wCAA+D;IAA/D,qCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,yCAA+D;IAA/D,0CAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,yCAA+D;IAA/D,6CAA+D;IAA/D,yCAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,+BAA+D;IAA/D,uBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,+BAA+D;IAA/D,uBAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,iBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,kCAA+D;IAA/D,+BAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,6BAA+D;IAA/D,oCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,gCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,iCAA+D;IAA/D,yCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,wCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,sCAA+D;IAA/D,wCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,gCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,iCAA+D;IAA/D,8BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,iCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,mCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,kCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,oCAA+D,EAAA;EAPnE;IAOI,kCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,uCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,2BAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,wCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,6BAA+D;IAA/D,oBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,0BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,wBAA+D;IAA/D,2BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,qBAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,0BAA+D,EAAA;EAPnE;IAOI,iCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,yBAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,4BAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,4BAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,kCAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA,EAElE;;AzDTL;EyDAI;IAOI,sBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,+BAA+D;IAA/D,wBAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,sCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,wCAA+D;IAA/D,kCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,wCAA+D;IAA/D,qCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,yCAA+D;IAA/D,0CAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,yCAA+D;IAA/D,6CAA+D;IAA/D,yCAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,+BAA+D;IAA/D,uBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,+BAA+D;IAA/D,uBAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,iBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,kCAA+D;IAA/D,+BAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,6BAA+D;IAA/D,oCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,gCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,iCAA+D;IAA/D,yCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,wCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,sCAA+D;IAA/D,wCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,gCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,iCAA+D;IAA/D,8BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,iCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,mCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,kCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,oCAA+D,EAAA;EAPnE;IAOI,kCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,uCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,2BAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,wCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,6BAA+D;IAA/D,oBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,0BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,wBAA+D;IAA/D,2BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,qBAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,0BAA+D,EAAA;EAPnE;IAOI,iCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,yBAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,4BAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,4BAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,kCAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA,EAElE;;AzDTL;EyDAI;IAOI,sBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,+BAA+D;IAA/D,wBAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,sCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,wCAA+D;IAA/D,kCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,wCAA+D;IAA/D,qCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,yCAA+D;IAA/D,0CAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,yCAA+D;IAA/D,6CAA+D;IAA/D,yCAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,+BAA+D;IAA/D,uBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,+BAA+D;IAA/D,uBAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,iBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,kCAA+D;IAA/D,+BAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,6BAA+D;IAA/D,oCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,gCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,iCAA+D;IAA/D,yCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,wCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,sCAA+D;IAA/D,wCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,gCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,iCAA+D;IAA/D,8BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,iCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,mCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,kCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,oCAA+D,EAAA;EAPnE;IAOI,kCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,uCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,2BAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,wCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,6BAA+D;IAA/D,oBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,0BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,wBAA+D;IAA/D,2BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,qBAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,0BAA+D,EAAA;EAPnE;IAOI,iCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,yBAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,4BAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,4BAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,kCAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA,EAElE;;AzDTL;EyDAI;IAOI,sBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,+BAA+D;IAA/D,wBAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,sCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,wCAA+D;IAA/D,kCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,wCAA+D;IAA/D,qCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,yCAA+D;IAA/D,0CAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,yCAA+D;IAA/D,6CAA+D;IAA/D,yCAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,+BAA+D;IAA/D,uBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,+BAA+D;IAA/D,uBAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,iBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,kCAA+D;IAA/D,+BAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,6BAA+D;IAA/D,oCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,gCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,iCAA+D;IAA/D,yCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,wCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,sCAA+D;IAA/D,wCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,gCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,iCAA+D;IAA/D,8BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,iCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,mCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,kCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,oCAA+D,EAAA;EAPnE;IAOI,kCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,uCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,2BAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,wCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,6BAA+D;IAA/D,oBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,0BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,wBAA+D;IAA/D,2BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,qBAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,0BAA+D,EAAA;EAPnE;IAOI,iCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,yBAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,4BAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,4BAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,kCAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA,EAElE;;AzDTL;EyDAI;IAOI,sBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,+BAA+D;IAA/D,wBAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,sCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,wCAA+D;IAA/D,kCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,wCAA+D;IAA/D,qCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,yCAA+D;IAA/D,0CAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,yCAA+D;IAA/D,6CAA+D;IAA/D,yCAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,+BAA+D;IAA/D,uBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,+BAA+D;IAA/D,uBAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,iBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,sBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,kCAA+D;IAA/D,+BAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,6BAA+D;IAA/D,oCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,gCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,iCAA+D;IAA/D,yCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,wCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,sCAA+D;IAA/D,wCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,gCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,iCAA+D;IAA/D,8BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,iCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,mCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,kCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,oCAA+D,EAAA;EAPnE;IAOI,kCAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,uCAA+D,EAAA;EAPnE;IAOI,yCAA+D;IAA/D,sCAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,oCAA+D;IAA/D,2BAA+D,EAAA;EAPnE;IAOI,qCAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,mCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,wCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,6BAA+D;IAA/D,oBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,uCAA+D;IAA/D,4BAA+D;IAA/D,mBAA+D,EAAA;EAPnE;IAOI,oBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,uBAA+D,EAAA;EAPnE;IAOI,0BAA+D;IAA/D,yBAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,wBAA+D;IAA/D,2BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,8BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,qBAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,2BAA+D;IAA/D,0BAA+D,EAAA;EAPnE;IAOI,iCAA+D;IAA/D,gCAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,gCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,6BAA+D,EAAA;EAPnE;IAOI,yBAA+D;IAA/D,4BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,kCAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,4BAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D;IAA/D,iCAA+D,EAAA;EAPnE;IAOI,4BAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,kCAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,iCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,+BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,2BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA,EAElE;;ACrDT;ED4CQ;IAOI,4BAA+D,EAAA;EAPnE;IAOI,0BAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,4BAA+D,EAAA,EAElE;;AClCT;EDyBQ;IAOI,0BAA+D,EAAA;EAPnE;IAOI,gCAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA;EAPnE;IAOI,yBAA+D,EAAA;EAPnE;IAOI,6BAA+D,EAAA;EAPnE;IAOI,8BAA+D,EAAA;EAPnE;IAOI,+BAA+D;IAA/D,+BAA+D;IAA/D,wBAA+D,EAAA;EAPnE;IAOI,sCAA+D;IAA/D,sCAA+D;IAA/D,+BAA+D,EAAA;EAPnE;IAOI,wBAA+D,EAAA,EAElE;;AvFRT,sEAAA;AACA,4BAAA;AyFjEA,yBAAA;AAqCA;EACC,uBAAuB;EACvB,gBAAgB;EAChB,eAAc;EACd,mBAAmB,EAAA;;ACzCpB,qBAAA;AACA;EACE;IACE,UAAU;IACV,2CAAmC;IAAnC,mCAAmC,EAAA;EAGrC;IACE,UAAU;IACV,uBAAe;IAAf,eAAe;IACf,yCAAiC;IAAjC,iCAAiC,EAAA,EAAA;AATrC;EACE;IACE,UAAU;IACV,2CAAmC;IAAnC,mCAAmC,EAAA;EAGrC;IACE,UAAU;IACV,uBAAe;IAAf,eAAe;IACf,yCAAiC;IAAjC,iCAAiC,EAAA,EAAA;;AAIrC;EACE,yCAAiC;EAAjC,iCAAiC;EtFDsB,iCgB+OvB;EhB1O+B,yBgB0O/B;EhB/OuB,iCsFGtB;EtFE8B,yBsFF9B,EAAA;;AASnC;EACE;IACE,UAAU,EAAA;EAGZ;IACE,UAAU,EAAA,EAAA;;AAId;EACE,+BAAuB;EAAvB,uBAAuB,EAAA;;AAGzB;EAUE,4BAAoB;EAApB,oBAAoB;EACpB,8BAAsB;EAAtB,sBAAsB;EACtB,2CAAmC;EAAnC,mCAAmC;EACnC,yCAAiC;EAAjC,iCAAiC,EAAA;;AAZjC;EACE;IACE,+BAAuB;IAAvB,uBAAuB,EAAA;EAGzB;IACE,iCAAyB;IAAzB,yBAAyB,EAAA,EAAA;;AAN7B;EACE;IACE,+BAAuB;IAAvB,uBAAuB,EAAA;EAGzB;IACE,iCAAyB;IAAzB,yBAAyB,EAAA,EAAA;;AAQ/B;EACE;IACE,UAAU;IACV,0CAAkC;IAAlC,kCAAkC,EAAA;EAGpC;IACE,UAAU;IACV,uBAAe;IAAf,eAAe,EAAA,EAAA;;AAInB;EACE,gCAAwB;EAAxB,wBAAwB,EAAA;;A1FW1B,sEAAA;AACA,wBAAA;A2FhFA,iBAAA;AzEgDA;EyE7CI,UAAU;EACV,SAAS;EACT,kBAAkB,EAAA;;AAGtB;;EAEI,wBAAwB;EACxB,qBACJ,EAAA;;AtDRA;EsDWI,wBACJ;EADI,gBACJ,EAAA;;AtDZA;EsDeI,UAAU;EACV,wBACJ;EADI,gBACJ,EAAA;;AAEA;;;;EASI,iBACJ,EAAA;;A1F44dA;;;;;;;;;;E0Fh4dI,UACJ,EAAA;;AAEA;;;;;;EAMI,aAAa;EACb,gBAAgB;EAChB,0BAA0B;EAC1B,wBAAgB;EAAhB,gBAAgB;EAChB,mBAAmB,EAAA;;AzEuavB;EyEnaI,YAAY;EACZ,kBAAkB,EAAA;;AAGtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCI,wBAAwB;EAExB,gBACJ,EAAA;;AAEA;;;;;;;;;;;;EAYI,UAAU;EACV,iBACJ,EAAA;;AAEA;EACI,UAAW;EACX,iBAAiB,EAAA;;AAGrB;;;;EAII,UAAU,EAAA;;AAGd;;EAEI,yBAAyB;EACzB,aACJ,EAAA;;ACvIA,UAAA;AAGA;EACE,2BAA2B;EAC3B,4CAA4C;EAAE,qBAAA;EAC9C,mLAEgE,EAAA;;AAElE;EACE,6BAA6B;EAC7B,8CAA8C;EAAE,qBAAA;EAChD,yLAEkE,EAAA;;AAEpE;EACE,4BAA4B;EAC5B,6CAA6C;EAAE,qBAAA;EAC/C,sLAEiE,EAAA;;AAEnE;EACE,0BAA0B;EAC1B,2CAA2C;EAAE,qBAAA;EAC7C,gLAE+D,EAAA;;ACnB/D;ECTA,c1EmG+B,EAAA;;AyE1F/B;ECTA,c1EoGe,EAAA;;AyE3Ff;ECTA,c1EqGa,EAAA;;AyE5Fb;ECTA,c1EsGe,EAAA;;AyE7Ff;ECTA,c1EuGgB,EAAA;;AyE9FhB;ECTA,c1EwGc,EAAA;;AyE/Fd;ECTA,c1EyGa,EAAA;;AyEhGb;ECTA,c1E0Gc,EAAA;;AyEjGd;ECTA,c1E2Ge,EAAA;;AyElGf;ECTA,c1E4Ga,EAAA;;AyE9Fb;EACE,mBzEoF6B,EAAA;;AyErF/B;EACE,mBzEqFa,EAAA;;AyEtFf;EACE,mBzEsFW,EAAA;;AyEvFb;EACE,mBzEuFa,EAAA;;AyExFf;EACE,mBzEwFc,EAAA;;AyEzFhB;EACE,mBzEyFY,EAAA;;AyE1Fd;EACE,mBzE0FW,EAAA;;AyE3Fb;EACE,mBzE2FY,EAAA;;AyE5Fd;EACE,mBzE4Fa,EAAA;;AyE7Ff;EACE,mBzE6FW,EAAA;;A2E7Gf,eAAA;A7EgDA;E6E7CE,eAAe;EACf,yC3EoHQ;E2EnHR,oBAAoB;EACpB,mBAAmB;EACnB,mCAAmC,EAAA;;A7E0FrC;;;;;;;E6E5EE,wC3EqGQ,EAAA;;AFWV;E6E7GE,mB3EsGyB,EAAA;;AF7B3B;;E6ErEE,kBAAkB,EAAA;;A7E0EpB;;E6EtEE,kBAAkB,EAAA;;A7E2EpB;;E6EvEE,kBAAkB,EAAA;;A7E4EpB;;E6ExEE,kBAAkB,EAAA;;A7E6EpB;;E6EzEE,eAAe,EAAA;;A7E8EjB;;E6E1EE,mBAAmB,EAAA;;A7EqFrB;E6ElFE,mBAAmB;EACnB,gBAAgB,EAAA;;AvEjBhB;EuEoBA,kBAAkB,EAAA;EAClB;IvErBA;MuEsBE,eAAe,EAAA,EAElB;;AvExBC;EuE0BA,mBAAmB,EAAA;EACnB;IvE3BA;MuE4BE,iBAAiB,EAAA,EAEpB;;AvE9BC;EuEgCA,iBAAiB,EAAA;EACjB;IvEjCA;MuEkCE,eAAe,EAAA,EAElB;;AvEpCC;EuEsCA,mBAAmB,EAAA;EACnB;IvEvCA;MuEwCE,iBAAiB,EAAA,EAEpB;;AvE1CC;EuE4CA,kBAAkB,EAAA;EAClB;IvE7CA;MuE8CE,eAAe,EAAA,EAElB;;AvEED;EuEAE,gBAAgB;EAChB,yB3EQoB,EAAA;;A2ELtB;EAEI,gBAAgB,EAAA;;AAMlB;EC9FA,qB5EwDgB,EAAA;E4EvDhB;IACE,c5EsDc,EAAA;;A2EsChB;EC9FA,qB5EyDkB,EAAA;E4ExDlB;IACE,c5EuDgB,EAAA;;A2EqClB;EC9FA,qB5E0DgB,EAAA;E4EzDhB;IACE,c5EwDc,EAAA;;A2EoChB;EC9FA,qB5E2Da,EAAA;E4E1Db;IACE,c5EyDW,EAAA;;A2EmCb;EC9FA,qB5E4DgB,EAAA;E4E3DhB;IACE,c5E0Dc,EAAA;;A2EkChB;EC9FA,qB5E6De,EAAA;E4E5Df;IACE,c5E2Da,EAAA;;A2EiCf;EC9FA,qB5E8Dc,EAAA;E4E7Dd;IACE,c5E4DY,EAAA;;A2EgCd;EC9FA,qB5E+Da,EAAA;E4E9Db;IACE,c5E6DW,EAAA;;A2EmCf;EAEI,gBAAgB,EAAA;EAChB;IAHJ;MAIM,eAAe,EAAA,EAElB;;AAEH;EACE,iBAAiB,EAAA;;AAEnB;EACE,mBAAmB,EAAA;;AAErB;EACE,eAAe,EAAA;;AEpHjB,mBAAA;AACA;;EAEE,kBAAkB;EAClB,2BAA2B,EAAA;;AAG7B;;;EAGE,cAAc,EAAA;;AAGhB;EACE,gBAAgB,EAAA;;A/EmRlB;E+E/QE,+BAA+B;EAC/B,aAAa;EACb,eAAe,EAAA;;A/E6RjB;E+EzRE,YAAY;EACZ,c7EiDgB;E6EhDhB,uC7E4FQ;E6E3FR,mB7EmGyB;E6ElGzB,kBAAkB,EAAA;;AAGpB;EAIE,oBAAoB,EAAA;EAJtB;IAMI,SAAS;IACT,gBAAgB,EAAA;;AAGpB;EACE,c7EuFkB;E6EtFlB,mBAAmB;EACnB,gBAAgB,EAAA;EAHlB;IAKI,qBAAqB;IACrB,WAAW;IACX,YAAY;IACZ,kBAAkB;IAClB,kBAAkB;IAClB,gEAAwD;IAAxD,wDAAwD,EAAA;IAV5D;MAYM,mBAAmB;MACnB,iBAAiB,EAAA;;ACtDvB,WAAA;AAEA;EACE,mB9EwFkB;E8EvFlB,kB9EyFwB;E8ExFxB,6BAA4C;EAC5C,kBAAkB;EAClB,0B9EuPsC;E8EtPtC,+B9EsPsC;E8ErPtC,kC9EqPsC;E8EpPtC,8B9EoPsC;E8EnPtC,mCAAgD;EAChD,yC9E4GQ,EAAA;E8EtHV;IAYI,c9EyDe;I8ExDf,kBAAkB,EAAA;EAEpB;IAfF;MAgBI,cAAc;MACd,WAAW,EAAA,EAEd;;ACrBD,cAAA;AAEA;EACE,qB/EqPqB,EAAA;;A+ElPrB;EADF;IAEI,gBAAgB,EAAA,EAEnB;;AAEC;EADF;IAEI,gBAAgB,EAAA,EAEnB;;AAEC;EADF;IAEI,gBAAgB,EAAA,EAEnB;;AAEC;EADF;IAEI,gBAAgB,EAAA,EAEnB;;AACD;EACE,WAAW;EACX,YAAY,EAAA;;AAEd;EACE,WAAW;EACX,YAAY,EAAA;;AAEd;EACE,WAAW;EACX,YAAY,EAAA;;AAEd;;EACE,WAAW;EACX,YAAY,EAAA;;AAEd;E/FLyD,oBAAuB;EAAvB,oBAAuB;EAAvB,aAAuB;EAjBf,0B+FwBnC;E/FxBmC,uB+FwBnC;E/FxBmC,oB+FwBnC;E/FxBmC,yB+FyB/B;E/FzB+B,sB+FyB/B;E/FzB+B,wB+FyB/B,EAAA;EAHlC;IAKI,WAAW;IACX,eAAe,EAAA;;AAKjB;EADF;IAEI,+B/EyCkB,EAAA,E+EvCrB;;AAEC;EADF;IAEI,+B/EoCkB,EAAA,E+ElCrB;;AAEC;EADF;IAEI,+B/E+BkB,EAAA,E+E7BrB;;AAGC;EADF;IAEI,8B/EyBkB,EAAA,E+EvBrB;;AAEC;EADF;IAEI,8B/EoBkB,EAAA,E+ElBrB;;AAEC;EADF;IAEI,8B/EekB,EAAA,E+EbrB;;AAED;EACE,cAAc,EAAA;;AZrBR;EYyBN,c/EhCe,EAAA;;A+EmCjB;EACE,eAAe,EAAA;;AAGjB;EACE,mBAAY;EAAZ,oBAAY;EAAZ,YAAY,EAAA;;AAGd;EACE,uC/EkBQ,EAAA;;A+EfV;EACE,sC/EoBQ,EAAA;;A+EjBV;EACE,yC/EYQ,EAAA;;A+ETV;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa,EAAA;EADf;;IAMI,mBAAmB;IACnB,kBAAkB;IAClB,UAAU;IACV,sB/EcU;I+EbV,2BAAmB;IAAnB,mBAAmB;IACnB,iCAAyB;IAAzB,yBAAyB;IACzB,wCAAgC;IAAhC,gCAAgC;IAChC,4GAAyE;IAAzE,oGAAyE;IAAzE,yEAAyE,EAAA;IAb7E;;MAgBM,cAAc,EAAA;IAhBpB;;MAoBM,UAAU;MACV,mDAA2C;MAA3C,2CAA2C;MAC3C,8BAAsB;MAAtB,sBAAsB;MACtB,eAAe,EAAA;EAvBrB;IA8BI,c/ExEe;I+EyEf,eAAe;IACf,gBAAgB,EAAA;;AAIpB;EACE,kBAAkB,EAAA;EADpB;IAII,kBAAkB,EAAA;IAJtB;MAOM,QAAQ;MACR,mCAA2B;MAA3B,2BAA2B;MAC3B,SAAS;MACT,QAAQ;MACR,OAAO;MACP,YAAY,EAAA;IAZlB;MAgBM,OAAO,EAAA;IAhBb;MAoBM,QAAQ,EAAA;IApBd;MAwBM,SAAS,EAAA;IAxBf;MA4BM,MAAM,EAAA;;AAKZ;EACE,UAAU,EAAA;;AAGZ;EACE,UAAU,EAAA;;AAGZ;EACE,UAAU,EAAA;;AAGZ;EACE,UAAU,EAAA;;AAGZ;EACE,WAAW;EACX,YAAY;EACZ,mBAAmB,EAAA;EAHrB;IAMI,UAAU;IACV,WAAW,EAAA;;AAId;EACC,gGAAmD;EAAnD,kEAAmD,EAAA;;AADpD;EACC,gGAAmD;EAAnD,kEAAmD,EAAA;;AADpD;EACC,gGAAmD;EAAnD,kEAAmD,EAAA;;AADpD;EACC,6GAAmD;EAAnD,sEAAmD,EAAA;;AADpD;EACC,gGAAmD;EAAnD,kEAAmD,EAAA;;AADpD;EACC,gGAAmD;EAAnD,kEAAmD,EAAA;;AADpD;EACC,kGAAmD;EAAnD,mEAAmD,EAAA;;AADpD;EACC,+DAAmD,EAAA;;AChNrD,gBAAA;AAEA;EAOI,aAAa,EAAA;;AAPjB;EAsBI,kBAAkB,EAAA;;AAtBtB;;;;;;;;;;;EAmCI,6BhFyDkB;EgFxDlB,mBAAmB,EAAA;;AApCvB;EAyCM,gBAAgB,EAAA;;AAzCtB;EA6CM,kBAAkB,EAAA;;AA7CxB;EAkDI,qBAAqB;EAErB,qBAAqB,EAAA;;AApDzB;EAyDM,uBAAuB,EAAA;;AAzD7B;EA8DQ,gBAAgB,EAAA;;AA9DxB;EAqEM,gChFuBgB;EgFtBhB,sBAAsB;EACtB,qBAAqB,EAAA;;AAvE3B;EA4EI,aAAa,EAAA;;AASjB;EACE,gBAAgB;EAChB,cAAc,EAAA;EAFhB;IAQM,eAAe,EAAA;;AAKrB;EAIE,WAAW;EACX,aAAa,EAAA;;AAKf;EACE,aAAa;EACb,mBAAmB,EAAA;;AAGrB;EAGM,qBAAqB;EACrB,chFSc;EgFRd,iBAAiB,EAAA;EALvB;IAOQ,WAAW;IACX,YAAY;IACZ,mBAAmB;IACnB,qBAAqB;IACrB,2BAA2B;IAC3B,mBAAmB,EAAA;IACnB;MACE,kBAAkB,EAAA;;AAd5B;EhG/EyD,oBAAuB;EAAvB,oBAAuB;EAAvB,aAAuB,EAAA;EgG+EhF;IAuBQ,qBAAqB;IACrB,oBAAoB,EAAA;IACpB;MACE,kBAAkB;MAClB,mBAAmB,EAAA;;AA3B7B;EAkCM,YAAY,EAAA;EACZ;IACE,WAAW,EAAA;;AApCnB;EA2CQ,gBAAgB,EAAA;;AAKxB;EACE,eAAe;EACf,OAAO;EACP,MAAM;EACN,WAAW;EACX,aAAa;EACb,gBAAgB,EAAA;EANlB;IAQI,kBAAmB;IACnB,qBAAqB;IACrB,kBAAkB;IAClB,mBAAmB,EAAA;IACnB;MAZJ;QAaI,kBAAkB;QAClB,mBAAmB,EAAA,EAEpB;EAhBH;IAkBI,chFxKW,EAAA;IgFyKX;MAnBJ;QAoBM,eAAe;QACf,gBAAgB,EAAA,EAEnB;EAvBH;IA0BM,uBAAuB;IACvB,cAAc;IACd,mBAAmB;IAEnB,eAAe;IACf,kBAAkB;IAClB,iBAAiB;IACjB,eAAe,EAAA;IACf;MAlCN;QAmCQ,eAAe;QACf,mBAAmB;QACnB,eAAe,EAAA,EAElB;EAvCL;IA0CQ,kBAAkB;IAClB,kBAAkB,EAAA;IAClB;MA5CR;QA6CU,eAAe;QACf,eAAe,EAAA,EAElB;EAhDP;IAoDI,qBAAqB,EAAA;IApDzB;MAsDM,kBAAkB,EAAA;MAClB;QAvDN;UAwDQ,eAAe,EAAA,EAElB;;AAIL;EACE,4BAAkD,EAAA;;AClOpD,cAAA;AAEA;EAEI,YAAY;EACZ,WAAW;EACX,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,wBAAuB;EAAvB,qBAAuB;EAAvB,uBAAuB;EACvB,mBAAmB,EAAA;EAPvB;IAUM,eAAe,EAAA;;AAVrB;EAeI,+BjF6EkB,EAAA;EiF5FtB;IAkBM,kBAAkB,EAAA;EvEwDpB;IuE1EJ;MAsBM,eAAe;MACf,gBAAgB;MAChB,kBAAkB;MAClB,YAAY,EAAA;MAzBlB;QAiCU,WAAW;QACX,kBAAkB;QAClB,mBjFyDY,EAAA;MiF5FtB;QAyCU,SAAS;QACT,YAAY;QACZ,WAAW;QACX,QAAQ,EAAA;MA5ClB;QAgDU,SAAS;QACT,UAAU;QACV,YAAY;QACZ,QAAQ,EAAA;MAnDlB;QAyDU,SAAS;QACT,YAAY;QACZ,WAAW;QACX,OAAO,EAAA;MA5DjB;QAkEU,UAAU;QACV,YAAY;QACZ,QAAQ,EAAA,EACT;;AAMT;EAEI,gCjFekB,EAAA;EiFjBtB;IAMM,gBAAgB,EAAA;EANtB;IAeM,kBAAkB;IAClB,UAAU,EAAA;IAhBhB;MAmBQ,gBAAgB,EAAA;EAnBxB;IAwBM,iBAAiB;IACjB,UAAU,EAAA;IAzBhB;MA4BQ,kBAAkB;MAClB,iCjFSE;MiFRF,gBAAgB;MAChB,iBAAiB,EAAA;MAEjB;QACE,gBAAgB,EAAA;;AAO1B;EACE,8DAA8D;EAC9D,sBAAsB;EACtB,mBAAmB,EAAA;EAHrB;IAMI,mBAAmB;IACnB,iCjFVM;IiFWN,gBAAgB,EAAA;EARpB;IAYI,0CjFrHW;IiFsHX,mBAAmB;IACnB,uBAAuB,EAAA;;AAI3B;EACE,WAAW,EAAA;;AAGb;EACE,WAAW,EAAA;;AAGb;EAEI,kBAAkB;EAClB,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,4BAAsB;EAAtB,6BAAsB;EAAtB,0BAAsB;EAAtB,sBAAsB,EAAA;EAL1B;IAQM,iBAAiB;IACjB,kBAAkB;IAClB,WAAW;IACX,WAAW;IACX,cAAc;IACd,eAAe,EAAA;EAbrB;IAkBQ,mBjF1FQ,EAAA;EiFwEhB;IAwBQ,mBjFnGW,EAAA;EiF2EnB;IA8BQ,mBjFpGU,EAAA;;AiF0GlB;EACE,mBAAmB;EACnB,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,yBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EACnB,aAAa;EACb,kBAAkB,EAAA;EALpB;IAQI,UAAU;IACV,eAAe,EAAA;IATnB;MAYM,cAAc;MACd,YAAY,EAAA;EAblB;IAkBI,UAAU;IACV,cjF/Ia;IiFgJb,oBAAa;IAAb,oBAAa;IAAb,aAAa;IACb,4BAAsB;IAAtB,6BAAsB;IAAtB,0BAAsB;IAAtB,sBAAsB;IACtB,sBAAgB;IAAhB,mBAAgB;IAAhB,gBAAgB,EAAA;;AAIpB;EACE,mBAAmB,EAAA;EADrB;IAKM,YAAY;IACZ,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,iCAAyB;IAAzB,yBAAyB;IACzB,oCAA4B;IAA5B,4BAA4B,EAAA;IAVlC;MAaQ,gBAAgB;MAChB,iBAAyC;MACzC,cjFxJW,EAAA;;AiF8JnB;EAEE,gBAAgB;EAChB,kBAAkB;E9EnNhB,kB8EoNwB,EAAA;EAJ5B;IAOI,kBAAkB;IAClB,gBAAgB;IAChB,cjF/NW;IGMX,kB8E0N0B;IjG/N2B,iCiGgOpB;IjG3N4B,yBiG2N5B,EAAA;IAXrC;MAcM,oCAAoC;MACpC,cAAc;MACd,yBAAoC,EAAA;IAhB1C;MAoBM,yCAAyC;MClL+B,kECjC3C;MDsC2C,2FlFID;MkFJC,6DlFID;MiF2KvE,cjF5OS;MiF6OT,YAAY;MACZ,cAAc;MACd,sBAAsB,EAAA;EAzB5B;IA8BI,mBAAmB;IACnB,gBAAgB;IAChB,cAA0B;IAC1B,gBAAgB;IAChB,sBAAsB;IACtB,cAAc,EAAA;EAnClB;IAuCI,sBAAsB;IACtB,cAAc;IACd,cAAc;IACd,cAA0B,EAAA;;ArGlL9B,sEAAA;AACA,uBAAA;AwG5FA,WAAA;A7CKA;E6CFE,sBAAsB;EACtB,eAAe;EACf,oBAAoB;EACpB,cAAc;EACd,yBAAyB;EACzB,wCpFkHQ,EAAA;EoFxHV;IAQI,oBAAoB,EAAA;;AAKxB,mBAAA;AAEE;ECbD,yBrFuDiB;EqFtDjB,mBrFsDiB;EqFrDjB,crFOc,EAAA;;AoFIb;ECbD,yBrFwDmB;EqFvDnB,mBrFuDmB;EqFtDnB,crFOc,EAAA;;AoFIb;ECbD,yBrFyDiB;EqFxDjB,mBrFwDiB;EqFvDjB,crFOc,EAAA;;AoFIb;ECbD,yBrF0Dc;EqFzDd,mBrFyDc;EqFxDd,crFOc,EAAA;;AoFIb;ECbD,yBrF2DiB;EqF1DjB,mBrF0DiB;EqFzDjB,crFOc,EAAA;;AoFIb;ECbD,yBrF4DgB;EqF3DhB,mBrF2DgB;EqF1DhB,crFOc,EAAA;;AoFIb;ECbD,yBrF6De;EqF5Df,mBrF4De;EqF3Df,crFOc,EAAA;;AoFIb;ECbD,yBrF8Dc;EqF7Dd,mBrF6Dc;EqF5Dd,crFOc,EAAA;;AoFSf,4BAAA;AAEE;ECTD,qFrF+D4E;EqF/D5E,uDrF+D4E;EqF9D5E,crFHc,EAAA;;AoFWb;ECTD,qFrFgEqD;EqFhErD,uDrFgEqD;EqF/DrD,crFHc,EAAA;;AoFWb;ECTD,qFrFiEmD;EqFjEnD,uDrFiEmD;EqFhEnD,crFHc,EAAA;;AoFWb;ECTD,kGrFkEoD;EqFlEpD,2DrFkEoD;EqFjEpD,crFHc,EAAA;;AoFWb;ECTD,qFrFmEmD;EqFnEnD,uDrFmEmD;EqFlEnD,crFHc,EAAA;;AoFWb;ECTD,qFrFoEkD;EqFpElD,uDrFoEkD;EqFnElD,crFHc,EAAA;;AoFWb;ECTD,uFrFqEkD;EqFrElD,wDrFqEkD;EqFpElD,crFHc,EAAA;;AoFWb;ECTD,oDrFsE6C;EqFrE7C,crFHc,EAAA;;AoFgBf,4BAAA;AAEE;ECrBD,crFiDiB;EqFhDjB,yBrFgDiB,EAAA;;AoF5BhB;ECrBD,crFkDmB;EqFjDnB,yBrFiDmB,EAAA;;AoF7BlB;ECrBD,crFmDiB;EqFlDjB,yBrFkDiB,EAAA;;AoF9BhB;ECrBD,crFoDc;EqFnDd,yBrFmDc,EAAA;;AoF/Bb;ECrBD,crFqDiB;EqFpDjB,yBrFoDiB,EAAA;;AoFhChB;ECrBD,crFsDgB;EqFrDhB,yBrFqDgB,EAAA;;AoFjCf;ECrBD,crFuDe;EqFtDf,yBrFsDe,EAAA;;AoFlCd;ECrBD,crFwDc;EqFvDd,yBrFuDc,EAAA;;AsFlEf,uBAAA;A5CUA;EvCSI,kBmFhBwB;EAC1B,WAAW,EAAA;EAFb;InFiBI,kBmFb0B,EAAA;EAJ9B;IAQI,gBAAgB,EAAA;EARpB;IAWI,WAAW,EAAA;EAXf;IAcI,YAAY,EAAA;EAdhB;IAiBI,YAAY,EAAA;;ACnBhB,YAAA;A7DIA;E6DDE,mBvFmLqB;EuFlLrB,cAAc;EACd,sCvFuHQ;EuFnGR,4BAAA;EAMA,+BAAA,EAAgC;EA7BlC;IAKI,eAAe,EAAA;EALnB;IpFiBI,mBoFT2B,EAAA;EAR/B;IAWI,gBvF2JsB,EAAA;EuFtK1B;IAcI,mBvFwKsB,EAAA;EuFtL1B;IAiBI,mBvFsKsB,EAAA;EuFvL1B;IAoBI,uBvFwJqB;IuFvJrB,mBvFgKsB,EAAA;EuFrL1B;IAyBI,WAAW;IACX,YAAY;IACZ,UAAU,EAAA;EA3Bd;IAgCM,mBAAmB,EAAA;EAhCzB;IAmCM,kBAAkB,EAAA;EAnCxB;IAuCI,WAAW;IACX,YAAY;IACZ,UAAU,EAAA;;AAId;EAGM,cAAc,EAAA;;AAYpB,iBAAA;AAEE;EC/DE,mBxFmG6B;EwFlG7B,cxFWW,EAAA;EwFTX;IAEE,mBAA+B;IAC/B,cxFMS,EAAA;EwFJX;IACE,qBAAqB;IACrB,mBAAgC,EAAA;IAChC;MACE,mBxFuFyB;MwFtFzB,eAAe;MACf,qBAAqB;MACrB,oBAAoB,EAAA;;ADmD1B;EC9CA,yBxF+E+B;EwF9E/B,cxF8E+B,EAAA;EwF7E/B;IACE,mBxF4E6B;IwF3E7B,cxFZW,EAAA;;AuFmDb;EC/DE,mBxFoGa;EwFnGb,cxFWW,EAAA;EwFTX;IAEE,mBAA+B;IAC/B,cxFMS,EAAA;EwFJX;IACE,qBAAqB;IACrB,mBAAgC,EAAA;IAChC;MACE,mBxFwFS;MwFvFT,eAAe;MACf,qBAAqB;MACrB,oBAAoB,EAAA;;ADmD1B;EC9CA,yBxFgFe;EwF/Ef,cxF+Ee,EAAA;EwF9Ef;IACE,mBxF6Ea;IwF5Eb,cxFZW,EAAA;;AuFmDb;EC/DE,mBxFqGW;EwFpGX,cxFWW,EAAA;EwFTX;IAEE,mBAA+B;IAC/B,cxFMS,EAAA;EwFJX;IACE,qBAAqB;IACrB,mBAAgC,EAAA;IAChC;MACE,mBxFyFO;MwFxFP,eAAe;MACf,qBAAqB;MACrB,oBAAoB,EAAA;;ADmD1B;EC9CA,yBxFiFa;EwFhFb,cxFgFa,EAAA;EwF/Eb;IACE,mBxF8EW;IwF7EX,cxFZW,EAAA;;AuFmDb;EC/DE,mBxFsGa;EwFrGb,cxFWW,EAAA;EwFTX;IAEE,mBAA+B;IAC/B,cxFMS,EAAA;EwFJX;IACE,qBAAqB;IACrB,mBAAgC,EAAA;IAChC;MACE,mBxF0FS;MwFzFT,eAAe;MACf,qBAAqB;MACrB,oBAAoB,EAAA;;ADmD1B;EC9CA,yBxFkFe;EwFjFf,cxFiFe,EAAA;EwFhFf;IACE,mBxF+Ea;IwF9Eb,cxFZW,EAAA;;AuFmDb;EC/DE,mBxFuGc;EwFtGd,cxFWW,EAAA;EwFTX;IAEE,mBAA+B;IAC/B,cxFMS,EAAA;EwFJX;IACE,qBAAqB;IACrB,mBAAgC,EAAA;IAChC;MACE,mBxF2FU;MwF1FV,eAAe;MACf,qBAAqB;MACrB,oBAAoB,EAAA;;ADmD1B;EC9CA,yBxFmFgB;EwFlFhB,cxFkFgB,EAAA;EwFjFhB;IACE,mBxFgFc;IwF/Ed,cxFZW,EAAA;;AuFmDb;EC/DE,mBxFwGY;EwFvGZ,cxFWW,EAAA;EwFTX;IAEE,mBAA+B;IAC/B,cxFMS,EAAA;EwFJX;IACE,qBAAqB;IACrB,mBAAgC,EAAA;IAChC;MACE,mBxF4FQ;MwF3FR,eAAe;MACf,qBAAqB;MACrB,oBAAoB,EAAA;;ADmD1B;EC9CA,yBxFoFc;EwFnFd,cxFmFc,EAAA;EwFlFd;IACE,mBxFiFY;IwFhFZ,cxFZW,EAAA;;AuFmDb;EC/DE,mBxFyGW;EwFxGX,cxFWW,EAAA;EwFTX;IAEE,mBAA+B;IAC/B,cxFMS,EAAA;EwFJX;IACE,qBAAqB;IACrB,mBAAgC,EAAA;IAChC;MACE,mBxF6FO;MwF5FP,eAAe;MACf,qBAAqB;MACrB,oBAAoB,EAAA;;ADmD1B;EC9CA,yBxFqFa;EwFpFb,cxFoFa,EAAA;EwFnFb;IACE,mBxFkFW;IwFjFX,cxFZW,EAAA;;AuFmDb;EC/DE,mBxF0GY;EwFzGZ,cxFWW,EAAA;EwFTX;IAEE,mBAA+B;IAC/B,cxFMS,EAAA;EwFJX;IACE,qBAAqB;IACrB,mBAAgC,EAAA;IAChC;MACE,mBxF8FQ;MwF7FR,eAAe;MACf,qBAAqB;MACrB,oBAAoB,EAAA;;ADmD1B;EC9CA,yBxFsFc;EwFrFd,cxFqFc,EAAA;EwFpFd;IACE,mBxFmFY;IwFlFZ,cxFZW,EAAA;;AuFmDb;EC/DE,mBxF2Ga;EwF1Gb,cxFWW,EAAA;EwFTX;IAEE,mBAA+B;IAC/B,cxFMS,EAAA;EwFJX;IACE,qBAAqB;IACrB,mBAAgC,EAAA;IAChC;MACE,mBxF+FS;MwF9FT,eAAe;MACf,qBAAqB;MACrB,oBAAoB,EAAA;;ADmD1B;EC9CA,yBxFuFe;EwFtFf,cxFsFe,EAAA;EwFrFf;IACE,mBxFoFa;IwFnFb,cxFZW,EAAA;;AuFmDb;EC/DE,mBxF4GW;EwF3GX,cxFWW,EAAA;EwFTX;IAEE,mBAA+B;IAC/B,cxFMS,EAAA;EwFJX;IACE,qBAAqB;IACrB,mBAAgC,EAAA;IAChC;MACE,mBxFgGO;MwF/FP,eAAe;MACf,qBAAqB;MACrB,oBAAoB,EAAA;;ADmD1B;EC9CA,yBxFwFa;EwFvFb,cxFuFa,EAAA;EwFtFb;IACE,mBxFqFW;IwFpFX,cxFZW,EAAA;;AuF0Df,oBAAA;AAEE;EC5CE,0CxF8Bc;EwF7Bd,sBAAsB;EACtB,oCxF4Bc,EAAA;EwF3Bd;IACE,cxF0BY,EAAA;EwFxBd;IACE,cxFvBS;IwFwBT,yBxFsBY;IwFrBZ,qBxFqBY,EAAA;EwFlBd;IAEE,sDxFgBY;IwFhBZ,8CxFgBY,EAAA;EwFbd;IAEE,cxFWY;IwFVZ,6BAA6B,EAAA;EAG/B;;IAGE,cxF1CS;IwF2CT,yBxFGY;IwFFZ,qBxFEY,EAAA;;AuFiBhB;EACE,cvFhEW,EAAA;EuF+Db;IAKI,cvFpES,EAAA;EuF+Db;IASI,mBvF1BY;IuF2BZ,qBvF3BY,EAAA;;AuF8BhB;EAII,qFvFfuE;EuFevE,uDvFfuE;EuFgBvE,cvFtCW,EAAA;;AuFiBf;EC5CE,0CxF+BgB;EwF9BhB,sBAAsB;EACtB,oCxF6BgB,EAAA;EwF5BhB;IACE,cxF2Bc,EAAA;EwFzBhB;IACE,cxFvBS;IwFwBT,yBxFuBc;IwFtBd,qBxFsBc,EAAA;EwFnBhB;IAEE,sDxFiBc;IwFjBd,8CxFiBc,EAAA;EwFdhB;IAEE,cxFYc;IwFXd,6BAA6B,EAAA;EAG/B;;IAGE,cxF1CS;IwF2CT,yBxFIc;IwFHd,qBxFGc,EAAA;;AuFgBlB;EACE,cvFhEW,EAAA;EuF+Db;IAKI,cvFpES,EAAA;EuF+Db;IASI,mBvFzBc;IuF0Bd,qBvF1Bc,EAAA;;AuF6BlB;EAII,qFvFdgD;EuFchD,uDvFdgD;EuFehD,cvFtCW,EAAA;;AuFiBf;EC5CE,yCxFgCc;EwF/Bd,sBAAsB;EACtB,mCxF8Bc,EAAA;EwF7Bd;IACE,cxF4BY,EAAA;EwF1Bd;IACE,cxFvBS;IwFwBT,yBxFwBY;IwFvBZ,qBxFuBY,EAAA;EwFpBd;IAEE,qDxFkBY;IwFlBZ,6CxFkBY,EAAA;EwFfd;IAEE,cxFaY;IwFZZ,6BAA6B,EAAA;EAG/B;;IAGE,cxF1CS;IwF2CT,yBxFKY;IwFJZ,qBxFIY,EAAA;;AuFehB;EACE,cvFhEW,EAAA;EuF+Db;IAKI,cvFpES,EAAA;EuF+Db;IASI,mBvFxBY;IuFyBZ,qBvFzBY,EAAA;;AuF4BhB;EAII,qFvFb8C;EuFa9C,uDvFb8C;EuFc9C,cvFtCW,EAAA;;AuFiBf;EC5CE,yCxFiCW;EwFhCX,sBAAsB;EACtB,mCxF+BW,EAAA;EwF9BX;IACE,cxF6BS,EAAA;EwF3BX;IACE,cxFvBS;IwFwBT,yBxFyBS;IwFxBT,qBxFwBS,EAAA;EwFrBX;IAEE,qDxFmBS;IwFnBT,6CxFmBS,EAAA;EwFhBX;IAEE,cxFcS;IwFbT,6BAA6B,EAAA;EAG/B;;IAGE,cxF1CS;IwF2CT,yBxFMS;IwFLT,qBxFKS,EAAA;;AuFcb;EACE,cvFhEW,EAAA;EuF+Db;IAKI,cvFpES,EAAA;EuF+Db;IASI,mBvFvBS;IuFwBT,qBvFxBS,EAAA;;AuF2Bb;EAII,kGvFZ+C;EuFY/C,2DvFZ+C;EuFa/C,cvFtCW,EAAA;;AuFiBf;EC5CE,yCxFkCc;EwFjCd,sBAAsB;EACtB,mCxFgCc,EAAA;EwF/Bd;IACE,cxF8BY,EAAA;EwF5Bd;IACE,cxFvBS;IwFwBT,yBxF0BY;IwFzBZ,qBxFyBY,EAAA;EwFtBd;IAEE,qDxFoBY;IwFpBZ,6CxFoBY,EAAA;EwFjBd;IAEE,cxFeY;IwFdZ,6BAA6B,EAAA;EAG/B;;IAGE,cxF1CS;IwF2CT,yBxFOY;IwFNZ,qBxFMY,EAAA;;AuFahB;EACE,cvFhEW,EAAA;EuF+Db;IAKI,cvFpES,EAAA;EuF+Db;IASI,mBvFtBY;IuFuBZ,qBvFvBY,EAAA;;AuF0BhB;EAII,qFvFX8C;EuFW9C,uDvFX8C;EuFY9C,cvFtCW,EAAA;;AuFiBf;EC5CE,0CxFmCa;EwFlCb,sBAAsB;EACtB,oCxFiCa,EAAA;EwFhCb;IACE,cxF+BW,EAAA;EwF7Bb;IACE,cxFvBS;IwFwBT,yBxF2BW;IwF1BX,qBxF0BW,EAAA;EwFvBb;IAEE,sDxFqBW;IwFrBX,8CxFqBW,EAAA;EwFlBb;IAEE,cxFgBW;IwFfX,6BAA6B,EAAA;EAG/B;;IAGE,cxF1CS;IwF2CT,yBxFQW;IwFPX,qBxFOW,EAAA;;AuFYf;EACE,cvFhEW,EAAA;EuF+Db;IAKI,cvFpES,EAAA;EuF+Db;IASI,mBvFrBW;IuFsBX,qBvFtBW,EAAA;;AuFyBf;EAII,qFvFV6C;EuFU7C,uDvFV6C;EuFW7C,cvFtCW,EAAA;;AwFxBZ;EAHD,0CxFoCY;EwFnCZ,sBAAsB;EACtB,oCxFkCY,EAAA;EwFjCZ;IACE,cxFgCU,EAAA;EwF9BZ;IACE,cxFvBS;IwFwBT,yBxF4BU;IwF3BV,qBxF2BU,EAAA;EwFxBZ;IAEE,sDxFsBU;IwFtBV,8CxFsBU,EAAA;EwFnBZ;IAEE,cxFiBU;IwFhBV,6BAA6B,EAAA;EAG/B;;IAGE,cxF1CS;IwF2CT,yBxFSU;IwFRV,qBxFQU,EAAA;;AuFWd;EACE,cvFhEW,EAAA;EuF+Db;IAKI,cvFpES,EAAA;EuF+Db;IASI,mBvFpBU;IuFqBV,qBvFrBU,EAAA;;AuFwBd;EAII,uFvFT6C;EuFS7C,wDvFT6C;EuFU7C,cvFtCW,EAAA;;AuFiBf;EC5CE,uCxFqCW;EwFpCX,sBAAsB;EACtB,iCxFmCW,EAAA;EwFlCX;IACE,cxFiCS,EAAA;EwF/BX;IACE,cxFvBS;IwFwBT,yBxF6BS;IwF5BT,qBxF4BS,EAAA;EwFzBX;IAEE,mDxFuBS;IwFvBT,2CxFuBS,EAAA;EwFpBX;IAEE,cxFkBS;IwFjBT,6BAA6B,EAAA;EAG/B;;IAGE,cxF1CS;IwF2CT,yBxFUS;IwFTT,qBxFSS,EAAA;;AuFUb;EACE,cvFhEW,EAAA;EuF+Db;IAKI,cvFpES,EAAA;EuF+Db;IASI,mBvFnBS;IuFoBT,qBvFpBS,EAAA;;AuFuBb;EAII,oDvFRwC;EuFSxC,cvFtCW,EAAA;;AuF0CjB,qBAAA;AAEE;ECvCE,qFxFiByE;EwFjBzE,uDxFiByE;EwFhBzE,SAAS;ElB1CX,qCkB2DsC;ElBvDtC,6BkBuDsC,EAAA;EAhBpC;;IAGE,qFxFYuE;IwFZvE,uDxFYuE,EAAA;EwFVzE;IACE,WAAW,EAAA;EAEb;IACE,cxF3DS,EAAA;IwF4DT;MAGE,cxF/DO,EAAA;;AuFuFb;ECvCE,qFxFkBkD;EwFlBlD,uDxFkBkD;EwFjBlD,SAAS;ElB1CX,qCkB2DsC;ElBvDtC,6BkBuDsC,EAAA;EAhBpC;;IAGE,qFxFagD;IwFbhD,uDxFagD,EAAA;EwFXlD;IACE,WAAW,EAAA;EAEb;IACE,cxF3DS,EAAA;IwF4DT;MAGE,cxF/DO,EAAA;;AuFuFb;ECvCE,qFxFmBgD;EwFnBhD,uDxFmBgD;EwFlBhD,SAAS;ElB1CX,qCkB2DsC;ElBvDtC,6BkBuDsC,EAAA;EAhBpC;;IAGE,qFxFc8C;IwFd9C,uDxFc8C,EAAA;EwFZhD;IACE,WAAW,EAAA;EAEb;IACE,cxF3DS,EAAA;IwF4DT;MAGE,cxF/DO,EAAA;;AuFuFb;ECvCE,kGxFoBiD;EwFpBjD,2DxFoBiD;EwFnBjD,SAAS;ElB1CX,qCkB2DsC;ElBvDtC,6BkBuDsC,EAAA;EAhBpC;;IAGE,kGxFe+C;IwFf/C,2DxFe+C,EAAA;EwFbjD;IACE,WAAW,EAAA;EAEb;IACE,cxF3DS,EAAA;IwF4DT;MAGE,cxF/DO,EAAA;;AuFuFb;ECvCE,qFxFqBgD;EwFrBhD,uDxFqBgD;EwFpBhD,SAAS;ElB1CX,qCkB2DsC;ElBvDtC,6BkBuDsC,EAAA;EAhBpC;;IAGE,qFxFgB8C;IwFhB9C,uDxFgB8C,EAAA;EwFdhD;IACE,WAAW,EAAA;EAEb;IACE,cxF3DS,EAAA;IwF4DT;MAGE,cxF/DO,EAAA;;AuFuFb;ECvCE,qFxFsB+C;EwFtB/C,uDxFsB+C;EwFrB/C,SAAS;ElB1CX,qCkB2DsC;ElBvDtC,6BkBuDsC,EAAA;EAhBpC;;IAGE,qFxFiB6C;IwFjB7C,uDxFiB6C,EAAA;EwFf/C;IACE,WAAW,EAAA;EAEb;IACE,cxF3DS,EAAA;IwF4DT;MAGE,cxF/DO,EAAA;;AwF0DV;EAVD,uFxFuB+C;EwFvB/C,wDxFuB+C;EwFtB/C,SAAS;ElB1CX,qCkB2DsC;ElBvDtC,6BkBuDsC,EAAA;EAhBpC;;IAGE,uFxFkB6C;IwFlB7C,wDxFkB6C,EAAA;EwFhB/C;IACE,WAAW,EAAA;EAEb;IACE,cxF3DS,EAAA;IwF4DT;MAGE,cxF/DO,EAAA;;AuFuFb;ECvCE,oDxFwB0C;EwFvB1C,SAAS;ElB1CX,qCkB2DsC;ElBvDtC,6BkBuDsC,EAAA;EAhBpC;;IAGE,oDxFmBwC,EAAA;EwFjB1C;IACE,WAAW,EAAA;EAEb;IACE,cxF3DS,EAAA;IwF4DT;MAGE,cxF/DO,EAAA;;AyFbf,gBAAA;ArDAA;EqDGE,yBzF2FoB,EAAA;EyF5FtB;IAII,mBzFwHuB,EAAA;IyF5H3B;MAOM,4BzFwHc,EAAA;EyF/HpB;IAYI,YzFmQ2B;IyFlQ3B,qBzFsQwB,EAAA;IyFnR5B;MAeM,mBzF6GqB;MyF5GrB,mBzFmQsB;MyFlQtB,qBzFgQiC;MyF/PjC,czFoCW;MyFnCX,qBAAqB;MACrB,mBAAmB,EAAA;MApBzB;QAsBQ,uBAAuB,EAAA;MAtB/B;QAyBQ,WAAW,EAAA;MAzBnB;QA4BQ,kBAAkB;QAClB,cAAc;QACd,yBzFqPoB;QyFpPpB,qBAAqB;QACrB,mBAAmB,EAAA;QAhC3B;UAkCU,kBAAkB;UAClB,SAAS;UACT,QAAQ;UACR,SAAS;UACT,WAAW;UACX,kCAAkC;UAClC,qCAAqC,EAAA;QAxC/C;UA2CU,YAAY;UACZ,UAAU;UACV,0BzFsOkB;UyFrOlB,wBAAwB;UACxB,uBAAuB,EAAA;QA/CjC;UAkDU,kCAAkC;UAClC,qCAAqC;UACrC,+BzFzCK;UyF0CL,SAAS;UACT,YAAY,EAAA;MAtDtB;QA0DQ,qBAAqB;QACrB,mBAAmB,EAAA;MA3D3B;QA8DQ,4BzFiEY,EAAA;EyF/HpB;IAoEI,YAAY,EAAA;IApEhB;MAsEM,czF3DS,EAAA;MyFXf;QAwEQ,cAAc,EAAA;MAxEtB;QA2EQ,cAAc,EAAA;;AAOtB,uBAAA;AAEE;ECpFA,mBAAgC;EAChC,qB1FwDgB,EAAA;E0FtDhB;IACE,c1FqDc,EAAA;I0FnDd;MACE,cAAc,EAAA;IAGhB;MACE,cAAc,EAAA;EAIlB;IACE,uBAAuB,EAAA;IAEvB;MACE,mBAAgC,EAAA;MAEhC;QACE,c1FmCU;Q0FlCV,YAAY,EAAA;QAEZ;UACE,0BAAuC,EAAA;MAI3C;QACE,c1F0BU,EAAA;M0FvBZ;QACE,uBAAuB,EAAA;;ADiD7B;ECpFA,iBAAgC;EAChC,qB1FyDkB,EAAA;E0FvDlB;IACE,c1FsDgB,EAAA;I0FpDhB;MACE,cAAc,EAAA;IAGhB;MACE,cAAc,EAAA;EAIlB;IACE,uBAAuB,EAAA;IAEvB;MACE,iBAAgC,EAAA;MAEhC;QACE,c1FoCY;Q0FnCZ,YAAY,EAAA;QAEZ;UACE,wBAAuC,EAAA;MAI3C;QACE,c1F2BY,EAAA;M0FxBd;QACE,uBAAuB,EAAA;;ADiD7B;ECpFA,mBAAgC;EAChC,qB1F0DgB,EAAA;E0FxDhB;IACE,c1FuDc,EAAA;I0FrDd;MACE,cAAc,EAAA;IAGhB;MACE,cAAc,EAAA;EAIlB;IACE,uBAAuB,EAAA;IAEvB;MACE,mBAAgC,EAAA;MAEhC;QACE,c1FqCU;Q0FpCV,YAAY,EAAA;QAEZ;UACE,0BAAuC,EAAA;MAI3C;QACE,c1F4BU,EAAA;M0FzBZ;QACE,uBAAuB,EAAA;;ADiD7B;ECpFA,mBAAgC;EAChC,qB1F2Da,EAAA;E0FzDb;IACE,c1FwDW,EAAA;I0FtDX;MACE,cAAc,EAAA;IAGhB;MACE,cAAc,EAAA;EAIlB;IACE,uBAAuB,EAAA;IAEvB;MACE,mBAAgC,EAAA;MAEhC;QACE,c1FsCO;Q0FrCP,YAAY,EAAA;QAEZ;UACE,0BAAuC,EAAA;MAI3C;QACE,c1F6BO,EAAA;M0F1BT;QACE,uBAAuB,EAAA;;ADiD7B;ECpFA,mBAAgC;EAChC,qB1F4DgB,EAAA;E0F1DhB;IACE,c1FyDc,EAAA;I0FvDd;MACE,cAAc,EAAA;IAGhB;MACE,cAAc,EAAA;EAIlB;IACE,uBAAuB,EAAA;IAEvB;MACE,mBAAgC,EAAA;MAEhC;QACE,c1FuCU;Q0FtCV,YAAY,EAAA;QAEZ;UACE,0BAAuC,EAAA;MAI3C;QACE,c1F8BU,EAAA;M0F3BZ;QACE,uBAAuB,EAAA;;ADiD7B;ECpFA,mBAAgC;EAChC,qB1F6De,EAAA;E0F3Df;IACE,c1F0Da,EAAA;I0FxDb;MACE,cAAc,EAAA;IAGhB;MACE,cAAc,EAAA;EAIlB;IACE,uBAAuB,EAAA;IAEvB;MACE,mBAAgC,EAAA;MAEhC;QACE,c1FwCS;Q0FvCT,YAAY,EAAA;QAEZ;UACE,0BAAuC,EAAA;MAI3C;QACE,c1F+BS,EAAA;M0F5BX;QACE,uBAAuB,EAAA;;ADiD7B;ECpFA,iBAAgC;EAChC,qB1F8Dc,EAAA;E0F5Dd;IACE,c1F2DY,EAAA;I0FzDZ;MACE,cAAc,EAAA;IAGhB;MACE,cAAc,EAAA;EAIlB;IACE,uBAAuB,EAAA;IAEvB;MACE,iBAAgC,EAAA;MAEhC;QACE,c1FyCQ;Q0FxCR,YAAY,EAAA;QAEZ;UACE,wBAAuC,EAAA;MAI3C;QACE,c1FgCQ,EAAA;M0F7BV;QACE,uBAAuB,EAAA;;ADiD7B;ECpFA,mBAAgC;EAChC,qB1F+Da,EAAA;E0F7Db;IACE,c1F4DW,EAAA;I0F1DX;MACE,cAAc,EAAA;IAGhB;MACE,cAAc,EAAA;EAIlB;IACE,uBAAuB,EAAA;IAEvB;MACE,mBAAgC,EAAA;MAEhC;QACE,c1F0CO;Q0FzCP,YAAY,EAAA;QAEZ;UACE,0BAAuC,EAAA;MAI3C;QACE,c1FiCO,EAAA;M0F9BT;QACE,uBAAuB,EAAA;;ACrC/B,UAAA;AzDIA;EyDDE,SAAS;EACT,gB3FkIY,EAAA;E2FpId;IAII,sB3FoPmB,EAAA;I2FxPvB;MAMM,iBAAiB,EAAA;EANvB;IAUI,c3FqHgB;I2FpHhB,sBAAsB;IACtB,0BAA0B;IAC1B,wC3F2GM;I2F1GN,mBAAmB,EAAA;EAdvB;IAkBI,yC3FoGM;I2FnGN,oBAAoB;IACpB,uBAAuB,EAAA;EApB3B;IAuBI,c3F8G4B;I2F7G5B,qBAAqB;IACrB,yC3F6FM,EAAA;E2FtHV;IA4BI,wCAAwC,EAAA;EA5B5C;IA+BI,wCAAwC,EAAA;EA/B5C;IAkCI,wCAAwC,EAAA;EAlC5C;IAqCI,uCAAuC,EAAA;EArC3C;IxFiBI,kBwFuB0B,EAAA;EAxC9B;IA4CI,mBAAmB;IACnB,qBAAqB,EAAA;EA7CzB;IAgDI,c3FrCW;I2FsCX,kBAAkB,EAAA;EAjDtB;IAoDI,kBAAkB,EAAA;IApDtB;MAsDM,kBAAkB;MAClB,MAAM;MACN,QAAQ;MACR,YAAY,EAAA;EAzDlB;IA6DI,0GAAgE;IAAhE,gEAAgE;IAChE,WAAW,EAAA;EA9Df;IAkEI,qFAAuD;IAAvD,uDAAuD;IACvD,WAAW,EAAA;EAnEf;IAuEI,qFAAuD;IAAvD,uDAAuD;IACvD,WAAW,EAAA;EAxEf;IA4EI,wBAAgB;IAAhB,gBAAgB,EAAA;;AAIpB;EACE;IACE,uBAAe;IAAf,oBAAe;IAAf,eAAe;IACf,2BAAmB;IAAnB,wBAAmB;IAAnB,mBAAmB;IACnB,UAAU;IACV,SAAS,EAAA;IAJX;MAMI,qBAAqB;MACrB,WAAW;MACX,sBAAsB,EAAA,EACvB;;AAIH;EC7FA,oC5FwDgB;E4FvDhB,+CD6F8E;EC5F9E,oCD4F4G,EAAA;;AAD5G;EC7FA,oC5FyDkB;E4FxDlB,+CD6F8E;EC5F9E,oCD4F4G,EAAA;;AAD5G;EC7FA,mC5F0DgB;E4FzDhB,+CD6F8E;EC5F9E,oCD4F4G,EAAA;;AAD5G;EC7FA,mC5F2Da;E4F1Db,+CD6F8E;EC5F9E,oCD4F4G,EAAA;;AAD5G;EC7FA,mC5F4DgB;E4F3DhB,+CD6F8E;EC5F9E,oCD4F4G,EAAA;;AAD5G;EC7FA,oC5F6De;E4F5Df,+CD6F8E;EC5F9E,oCD4F4G,EAAA;;AAD5G;EC7FA,oC5F8Dc;E4F7Dd,+CD6F8E;EC5F9E,oCD4F4G,EAAA;;AAD5G;EC7FA,iC5F+Da;E4F9Db,+CD6F8E;EC5F9E,oCD4F4G,EAAA;;AEjG9G,0BAAA;AxEIA;EwEDE,kBAAkB;EAClB,cAAc;EACd,gBAAgB;EAChB,mBAAmB;EACnB,eAAe,EAAA;EALjB;IAQI,cAAc;IACd,oBAAoB;IACpB,mB7FkHuB;I6FjHvB,gBAAgB,EAAA;IAChB;MACE,cAAc;MACd,qBAAqB,EAAA;IAd3B;MAkBM,kBAAkB;MAClB,MAAM;MACN,OAAO;MAKP,cAAc;MACd,aAAa;MACb,UAAU;MACV,eAAe;MACf,UAAU;MACV,wBAAwB,EAAA;MATxB;QACE,UAAU;QACV,QAAQ,EAAA;IAvBhB;MAoCU,kBAAkB;MAClB,MAAM;MACN,OAAO,EAAA;MACP;QACE,UAAU;QACV,QAAQ,EAAA;IAzCpB;MA6CU,WAAW;MACX,WAAW;MACX,YAAY;MACZ,kBAAkB;MAClB,qB7FkBS;M6FjBT,iBAAiB;MvBhCzB,uBuBiC+B;MvB7B/B,euB6B+B;MACvB,uBAAuB;MACvB,kCAAkC;MAClC,0BAA0B,EAAA;IAtDpC;MvBkBE,uBuBwC+B;MvBpC/B,euBoC+B;MACvB,uBAAuB;MACvB,kCAAkC;MAClC,0BAA0B;MAC1B,kCAAkC;MAClC,UAAU;MACV,wBAAwB;MACxB,2BAA2B;MAG3B,mBAAmB;MACnB,gBAAgB;MAChB,mBAAmB;MACnB,iBAAiB;MACjB,c7F7DK,EAAA;I6FXf;MA8EY,qF7FFiE;M6FEjE,uD7FFiE;M6FGjE,eAAe,EAAA;IA/E3B;MAkFY,WAAW;MACX,UAAU;MACV,iBAAiB;MACjB,0BAA0B;MAC1B,2BAA2B;MAG3B,mBAAmB,EAAA;IAzF/B;MAiGY,qB7FLU,EAAA;I6F5FtB;MAwGc,mB7FZQ;M6FaR,c7F9FC,EAAA;I6FXf;MAkHU,kBAAkB;MAClB,WAAW;MACX,MAAM;MACN,OAAO;MAKP,qB7FvDS;M6FwDT,iBAAiB;MACjB,WAAW;MACX,YAAY;MACZ,kBAAkB;MvB5G1B,uBuB6G+B;MvBzG/B,euByG+B;MACvB,uBAAuB;MACvB,kCAAkC;MAClC,0BAA0B,EAAA;MAZ1B;QACE,UAAU;QACV,QAAQ,EAAA;IAxHpB;MAsIU,WAAW;MACX,UAAU;MACV,WAAW;MACX,mB7F9HK;M6F+HL,kBAAkB;MAClB,QAAQ;MACR,SAAS;MAKT,uBAAuB;MAEvB,eAAe;MACf,uBAAuB;MACvB,kCAAkC;MAClC,0BAA0B;MAC1B,UAAU;MACV,wBAAwB;MACxB,2BAA2B;MAG3B,mBAAmB;MACnB,kBAAkB,EAAA;MAhBlB;QACE,UAAU;QACV,UAAU,EAAA;IA/ItB;MAoKY,qF7FxFiE;M6FwFjE,uD7FxFiE;M6FyFjE,eAAe,EAAA;IArK3B;MAyKY,UAAU;MACV,gBAAgB;MAChB,0BAA0B;MAC1B,2BAA2B;MAG3B,mBAAmB,EAAA;IA/K/B;MAuLY,qB7F3FU,EAAA;I6F5FtB;MA8Lc,mB7FlGQ,EAAA;I6F5FtB;MAkMc,mB7FvLC,EAAA;;A6FiMb;;EAOY,kCAAiC,EAAA;;AAP7C;;EAac,qF7F7I6D;E6F6I7D,uD7F7I6D,EAAA;;A6FgI3E;;EAOY,oCAAiC,EAAA;;AAP7C;;EAac,qF7F5IsC;E6F4ItC,uD7F5IsC,EAAA;;A6F+HpD;;EAOY,kCAAiC,EAAA;;AAP7C;;EAac,qF7F3IoC;E6F2IpC,uD7F3IoC,EAAA;;A6F8HlD;;EAOY,+BAAiC,EAAA;;AAP7C;;EAac,kG7F1IqC;E6F0IrC,2D7F1IqC,EAAA;;A6F6HnD;;EAOY,kCAAiC,EAAA;;AAP7C;;EAac,qF7FzIoC;E6FyIpC,uD7FzIoC,EAAA;;A6F4HlD;;EAOY,iCAAiC,EAAA;;AAP7C;;EAac,qF7FxImC;E6FwInC,uD7FxImC,EAAA;;A6F2HjD;;EAOY,gCAAiC,EAAA;;AAP7C;;EAac,uF7FvImC;E6FuInC,wD7FvImC,EAAA;;A6F0HjD;;EAOY,+BAAiC,EAAA;;AAP7C;;EAac,oD7FtI8B,EAAA;;A8FrF9C,cAAA;AAEA;EAGM,aAAa;EACb,eAAe;EACf,cAAc;EACd,gBAAgB;EAChB,yDAAyD;EACzD,gBAAgB;EAChB,WAAW;EACX,YAAY;EACZ,wBAAwB;EACxB,iBAAiB,EAAA;;AAZvB;EAgBI,kBAAkB;EAClB,mB9F2GuB;E8F1GvB,8D9F2NiE;E8F3NjE,sD9F2NiE,EAAA;E8F7OrE;IAoBM,eAAe;IACf,sBAAsB,EAAA;IArB5B;MAuBQ,mBAAmB,EAAA;IAvB3B;MA0BQ,yB9FoNmB;M8FnNnB,c9FhBO,EAAA;;A+Fbf,UAAA;AAEA;EACE,qBAAqB,EAAA;;AAEvB;;EAEE,c/F6M+B;E+F5M/B,WAAW;EACX,YAAY,EAAA;EAJd;;IAOI,qB/FkFkB;I+FjFlB,wBAAgC;IAChC,c/FsM6B,EAAA;;AiBhNjC;E8EcE,yB/F4EoB;E+F3EpB,yC/FqGQ;E+FpGR,oB/FiMwB,EAAA;EiBjN1B;I8EkBI,yB/FTW;I+FUX,c/FiCa;I+FhCb,aAAa,EAAA;;AAIjB;EAEI,wBAAwB;EACxB,SAAS;EACT,0B/F8DkB;E+F7DlB,c/FmL6B,EAAA;E+FxLjC;IAOM,0B/F2DgB,EAAA;E+FlEtB;IAWQ,0B/FoBU,EAAA;I+F/BlB;MAaU,0B/FkBQ,EAAA;E+F/BlB;IAWQ,0B/FqBY,EAAA;I+FhCpB;MAaU,0B/FmBU,EAAA;E+FhCpB;IAWQ,0B/FsBU,EAAA;I+FjClB;MAaU,0B/FoBQ,EAAA;E+FjClB;IAWQ,0B/FuBO,EAAA;I+FlCf;MAaU,0B/FqBK,EAAA;E+FlCf;IAWQ,0B/FwBU,EAAA;I+FnClB;MAaU,0B/FsBQ,EAAA;E+FnClB;IAWQ,0B/FyBS,EAAA;I+FpCjB;MAaU,0B/FuBO,EAAA;E+FpCjB;IAWQ,0B/F0BQ,EAAA;I+FrChB;MAaU,0B/FwBM,EAAA;E+FrChB;IAWQ,0B/F2BO,EAAA;I+FtCf;MAaU,0B/FyBK,EAAA;;A+FnBf;EAEI,mB/F6EuB;E+F5EvB,cAAc;EACd,mBAAmB;EACnB,oBAAoB,EAAA;;AALxB;EASM,qB/FkBY,EAAA;;A+F3BlB;EAaI,kBAAkB;EAClB,kBAAkB,EAAA;;AAdtB;EAiBI,uBAAuB,EAAA;;AChE3B,UAAA;AAEA;EACE,8BhG2FoB;EgG1FpB,6BhG0FoB,EAAA;EgG5FtB;IAII,gChGwFkB;IgGvFlB,+BhGuFkB;IhB1DmC,oBAAuB;IAAvB,oBAAuB;IAAvB,aAAuB;IAjBf,yBgHVlC;IhHUkC,sBgHVlC;IhHUkC,mBgHVlC;IAC3B,kBAAiB;IACjB,yChG6GM;IgG5GN,mBhGkHuB,EAAA;IgG5H3B;MAaM,qBAAqB;MACrB,eAAe;MACf,WAAW;MACX,gBAAgB;MAChB,chGkDa,EAAA;;AiGrEnB,UAAA;AAEA;;;EAGE,kBAAkB;EAClB,mBjGwHyB,EAAA;EiG5H3B;;;IAMI,gBAAgB,EAAA;;AAIpB;;;EAGE,gBAAgB;EAChB,UAAU,EAAA;EAJZ;;;IAMI,oBAAoB,EAAA;IANxB;;;MAQM,oCAAoC;MACpC,oBAAoB;MACpB,aAAa;MACb,mBAAmB,EAAA;;AAKzB;EAGM,gBAAgB;EAChB,cjG0CY,EAAA;;AiGrClB;EAGM,gBAAgB;EAChB,cjG8Ba,EAAA;;AiGzBnB;EAGM,gBAAgB;EAChB,cjGuBa,EAAA;;AiGlBnB;EACE,eAAe,EAAA;EACf;IACE,gBAAgB,EAAA;EAHpB;IAMI,kBAAkB;IAClB,qBAAqB;IACrB,kBAAkB;IAClB,cAAc;IACd,oBAAoB,EAAA;IAVxB;MAaM,WAAU;MACV,kBAAkB,EAAA;IAdxB;MAiBM,MAAM;MACN,OAAO;MACP,WAAW;MACX,YAAY;MACZ,mBAAmB,EAAA;IArBzB;MAwBM,WAAW;MACX,YAAY;MACZ,QAAQ;MACR,SAAS;MACT,gBjGmDQ;MiGlDR,mBAAmB,EAAA;IA7BzB;MAiCQ,qFjGL2C;MiGK3C,uDjGL2C,EAAA;IiG5BnD;MAsCQ,kGjGZ6C;MiGY7C,2DjGZ6C,EAAA;IiG1BrD;MA2CQ,qFjGhB4C;MiGgB5C,uDjGhB4C,EAAA;IiG3BpD;MAgDQ,qFjGvB4C;MiGuB5C,uDjGvB4C,EAAA;IiGzBpD;MAqDQ,qFjG9BqE;MiG8BrE,uDjG9BqE,EAAA;;AiGoC7E;EACE,kBAAkB;EAClB,gBAAgB;EAChB,kBAAkB;EAClB,qBAAqB,EAAA;EAErB;IACE,kBAAkB,EAAA;EAPtB;IAWI,kBAAkB;IAClB,cAAc;IACd,oBAAoB,EAAA;IAbxB;MAgBM,WAAW;MACX,kBAAkB;MAClB,mBAAmB;MACnB,WAAW;MACX,YAAY;MACZ,WAAW;MACX,QAAQ;MACR,yBjGpEa;MiGqEb,kBAAkB;MAClB,UAAU;MACV,wBjG6LkC,EAAA;IiGvNxC;MA8BM,WAAW;MACX,yBjGnDgB;MiGoDhB,kBAAkB;MAClB,SAAS;MACT,WAAW;MACX,YAAY,EAAA;IAnClB;MAwCQ,WAAW;MACX,WAAW,EAAA;IAzCnB;MA8CM,iBAAiB,EAAA;MA9CvB;QAiDQ,WAAW;QACX,MAAM;QACN,WAAW,EAAA;;ACrKnB,YAAA;AAEA;ElHkCyD,oBAAuB;EAAvB,oBAAuB;EAAvB,aAAuB;EAjBf,8BkHdlC;ElHckC,6BkHdlC;ElHckC,uBkHdlC;ElHckC,mBkHdlC;ElHckC,wBkHb9B;ElHa8B,qBkHb9B;ElHa8B,uBkHb9B;EAC/B,sBAAsB;EACtB,kBAAkB,EAAA;EANtB;IAQM,gBAAgB,EAAA;EARtB;IAWM,mBjGHY,EAAA;EiGRlB;IAcM,eAAe;IACf,kBAAkB,EAAA;EAfxB;IAkBM,mBAAmB;IACnB,kBAAkB,EAAA;IAnBxB;;MAsBQ,WAAW;MACX,YAAY;MACZ,mBAAmB,EAAA;IAxB3B;MA2BQ,YAAY;MACZ,kBAAkB;MlHM+B,oBAAuB;MAAvB,oBAAuB;MAAvB,aAAuB;MAjBf,yBkHa9B;MlHb8B,sBkHa9B;MlHb8B,mBkHa9B;MlHb8B,wBkHc1B;MlHd0B,qBkHc1B;MlHd0B,uBkHc1B,EAAA;MA/BvC;QAiCU,mBAAmB;QACnB,SAAS,EAAA;IAlCnB;MAyCQ,8BAA8B;MAC9B,mBAAmB;MACnB,WAAW;MACX,cAAc;MACd,YAAY;MACZ,UAAU;MACV,UAAU;MACV,kBAAkB;MAClB,WAAW,EAAA;EAjDnB;IA8DM,cAAc;IACd,kBAAkB,EAAA;IA/DxB;MAiEQ,eAAe,EAAA;IAjEvB;MAoEQ,mBAAmB,EAAA;MApE3B;QAsEU,mDAAmD;QACnD,mBAAmB;QACnB,+BlGoBY,EAAA;IkGhBhB;MACE,eAAe;MACf,mBAAmB;MACnB,eAAe;MACf,iBAAiB,EAAA;EAhFzB;IlHkCyD,oBAAuB;IAAvB,oBAAuB;IAAvB,aAAuB;IAjBf,8BkHoEhC;IlHpEgC,6BkHoEhC;IlHpEgC,uBkHoEhC;IlHpEgC,mBkHoEhC,EAAA;IArFjC;MAuFQ,WAAW;MACX,2BAA2B;MAC3B,YAAY;MACZ,sCAAsC;MACtC,mBAAmB;MACnB,gBAAgB;MAChB,qBAAqB,EAAA;MA7F7B;QA+FU,kBAAkB,EAAA;;AA/F5B;EAsGM,iBAAiB,EAAA;EAtGvB;IAwGQ,cAAc,EAAA;EAxGtB;IA2GQ,iBAAiB,EAAA;;AA3GzB;EAiHM,gClGrBgB,EAAA;EkG5FtB;IAmHQ,gBAAgB,EAAA;;ACrHxB,WAAA;AtFIA;EsFDE,gBAAgB,EAAA;EADlB;IAKM,aAAa;IACb,wBAAwB;IACxB,wCnGiHI;ImGhHJ,oBAAoB,EAAA;IAR1B;MAWQ,qBAAqB,EAAA;EAX7B;;IAkBI,sBAAsB;IACtB,mBnGyGuB;ImGxGvB,cAAc;IACd,mBAAmB;IACnB,kBnGuHyB,EAAA;ImG7I7B;;MAyBM,WAAW;MACX,YAAY;MACZ,mBAAmB,EAAA;IA3BzB;;MA+BM,gBAAgB,EAAA;EA/BtB;IAoCI,YAAY,EAAA;IApChB;;;MAyCM,YAAY,EAAA;;AAIlB;EACE,4BnG8CoB,EAAA;;AmG5CtB;EACE,gBAAgB,EAAA;;ACnDlB,SAAA;AAEA;EACE,qBAAqB;EACrB,gBAAgB,EAAA;EAFlB;IAII,0BAA0B;IAC1B,6BAA6B;IAC7B,WAAW;IACX,uBAAuB,EAAA;EAP3B;IAUI,kBAAkB,EAAA;IAClB;MACE,iBAAiB;MACjB,mBAAmB,EAAA;;AAKzB;EACE,YAAY;EACZ,gBAAgB,EAAA;EAFlB;IAII,UAAU;IACV,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB,EAAA;IAPpB;MAYM,mBAAmB;MACnB,gBAAgB;MAChB,gCpG4DgB,EAAA;MoG1EtB;QAgBQ,mBAAmB,EAAA;MAhB3B;QAoBQ,cAAc;QACd,kBAAkB;QAClB,qBAAqB,EAAA;EAtB7B;IA+BI,kBAAkB,EAAA;EA/BtB;IAyCI,eAAe;IACf,mBAAmB;IACnB,gBAAgB;IAChB,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,kBAAkB,EAAA;EA/CtB;IAmDI,6BAA6B;IAC7B,sCpGAY;IoGAZ,8BpGAY,EAAA;;ApBmChB,sEAAA;AACA,4BAAA;AyH5GA,SAAA;AAEA;EAEE,mBrGSa,EAAA;EqGXf;IAIG,crG8M8B,EAAA;EqGlNjC;IAUK,qBrGkFiB,EAAA;;AqG5FtB;EAgBE,mBAAmB,EAAA;EAhBrB;IAkBG,YAAY,EAAA;;AAlBf;EAuBG,qBAAqB,EAAA;EAvBxB;IAyBI,mBAAmB,EAAA;EAzBvB;IA4BI,uBAAuB;IACvB,gBAAgB;IAChB,mBAAmB,EAAA;;AA9BvB;EAkCG,YAAY;EACZ,gBAAgB,EAAA;;AAnCnB;EAsCG,mBrGsFwB,EAAA;EqG5H3B;IAwCI,cAAc,EAAA;;AC1ClB,WAAA;ArEgBA;EqEbE,uCtGmHQ;EsGlHR,gBtGsJc;EsGrJd,iCtGyPsC;EsGxPtC,yCtGwPsC;EsGvPtC,sCtGuPsC;EsGtPtC,qCtGsPsC,EAAA;EsG5PxC;IASI,YAAY,EAAA;EAThB;IAYI,mDtGgPoC;IsG/OpC,2DtG+OoC;IsG9OpC,wDtG8OoC;IsG7OpC,uDtG6OoC;IsG5OpC,gBtGwIY;IsGvIZ,YtGgVoB;IsG/UpB,YtGuIgB,EAAA;IsGtIhB;MAnBJ;QAoBM,WAAW,EAAA,EAiCd;IArDH;MAuBM,cAA+B;MAC/B,iBAAiB;MACjB,iBAAiB;MACjB,eAAe;MACf,iBAAiB;MACjB,WAAW,EAAA;MA5BjB;QAiCQ,cAA+B,EAAA;MAjCvC;QAqCQ,0BAA0C;QAC1C,eAAe;QACf,YAAY;QACZ,YAAY;QACZ,sBAAsB,EAAA;MAzC9B;QA4CQ,aAAa,EAAA;QA5CrB;UA8CU,wBAA2C;UAC3C,eAAe;UACf,YAAY;UACZ,YAAY,EAAA;EAjDtB;IAuDI,4BtGqMoC;IsGpMpC,oCtGoMoC;IsGnMpC,iCtGmMoC;IsGlMpC,gCtGkMoC;IsGjMpC,ctG+FuB;IsG9FvB,kBAAkB;IAClB,mBAAmB;IACnB,yBAAwC;IACxC,YtG0FgB,EAAA;IsGzFhB;MAhEJ;QAiEM,WAAW;QACX,kBAAkB;QAClB,mBAAmB,EAAA,EA4OtB;IA/SH;MAuEM,SAAS;MACT,cAAc;MACd,YtGgFc;MGxIhB,kBmGyD4B;MAC1B,iBAAiB;MACjB,mBAAmB,EAAA;MA5EzB;QA8EQ,wBAAgB;QAAhB,gBAAgB,EAAA;MA9ExB;QAiFQ,iBAAiB,EAAA;QACjB;UAlFR;YAmFU,aAAa,EAAA,EAEhB;MAEC;QAvFR;UAwFU,kBAAkB;UAClB,mBAAmB;UACnB,kBAAkB,EAAA,EAErB;IA5FP;MAkGU,mBtG0BiB;MsGzBjB,cAAc,EAAA;MC3DtB;QD6DU,mBtGsDc;QsGrDd,ctGoDe;QsGnDf,uCtGaF,EAAA;MuG3ER;QD4DU,mBtGsDc;QsGrDd,ctGoDe;QsGnDf,uCtGaF,EAAA;MuG1ER;QD2DU,mBtGsDc;QsGrDd,ctGoDe;QsGnDf,uCtGaF,EAAA;MuGzER;QD0DU,mBtGsDc;QsGrDd,ctGoDe;QsGnDf,uCtGaF,EAAA;IsGpHV;MA2GU,eAAe;MACf,eAAe;MACf,ctG6CiB,EAAA;IsG1J3B;MAgHU,uBAAuB,EAAA;IAhHjC;MA0HM,kBAAkB,EAAA;MA1HxB;;QA8HQ,kBAAkB;QAClB,mBAAmB;QACnB,yBtGrHO,EAAA;MsGXf;QAmIQ,SAAS;QACT,WAAW;QACX,WAAW;QACX,YAAY,EAAA;MAtIpB;QAyIQ,eAAe;QACf,YAAY;QACZ,gBAAgB;QAChB,ctGjIO;QsGkIP,YAAY;QACZ,WAAW;QACX,cAAc;QACd,kBAAkB,EAAA;MAhJ1B;QAmJQ,aAAa,EAAA;IAnJrB;MAuJM,8BAAmB;MAAnB,6BAAmB;MAAnB,uBAAmB;MAAnB,mBAAmB;MACnB,yBAAmB;MAAnB,sBAAmB;MAAnB,mBAAmB,EAAA;MAxJzB;QA2JU,cAAc;QACd,mBtGDgB;QsGEhB,mBAAmB;QACnB,oBAAoB;QACpB,YtGNU;QhBvHqC,oBAAuB;QAAvB,oBAAuB;QAAvB,aAAuB;QAjBf,yBsHgJ5B;QtHhJ4B,sBsHgJ5B;QtHhJ4B,mBsHgJ5B,EAAA;QAC3B;UAlKV;YAmKY,kBAAkB;YAClB,mBAAmB,EAAA,EAKtB;QAzKT;UAuKY,kBtGXmB,EAAA;MsG5J/B;QA6Kc,ctG1GK;QsG2GL,eAAe,EAAA;MA9K7B;QAmLY,YAAY;QnGlKpB,kBmGmKkC;QAC1B,uDAAuD;QAEvD,+CAA+C,EAAA;QAvL3D;UAyLc,kBAAkB;UAClB,iBAAiB;UACjB,aAAa;UAKb,UAAU,EAAA;UAJV;YACE,WAAW;YACX,OAAO,EAAA;UA9LvB;YAqMgB,gBAAgB;YAChB,kBAAkB;YAClB,eAAe,EAAA;YAvM/B;cA0MkB,eAAe,EAAA;YA1MjC;cA8MkB,gBAAgB;cAChB,gBAAgB;cAChB,uBAAuB,EAAA;YAEzB;cAGI,iBAAiB,EAAA;UArNrC;YA2NgB,SAAS,EAAA;MAIf;QA/NV;UAgOY,gBAAgB,EAAA;UAhO5B;YAkOc,UAAU;YACV,WAAW;YACX,StG3EM;YsG4EN,wBAAwB,EAAA,EACzB;MAtOb;QA0OU,kBAAkB;QAClB,kBAAkB,EAAA;QA3O5B;UA6OY,eAAe;UACf,cAAc,EAAA;MA9O1B;QAqPc,kBAAkB;QAClB,WAAW;QACX,YAAY,EAAA;QAvP1B;UAyPgB,WAAW;UACX,YAAY;UACZ,mBAAmB,EAAA;QA3PnC;UA8PgB,kBAAkB;UAClB,WAAW;UACX,YAAY;UACZ,mBAAmB;UACnB,yBAAyB;UACzB,WAAW;UACX,WAAW,EAAA;UApQ3B;YAsQkB,mBtGjMC,EAAA;UsGrEnB;YAyQkB,mBtGjMA,EAAA;UsGxElB;YA4QkB,mBtGrMC,EAAA;MsGvEnB;QAiRc,oBAAoB,EAAA;QACpB;UACE,cAAc;UACd,qBAAqB,EAAA;QApRrC;UAuRgB,cAAc,EAAA;QAEhB;UAzRd;YA0RgB,aAAa,EAAA,EAEhB;MA5Rb;QA+RgB,cAAc,EAAA;MAOtB;QAtSR;UAuSU,iBAAiB,EAAA;UACjB;YACE,cAAc;YACd,kBAAkB,EAAA,EACnB;;AAMX;ErEnSA;IqEqSI,8BAAmB;IAAnB,6BAAmB;IAAnB,uBAAmB;IAAnB,mBAAmB,EAAA;IAnTvB;MAqTM,WAAW,EAAA;MAHf;QAMQ,aAAa,EAAA;MAxTvB;QA2TU,qBAAqB,EAAA;ErE/M/B;IqEsNI,oBAAa;IAAb,oBAAa;IAAb,aAAa;IACb,kBAAkB,EAAA,EACnB;;AAGH;EAvUA;IA0UM,WAAW,EAAA;IAFf;MAIM,gBAAgB,EAAA,EACjB;;AAKP,4BAAA;AAEE;EAGM,qFtG3QqE;EsG2QrE,uDtG3QqE;EsG4QrE,ctG7UO,EAAA;EuG6Bb;ID0Tc,ctGvVD,EAAA;EuG8Bb;IDyTc,ctGvVD,EAAA;EuG+Bb;IDwTc,ctGvVD,EAAA;EuGgCb;IDuTc,ctGvVD,EAAA;EsGyUb;IAkBY,ctG3VC,EAAA;;AsGyUb;EAGM,qFtG1Q8C;EsG0Q9C,uDtG1Q8C;EsG2Q9C,ctG7UO,EAAA;EuG6Bb;ID0Tc,ctGvVD,EAAA;EuG8Bb;IDyTc,ctGvVD,EAAA;EuG+Bb;IDwTc,ctGvVD,EAAA;EuGgCb;IDuTc,ctGvVD,EAAA;EsGyUb;IAkBY,ctG3VC,EAAA;;AsGyUb;EAGM,qFtGzQ4C;EsGyQ5C,uDtGzQ4C;EsG0Q5C,ctG7UO,EAAA;EuG6Bb;ID0Tc,ctGvVD,EAAA;EuG8Bb;IDyTc,ctGvVD,EAAA;EuG+Bb;IDwTc,ctGvVD,EAAA;EuGgCb;IDuTc,ctGvVD,EAAA;EsGyUb;IAkBY,ctG3VC,EAAA;;AsGyUb;EAGM,kGtGxQ6C;EsGwQ7C,2DtGxQ6C;EsGyQ7C,ctG7UO,EAAA;EuG6Bb;ID0Tc,ctGvVD,EAAA;EuG8Bb;IDyTc,ctGvVD,EAAA;EuG+Bb;IDwTc,ctGvVD,EAAA;EuGgCb;IDuTc,ctGvVD,EAAA;EsGyUb;IAkBY,ctG3VC,EAAA;;AsGyUb;EAGM,qFtGvQ4C;EsGuQ5C,uDtGvQ4C;EsGwQ5C,ctG7UO,EAAA;EuG6Bb;ID0Tc,ctGvVD,EAAA;EuG8Bb;IDyTc,ctGvVD,EAAA;EuG+Bb;IDwTc,ctGvVD,EAAA;EuGgCb;IDuTc,ctGvVD,EAAA;EsGyUb;IAkBY,ctG3VC,EAAA;;AsGyUb;EAGM,qFtGtQ2C;EsGsQ3C,uDtGtQ2C;EsGuQ3C,ctG7UO,EAAA;EuG6Bb;ID0Tc,ctGvVD,EAAA;EuG8Bb;IDyTc,ctGvVD,EAAA;EuG+Bb;IDwTc,ctGvVD,EAAA;EuGgCb;IDuTc,ctGvVD,EAAA;EsGyUb;IAkBY,ctG3VC,EAAA;;AsGyUb;EAGM,uFtGrQ2C;EsGqQ3C,wDtGrQ2C;EsGsQ3C,ctG7UO,EAAA;EuG6Bb;ID0Tc,ctGvVD,EAAA;EuG8Bb;IDyTc,ctGvVD,EAAA;EuG+Bb;IDwTc,ctGvVD,EAAA;EuGgCb;IDuTc,ctGvVD,EAAA;EsGyUb;IAkBY,ctG3VC,EAAA;;AsGyUb;EAGM,oDtGpQsC;EsGqQtC,ctG7UO,EAAA;EuG6Bb;ID0Tc,ctGvVD,EAAA;EuG8Bb;IDyTc,ctGvVD,EAAA;EuG+Bb;IDwTc,ctGvVD,EAAA;EuGgCb;IDuTc,ctGvVD,EAAA;EsGyUb;IAkBY,ctG3VC,EAAA;;AwGbf,YAAA;AAEA;EACE,8BAA2C;EAC3C,mBxGSa;EwGRb,yCxGmHQ;EwGlHR,UAAU;EACV,YxG4VsB;EwG3VtB,WAAW;EACX,mDxGqPsC;EwGpPtC,2DxGoPsC;EwGnPtC,wDxGmPsC;EwGlPtC,uDxGkPsC,EAAA;EwG5PxC;IAaI,gBAAgB;IAChB,qBAAiB;IAAjB,iBAAiB;IACjB,4BAAsB;IAAtB,6BAAsB;IAAtB,0BAAsB;IAAtB,sBAAsB;IACtB,mBAAmB,EAAA;IAhBvB;MAmBM,kBxGgW0B;MhBvWyB,kCwHQjB;MxHHyB,0BwHGzB;MAClC,+BAA+B;MAC/B,uCAAuC,EAAA;MAtB7C;QAwBQ,YAAY,EAAA;MAxBpB;QxHkCyD,oBAAuB;QAAvB,oBAAuB;QAAvB,aAAuB;QAjBf,yBwHY9B;QxHZ8B,sBwHY9B;QxHZ8B,mBwHY9B;QAC3B,mBAAmB;QACnB,8BAA2D;QAC3D,cxGsU0B;QhB1VuB,kCwHqBf;QxHhBuB,0BwHgBvB;QAClC,0BAA0B;QAC1B,kCAAkC,EAAA;QAnC1C;UAsCU,cAAc,EAAA;UAtCxB;YAyCY,mBxG+UqB;YwG9UrB,cAAc;YACd,iBAAiB;YAKjB,gBxG6T6B,EAAA;YwGjU7B;cACE,cAAc;cACd,kBAAkB,EAAA;YA9ChC;cAkDc,sBAAsB,EAAA;UAlDpC;YAuDY,yDAAyD;YACzD,cAAc;YACd,mBxG+TqB;YwG9TrB,iBAAiB;YAKjB,cxG+S4B,EAAA;YwGnT5B;cACE,cAAc;cACd,kBAAkB,EAAA;YA7DhC;cAiEc,gBAAgB;cAChB,kBAAkB;cAClB,cAAc,EAAA;YAnE5B;cAsEc,mBAAmB,EAAA;cACnB;gBACE,cAAc;gBACd,oBAAoB,EAAA;QAzEpC;UAgFU,cAAc;UACd,qBAAqB;UACrB,mBxG0CiB;UwGzCjB,cAAc;UACd,sBAAsB,EAAA;QApFhC;UAwFU,kBAAkB;UAClB,iBAAiB,EAAA;QAzF3B;UA+Fc,gBAAgB,EAAA;MA/F9B;QAsGQ,mBxG3FO,EAAA;QwGXf;UAyGY,cxGtCO;UwGuCP,wCxGcF,EAAA;QwGxHV;UA6GY,cxG1CO,EAAA;MwGnEnB;QAkHQ,mBxGwPmD,EAAA;MwG1W3D;QAsHU,YAAY;QACZ,cAAc;QACd,aAAa;QACb,kBAAkB,EAAA;QAzH5B;UA2HY,WAAW;UACX,YAAY,EAAA;UA5HxB;YA8Hc,WAAW;YACX,YAAY;YACZ,mBAAmB,EAAA;QAhIjC;UAoIY,iBAAiB,EAAA;UACjB;YACE,iBAAiB;YACjB,kBAAkB,EAAA;QAvIhC;UA2IY,mBAAmB;UACnB,iBAAiB,EAAA;UACjB;YACE,cAAc;YACd,kBAAkB,EAAA;MA/IhC;QAqJQ,gBAAgB,EAAA;QArJxB;UAuJU,aAAa;UACb,cAAc;UACd,YAAY,EAAA;QAzJtB;UA4JU,mBAAmB,EAAA;UA5J7B;YA8JY,cAAc,EAAA;IA9J1B;MAyKc,cxGkMyD,EAAA;IwG3WvE;MAgLM,mBAAmB;MACnB,aAAY;MACZ,gBAAgB,EAAA;MAlLtB;QAqLQ,UAAU,EAAA;QArLlB;UAuLU,WxGgLwB;UwG/KxB,kCxG8L4C;UwG7L5C,kBAAkB;UAClB,oBxG2L0B;UwG1L1B,cAAc;UACd,YAAY;UACZ,aAAa,EAAA;UA7LvB;YA+LY,gBAAgB;YAChB,oCAAoC;YACpC,cAAc;YACd,kBAAkB;YAClB,SAAQ;YAKR,QAAO;YnCnMlB,mCmCoM8C;YnCnMrC,2BmCmMqC;YACnC,cAAiD;YACjD,iBAAiB,EAAA;YAPjB;cACE,UAAU;cACV,QAAQ,EAAA;UAtMtB;YA8MY,cxG3IO;YwG4IP,uBAAuB,EAAA;UA/MnC;YAkNY,cxG0JiE,EAAA;QwG5W7E;UAsNU,uBAAuB,EAAA;;AAOjC,6BAAA;AACA;EACE;IACE,eAAe;IACf,8BAA2C;IAC3C,SxGzEgB;IwG0EhB,SAAS;IACT,cAAc;IACd,axG4HoB;IwG3HpB,sCAAsC;IAEtC,8BAA8B,EAAA;IAThC;MAWI,QAAQ,EAAA,EACT;;AC7OL,YAAA;AAEA;EAGM,iBzGsJc,EAAA;;AyG/IlB;EADF;IAIQ,WzGsViB,EAAA;IyG1VzB;MAMU,aAAa,EAAA;IANvB;MASU,qBAAqB,EAAA;EAT/B;IAaQ,wBAA0C,EAAA;EAblD;IAiBM,WzGyUmB,EAAA;IyG1VzB;MAmBQ,iBAAiB,EAAA;MAnBzB;QAqBU,kBAAkB;QAClB,UAAU,EAAA;QAtBpB;UAwBY,cAAc;UACd,kBAAkB,EAAA;UAzB9B;;YA4Bc,aAAa,EAAA;UA5B3B;YtGQI,4BsGuB8C,EAAA;YAC5B;ctGxBlB,0BsGyB8C,EAAA;UAjClD;YAsCgB,eAAe;YACf,cAAc,EAAA;UAvC9B;YA0CgB,aAAa,EAAA;UA1C7B;YtGQI,0BsGuC8C,EAAA;YAC1B;ctGxCpB,wBsGyC8C,EAAA;QAjDlD;UAuDY,aAAa,EAAA;QAvDzB;UA0DY,aAAa,EAAA;QA1DzB;UA6DY,SAAS,EAAA;UA7DrB;YA+Dc,cAAc,EAAA;QA/D5B;UAmEY,aAAa,EAAA;QAnEzB;UzHyByD,oBAAuB;UAAvB,oBAAuB;UAAvB,aAAuB;UAjBf,yByHiEpB;UzHjEoB,sByHiEpB;UzHjEoB,mByHiEpB;UAC3B,mBzGuRyC;UyGtRzC,sBAAsB;UACtB,UzG8QO;UyG7QP,kBAAkB;UAClB,gBAAgB;UAChB,MAAM;UACN,SAAS;UACT,YzGySc;UyGxSd,UAAU;UACV,gBAAgB,EAAA;UACR;YACN,UAAU;YACV,WzGoQK;YyGnQL,gBAAgB,EAAA;UAvFpC;YA0FoB,aAAa,EAAA;QA1FjC;;UAgGgB,cAAc;UACd,gBAAgB;UAChB,mBzG+P2C;UGzVvD,wBsG2F4C;UAChC,kBAAkB;UAClB,UzGqPS;UyGpPT,YzGoRgB,EAAA;UyGnRR;YACJ,UAAU;YACV,WzGiPK;YGlVrB,wBsGkGgD,EAAA;MA1GpD;QAgHU,qBzGwQsC,EAAA;QyGxXhD;UAmHc,gBAAgB;UAChB,kBAAkB,EAAA;QAGd;UAEJ,kBAAkB;UAClB,cAAc,EAAA;UAHV;YAKF,iBAAiB,EAAA;YALf;cAOA,OAAO;cACP,YAAY,EAAA;IA/H9B;MAuIQ,aAAa,EAAA;EAvIrB;IA4IM,wBAA0C,EAAA,EAC3C;;AAKL;EACE,cAAc;EACd,iBAAiB,EAAA;EAFnB;IAMM,gBAAgB,EAAA;EANtB;;;;IAeM,YAAY,EAAA;EAflB;;;;IAmBM,oDAAiD,EAAA;EAnBvD;;;;IAuBM,0BAA0B;IAC1B,4BAA4B,EAAA;;ACrLlC;EACE,8BAA2C;E1HmCY,oBAAuB;EAAvB,oBAAuB;EAAvB,aAAuB;EAjBf,8B0HhBpC;E1HgBoC,6B0HhBpC;E1HgBoC,uB0HhBpC;E1HgBoC,mB0HhBpC;EAC3B,eAAe;EACf,gBAAgB,EAAA;EALlB;IAQI,WAAW;IACX,iBAAiB,EAAA;;AAIrB;EACE,uD1GgPsC;E0GhPtC,+C1GgPsC;E0G/OtC,yBAAwC;EACxC,8BAA2C;E1HoBY,oBAAuB;EAAvB,oBAAuB;EAAvB,aAAuB;EAjBf,4B0HDjC;E1HCiC,6B0HDjC;E1HCiC,0B0HDjC;E1HCiC,sB0HDjC,EAAA;EAC9B;IANF;MAOI,cAAc;MACd,WAAW,EAAA,EAEd;;AAED;EACE,mB1GiEkB;E0GhElB,wBAAwB;EACxB,WAAW;E1HToD,mB0HU3C;E1HV2C,oB0HU3C;E1HV2C,Y0HU3C,EAAA","file":"style.css","sourcesContent":["/*-------------------------------------------------------------------\n ===== Table of Contents =====\n\n * Bootstrap functions\n * Template variables\n * SCSS Compass Functions\n * Boostrap Main SCSS\n * Template mixins\n + Animation Mixins\n + Background Mixins\n + Badge Mixins\n + Button Mixins\n + Miscellaneous Mixins\n + BlockQuote Mixins\n + Cards Mixins\n + Color Functions Mixins\n + Tooltips\n + popovers\n * Core Styles\n + Reset Styles\n + Fonts\n + Functions\n + Backgrounds\n + Typography\n + Miscellaneous\n + Footer\n + Layouts\n + Utilities\n + Demo styles\n * Components\n + Badges\n + Boostrap Progress\n + Buttons\n + Breadcrumbs\n + Cards\n + Checkboxes and Radios\n + Dropdowns\n + Forms\n + Icons\n + Preview\n + Tables\n + Todo List\n * Landing screens\n + Auth\n-------------------------------------------------------------------*/\n\n/*-------------------------------------------------------------------*/\n/* === Import Bootstrap functions and variables === */\n@import \"../../node_modules/bootstrap/scss/functions\";\n@import \"../../node_modules/bootstrap/scss/variables\";\n\n/*-------------------------------------------------------------------*/\n/* === Import template variables === */\n@import './variables';\n\n/*-------------------------------------------------------------------*/\n/* === SCSS Compass Functions === */\n@import \"../../node_modules/compass-mixins/lib/compass\";\n@import \"../../node_modules/compass-mixins/lib/animate\";\n\n/*-------------------------------------------------------------------*/\n/* === Boostrap Main SCSS === */\n@import \"../../node_modules/bootstrap/scss/bootstrap\";\n\n/*-------------------------------------------------------------------*/\n/* === Template mixins === */\n@import \"./mixins/misc\";\n@import \"./mixins/animation\";\n@import \"./mixins/background\";\n@import \"./mixins/badges\";\n@import \"./mixins/blockqoute\";\n@import \"./mixins/buttons\";\n@import \"./mixins/breadcrumbs\";\n@import \"./mixins/cards\";\n@import \"./mixins/pagination\";\n@import \"./mixins/popovers\";\n@import \"./mixins/tooltips\";\n@import \"./mixins/text\";\n\n/*-------------------------------------------------------------------*/\n/* === Core Styles === */\n@import \"./reset\";\n@import \"./fonts\";\n@import \"./functions\";\n@import \"./typography\";\n@import \"./misc\";\n@import \"./footer\";\n@import \"./utilities\";\n@import \"./demo\";\n@import \"./dashboard\";\n\n/*-------------------------------------------------------------------*/\n/* === Components === */\n@import \"./components/badges\";\n@import \"./components/bootstrap-progress\";\n@import \"./components/buttons\";\n@import \"./components/breadcrumbs\";\n@import \"./components/cards\";\n@import \"./components/checkbox-radio\";\n@import \"./components/dropdown\";\n@import \"./components/forms\";\n@import \"./components/icons\";\n@import \"./components/lists\";\n@import \"./components/preview\";\n@import \"./components/tables\";\n@import \"./components/todo-list\";\n\n/*-------------------------------------------------------------------*/\n/* === Landing screens === */\n@import \"./landing-screens/auth\";\n\n\n@import './navbar';\n@import './sidebar';\n@import './layouts';\n@import './vertical-wrapper';","/*-------------------------------------------------------------------\n ===== Table of Contents =====\n\n * Bootstrap functions\n * Template variables\n * SCSS Compass Functions\n * Boostrap Main SCSS\n * Template mixins\n + Animation Mixins\n + Background Mixins\n + Badge Mixins\n + Button Mixins\n + Miscellaneous Mixins\n + BlockQuote Mixins\n + Cards Mixins\n + Color Functions Mixins\n + Tooltips\n + popovers\n * Core Styles\n + Reset Styles\n + Fonts\n + Functions\n + Backgrounds\n + Typography\n + Miscellaneous\n + Footer\n + Layouts\n + Utilities\n + Demo styles\n * Components\n + Badges\n + Boostrap Progress\n + Buttons\n + Breadcrumbs\n + Cards\n + Checkboxes and Radios\n + Dropdowns\n + Forms\n + Icons\n + Preview\n + Tables\n + Todo List\n * Landing screens\n + Auth\n-------------------------------------------------------------------*/\n/*-------------------------------------------------------------------*/\n/* === Import Bootstrap functions and variables === */\n/*-------------------------------------------------------------------*/\n/* === Import template variables === */\n/*-------------------------------------------------------------------*/\n/* === SCSS Compass Functions === */\n@-moz-keyframes flash {\n 0% {\n opacity: 1; }\n 25% {\n opacity: 0; }\n 50% {\n opacity: 1; }\n 75% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@-webkit-keyframes flash {\n 0% {\n opacity: 1; }\n 25% {\n opacity: 0; }\n 50% {\n opacity: 1; }\n 75% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@-o-keyframes flash {\n 0% {\n opacity: 1; }\n 25% {\n opacity: 0; }\n 50% {\n opacity: 1; }\n 75% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@-ms-keyframes flash {\n 0% {\n opacity: 1; }\n 25% {\n opacity: 0; }\n 50% {\n opacity: 1; }\n 75% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@keyframes flash {\n 0% {\n opacity: 1; }\n 25% {\n opacity: 0; }\n 50% {\n opacity: 1; }\n 75% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@-moz-keyframes bounce {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 40% {\n -webkit-transform: translateY(-30px);\n -moz-transform: translateY(-30px);\n -ms-transform: translateY(-30px);\n -o-transform: translateY(-30px);\n transform: translateY(-30px); }\n 50% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 60% {\n -webkit-transform: translateY(-15px);\n -moz-transform: translateY(-15px);\n -ms-transform: translateY(-15px);\n -o-transform: translateY(-15px);\n transform: translateY(-15px); }\n 80% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-webkit-keyframes bounce {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 40% {\n -webkit-transform: translateY(-30px);\n -moz-transform: translateY(-30px);\n -ms-transform: translateY(-30px);\n -o-transform: translateY(-30px);\n transform: translateY(-30px); }\n 50% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 60% {\n -webkit-transform: translateY(-15px);\n -moz-transform: translateY(-15px);\n -ms-transform: translateY(-15px);\n -o-transform: translateY(-15px);\n transform: translateY(-15px); }\n 80% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-o-keyframes bounce {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 40% {\n -webkit-transform: translateY(-30px);\n -moz-transform: translateY(-30px);\n -ms-transform: translateY(-30px);\n -o-transform: translateY(-30px);\n transform: translateY(-30px); }\n 50% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 60% {\n -webkit-transform: translateY(-15px);\n -moz-transform: translateY(-15px);\n -ms-transform: translateY(-15px);\n -o-transform: translateY(-15px);\n transform: translateY(-15px); }\n 80% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-ms-keyframes bounce {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 40% {\n -webkit-transform: translateY(-30px);\n -moz-transform: translateY(-30px);\n -ms-transform: translateY(-30px);\n -o-transform: translateY(-30px);\n transform: translateY(-30px); }\n 50% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 60% {\n -webkit-transform: translateY(-15px);\n -moz-transform: translateY(-15px);\n -ms-transform: translateY(-15px);\n -o-transform: translateY(-15px);\n transform: translateY(-15px); }\n 80% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@keyframes bounce {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 40% {\n -webkit-transform: translateY(-30px);\n -moz-transform: translateY(-30px);\n -ms-transform: translateY(-30px);\n -o-transform: translateY(-30px);\n transform: translateY(-30px); }\n 50% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 60% {\n -webkit-transform: translateY(-15px);\n -moz-transform: translateY(-15px);\n -ms-transform: translateY(-15px);\n -o-transform: translateY(-15px);\n transform: translateY(-15px); }\n 80% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-moz-keyframes shake {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 10% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 20% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 30% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 40% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 50% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 60% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 70% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 80% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 90% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-webkit-keyframes shake {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 10% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 20% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 30% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 40% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 50% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 60% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 70% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 80% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 90% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-o-keyframes shake {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 10% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 20% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 30% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 40% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 50% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 60% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 70% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 80% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 90% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-ms-keyframes shake {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 10% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 20% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 30% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 40% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 50% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 60% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 70% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 80% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 90% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@keyframes shake {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 10% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 20% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 30% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 40% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 50% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 60% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 70% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 80% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 90% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-moz-keyframes tada {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 10% {\n -webkit-transform: scale(0.9) rotate(-3deg);\n -moz-transform: scale(0.9) rotate(-3deg);\n -ms-transform: scale(0.9) rotate(-3deg);\n -o-transform: scale(0.9) rotate(-3deg);\n transform: scale(0.9) rotate(-3deg); }\n 20% {\n -webkit-transform: scale(0.9) rotate(-3deg);\n -moz-transform: scale(0.9) rotate(-3deg);\n -ms-transform: scale(0.9) rotate(-3deg);\n -o-transform: scale(0.9) rotate(-3deg);\n transform: scale(0.9) rotate(-3deg); }\n 30% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 40% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 50% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 60% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 70% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 80% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 90% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 100% {\n -webkit-transform: scale(1) rotate(0);\n -moz-transform: scale(1) rotate(0);\n -ms-transform: scale(1) rotate(0);\n -o-transform: scale(1) rotate(0);\n transform: scale(1) rotate(0); } }\n\n@-webkit-keyframes tada {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 10% {\n -webkit-transform: scale(0.9) rotate(-3deg);\n -moz-transform: scale(0.9) rotate(-3deg);\n -ms-transform: scale(0.9) rotate(-3deg);\n -o-transform: scale(0.9) rotate(-3deg);\n transform: scale(0.9) rotate(-3deg); }\n 20% {\n -webkit-transform: scale(0.9) rotate(-3deg);\n -moz-transform: scale(0.9) rotate(-3deg);\n -ms-transform: scale(0.9) rotate(-3deg);\n -o-transform: scale(0.9) rotate(-3deg);\n transform: scale(0.9) rotate(-3deg); }\n 30% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 40% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 50% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 60% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 70% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 80% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 90% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 100% {\n -webkit-transform: scale(1) rotate(0);\n -moz-transform: scale(1) rotate(0);\n -ms-transform: scale(1) rotate(0);\n -o-transform: scale(1) rotate(0);\n transform: scale(1) rotate(0); } }\n\n@-o-keyframes tada {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 10% {\n -webkit-transform: scale(0.9) rotate(-3deg);\n -moz-transform: scale(0.9) rotate(-3deg);\n -ms-transform: scale(0.9) rotate(-3deg);\n -o-transform: scale(0.9) rotate(-3deg);\n transform: scale(0.9) rotate(-3deg); }\n 20% {\n -webkit-transform: scale(0.9) rotate(-3deg);\n -moz-transform: scale(0.9) rotate(-3deg);\n -ms-transform: scale(0.9) rotate(-3deg);\n -o-transform: scale(0.9) rotate(-3deg);\n transform: scale(0.9) rotate(-3deg); }\n 30% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 40% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 50% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 60% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 70% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 80% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 90% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 100% {\n -webkit-transform: scale(1) rotate(0);\n -moz-transform: scale(1) rotate(0);\n -ms-transform: scale(1) rotate(0);\n -o-transform: scale(1) rotate(0);\n transform: scale(1) rotate(0); } }\n\n@-ms-keyframes tada {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 10% {\n -webkit-transform: scale(0.9) rotate(-3deg);\n -moz-transform: scale(0.9) rotate(-3deg);\n -ms-transform: scale(0.9) rotate(-3deg);\n -o-transform: scale(0.9) rotate(-3deg);\n transform: scale(0.9) rotate(-3deg); }\n 20% {\n -webkit-transform: scale(0.9) rotate(-3deg);\n -moz-transform: scale(0.9) rotate(-3deg);\n -ms-transform: scale(0.9) rotate(-3deg);\n -o-transform: scale(0.9) rotate(-3deg);\n transform: scale(0.9) rotate(-3deg); }\n 30% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 40% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 50% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 60% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 70% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 80% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 90% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 100% {\n -webkit-transform: scale(1) rotate(0);\n -moz-transform: scale(1) rotate(0);\n -ms-transform: scale(1) rotate(0);\n -o-transform: scale(1) rotate(0);\n transform: scale(1) rotate(0); } }\n\n@keyframes tada {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 10% {\n -webkit-transform: scale(0.9) rotate(-3deg);\n -moz-transform: scale(0.9) rotate(-3deg);\n -ms-transform: scale(0.9) rotate(-3deg);\n -o-transform: scale(0.9) rotate(-3deg);\n transform: scale(0.9) rotate(-3deg); }\n 20% {\n -webkit-transform: scale(0.9) rotate(-3deg);\n -moz-transform: scale(0.9) rotate(-3deg);\n -ms-transform: scale(0.9) rotate(-3deg);\n -o-transform: scale(0.9) rotate(-3deg);\n transform: scale(0.9) rotate(-3deg); }\n 30% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 40% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 50% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 60% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 70% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 80% {\n -webkit-transform: scale(1.1) rotate(-3deg);\n -moz-transform: scale(1.1) rotate(-3deg);\n -ms-transform: scale(1.1) rotate(-3deg);\n -o-transform: scale(1.1) rotate(-3deg);\n transform: scale(1.1) rotate(-3deg); }\n 90% {\n -webkit-transform: scale(1.1) rotate(3deg);\n -moz-transform: scale(1.1) rotate(3deg);\n -ms-transform: scale(1.1) rotate(3deg);\n -o-transform: scale(1.1) rotate(3deg);\n transform: scale(1.1) rotate(3deg); }\n 100% {\n -webkit-transform: scale(1) rotate(0);\n -moz-transform: scale(1) rotate(0);\n -ms-transform: scale(1) rotate(0);\n -o-transform: scale(1) rotate(0);\n transform: scale(1) rotate(0); } }\n\n@-moz-keyframes swing {\n 20%, 40%, 60%, 80%, 100% {\n -webkit-transform-origin: top center 50%;\n -moz-transform-origin: top center 50%;\n -ms-transform-origin: top center 50%;\n -o-transform-origin: top center 50%;\n transform-origin: top center 50%; }\n 20% {\n -webkit-transform: rotate(15deg);\n -moz-transform: rotate(15deg);\n -ms-transform: rotate(15deg);\n -o-transform: rotate(15deg);\n transform: rotate(15deg); }\n 40% {\n -webkit-transform: rotate(-10deg);\n -moz-transform: rotate(-10deg);\n -ms-transform: rotate(-10deg);\n -o-transform: rotate(-10deg);\n transform: rotate(-10deg); }\n 60% {\n -webkit-transform: rotate(5deg);\n -moz-transform: rotate(5deg);\n -ms-transform: rotate(5deg);\n -o-transform: rotate(5deg);\n transform: rotate(5deg); }\n 80% {\n -webkit-transform: rotate(-5deg);\n -moz-transform: rotate(-5deg);\n -ms-transform: rotate(-5deg);\n -o-transform: rotate(-5deg);\n transform: rotate(-5deg); }\n 100% {\n -webkit-transform: rotate(0deg);\n -moz-transform: rotate(0deg);\n -ms-transform: rotate(0deg);\n -o-transform: rotate(0deg);\n transform: rotate(0deg); } }\n\n@-webkit-keyframes swing {\n 20%, 40%, 60%, 80%, 100% {\n -webkit-transform-origin: top center 50%;\n -moz-transform-origin: top center 50%;\n -ms-transform-origin: top center 50%;\n -o-transform-origin: top center 50%;\n transform-origin: top center 50%; }\n 20% {\n -webkit-transform: rotate(15deg);\n -moz-transform: rotate(15deg);\n -ms-transform: rotate(15deg);\n -o-transform: rotate(15deg);\n transform: rotate(15deg); }\n 40% {\n -webkit-transform: rotate(-10deg);\n -moz-transform: rotate(-10deg);\n -ms-transform: rotate(-10deg);\n -o-transform: rotate(-10deg);\n transform: rotate(-10deg); }\n 60% {\n -webkit-transform: rotate(5deg);\n -moz-transform: rotate(5deg);\n -ms-transform: rotate(5deg);\n -o-transform: rotate(5deg);\n transform: rotate(5deg); }\n 80% {\n -webkit-transform: rotate(-5deg);\n -moz-transform: rotate(-5deg);\n -ms-transform: rotate(-5deg);\n -o-transform: rotate(-5deg);\n transform: rotate(-5deg); }\n 100% {\n -webkit-transform: rotate(0deg);\n -moz-transform: rotate(0deg);\n -ms-transform: rotate(0deg);\n -o-transform: rotate(0deg);\n transform: rotate(0deg); } }\n\n@-o-keyframes swing {\n 20%, 40%, 60%, 80%, 100% {\n -webkit-transform-origin: top center 50%;\n -moz-transform-origin: top center 50%;\n -ms-transform-origin: top center 50%;\n -o-transform-origin: top center 50%;\n transform-origin: top center 50%; }\n 20% {\n -webkit-transform: rotate(15deg);\n -moz-transform: rotate(15deg);\n -ms-transform: rotate(15deg);\n -o-transform: rotate(15deg);\n transform: rotate(15deg); }\n 40% {\n -webkit-transform: rotate(-10deg);\n -moz-transform: rotate(-10deg);\n -ms-transform: rotate(-10deg);\n -o-transform: rotate(-10deg);\n transform: rotate(-10deg); }\n 60% {\n -webkit-transform: rotate(5deg);\n -moz-transform: rotate(5deg);\n -ms-transform: rotate(5deg);\n -o-transform: rotate(5deg);\n transform: rotate(5deg); }\n 80% {\n -webkit-transform: rotate(-5deg);\n -moz-transform: rotate(-5deg);\n -ms-transform: rotate(-5deg);\n -o-transform: rotate(-5deg);\n transform: rotate(-5deg); }\n 100% {\n -webkit-transform: rotate(0deg);\n -moz-transform: rotate(0deg);\n -ms-transform: rotate(0deg);\n -o-transform: rotate(0deg);\n transform: rotate(0deg); } }\n\n@-ms-keyframes swing {\n 20%, 40%, 60%, 80%, 100% {\n -webkit-transform-origin: top center 50%;\n -moz-transform-origin: top center 50%;\n -ms-transform-origin: top center 50%;\n -o-transform-origin: top center 50%;\n transform-origin: top center 50%; }\n 20% {\n -webkit-transform: rotate(15deg);\n -moz-transform: rotate(15deg);\n -ms-transform: rotate(15deg);\n -o-transform: rotate(15deg);\n transform: rotate(15deg); }\n 40% {\n -webkit-transform: rotate(-10deg);\n -moz-transform: rotate(-10deg);\n -ms-transform: rotate(-10deg);\n -o-transform: rotate(-10deg);\n transform: rotate(-10deg); }\n 60% {\n -webkit-transform: rotate(5deg);\n -moz-transform: rotate(5deg);\n -ms-transform: rotate(5deg);\n -o-transform: rotate(5deg);\n transform: rotate(5deg); }\n 80% {\n -webkit-transform: rotate(-5deg);\n -moz-transform: rotate(-5deg);\n -ms-transform: rotate(-5deg);\n -o-transform: rotate(-5deg);\n transform: rotate(-5deg); }\n 100% {\n -webkit-transform: rotate(0deg);\n -moz-transform: rotate(0deg);\n -ms-transform: rotate(0deg);\n -o-transform: rotate(0deg);\n transform: rotate(0deg); } }\n\n@keyframes swing {\n 20%, 40%, 60%, 80%, 100% {\n -webkit-transform-origin: top center 50%;\n -moz-transform-origin: top center 50%;\n -ms-transform-origin: top center 50%;\n -o-transform-origin: top center 50%;\n transform-origin: top center 50%; }\n 20% {\n -webkit-transform: rotate(15deg);\n -moz-transform: rotate(15deg);\n -ms-transform: rotate(15deg);\n -o-transform: rotate(15deg);\n transform: rotate(15deg); }\n 40% {\n -webkit-transform: rotate(-10deg);\n -moz-transform: rotate(-10deg);\n -ms-transform: rotate(-10deg);\n -o-transform: rotate(-10deg);\n transform: rotate(-10deg); }\n 60% {\n -webkit-transform: rotate(5deg);\n -moz-transform: rotate(5deg);\n -ms-transform: rotate(5deg);\n -o-transform: rotate(5deg);\n transform: rotate(5deg); }\n 80% {\n -webkit-transform: rotate(-5deg);\n -moz-transform: rotate(-5deg);\n -ms-transform: rotate(-5deg);\n -o-transform: rotate(-5deg);\n transform: rotate(-5deg); }\n 100% {\n -webkit-transform: rotate(0deg);\n -moz-transform: rotate(0deg);\n -ms-transform: rotate(0deg);\n -o-transform: rotate(0deg);\n transform: rotate(0deg); } }\n\n@-moz-keyframes wobble {\n 0% {\n -webkit-transform: translateX(0%);\n -moz-transform: translateX(0%);\n -ms-transform: translateX(0%);\n -o-transform: translateX(0%);\n transform: translateX(0%); }\n 15% {\n -webkit-transform: translateX(-25%) rotate(-5deg);\n -moz-transform: translateX(-25%) rotate(-5deg);\n -ms-transform: translateX(-25%) rotate(-5deg);\n -o-transform: translateX(-25%) rotate(-5deg);\n transform: translateX(-25%) rotate(-5deg); }\n 30% {\n -webkit-transform: translateX(20%) rotate(3deg);\n -moz-transform: translateX(20%) rotate(3deg);\n -ms-transform: translateX(20%) rotate(3deg);\n -o-transform: translateX(20%) rotate(3deg);\n transform: translateX(20%) rotate(3deg); }\n 45% {\n -webkit-transform: translateX(-15%) rotate(-3deg);\n -moz-transform: translateX(-15%) rotate(-3deg);\n -ms-transform: translateX(-15%) rotate(-3deg);\n -o-transform: translateX(-15%) rotate(-3deg);\n transform: translateX(-15%) rotate(-3deg); }\n 60% {\n -webkit-transform: translateX(10%) rotate(2deg);\n -moz-transform: translateX(10%) rotate(2deg);\n -ms-transform: translateX(10%) rotate(2deg);\n -o-transform: translateX(10%) rotate(2deg);\n transform: translateX(10%) rotate(2deg); }\n 75% {\n -webkit-transform: translateX(-5%) rotate(-1deg);\n -moz-transform: translateX(-5%) rotate(-1deg);\n -ms-transform: translateX(-5%) rotate(-1deg);\n -o-transform: translateX(-5%) rotate(-1deg);\n transform: translateX(-5%) rotate(-1deg); }\n 100% {\n -webkit-transform: translateX(0%);\n -moz-transform: translateX(0%);\n -ms-transform: translateX(0%);\n -o-transform: translateX(0%);\n transform: translateX(0%); } }\n\n@-webkit-keyframes wobble {\n 0% {\n -webkit-transform: translateX(0%);\n -moz-transform: translateX(0%);\n -ms-transform: translateX(0%);\n -o-transform: translateX(0%);\n transform: translateX(0%); }\n 15% {\n -webkit-transform: translateX(-25%) rotate(-5deg);\n -moz-transform: translateX(-25%) rotate(-5deg);\n -ms-transform: translateX(-25%) rotate(-5deg);\n -o-transform: translateX(-25%) rotate(-5deg);\n transform: translateX(-25%) rotate(-5deg); }\n 30% {\n -webkit-transform: translateX(20%) rotate(3deg);\n -moz-transform: translateX(20%) rotate(3deg);\n -ms-transform: translateX(20%) rotate(3deg);\n -o-transform: translateX(20%) rotate(3deg);\n transform: translateX(20%) rotate(3deg); }\n 45% {\n -webkit-transform: translateX(-15%) rotate(-3deg);\n -moz-transform: translateX(-15%) rotate(-3deg);\n -ms-transform: translateX(-15%) rotate(-3deg);\n -o-transform: translateX(-15%) rotate(-3deg);\n transform: translateX(-15%) rotate(-3deg); }\n 60% {\n -webkit-transform: translateX(10%) rotate(2deg);\n -moz-transform: translateX(10%) rotate(2deg);\n -ms-transform: translateX(10%) rotate(2deg);\n -o-transform: translateX(10%) rotate(2deg);\n transform: translateX(10%) rotate(2deg); }\n 75% {\n -webkit-transform: translateX(-5%) rotate(-1deg);\n -moz-transform: translateX(-5%) rotate(-1deg);\n -ms-transform: translateX(-5%) rotate(-1deg);\n -o-transform: translateX(-5%) rotate(-1deg);\n transform: translateX(-5%) rotate(-1deg); }\n 100% {\n -webkit-transform: translateX(0%);\n -moz-transform: translateX(0%);\n -ms-transform: translateX(0%);\n -o-transform: translateX(0%);\n transform: translateX(0%); } }\n\n@-o-keyframes wobble {\n 0% {\n -webkit-transform: translateX(0%);\n -moz-transform: translateX(0%);\n -ms-transform: translateX(0%);\n -o-transform: translateX(0%);\n transform: translateX(0%); }\n 15% {\n -webkit-transform: translateX(-25%) rotate(-5deg);\n -moz-transform: translateX(-25%) rotate(-5deg);\n -ms-transform: translateX(-25%) rotate(-5deg);\n -o-transform: translateX(-25%) rotate(-5deg);\n transform: translateX(-25%) rotate(-5deg); }\n 30% {\n -webkit-transform: translateX(20%) rotate(3deg);\n -moz-transform: translateX(20%) rotate(3deg);\n -ms-transform: translateX(20%) rotate(3deg);\n -o-transform: translateX(20%) rotate(3deg);\n transform: translateX(20%) rotate(3deg); }\n 45% {\n -webkit-transform: translateX(-15%) rotate(-3deg);\n -moz-transform: translateX(-15%) rotate(-3deg);\n -ms-transform: translateX(-15%) rotate(-3deg);\n -o-transform: translateX(-15%) rotate(-3deg);\n transform: translateX(-15%) rotate(-3deg); }\n 60% {\n -webkit-transform: translateX(10%) rotate(2deg);\n -moz-transform: translateX(10%) rotate(2deg);\n -ms-transform: translateX(10%) rotate(2deg);\n -o-transform: translateX(10%) rotate(2deg);\n transform: translateX(10%) rotate(2deg); }\n 75% {\n -webkit-transform: translateX(-5%) rotate(-1deg);\n -moz-transform: translateX(-5%) rotate(-1deg);\n -ms-transform: translateX(-5%) rotate(-1deg);\n -o-transform: translateX(-5%) rotate(-1deg);\n transform: translateX(-5%) rotate(-1deg); }\n 100% {\n -webkit-transform: translateX(0%);\n -moz-transform: translateX(0%);\n -ms-transform: translateX(0%);\n -o-transform: translateX(0%);\n transform: translateX(0%); } }\n\n@-ms-keyframes wobble {\n 0% {\n -webkit-transform: translateX(0%);\n -moz-transform: translateX(0%);\n -ms-transform: translateX(0%);\n -o-transform: translateX(0%);\n transform: translateX(0%); }\n 15% {\n -webkit-transform: translateX(-25%) rotate(-5deg);\n -moz-transform: translateX(-25%) rotate(-5deg);\n -ms-transform: translateX(-25%) rotate(-5deg);\n -o-transform: translateX(-25%) rotate(-5deg);\n transform: translateX(-25%) rotate(-5deg); }\n 30% {\n -webkit-transform: translateX(20%) rotate(3deg);\n -moz-transform: translateX(20%) rotate(3deg);\n -ms-transform: translateX(20%) rotate(3deg);\n -o-transform: translateX(20%) rotate(3deg);\n transform: translateX(20%) rotate(3deg); }\n 45% {\n -webkit-transform: translateX(-15%) rotate(-3deg);\n -moz-transform: translateX(-15%) rotate(-3deg);\n -ms-transform: translateX(-15%) rotate(-3deg);\n -o-transform: translateX(-15%) rotate(-3deg);\n transform: translateX(-15%) rotate(-3deg); }\n 60% {\n -webkit-transform: translateX(10%) rotate(2deg);\n -moz-transform: translateX(10%) rotate(2deg);\n -ms-transform: translateX(10%) rotate(2deg);\n -o-transform: translateX(10%) rotate(2deg);\n transform: translateX(10%) rotate(2deg); }\n 75% {\n -webkit-transform: translateX(-5%) rotate(-1deg);\n -moz-transform: translateX(-5%) rotate(-1deg);\n -ms-transform: translateX(-5%) rotate(-1deg);\n -o-transform: translateX(-5%) rotate(-1deg);\n transform: translateX(-5%) rotate(-1deg); }\n 100% {\n -webkit-transform: translateX(0%);\n -moz-transform: translateX(0%);\n -ms-transform: translateX(0%);\n -o-transform: translateX(0%);\n transform: translateX(0%); } }\n\n@keyframes wobble {\n 0% {\n -webkit-transform: translateX(0%);\n -moz-transform: translateX(0%);\n -ms-transform: translateX(0%);\n -o-transform: translateX(0%);\n transform: translateX(0%); }\n 15% {\n -webkit-transform: translateX(-25%) rotate(-5deg);\n -moz-transform: translateX(-25%) rotate(-5deg);\n -ms-transform: translateX(-25%) rotate(-5deg);\n -o-transform: translateX(-25%) rotate(-5deg);\n transform: translateX(-25%) rotate(-5deg); }\n 30% {\n -webkit-transform: translateX(20%) rotate(3deg);\n -moz-transform: translateX(20%) rotate(3deg);\n -ms-transform: translateX(20%) rotate(3deg);\n -o-transform: translateX(20%) rotate(3deg);\n transform: translateX(20%) rotate(3deg); }\n 45% {\n -webkit-transform: translateX(-15%) rotate(-3deg);\n -moz-transform: translateX(-15%) rotate(-3deg);\n -ms-transform: translateX(-15%) rotate(-3deg);\n -o-transform: translateX(-15%) rotate(-3deg);\n transform: translateX(-15%) rotate(-3deg); }\n 60% {\n -webkit-transform: translateX(10%) rotate(2deg);\n -moz-transform: translateX(10%) rotate(2deg);\n -ms-transform: translateX(10%) rotate(2deg);\n -o-transform: translateX(10%) rotate(2deg);\n transform: translateX(10%) rotate(2deg); }\n 75% {\n -webkit-transform: translateX(-5%) rotate(-1deg);\n -moz-transform: translateX(-5%) rotate(-1deg);\n -ms-transform: translateX(-5%) rotate(-1deg);\n -o-transform: translateX(-5%) rotate(-1deg);\n transform: translateX(-5%) rotate(-1deg); }\n 100% {\n -webkit-transform: translateX(0%);\n -moz-transform: translateX(0%);\n -ms-transform: translateX(0%);\n -o-transform: translateX(0%);\n transform: translateX(0%); } }\n\n@-moz-keyframes pulse {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 50% {\n -webkit-transform: scale(1.1, 1.1);\n -moz-transform: scale(1.1, 1.1);\n -ms-transform: scale(1.1, 1.1);\n -o-transform: scale(1.1, 1.1);\n transform: scale(1.1, 1.1); }\n 100% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); } }\n\n@-webkit-keyframes pulse {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 50% {\n -webkit-transform: scale(1.1, 1.1);\n -moz-transform: scale(1.1, 1.1);\n -ms-transform: scale(1.1, 1.1);\n -o-transform: scale(1.1, 1.1);\n transform: scale(1.1, 1.1); }\n 100% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); } }\n\n@-o-keyframes pulse {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 50% {\n -webkit-transform: scale(1.1, 1.1);\n -moz-transform: scale(1.1, 1.1);\n -ms-transform: scale(1.1, 1.1);\n -o-transform: scale(1.1, 1.1);\n transform: scale(1.1, 1.1); }\n 100% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); } }\n\n@-ms-keyframes pulse {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 50% {\n -webkit-transform: scale(1.1, 1.1);\n -moz-transform: scale(1.1, 1.1);\n -ms-transform: scale(1.1, 1.1);\n -o-transform: scale(1.1, 1.1);\n transform: scale(1.1, 1.1); }\n 100% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); } }\n\n@keyframes pulse {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 50% {\n -webkit-transform: scale(1.1, 1.1);\n -moz-transform: scale(1.1, 1.1);\n -ms-transform: scale(1.1, 1.1);\n -o-transform: scale(1.1, 1.1);\n transform: scale(1.1, 1.1); }\n 100% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); } }\n\n@-moz-keyframes wiggle {\n 0% {\n -webkit-transform: skewX(9deg);\n -moz-transform: skewX(9deg);\n -ms-transform: skewX(9deg);\n -o-transform: skewX(9deg);\n transform: skewX(9deg); }\n 10% {\n -webkit-transform: skewX(-8deg);\n -moz-transform: skewX(-8deg);\n -ms-transform: skewX(-8deg);\n -o-transform: skewX(-8deg);\n transform: skewX(-8deg); }\n 20% {\n -webkit-transform: skewX(7deg);\n -moz-transform: skewX(7deg);\n -ms-transform: skewX(7deg);\n -o-transform: skewX(7deg);\n transform: skewX(7deg); }\n 30% {\n -webkit-transform: skewX(-6deg);\n -moz-transform: skewX(-6deg);\n -ms-transform: skewX(-6deg);\n -o-transform: skewX(-6deg);\n transform: skewX(-6deg); }\n 40% {\n -webkit-transform: skewX(5deg);\n -moz-transform: skewX(5deg);\n -ms-transform: skewX(5deg);\n -o-transform: skewX(5deg);\n transform: skewX(5deg); }\n 50% {\n -webkit-transform: skewX(-4deg);\n -moz-transform: skewX(-4deg);\n -ms-transform: skewX(-4deg);\n -o-transform: skewX(-4deg);\n transform: skewX(-4deg); }\n 60% {\n -webkit-transform: skewX(3deg);\n -moz-transform: skewX(3deg);\n -ms-transform: skewX(3deg);\n -o-transform: skewX(3deg);\n transform: skewX(3deg); }\n 70% {\n -webkit-transform: skewX(-2deg);\n -moz-transform: skewX(-2deg);\n -ms-transform: skewX(-2deg);\n -o-transform: skewX(-2deg);\n transform: skewX(-2deg); }\n 80% {\n -webkit-transform: skewX(1deg);\n -moz-transform: skewX(1deg);\n -ms-transform: skewX(1deg);\n -o-transform: skewX(1deg);\n transform: skewX(1deg); }\n 90% {\n -webkit-transform: skewX(0deg);\n -moz-transform: skewX(0deg);\n -ms-transform: skewX(0deg);\n -o-transform: skewX(0deg);\n transform: skewX(0deg); }\n 100% {\n -webkit-transform: skewX(0deg);\n -moz-transform: skewX(0deg);\n -ms-transform: skewX(0deg);\n -o-transform: skewX(0deg);\n transform: skewX(0deg); } }\n\n@-webkit-keyframes wiggle {\n 0% {\n -webkit-transform: skewX(9deg);\n -moz-transform: skewX(9deg);\n -ms-transform: skewX(9deg);\n -o-transform: skewX(9deg);\n transform: skewX(9deg); }\n 10% {\n -webkit-transform: skewX(-8deg);\n -moz-transform: skewX(-8deg);\n -ms-transform: skewX(-8deg);\n -o-transform: skewX(-8deg);\n transform: skewX(-8deg); }\n 20% {\n -webkit-transform: skewX(7deg);\n -moz-transform: skewX(7deg);\n -ms-transform: skewX(7deg);\n -o-transform: skewX(7deg);\n transform: skewX(7deg); }\n 30% {\n -webkit-transform: skewX(-6deg);\n -moz-transform: skewX(-6deg);\n -ms-transform: skewX(-6deg);\n -o-transform: skewX(-6deg);\n transform: skewX(-6deg); }\n 40% {\n -webkit-transform: skewX(5deg);\n -moz-transform: skewX(5deg);\n -ms-transform: skewX(5deg);\n -o-transform: skewX(5deg);\n transform: skewX(5deg); }\n 50% {\n -webkit-transform: skewX(-4deg);\n -moz-transform: skewX(-4deg);\n -ms-transform: skewX(-4deg);\n -o-transform: skewX(-4deg);\n transform: skewX(-4deg); }\n 60% {\n -webkit-transform: skewX(3deg);\n -moz-transform: skewX(3deg);\n -ms-transform: skewX(3deg);\n -o-transform: skewX(3deg);\n transform: skewX(3deg); }\n 70% {\n -webkit-transform: skewX(-2deg);\n -moz-transform: skewX(-2deg);\n -ms-transform: skewX(-2deg);\n -o-transform: skewX(-2deg);\n transform: skewX(-2deg); }\n 80% {\n -webkit-transform: skewX(1deg);\n -moz-transform: skewX(1deg);\n -ms-transform: skewX(1deg);\n -o-transform: skewX(1deg);\n transform: skewX(1deg); }\n 90% {\n -webkit-transform: skewX(0deg);\n -moz-transform: skewX(0deg);\n -ms-transform: skewX(0deg);\n -o-transform: skewX(0deg);\n transform: skewX(0deg); }\n 100% {\n -webkit-transform: skewX(0deg);\n -moz-transform: skewX(0deg);\n -ms-transform: skewX(0deg);\n -o-transform: skewX(0deg);\n transform: skewX(0deg); } }\n\n@-o-keyframes wiggle {\n 0% {\n -webkit-transform: skewX(9deg);\n -moz-transform: skewX(9deg);\n -ms-transform: skewX(9deg);\n -o-transform: skewX(9deg);\n transform: skewX(9deg); }\n 10% {\n -webkit-transform: skewX(-8deg);\n -moz-transform: skewX(-8deg);\n -ms-transform: skewX(-8deg);\n -o-transform: skewX(-8deg);\n transform: skewX(-8deg); }\n 20% {\n -webkit-transform: skewX(7deg);\n -moz-transform: skewX(7deg);\n -ms-transform: skewX(7deg);\n -o-transform: skewX(7deg);\n transform: skewX(7deg); }\n 30% {\n -webkit-transform: skewX(-6deg);\n -moz-transform: skewX(-6deg);\n -ms-transform: skewX(-6deg);\n -o-transform: skewX(-6deg);\n transform: skewX(-6deg); }\n 40% {\n -webkit-transform: skewX(5deg);\n -moz-transform: skewX(5deg);\n -ms-transform: skewX(5deg);\n -o-transform: skewX(5deg);\n transform: skewX(5deg); }\n 50% {\n -webkit-transform: skewX(-4deg);\n -moz-transform: skewX(-4deg);\n -ms-transform: skewX(-4deg);\n -o-transform: skewX(-4deg);\n transform: skewX(-4deg); }\n 60% {\n -webkit-transform: skewX(3deg);\n -moz-transform: skewX(3deg);\n -ms-transform: skewX(3deg);\n -o-transform: skewX(3deg);\n transform: skewX(3deg); }\n 70% {\n -webkit-transform: skewX(-2deg);\n -moz-transform: skewX(-2deg);\n -ms-transform: skewX(-2deg);\n -o-transform: skewX(-2deg);\n transform: skewX(-2deg); }\n 80% {\n -webkit-transform: skewX(1deg);\n -moz-transform: skewX(1deg);\n -ms-transform: skewX(1deg);\n -o-transform: skewX(1deg);\n transform: skewX(1deg); }\n 90% {\n -webkit-transform: skewX(0deg);\n -moz-transform: skewX(0deg);\n -ms-transform: skewX(0deg);\n -o-transform: skewX(0deg);\n transform: skewX(0deg); }\n 100% {\n -webkit-transform: skewX(0deg);\n -moz-transform: skewX(0deg);\n -ms-transform: skewX(0deg);\n -o-transform: skewX(0deg);\n transform: skewX(0deg); } }\n\n@-ms-keyframes wiggle {\n 0% {\n -webkit-transform: skewX(9deg);\n -moz-transform: skewX(9deg);\n -ms-transform: skewX(9deg);\n -o-transform: skewX(9deg);\n transform: skewX(9deg); }\n 10% {\n -webkit-transform: skewX(-8deg);\n -moz-transform: skewX(-8deg);\n -ms-transform: skewX(-8deg);\n -o-transform: skewX(-8deg);\n transform: skewX(-8deg); }\n 20% {\n -webkit-transform: skewX(7deg);\n -moz-transform: skewX(7deg);\n -ms-transform: skewX(7deg);\n -o-transform: skewX(7deg);\n transform: skewX(7deg); }\n 30% {\n -webkit-transform: skewX(-6deg);\n -moz-transform: skewX(-6deg);\n -ms-transform: skewX(-6deg);\n -o-transform: skewX(-6deg);\n transform: skewX(-6deg); }\n 40% {\n -webkit-transform: skewX(5deg);\n -moz-transform: skewX(5deg);\n -ms-transform: skewX(5deg);\n -o-transform: skewX(5deg);\n transform: skewX(5deg); }\n 50% {\n -webkit-transform: skewX(-4deg);\n -moz-transform: skewX(-4deg);\n -ms-transform: skewX(-4deg);\n -o-transform: skewX(-4deg);\n transform: skewX(-4deg); }\n 60% {\n -webkit-transform: skewX(3deg);\n -moz-transform: skewX(3deg);\n -ms-transform: skewX(3deg);\n -o-transform: skewX(3deg);\n transform: skewX(3deg); }\n 70% {\n -webkit-transform: skewX(-2deg);\n -moz-transform: skewX(-2deg);\n -ms-transform: skewX(-2deg);\n -o-transform: skewX(-2deg);\n transform: skewX(-2deg); }\n 80% {\n -webkit-transform: skewX(1deg);\n -moz-transform: skewX(1deg);\n -ms-transform: skewX(1deg);\n -o-transform: skewX(1deg);\n transform: skewX(1deg); }\n 90% {\n -webkit-transform: skewX(0deg);\n -moz-transform: skewX(0deg);\n -ms-transform: skewX(0deg);\n -o-transform: skewX(0deg);\n transform: skewX(0deg); }\n 100% {\n -webkit-transform: skewX(0deg);\n -moz-transform: skewX(0deg);\n -ms-transform: skewX(0deg);\n -o-transform: skewX(0deg);\n transform: skewX(0deg); } }\n\n@keyframes wiggle {\n 0% {\n -webkit-transform: skewX(9deg);\n -moz-transform: skewX(9deg);\n -ms-transform: skewX(9deg);\n -o-transform: skewX(9deg);\n transform: skewX(9deg); }\n 10% {\n -webkit-transform: skewX(-8deg);\n -moz-transform: skewX(-8deg);\n -ms-transform: skewX(-8deg);\n -o-transform: skewX(-8deg);\n transform: skewX(-8deg); }\n 20% {\n -webkit-transform: skewX(7deg);\n -moz-transform: skewX(7deg);\n -ms-transform: skewX(7deg);\n -o-transform: skewX(7deg);\n transform: skewX(7deg); }\n 30% {\n -webkit-transform: skewX(-6deg);\n -moz-transform: skewX(-6deg);\n -ms-transform: skewX(-6deg);\n -o-transform: skewX(-6deg);\n transform: skewX(-6deg); }\n 40% {\n -webkit-transform: skewX(5deg);\n -moz-transform: skewX(5deg);\n -ms-transform: skewX(5deg);\n -o-transform: skewX(5deg);\n transform: skewX(5deg); }\n 50% {\n -webkit-transform: skewX(-4deg);\n -moz-transform: skewX(-4deg);\n -ms-transform: skewX(-4deg);\n -o-transform: skewX(-4deg);\n transform: skewX(-4deg); }\n 60% {\n -webkit-transform: skewX(3deg);\n -moz-transform: skewX(3deg);\n -ms-transform: skewX(3deg);\n -o-transform: skewX(3deg);\n transform: skewX(3deg); }\n 70% {\n -webkit-transform: skewX(-2deg);\n -moz-transform: skewX(-2deg);\n -ms-transform: skewX(-2deg);\n -o-transform: skewX(-2deg);\n transform: skewX(-2deg); }\n 80% {\n -webkit-transform: skewX(1deg);\n -moz-transform: skewX(1deg);\n -ms-transform: skewX(1deg);\n -o-transform: skewX(1deg);\n transform: skewX(1deg); }\n 90% {\n -webkit-transform: skewX(0deg);\n -moz-transform: skewX(0deg);\n -ms-transform: skewX(0deg);\n -o-transform: skewX(0deg);\n transform: skewX(0deg); }\n 100% {\n -webkit-transform: skewX(0deg);\n -moz-transform: skewX(0deg);\n -ms-transform: skewX(0deg);\n -o-transform: skewX(0deg);\n transform: skewX(0deg); } }\n\n@-moz-keyframes bounceOut {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 25% {\n -webkit-transform: scale(0.95, 0.95);\n -moz-transform: scale(0.95, 0.95);\n -ms-transform: scale(0.95, 0.95);\n -o-transform: scale(0.95, 0.95);\n transform: scale(0.95, 0.95); }\n 50% {\n opacity: 1;\n -webkit-transform: scale(1.1, 1.1);\n -moz-transform: scale(1.1, 1.1);\n -ms-transform: scale(1.1, 1.1);\n -o-transform: scale(1.1, 1.1);\n transform: scale(1.1, 1.1); }\n 100% {\n opacity: 0;\n -webkit-transform: scale(0.3, 0.3);\n -moz-transform: scale(0.3, 0.3);\n -ms-transform: scale(0.3, 0.3);\n -o-transform: scale(0.3, 0.3);\n transform: scale(0.3, 0.3); } }\n\n@-webkit-keyframes bounceOut {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 25% {\n -webkit-transform: scale(0.95, 0.95);\n -moz-transform: scale(0.95, 0.95);\n -ms-transform: scale(0.95, 0.95);\n -o-transform: scale(0.95, 0.95);\n transform: scale(0.95, 0.95); }\n 50% {\n opacity: 1;\n -webkit-transform: scale(1.1, 1.1);\n -moz-transform: scale(1.1, 1.1);\n -ms-transform: scale(1.1, 1.1);\n -o-transform: scale(1.1, 1.1);\n transform: scale(1.1, 1.1); }\n 100% {\n opacity: 0;\n -webkit-transform: scale(0.3, 0.3);\n -moz-transform: scale(0.3, 0.3);\n -ms-transform: scale(0.3, 0.3);\n -o-transform: scale(0.3, 0.3);\n transform: scale(0.3, 0.3); } }\n\n@-o-keyframes bounceOut {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 25% {\n -webkit-transform: scale(0.95, 0.95);\n -moz-transform: scale(0.95, 0.95);\n -ms-transform: scale(0.95, 0.95);\n -o-transform: scale(0.95, 0.95);\n transform: scale(0.95, 0.95); }\n 50% {\n opacity: 1;\n -webkit-transform: scale(1.1, 1.1);\n -moz-transform: scale(1.1, 1.1);\n -ms-transform: scale(1.1, 1.1);\n -o-transform: scale(1.1, 1.1);\n transform: scale(1.1, 1.1); }\n 100% {\n opacity: 0;\n -webkit-transform: scale(0.3, 0.3);\n -moz-transform: scale(0.3, 0.3);\n -ms-transform: scale(0.3, 0.3);\n -o-transform: scale(0.3, 0.3);\n transform: scale(0.3, 0.3); } }\n\n@-ms-keyframes bounceOut {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 25% {\n -webkit-transform: scale(0.95, 0.95);\n -moz-transform: scale(0.95, 0.95);\n -ms-transform: scale(0.95, 0.95);\n -o-transform: scale(0.95, 0.95);\n transform: scale(0.95, 0.95); }\n 50% {\n opacity: 1;\n -webkit-transform: scale(1.1, 1.1);\n -moz-transform: scale(1.1, 1.1);\n -ms-transform: scale(1.1, 1.1);\n -o-transform: scale(1.1, 1.1);\n transform: scale(1.1, 1.1); }\n 100% {\n opacity: 0;\n -webkit-transform: scale(0.3, 0.3);\n -moz-transform: scale(0.3, 0.3);\n -ms-transform: scale(0.3, 0.3);\n -o-transform: scale(0.3, 0.3);\n transform: scale(0.3, 0.3); } }\n\n@keyframes bounceOut {\n 0% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); }\n 25% {\n -webkit-transform: scale(0.95, 0.95);\n -moz-transform: scale(0.95, 0.95);\n -ms-transform: scale(0.95, 0.95);\n -o-transform: scale(0.95, 0.95);\n transform: scale(0.95, 0.95); }\n 50% {\n opacity: 1;\n -webkit-transform: scale(1.1, 1.1);\n -moz-transform: scale(1.1, 1.1);\n -ms-transform: scale(1.1, 1.1);\n -o-transform: scale(1.1, 1.1);\n transform: scale(1.1, 1.1); }\n 100% {\n opacity: 0;\n -webkit-transform: scale(0.3, 0.3);\n -moz-transform: scale(0.3, 0.3);\n -ms-transform: scale(0.3, 0.3);\n -o-transform: scale(0.3, 0.3);\n transform: scale(0.3, 0.3); } }\n\n@-moz-keyframes bounceOutUp {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); } }\n\n@-webkit-keyframes bounceOutUp {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); } }\n\n@-o-keyframes bounceOutUp {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); } }\n\n@-ms-keyframes bounceOutUp {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); } }\n\n@keyframes bounceOutUp {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); } }\n\n@-moz-keyframes bounceOutDown {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); } }\n\n@-webkit-keyframes bounceOutDown {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); } }\n\n@-o-keyframes bounceOutDown {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); } }\n\n@-ms-keyframes bounceOutDown {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); } }\n\n@keyframes bounceOutDown {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); } }\n\n@-moz-keyframes bounceOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); } }\n\n@-webkit-keyframes bounceOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); } }\n\n@-o-keyframes bounceOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); } }\n\n@-ms-keyframes bounceOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); } }\n\n@keyframes bounceOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); } }\n\n@-moz-keyframes bounceOutRight {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); } }\n\n@-webkit-keyframes bounceOutRight {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); } }\n\n@-o-keyframes bounceOutRight {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); } }\n\n@-ms-keyframes bounceOutRight {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); } }\n\n@keyframes bounceOutRight {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 20% {\n opacity: 1;\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); } }\n\n@-moz-keyframes bounceIn {\n 0% {\n opacity: 0;\n -webkit-transform: scale(0.3, 0.3);\n -moz-transform: scale(0.3, 0.3);\n -ms-transform: scale(0.3, 0.3);\n -o-transform: scale(0.3, 0.3);\n transform: scale(0.3, 0.3); }\n 50% {\n opacity: 1;\n -webkit-transform: scale(1.05, 1.05);\n -moz-transform: scale(1.05, 1.05);\n -ms-transform: scale(1.05, 1.05);\n -o-transform: scale(1.05, 1.05);\n transform: scale(1.05, 1.05); }\n 70% {\n -webkit-transform: scale(0.9, 0.9);\n -moz-transform: scale(0.9, 0.9);\n -ms-transform: scale(0.9, 0.9);\n -o-transform: scale(0.9, 0.9);\n transform: scale(0.9, 0.9); }\n 100% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); } }\n\n@-webkit-keyframes bounceIn {\n 0% {\n opacity: 0;\n -webkit-transform: scale(0.3, 0.3);\n -moz-transform: scale(0.3, 0.3);\n -ms-transform: scale(0.3, 0.3);\n -o-transform: scale(0.3, 0.3);\n transform: scale(0.3, 0.3); }\n 50% {\n opacity: 1;\n -webkit-transform: scale(1.05, 1.05);\n -moz-transform: scale(1.05, 1.05);\n -ms-transform: scale(1.05, 1.05);\n -o-transform: scale(1.05, 1.05);\n transform: scale(1.05, 1.05); }\n 70% {\n -webkit-transform: scale(0.9, 0.9);\n -moz-transform: scale(0.9, 0.9);\n -ms-transform: scale(0.9, 0.9);\n -o-transform: scale(0.9, 0.9);\n transform: scale(0.9, 0.9); }\n 100% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); } }\n\n@-o-keyframes bounceIn {\n 0% {\n opacity: 0;\n -webkit-transform: scale(0.3, 0.3);\n -moz-transform: scale(0.3, 0.3);\n -ms-transform: scale(0.3, 0.3);\n -o-transform: scale(0.3, 0.3);\n transform: scale(0.3, 0.3); }\n 50% {\n opacity: 1;\n -webkit-transform: scale(1.05, 1.05);\n -moz-transform: scale(1.05, 1.05);\n -ms-transform: scale(1.05, 1.05);\n -o-transform: scale(1.05, 1.05);\n transform: scale(1.05, 1.05); }\n 70% {\n -webkit-transform: scale(0.9, 0.9);\n -moz-transform: scale(0.9, 0.9);\n -ms-transform: scale(0.9, 0.9);\n -o-transform: scale(0.9, 0.9);\n transform: scale(0.9, 0.9); }\n 100% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); } }\n\n@-ms-keyframes bounceIn {\n 0% {\n opacity: 0;\n -webkit-transform: scale(0.3, 0.3);\n -moz-transform: scale(0.3, 0.3);\n -ms-transform: scale(0.3, 0.3);\n -o-transform: scale(0.3, 0.3);\n transform: scale(0.3, 0.3); }\n 50% {\n opacity: 1;\n -webkit-transform: scale(1.05, 1.05);\n -moz-transform: scale(1.05, 1.05);\n -ms-transform: scale(1.05, 1.05);\n -o-transform: scale(1.05, 1.05);\n transform: scale(1.05, 1.05); }\n 70% {\n -webkit-transform: scale(0.9, 0.9);\n -moz-transform: scale(0.9, 0.9);\n -ms-transform: scale(0.9, 0.9);\n -o-transform: scale(0.9, 0.9);\n transform: scale(0.9, 0.9); }\n 100% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); } }\n\n@keyframes bounceIn {\n 0% {\n opacity: 0;\n -webkit-transform: scale(0.3, 0.3);\n -moz-transform: scale(0.3, 0.3);\n -ms-transform: scale(0.3, 0.3);\n -o-transform: scale(0.3, 0.3);\n transform: scale(0.3, 0.3); }\n 50% {\n opacity: 1;\n -webkit-transform: scale(1.05, 1.05);\n -moz-transform: scale(1.05, 1.05);\n -ms-transform: scale(1.05, 1.05);\n -o-transform: scale(1.05, 1.05);\n transform: scale(1.05, 1.05); }\n 70% {\n -webkit-transform: scale(0.9, 0.9);\n -moz-transform: scale(0.9, 0.9);\n -ms-transform: scale(0.9, 0.9);\n -o-transform: scale(0.9, 0.9);\n transform: scale(0.9, 0.9); }\n 100% {\n -webkit-transform: scale(1, 1);\n -moz-transform: scale(1, 1);\n -ms-transform: scale(1, 1);\n -o-transform: scale(1, 1);\n transform: scale(1, 1); } }\n\n@-moz-keyframes bounceInDown {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateY(30px);\n -moz-transform: translateY(30px);\n -ms-transform: translateY(30px);\n -o-transform: translateY(30px);\n transform: translateY(30px); }\n 80% {\n -webkit-transform: translateY(-10px);\n -moz-transform: translateY(-10px);\n -ms-transform: translateY(-10px);\n -o-transform: translateY(-10px);\n transform: translateY(-10px); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-webkit-keyframes bounceInDown {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateY(30px);\n -moz-transform: translateY(30px);\n -ms-transform: translateY(30px);\n -o-transform: translateY(30px);\n transform: translateY(30px); }\n 80% {\n -webkit-transform: translateY(-10px);\n -moz-transform: translateY(-10px);\n -ms-transform: translateY(-10px);\n -o-transform: translateY(-10px);\n transform: translateY(-10px); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-o-keyframes bounceInDown {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateY(30px);\n -moz-transform: translateY(30px);\n -ms-transform: translateY(30px);\n -o-transform: translateY(30px);\n transform: translateY(30px); }\n 80% {\n -webkit-transform: translateY(-10px);\n -moz-transform: translateY(-10px);\n -ms-transform: translateY(-10px);\n -o-transform: translateY(-10px);\n transform: translateY(-10px); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-ms-keyframes bounceInDown {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateY(30px);\n -moz-transform: translateY(30px);\n -ms-transform: translateY(30px);\n -o-transform: translateY(30px);\n transform: translateY(30px); }\n 80% {\n -webkit-transform: translateY(-10px);\n -moz-transform: translateY(-10px);\n -ms-transform: translateY(-10px);\n -o-transform: translateY(-10px);\n transform: translateY(-10px); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@keyframes bounceInDown {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateY(30px);\n -moz-transform: translateY(30px);\n -ms-transform: translateY(30px);\n -o-transform: translateY(30px);\n transform: translateY(30px); }\n 80% {\n -webkit-transform: translateY(-10px);\n -moz-transform: translateY(-10px);\n -ms-transform: translateY(-10px);\n -o-transform: translateY(-10px);\n transform: translateY(-10px); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-moz-keyframes bounceInUp {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateY(-30px);\n -moz-transform: translateY(-30px);\n -ms-transform: translateY(-30px);\n -o-transform: translateY(-30px);\n transform: translateY(-30px); }\n 80% {\n -webkit-transform: translateY(10px);\n -moz-transform: translateY(10px);\n -ms-transform: translateY(10px);\n -o-transform: translateY(10px);\n transform: translateY(10px); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-webkit-keyframes bounceInUp {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateY(-30px);\n -moz-transform: translateY(-30px);\n -ms-transform: translateY(-30px);\n -o-transform: translateY(-30px);\n transform: translateY(-30px); }\n 80% {\n -webkit-transform: translateY(10px);\n -moz-transform: translateY(10px);\n -ms-transform: translateY(10px);\n -o-transform: translateY(10px);\n transform: translateY(10px); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-o-keyframes bounceInUp {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateY(-30px);\n -moz-transform: translateY(-30px);\n -ms-transform: translateY(-30px);\n -o-transform: translateY(-30px);\n transform: translateY(-30px); }\n 80% {\n -webkit-transform: translateY(10px);\n -moz-transform: translateY(10px);\n -ms-transform: translateY(10px);\n -o-transform: translateY(10px);\n transform: translateY(10px); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-ms-keyframes bounceInUp {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateY(-30px);\n -moz-transform: translateY(-30px);\n -ms-transform: translateY(-30px);\n -o-transform: translateY(-30px);\n transform: translateY(-30px); }\n 80% {\n -webkit-transform: translateY(10px);\n -moz-transform: translateY(10px);\n -ms-transform: translateY(10px);\n -o-transform: translateY(10px);\n transform: translateY(10px); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@keyframes bounceInUp {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateY(-30px);\n -moz-transform: translateY(-30px);\n -ms-transform: translateY(-30px);\n -o-transform: translateY(-30px);\n transform: translateY(-30px); }\n 80% {\n -webkit-transform: translateY(10px);\n -moz-transform: translateY(10px);\n -ms-transform: translateY(10px);\n -o-transform: translateY(10px);\n transform: translateY(10px); }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-moz-keyframes bounceInRight {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateX(-30px);\n -moz-transform: translateX(-30px);\n -ms-transform: translateX(-30px);\n -o-transform: translateX(-30px);\n transform: translateX(-30px); }\n 80% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-webkit-keyframes bounceInRight {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateX(-30px);\n -moz-transform: translateX(-30px);\n -ms-transform: translateX(-30px);\n -o-transform: translateX(-30px);\n transform: translateX(-30px); }\n 80% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-o-keyframes bounceInRight {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateX(-30px);\n -moz-transform: translateX(-30px);\n -ms-transform: translateX(-30px);\n -o-transform: translateX(-30px);\n transform: translateX(-30px); }\n 80% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-ms-keyframes bounceInRight {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateX(-30px);\n -moz-transform: translateX(-30px);\n -ms-transform: translateX(-30px);\n -o-transform: translateX(-30px);\n transform: translateX(-30px); }\n 80% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@keyframes bounceInRight {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateX(-30px);\n -moz-transform: translateX(-30px);\n -ms-transform: translateX(-30px);\n -o-transform: translateX(-30px);\n transform: translateX(-30px); }\n 80% {\n -webkit-transform: translateX(10px);\n -moz-transform: translateX(10px);\n -ms-transform: translateX(10px);\n -o-transform: translateX(10px);\n transform: translateX(10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-moz-keyframes bounceInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateX(30px);\n -moz-transform: translateX(30px);\n -ms-transform: translateX(30px);\n -o-transform: translateX(30px);\n transform: translateX(30px); }\n 80% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-webkit-keyframes bounceInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateX(30px);\n -moz-transform: translateX(30px);\n -ms-transform: translateX(30px);\n -o-transform: translateX(30px);\n transform: translateX(30px); }\n 80% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-o-keyframes bounceInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateX(30px);\n -moz-transform: translateX(30px);\n -ms-transform: translateX(30px);\n -o-transform: translateX(30px);\n transform: translateX(30px); }\n 80% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-ms-keyframes bounceInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateX(30px);\n -moz-transform: translateX(30px);\n -ms-transform: translateX(30px);\n -o-transform: translateX(30px);\n transform: translateX(30px); }\n 80% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@keyframes bounceInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); }\n 60% {\n opacity: 1;\n -webkit-transform: translateX(30px);\n -moz-transform: translateX(30px);\n -ms-transform: translateX(30px);\n -o-transform: translateX(30px);\n transform: translateX(30px); }\n 80% {\n -webkit-transform: translateX(-10px);\n -moz-transform: translateX(-10px);\n -ms-transform: translateX(-10px);\n -o-transform: translateX(-10px);\n transform: translateX(-10px); }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-moz-keyframes fadeOut {\n 0% {\n opacity: 1; }\n 100% {\n opacity: 0; } }\n\n@-webkit-keyframes fadeOut {\n 0% {\n opacity: 1; }\n 100% {\n opacity: 0; } }\n\n@-o-keyframes fadeOut {\n 0% {\n opacity: 1; }\n 100% {\n opacity: 0; } }\n\n@-ms-keyframes fadeOut {\n 0% {\n opacity: 1; }\n 100% {\n opacity: 0; } }\n\n@keyframes fadeOut {\n 0% {\n opacity: 1; }\n 100% {\n opacity: 0; } }\n\n@-moz-keyframes fadeOutUp {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px);\n opacity: 0; } }\n\n@-webkit-keyframes fadeOutUp {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px);\n opacity: 0; } }\n\n@-o-keyframes fadeOutUp {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px);\n opacity: 0; } }\n\n@-ms-keyframes fadeOutUp {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px);\n opacity: 0; } }\n\n@keyframes fadeOutUp {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px);\n opacity: 0; } }\n\n@-moz-keyframes fadeOutDown {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px);\n opacity: 0; } }\n\n@-webkit-keyframes fadeOutDown {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px);\n opacity: 0; } }\n\n@-o-keyframes fadeOutDown {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px);\n opacity: 0; } }\n\n@-ms-keyframes fadeOutDown {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px);\n opacity: 0; } }\n\n@keyframes fadeOutDown {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px);\n opacity: 0; } }\n\n@-moz-keyframes fadeOutRight {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px);\n opacity: 0; } }\n\n@-webkit-keyframes fadeOutRight {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px);\n opacity: 0; } }\n\n@-o-keyframes fadeOutRight {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px);\n opacity: 0; } }\n\n@-ms-keyframes fadeOutRight {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px);\n opacity: 0; } }\n\n@keyframes fadeOutRight {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px);\n opacity: 0; } }\n\n@-moz-keyframes fadeOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px);\n opacity: 0; } }\n\n@-webkit-keyframes fadeOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px);\n opacity: 0; } }\n\n@-o-keyframes fadeOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px);\n opacity: 0; } }\n\n@-ms-keyframes fadeOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px);\n opacity: 0; } }\n\n@keyframes fadeOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px);\n opacity: 0; } }\n\n@-moz-keyframes fadeOutUpBig {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px);\n opacity: 0; } }\n\n@-webkit-keyframes fadeOutUpBig {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px);\n opacity: 0; } }\n\n@-o-keyframes fadeOutUpBig {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px);\n opacity: 0; } }\n\n@-ms-keyframes fadeOutUpBig {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px);\n opacity: 0; } }\n\n@keyframes fadeOutUpBig {\n 0% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; }\n 100% {\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px);\n opacity: 0; } }\n\n@-moz-keyframes fadeOutDownBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); } }\n\n@-webkit-keyframes fadeOutDownBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); } }\n\n@-o-keyframes fadeOutDownBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); } }\n\n@-ms-keyframes fadeOutDownBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); } }\n\n@keyframes fadeOutDownBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px); } }\n\n@-moz-keyframes fadeOutRightBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); } }\n\n@-webkit-keyframes fadeOutRightBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); } }\n\n@-o-keyframes fadeOutRightBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); } }\n\n@-ms-keyframes fadeOutRightBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); } }\n\n@keyframes fadeOutRightBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); } }\n\n@-moz-keyframes fadeOutLeftBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); } }\n\n@-webkit-keyframes fadeOutLeftBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); } }\n\n@-o-keyframes fadeOutLeftBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); } }\n\n@-ms-keyframes fadeOutLeftBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); } }\n\n@keyframes fadeOutLeftBig {\n 0% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); }\n 100% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); } }\n\n@-moz-keyframes fadeIn {\n 0% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@-webkit-keyframes fadeIn {\n 0% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@-o-keyframes fadeIn {\n 0% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@-ms-keyframes fadeIn {\n 0% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@keyframes fadeIn {\n 0% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@-moz-keyframes fadeInUp {\n 0% {\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-webkit-keyframes fadeInUp {\n 0% {\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-o-keyframes fadeInUp {\n 0% {\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-ms-keyframes fadeInUp {\n 0% {\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@keyframes fadeInUp {\n 0% {\n -webkit-transform: translateY(20px);\n -moz-transform: translateY(20px);\n -ms-transform: translateY(20px);\n -o-transform: translateY(20px);\n transform: translateY(20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-moz-keyframes fadeInDown {\n 0% {\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-webkit-keyframes fadeInDown {\n 0% {\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-o-keyframes fadeInDown {\n 0% {\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-ms-keyframes fadeInDown {\n 0% {\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@keyframes fadeInDown {\n 0% {\n -webkit-transform: translateY(-20px);\n -moz-transform: translateY(-20px);\n -ms-transform: translateY(-20px);\n -o-transform: translateY(-20px);\n transform: translateY(-20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-moz-keyframes fadeInRight {\n 0% {\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; } }\n\n@-webkit-keyframes fadeInRight {\n 0% {\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; } }\n\n@-o-keyframes fadeInRight {\n 0% {\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; } }\n\n@-ms-keyframes fadeInRight {\n 0% {\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; } }\n\n@keyframes fadeInRight {\n 0% {\n -webkit-transform: translateX(20px);\n -moz-transform: translateX(20px);\n -ms-transform: translateX(20px);\n -o-transform: translateX(20px);\n transform: translateX(20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; } }\n\n@-moz-keyframes fadeInLeft {\n 0% {\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; } }\n\n@-webkit-keyframes fadeInLeft {\n 0% {\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; } }\n\n@-o-keyframes fadeInLeft {\n 0% {\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; } }\n\n@-ms-keyframes fadeInLeft {\n 0% {\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; } }\n\n@keyframes fadeInLeft {\n 0% {\n -webkit-transform: translateX(-20px);\n -moz-transform: translateX(-20px);\n -ms-transform: translateX(-20px);\n -o-transform: translateX(-20px);\n transform: translateX(-20px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0);\n opacity: 1; } }\n\n@-moz-keyframes fadeInUpBig {\n 0% {\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-webkit-keyframes fadeInUpBig {\n 0% {\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-o-keyframes fadeInUpBig {\n 0% {\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-ms-keyframes fadeInUpBig {\n 0% {\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@keyframes fadeInUpBig {\n 0% {\n -webkit-transform: translateY(2000px);\n -moz-transform: translateY(2000px);\n -ms-transform: translateY(2000px);\n -o-transform: translateY(2000px);\n transform: translateY(2000px);\n opacity: 0; }\n 100% {\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n opacity: 1; } }\n\n@-moz-keyframes fadeInDownBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-webkit-keyframes fadeInDownBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-o-keyframes fadeInDownBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-ms-keyframes fadeInDownBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@keyframes fadeInDownBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateY(-2000px);\n -moz-transform: translateY(-2000px);\n -ms-transform: translateY(-2000px);\n -o-transform: translateY(-2000px);\n transform: translateY(-2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0); } }\n\n@-moz-keyframes fadeInRightBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-webkit-keyframes fadeInRightBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-o-keyframes fadeInRightBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-ms-keyframes fadeInRightBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@keyframes fadeInRightBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(2000px);\n -moz-transform: translateX(2000px);\n -ms-transform: translateX(2000px);\n -o-transform: translateX(2000px);\n transform: translateX(2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-moz-keyframes fadeInLeftBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-webkit-keyframes fadeInLeftBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-o-keyframes fadeInLeftBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-ms-keyframes fadeInLeftBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@keyframes fadeInLeftBig {\n 0% {\n opacity: 0;\n -webkit-transform: translateX(-2000px);\n -moz-transform: translateX(-2000px);\n -ms-transform: translateX(-2000px);\n -o-transform: translateX(-2000px);\n transform: translateX(-2000px); }\n 100% {\n opacity: 1;\n -webkit-transform: translateX(0);\n -moz-transform: translateX(0);\n -ms-transform: translateX(0);\n -o-transform: translateX(0);\n transform: translateX(0); } }\n\n@-moz-keyframes flip {\n 0% {\n -webkit-transform: perspective(400px) rotateY(0);\n -moz-transform: perspective(400px) rotateY(0);\n -ms-transform: perspective(400px) rotateY(0);\n -o-transform: perspective(400px) rotateY(0);\n transform: perspective(400px) rotateY(0);\n -webkit-animation-timing-function: ease-out;\n -moz-animation-timing-function: ease-out;\n -ms-animation-timing-function: ease-out;\n -o-animation-timing-function: ease-out;\n animation-timing-function: ease-out; }\n 40% {\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -o-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -webkit-animation-timing-function: ease-out;\n -moz-animation-timing-function: ease-out;\n -ms-animation-timing-function: ease-out;\n -o-animation-timing-function: ease-out;\n animation-timing-function: ease-out; }\n 50% {\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; }\n 80% {\n -webkit-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -moz-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -ms-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -o-transform: perspective(400px) rotateY(360deg) scale(0.95);\n transform: perspective(400px) rotateY(360deg) scale(0.95);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; }\n 100% {\n -webkit-transform: perspective(400px) scale(1);\n -moz-transform: perspective(400px) scale(1);\n -ms-transform: perspective(400px) scale(1);\n -o-transform: perspective(400px) scale(1);\n transform: perspective(400px) scale(1);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; } }\n\n@-webkit-keyframes flip {\n 0% {\n -webkit-transform: perspective(400px) rotateY(0);\n -moz-transform: perspective(400px) rotateY(0);\n -ms-transform: perspective(400px) rotateY(0);\n -o-transform: perspective(400px) rotateY(0);\n transform: perspective(400px) rotateY(0);\n -webkit-animation-timing-function: ease-out;\n -moz-animation-timing-function: ease-out;\n -ms-animation-timing-function: ease-out;\n -o-animation-timing-function: ease-out;\n animation-timing-function: ease-out; }\n 40% {\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -o-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -webkit-animation-timing-function: ease-out;\n -moz-animation-timing-function: ease-out;\n -ms-animation-timing-function: ease-out;\n -o-animation-timing-function: ease-out;\n animation-timing-function: ease-out; }\n 50% {\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; }\n 80% {\n -webkit-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -moz-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -ms-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -o-transform: perspective(400px) rotateY(360deg) scale(0.95);\n transform: perspective(400px) rotateY(360deg) scale(0.95);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; }\n 100% {\n -webkit-transform: perspective(400px) scale(1);\n -moz-transform: perspective(400px) scale(1);\n -ms-transform: perspective(400px) scale(1);\n -o-transform: perspective(400px) scale(1);\n transform: perspective(400px) scale(1);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; } }\n\n@-o-keyframes flip {\n 0% {\n -webkit-transform: perspective(400px) rotateY(0);\n -moz-transform: perspective(400px) rotateY(0);\n -ms-transform: perspective(400px) rotateY(0);\n -o-transform: perspective(400px) rotateY(0);\n transform: perspective(400px) rotateY(0);\n -webkit-animation-timing-function: ease-out;\n -moz-animation-timing-function: ease-out;\n -ms-animation-timing-function: ease-out;\n -o-animation-timing-function: ease-out;\n animation-timing-function: ease-out; }\n 40% {\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -o-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -webkit-animation-timing-function: ease-out;\n -moz-animation-timing-function: ease-out;\n -ms-animation-timing-function: ease-out;\n -o-animation-timing-function: ease-out;\n animation-timing-function: ease-out; }\n 50% {\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; }\n 80% {\n -webkit-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -moz-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -ms-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -o-transform: perspective(400px) rotateY(360deg) scale(0.95);\n transform: perspective(400px) rotateY(360deg) scale(0.95);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; }\n 100% {\n -webkit-transform: perspective(400px) scale(1);\n -moz-transform: perspective(400px) scale(1);\n -ms-transform: perspective(400px) scale(1);\n -o-transform: perspective(400px) scale(1);\n transform: perspective(400px) scale(1);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; } }\n\n@-ms-keyframes flip {\n 0% {\n -webkit-transform: perspective(400px) rotateY(0);\n -moz-transform: perspective(400px) rotateY(0);\n -ms-transform: perspective(400px) rotateY(0);\n -o-transform: perspective(400px) rotateY(0);\n transform: perspective(400px) rotateY(0);\n -webkit-animation-timing-function: ease-out;\n -moz-animation-timing-function: ease-out;\n -ms-animation-timing-function: ease-out;\n -o-animation-timing-function: ease-out;\n animation-timing-function: ease-out; }\n 40% {\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -o-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -webkit-animation-timing-function: ease-out;\n -moz-animation-timing-function: ease-out;\n -ms-animation-timing-function: ease-out;\n -o-animation-timing-function: ease-out;\n animation-timing-function: ease-out; }\n 50% {\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; }\n 80% {\n -webkit-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -moz-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -ms-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -o-transform: perspective(400px) rotateY(360deg) scale(0.95);\n transform: perspective(400px) rotateY(360deg) scale(0.95);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; }\n 100% {\n -webkit-transform: perspective(400px) scale(1);\n -moz-transform: perspective(400px) scale(1);\n -ms-transform: perspective(400px) scale(1);\n -o-transform: perspective(400px) scale(1);\n transform: perspective(400px) scale(1);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; } }\n\n@keyframes flip {\n 0% {\n -webkit-transform: perspective(400px) rotateY(0);\n -moz-transform: perspective(400px) rotateY(0);\n -ms-transform: perspective(400px) rotateY(0);\n -o-transform: perspective(400px) rotateY(0);\n transform: perspective(400px) rotateY(0);\n -webkit-animation-timing-function: ease-out;\n -moz-animation-timing-function: ease-out;\n -ms-animation-timing-function: ease-out;\n -o-animation-timing-function: ease-out;\n animation-timing-function: ease-out; }\n 40% {\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -o-transform: perspective(400px) translateZ(150px) rotateY(170deg);\n transform: perspective(400px) translateZ(150px) rotateY(170deg);\n -webkit-animation-timing-function: ease-out;\n -moz-animation-timing-function: ease-out;\n -ms-animation-timing-function: ease-out;\n -o-animation-timing-function: ease-out;\n animation-timing-function: ease-out; }\n 50% {\n -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; }\n 80% {\n -webkit-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -moz-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -ms-transform: perspective(400px) rotateY(360deg) scale(0.95);\n -o-transform: perspective(400px) rotateY(360deg) scale(0.95);\n transform: perspective(400px) rotateY(360deg) scale(0.95);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; }\n 100% {\n -webkit-transform: perspective(400px) scale(1);\n -moz-transform: perspective(400px) scale(1);\n -ms-transform: perspective(400px) scale(1);\n -o-transform: perspective(400px) scale(1);\n transform: perspective(400px) scale(1);\n -webkit-animation-timing-function: ease-in;\n -moz-animation-timing-function: ease-in;\n -ms-animation-timing-function: ease-in;\n -o-animation-timing-function: ease-in;\n animation-timing-function: ease-in; } }\n\n@-moz-keyframes flipInX {\n 0% {\n -webkit-transform: perspective(400px) rotateX(90deg);\n -moz-transform: perspective(400px) rotateX(90deg);\n -ms-transform: perspective(400px) rotateX(90deg);\n -o-transform: perspective(400px) rotateX(90deg);\n transform: perspective(400px) rotateX(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 40% {\n -webkit-transform: perspective(400px) rotateX(-10deg);\n -moz-transform: perspective(400px) rotateX(-10deg);\n -ms-transform: perspective(400px) rotateX(-10deg);\n -o-transform: perspective(400px) rotateX(-10deg);\n transform: perspective(400px) rotateX(-10deg); }\n 70% {\n -webkit-transform: perspective(400px) rotateX(10deg);\n -moz-transform: perspective(400px) rotateX(10deg);\n -ms-transform: perspective(400px) rotateX(10deg);\n -o-transform: perspective(400px) rotateX(10deg);\n transform: perspective(400px) rotateX(10deg); }\n 100% {\n -webkit-transform: perspective(400px) rotateX(0deg);\n -moz-transform: perspective(400px) rotateX(0deg);\n -ms-transform: perspective(400px) rotateX(0deg);\n -o-transform: perspective(400px) rotateX(0deg);\n transform: perspective(400px) rotateX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-webkit-keyframes flipInX {\n 0% {\n -webkit-transform: perspective(400px) rotateX(90deg);\n -moz-transform: perspective(400px) rotateX(90deg);\n -ms-transform: perspective(400px) rotateX(90deg);\n -o-transform: perspective(400px) rotateX(90deg);\n transform: perspective(400px) rotateX(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 40% {\n -webkit-transform: perspective(400px) rotateX(-10deg);\n -moz-transform: perspective(400px) rotateX(-10deg);\n -ms-transform: perspective(400px) rotateX(-10deg);\n -o-transform: perspective(400px) rotateX(-10deg);\n transform: perspective(400px) rotateX(-10deg); }\n 70% {\n -webkit-transform: perspective(400px) rotateX(10deg);\n -moz-transform: perspective(400px) rotateX(10deg);\n -ms-transform: perspective(400px) rotateX(10deg);\n -o-transform: perspective(400px) rotateX(10deg);\n transform: perspective(400px) rotateX(10deg); }\n 100% {\n -webkit-transform: perspective(400px) rotateX(0deg);\n -moz-transform: perspective(400px) rotateX(0deg);\n -ms-transform: perspective(400px) rotateX(0deg);\n -o-transform: perspective(400px) rotateX(0deg);\n transform: perspective(400px) rotateX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-o-keyframes flipInX {\n 0% {\n -webkit-transform: perspective(400px) rotateX(90deg);\n -moz-transform: perspective(400px) rotateX(90deg);\n -ms-transform: perspective(400px) rotateX(90deg);\n -o-transform: perspective(400px) rotateX(90deg);\n transform: perspective(400px) rotateX(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 40% {\n -webkit-transform: perspective(400px) rotateX(-10deg);\n -moz-transform: perspective(400px) rotateX(-10deg);\n -ms-transform: perspective(400px) rotateX(-10deg);\n -o-transform: perspective(400px) rotateX(-10deg);\n transform: perspective(400px) rotateX(-10deg); }\n 70% {\n -webkit-transform: perspective(400px) rotateX(10deg);\n -moz-transform: perspective(400px) rotateX(10deg);\n -ms-transform: perspective(400px) rotateX(10deg);\n -o-transform: perspective(400px) rotateX(10deg);\n transform: perspective(400px) rotateX(10deg); }\n 100% {\n -webkit-transform: perspective(400px) rotateX(0deg);\n -moz-transform: perspective(400px) rotateX(0deg);\n -ms-transform: perspective(400px) rotateX(0deg);\n -o-transform: perspective(400px) rotateX(0deg);\n transform: perspective(400px) rotateX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-ms-keyframes flipInX {\n 0% {\n -webkit-transform: perspective(400px) rotateX(90deg);\n -moz-transform: perspective(400px) rotateX(90deg);\n -ms-transform: perspective(400px) rotateX(90deg);\n -o-transform: perspective(400px) rotateX(90deg);\n transform: perspective(400px) rotateX(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 40% {\n -webkit-transform: perspective(400px) rotateX(-10deg);\n -moz-transform: perspective(400px) rotateX(-10deg);\n -ms-transform: perspective(400px) rotateX(-10deg);\n -o-transform: perspective(400px) rotateX(-10deg);\n transform: perspective(400px) rotateX(-10deg); }\n 70% {\n -webkit-transform: perspective(400px) rotateX(10deg);\n -moz-transform: perspective(400px) rotateX(10deg);\n -ms-transform: perspective(400px) rotateX(10deg);\n -o-transform: perspective(400px) rotateX(10deg);\n transform: perspective(400px) rotateX(10deg); }\n 100% {\n -webkit-transform: perspective(400px) rotateX(0deg);\n -moz-transform: perspective(400px) rotateX(0deg);\n -ms-transform: perspective(400px) rotateX(0deg);\n -o-transform: perspective(400px) rotateX(0deg);\n transform: perspective(400px) rotateX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@keyframes flipInX {\n 0% {\n -webkit-transform: perspective(400px) rotateX(90deg);\n -moz-transform: perspective(400px) rotateX(90deg);\n -ms-transform: perspective(400px) rotateX(90deg);\n -o-transform: perspective(400px) rotateX(90deg);\n transform: perspective(400px) rotateX(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 40% {\n -webkit-transform: perspective(400px) rotateX(-10deg);\n -moz-transform: perspective(400px) rotateX(-10deg);\n -ms-transform: perspective(400px) rotateX(-10deg);\n -o-transform: perspective(400px) rotateX(-10deg);\n transform: perspective(400px) rotateX(-10deg); }\n 70% {\n -webkit-transform: perspective(400px) rotateX(10deg);\n -moz-transform: perspective(400px) rotateX(10deg);\n -ms-transform: perspective(400px) rotateX(10deg);\n -o-transform: perspective(400px) rotateX(10deg);\n transform: perspective(400px) rotateX(10deg); }\n 100% {\n -webkit-transform: perspective(400px) rotateX(0deg);\n -moz-transform: perspective(400px) rotateX(0deg);\n -ms-transform: perspective(400px) rotateX(0deg);\n -o-transform: perspective(400px) rotateX(0deg);\n transform: perspective(400px) rotateX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-moz-keyframes flipOutX {\n 0% {\n -webkit-transform: perspective(400px) rotateX(0deg);\n -moz-transform: perspective(400px) rotateX(0deg);\n -ms-transform: perspective(400px) rotateX(0deg);\n -o-transform: perspective(400px) rotateX(0deg);\n transform: perspective(400px) rotateX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: perspective(400px) rotateX(90deg);\n -moz-transform: perspective(400px) rotateX(90deg);\n -ms-transform: perspective(400px) rotateX(90deg);\n -o-transform: perspective(400px) rotateX(90deg);\n transform: perspective(400px) rotateX(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-webkit-keyframes flipOutX {\n 0% {\n -webkit-transform: perspective(400px) rotateX(0deg);\n -moz-transform: perspective(400px) rotateX(0deg);\n -ms-transform: perspective(400px) rotateX(0deg);\n -o-transform: perspective(400px) rotateX(0deg);\n transform: perspective(400px) rotateX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: perspective(400px) rotateX(90deg);\n -moz-transform: perspective(400px) rotateX(90deg);\n -ms-transform: perspective(400px) rotateX(90deg);\n -o-transform: perspective(400px) rotateX(90deg);\n transform: perspective(400px) rotateX(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-o-keyframes flipOutX {\n 0% {\n -webkit-transform: perspective(400px) rotateX(0deg);\n -moz-transform: perspective(400px) rotateX(0deg);\n -ms-transform: perspective(400px) rotateX(0deg);\n -o-transform: perspective(400px) rotateX(0deg);\n transform: perspective(400px) rotateX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: perspective(400px) rotateX(90deg);\n -moz-transform: perspective(400px) rotateX(90deg);\n -ms-transform: perspective(400px) rotateX(90deg);\n -o-transform: perspective(400px) rotateX(90deg);\n transform: perspective(400px) rotateX(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-ms-keyframes flipOutX {\n 0% {\n -webkit-transform: perspective(400px) rotateX(0deg);\n -moz-transform: perspective(400px) rotateX(0deg);\n -ms-transform: perspective(400px) rotateX(0deg);\n -o-transform: perspective(400px) rotateX(0deg);\n transform: perspective(400px) rotateX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: perspective(400px) rotateX(90deg);\n -moz-transform: perspective(400px) rotateX(90deg);\n -ms-transform: perspective(400px) rotateX(90deg);\n -o-transform: perspective(400px) rotateX(90deg);\n transform: perspective(400px) rotateX(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@keyframes flipOutX {\n 0% {\n -webkit-transform: perspective(400px) rotateX(0deg);\n -moz-transform: perspective(400px) rotateX(0deg);\n -ms-transform: perspective(400px) rotateX(0deg);\n -o-transform: perspective(400px) rotateX(0deg);\n transform: perspective(400px) rotateX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: perspective(400px) rotateX(90deg);\n -moz-transform: perspective(400px) rotateX(90deg);\n -ms-transform: perspective(400px) rotateX(90deg);\n -o-transform: perspective(400px) rotateX(90deg);\n transform: perspective(400px) rotateX(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-moz-keyframes flipInY {\n 0% {\n -webkit-transform: perspective(400px) rotateY(90deg);\n -moz-transform: perspective(400px) rotateY(90deg);\n -ms-transform: perspective(400px) rotateY(90deg);\n -o-transform: perspective(400px) rotateY(90deg);\n transform: perspective(400px) rotateY(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 40% {\n -webkit-transform: perspective(400px) rotateY(-10deg);\n -moz-transform: perspective(400px) rotateY(-10deg);\n -ms-transform: perspective(400px) rotateY(-10deg);\n -o-transform: perspective(400px) rotateY(-10deg);\n transform: perspective(400px) rotateY(-10deg); }\n 70% {\n -webkit-transform: perspective(400px) rotateY(10deg);\n -moz-transform: perspective(400px) rotateY(10deg);\n -ms-transform: perspective(400px) rotateY(10deg);\n -o-transform: perspective(400px) rotateY(10deg);\n transform: perspective(400px) rotateY(10deg); }\n 100% {\n -webkit-transform: perspective(400px) rotateY(0deg);\n -moz-transform: perspective(400px) rotateY(0deg);\n -ms-transform: perspective(400px) rotateY(0deg);\n -o-transform: perspective(400px) rotateY(0deg);\n transform: perspective(400px) rotateY(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-webkit-keyframes flipInY {\n 0% {\n -webkit-transform: perspective(400px) rotateY(90deg);\n -moz-transform: perspective(400px) rotateY(90deg);\n -ms-transform: perspective(400px) rotateY(90deg);\n -o-transform: perspective(400px) rotateY(90deg);\n transform: perspective(400px) rotateY(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 40% {\n -webkit-transform: perspective(400px) rotateY(-10deg);\n -moz-transform: perspective(400px) rotateY(-10deg);\n -ms-transform: perspective(400px) rotateY(-10deg);\n -o-transform: perspective(400px) rotateY(-10deg);\n transform: perspective(400px) rotateY(-10deg); }\n 70% {\n -webkit-transform: perspective(400px) rotateY(10deg);\n -moz-transform: perspective(400px) rotateY(10deg);\n -ms-transform: perspective(400px) rotateY(10deg);\n -o-transform: perspective(400px) rotateY(10deg);\n transform: perspective(400px) rotateY(10deg); }\n 100% {\n -webkit-transform: perspective(400px) rotateY(0deg);\n -moz-transform: perspective(400px) rotateY(0deg);\n -ms-transform: perspective(400px) rotateY(0deg);\n -o-transform: perspective(400px) rotateY(0deg);\n transform: perspective(400px) rotateY(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-o-keyframes flipInY {\n 0% {\n -webkit-transform: perspective(400px) rotateY(90deg);\n -moz-transform: perspective(400px) rotateY(90deg);\n -ms-transform: perspective(400px) rotateY(90deg);\n -o-transform: perspective(400px) rotateY(90deg);\n transform: perspective(400px) rotateY(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 40% {\n -webkit-transform: perspective(400px) rotateY(-10deg);\n -moz-transform: perspective(400px) rotateY(-10deg);\n -ms-transform: perspective(400px) rotateY(-10deg);\n -o-transform: perspective(400px) rotateY(-10deg);\n transform: perspective(400px) rotateY(-10deg); }\n 70% {\n -webkit-transform: perspective(400px) rotateY(10deg);\n -moz-transform: perspective(400px) rotateY(10deg);\n -ms-transform: perspective(400px) rotateY(10deg);\n -o-transform: perspective(400px) rotateY(10deg);\n transform: perspective(400px) rotateY(10deg); }\n 100% {\n -webkit-transform: perspective(400px) rotateY(0deg);\n -moz-transform: perspective(400px) rotateY(0deg);\n -ms-transform: perspective(400px) rotateY(0deg);\n -o-transform: perspective(400px) rotateY(0deg);\n transform: perspective(400px) rotateY(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-ms-keyframes flipInY {\n 0% {\n -webkit-transform: perspective(400px) rotateY(90deg);\n -moz-transform: perspective(400px) rotateY(90deg);\n -ms-transform: perspective(400px) rotateY(90deg);\n -o-transform: perspective(400px) rotateY(90deg);\n transform: perspective(400px) rotateY(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 40% {\n -webkit-transform: perspective(400px) rotateY(-10deg);\n -moz-transform: perspective(400px) rotateY(-10deg);\n -ms-transform: perspective(400px) rotateY(-10deg);\n -o-transform: perspective(400px) rotateY(-10deg);\n transform: perspective(400px) rotateY(-10deg); }\n 70% {\n -webkit-transform: perspective(400px) rotateY(10deg);\n -moz-transform: perspective(400px) rotateY(10deg);\n -ms-transform: perspective(400px) rotateY(10deg);\n -o-transform: perspective(400px) rotateY(10deg);\n transform: perspective(400px) rotateY(10deg); }\n 100% {\n -webkit-transform: perspective(400px) rotateY(0deg);\n -moz-transform: perspective(400px) rotateY(0deg);\n -ms-transform: perspective(400px) rotateY(0deg);\n -o-transform: perspective(400px) rotateY(0deg);\n transform: perspective(400px) rotateY(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@keyframes flipInY {\n 0% {\n -webkit-transform: perspective(400px) rotateY(90deg);\n -moz-transform: perspective(400px) rotateY(90deg);\n -ms-transform: perspective(400px) rotateY(90deg);\n -o-transform: perspective(400px) rotateY(90deg);\n transform: perspective(400px) rotateY(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 40% {\n -webkit-transform: perspective(400px) rotateY(-10deg);\n -moz-transform: perspective(400px) rotateY(-10deg);\n -ms-transform: perspective(400px) rotateY(-10deg);\n -o-transform: perspective(400px) rotateY(-10deg);\n transform: perspective(400px) rotateY(-10deg); }\n 70% {\n -webkit-transform: perspective(400px) rotateY(10deg);\n -moz-transform: perspective(400px) rotateY(10deg);\n -ms-transform: perspective(400px) rotateY(10deg);\n -o-transform: perspective(400px) rotateY(10deg);\n transform: perspective(400px) rotateY(10deg); }\n 100% {\n -webkit-transform: perspective(400px) rotateY(0deg);\n -moz-transform: perspective(400px) rotateY(0deg);\n -ms-transform: perspective(400px) rotateY(0deg);\n -o-transform: perspective(400px) rotateY(0deg);\n transform: perspective(400px) rotateY(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-moz-keyframes flipOutY {\n 0% {\n -webkit-transform: perspective(400px) rotateY(0deg);\n -moz-transform: perspective(400px) rotateY(0deg);\n -ms-transform: perspective(400px) rotateY(0deg);\n -o-transform: perspective(400px) rotateY(0deg);\n transform: perspective(400px) rotateY(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: perspective(400px) rotateY(90deg);\n -moz-transform: perspective(400px) rotateY(90deg);\n -ms-transform: perspective(400px) rotateY(90deg);\n -o-transform: perspective(400px) rotateY(90deg);\n transform: perspective(400px) rotateY(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-webkit-keyframes flipOutY {\n 0% {\n -webkit-transform: perspective(400px) rotateY(0deg);\n -moz-transform: perspective(400px) rotateY(0deg);\n -ms-transform: perspective(400px) rotateY(0deg);\n -o-transform: perspective(400px) rotateY(0deg);\n transform: perspective(400px) rotateY(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: perspective(400px) rotateY(90deg);\n -moz-transform: perspective(400px) rotateY(90deg);\n -ms-transform: perspective(400px) rotateY(90deg);\n -o-transform: perspective(400px) rotateY(90deg);\n transform: perspective(400px) rotateY(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-o-keyframes flipOutY {\n 0% {\n -webkit-transform: perspective(400px) rotateY(0deg);\n -moz-transform: perspective(400px) rotateY(0deg);\n -ms-transform: perspective(400px) rotateY(0deg);\n -o-transform: perspective(400px) rotateY(0deg);\n transform: perspective(400px) rotateY(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: perspective(400px) rotateY(90deg);\n -moz-transform: perspective(400px) rotateY(90deg);\n -ms-transform: perspective(400px) rotateY(90deg);\n -o-transform: perspective(400px) rotateY(90deg);\n transform: perspective(400px) rotateY(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-ms-keyframes flipOutY {\n 0% {\n -webkit-transform: perspective(400px) rotateY(0deg);\n -moz-transform: perspective(400px) rotateY(0deg);\n -ms-transform: perspective(400px) rotateY(0deg);\n -o-transform: perspective(400px) rotateY(0deg);\n transform: perspective(400px) rotateY(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: perspective(400px) rotateY(90deg);\n -moz-transform: perspective(400px) rotateY(90deg);\n -ms-transform: perspective(400px) rotateY(90deg);\n -o-transform: perspective(400px) rotateY(90deg);\n transform: perspective(400px) rotateY(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@keyframes flipOutY {\n 0% {\n -webkit-transform: perspective(400px) rotateY(0deg);\n -moz-transform: perspective(400px) rotateY(0deg);\n -ms-transform: perspective(400px) rotateY(0deg);\n -o-transform: perspective(400px) rotateY(0deg);\n transform: perspective(400px) rotateY(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: perspective(400px) rotateY(90deg);\n -moz-transform: perspective(400px) rotateY(90deg);\n -ms-transform: perspective(400px) rotateY(90deg);\n -o-transform: perspective(400px) rotateY(90deg);\n transform: perspective(400px) rotateY(90deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-moz-keyframes lightSpeedIn {\n 0% {\n -webkit-transform: translateX(100%) skewX(-30deg);\n -moz-transform: translateX(100%) skewX(-30deg);\n -ms-transform: translateX(100%) skewX(-30deg);\n -o-transform: translateX(100%) skewX(-30deg);\n transform: translateX(100%) skewX(-30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 60% {\n -webkit-transform: translateX(-20%) skewX(30deg);\n -moz-transform: translateX(-20%) skewX(30deg);\n -ms-transform: translateX(-20%) skewX(30deg);\n -o-transform: translateX(-20%) skewX(30deg);\n transform: translateX(-20%) skewX(30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 80% {\n -webkit-transform: translateX(0%) skewX(-15deg);\n -moz-transform: translateX(0%) skewX(-15deg);\n -ms-transform: translateX(0%) skewX(-15deg);\n -o-transform: translateX(0%) skewX(-15deg);\n transform: translateX(0%) skewX(-15deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(0%) skewX(0deg);\n -moz-transform: translateX(0%) skewX(0deg);\n -ms-transform: translateX(0%) skewX(0deg);\n -o-transform: translateX(0%) skewX(0deg);\n transform: translateX(0%) skewX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-webkit-keyframes lightSpeedIn {\n 0% {\n -webkit-transform: translateX(100%) skewX(-30deg);\n -moz-transform: translateX(100%) skewX(-30deg);\n -ms-transform: translateX(100%) skewX(-30deg);\n -o-transform: translateX(100%) skewX(-30deg);\n transform: translateX(100%) skewX(-30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 60% {\n -webkit-transform: translateX(-20%) skewX(30deg);\n -moz-transform: translateX(-20%) skewX(30deg);\n -ms-transform: translateX(-20%) skewX(30deg);\n -o-transform: translateX(-20%) skewX(30deg);\n transform: translateX(-20%) skewX(30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 80% {\n -webkit-transform: translateX(0%) skewX(-15deg);\n -moz-transform: translateX(0%) skewX(-15deg);\n -ms-transform: translateX(0%) skewX(-15deg);\n -o-transform: translateX(0%) skewX(-15deg);\n transform: translateX(0%) skewX(-15deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(0%) skewX(0deg);\n -moz-transform: translateX(0%) skewX(0deg);\n -ms-transform: translateX(0%) skewX(0deg);\n -o-transform: translateX(0%) skewX(0deg);\n transform: translateX(0%) skewX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-o-keyframes lightSpeedIn {\n 0% {\n -webkit-transform: translateX(100%) skewX(-30deg);\n -moz-transform: translateX(100%) skewX(-30deg);\n -ms-transform: translateX(100%) skewX(-30deg);\n -o-transform: translateX(100%) skewX(-30deg);\n transform: translateX(100%) skewX(-30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 60% {\n -webkit-transform: translateX(-20%) skewX(30deg);\n -moz-transform: translateX(-20%) skewX(30deg);\n -ms-transform: translateX(-20%) skewX(30deg);\n -o-transform: translateX(-20%) skewX(30deg);\n transform: translateX(-20%) skewX(30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 80% {\n -webkit-transform: translateX(0%) skewX(-15deg);\n -moz-transform: translateX(0%) skewX(-15deg);\n -ms-transform: translateX(0%) skewX(-15deg);\n -o-transform: translateX(0%) skewX(-15deg);\n transform: translateX(0%) skewX(-15deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(0%) skewX(0deg);\n -moz-transform: translateX(0%) skewX(0deg);\n -ms-transform: translateX(0%) skewX(0deg);\n -o-transform: translateX(0%) skewX(0deg);\n transform: translateX(0%) skewX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-ms-keyframes lightSpeedIn {\n 0% {\n -webkit-transform: translateX(100%) skewX(-30deg);\n -moz-transform: translateX(100%) skewX(-30deg);\n -ms-transform: translateX(100%) skewX(-30deg);\n -o-transform: translateX(100%) skewX(-30deg);\n transform: translateX(100%) skewX(-30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 60% {\n -webkit-transform: translateX(-20%) skewX(30deg);\n -moz-transform: translateX(-20%) skewX(30deg);\n -ms-transform: translateX(-20%) skewX(30deg);\n -o-transform: translateX(-20%) skewX(30deg);\n transform: translateX(-20%) skewX(30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 80% {\n -webkit-transform: translateX(0%) skewX(-15deg);\n -moz-transform: translateX(0%) skewX(-15deg);\n -ms-transform: translateX(0%) skewX(-15deg);\n -o-transform: translateX(0%) skewX(-15deg);\n transform: translateX(0%) skewX(-15deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(0%) skewX(0deg);\n -moz-transform: translateX(0%) skewX(0deg);\n -ms-transform: translateX(0%) skewX(0deg);\n -o-transform: translateX(0%) skewX(0deg);\n transform: translateX(0%) skewX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@keyframes lightSpeedIn {\n 0% {\n -webkit-transform: translateX(100%) skewX(-30deg);\n -moz-transform: translateX(100%) skewX(-30deg);\n -ms-transform: translateX(100%) skewX(-30deg);\n -o-transform: translateX(100%) skewX(-30deg);\n transform: translateX(100%) skewX(-30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n 60% {\n -webkit-transform: translateX(-20%) skewX(30deg);\n -moz-transform: translateX(-20%) skewX(30deg);\n -ms-transform: translateX(-20%) skewX(30deg);\n -o-transform: translateX(-20%) skewX(30deg);\n transform: translateX(-20%) skewX(30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 80% {\n -webkit-transform: translateX(0%) skewX(-15deg);\n -moz-transform: translateX(0%) skewX(-15deg);\n -ms-transform: translateX(0%) skewX(-15deg);\n -o-transform: translateX(0%) skewX(-15deg);\n transform: translateX(0%) skewX(-15deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(0%) skewX(0deg);\n -moz-transform: translateX(0%) skewX(0deg);\n -ms-transform: translateX(0%) skewX(0deg);\n -o-transform: translateX(0%) skewX(0deg);\n transform: translateX(0%) skewX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; } }\n\n@-moz-keyframes lightSpeedOut {\n 0% {\n -webkit-transform: translateX(0%) skewX(0deg);\n -moz-transform: translateX(0%) skewX(0deg);\n -ms-transform: translateX(0%) skewX(0deg);\n -o-transform: translateX(0%) skewX(0deg);\n transform: translateX(0%) skewX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(100%) skewX(-30deg);\n -moz-transform: translateX(100%) skewX(-30deg);\n -ms-transform: translateX(100%) skewX(-30deg);\n -o-transform: translateX(100%) skewX(-30deg);\n transform: translateX(100%) skewX(-30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-webkit-keyframes lightSpeedOut {\n 0% {\n -webkit-transform: translateX(0%) skewX(0deg);\n -moz-transform: translateX(0%) skewX(0deg);\n -ms-transform: translateX(0%) skewX(0deg);\n -o-transform: translateX(0%) skewX(0deg);\n transform: translateX(0%) skewX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(100%) skewX(-30deg);\n -moz-transform: translateX(100%) skewX(-30deg);\n -ms-transform: translateX(100%) skewX(-30deg);\n -o-transform: translateX(100%) skewX(-30deg);\n transform: translateX(100%) skewX(-30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-o-keyframes lightSpeedOut {\n 0% {\n -webkit-transform: translateX(0%) skewX(0deg);\n -moz-transform: translateX(0%) skewX(0deg);\n -ms-transform: translateX(0%) skewX(0deg);\n -o-transform: translateX(0%) skewX(0deg);\n transform: translateX(0%) skewX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(100%) skewX(-30deg);\n -moz-transform: translateX(100%) skewX(-30deg);\n -ms-transform: translateX(100%) skewX(-30deg);\n -o-transform: translateX(100%) skewX(-30deg);\n transform: translateX(100%) skewX(-30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-ms-keyframes lightSpeedOut {\n 0% {\n -webkit-transform: translateX(0%) skewX(0deg);\n -moz-transform: translateX(0%) skewX(0deg);\n -ms-transform: translateX(0%) skewX(0deg);\n -o-transform: translateX(0%) skewX(0deg);\n transform: translateX(0%) skewX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(100%) skewX(-30deg);\n -moz-transform: translateX(100%) skewX(-30deg);\n -ms-transform: translateX(100%) skewX(-30deg);\n -o-transform: translateX(100%) skewX(-30deg);\n transform: translateX(100%) skewX(-30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@keyframes lightSpeedOut {\n 0% {\n -webkit-transform: translateX(0%) skewX(0deg);\n -moz-transform: translateX(0%) skewX(0deg);\n -ms-transform: translateX(0%) skewX(0deg);\n -o-transform: translateX(0%) skewX(0deg);\n transform: translateX(0%) skewX(0deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1; }\n 100% {\n -webkit-transform: translateX(100%) skewX(-30deg);\n -moz-transform: translateX(100%) skewX(-30deg);\n -ms-transform: translateX(100%) skewX(-30deg);\n -o-transform: translateX(100%) skewX(-30deg);\n transform: translateX(100%) skewX(-30deg);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-moz-keyframes rotateOut {\n 0% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(200deg);\n -moz-transform: rotate(200deg);\n -ms-transform: rotate(200deg);\n -o-transform: rotate(200deg);\n transform: rotate(200deg);\n opacity: 0; } }\n\n@-webkit-keyframes rotateOut {\n 0% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(200deg);\n -moz-transform: rotate(200deg);\n -ms-transform: rotate(200deg);\n -o-transform: rotate(200deg);\n transform: rotate(200deg);\n opacity: 0; } }\n\n@-o-keyframes rotateOut {\n 0% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(200deg);\n -moz-transform: rotate(200deg);\n -ms-transform: rotate(200deg);\n -o-transform: rotate(200deg);\n transform: rotate(200deg);\n opacity: 0; } }\n\n@-ms-keyframes rotateOut {\n 0% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(200deg);\n -moz-transform: rotate(200deg);\n -ms-transform: rotate(200deg);\n -o-transform: rotate(200deg);\n transform: rotate(200deg);\n opacity: 0; } }\n\n@keyframes rotateOut {\n 0% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(200deg);\n -moz-transform: rotate(200deg);\n -ms-transform: rotate(200deg);\n -o-transform: rotate(200deg);\n transform: rotate(200deg);\n opacity: 0; } }\n\n@-moz-keyframes rotateOutDownLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; } }\n\n@-webkit-keyframes rotateOutDownLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; } }\n\n@-o-keyframes rotateOutDownLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; } }\n\n@-ms-keyframes rotateOutDownLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; } }\n\n@keyframes rotateOutDownLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; } }\n\n@-moz-keyframes rotateOutUpLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; } }\n\n@-webkit-keyframes rotateOutUpLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; } }\n\n@-o-keyframes rotateOutUpLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; } }\n\n@-ms-keyframes rotateOutUpLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; } }\n\n@keyframes rotateOutUpLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; } }\n\n@-moz-keyframes rotateOutDownRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; } }\n\n@-webkit-keyframes rotateOutDownRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; } }\n\n@-o-keyframes rotateOutDownRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; } }\n\n@-ms-keyframes rotateOutDownRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; } }\n\n@keyframes rotateOutDownRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; } }\n\n@-moz-keyframes rotateOutUpRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; } }\n\n@-webkit-keyframes rotateOutUpRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; } }\n\n@-o-keyframes rotateOutUpRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; } }\n\n@-ms-keyframes rotateOutUpRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; } }\n\n@keyframes rotateOutUpRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; } }\n\n@-moz-keyframes rotateIn {\n 0% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(-200deg);\n -moz-transform: rotate(-200deg);\n -ms-transform: rotate(-200deg);\n -o-transform: rotate(-200deg);\n transform: rotate(-200deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-webkit-keyframes rotateIn {\n 0% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(-200deg);\n -moz-transform: rotate(-200deg);\n -ms-transform: rotate(-200deg);\n -o-transform: rotate(-200deg);\n transform: rotate(-200deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-o-keyframes rotateIn {\n 0% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(-200deg);\n -moz-transform: rotate(-200deg);\n -ms-transform: rotate(-200deg);\n -o-transform: rotate(-200deg);\n transform: rotate(-200deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-ms-keyframes rotateIn {\n 0% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(-200deg);\n -moz-transform: rotate(-200deg);\n -ms-transform: rotate(-200deg);\n -o-transform: rotate(-200deg);\n transform: rotate(-200deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@keyframes rotateIn {\n 0% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(-200deg);\n -moz-transform: rotate(-200deg);\n -ms-transform: rotate(-200deg);\n -o-transform: rotate(-200deg);\n transform: rotate(-200deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: center center 50%;\n -moz-transform-origin: center center 50%;\n -ms-transform-origin: center center 50%;\n -o-transform-origin: center center 50%;\n transform-origin: center center 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-moz-keyframes rotateInDownLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-webkit-keyframes rotateInDownLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-o-keyframes rotateInDownLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-ms-keyframes rotateInDownLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@keyframes rotateInDownLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-moz-keyframes rotateInUpLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-webkit-keyframes rotateInUpLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-o-keyframes rotateInUpLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-ms-keyframes rotateInUpLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@keyframes rotateInUpLeft {\n 0% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: left bottom 50%;\n -moz-transform-origin: left bottom 50%;\n -ms-transform-origin: left bottom 50%;\n -o-transform-origin: left bottom 50%;\n transform-origin: left bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-moz-keyframes rotateInUpRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-webkit-keyframes rotateInUpRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-o-keyframes rotateInUpRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-ms-keyframes rotateInUpRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@keyframes rotateInUpRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-moz-keyframes rotateInDownRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-webkit-keyframes rotateInDownRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-o-keyframes rotateInDownRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-ms-keyframes rotateInDownRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@keyframes rotateInDownRight {\n 0% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n opacity: 0; }\n 100% {\n -webkit-transform-origin: right bottom 50%;\n -moz-transform-origin: right bottom 50%;\n -ms-transform-origin: right bottom 50%;\n -o-transform-origin: right bottom 50%;\n transform-origin: right bottom 50%;\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n opacity: 1; } }\n\n@-moz-keyframes hinge {\n 0% {\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 20%, 60% {\n -webkit-transform: rotate(80deg);\n -moz-transform: rotate(80deg);\n -ms-transform: rotate(80deg);\n -o-transform: rotate(80deg);\n transform: rotate(80deg);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 40% {\n -webkit-transform: rotate(60deg);\n -moz-transform: rotate(60deg);\n -ms-transform: rotate(60deg);\n -o-transform: rotate(60deg);\n transform: rotate(60deg);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 80% {\n -webkit-transform: rotate(60deg) translateY(0);\n -moz-transform: rotate(60deg) translateY(0);\n -ms-transform: rotate(60deg) translateY(0);\n -o-transform: rotate(60deg) translateY(0);\n transform: rotate(60deg) translateY(0);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 100% {\n -webkit-transform: translateY(700px);\n -moz-transform: translateY(700px);\n -ms-transform: translateY(700px);\n -o-transform: translateY(700px);\n transform: translateY(700px);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-webkit-keyframes hinge {\n 0% {\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 20%, 60% {\n -webkit-transform: rotate(80deg);\n -moz-transform: rotate(80deg);\n -ms-transform: rotate(80deg);\n -o-transform: rotate(80deg);\n transform: rotate(80deg);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 40% {\n -webkit-transform: rotate(60deg);\n -moz-transform: rotate(60deg);\n -ms-transform: rotate(60deg);\n -o-transform: rotate(60deg);\n transform: rotate(60deg);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 80% {\n -webkit-transform: rotate(60deg) translateY(0);\n -moz-transform: rotate(60deg) translateY(0);\n -ms-transform: rotate(60deg) translateY(0);\n -o-transform: rotate(60deg) translateY(0);\n transform: rotate(60deg) translateY(0);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 100% {\n -webkit-transform: translateY(700px);\n -moz-transform: translateY(700px);\n -ms-transform: translateY(700px);\n -o-transform: translateY(700px);\n transform: translateY(700px);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-o-keyframes hinge {\n 0% {\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 20%, 60% {\n -webkit-transform: rotate(80deg);\n -moz-transform: rotate(80deg);\n -ms-transform: rotate(80deg);\n -o-transform: rotate(80deg);\n transform: rotate(80deg);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 40% {\n -webkit-transform: rotate(60deg);\n -moz-transform: rotate(60deg);\n -ms-transform: rotate(60deg);\n -o-transform: rotate(60deg);\n transform: rotate(60deg);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 80% {\n -webkit-transform: rotate(60deg) translateY(0);\n -moz-transform: rotate(60deg) translateY(0);\n -ms-transform: rotate(60deg) translateY(0);\n -o-transform: rotate(60deg) translateY(0);\n transform: rotate(60deg) translateY(0);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 100% {\n -webkit-transform: translateY(700px);\n -moz-transform: translateY(700px);\n -ms-transform: translateY(700px);\n -o-transform: translateY(700px);\n transform: translateY(700px);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-ms-keyframes hinge {\n 0% {\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 20%, 60% {\n -webkit-transform: rotate(80deg);\n -moz-transform: rotate(80deg);\n -ms-transform: rotate(80deg);\n -o-transform: rotate(80deg);\n transform: rotate(80deg);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 40% {\n -webkit-transform: rotate(60deg);\n -moz-transform: rotate(60deg);\n -ms-transform: rotate(60deg);\n -o-transform: rotate(60deg);\n transform: rotate(60deg);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 80% {\n -webkit-transform: rotate(60deg) translateY(0);\n -moz-transform: rotate(60deg) translateY(0);\n -ms-transform: rotate(60deg) translateY(0);\n -o-transform: rotate(60deg) translateY(0);\n transform: rotate(60deg) translateY(0);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 100% {\n -webkit-transform: translateY(700px);\n -moz-transform: translateY(700px);\n -ms-transform: translateY(700px);\n -o-transform: translateY(700px);\n transform: translateY(700px);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@keyframes hinge {\n 0% {\n -webkit-transform: rotate(0);\n -moz-transform: rotate(0);\n -ms-transform: rotate(0);\n -o-transform: rotate(0);\n transform: rotate(0);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 20%, 60% {\n -webkit-transform: rotate(80deg);\n -moz-transform: rotate(80deg);\n -ms-transform: rotate(80deg);\n -o-transform: rotate(80deg);\n transform: rotate(80deg);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 40% {\n -webkit-transform: rotate(60deg);\n -moz-transform: rotate(60deg);\n -ms-transform: rotate(60deg);\n -o-transform: rotate(60deg);\n transform: rotate(60deg);\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 80% {\n -webkit-transform: rotate(60deg) translateY(0);\n -moz-transform: rotate(60deg) translateY(0);\n -ms-transform: rotate(60deg) translateY(0);\n -o-transform: rotate(60deg) translateY(0);\n transform: rotate(60deg) translateY(0);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform-origin: top left 50%;\n -moz-transform-origin: top left 50%;\n -ms-transform-origin: top left 50%;\n -o-transform-origin: top left 50%;\n transform-origin: top left 50%;\n -webkit-animation-timing-function: ease-in-out;\n -moz-animation-timing-function: ease-in-out;\n -ms-animation-timing-function: ease-in-out;\n -o-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out; }\n 100% {\n -webkit-transform: translateY(700px);\n -moz-transform: translateY(700px);\n -ms-transform: translateY(700px);\n -o-transform: translateY(700px);\n transform: translateY(700px);\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; } }\n\n@-moz-keyframes rollIn {\n 0% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0;\n -webkit-transform: translateX(-100%) rotate(-120deg);\n -moz-transform: translateX(-100%) rotate(-120deg);\n -ms-transform: translateX(-100%) rotate(-120deg);\n -o-transform: translateX(-100%) rotate(-120deg);\n transform: translateX(-100%) rotate(-120deg); }\n 100% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform: translateX(0px) rotate(0deg);\n -moz-transform: translateX(0px) rotate(0deg);\n -ms-transform: translateX(0px) rotate(0deg);\n -o-transform: translateX(0px) rotate(0deg);\n transform: translateX(0px) rotate(0deg); } }\n\n@-webkit-keyframes rollIn {\n 0% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0;\n -webkit-transform: translateX(-100%) rotate(-120deg);\n -moz-transform: translateX(-100%) rotate(-120deg);\n -ms-transform: translateX(-100%) rotate(-120deg);\n -o-transform: translateX(-100%) rotate(-120deg);\n transform: translateX(-100%) rotate(-120deg); }\n 100% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform: translateX(0px) rotate(0deg);\n -moz-transform: translateX(0px) rotate(0deg);\n -ms-transform: translateX(0px) rotate(0deg);\n -o-transform: translateX(0px) rotate(0deg);\n transform: translateX(0px) rotate(0deg); } }\n\n@-o-keyframes rollIn {\n 0% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0;\n -webkit-transform: translateX(-100%) rotate(-120deg);\n -moz-transform: translateX(-100%) rotate(-120deg);\n -ms-transform: translateX(-100%) rotate(-120deg);\n -o-transform: translateX(-100%) rotate(-120deg);\n transform: translateX(-100%) rotate(-120deg); }\n 100% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform: translateX(0px) rotate(0deg);\n -moz-transform: translateX(0px) rotate(0deg);\n -ms-transform: translateX(0px) rotate(0deg);\n -o-transform: translateX(0px) rotate(0deg);\n transform: translateX(0px) rotate(0deg); } }\n\n@-ms-keyframes rollIn {\n 0% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0;\n -webkit-transform: translateX(-100%) rotate(-120deg);\n -moz-transform: translateX(-100%) rotate(-120deg);\n -ms-transform: translateX(-100%) rotate(-120deg);\n -o-transform: translateX(-100%) rotate(-120deg);\n transform: translateX(-100%) rotate(-120deg); }\n 100% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform: translateX(0px) rotate(0deg);\n -moz-transform: translateX(0px) rotate(0deg);\n -ms-transform: translateX(0px) rotate(0deg);\n -o-transform: translateX(0px) rotate(0deg);\n transform: translateX(0px) rotate(0deg); } }\n\n@keyframes rollIn {\n 0% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0;\n -webkit-transform: translateX(-100%) rotate(-120deg);\n -moz-transform: translateX(-100%) rotate(-120deg);\n -ms-transform: translateX(-100%) rotate(-120deg);\n -o-transform: translateX(-100%) rotate(-120deg);\n transform: translateX(-100%) rotate(-120deg); }\n 100% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform: translateX(0px) rotate(0deg);\n -moz-transform: translateX(0px) rotate(0deg);\n -ms-transform: translateX(0px) rotate(0deg);\n -o-transform: translateX(0px) rotate(0deg);\n transform: translateX(0px) rotate(0deg); } }\n\n@-moz-keyframes rollOut {\n 0% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform: translateX(0px) rotate(0deg);\n -moz-transform: translateX(0px) rotate(0deg);\n -ms-transform: translateX(0px) rotate(0deg);\n -o-transform: translateX(0px) rotate(0deg);\n transform: translateX(0px) rotate(0deg); }\n 100% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0;\n -webkit-transform: translateX(-100%) rotate(-120deg);\n -moz-transform: translateX(-100%) rotate(-120deg);\n -ms-transform: translateX(-100%) rotate(-120deg);\n -o-transform: translateX(-100%) rotate(-120deg);\n transform: translateX(-100%) rotate(-120deg); } }\n\n@-webkit-keyframes rollOut {\n 0% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform: translateX(0px) rotate(0deg);\n -moz-transform: translateX(0px) rotate(0deg);\n -ms-transform: translateX(0px) rotate(0deg);\n -o-transform: translateX(0px) rotate(0deg);\n transform: translateX(0px) rotate(0deg); }\n 100% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0;\n -webkit-transform: translateX(-100%) rotate(-120deg);\n -moz-transform: translateX(-100%) rotate(-120deg);\n -ms-transform: translateX(-100%) rotate(-120deg);\n -o-transform: translateX(-100%) rotate(-120deg);\n transform: translateX(-100%) rotate(-120deg); } }\n\n@-o-keyframes rollOut {\n 0% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform: translateX(0px) rotate(0deg);\n -moz-transform: translateX(0px) rotate(0deg);\n -ms-transform: translateX(0px) rotate(0deg);\n -o-transform: translateX(0px) rotate(0deg);\n transform: translateX(0px) rotate(0deg); }\n 100% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0;\n -webkit-transform: translateX(-100%) rotate(-120deg);\n -moz-transform: translateX(-100%) rotate(-120deg);\n -ms-transform: translateX(-100%) rotate(-120deg);\n -o-transform: translateX(-100%) rotate(-120deg);\n transform: translateX(-100%) rotate(-120deg); } }\n\n@-ms-keyframes rollOut {\n 0% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform: translateX(0px) rotate(0deg);\n -moz-transform: translateX(0px) rotate(0deg);\n -ms-transform: translateX(0px) rotate(0deg);\n -o-transform: translateX(0px) rotate(0deg);\n transform: translateX(0px) rotate(0deg); }\n 100% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0;\n -webkit-transform: translateX(-100%) rotate(-120deg);\n -moz-transform: translateX(-100%) rotate(-120deg);\n -ms-transform: translateX(-100%) rotate(-120deg);\n -o-transform: translateX(-100%) rotate(-120deg);\n transform: translateX(-100%) rotate(-120deg); } }\n\n@keyframes rollOut {\n 0% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n opacity: 1;\n -webkit-transform: translateX(0px) rotate(0deg);\n -moz-transform: translateX(0px) rotate(0deg);\n -ms-transform: translateX(0px) rotate(0deg);\n -o-transform: translateX(0px) rotate(0deg);\n transform: translateX(0px) rotate(0deg); }\n 100% {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0;\n -webkit-transform: translateX(-100%) rotate(-120deg);\n -moz-transform: translateX(-100%) rotate(-120deg);\n -ms-transform: translateX(-100%) rotate(-120deg);\n -o-transform: translateX(-100%) rotate(-120deg);\n transform: translateX(-100%) rotate(-120deg); } }\n\n/*-------------------------------------------------------------------*/\n/* === Boostrap Main SCSS === */\n/*!\n * Bootstrap v5.1.3 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --bs-blue: #5E50F9;\n --bs-indigo: #6610f2;\n --bs-purple: #6a008a;\n --bs-pink: #E91E63;\n --bs-red: #f96868;\n --bs-orange: #f2a654;\n --bs-yellow: #f6e84e;\n --bs-green: #46c35f;\n --bs-teal: #58d8a3;\n --bs-cyan: #57c7d4;\n --bs-white: #ffffff;\n --bs-gray: #434a54;\n --bs-gray-light: #aab2bd;\n --bs-gray-lighter: #e8eff4;\n --bs-gray-lightest: #e6e9ed;\n --bs-gray-dark: #0f1531;\n --bs-black: #000000;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #b66dff;\n --bs-secondary: #c3bdbd;\n --bs-success: #1bcfb4;\n --bs-info: #198ae3;\n --bs-warning: #fed713;\n --bs-danger: #fe7c96;\n --bs-light: #f8f9fa;\n --bs-dark: #3e4b5b;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-body-color-rgb: 52, 58, 64;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #343a40;\n --bs-body-bg: #fff; }\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; }\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth; } }\n\nbody {\n margin: 0;\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }\n\nhr {\n margin: 1rem 0;\n color: inherit;\n background-color: currentColor;\n border: 0;\n opacity: 0.25; }\n\nhr:not([size]) {\n height: 1px; }\n\nh1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2; }\n\nh1, .h1 {\n font-size: calc(1.375rem + 1.5vw); }\n @media (min-width: 1200px) {\n h1, .h1 {\n font-size: 2.5rem; } }\n\nh2, .h2 {\n font-size: calc(1.325rem + 0.9vw); }\n @media (min-width: 1200px) {\n h2, .h2 {\n font-size: 2rem; } }\n\nh3, .h3 {\n font-size: calc(1.3rem + 0.6vw); }\n @media (min-width: 1200px) {\n h3, .h3 {\n font-size: 1.75rem; } }\n\nh4, .h4 {\n font-size: calc(1.275rem + 0.3vw); }\n @media (min-width: 1200px) {\n h4, .h4 {\n font-size: 1.5rem; } }\n\nh5, .h5 {\n font-size: 1.25rem; }\n\nh6, .h6 {\n font-size: 1rem; }\n\np {\n margin-top: 0;\n margin-bottom: 1rem; }\n\nabbr[title],\nabbr[data-bs-original-title] {\n text-decoration: underline dotted;\n cursor: help;\n text-decoration-skip-ink: none; }\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit; }\n\nol,\nul {\n padding-left: 2rem; }\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem; }\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0; }\n\ndt {\n font-weight: 700; }\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; }\n\nblockquote {\n margin: 0 0 1rem; }\n\nb,\nstrong {\n font-weight: bolder; }\n\nsmall, .small {\n font-size: 0.875em; }\n\nmark, .mark {\n padding: 0.2em;\n background-color: #fcf8e3; }\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline; }\n\nsub {\n bottom: -.25em; }\n\nsup {\n top: -.5em; }\n\na {\n color: #0d6efd;\n text-decoration: underline; }\n a:hover {\n color: #0a58ca; }\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none; }\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n direction: ltr /* rtl:ignore */;\n unicode-bidi: bidi-override; }\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n font-size: 0.875em; }\n pre code {\n font-size: inherit;\n color: inherit;\n word-break: normal; }\n\ncode {\n font-size: 0.875em;\n color: #d63384;\n word-wrap: break-word; }\n a > code {\n color: inherit; }\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 0.875em;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem; }\n kbd kbd {\n padding: 0;\n font-size: 1em;\n font-weight: 700; }\n\nfigure {\n margin: 0 0 1rem; }\n\nimg,\nsvg {\n vertical-align: middle; }\n\ntable {\n caption-side: bottom;\n border-collapse: collapse; }\n\ncaption {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: #6c757d;\n text-align: left; }\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent; }\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0; }\n\nlabel {\n display: inline-block; }\n\nbutton {\n border-radius: 0; }\n\nbutton:focus:not(:focus-visible) {\n outline: 0; }\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit; }\n\nbutton,\nselect {\n text-transform: none; }\n\n[role=\"button\"] {\n cursor: pointer; }\n\nselect {\n word-wrap: normal; }\n select:disabled {\n opacity: 1; }\n\n[list]::-webkit-calendar-picker-indicator {\n display: none; }\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; }\n button:not(:disabled),\n [type=\"button\"]:not(:disabled),\n [type=\"reset\"]:not(:disabled),\n [type=\"submit\"]:not(:disabled) {\n cursor: pointer; }\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none; }\n\ntextarea {\n resize: vertical; }\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0; }\n\nlegend {\n float: left;\n width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n font-size: calc(1.275rem + 0.3vw);\n line-height: inherit; }\n @media (min-width: 1200px) {\n legend {\n font-size: 1.5rem; } }\n legend + * {\n clear: left; }\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0; }\n\n::-webkit-inner-spin-button {\n height: auto; }\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: textfield; }\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none; }\n\n::-webkit-color-swatch-wrapper {\n padding: 0; }\n\n::file-selector-button {\n font: inherit; }\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button; }\n\noutput {\n display: inline-block; }\n\niframe {\n border: 0; }\n\nsummary {\n display: list-item;\n cursor: pointer; }\n\nprogress {\n vertical-align: baseline; }\n\n[hidden] {\n display: none !important; }\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300; }\n\n.display-1 {\n font-size: calc(1.625rem + 4.5vw);\n font-weight: 300;\n line-height: 1.2; }\n @media (min-width: 1200px) {\n .display-1 {\n font-size: 5rem; } }\n\n.display-2 {\n font-size: calc(1.575rem + 3.9vw);\n font-weight: 300;\n line-height: 1.2; }\n @media (min-width: 1200px) {\n .display-2 {\n font-size: 4.5rem; } }\n\n.display-3 {\n font-size: calc(1.525rem + 3.3vw);\n font-weight: 300;\n line-height: 1.2; }\n @media (min-width: 1200px) {\n .display-3 {\n font-size: 4rem; } }\n\n.display-4 {\n font-size: calc(1.475rem + 2.7vw);\n font-weight: 300;\n line-height: 1.2; }\n @media (min-width: 1200px) {\n .display-4 {\n font-size: 3.5rem; } }\n\n.display-5 {\n font-size: calc(1.425rem + 2.1vw);\n font-weight: 300;\n line-height: 1.2; }\n @media (min-width: 1200px) {\n .display-5 {\n font-size: 3rem; } }\n\n.display-6 {\n font-size: calc(1.375rem + 1.5vw);\n font-weight: 300;\n line-height: 1.2; }\n @media (min-width: 1200px) {\n .display-6 {\n font-size: 2.5rem; } }\n\n.list-unstyled {\n padding-left: 0;\n list-style: none; }\n\n.list-inline {\n padding-left: 0;\n list-style: none; }\n\n.list-inline-item {\n display: inline-block; }\n .list-inline-item:not(:last-child) {\n margin-right: 0.5rem; }\n\n.initialism {\n font-size: 0.875em;\n text-transform: uppercase; }\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem; }\n .blockquote > :last-child {\n margin-bottom: 0; }\n\n.blockquote-footer {\n margin-top: -1rem;\n margin-bottom: 1rem;\n font-size: 0.875em;\n color: #6c757d; }\n .blockquote-footer::before {\n content: \"\\2014\\00A0\"; }\n\n.img-fluid {\n max-width: 100%;\n height: auto; }\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto; }\n\n.figure {\n display: inline-block; }\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1; }\n\n.figure-caption {\n font-size: 0.875em;\n color: #6c757d; }\n\n.container,\n.container-fluid,\n.container-sm,\n.container-md,\n.container-lg,\n.container-xl,\n.container-xxl {\n width: 100%;\n padding-right: var(--bs-gutter-x, 0.75rem);\n padding-left: var(--bs-gutter-x, 0.75rem);\n margin-right: auto;\n margin-left: auto; }\n\n@media (min-width: 576px) {\n .container, .container-sm {\n max-width: 540px; } }\n\n@media (min-width: 768px) {\n .container, .container-sm, .container-md {\n max-width: 720px; } }\n\n@media (min-width: 992px) {\n .container, .container-sm, .container-md, .container-lg {\n max-width: 960px; } }\n\n@media (min-width: 1200px) {\n .container, .container-sm, .container-md, .container-lg, .container-xl {\n max-width: 1140px; } }\n\n@media (min-width: 1400px) {\n .container, .container-sm, .container-md, .container-lg, .container-xl, .container-xxl {\n max-width: 1320px; } }\n\n.row {\n --bs-gutter-x: 40px;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-.5 * var(--bs-gutter-x));\n margin-left: calc(-.5 * var(--bs-gutter-x)); }\n .row > * {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * .5);\n padding-left: calc(var(--bs-gutter-x) * .5);\n margin-top: var(--bs-gutter-y); }\n\n.col {\n flex: 1 0 0%; }\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto; }\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%; }\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%; }\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333%; }\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%; }\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%; }\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66667%; }\n\n.col-auto {\n flex: 0 0 auto;\n width: auto; }\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333%; }\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66667%; }\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%; }\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333%; }\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66667%; }\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%; }\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333%; }\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66667%; }\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%; }\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333%; }\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66667%; }\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%; }\n\n.offset-1 {\n margin-left: 8.33333%; }\n\n.offset-2 {\n margin-left: 16.66667%; }\n\n.offset-3 {\n margin-left: 25%; }\n\n.offset-4 {\n margin-left: 33.33333%; }\n\n.offset-5 {\n margin-left: 41.66667%; }\n\n.offset-6 {\n margin-left: 50%; }\n\n.offset-7 {\n margin-left: 58.33333%; }\n\n.offset-8 {\n margin-left: 66.66667%; }\n\n.offset-9 {\n margin-left: 75%; }\n\n.offset-10 {\n margin-left: 83.33333%; }\n\n.offset-11 {\n margin-left: 91.66667%; }\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0; }\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0; }\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem; }\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem; }\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem; }\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem; }\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem; }\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem; }\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem; }\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem; }\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem; }\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem; }\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%; }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto; }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%; }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%; }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333%; }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%; }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%; }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66667%; }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto; }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333%; }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66667%; }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%; }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333%; }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66667%; }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%; }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333%; }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66667%; }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%; }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333%; }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66667%; }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%; }\n .offset-sm-0 {\n margin-left: 0; }\n .offset-sm-1 {\n margin-left: 8.33333%; }\n .offset-sm-2 {\n margin-left: 16.66667%; }\n .offset-sm-3 {\n margin-left: 25%; }\n .offset-sm-4 {\n margin-left: 33.33333%; }\n .offset-sm-5 {\n margin-left: 41.66667%; }\n .offset-sm-6 {\n margin-left: 50%; }\n .offset-sm-7 {\n margin-left: 58.33333%; }\n .offset-sm-8 {\n margin-left: 66.66667%; }\n .offset-sm-9 {\n margin-left: 75%; }\n .offset-sm-10 {\n margin-left: 83.33333%; }\n .offset-sm-11 {\n margin-left: 91.66667%; }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0; }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0; }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem; }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem; }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem; }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem; }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem; }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem; }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem; }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem; }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem; }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem; } }\n\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%; }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto; }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%; }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%; }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333%; }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%; }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%; }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66667%; }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto; }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333%; }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66667%; }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%; }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333%; }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66667%; }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%; }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333%; }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66667%; }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%; }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333%; }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66667%; }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%; }\n .offset-md-0 {\n margin-left: 0; }\n .offset-md-1 {\n margin-left: 8.33333%; }\n .offset-md-2 {\n margin-left: 16.66667%; }\n .offset-md-3 {\n margin-left: 25%; }\n .offset-md-4 {\n margin-left: 33.33333%; }\n .offset-md-5 {\n margin-left: 41.66667%; }\n .offset-md-6 {\n margin-left: 50%; }\n .offset-md-7 {\n margin-left: 58.33333%; }\n .offset-md-8 {\n margin-left: 66.66667%; }\n .offset-md-9 {\n margin-left: 75%; }\n .offset-md-10 {\n margin-left: 83.33333%; }\n .offset-md-11 {\n margin-left: 91.66667%; }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0; }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0; }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem; }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem; }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem; }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem; }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem; }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem; }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem; }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem; }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem; }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem; } }\n\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%; }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto; }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%; }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%; }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333%; }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%; }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%; }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66667%; }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto; }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333%; }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66667%; }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%; }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333%; }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66667%; }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%; }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333%; }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66667%; }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%; }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333%; }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66667%; }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%; }\n .offset-lg-0 {\n margin-left: 0; }\n .offset-lg-1 {\n margin-left: 8.33333%; }\n .offset-lg-2 {\n margin-left: 16.66667%; }\n .offset-lg-3 {\n margin-left: 25%; }\n .offset-lg-4 {\n margin-left: 33.33333%; }\n .offset-lg-5 {\n margin-left: 41.66667%; }\n .offset-lg-6 {\n margin-left: 50%; }\n .offset-lg-7 {\n margin-left: 58.33333%; }\n .offset-lg-8 {\n margin-left: 66.66667%; }\n .offset-lg-9 {\n margin-left: 75%; }\n .offset-lg-10 {\n margin-left: 83.33333%; }\n .offset-lg-11 {\n margin-left: 91.66667%; }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0; }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0; }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem; }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem; }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem; }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem; }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem; }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem; }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem; }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem; }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem; }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem; } }\n\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%; }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto; }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%; }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%; }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333%; }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%; }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%; }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66667%; }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto; }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333%; }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66667%; }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%; }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333%; }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66667%; }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%; }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333%; }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66667%; }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%; }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333%; }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66667%; }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%; }\n .offset-xl-0 {\n margin-left: 0; }\n .offset-xl-1 {\n margin-left: 8.33333%; }\n .offset-xl-2 {\n margin-left: 16.66667%; }\n .offset-xl-3 {\n margin-left: 25%; }\n .offset-xl-4 {\n margin-left: 33.33333%; }\n .offset-xl-5 {\n margin-left: 41.66667%; }\n .offset-xl-6 {\n margin-left: 50%; }\n .offset-xl-7 {\n margin-left: 58.33333%; }\n .offset-xl-8 {\n margin-left: 66.66667%; }\n .offset-xl-9 {\n margin-left: 75%; }\n .offset-xl-10 {\n margin-left: 83.33333%; }\n .offset-xl-11 {\n margin-left: 91.66667%; }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0; }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0; }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem; }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem; }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem; }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem; }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem; }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem; }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem; }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem; }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem; }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem; } }\n\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%; }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto; }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%; }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%; }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333%; }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%; }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%; }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66667%; }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto; }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333%; }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66667%; }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%; }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333%; }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66667%; }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%; }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333%; }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66667%; }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%; }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333%; }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66667%; }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%; }\n .offset-xxl-0 {\n margin-left: 0; }\n .offset-xxl-1 {\n margin-left: 8.33333%; }\n .offset-xxl-2 {\n margin-left: 16.66667%; }\n .offset-xxl-3 {\n margin-left: 25%; }\n .offset-xxl-4 {\n margin-left: 33.33333%; }\n .offset-xxl-5 {\n margin-left: 41.66667%; }\n .offset-xxl-6 {\n margin-left: 50%; }\n .offset-xxl-7 {\n margin-left: 58.33333%; }\n .offset-xxl-8 {\n margin-left: 66.66667%; }\n .offset-xxl-9 {\n margin-left: 75%; }\n .offset-xxl-10 {\n margin-left: 83.33333%; }\n .offset-xxl-11 {\n margin-left: 91.66667%; }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0; }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0; }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem; }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem; }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem; }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem; }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem; }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem; }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem; }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem; }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem; }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem; } }\n\n.table {\n --bs-table-bg: transparent;\n --bs-table-accent-bg: transparent;\n --bs-table-striped-color: #212529;\n --bs-table-striped-bg: rgba(0, 0, 0, 0.05);\n --bs-table-active-color: #212529;\n --bs-table-active-bg: rgba(0, 0, 0, 0.1);\n --bs-table-hover-color: #212529;\n --bs-table-hover-bg: #f2edf3;\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n vertical-align: top;\n border-color: #ebedf2; }\n .table > :not(caption) > * > * {\n padding: 0.5rem 0.5rem;\n background-color: var(--bs-table-bg);\n border-bottom-width: 1px;\n box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); }\n .table > tbody {\n vertical-align: inherit; }\n .table > thead {\n vertical-align: bottom; }\n .table > :not(:first-child) {\n border-top: 2px solid currentColor; }\n\n.caption-top {\n caption-side: top; }\n\n.table-sm > :not(caption) > * > * {\n padding: 0.25rem 0.25rem; }\n\n.table-bordered > :not(caption) > * {\n border-width: 1px 0; }\n .table-bordered > :not(caption) > * > * {\n border-width: 0 1px; }\n\n.table-borderless > :not(caption) > * > * {\n border-bottom-width: 0; }\n\n.table-borderless > :not(:first-child) {\n border-top-width: 0; }\n\n.table-striped > tbody > tr:nth-of-type(odd) > * {\n --bs-table-accent-bg: var(--bs-table-striped-bg);\n color: var(--bs-table-striped-color); }\n\n.table-active {\n --bs-table-accent-bg: var(--bs-table-active-bg);\n color: var(--bs-table-active-color); }\n\n.table-hover > tbody > tr:hover > * {\n --bs-table-accent-bg: var(--bs-table-hover-bg);\n color: var(--bs-table-hover-color); }\n\n.table-primary {\n --bs-table-bg: #cfe2ff;\n --bs-table-striped-bg: #c5d7f2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bacbe6;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfd1ec;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #bacbe6; }\n\n.table-secondary {\n --bs-table-bg: #e2e3e5;\n --bs-table-striped-bg: #d7d8da;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #cbccce;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #d1d2d4;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #cbccce; }\n\n.table-success {\n --bs-table-bg: #d1e7dd;\n --bs-table-striped-bg: #c7dbd2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bcd0c7;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #c1d6cc;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #bcd0c7; }\n\n.table-info {\n --bs-table-bg: #cff4fc;\n --bs-table-striped-bg: #c5e8ef;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #badce3;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfe2e9;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #badce3; }\n\n.table-warning {\n --bs-table-bg: #fff3cd;\n --bs-table-striped-bg: #f2e7c3;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #e6dbb9;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #ece1be;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #e6dbb9; }\n\n.table-danger {\n --bs-table-bg: #f8d7da;\n --bs-table-striped-bg: #eccccf;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfc2c4;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5c7ca;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #dfc2c4; }\n\n.table-light {\n --bs-table-bg: #f8f9fa;\n --bs-table-striped-bg: #ecedee;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfe0e1;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5e6e7;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #dfe0e1; }\n\n.table-dark {\n --bs-table-bg: #212529;\n --bs-table-striped-bg: #2c3034;\n --bs-table-striped-color: #fff;\n --bs-table-active-bg: #373b3e;\n --bs-table-active-color: #fff;\n --bs-table-hover-bg: #323539;\n --bs-table-hover-color: #fff;\n color: #fff;\n border-color: #373b3e; }\n\n.table-responsive {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch; }\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch; } }\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch; } }\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch; } }\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch; } }\n\n@media (max-width: 1399.98px) {\n .table-responsive-xxl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch; } }\n\n.form-label {\n margin-bottom: 0.5rem; }\n\n.col-form-label {\n padding-top: calc(0.94rem + 1px);\n padding-bottom: calc(0.94rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1; }\n\n.col-form-label-lg {\n padding-top: calc(0.94rem + 1px);\n padding-bottom: calc(0.94rem + 1px);\n font-size: 1.25rem; }\n\n.col-form-label-sm {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 0.875rem; }\n\n.form-text {\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #6c757d; }\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.94rem 1.375rem;\n font-size: 0.8125rem;\n font-weight: 400;\n line-height: 1;\n color: #212529;\n background-color: color(white);\n background-clip: padding-box;\n border: 1px solid #ced4da;\n appearance: none;\n border-radius: 2px;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none; } }\n .form-control[type=\"file\"] {\n overflow: hidden; }\n .form-control[type=\"file\"]:not(:disabled):not([readonly]) {\n cursor: pointer; }\n .form-control:focus {\n color: #212529;\n background-color: #fff;\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); }\n .form-control::-webkit-date-and-time-value {\n height: 1em; }\n .form-control::placeholder {\n color: #c9c8c8;\n opacity: 1; }\n .form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1; }\n .form-control::file-selector-button {\n padding: 0.94rem 1.375rem;\n margin: -0.94rem -1.375rem;\n margin-inline-end: 1.375rem;\n color: #212529;\n background-color: #e9ecef;\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: 1px;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .form-control::file-selector-button {\n transition: none; } }\n .form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n background-color: #dde0e3; }\n .form-control::-webkit-file-upload-button {\n padding: 0.94rem 1.375rem;\n margin: -0.94rem -1.375rem;\n margin-inline-end: 1.375rem;\n color: #212529;\n background-color: #e9ecef;\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: 1px;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .form-control::-webkit-file-upload-button {\n transition: none; } }\n .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: #dde0e3; }\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: 0.94rem 0;\n margin-bottom: 0;\n line-height: 1;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0; }\n .form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0; }\n\n.form-control-sm {\n min-height: 2.575rem;\n padding: 0.5rem 0.81rem;\n font-size: 0.875rem;\n border-radius: 0.2rem; }\n .form-control-sm::file-selector-button {\n padding: 0.5rem 0.81rem;\n margin: -0.5rem -0.81rem;\n margin-inline-end: 0.81rem; }\n .form-control-sm::-webkit-file-upload-button {\n padding: 0.5rem 0.81rem;\n margin: -0.5rem -0.81rem;\n margin-inline-end: 0.81rem; }\n\n.form-control-lg {\n min-height: 3.175rem;\n padding: 0.94rem 1.94rem;\n font-size: 1.25rem;\n border-radius: 0.3rem; }\n .form-control-lg::file-selector-button {\n padding: 0.94rem 1.94rem;\n margin: -0.94rem -1.94rem;\n margin-inline-end: 1.94rem; }\n .form-control-lg::-webkit-file-upload-button {\n padding: 0.94rem 1.94rem;\n margin: -0.94rem -1.94rem;\n margin-inline-end: 1.94rem; }\n\ntextarea.form-control {\n min-height: 2.875rem; }\n\ntextarea.form-control-sm {\n min-height: 2.575rem; }\n\ntextarea.form-control-lg {\n min-height: 3.175rem; }\n\n.form-control-color {\n width: 3rem;\n height: auto;\n padding: 0.94rem; }\n .form-control-color:not(:disabled):not([readonly]) {\n cursor: pointer; }\n .form-control-color::-moz-color-swatch {\n height: 1em;\n border-radius: 2px; }\n .form-control-color::-webkit-color-swatch {\n height: 1em;\n border-radius: 2px; }\n\n.form-select {\n display: block;\n width: 100%;\n padding: 0.375rem 2.25rem 0.375rem 0.75rem;\n -moz-padding-start: calc(0.75rem - 3px);\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right 0.75rem center;\n background-size: 16px 12px;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none; }\n @media (prefers-reduced-motion: reduce) {\n .form-select {\n transition: none; } }\n .form-select:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); }\n .form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n padding-right: 0.75rem;\n background-image: none; }\n .form-select:disabled {\n background-color: #e9ecef; }\n .form-select:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 #212529; }\n\n.form-select-sm {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem; }\n\n.form-select-lg {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem; }\n\n.form-check {\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5em;\n margin-bottom: 0.125rem; }\n .form-check .form-check-input {\n float: left;\n margin-left: -1.5em; }\n\n.form-check-input {\n width: 1em;\n height: 1em;\n margin-top: 0.25em;\n vertical-align: top;\n background-color: #fff;\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: 1px solid rgba(0, 0, 0, 0.25);\n appearance: none;\n color-adjust: exact; }\n .form-check-input[type=\"checkbox\"] {\n border-radius: 0.25em; }\n .form-check-input[type=\"radio\"] {\n border-radius: 50%; }\n .form-check-input:active {\n filter: brightness(90%); }\n .form-check-input:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); }\n .form-check-input:checked {\n background-color: #0d6efd;\n border-color: #0d6efd; }\n .form-check-input:checked[type=\"checkbox\"] {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e\"); }\n .form-check-input:checked[type=\"radio\"] {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e\"); }\n .form-check-input[type=\"checkbox\"]:indeterminate {\n background-color: #0d6efd;\n border-color: #0d6efd;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e\"); }\n .form-check-input:disabled {\n pointer-events: none;\n filter: none;\n opacity: 0.5; }\n .form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n opacity: 0.5; }\n\n.form-switch {\n padding-left: 2.5em; }\n .form-switch .form-check-input {\n width: 2em;\n margin-left: -2.5em;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e\");\n background-position: left center;\n border-radius: 2em;\n transition: background-position 0.15s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .form-switch .form-check-input {\n transition: none; } }\n .form-switch .form-check-input:focus {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e\"); }\n .form-switch .form-check-input:checked {\n background-position: right center;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\"); }\n\n.form-check-inline {\n display: inline-block;\n margin-right: 1rem; }\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none; }\n .btn-check[disabled] + .btn, .btn-check:disabled + .btn {\n pointer-events: none;\n filter: none;\n opacity: 0.65; }\n\n.form-range {\n width: 100%;\n height: 1.5rem;\n padding: 0;\n background-color: transparent;\n appearance: none; }\n .form-range:focus {\n outline: 0; }\n .form-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); }\n .form-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); }\n .form-range::-moz-focus-outer {\n border: 0; }\n .form-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none; }\n @media (prefers-reduced-motion: reduce) {\n .form-range::-webkit-slider-thumb {\n transition: none; } }\n .form-range::-webkit-slider-thumb:active {\n background-color: #b6d4fe; }\n .form-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem; }\n .form-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none; }\n @media (prefers-reduced-motion: reduce) {\n .form-range::-moz-range-thumb {\n transition: none; } }\n .form-range::-moz-range-thumb:active {\n background-color: #b6d4fe; }\n .form-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem; }\n .form-range:disabled {\n pointer-events: none; }\n .form-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd; }\n .form-range:disabled::-moz-range-thumb {\n background-color: #adb5bd; }\n\n.form-floating {\n position: relative; }\n .form-floating > .form-control,\n .form-floating > .form-select {\n height: calc(3.5rem + 2px);\n line-height: 1.25; }\n .form-floating > label {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n padding: 1rem 0.75rem;\n pointer-events: none;\n border: 1px solid transparent;\n transform-origin: 0 0;\n transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .form-floating > label {\n transition: none; } }\n .form-floating > .form-control {\n padding: 1rem 0.75rem; }\n .form-floating > .form-control::placeholder {\n color: transparent; }\n .form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem; }\n .form-floating > .form-control:-webkit-autofill {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem; }\n .form-floating > .form-select {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem; }\n .form-floating > .form-control:focus ~ label,\n .form-floating > .form-control:not(:placeholder-shown) ~ label,\n .form-floating > .form-select ~ label {\n opacity: 0.65;\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); }\n .form-floating > .form-control:-webkit-autofill ~ label {\n opacity: 0.65;\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); }\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%; }\n .input-group > .form-control,\n .input-group > .form-select {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n min-width: 0; }\n .input-group > .form-control:focus,\n .input-group > .form-select:focus {\n z-index: 3; }\n .input-group .btn {\n position: relative;\n z-index: 2; }\n .input-group .btn:focus {\n z-index: 3; }\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n font-size: 0.8125rem;\n font-weight: 400;\n line-height: 1;\n color: #212529;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 2px; }\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n padding: 0.94rem 1.94rem;\n font-size: 1.25rem;\n border-radius: 0.3rem; }\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n padding: 0.5rem 0.81rem;\n font-size: 0.875rem;\n border-radius: 0.2rem; }\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n padding-right: 3rem; }\n\n.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.input-group.has-validation > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group.has-validation > .dropdown-toggle:nth-last-child(n + 4) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n margin-left: -1px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0; }\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #198754; }\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: rgba(25, 135, 84, 0.9);\n border-radius: 0.25rem; }\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n display: block; }\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #198754;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }\n .was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #198754;\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); }\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); }\n\n.was-validated .form-select:valid, .form-select.is-valid {\n border-color: #198754; }\n .was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size=\"1\"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size=\"1\"] {\n padding-right: 4.125rem;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\"), url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }\n .was-validated .form-select:valid:focus, .form-select.is-valid:focus {\n border-color: #198754;\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); }\n\n.was-validated .form-check-input:valid, .form-check-input.is-valid {\n border-color: #198754; }\n .was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {\n background-color: #198754; }\n .was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); }\n .was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #198754; }\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n margin-left: .5em; }\n\n.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid, .was-validated\n.input-group .form-select:valid,\n.input-group .form-select.is-valid {\n z-index: 1; }\n .was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus, .was-validated\n .input-group .form-select:valid:focus,\n .input-group .form-select.is-valid:focus {\n z-index: 3; }\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #dc3545; }\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem; }\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n display: block; }\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }\n .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); }\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); }\n\n.was-validated .form-select:invalid, .form-select.is-invalid {\n border-color: #dc3545; }\n .was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size=\"1\"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size=\"1\"] {\n padding-right: 4.125rem;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\"), url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }\n .was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); }\n\n.was-validated .form-check-input:invalid, .form-check-input.is-invalid {\n border-color: #dc3545; }\n .was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {\n background-color: #dc3545; }\n .was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); }\n .was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545; }\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n margin-left: .5em; }\n\n.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid, .was-validated\n.input-group .form-select:invalid,\n.input-group .form-select.is-invalid {\n z-index: 2; }\n .was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus, .was-validated\n .input-group .form-select:invalid:focus,\n .input-group .form-select.is-invalid:focus {\n z-index: 3; }\n\n.btn {\n display: inline-block;\n font-weight: 400;\n line-height: 1;\n color: #343a40;\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n cursor: pointer;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.875rem 2.5rem;\n font-size: 0.875rem;\n border-radius: 0.1875rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none; } }\n .btn:hover {\n color: #343a40; }\n .btn-check:focus + .btn, .btn:focus {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); }\n .btn:disabled, .btn.disabled,\n fieldset:disabled .btn {\n pointer-events: none;\n opacity: 0.65; }\n\n.btn-primary {\n color: #000;\n background-color: #b66dff;\n border-color: #b66dff; }\n .btn-primary:hover {\n color: #000;\n background-color: #c183ff;\n border-color: #bd7cff; }\n .btn-check:focus + .btn-primary, .btn-primary:focus {\n color: #000;\n background-color: #c183ff;\n border-color: #bd7cff;\n box-shadow: 0 0 0 0.25rem rgba(155, 93, 217, 0.5); }\n .btn-check:checked + .btn-primary,\n .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active,\n .show > .btn-primary.dropdown-toggle {\n color: #000;\n background-color: #c58aff;\n border-color: #bd7cff; }\n .btn-check:checked + .btn-primary:focus,\n .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus,\n .show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(155, 93, 217, 0.5); }\n .btn-primary:disabled, .btn-primary.disabled {\n color: #000;\n background-color: #b66dff;\n border-color: #b66dff; }\n\n.btn-secondary {\n color: #000;\n background-color: #c3bdbd;\n border-color: #c3bdbd; }\n .btn-secondary:hover {\n color: #000;\n background-color: #ccc7c7;\n border-color: #c9c4c4; }\n .btn-check:focus + .btn-secondary, .btn-secondary:focus {\n color: #000;\n background-color: #ccc7c7;\n border-color: #c9c4c4;\n box-shadow: 0 0 0 0.25rem rgba(166, 161, 161, 0.5); }\n .btn-check:checked + .btn-secondary,\n .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active,\n .show > .btn-secondary.dropdown-toggle {\n color: #000;\n background-color: #cfcaca;\n border-color: #c9c4c4; }\n .btn-check:checked + .btn-secondary:focus,\n .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus,\n .show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(166, 161, 161, 0.5); }\n .btn-secondary:disabled, .btn-secondary.disabled {\n color: #000;\n background-color: #c3bdbd;\n border-color: #c3bdbd; }\n\n.btn-success {\n color: #000;\n background-color: #1bcfb4;\n border-color: #1bcfb4; }\n .btn-success:hover {\n color: #000;\n background-color: #3dd6bf;\n border-color: #32d4bc; }\n .btn-check:focus + .btn-success, .btn-success:focus {\n color: #000;\n background-color: #3dd6bf;\n border-color: #32d4bc;\n box-shadow: 0 0 0 0.25rem rgba(23, 176, 153, 0.5); }\n .btn-check:checked + .btn-success,\n .btn-check:active + .btn-success, .btn-success:active, .btn-success.active,\n .show > .btn-success.dropdown-toggle {\n color: #000;\n background-color: #49d9c3;\n border-color: #32d4bc; }\n .btn-check:checked + .btn-success:focus,\n .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus,\n .show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(23, 176, 153, 0.5); }\n .btn-success:disabled, .btn-success.disabled {\n color: #000;\n background-color: #1bcfb4;\n border-color: #1bcfb4; }\n\n.btn-info {\n color: #000;\n background-color: #198ae3;\n border-color: #198ae3; }\n .btn-info:hover {\n color: #000;\n background-color: #3c9ce7;\n border-color: #3096e6; }\n .btn-check:focus + .btn-info, .btn-info:focus {\n color: #000;\n background-color: #3c9ce7;\n border-color: #3096e6;\n box-shadow: 0 0 0 0.25rem rgba(21, 117, 193, 0.5); }\n .btn-check:checked + .btn-info,\n .btn-check:active + .btn-info, .btn-info:active, .btn-info.active,\n .show > .btn-info.dropdown-toggle {\n color: #000;\n background-color: #47a1e9;\n border-color: #3096e6; }\n .btn-check:checked + .btn-info:focus,\n .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus,\n .show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(21, 117, 193, 0.5); }\n .btn-info:disabled, .btn-info.disabled {\n color: #000;\n background-color: #198ae3;\n border-color: #198ae3; }\n\n.btn-warning {\n color: #000;\n background-color: #fed713;\n border-color: #fed713; }\n .btn-warning:hover {\n color: #000;\n background-color: #fedd36;\n border-color: #fedb2b; }\n .btn-check:focus + .btn-warning, .btn-warning:focus {\n color: #000;\n background-color: #fedd36;\n border-color: #fedb2b;\n box-shadow: 0 0 0 0.25rem rgba(216, 183, 16, 0.5); }\n .btn-check:checked + .btn-warning,\n .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active,\n .show > .btn-warning.dropdown-toggle {\n color: #000;\n background-color: #fedf42;\n border-color: #fedb2b; }\n .btn-check:checked + .btn-warning:focus,\n .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus,\n .show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(216, 183, 16, 0.5); }\n .btn-warning:disabled, .btn-warning.disabled {\n color: #000;\n background-color: #fed713;\n border-color: #fed713; }\n\n.btn-danger {\n color: #000;\n background-color: #fe7c96;\n border-color: #fe7c96; }\n .btn-danger:hover {\n color: #000;\n background-color: #fe90a6;\n border-color: #fe89a1; }\n .btn-check:focus + .btn-danger, .btn-danger:focus {\n color: #000;\n background-color: #fe90a6;\n border-color: #fe89a1;\n box-shadow: 0 0 0 0.25rem rgba(216, 105, 128, 0.5); }\n .btn-check:checked + .btn-danger,\n .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active,\n .show > .btn-danger.dropdown-toggle {\n color: #000;\n background-color: #fe96ab;\n border-color: #fe89a1; }\n .btn-check:checked + .btn-danger:focus,\n .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus,\n .show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(216, 105, 128, 0.5); }\n .btn-danger:disabled, .btn-danger.disabled {\n color: #000;\n background-color: #fe7c96;\n border-color: #fe7c96; }\n\n.btn-light {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa; }\n .btn-light:hover {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb; }\n .btn-check:focus + .btn-light, .btn-light:focus {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb;\n box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); }\n .btn-check:checked + .btn-light,\n .btn-check:active + .btn-light, .btn-light:active, .btn-light.active,\n .show > .btn-light.dropdown-toggle {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb; }\n .btn-check:checked + .btn-light:focus,\n .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus,\n .show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); }\n .btn-light:disabled, .btn-light.disabled {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa; }\n\n.btn-dark {\n color: #fff;\n background-color: #3e4b5b;\n border-color: #3e4b5b; }\n .btn-dark:hover {\n color: #fff;\n background-color: #35404d;\n border-color: #323c49; }\n .btn-check:focus + .btn-dark, .btn-dark:focus {\n color: #fff;\n background-color: #35404d;\n border-color: #323c49;\n box-shadow: 0 0 0 0.25rem rgba(91, 102, 116, 0.5); }\n .btn-check:checked + .btn-dark,\n .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active,\n .show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #323c49;\n border-color: #2f3844; }\n .btn-check:checked + .btn-dark:focus,\n .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus,\n .show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(91, 102, 116, 0.5); }\n .btn-dark:disabled, .btn-dark.disabled {\n color: #fff;\n background-color: #3e4b5b;\n border-color: #3e4b5b; }\n\n.btn-outline-primary {\n color: #b66dff;\n border-color: #b66dff; }\n .btn-outline-primary:hover {\n color: #000;\n background-color: #b66dff;\n border-color: #b66dff; }\n .btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus {\n box-shadow: 0 0 0 0.25rem rgba(182, 109, 255, 0.5); }\n .btn-check:checked + .btn-outline-primary,\n .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show {\n color: #000;\n background-color: #b66dff;\n border-color: #b66dff; }\n .btn-check:checked + .btn-outline-primary:focus,\n .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(182, 109, 255, 0.5); }\n .btn-outline-primary:disabled, .btn-outline-primary.disabled {\n color: #b66dff;\n background-color: transparent; }\n\n.btn-outline-secondary {\n color: #c3bdbd;\n border-color: #c3bdbd; }\n .btn-outline-secondary:hover {\n color: #000;\n background-color: #c3bdbd;\n border-color: #c3bdbd; }\n .btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus {\n box-shadow: 0 0 0 0.25rem rgba(195, 189, 189, 0.5); }\n .btn-check:checked + .btn-outline-secondary,\n .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {\n color: #000;\n background-color: #c3bdbd;\n border-color: #c3bdbd; }\n .btn-check:checked + .btn-outline-secondary:focus,\n .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(195, 189, 189, 0.5); }\n .btn-outline-secondary:disabled, .btn-outline-secondary.disabled {\n color: #c3bdbd;\n background-color: transparent; }\n\n.btn-outline-success {\n color: #1bcfb4;\n border-color: #1bcfb4; }\n .btn-outline-success:hover {\n color: #000;\n background-color: #1bcfb4;\n border-color: #1bcfb4; }\n .btn-check:focus + .btn-outline-success, .btn-outline-success:focus {\n box-shadow: 0 0 0 0.25rem rgba(27, 207, 180, 0.5); }\n .btn-check:checked + .btn-outline-success,\n .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show {\n color: #000;\n background-color: #1bcfb4;\n border-color: #1bcfb4; }\n .btn-check:checked + .btn-outline-success:focus,\n .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(27, 207, 180, 0.5); }\n .btn-outline-success:disabled, .btn-outline-success.disabled {\n color: #1bcfb4;\n background-color: transparent; }\n\n.btn-outline-info {\n color: #198ae3;\n border-color: #198ae3; }\n .btn-outline-info:hover {\n color: #000;\n background-color: #198ae3;\n border-color: #198ae3; }\n .btn-check:focus + .btn-outline-info, .btn-outline-info:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 138, 227, 0.5); }\n .btn-check:checked + .btn-outline-info,\n .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show {\n color: #000;\n background-color: #198ae3;\n border-color: #198ae3; }\n .btn-check:checked + .btn-outline-info:focus,\n .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 138, 227, 0.5); }\n .btn-outline-info:disabled, .btn-outline-info.disabled {\n color: #198ae3;\n background-color: transparent; }\n\n.btn-outline-warning {\n color: #fed713;\n border-color: #fed713; }\n .btn-outline-warning:hover {\n color: #000;\n background-color: #fed713;\n border-color: #fed713; }\n .btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus {\n box-shadow: 0 0 0 0.25rem rgba(254, 215, 19, 0.5); }\n .btn-check:checked + .btn-outline-warning,\n .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show {\n color: #000;\n background-color: #fed713;\n border-color: #fed713; }\n .btn-check:checked + .btn-outline-warning:focus,\n .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(254, 215, 19, 0.5); }\n .btn-outline-warning:disabled, .btn-outline-warning.disabled {\n color: #fed713;\n background-color: transparent; }\n\n.btn-outline-danger {\n color: #fe7c96;\n border-color: #fe7c96; }\n .btn-outline-danger:hover {\n color: #000;\n background-color: #fe7c96;\n border-color: #fe7c96; }\n .btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus {\n box-shadow: 0 0 0 0.25rem rgba(254, 124, 150, 0.5); }\n .btn-check:checked + .btn-outline-danger,\n .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show {\n color: #000;\n background-color: #fe7c96;\n border-color: #fe7c96; }\n .btn-check:checked + .btn-outline-danger:focus,\n .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(254, 124, 150, 0.5); }\n .btn-outline-danger:disabled, .btn-outline-danger.disabled {\n color: #fe7c96;\n background-color: transparent; }\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa; }\n .btn-outline-light:hover {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa; }\n .btn-check:focus + .btn-outline-light, .btn-outline-light:focus {\n box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); }\n .btn-check:checked + .btn-outline-light,\n .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa; }\n .btn-check:checked + .btn-outline-light:focus,\n .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); }\n .btn-outline-light:disabled, .btn-outline-light.disabled {\n color: #f8f9fa;\n background-color: transparent; }\n\n.btn-outline-dark {\n color: #3e4b5b;\n border-color: #3e4b5b; }\n .btn-outline-dark:hover {\n color: #fff;\n background-color: #3e4b5b;\n border-color: #3e4b5b; }\n .btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus {\n box-shadow: 0 0 0 0.25rem rgba(62, 75, 91, 0.5); }\n .btn-check:checked + .btn-outline-dark,\n .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show {\n color: #fff;\n background-color: #3e4b5b;\n border-color: #3e4b5b; }\n .btn-check:checked + .btn-outline-dark:focus,\n .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(62, 75, 91, 0.5); }\n .btn-outline-dark:disabled, .btn-outline-dark.disabled {\n color: #3e4b5b;\n background-color: transparent; }\n\n.btn-link {\n font-weight: 400;\n color: #0d6efd;\n text-decoration: underline; }\n .btn-link:hover {\n color: #0a58ca; }\n .btn-link:disabled, .btn-link.disabled {\n color: #6c757d; }\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 1rem 3rem;\n font-size: 0.875rem;\n border-radius: 0.1875rem; }\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.5rem 0.81rem;\n font-size: 0.875rem;\n border-radius: 0.1875rem; }\n\n.fade {\n transition: opacity 0.15s linear; }\n @media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none; } }\n .fade:not(.show) {\n opacity: 0; }\n\n.collapse:not(.show) {\n display: none; }\n\n.collapsing {\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease; }\n @media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none; } }\n .collapsing.collapse-horizontal {\n width: 0;\n height: auto;\n transition: width 0.35s ease; }\n @media (prefers-reduced-motion: reduce) {\n .collapsing.collapse-horizontal {\n transition: none; } }\n\n.dropup,\n.dropend,\n.dropdown,\n.dropstart {\n position: relative; }\n\n.dropdown-toggle {\n white-space: nowrap; }\n .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent; }\n .dropdown-toggle:empty::after {\n margin-left: 0; }\n\n.dropdown-menu {\n position: absolute;\n z-index: 1000;\n display: none;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ebedf2;\n border-radius: 0.25rem; }\n .dropdown-menu[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: 0.125rem; }\n\n.dropdown-menu-start {\n --bs-position: start; }\n .dropdown-menu-start[data-bs-popper] {\n right: auto;\n left: 0; }\n\n.dropdown-menu-end {\n --bs-position: end; }\n .dropdown-menu-end[data-bs-popper] {\n right: 0;\n left: auto; }\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-start {\n --bs-position: start; }\n .dropdown-menu-sm-start[data-bs-popper] {\n right: auto;\n left: 0; }\n .dropdown-menu-sm-end {\n --bs-position: end; }\n .dropdown-menu-sm-end[data-bs-popper] {\n right: 0;\n left: auto; } }\n\n@media (min-width: 768px) {\n .dropdown-menu-md-start {\n --bs-position: start; }\n .dropdown-menu-md-start[data-bs-popper] {\n right: auto;\n left: 0; }\n .dropdown-menu-md-end {\n --bs-position: end; }\n .dropdown-menu-md-end[data-bs-popper] {\n right: 0;\n left: auto; } }\n\n@media (min-width: 992px) {\n .dropdown-menu-lg-start {\n --bs-position: start; }\n .dropdown-menu-lg-start[data-bs-popper] {\n right: auto;\n left: 0; }\n .dropdown-menu-lg-end {\n --bs-position: end; }\n .dropdown-menu-lg-end[data-bs-popper] {\n right: 0;\n left: auto; } }\n\n@media (min-width: 1200px) {\n .dropdown-menu-xl-start {\n --bs-position: start; }\n .dropdown-menu-xl-start[data-bs-popper] {\n right: auto;\n left: 0; }\n .dropdown-menu-xl-end {\n --bs-position: end; }\n .dropdown-menu-xl-end[data-bs-popper] {\n right: 0;\n left: auto; } }\n\n@media (min-width: 1400px) {\n .dropdown-menu-xxl-start {\n --bs-position: start; }\n .dropdown-menu-xxl-start[data-bs-popper] {\n right: auto;\n left: 0; }\n .dropdown-menu-xxl-end {\n --bs-position: end; }\n .dropdown-menu-xxl-end[data-bs-popper] {\n right: 0;\n left: auto; } }\n\n.dropup .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem; }\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent; }\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0; }\n\n.dropend .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem; }\n\n.dropend .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid; }\n\n.dropend .dropdown-toggle:empty::after {\n margin-left: 0; }\n\n.dropend .dropdown-toggle::after {\n vertical-align: 0; }\n\n.dropstart .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem; }\n\n.dropstart .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\"; }\n\n.dropstart .dropdown-toggle::after {\n display: none; }\n\n.dropstart .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent; }\n\n.dropstart .dropdown-toggle:empty::after {\n margin-left: 0; }\n\n.dropstart .dropdown-toggle::before {\n vertical-align: 0; }\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #ebedf2; }\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1rem;\n clear: both;\n font-weight: 400;\n color: #343a40;\n text-align: inherit;\n text-decoration: none;\n white-space: nowrap;\n background-color: transparent;\n border: 0; }\n .dropdown-item:hover, .dropdown-item:focus {\n color: #1e2125;\n background-color: #e9ecef; }\n .dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #0d6efd; }\n .dropdown-item.disabled, .dropdown-item:disabled {\n color: #adb5bd;\n pointer-events: none;\n background-color: transparent; }\n\n.dropdown-menu.show {\n display: block; }\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #343a40;\n white-space: nowrap; }\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1rem;\n color: #343a40; }\n\n.dropdown-menu-dark {\n color: #dee2e6;\n background-color: #343a40;\n border-color: rgba(0, 0, 0, 0.15); }\n .dropdown-menu-dark .dropdown-item {\n color: #dee2e6; }\n .dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.15); }\n .dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active {\n color: #fff;\n background-color: #0d6efd; }\n .dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled {\n color: #adb5bd; }\n .dropdown-menu-dark .dropdown-divider {\n border-color: rgba(0, 0, 0, 0.15); }\n .dropdown-menu-dark .dropdown-item-text {\n color: #dee2e6; }\n .dropdown-menu-dark .dropdown-header {\n color: #adb5bd; }\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; }\n .btn-group > .btn,\n .btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto; }\n .btn-group > .btn-check:checked + .btn,\n .btn-group > .btn-check:focus + .btn,\n .btn-group > .btn:hover,\n .btn-group > .btn:focus,\n .btn-group > .btn:active,\n .btn-group > .btn.active,\n .btn-group-vertical > .btn-check:checked + .btn,\n .btn-group-vertical > .btn-check:focus + .btn,\n .btn-group-vertical > .btn:hover,\n .btn-group-vertical > .btn:focus,\n .btn-group-vertical > .btn:active,\n .btn-group-vertical > .btn.active {\n z-index: 1; }\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start; }\n .btn-toolbar .input-group {\n width: auto; }\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px; }\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.btn-group > .btn:nth-child(n + 3),\n.btn-group > :not(.btn-check) + .btn,\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0; }\n\n.dropdown-toggle-split {\n padding-right: 1.875rem;\n padding-left: 1.875rem; }\n .dropdown-toggle-split::after,\n .dropup .dropdown-toggle-split::after,\n .dropend .dropdown-toggle-split::after {\n margin-left: 0; }\n .dropstart .dropdown-toggle-split::before {\n margin-right: 0; }\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.6075rem;\n padding-left: 0.6075rem; }\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 2.25rem;\n padding-left: 2.25rem; }\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center; }\n .btn-group-vertical > .btn,\n .btn-group-vertical > .btn-group {\n width: 100%; }\n .btn-group-vertical > .btn:not(:first-child),\n .btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px; }\n .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n .btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0; }\n .btn-group-vertical > .btn ~ .btn,\n .btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0; }\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none; }\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n color: #0d6efd;\n text-decoration: none;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .nav-link {\n transition: none; } }\n .nav-link:hover, .nav-link:focus {\n color: #0a58ca; }\n .nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default; }\n\n.nav-tabs {\n border-bottom: 1px solid #ebedf2; }\n .nav-tabs .nav-link {\n margin-bottom: -1px;\n background: none;\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem; }\n .nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #ebedf2 #ebedf2 #ebedf2;\n isolation: isolate; }\n .nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent; }\n .nav-tabs .nav-link.active,\n .nav-tabs .nav-item.show .nav-link {\n color: #343a40;\n background-color: #ffffff;\n border-color: #ebedf2 #ebedf2 #ffffff; }\n .nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0; }\n\n.nav-pills .nav-link {\n background: none;\n border: 0;\n border-radius: 0.25rem; }\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #0d6efd; }\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center; }\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center; }\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n width: 100%; }\n\n.tab-content > .tab-pane {\n display: none; }\n\n.tab-content > .active {\n display: block; }\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem; }\n .navbar > .container,\n .navbar > .container-fluid, .navbar > .container-sm, .navbar > .container-md, .navbar > .container-lg, .navbar > .container-xl, .navbar > .container-xxl {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between; }\n\n.navbar-brand {\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n text-decoration: none;\n white-space: nowrap; }\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none; }\n .navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0; }\n .navbar-nav .dropdown-menu {\n position: static; }\n\n.navbar-text {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem; }\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center; }\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n transition: box-shadow 0.15s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .navbar-toggler {\n transition: none; } }\n .navbar-toggler:hover {\n text-decoration: none; }\n .navbar-toggler:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 0.25rem; }\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%; }\n\n.navbar-nav-scroll {\n max-height: var(--bs-scroll-height, 75vh);\n overflow-y: auto; }\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-wrap: nowrap;\n justify-content: flex-start; }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row; }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute; }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem; }\n .navbar-expand-sm .navbar-nav-scroll {\n overflow: visible; }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto; }\n .navbar-expand-sm .navbar-toggler {\n display: none; }\n .navbar-expand-sm .offcanvas-header {\n display: none; }\n .navbar-expand-sm .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none; }\n .navbar-expand-sm .offcanvas-top,\n .navbar-expand-sm .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0; }\n .navbar-expand-sm .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible; } }\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-wrap: nowrap;\n justify-content: flex-start; }\n .navbar-expand-md .navbar-nav {\n flex-direction: row; }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute; }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem; }\n .navbar-expand-md .navbar-nav-scroll {\n overflow: visible; }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto; }\n .navbar-expand-md .navbar-toggler {\n display: none; }\n .navbar-expand-md .offcanvas-header {\n display: none; }\n .navbar-expand-md .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none; }\n .navbar-expand-md .offcanvas-top,\n .navbar-expand-md .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0; }\n .navbar-expand-md .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible; } }\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-wrap: nowrap;\n justify-content: flex-start; }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row; }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute; }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem; }\n .navbar-expand-lg .navbar-nav-scroll {\n overflow: visible; }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto; }\n .navbar-expand-lg .navbar-toggler {\n display: none; }\n .navbar-expand-lg .offcanvas-header {\n display: none; }\n .navbar-expand-lg .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none; }\n .navbar-expand-lg .offcanvas-top,\n .navbar-expand-lg .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0; }\n .navbar-expand-lg .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible; } }\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-wrap: nowrap;\n justify-content: flex-start; }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row; }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute; }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem; }\n .navbar-expand-xl .navbar-nav-scroll {\n overflow: visible; }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto; }\n .navbar-expand-xl .navbar-toggler {\n display: none; }\n .navbar-expand-xl .offcanvas-header {\n display: none; }\n .navbar-expand-xl .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none; }\n .navbar-expand-xl .offcanvas-top,\n .navbar-expand-xl .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0; }\n .navbar-expand-xl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible; } }\n\n@media (min-width: 1400px) {\n .navbar-expand-xxl {\n flex-wrap: nowrap;\n justify-content: flex-start; }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row; }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute; }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem; }\n .navbar-expand-xxl .navbar-nav-scroll {\n overflow: visible; }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto; }\n .navbar-expand-xxl .navbar-toggler {\n display: none; }\n .navbar-expand-xxl .offcanvas-header {\n display: none; }\n .navbar-expand-xxl .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none; }\n .navbar-expand-xxl .offcanvas-top,\n .navbar-expand-xxl .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0; }\n .navbar-expand-xxl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible; } }\n\n.navbar-expand {\n flex-wrap: nowrap;\n justify-content: flex-start; }\n .navbar-expand .navbar-nav {\n flex-direction: row; }\n .navbar-expand .navbar-nav .dropdown-menu {\n position: absolute; }\n .navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem; }\n .navbar-expand .navbar-nav-scroll {\n overflow: visible; }\n .navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto; }\n .navbar-expand .navbar-toggler {\n display: none; }\n .navbar-expand .offcanvas-header {\n display: none; }\n .navbar-expand .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none; }\n .navbar-expand .offcanvas-top,\n .navbar-expand .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0; }\n .navbar-expand .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible; }\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9); }\n .navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9); }\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.55); }\n .navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7); }\n .navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3); }\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9); }\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.55);\n border-color: rgba(0, 0, 0, 0.1); }\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"); }\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.55); }\n .navbar-light .navbar-text a,\n .navbar-light .navbar-text a:hover,\n .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9); }\n\n.navbar-dark .navbar-brand {\n color: #fff; }\n .navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff; }\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.55); }\n .navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75); }\n .navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25); }\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff; }\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.55);\n border-color: rgba(255, 255, 255, 0.1); }\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"); }\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.55); }\n .navbar-dark .navbar-text a,\n .navbar-dark .navbar-text a:hover,\n .navbar-dark .navbar-text a:focus {\n color: #fff; }\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.3125rem; }\n .card > hr {\n margin-right: 0;\n margin-left: 0; }\n .card > .list-group {\n border-top: inherit;\n border-bottom: inherit; }\n .card > .list-group:first-child {\n border-top-width: 0;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px); }\n .card > .list-group:last-child {\n border-bottom-width: 0;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px); }\n .card > .card-header + .list-group,\n .card > .list-group + .card-footer {\n border-top: 0; }\n\n.card-body {\n flex: 1 1 auto;\n padding: 1rem 1rem; }\n\n.card-title {\n margin-bottom: 0.5rem; }\n\n.card-subtitle {\n margin-top: -0.25rem;\n margin-bottom: 0; }\n\n.card-text:last-child {\n margin-bottom: 0; }\n\n.card-link + .card-link {\n margin-left: 1rem; }\n\n.card-header {\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125); }\n .card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; }\n\n.card-footer {\n padding: 0.5rem 1rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125); }\n .card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); }\n\n.card-header-tabs {\n margin-right: -0.5rem;\n margin-bottom: -0.5rem;\n margin-left: -0.5rem;\n border-bottom: 0; }\n\n.card-header-pills {\n margin-right: -0.5rem;\n margin-left: -0.5rem; }\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1rem;\n border-radius: calc(0.25rem - 1px); }\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n width: 100%; }\n\n.card-img,\n.card-img-top {\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px); }\n\n.card-img,\n.card-img-bottom {\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px); }\n\n.card-group > .card {\n margin-bottom: 0.75rem; }\n\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap; }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0; }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0; }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0; }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0; }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0; }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0; }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0; }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0; } }\n\n.accordion-button {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n padding: 1rem 1.25rem;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n background-color: #fff;\n border: 0;\n border-radius: 0;\n overflow-anchor: none;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; }\n @media (prefers-reduced-motion: reduce) {\n .accordion-button {\n transition: none; } }\n .accordion-button:not(.collapsed) {\n color: #0c63e4;\n background-color: #e7f1ff;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125); }\n .accordion-button:not(.collapsed)::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n transform: rotate(-180deg); }\n .accordion-button::after {\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n margin-left: auto;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-size: 1.25rem;\n transition: transform 0.2s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .accordion-button::after {\n transition: none; } }\n .accordion-button:hover {\n z-index: 2; }\n .accordion-button:focus {\n z-index: 3;\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); }\n\n.accordion-header {\n margin-bottom: 0; }\n\n.accordion-item {\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125); }\n .accordion-item:first-of-type {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem; }\n .accordion-item:first-of-type .accordion-button {\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px); }\n .accordion-item:not(:first-of-type) {\n border-top: 0; }\n .accordion-item:last-of-type {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem; }\n .accordion-item:last-of-type .accordion-button.collapsed {\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px); }\n .accordion-item:last-of-type .accordion-collapse {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem; }\n\n.accordion-body {\n padding: 1rem 1.25rem; }\n\n.accordion-flush .accordion-collapse {\n border-width: 0; }\n\n.accordion-flush .accordion-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0; }\n .accordion-flush .accordion-item:first-child {\n border-top: 0; }\n .accordion-flush .accordion-item:last-child {\n border-bottom: 0; }\n .accordion-flush .accordion-item .accordion-button {\n border-radius: 0; }\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.56rem 1.13rem;\n margin-bottom: 1rem;\n font-size: 0.875rem;\n list-style: none;\n background-color: transparent; }\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem; }\n .breadcrumb-item + .breadcrumb-item::before {\n float: left;\n padding-right: 0.5rem;\n color: #6c757d;\n content: var(--bs-breadcrumb-divider, \"/\") /* rtl: var(--bs-breadcrumb-divider, \"/\") */; }\n\n.breadcrumb-item.active {\n color: #495057; }\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none; }\n\n.page-link {\n position: relative;\n display: block;\n color: #0d6efd;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #dee2e6;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .page-link {\n transition: none; } }\n .page-link:hover {\n z-index: 2;\n color: #0a58ca;\n background-color: #e9ecef;\n border-color: #dee2e6; }\n .page-link:focus {\n z-index: 3;\n color: #0a58ca;\n background-color: #e9ecef;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); }\n\n.page-item:not(:first-child) .page-link {\n margin-left: -1px; }\n\n.page-item.active .page-link {\n z-index: 3;\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd; }\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n border-color: #dee2e6; }\n\n.page-link {\n padding: 0.375rem 0.75rem; }\n\n.page-item:first-child .page-link {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem; }\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem; }\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem; }\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem; }\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem; }\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem; }\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem; }\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem; }\n\n.badge {\n display: inline-block;\n padding: 0.35em 0.65em;\n font-size: 0.75em;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem; }\n .badge:empty {\n display: none; }\n\n.btn .badge {\n position: relative;\n top: -1px; }\n\n.alert {\n position: relative;\n padding: 1rem 1rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem; }\n\n.alert-heading {\n color: inherit; }\n\n.alert-link {\n font-weight: 700; }\n\n.alert-dismissible {\n padding-right: 3rem; }\n .alert-dismissible .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n padding: 1.25rem 1rem; }\n\n.alert-primary {\n color: #6d4199;\n background-color: #f0e2ff;\n border-color: #e9d3ff; }\n .alert-primary .alert-link {\n color: #57347a; }\n\n.alert-secondary {\n color: #4e4c4c;\n background-color: #f3f2f2;\n border-color: #edebeb; }\n .alert-secondary .alert-link {\n color: #3e3d3d; }\n\n.alert-success {\n color: #0b5348;\n background-color: #d1f5f0;\n border-color: #bbf1e9; }\n .alert-success .alert-link {\n color: #09423a; }\n\n.alert-info {\n color: #0f5388;\n background-color: #d1e8f9;\n border-color: #badcf7; }\n .alert-info .alert-link {\n color: #0c426d; }\n\n.alert-warning {\n color: #665608;\n background-color: #fff7d0;\n border-color: #fff3b8; }\n .alert-warning .alert-link {\n color: #524506; }\n\n.alert-danger {\n color: #984a5a;\n background-color: #ffe5ea;\n border-color: #ffd8e0; }\n .alert-danger .alert-link {\n color: #7a3b48; }\n\n.alert-light {\n color: #636464;\n background-color: #fefefe;\n border-color: #fdfdfe; }\n .alert-light .alert-link {\n color: #4f5050; }\n\n.alert-dark {\n color: #252d37;\n background-color: #d8dbde;\n border-color: #c5c9ce; }\n .alert-dark .alert-link {\n color: #1e242c; }\n\n@keyframes progress-bar-stripes {\n 0% {\n background-position-x: 1rem; } }\n\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem; }\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow: hidden;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #0d6efd;\n transition: width 0.6s ease; }\n @media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none; } }\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem; }\n\n.progress-bar-animated {\n animation: 1s linear infinite progress-bar-stripes; }\n @media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none; } }\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n border-radius: 0.25rem; }\n\n.list-group-numbered {\n list-style-type: none;\n counter-reset: section; }\n .list-group-numbered > li::before {\n content: counters(section, \".\") \". \";\n counter-increment: section; }\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit; }\n .list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa; }\n .list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef; }\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.5rem 1rem;\n color: #212529;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125); }\n .list-group-item:first-child {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit; }\n .list-group-item:last-child {\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit; }\n .list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff; }\n .list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd; }\n .list-group-item + .list-group-item {\n border-top-width: 0; }\n .list-group-item + .list-group-item.active {\n margin-top: -1px;\n border-top-width: 1px; }\n\n.list-group-horizontal {\n flex-direction: row; }\n .list-group-horizontal > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0; }\n .list-group-horizontal > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0; }\n .list-group-horizontal > .list-group-item.active {\n margin-top: 0; }\n .list-group-horizontal > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0; }\n .list-group-horizontal > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px; }\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row; }\n .list-group-horizontal-sm > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0; }\n .list-group-horizontal-sm > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0; }\n .list-group-horizontal-sm > .list-group-item.active {\n margin-top: 0; }\n .list-group-horizontal-sm > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0; }\n .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px; } }\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row; }\n .list-group-horizontal-md > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0; }\n .list-group-horizontal-md > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0; }\n .list-group-horizontal-md > .list-group-item.active {\n margin-top: 0; }\n .list-group-horizontal-md > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0; }\n .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px; } }\n\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row; }\n .list-group-horizontal-lg > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0; }\n .list-group-horizontal-lg > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0; }\n .list-group-horizontal-lg > .list-group-item.active {\n margin-top: 0; }\n .list-group-horizontal-lg > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0; }\n .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px; } }\n\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row; }\n .list-group-horizontal-xl > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0; }\n .list-group-horizontal-xl > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0; }\n .list-group-horizontal-xl > .list-group-item.active {\n margin-top: 0; }\n .list-group-horizontal-xl > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0; }\n .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px; } }\n\n@media (min-width: 1400px) {\n .list-group-horizontal-xxl {\n flex-direction: row; }\n .list-group-horizontal-xxl > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0; }\n .list-group-horizontal-xxl > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0; }\n .list-group-horizontal-xxl > .list-group-item.active {\n margin-top: 0; }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0; }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px; } }\n\n.list-group-flush {\n border-radius: 0; }\n .list-group-flush > .list-group-item {\n border-width: 0 0 1px; }\n .list-group-flush > .list-group-item:last-child {\n border-bottom-width: 0; }\n\n.list-group-item-primary {\n color: #6d4199;\n background-color: #f0e2ff; }\n .list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #6d4199;\n background-color: #d8cbe6; }\n .list-group-item-primary.list-group-item-action.active {\n color: #ffffff;\n background-color: #6d4199;\n border-color: #6d4199; }\n\n.list-group-item-secondary {\n color: #4e4c4c;\n background-color: #f3f2f2; }\n .list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #4e4c4c;\n background-color: #dbdada; }\n .list-group-item-secondary.list-group-item-action.active {\n color: #ffffff;\n background-color: #4e4c4c;\n border-color: #4e4c4c; }\n\n.list-group-item-success {\n color: #0b5348;\n background-color: #d1f5f0; }\n .list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #0b5348;\n background-color: #bcddd8; }\n .list-group-item-success.list-group-item-action.active {\n color: #ffffff;\n background-color: #0b5348;\n border-color: #0b5348; }\n\n.list-group-item-info {\n color: #0f5388;\n background-color: #d1e8f9; }\n .list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0f5388;\n background-color: #bcd1e0; }\n .list-group-item-info.list-group-item-action.active {\n color: #ffffff;\n background-color: #0f5388;\n border-color: #0f5388; }\n\n.list-group-item-warning {\n color: #665608;\n background-color: #fff7d0; }\n .list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #665608;\n background-color: #e6debb; }\n .list-group-item-warning.list-group-item-action.active {\n color: #ffffff;\n background-color: #665608;\n border-color: #665608; }\n\n.list-group-item-danger {\n color: #984a5a;\n background-color: #ffe5ea; }\n .list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #984a5a;\n background-color: #e6ced3; }\n .list-group-item-danger.list-group-item-action.active {\n color: #ffffff;\n background-color: #984a5a;\n border-color: #984a5a; }\n\n.list-group-item-light {\n color: #636464;\n background-color: #fefefe; }\n .list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #636464;\n background-color: #e5e5e5; }\n .list-group-item-light.list-group-item-action.active {\n color: #ffffff;\n background-color: #636464;\n border-color: #636464; }\n\n.list-group-item-dark {\n color: #252d37;\n background-color: #d8dbde; }\n .list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #252d37;\n background-color: #c2c5c8; }\n .list-group-item-dark.list-group-item-action.active {\n color: #ffffff;\n background-color: #252d37;\n border-color: #252d37; }\n\n.btn-close {\n box-sizing: content-box;\n width: 1em;\n height: 1em;\n padding: 0.25em 0.25em;\n color: #000;\n background: transparent url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e\") center/1em auto no-repeat;\n border: 0;\n border-radius: 0.25rem;\n opacity: 0.5; }\n .btn-close:hover {\n color: #000;\n text-decoration: none;\n opacity: 0.75; }\n .btn-close:focus {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n opacity: 1; }\n .btn-close:disabled, .btn-close.disabled {\n pointer-events: none;\n user-select: none;\n opacity: 0.25; }\n\n.btn-close-white {\n filter: invert(1) grayscale(100%) brightness(200%); }\n\n.toast {\n width: 350px;\n max-width: 100%;\n font-size: 0.875rem;\n pointer-events: auto;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem; }\n .toast.showing {\n opacity: 0; }\n .toast:not(.show) {\n display: none; }\n\n.toast-container {\n width: max-content;\n max-width: 100%;\n pointer-events: none; }\n .toast-container > :not(:last-child) {\n margin-bottom: 0.75rem; }\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.5rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px); }\n .toast-header .btn-close {\n margin-right: -0.375rem;\n margin-left: 0.75rem; }\n\n.toast-body {\n padding: 0.75rem;\n word-wrap: break-word; }\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1055;\n display: none;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n outline: 0; }\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n pointer-events: none; }\n .modal.fade .modal-dialog {\n transition: transform 0.4s ease;\n transform: translate(0, -50px); }\n @media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none; } }\n .modal.show .modal-dialog {\n transform: none; }\n .modal.modal-static .modal-dialog {\n transform: scale(1.02); }\n\n.modal-dialog-scrollable {\n height: calc(100% - 20px); }\n .modal-dialog-scrollable .modal-content {\n max-height: 100%;\n overflow: hidden; }\n .modal-dialog-scrollable .modal-body {\n overflow-y: auto; }\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 20px); }\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #f2edf3;\n background-clip: padding-box;\n border: 1px solid #ebedf2;\n border-radius: 0.3rem;\n outline: 0; }\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n width: 100vw;\n height: 100vh;\n background-color: #000000; }\n .modal-backdrop.fade {\n opacity: 0; }\n .modal-backdrop.show {\n opacity: 0.5; }\n\n.modal-header {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #ebedf2;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px); }\n .modal-header .btn-close {\n padding: 12.5px 13px;\n margin: -12.5px -13px -12.5px auto; }\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5; }\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 0.9375rem; }\n\n.modal-footer {\n display: flex;\n flex-wrap: wrap;\n flex-shrink: 0;\n align-items: center;\n justify-content: flex-end;\n padding: 0.6875rem;\n border-top: 1px solid #ebedf2;\n border-bottom-right-radius: calc(0.3rem - 1px);\n border-bottom-left-radius: calc(0.3rem - 1px); }\n .modal-footer > * {\n margin: 0.25rem; }\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 30px auto; }\n .modal-dialog-scrollable {\n height: calc(100% - 60px); }\n .modal-dialog-centered {\n min-height: calc(100% - 60px); }\n .modal-sm {\n max-width: 300px; } }\n\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 90%; } }\n\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px; } }\n\n.modal-fullscreen {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0; }\n .modal-fullscreen .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0; }\n .modal-fullscreen .modal-header {\n border-radius: 0; }\n .modal-fullscreen .modal-body {\n overflow-y: auto; }\n .modal-fullscreen .modal-footer {\n border-radius: 0; }\n\n@media (max-width: 575.98px) {\n .modal-fullscreen-sm-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0; }\n .modal-fullscreen-sm-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0; }\n .modal-fullscreen-sm-down .modal-header {\n border-radius: 0; }\n .modal-fullscreen-sm-down .modal-body {\n overflow-y: auto; }\n .modal-fullscreen-sm-down .modal-footer {\n border-radius: 0; } }\n\n@media (max-width: 767.98px) {\n .modal-fullscreen-md-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0; }\n .modal-fullscreen-md-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0; }\n .modal-fullscreen-md-down .modal-header {\n border-radius: 0; }\n .modal-fullscreen-md-down .modal-body {\n overflow-y: auto; }\n .modal-fullscreen-md-down .modal-footer {\n border-radius: 0; } }\n\n@media (max-width: 991.98px) {\n .modal-fullscreen-lg-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0; }\n .modal-fullscreen-lg-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0; }\n .modal-fullscreen-lg-down .modal-header {\n border-radius: 0; }\n .modal-fullscreen-lg-down .modal-body {\n overflow-y: auto; }\n .modal-fullscreen-lg-down .modal-footer {\n border-radius: 0; } }\n\n@media (max-width: 1199.98px) {\n .modal-fullscreen-xl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0; }\n .modal-fullscreen-xl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0; }\n .modal-fullscreen-xl-down .modal-header {\n border-radius: 0; }\n .modal-fullscreen-xl-down .modal-body {\n overflow-y: auto; }\n .modal-fullscreen-xl-down .modal-footer {\n border-radius: 0; } }\n\n@media (max-width: 1399.98px) {\n .modal-fullscreen-xxl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0; }\n .modal-fullscreen-xxl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0; }\n .modal-fullscreen-xxl-down .modal-header {\n border-radius: 0; }\n .modal-fullscreen-xxl-down .modal-body {\n overflow-y: auto; }\n .modal-fullscreen-xxl-down .modal-footer {\n border-radius: 0; } }\n\n.tooltip {\n position: absolute;\n z-index: 1080;\n display: block;\n margin: 0;\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.75rem;\n word-wrap: break-word;\n opacity: 0; }\n .tooltip.show {\n opacity: 0.9; }\n .tooltip .tooltip-arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem; }\n .tooltip .tooltip-arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid; }\n\n.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=\"top\"] {\n padding: 0.4rem 0; }\n .bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=\"top\"] .tooltip-arrow {\n bottom: 0; }\n .bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=\"top\"] .tooltip-arrow::before {\n top: -1px;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000; }\n\n.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=\"right\"] {\n padding: 0 0.4rem; }\n .bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=\"right\"] .tooltip-arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem; }\n .bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=\"right\"] .tooltip-arrow::before {\n right: -1px;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000; }\n\n.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=\"bottom\"] {\n padding: 0.4rem 0; }\n .bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=\"bottom\"] .tooltip-arrow {\n top: 0; }\n .bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=\"bottom\"] .tooltip-arrow::before {\n bottom: -1px;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000; }\n\n.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=\"left\"] {\n padding: 0 0.4rem; }\n .bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=\"left\"] .tooltip-arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem; }\n .bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=\"left\"] .tooltip-arrow::before {\n left: -1px;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000; }\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.4rem 0.75rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.375rem; }\n\n.popover {\n position: absolute;\n top: 0;\n left: 0 /* rtl:ignore */;\n z-index: 1070;\n display: block;\n max-width: 276px;\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem; }\n .popover .popover-arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem; }\n .popover .popover-arrow::before, .popover .popover-arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid; }\n\n.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=\"top\"] > .popover-arrow {\n bottom: calc(-0.5rem - 1px); }\n .bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=\"top\"] > .popover-arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25); }\n .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=\"top\"] > .popover-arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff; }\n\n.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=\"right\"] > .popover-arrow {\n left: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem; }\n .bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=\"right\"] > .popover-arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25); }\n .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=\"right\"] > .popover-arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff; }\n\n.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=\"bottom\"] > .popover-arrow {\n top: calc(-0.5rem - 1px); }\n .bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=\"bottom\"] > .popover-arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25); }\n .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=\"bottom\"] > .popover-arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff; }\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f0f0f0; }\n\n.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=\"left\"] > .popover-arrow {\n right: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem; }\n .bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=\"left\"] > .popover-arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25); }\n .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=\"left\"] > .popover-arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff; }\n\n.popover-header {\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f0f0f0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px); }\n .popover-header:empty {\n display: none; }\n\n.popover-body {\n padding: 1rem 1rem;\n color: #212529; }\n\n.carousel {\n position: relative; }\n\n.carousel.pointer-event {\n touch-action: pan-y; }\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden; }\n .carousel-inner::after {\n display: block;\n clear: both;\n content: \"\"; }\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none; } }\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block; }\n\n/* rtl:begin:ignore */\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n transform: translateX(100%); }\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n transform: translateX(-100%); }\n\n/* rtl:end:ignore */\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none; }\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-start,\n.carousel-fade .carousel-item-prev.carousel-item-end {\n z-index: 1;\n opacity: 1; }\n\n.carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n z-index: 0;\n opacity: 0;\n transition: opacity 0s 0.6s; }\n @media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-start,\n .carousel-fade .active.carousel-item-end {\n transition: none; } }\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n padding: 0;\n color: #fff;\n text-align: center;\n background: none;\n border: 0;\n opacity: 0.5;\n transition: opacity 0.15s ease; }\n @media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none; } }\n .carousel-control-prev:hover, .carousel-control-prev:focus,\n .carousel-control-next:hover,\n .carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9; }\n\n.carousel-control-prev {\n left: 0; }\n\n.carousel-control-next {\n right: 0; }\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n background-repeat: no-repeat;\n background-position: 50%;\n background-size: 100% 100%; }\n\n/* rtl:options: {\n \"autoRename\": true,\n \"stringMap\":[ {\n \"name\" : \"prev-next\",\n \"search\" : \"prev\",\n \"replace\" : \"next\"\n } ]\n} */\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e\"); }\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\"); }\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 2;\n display: flex;\n justify-content: center;\n padding: 0;\n margin-right: 15%;\n margin-bottom: 1rem;\n margin-left: 15%;\n list-style: none; }\n .carousel-indicators [data-bs-target] {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n padding: 0;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border: 0;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: 0.5;\n transition: opacity 0.6s ease; }\n @media (prefers-reduced-motion: reduce) {\n .carousel-indicators [data-bs-target] {\n transition: none; } }\n .carousel-indicators .active {\n opacity: 1; }\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 1.25rem;\n left: 15%;\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n color: #fff;\n text-align: center; }\n\n.carousel-dark .carousel-control-prev-icon,\n.carousel-dark .carousel-control-next-icon {\n filter: invert(1) grayscale(100); }\n\n.carousel-dark .carousel-indicators [data-bs-target] {\n background-color: #000; }\n\n.carousel-dark .carousel-caption {\n color: #000; }\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg) /* rtl:ignore */; } }\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: 0.75s linear infinite spinner-border; }\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em; }\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0); }\n 50% {\n opacity: 1;\n transform: none; } }\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: 0.75s linear infinite spinner-grow; }\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem; }\n\n@media (prefers-reduced-motion: reduce) {\n .spinner-border,\n .spinner-grow {\n animation-duration: 1.5s; } }\n\n.offcanvas {\n position: fixed;\n bottom: 0;\n z-index: 1045;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n visibility: hidden;\n background-color: #fff;\n background-clip: padding-box;\n outline: 0;\n transition: transform 0.3s ease-in-out; }\n @media (prefers-reduced-motion: reduce) {\n .offcanvas {\n transition: none; } }\n\n.offcanvas-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000; }\n .offcanvas-backdrop.fade {\n opacity: 0; }\n .offcanvas-backdrop.show {\n opacity: 0.5; }\n\n.offcanvas-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1rem; }\n .offcanvas-header .btn-close {\n padding: 0.5rem 0.5rem;\n margin-top: -0.5rem;\n margin-right: -0.5rem;\n margin-bottom: -0.5rem; }\n\n.offcanvas-title {\n margin-bottom: 0;\n line-height: 1.5; }\n\n.offcanvas-body {\n flex-grow: 1;\n padding: 1rem 1rem;\n overflow-y: auto; }\n\n.offcanvas-start {\n top: 0;\n left: 0;\n width: 400px;\n border-right: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateX(-100%); }\n\n.offcanvas-end {\n top: 0;\n right: 0;\n width: 400px;\n border-left: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateX(100%); }\n\n.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: 30vh;\n max-height: 100%;\n border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateY(-100%); }\n\n.offcanvas-bottom {\n right: 0;\n left: 0;\n height: 30vh;\n max-height: 100%;\n border-top: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateY(100%); }\n\n.offcanvas.show {\n transform: none; }\n\n.placeholder {\n display: inline-block;\n min-height: 1em;\n vertical-align: middle;\n cursor: wait;\n background-color: currentColor;\n opacity: 0.5; }\n .placeholder.btn::before {\n display: inline-block;\n content: \"\"; }\n\n.placeholder-xs {\n min-height: .6em; }\n\n.placeholder-sm {\n min-height: .8em; }\n\n.placeholder-lg {\n min-height: 1.2em; }\n\n.placeholder-glow .placeholder {\n animation: placeholder-glow 2s ease-in-out infinite; }\n\n@keyframes placeholder-glow {\n 50% {\n opacity: 0.2; } }\n\n.placeholder-wave {\n mask-image: linear-gradient(130deg, #000000 55%, rgba(0, 0, 0, 0.8) 75%, #000000 95%);\n mask-size: 200% 100%;\n animation: placeholder-wave 2s linear infinite; }\n\n@keyframes placeholder-wave {\n 100% {\n mask-position: -200% 0%; } }\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\"; }\n\n.link-primary {\n color: #b66dff; }\n .link-primary:hover, .link-primary:focus {\n color: #c58aff; }\n\n.link-secondary {\n color: #c3bdbd; }\n .link-secondary:hover, .link-secondary:focus {\n color: #cfcaca; }\n\n.link-success {\n color: #1bcfb4; }\n .link-success:hover, .link-success:focus {\n color: #49d9c3; }\n\n.link-info {\n color: #198ae3; }\n .link-info:hover, .link-info:focus {\n color: #47a1e9; }\n\n.link-warning {\n color: #fed713; }\n .link-warning:hover, .link-warning:focus {\n color: #fedf42; }\n\n.link-danger {\n color: #fe7c96; }\n .link-danger:hover, .link-danger:focus {\n color: #fe96ab; }\n\n.link-light {\n color: #f8f9fa; }\n .link-light:hover, .link-light:focus {\n color: #f9fafb; }\n\n.link-dark {\n color: #3e4b5b; }\n .link-dark:hover, .link-dark:focus {\n color: #323c49; }\n\n.ratio {\n position: relative;\n width: 100%; }\n .ratio::before {\n display: block;\n padding-top: var(--bs-aspect-ratio);\n content: \"\"; }\n .ratio > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%; }\n\n.ratio-1x1 {\n --bs-aspect-ratio: 100%; }\n\n.ratio-4x3 {\n --bs-aspect-ratio: calc(3 / 4 * 100%); }\n\n.ratio-16x9 {\n --bs-aspect-ratio: calc(9 / 16 * 100%); }\n\n.ratio-21x9 {\n --bs-aspect-ratio: calc(9 / 21 * 100%); }\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030; }\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030; }\n\n.sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020; }\n\n@media (min-width: 576px) {\n .sticky-sm-top {\n position: sticky;\n top: 0;\n z-index: 1020; } }\n\n@media (min-width: 768px) {\n .sticky-md-top {\n position: sticky;\n top: 0;\n z-index: 1020; } }\n\n@media (min-width: 992px) {\n .sticky-lg-top {\n position: sticky;\n top: 0;\n z-index: 1020; } }\n\n@media (min-width: 1200px) {\n .sticky-xl-top {\n position: sticky;\n top: 0;\n z-index: 1020; } }\n\n@media (min-width: 1400px) {\n .sticky-xxl-top {\n position: sticky;\n top: 0;\n z-index: 1020; } }\n\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch; }\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch; }\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important; }\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n content: \"\"; }\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; }\n\n.vr {\n display: inline-block;\n align-self: stretch;\n width: 1px;\n min-height: 1em;\n background-color: currentColor;\n opacity: 0.25; }\n\n.align-baseline {\n vertical-align: baseline !important; }\n\n.align-top {\n vertical-align: top !important; }\n\n.align-middle {\n vertical-align: middle !important; }\n\n.align-bottom {\n vertical-align: bottom !important; }\n\n.align-text-bottom {\n vertical-align: text-bottom !important; }\n\n.align-text-top {\n vertical-align: text-top !important; }\n\n.float-start {\n float: left !important; }\n\n.float-end {\n float: right !important; }\n\n.float-none {\n float: none !important; }\n\n.opacity-0 {\n opacity: 0 !important; }\n\n.opacity-25 {\n opacity: 0.25 !important; }\n\n.opacity-50 {\n opacity: 0.5 !important; }\n\n.opacity-75 {\n opacity: 0.75 !important; }\n\n.opacity-100 {\n opacity: 1 !important; }\n\n.overflow-auto {\n overflow: auto !important; }\n\n.overflow-hidden {\n overflow: hidden !important; }\n\n.overflow-visible {\n overflow: visible !important; }\n\n.overflow-scroll {\n overflow: scroll !important; }\n\n.d-inline {\n display: inline !important; }\n\n.d-inline-block {\n display: inline-block !important; }\n\n.d-block {\n display: block !important; }\n\n.d-grid {\n display: grid !important; }\n\n.d-table {\n display: table !important; }\n\n.d-table-row {\n display: table-row !important; }\n\n.d-table-cell {\n display: table-cell !important; }\n\n.d-flex, .page-header, .loader-demo-box, .list-wrapper ul li, .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu.navbar-dropdown .dropdown-item, .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link {\n display: flex !important; }\n\n.d-inline-flex {\n display: inline-flex !important; }\n\n.d-none {\n display: none !important; }\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; }\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; }\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; }\n\n.shadow-none {\n box-shadow: none !important; }\n\n.position-static {\n position: static !important; }\n\n.position-relative {\n position: relative !important; }\n\n.position-absolute {\n position: absolute !important; }\n\n.position-fixed {\n position: fixed !important; }\n\n.position-sticky {\n position: sticky !important; }\n\n.top-0 {\n top: 0 !important; }\n\n.top-50 {\n top: 50% !important; }\n\n.top-100 {\n top: 100% !important; }\n\n.bottom-0 {\n bottom: 0 !important; }\n\n.bottom-50 {\n bottom: 50% !important; }\n\n.bottom-100 {\n bottom: 100% !important; }\n\n.start-0 {\n left: 0 !important; }\n\n.start-50 {\n left: 50% !important; }\n\n.start-100 {\n left: 100% !important; }\n\n.end-0 {\n right: 0 !important; }\n\n.end-50 {\n right: 50% !important; }\n\n.end-100 {\n right: 100% !important; }\n\n.translate-middle {\n transform: translate(-50%, -50%) !important; }\n\n.translate-middle-x {\n transform: translateX(-50%) !important; }\n\n.translate-middle-y {\n transform: translateY(-50%) !important; }\n\n.border, .loader-demo-box {\n border: 1px solid #ebedf2 !important; }\n\n.border-0 {\n border: 0 !important; }\n\n.border-top {\n border-top: 1px solid #ebedf2 !important; }\n\n.border-top-0 {\n border-top: 0 !important; }\n\n.border-end {\n border-right: 1px solid #ebedf2 !important; }\n\n.border-end-0 {\n border-right: 0 !important; }\n\n.border-bottom {\n border-bottom: 1px solid #ebedf2 !important; }\n\n.border-bottom-0 {\n border-bottom: 0 !important; }\n\n.border-start {\n border-left: 1px solid #ebedf2 !important; }\n\n.border-start-0 {\n border-left: 0 !important; }\n\n.border-primary {\n border-color: #b66dff !important; }\n\n.border-secondary, .loader-demo-box {\n border-color: #c3bdbd !important; }\n\n.border-success {\n border-color: #1bcfb4 !important; }\n\n.border-info {\n border-color: #198ae3 !important; }\n\n.border-warning {\n border-color: #fed713 !important; }\n\n.border-danger {\n border-color: #fe7c96 !important; }\n\n.border-light {\n border-color: #f8f9fa !important; }\n\n.border-dark {\n border-color: #3e4b5b !important; }\n\n.border-white {\n border-color: #ffffff !important; }\n\n.border-1 {\n border-width: 1px !important; }\n\n.border-2 {\n border-width: 2px !important; }\n\n.border-3 {\n border-width: 3px !important; }\n\n.border-4 {\n border-width: 4px !important; }\n\n.border-5 {\n border-width: 5px !important; }\n\n.w-25 {\n width: 25% !important; }\n\n.w-50 {\n width: 50% !important; }\n\n.w-75 {\n width: 75% !important; }\n\n.w-100 {\n width: 100% !important; }\n\n.w-auto {\n width: auto !important; }\n\n.mw-100 {\n max-width: 100% !important; }\n\n.vw-100 {\n width: 100vw !important; }\n\n.min-vw-100 {\n min-width: 100vw !important; }\n\n.h-25 {\n height: 25% !important; }\n\n.h-50 {\n height: 50% !important; }\n\n.h-75 {\n height: 75% !important; }\n\n.h-100 {\n height: 100% !important; }\n\n.h-auto {\n height: auto !important; }\n\n.mh-100 {\n max-height: 100% !important; }\n\n.vh-100 {\n height: 100vh !important; }\n\n.min-vh-100 {\n min-height: 100vh !important; }\n\n.flex-fill {\n flex: 1 1 auto !important; }\n\n.flex-row {\n flex-direction: row !important; }\n\n.flex-column {\n flex-direction: column !important; }\n\n.flex-row-reverse {\n flex-direction: row-reverse !important; }\n\n.flex-column-reverse {\n flex-direction: column-reverse !important; }\n\n.flex-grow-0 {\n flex-grow: 0 !important; }\n\n.flex-grow-1 {\n flex-grow: 1 !important; }\n\n.flex-shrink-0 {\n flex-shrink: 0 !important; }\n\n.flex-shrink-1 {\n flex-shrink: 1 !important; }\n\n.flex-wrap {\n flex-wrap: wrap !important; }\n\n.flex-nowrap {\n flex-wrap: nowrap !important; }\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important; }\n\n.gap-0 {\n gap: 0 !important; }\n\n.gap-1 {\n gap: 0.25rem !important; }\n\n.gap-2 {\n gap: 0.5rem !important; }\n\n.gap-3 {\n gap: 1rem !important; }\n\n.gap-4 {\n gap: 1.5rem !important; }\n\n.gap-5 {\n gap: 3rem !important; }\n\n.justify-content-start, .list-wrapper ul li {\n justify-content: flex-start !important; }\n\n.justify-content-end {\n justify-content: flex-end !important; }\n\n.justify-content-center {\n justify-content: center !important; }\n\n.justify-content-between, .page-header {\n justify-content: space-between !important; }\n\n.justify-content-around {\n justify-content: space-around !important; }\n\n.justify-content-evenly {\n justify-content: space-evenly !important; }\n\n.align-items-start {\n align-items: flex-start !important; }\n\n.align-items-end {\n align-items: flex-end !important; }\n\n.align-items-center, .page-header, .loader-demo-box, .list-wrapper ul li, .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu.navbar-dropdown .dropdown-item {\n align-items: center !important; }\n\n.align-items-baseline {\n align-items: baseline !important; }\n\n.align-items-stretch {\n align-items: stretch !important; }\n\n.align-content-start {\n align-content: flex-start !important; }\n\n.align-content-end {\n align-content: flex-end !important; }\n\n.align-content-center {\n align-content: center !important; }\n\n.align-content-between {\n align-content: space-between !important; }\n\n.align-content-around {\n align-content: space-around !important; }\n\n.align-content-stretch {\n align-content: stretch !important; }\n\n.align-self-auto {\n align-self: auto !important; }\n\n.align-self-start {\n align-self: flex-start !important; }\n\n.align-self-end {\n align-self: flex-end !important; }\n\n.align-self-center {\n align-self: center !important; }\n\n.align-self-baseline {\n align-self: baseline !important; }\n\n.align-self-stretch {\n align-self: stretch !important; }\n\n.order-first {\n order: -1 !important; }\n\n.order-0 {\n order: 0 !important; }\n\n.order-1 {\n order: 1 !important; }\n\n.order-2 {\n order: 2 !important; }\n\n.order-3 {\n order: 3 !important; }\n\n.order-4 {\n order: 4 !important; }\n\n.order-5 {\n order: 5 !important; }\n\n.order-last {\n order: 6 !important; }\n\n.m-0 {\n margin: 0 !important; }\n\n.m-1 {\n margin: 0.25rem !important; }\n\n.m-2 {\n margin: 0.5rem !important; }\n\n.m-3 {\n margin: 1rem !important; }\n\n.m-4 {\n margin: 1.5rem !important; }\n\n.m-5 {\n margin: 3rem !important; }\n\n.m-auto {\n margin: auto !important; }\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important; }\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important; }\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important; }\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important; }\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important; }\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important; }\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important; }\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important; }\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important; }\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important; }\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important; }\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important; }\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important; }\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important; }\n\n.mt-0, .demo-modal .modal-dialog {\n margin-top: 0 !important; }\n\n.mt-1 {\n margin-top: 0.25rem !important; }\n\n.mt-2, .template-demo > .btn-group,\n.template-demo > .btn-group-vertical, .template-demo .circle-progress {\n margin-top: 0.5rem !important; }\n\n.mt-3, .template-demo > .btn, .template-demo > .btn-toolbar {\n margin-top: 1rem !important; }\n\n.mt-4 {\n margin-top: 1.5rem !important; }\n\n.mt-5 {\n margin-top: 3rem !important; }\n\n.mt-auto {\n margin-top: auto !important; }\n\n.me-0, .rtl .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu.navbar-dropdown .dropdown-item i {\n margin-right: 0 !important; }\n\n.me-1 {\n margin-right: 0.25rem !important; }\n\n.me-2, .template-demo > .btn-group,\n.template-demo > .btn-group-vertical, .template-demo > .dropdown {\n margin-right: 0.5rem !important; }\n\n.me-3, .template-demo > .btn, .template-demo > .btn-toolbar {\n margin-right: 1rem !important; }\n\n.me-4, .rtl .navbar .navbar-menu-wrapper .search-field {\n margin-right: 1.5rem !important; }\n\n.me-5 {\n margin-right: 3rem !important; }\n\n.me-auto, .rtl .list-wrapper .remove {\n margin-right: auto !important; }\n\n.mb-0 {\n margin-bottom: 0 !important; }\n\n.mb-1 {\n margin-bottom: 0.25rem !important; }\n\n.mb-2 {\n margin-bottom: 0.5rem !important; }\n\n.mb-3, .template-demo .circle-progress-block {\n margin-bottom: 1rem !important; }\n\n.mb-4 {\n margin-bottom: 1.5rem !important; }\n\n.mb-5 {\n margin-bottom: 3rem !important; }\n\n.mb-auto {\n margin-bottom: auto !important; }\n\n.ms-0, .rtl .preview-list .preview-item .preview-thumbnail .preview-icon i, .rtl .list-wrapper .remove, .rtl .navbar .navbar-menu-wrapper .search-field {\n margin-left: 0 !important; }\n\n.ms-1 {\n margin-left: 0.25rem !important; }\n\n.ms-2, .btn-toolbar .btn-group + .btn-group {\n margin-left: 0.5rem !important; }\n\n.ms-3 {\n margin-left: 1rem !important; }\n\n.ms-4 {\n margin-left: 1.5rem !important; }\n\n.ms-5 {\n margin-left: 3rem !important; }\n\n.ms-auto, .list-wrapper .remove {\n margin-left: auto !important; }\n\n.p-0 {\n padding: 0 !important; }\n\n.p-1 {\n padding: 0.25rem !important; }\n\n.p-2 {\n padding: 0.5rem !important; }\n\n.p-3 {\n padding: 1rem !important; }\n\n.p-4 {\n padding: 1.5rem !important; }\n\n.p-5 {\n padding: 3rem !important; }\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important; }\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important; }\n\n.px-2, .template-demo .circle-progress-block {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important; }\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important; }\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important; }\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important; }\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important; }\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important; }\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important; }\n\n.py-3, .card-revenue-table .revenue-item {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important; }\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important; }\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important; }\n\n.pt-0, .card-revenue-table .revenue-item:first-child {\n padding-top: 0 !important; }\n\n.pt-1 {\n padding-top: 0.25rem !important; }\n\n.pt-2 {\n padding-top: 0.5rem !important; }\n\n.pt-3 {\n padding-top: 1rem !important; }\n\n.pt-4 {\n padding-top: 1.5rem !important; }\n\n.pt-5 {\n padding-top: 3rem !important; }\n\n.pe-0 {\n padding-right: 0 !important; }\n\n.pe-1 {\n padding-right: 0.25rem !important; }\n\n.pe-2 {\n padding-right: 0.5rem !important; }\n\n.pe-3 {\n padding-right: 1rem !important; }\n\n.pe-4 {\n padding-right: 1.5rem !important; }\n\n.pe-5 {\n padding-right: 3rem !important; }\n\n.pb-0, .card-revenue-table .revenue-item:last-child {\n padding-bottom: 0 !important; }\n\n.pb-1 {\n padding-bottom: 0.25rem !important; }\n\n.pb-2 {\n padding-bottom: 0.5rem !important; }\n\n.pb-3 {\n padding-bottom: 1rem !important; }\n\n.pb-4 {\n padding-bottom: 1.5rem !important; }\n\n.pb-5 {\n padding-bottom: 3rem !important; }\n\n.ps-0 {\n padding-left: 0 !important; }\n\n.ps-1 {\n padding-left: 0.25rem !important; }\n\n.ps-2 {\n padding-left: 0.5rem !important; }\n\n.ps-3 {\n padding-left: 1rem !important; }\n\n.ps-4 {\n padding-left: 1.5rem !important; }\n\n.ps-5 {\n padding-left: 3rem !important; }\n\n.font-monospace {\n font-family: var(--bs-font-monospace) !important; }\n\n.fs-1 {\n font-size: calc(1.375rem + 1.5vw) !important; }\n\n.fs-2 {\n font-size: calc(1.325rem + 0.9vw) !important; }\n\n.fs-3 {\n font-size: calc(1.3rem + 0.6vw) !important; }\n\n.fs-4 {\n font-size: calc(1.275rem + 0.3vw) !important; }\n\n.fs-5 {\n font-size: 1.25rem !important; }\n\n.fs-6 {\n font-size: 1rem !important; }\n\n.fst-italic {\n font-style: italic !important; }\n\n.fst-normal {\n font-style: normal !important; }\n\n.fw-light {\n font-weight: 300 !important; }\n\n.fw-lighter {\n font-weight: lighter !important; }\n\n.fw-normal {\n font-weight: 400 !important; }\n\n.fw-bold {\n font-weight: 700 !important; }\n\n.fw-bolder {\n font-weight: bolder !important; }\n\n.lh-1 {\n line-height: 1 !important; }\n\n.lh-sm {\n line-height: 1.25 !important; }\n\n.lh-base {\n line-height: 1.5 !important; }\n\n.lh-lg {\n line-height: 2 !important; }\n\n.text-start {\n text-align: left !important; }\n\n.text-end {\n text-align: right !important; }\n\n.text-center {\n text-align: center !important; }\n\n.text-decoration-none {\n text-decoration: none !important; }\n\n.text-decoration-underline {\n text-decoration: underline !important; }\n\n.text-decoration-line-through {\n text-decoration: line-through !important; }\n\n.text-lowercase {\n text-transform: lowercase !important; }\n\n.text-uppercase {\n text-transform: uppercase !important; }\n\n.text-capitalize {\n text-transform: capitalize !important; }\n\n.text-wrap {\n white-space: normal !important; }\n\n.text-nowrap {\n white-space: nowrap !important; }\n\n/* rtl:begin:remove */\n.text-break {\n word-wrap: break-word !important;\n word-break: break-word !important; }\n\n/* rtl:end:remove */\n.text-primary, .list-wrapper .completed .remove {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; }\n\n.text-secondary, .list-wrapper .remove {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; }\n\n.text-success {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; }\n\n.text-info {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; }\n\n.text-warning {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; }\n\n.text-danger {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; }\n\n.text-light {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; }\n\n.text-dark {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; }\n\n.text-black {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; }\n\n.text-white, .navbar.navbar-primary .navbar-menu-wrapper .nav-profile-text p, .navbar.navbar-secondary .navbar-menu-wrapper .nav-profile-text p, .navbar.navbar-success .navbar-menu-wrapper .nav-profile-text p, .navbar.navbar-info .navbar-menu-wrapper .nav-profile-text p, .navbar.navbar-warning .navbar-menu-wrapper .nav-profile-text p, .navbar.navbar-danger .navbar-menu-wrapper .nav-profile-text p, .navbar.navbar-light .navbar-menu-wrapper .nav-profile-text p, .navbar.navbar-dark .navbar-menu-wrapper .nav-profile-text p {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; }\n\n.text-body {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; }\n\n.text-muted, .preview-list .preview-item .preview-item-content p .content-category {\n --bs-text-opacity: 1;\n color: #9c9fa6 !important; }\n\n.text-black-50 {\n --bs-text-opacity: 1;\n color: rgba(0, 0, 0, 0.5) !important; }\n\n.text-white-50 {\n --bs-text-opacity: 1;\n color: rgba(255, 255, 255, 0.5) !important; }\n\n.text-reset {\n --bs-text-opacity: 1;\n color: inherit !important; }\n\n.text-opacity-25 {\n --bs-text-opacity: 0.25; }\n\n.text-opacity-50 {\n --bs-text-opacity: 0.5; }\n\n.text-opacity-75 {\n --bs-text-opacity: 0.75; }\n\n.text-opacity-100 {\n --bs-text-opacity: 1; }\n\n.bg-primary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; }\n\n.bg-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; }\n\n.bg-success {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; }\n\n.bg-info {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; }\n\n.bg-warning {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; }\n\n.bg-danger {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; }\n\n.bg-light {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; }\n\n.bg-dark {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; }\n\n.bg-black {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; }\n\n.bg-white {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; }\n\n.bg-body {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; }\n\n.bg-transparent {\n --bs-bg-opacity: 1;\n background-color: transparent !important; }\n\n.bg-opacity-10 {\n --bs-bg-opacity: 0.1; }\n\n.bg-opacity-25 {\n --bs-bg-opacity: 0.25; }\n\n.bg-opacity-50 {\n --bs-bg-opacity: 0.5; }\n\n.bg-opacity-75 {\n --bs-bg-opacity: 0.75; }\n\n.bg-opacity-100 {\n --bs-bg-opacity: 1; }\n\n.bg-gradient {\n background-image: var(--bs-gradient) !important; }\n\n.user-select-all {\n user-select: all !important; }\n\n.user-select-auto {\n user-select: auto !important; }\n\n.user-select-none {\n user-select: none !important; }\n\n.pe-none {\n pointer-events: none !important; }\n\n.pe-auto {\n pointer-events: auto !important; }\n\n.rounded, .loader-demo-box {\n border-radius: 0.25rem !important; }\n\n.rounded-0 {\n border-radius: 0 !important; }\n\n.rounded-1 {\n border-radius: 0.2rem !important; }\n\n.rounded-2 {\n border-radius: 0.25rem !important; }\n\n.rounded-3 {\n border-radius: 0.3rem !important; }\n\n.rounded-circle {\n border-radius: 50% !important; }\n\n.rounded-pill {\n border-radius: 50rem !important; }\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important; }\n\n.rounded-end {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important; }\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important; }\n\n.rounded-start {\n border-bottom-left-radius: 0.25rem !important;\n border-top-left-radius: 0.25rem !important; }\n\n.visible {\n visibility: visible !important; }\n\n.invisible {\n visibility: hidden !important; }\n\n@media (min-width: 576px) {\n .float-sm-start {\n float: left !important; }\n .float-sm-end {\n float: right !important; }\n .float-sm-none {\n float: none !important; }\n .d-sm-inline {\n display: inline !important; }\n .d-sm-inline-block {\n display: inline-block !important; }\n .d-sm-block {\n display: block !important; }\n .d-sm-grid {\n display: grid !important; }\n .d-sm-table {\n display: table !important; }\n .d-sm-table-row {\n display: table-row !important; }\n .d-sm-table-cell {\n display: table-cell !important; }\n .d-sm-flex {\n display: flex !important; }\n .d-sm-inline-flex {\n display: inline-flex !important; }\n .d-sm-none {\n display: none !important; }\n .flex-sm-fill {\n flex: 1 1 auto !important; }\n .flex-sm-row {\n flex-direction: row !important; }\n .flex-sm-column {\n flex-direction: column !important; }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important; }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important; }\n .flex-sm-grow-0 {\n flex-grow: 0 !important; }\n .flex-sm-grow-1 {\n flex-grow: 1 !important; }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important; }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important; }\n .flex-sm-wrap {\n flex-wrap: wrap !important; }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important; }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important; }\n .gap-sm-0 {\n gap: 0 !important; }\n .gap-sm-1 {\n gap: 0.25rem !important; }\n .gap-sm-2 {\n gap: 0.5rem !important; }\n .gap-sm-3 {\n gap: 1rem !important; }\n .gap-sm-4 {\n gap: 1.5rem !important; }\n .gap-sm-5 {\n gap: 3rem !important; }\n .justify-content-sm-start {\n justify-content: flex-start !important; }\n .justify-content-sm-end {\n justify-content: flex-end !important; }\n .justify-content-sm-center {\n justify-content: center !important; }\n .justify-content-sm-between {\n justify-content: space-between !important; }\n .justify-content-sm-around {\n justify-content: space-around !important; }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important; }\n .align-items-sm-start {\n align-items: flex-start !important; }\n .align-items-sm-end {\n align-items: flex-end !important; }\n .align-items-sm-center {\n align-items: center !important; }\n .align-items-sm-baseline {\n align-items: baseline !important; }\n .align-items-sm-stretch {\n align-items: stretch !important; }\n .align-content-sm-start {\n align-content: flex-start !important; }\n .align-content-sm-end {\n align-content: flex-end !important; }\n .align-content-sm-center {\n align-content: center !important; }\n .align-content-sm-between {\n align-content: space-between !important; }\n .align-content-sm-around {\n align-content: space-around !important; }\n .align-content-sm-stretch {\n align-content: stretch !important; }\n .align-self-sm-auto {\n align-self: auto !important; }\n .align-self-sm-start {\n align-self: flex-start !important; }\n .align-self-sm-end {\n align-self: flex-end !important; }\n .align-self-sm-center {\n align-self: center !important; }\n .align-self-sm-baseline {\n align-self: baseline !important; }\n .align-self-sm-stretch {\n align-self: stretch !important; }\n .order-sm-first {\n order: -1 !important; }\n .order-sm-0 {\n order: 0 !important; }\n .order-sm-1 {\n order: 1 !important; }\n .order-sm-2 {\n order: 2 !important; }\n .order-sm-3 {\n order: 3 !important; }\n .order-sm-4 {\n order: 4 !important; }\n .order-sm-5 {\n order: 5 !important; }\n .order-sm-last {\n order: 6 !important; }\n .m-sm-0 {\n margin: 0 !important; }\n .m-sm-1 {\n margin: 0.25rem !important; }\n .m-sm-2 {\n margin: 0.5rem !important; }\n .m-sm-3 {\n margin: 1rem !important; }\n .m-sm-4 {\n margin: 1.5rem !important; }\n .m-sm-5 {\n margin: 3rem !important; }\n .m-sm-auto {\n margin: auto !important; }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important; }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important; }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important; }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important; }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important; }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important; }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important; }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important; }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important; }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important; }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important; }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important; }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important; }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important; }\n .mt-sm-0 {\n margin-top: 0 !important; }\n .mt-sm-1 {\n margin-top: 0.25rem !important; }\n .mt-sm-2 {\n margin-top: 0.5rem !important; }\n .mt-sm-3 {\n margin-top: 1rem !important; }\n .mt-sm-4 {\n margin-top: 1.5rem !important; }\n .mt-sm-5 {\n margin-top: 3rem !important; }\n .mt-sm-auto {\n margin-top: auto !important; }\n .me-sm-0 {\n margin-right: 0 !important; }\n .me-sm-1 {\n margin-right: 0.25rem !important; }\n .me-sm-2 {\n margin-right: 0.5rem !important; }\n .me-sm-3 {\n margin-right: 1rem !important; }\n .me-sm-4 {\n margin-right: 1.5rem !important; }\n .me-sm-5 {\n margin-right: 3rem !important; }\n .me-sm-auto {\n margin-right: auto !important; }\n .mb-sm-0 {\n margin-bottom: 0 !important; }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important; }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important; }\n .mb-sm-3 {\n margin-bottom: 1rem !important; }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important; }\n .mb-sm-5 {\n margin-bottom: 3rem !important; }\n .mb-sm-auto {\n margin-bottom: auto !important; }\n .ms-sm-0 {\n margin-left: 0 !important; }\n .ms-sm-1 {\n margin-left: 0.25rem !important; }\n .ms-sm-2 {\n margin-left: 0.5rem !important; }\n .ms-sm-3 {\n margin-left: 1rem !important; }\n .ms-sm-4 {\n margin-left: 1.5rem !important; }\n .ms-sm-5 {\n margin-left: 3rem !important; }\n .ms-sm-auto {\n margin-left: auto !important; }\n .p-sm-0 {\n padding: 0 !important; }\n .p-sm-1 {\n padding: 0.25rem !important; }\n .p-sm-2 {\n padding: 0.5rem !important; }\n .p-sm-3 {\n padding: 1rem !important; }\n .p-sm-4 {\n padding: 1.5rem !important; }\n .p-sm-5 {\n padding: 3rem !important; }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important; }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important; }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important; }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important; }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important; }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important; }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important; }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important; }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important; }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important; }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important; }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important; }\n .pt-sm-0 {\n padding-top: 0 !important; }\n .pt-sm-1 {\n padding-top: 0.25rem !important; }\n .pt-sm-2 {\n padding-top: 0.5rem !important; }\n .pt-sm-3 {\n padding-top: 1rem !important; }\n .pt-sm-4 {\n padding-top: 1.5rem !important; }\n .pt-sm-5 {\n padding-top: 3rem !important; }\n .pe-sm-0 {\n padding-right: 0 !important; }\n .pe-sm-1 {\n padding-right: 0.25rem !important; }\n .pe-sm-2 {\n padding-right: 0.5rem !important; }\n .pe-sm-3 {\n padding-right: 1rem !important; }\n .pe-sm-4 {\n padding-right: 1.5rem !important; }\n .pe-sm-5 {\n padding-right: 3rem !important; }\n .pb-sm-0 {\n padding-bottom: 0 !important; }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important; }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important; }\n .pb-sm-3 {\n padding-bottom: 1rem !important; }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important; }\n .pb-sm-5 {\n padding-bottom: 3rem !important; }\n .ps-sm-0 {\n padding-left: 0 !important; }\n .ps-sm-1 {\n padding-left: 0.25rem !important; }\n .ps-sm-2 {\n padding-left: 0.5rem !important; }\n .ps-sm-3 {\n padding-left: 1rem !important; }\n .ps-sm-4 {\n padding-left: 1.5rem !important; }\n .ps-sm-5 {\n padding-left: 3rem !important; }\n .text-sm-start {\n text-align: left !important; }\n .text-sm-end {\n text-align: right !important; }\n .text-sm-center {\n text-align: center !important; } }\n\n@media (min-width: 768px) {\n .float-md-start {\n float: left !important; }\n .float-md-end {\n float: right !important; }\n .float-md-none {\n float: none !important; }\n .d-md-inline {\n display: inline !important; }\n .d-md-inline-block {\n display: inline-block !important; }\n .d-md-block {\n display: block !important; }\n .d-md-grid {\n display: grid !important; }\n .d-md-table {\n display: table !important; }\n .d-md-table-row {\n display: table-row !important; }\n .d-md-table-cell {\n display: table-cell !important; }\n .d-md-flex {\n display: flex !important; }\n .d-md-inline-flex {\n display: inline-flex !important; }\n .d-md-none {\n display: none !important; }\n .flex-md-fill {\n flex: 1 1 auto !important; }\n .flex-md-row {\n flex-direction: row !important; }\n .flex-md-column {\n flex-direction: column !important; }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important; }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important; }\n .flex-md-grow-0 {\n flex-grow: 0 !important; }\n .flex-md-grow-1 {\n flex-grow: 1 !important; }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important; }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important; }\n .flex-md-wrap {\n flex-wrap: wrap !important; }\n .flex-md-nowrap {\n flex-wrap: nowrap !important; }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important; }\n .gap-md-0 {\n gap: 0 !important; }\n .gap-md-1 {\n gap: 0.25rem !important; }\n .gap-md-2 {\n gap: 0.5rem !important; }\n .gap-md-3 {\n gap: 1rem !important; }\n .gap-md-4 {\n gap: 1.5rem !important; }\n .gap-md-5 {\n gap: 3rem !important; }\n .justify-content-md-start {\n justify-content: flex-start !important; }\n .justify-content-md-end {\n justify-content: flex-end !important; }\n .justify-content-md-center {\n justify-content: center !important; }\n .justify-content-md-between {\n justify-content: space-between !important; }\n .justify-content-md-around {\n justify-content: space-around !important; }\n .justify-content-md-evenly {\n justify-content: space-evenly !important; }\n .align-items-md-start {\n align-items: flex-start !important; }\n .align-items-md-end {\n align-items: flex-end !important; }\n .align-items-md-center {\n align-items: center !important; }\n .align-items-md-baseline {\n align-items: baseline !important; }\n .align-items-md-stretch {\n align-items: stretch !important; }\n .align-content-md-start {\n align-content: flex-start !important; }\n .align-content-md-end {\n align-content: flex-end !important; }\n .align-content-md-center {\n align-content: center !important; }\n .align-content-md-between {\n align-content: space-between !important; }\n .align-content-md-around {\n align-content: space-around !important; }\n .align-content-md-stretch {\n align-content: stretch !important; }\n .align-self-md-auto {\n align-self: auto !important; }\n .align-self-md-start {\n align-self: flex-start !important; }\n .align-self-md-end {\n align-self: flex-end !important; }\n .align-self-md-center {\n align-self: center !important; }\n .align-self-md-baseline {\n align-self: baseline !important; }\n .align-self-md-stretch {\n align-self: stretch !important; }\n .order-md-first {\n order: -1 !important; }\n .order-md-0 {\n order: 0 !important; }\n .order-md-1 {\n order: 1 !important; }\n .order-md-2 {\n order: 2 !important; }\n .order-md-3 {\n order: 3 !important; }\n .order-md-4 {\n order: 4 !important; }\n .order-md-5 {\n order: 5 !important; }\n .order-md-last {\n order: 6 !important; }\n .m-md-0 {\n margin: 0 !important; }\n .m-md-1 {\n margin: 0.25rem !important; }\n .m-md-2 {\n margin: 0.5rem !important; }\n .m-md-3 {\n margin: 1rem !important; }\n .m-md-4 {\n margin: 1.5rem !important; }\n .m-md-5 {\n margin: 3rem !important; }\n .m-md-auto {\n margin: auto !important; }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important; }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important; }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important; }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important; }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important; }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important; }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important; }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important; }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important; }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important; }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important; }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important; }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important; }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important; }\n .mt-md-0 {\n margin-top: 0 !important; }\n .mt-md-1 {\n margin-top: 0.25rem !important; }\n .mt-md-2 {\n margin-top: 0.5rem !important; }\n .mt-md-3 {\n margin-top: 1rem !important; }\n .mt-md-4 {\n margin-top: 1.5rem !important; }\n .mt-md-5 {\n margin-top: 3rem !important; }\n .mt-md-auto {\n margin-top: auto !important; }\n .me-md-0 {\n margin-right: 0 !important; }\n .me-md-1 {\n margin-right: 0.25rem !important; }\n .me-md-2 {\n margin-right: 0.5rem !important; }\n .me-md-3 {\n margin-right: 1rem !important; }\n .me-md-4 {\n margin-right: 1.5rem !important; }\n .me-md-5 {\n margin-right: 3rem !important; }\n .me-md-auto {\n margin-right: auto !important; }\n .mb-md-0 {\n margin-bottom: 0 !important; }\n .mb-md-1 {\n margin-bottom: 0.25rem !important; }\n .mb-md-2 {\n margin-bottom: 0.5rem !important; }\n .mb-md-3 {\n margin-bottom: 1rem !important; }\n .mb-md-4 {\n margin-bottom: 1.5rem !important; }\n .mb-md-5 {\n margin-bottom: 3rem !important; }\n .mb-md-auto {\n margin-bottom: auto !important; }\n .ms-md-0 {\n margin-left: 0 !important; }\n .ms-md-1 {\n margin-left: 0.25rem !important; }\n .ms-md-2 {\n margin-left: 0.5rem !important; }\n .ms-md-3 {\n margin-left: 1rem !important; }\n .ms-md-4 {\n margin-left: 1.5rem !important; }\n .ms-md-5 {\n margin-left: 3rem !important; }\n .ms-md-auto {\n margin-left: auto !important; }\n .p-md-0 {\n padding: 0 !important; }\n .p-md-1 {\n padding: 0.25rem !important; }\n .p-md-2 {\n padding: 0.5rem !important; }\n .p-md-3 {\n padding: 1rem !important; }\n .p-md-4 {\n padding: 1.5rem !important; }\n .p-md-5 {\n padding: 3rem !important; }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important; }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important; }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important; }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important; }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important; }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important; }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important; }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important; }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important; }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important; }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important; }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important; }\n .pt-md-0 {\n padding-top: 0 !important; }\n .pt-md-1 {\n padding-top: 0.25rem !important; }\n .pt-md-2 {\n padding-top: 0.5rem !important; }\n .pt-md-3 {\n padding-top: 1rem !important; }\n .pt-md-4 {\n padding-top: 1.5rem !important; }\n .pt-md-5 {\n padding-top: 3rem !important; }\n .pe-md-0 {\n padding-right: 0 !important; }\n .pe-md-1 {\n padding-right: 0.25rem !important; }\n .pe-md-2 {\n padding-right: 0.5rem !important; }\n .pe-md-3 {\n padding-right: 1rem !important; }\n .pe-md-4 {\n padding-right: 1.5rem !important; }\n .pe-md-5 {\n padding-right: 3rem !important; }\n .pb-md-0 {\n padding-bottom: 0 !important; }\n .pb-md-1 {\n padding-bottom: 0.25rem !important; }\n .pb-md-2 {\n padding-bottom: 0.5rem !important; }\n .pb-md-3 {\n padding-bottom: 1rem !important; }\n .pb-md-4 {\n padding-bottom: 1.5rem !important; }\n .pb-md-5 {\n padding-bottom: 3rem !important; }\n .ps-md-0 {\n padding-left: 0 !important; }\n .ps-md-1 {\n padding-left: 0.25rem !important; }\n .ps-md-2 {\n padding-left: 0.5rem !important; }\n .ps-md-3 {\n padding-left: 1rem !important; }\n .ps-md-4 {\n padding-left: 1.5rem !important; }\n .ps-md-5 {\n padding-left: 3rem !important; }\n .text-md-start {\n text-align: left !important; }\n .text-md-end {\n text-align: right !important; }\n .text-md-center {\n text-align: center !important; } }\n\n@media (min-width: 992px) {\n .float-lg-start {\n float: left !important; }\n .float-lg-end {\n float: right !important; }\n .float-lg-none {\n float: none !important; }\n .d-lg-inline {\n display: inline !important; }\n .d-lg-inline-block {\n display: inline-block !important; }\n .d-lg-block {\n display: block !important; }\n .d-lg-grid {\n display: grid !important; }\n .d-lg-table {\n display: table !important; }\n .d-lg-table-row {\n display: table-row !important; }\n .d-lg-table-cell {\n display: table-cell !important; }\n .d-lg-flex {\n display: flex !important; }\n .d-lg-inline-flex {\n display: inline-flex !important; }\n .d-lg-none {\n display: none !important; }\n .flex-lg-fill {\n flex: 1 1 auto !important; }\n .flex-lg-row {\n flex-direction: row !important; }\n .flex-lg-column {\n flex-direction: column !important; }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important; }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important; }\n .flex-lg-grow-0 {\n flex-grow: 0 !important; }\n .flex-lg-grow-1 {\n flex-grow: 1 !important; }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important; }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important; }\n .flex-lg-wrap {\n flex-wrap: wrap !important; }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important; }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important; }\n .gap-lg-0 {\n gap: 0 !important; }\n .gap-lg-1 {\n gap: 0.25rem !important; }\n .gap-lg-2 {\n gap: 0.5rem !important; }\n .gap-lg-3 {\n gap: 1rem !important; }\n .gap-lg-4 {\n gap: 1.5rem !important; }\n .gap-lg-5 {\n gap: 3rem !important; }\n .justify-content-lg-start {\n justify-content: flex-start !important; }\n .justify-content-lg-end {\n justify-content: flex-end !important; }\n .justify-content-lg-center {\n justify-content: center !important; }\n .justify-content-lg-between {\n justify-content: space-between !important; }\n .justify-content-lg-around {\n justify-content: space-around !important; }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important; }\n .align-items-lg-start {\n align-items: flex-start !important; }\n .align-items-lg-end {\n align-items: flex-end !important; }\n .align-items-lg-center {\n align-items: center !important; }\n .align-items-lg-baseline {\n align-items: baseline !important; }\n .align-items-lg-stretch {\n align-items: stretch !important; }\n .align-content-lg-start {\n align-content: flex-start !important; }\n .align-content-lg-end {\n align-content: flex-end !important; }\n .align-content-lg-center {\n align-content: center !important; }\n .align-content-lg-between {\n align-content: space-between !important; }\n .align-content-lg-around {\n align-content: space-around !important; }\n .align-content-lg-stretch {\n align-content: stretch !important; }\n .align-self-lg-auto {\n align-self: auto !important; }\n .align-self-lg-start {\n align-self: flex-start !important; }\n .align-self-lg-end {\n align-self: flex-end !important; }\n .align-self-lg-center {\n align-self: center !important; }\n .align-self-lg-baseline {\n align-self: baseline !important; }\n .align-self-lg-stretch {\n align-self: stretch !important; }\n .order-lg-first {\n order: -1 !important; }\n .order-lg-0 {\n order: 0 !important; }\n .order-lg-1 {\n order: 1 !important; }\n .order-lg-2 {\n order: 2 !important; }\n .order-lg-3 {\n order: 3 !important; }\n .order-lg-4 {\n order: 4 !important; }\n .order-lg-5 {\n order: 5 !important; }\n .order-lg-last {\n order: 6 !important; }\n .m-lg-0 {\n margin: 0 !important; }\n .m-lg-1 {\n margin: 0.25rem !important; }\n .m-lg-2 {\n margin: 0.5rem !important; }\n .m-lg-3 {\n margin: 1rem !important; }\n .m-lg-4 {\n margin: 1.5rem !important; }\n .m-lg-5 {\n margin: 3rem !important; }\n .m-lg-auto {\n margin: auto !important; }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important; }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important; }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important; }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important; }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important; }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important; }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important; }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important; }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important; }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important; }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important; }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important; }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important; }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important; }\n .mt-lg-0 {\n margin-top: 0 !important; }\n .mt-lg-1 {\n margin-top: 0.25rem !important; }\n .mt-lg-2 {\n margin-top: 0.5rem !important; }\n .mt-lg-3 {\n margin-top: 1rem !important; }\n .mt-lg-4 {\n margin-top: 1.5rem !important; }\n .mt-lg-5 {\n margin-top: 3rem !important; }\n .mt-lg-auto {\n margin-top: auto !important; }\n .me-lg-0 {\n margin-right: 0 !important; }\n .me-lg-1 {\n margin-right: 0.25rem !important; }\n .me-lg-2 {\n margin-right: 0.5rem !important; }\n .me-lg-3 {\n margin-right: 1rem !important; }\n .me-lg-4 {\n margin-right: 1.5rem !important; }\n .me-lg-5 {\n margin-right: 3rem !important; }\n .me-lg-auto {\n margin-right: auto !important; }\n .mb-lg-0 {\n margin-bottom: 0 !important; }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important; }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important; }\n .mb-lg-3 {\n margin-bottom: 1rem !important; }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important; }\n .mb-lg-5 {\n margin-bottom: 3rem !important; }\n .mb-lg-auto {\n margin-bottom: auto !important; }\n .ms-lg-0 {\n margin-left: 0 !important; }\n .ms-lg-1 {\n margin-left: 0.25rem !important; }\n .ms-lg-2 {\n margin-left: 0.5rem !important; }\n .ms-lg-3 {\n margin-left: 1rem !important; }\n .ms-lg-4 {\n margin-left: 1.5rem !important; }\n .ms-lg-5 {\n margin-left: 3rem !important; }\n .ms-lg-auto {\n margin-left: auto !important; }\n .p-lg-0 {\n padding: 0 !important; }\n .p-lg-1 {\n padding: 0.25rem !important; }\n .p-lg-2 {\n padding: 0.5rem !important; }\n .p-lg-3 {\n padding: 1rem !important; }\n .p-lg-4 {\n padding: 1.5rem !important; }\n .p-lg-5 {\n padding: 3rem !important; }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important; }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important; }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important; }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important; }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important; }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important; }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important; }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important; }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important; }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important; }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important; }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important; }\n .pt-lg-0 {\n padding-top: 0 !important; }\n .pt-lg-1 {\n padding-top: 0.25rem !important; }\n .pt-lg-2 {\n padding-top: 0.5rem !important; }\n .pt-lg-3 {\n padding-top: 1rem !important; }\n .pt-lg-4 {\n padding-top: 1.5rem !important; }\n .pt-lg-5 {\n padding-top: 3rem !important; }\n .pe-lg-0 {\n padding-right: 0 !important; }\n .pe-lg-1 {\n padding-right: 0.25rem !important; }\n .pe-lg-2 {\n padding-right: 0.5rem !important; }\n .pe-lg-3 {\n padding-right: 1rem !important; }\n .pe-lg-4 {\n padding-right: 1.5rem !important; }\n .pe-lg-5 {\n padding-right: 3rem !important; }\n .pb-lg-0 {\n padding-bottom: 0 !important; }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important; }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important; }\n .pb-lg-3 {\n padding-bottom: 1rem !important; }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important; }\n .pb-lg-5 {\n padding-bottom: 3rem !important; }\n .ps-lg-0 {\n padding-left: 0 !important; }\n .ps-lg-1 {\n padding-left: 0.25rem !important; }\n .ps-lg-2 {\n padding-left: 0.5rem !important; }\n .ps-lg-3 {\n padding-left: 1rem !important; }\n .ps-lg-4 {\n padding-left: 1.5rem !important; }\n .ps-lg-5 {\n padding-left: 3rem !important; }\n .text-lg-start {\n text-align: left !important; }\n .text-lg-end {\n text-align: right !important; }\n .text-lg-center {\n text-align: center !important; } }\n\n@media (min-width: 1200px) {\n .float-xl-start {\n float: left !important; }\n .float-xl-end {\n float: right !important; }\n .float-xl-none {\n float: none !important; }\n .d-xl-inline {\n display: inline !important; }\n .d-xl-inline-block {\n display: inline-block !important; }\n .d-xl-block {\n display: block !important; }\n .d-xl-grid {\n display: grid !important; }\n .d-xl-table {\n display: table !important; }\n .d-xl-table-row {\n display: table-row !important; }\n .d-xl-table-cell {\n display: table-cell !important; }\n .d-xl-flex {\n display: flex !important; }\n .d-xl-inline-flex {\n display: inline-flex !important; }\n .d-xl-none {\n display: none !important; }\n .flex-xl-fill {\n flex: 1 1 auto !important; }\n .flex-xl-row {\n flex-direction: row !important; }\n .flex-xl-column {\n flex-direction: column !important; }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important; }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important; }\n .flex-xl-grow-0 {\n flex-grow: 0 !important; }\n .flex-xl-grow-1 {\n flex-grow: 1 !important; }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important; }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important; }\n .flex-xl-wrap {\n flex-wrap: wrap !important; }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important; }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important; }\n .gap-xl-0 {\n gap: 0 !important; }\n .gap-xl-1 {\n gap: 0.25rem !important; }\n .gap-xl-2 {\n gap: 0.5rem !important; }\n .gap-xl-3 {\n gap: 1rem !important; }\n .gap-xl-4 {\n gap: 1.5rem !important; }\n .gap-xl-5 {\n gap: 3rem !important; }\n .justify-content-xl-start {\n justify-content: flex-start !important; }\n .justify-content-xl-end {\n justify-content: flex-end !important; }\n .justify-content-xl-center {\n justify-content: center !important; }\n .justify-content-xl-between {\n justify-content: space-between !important; }\n .justify-content-xl-around {\n justify-content: space-around !important; }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important; }\n .align-items-xl-start {\n align-items: flex-start !important; }\n .align-items-xl-end {\n align-items: flex-end !important; }\n .align-items-xl-center {\n align-items: center !important; }\n .align-items-xl-baseline {\n align-items: baseline !important; }\n .align-items-xl-stretch {\n align-items: stretch !important; }\n .align-content-xl-start {\n align-content: flex-start !important; }\n .align-content-xl-end {\n align-content: flex-end !important; }\n .align-content-xl-center {\n align-content: center !important; }\n .align-content-xl-between {\n align-content: space-between !important; }\n .align-content-xl-around {\n align-content: space-around !important; }\n .align-content-xl-stretch {\n align-content: stretch !important; }\n .align-self-xl-auto {\n align-self: auto !important; }\n .align-self-xl-start {\n align-self: flex-start !important; }\n .align-self-xl-end {\n align-self: flex-end !important; }\n .align-self-xl-center {\n align-self: center !important; }\n .align-self-xl-baseline {\n align-self: baseline !important; }\n .align-self-xl-stretch {\n align-self: stretch !important; }\n .order-xl-first {\n order: -1 !important; }\n .order-xl-0 {\n order: 0 !important; }\n .order-xl-1 {\n order: 1 !important; }\n .order-xl-2 {\n order: 2 !important; }\n .order-xl-3 {\n order: 3 !important; }\n .order-xl-4 {\n order: 4 !important; }\n .order-xl-5 {\n order: 5 !important; }\n .order-xl-last {\n order: 6 !important; }\n .m-xl-0 {\n margin: 0 !important; }\n .m-xl-1 {\n margin: 0.25rem !important; }\n .m-xl-2 {\n margin: 0.5rem !important; }\n .m-xl-3 {\n margin: 1rem !important; }\n .m-xl-4 {\n margin: 1.5rem !important; }\n .m-xl-5 {\n margin: 3rem !important; }\n .m-xl-auto {\n margin: auto !important; }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important; }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important; }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important; }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important; }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important; }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important; }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important; }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important; }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important; }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important; }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important; }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important; }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important; }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important; }\n .mt-xl-0 {\n margin-top: 0 !important; }\n .mt-xl-1 {\n margin-top: 0.25rem !important; }\n .mt-xl-2 {\n margin-top: 0.5rem !important; }\n .mt-xl-3 {\n margin-top: 1rem !important; }\n .mt-xl-4 {\n margin-top: 1.5rem !important; }\n .mt-xl-5 {\n margin-top: 3rem !important; }\n .mt-xl-auto {\n margin-top: auto !important; }\n .me-xl-0 {\n margin-right: 0 !important; }\n .me-xl-1 {\n margin-right: 0.25rem !important; }\n .me-xl-2 {\n margin-right: 0.5rem !important; }\n .me-xl-3 {\n margin-right: 1rem !important; }\n .me-xl-4 {\n margin-right: 1.5rem !important; }\n .me-xl-5 {\n margin-right: 3rem !important; }\n .me-xl-auto {\n margin-right: auto !important; }\n .mb-xl-0 {\n margin-bottom: 0 !important; }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important; }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important; }\n .mb-xl-3 {\n margin-bottom: 1rem !important; }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important; }\n .mb-xl-5 {\n margin-bottom: 3rem !important; }\n .mb-xl-auto {\n margin-bottom: auto !important; }\n .ms-xl-0 {\n margin-left: 0 !important; }\n .ms-xl-1 {\n margin-left: 0.25rem !important; }\n .ms-xl-2 {\n margin-left: 0.5rem !important; }\n .ms-xl-3 {\n margin-left: 1rem !important; }\n .ms-xl-4 {\n margin-left: 1.5rem !important; }\n .ms-xl-5 {\n margin-left: 3rem !important; }\n .ms-xl-auto {\n margin-left: auto !important; }\n .p-xl-0 {\n padding: 0 !important; }\n .p-xl-1 {\n padding: 0.25rem !important; }\n .p-xl-2 {\n padding: 0.5rem !important; }\n .p-xl-3 {\n padding: 1rem !important; }\n .p-xl-4 {\n padding: 1.5rem !important; }\n .p-xl-5 {\n padding: 3rem !important; }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important; }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important; }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important; }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important; }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important; }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important; }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important; }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important; }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important; }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important; }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important; }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important; }\n .pt-xl-0 {\n padding-top: 0 !important; }\n .pt-xl-1 {\n padding-top: 0.25rem !important; }\n .pt-xl-2 {\n padding-top: 0.5rem !important; }\n .pt-xl-3 {\n padding-top: 1rem !important; }\n .pt-xl-4 {\n padding-top: 1.5rem !important; }\n .pt-xl-5 {\n padding-top: 3rem !important; }\n .pe-xl-0 {\n padding-right: 0 !important; }\n .pe-xl-1 {\n padding-right: 0.25rem !important; }\n .pe-xl-2 {\n padding-right: 0.5rem !important; }\n .pe-xl-3 {\n padding-right: 1rem !important; }\n .pe-xl-4 {\n padding-right: 1.5rem !important; }\n .pe-xl-5 {\n padding-right: 3rem !important; }\n .pb-xl-0 {\n padding-bottom: 0 !important; }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important; }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important; }\n .pb-xl-3 {\n padding-bottom: 1rem !important; }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important; }\n .pb-xl-5 {\n padding-bottom: 3rem !important; }\n .ps-xl-0 {\n padding-left: 0 !important; }\n .ps-xl-1 {\n padding-left: 0.25rem !important; }\n .ps-xl-2 {\n padding-left: 0.5rem !important; }\n .ps-xl-3 {\n padding-left: 1rem !important; }\n .ps-xl-4 {\n padding-left: 1.5rem !important; }\n .ps-xl-5 {\n padding-left: 3rem !important; }\n .text-xl-start {\n text-align: left !important; }\n .text-xl-end {\n text-align: right !important; }\n .text-xl-center {\n text-align: center !important; } }\n\n@media (min-width: 1400px) {\n .float-xxl-start {\n float: left !important; }\n .float-xxl-end {\n float: right !important; }\n .float-xxl-none {\n float: none !important; }\n .d-xxl-inline {\n display: inline !important; }\n .d-xxl-inline-block {\n display: inline-block !important; }\n .d-xxl-block {\n display: block !important; }\n .d-xxl-grid {\n display: grid !important; }\n .d-xxl-table {\n display: table !important; }\n .d-xxl-table-row {\n display: table-row !important; }\n .d-xxl-table-cell {\n display: table-cell !important; }\n .d-xxl-flex {\n display: flex !important; }\n .d-xxl-inline-flex {\n display: inline-flex !important; }\n .d-xxl-none {\n display: none !important; }\n .flex-xxl-fill {\n flex: 1 1 auto !important; }\n .flex-xxl-row {\n flex-direction: row !important; }\n .flex-xxl-column {\n flex-direction: column !important; }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important; }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important; }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important; }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important; }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important; }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important; }\n .flex-xxl-wrap {\n flex-wrap: wrap !important; }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important; }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important; }\n .gap-xxl-0 {\n gap: 0 !important; }\n .gap-xxl-1 {\n gap: 0.25rem !important; }\n .gap-xxl-2 {\n gap: 0.5rem !important; }\n .gap-xxl-3 {\n gap: 1rem !important; }\n .gap-xxl-4 {\n gap: 1.5rem !important; }\n .gap-xxl-5 {\n gap: 3rem !important; }\n .justify-content-xxl-start {\n justify-content: flex-start !important; }\n .justify-content-xxl-end {\n justify-content: flex-end !important; }\n .justify-content-xxl-center {\n justify-content: center !important; }\n .justify-content-xxl-between {\n justify-content: space-between !important; }\n .justify-content-xxl-around {\n justify-content: space-around !important; }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important; }\n .align-items-xxl-start {\n align-items: flex-start !important; }\n .align-items-xxl-end {\n align-items: flex-end !important; }\n .align-items-xxl-center {\n align-items: center !important; }\n .align-items-xxl-baseline {\n align-items: baseline !important; }\n .align-items-xxl-stretch {\n align-items: stretch !important; }\n .align-content-xxl-start {\n align-content: flex-start !important; }\n .align-content-xxl-end {\n align-content: flex-end !important; }\n .align-content-xxl-center {\n align-content: center !important; }\n .align-content-xxl-between {\n align-content: space-between !important; }\n .align-content-xxl-around {\n align-content: space-around !important; }\n .align-content-xxl-stretch {\n align-content: stretch !important; }\n .align-self-xxl-auto {\n align-self: auto !important; }\n .align-self-xxl-start {\n align-self: flex-start !important; }\n .align-self-xxl-end {\n align-self: flex-end !important; }\n .align-self-xxl-center {\n align-self: center !important; }\n .align-self-xxl-baseline {\n align-self: baseline !important; }\n .align-self-xxl-stretch {\n align-self: stretch !important; }\n .order-xxl-first {\n order: -1 !important; }\n .order-xxl-0 {\n order: 0 !important; }\n .order-xxl-1 {\n order: 1 !important; }\n .order-xxl-2 {\n order: 2 !important; }\n .order-xxl-3 {\n order: 3 !important; }\n .order-xxl-4 {\n order: 4 !important; }\n .order-xxl-5 {\n order: 5 !important; }\n .order-xxl-last {\n order: 6 !important; }\n .m-xxl-0 {\n margin: 0 !important; }\n .m-xxl-1 {\n margin: 0.25rem !important; }\n .m-xxl-2 {\n margin: 0.5rem !important; }\n .m-xxl-3 {\n margin: 1rem !important; }\n .m-xxl-4 {\n margin: 1.5rem !important; }\n .m-xxl-5 {\n margin: 3rem !important; }\n .m-xxl-auto {\n margin: auto !important; }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important; }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important; }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important; }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important; }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important; }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important; }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important; }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important; }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important; }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important; }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important; }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important; }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important; }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important; }\n .mt-xxl-0 {\n margin-top: 0 !important; }\n .mt-xxl-1 {\n margin-top: 0.25rem !important; }\n .mt-xxl-2 {\n margin-top: 0.5rem !important; }\n .mt-xxl-3 {\n margin-top: 1rem !important; }\n .mt-xxl-4 {\n margin-top: 1.5rem !important; }\n .mt-xxl-5 {\n margin-top: 3rem !important; }\n .mt-xxl-auto {\n margin-top: auto !important; }\n .me-xxl-0 {\n margin-right: 0 !important; }\n .me-xxl-1 {\n margin-right: 0.25rem !important; }\n .me-xxl-2 {\n margin-right: 0.5rem !important; }\n .me-xxl-3 {\n margin-right: 1rem !important; }\n .me-xxl-4 {\n margin-right: 1.5rem !important; }\n .me-xxl-5 {\n margin-right: 3rem !important; }\n .me-xxl-auto {\n margin-right: auto !important; }\n .mb-xxl-0 {\n margin-bottom: 0 !important; }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important; }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important; }\n .mb-xxl-3 {\n margin-bottom: 1rem !important; }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important; }\n .mb-xxl-5 {\n margin-bottom: 3rem !important; }\n .mb-xxl-auto {\n margin-bottom: auto !important; }\n .ms-xxl-0 {\n margin-left: 0 !important; }\n .ms-xxl-1 {\n margin-left: 0.25rem !important; }\n .ms-xxl-2 {\n margin-left: 0.5rem !important; }\n .ms-xxl-3 {\n margin-left: 1rem !important; }\n .ms-xxl-4 {\n margin-left: 1.5rem !important; }\n .ms-xxl-5 {\n margin-left: 3rem !important; }\n .ms-xxl-auto {\n margin-left: auto !important; }\n .p-xxl-0 {\n padding: 0 !important; }\n .p-xxl-1 {\n padding: 0.25rem !important; }\n .p-xxl-2 {\n padding: 0.5rem !important; }\n .p-xxl-3 {\n padding: 1rem !important; }\n .p-xxl-4 {\n padding: 1.5rem !important; }\n .p-xxl-5 {\n padding: 3rem !important; }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important; }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important; }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important; }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important; }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important; }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important; }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important; }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important; }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important; }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important; }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important; }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important; }\n .pt-xxl-0 {\n padding-top: 0 !important; }\n .pt-xxl-1 {\n padding-top: 0.25rem !important; }\n .pt-xxl-2 {\n padding-top: 0.5rem !important; }\n .pt-xxl-3 {\n padding-top: 1rem !important; }\n .pt-xxl-4 {\n padding-top: 1.5rem !important; }\n .pt-xxl-5 {\n padding-top: 3rem !important; }\n .pe-xxl-0 {\n padding-right: 0 !important; }\n .pe-xxl-1 {\n padding-right: 0.25rem !important; }\n .pe-xxl-2 {\n padding-right: 0.5rem !important; }\n .pe-xxl-3 {\n padding-right: 1rem !important; }\n .pe-xxl-4 {\n padding-right: 1.5rem !important; }\n .pe-xxl-5 {\n padding-right: 3rem !important; }\n .pb-xxl-0 {\n padding-bottom: 0 !important; }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important; }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important; }\n .pb-xxl-3 {\n padding-bottom: 1rem !important; }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important; }\n .pb-xxl-5 {\n padding-bottom: 3rem !important; }\n .ps-xxl-0 {\n padding-left: 0 !important; }\n .ps-xxl-1 {\n padding-left: 0.25rem !important; }\n .ps-xxl-2 {\n padding-left: 0.5rem !important; }\n .ps-xxl-3 {\n padding-left: 1rem !important; }\n .ps-xxl-4 {\n padding-left: 1.5rem !important; }\n .ps-xxl-5 {\n padding-left: 3rem !important; }\n .text-xxl-start {\n text-align: left !important; }\n .text-xxl-end {\n text-align: right !important; }\n .text-xxl-center {\n text-align: center !important; } }\n\n@media (min-width: 1200px) {\n .fs-1 {\n font-size: 2.5rem !important; }\n .fs-2 {\n font-size: 2rem !important; }\n .fs-3 {\n font-size: 1.75rem !important; }\n .fs-4 {\n font-size: 1.5rem !important; } }\n\n@media print {\n .d-print-inline {\n display: inline !important; }\n .d-print-inline-block {\n display: inline-block !important; }\n .d-print-block {\n display: block !important; }\n .d-print-grid {\n display: grid !important; }\n .d-print-table {\n display: table !important; }\n .d-print-table-row {\n display: table-row !important; }\n .d-print-table-cell {\n display: table-cell !important; }\n .d-print-flex {\n display: flex !important; }\n .d-print-inline-flex {\n display: inline-flex !important; }\n .d-print-none {\n display: none !important; } }\n\n/*-------------------------------------------------------------------*/\n/* === Template mixins === */\n/* Miscellaneous Mixins */\n.list-wrapper ul li .form-check, .list-wrapper ul li .form-check .form-check-label {\n text-overflow: ellipsis;\n overflow: hidden;\n max-width: 100%;\n white-space: nowrap; }\n\n/* Animation Mixins */\n@keyframes dropdownAnimation {\n from {\n opacity: 0;\n transform: translate3d(0, -30px, 0); }\n to {\n opacity: 1;\n transform: none;\n transform: translate3d(0, 0px, 0); } }\n\n.dropdownAnimation, .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu {\n animation-name: dropdownAnimation;\n -webkit-animation-duration: 0.25s;\n -moz-animation-duration: 0.25s;\n -ms-animation-duration: 0.25s;\n -o-animation-duration: 0.25s;\n animation-duration: 0.25s;\n -webkit-animation-fill-mode: both;\n -moz-animation-fill-mode: both;\n -ms-animation-fill-mode: both;\n -o-animation-fill-mode: both;\n animation-fill-mode: both; }\n\n@keyframes fadeOut {\n from {\n opacity: 1; }\n to {\n opacity: 0; } }\n\n.fadeOut {\n animation-name: fadeOut; }\n\n.infinite-spin {\n animation-name: spin;\n animation-duration: 3s;\n animation-iteration-count: infinite;\n animation-timing-function: linear; }\n\n@keyframes spin {\n from {\n transform: rotate(0deg); }\n to {\n transform: rotate(360deg); } }\n\n@keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translate3d(0, 100%, 0); }\n to {\n opacity: 1;\n transform: none; } }\n\n.fadeInUp {\n animation-name: fadeInUp; }\n\n/*-------------------------------------------------------------------*/\n/* === Core Styles === */\n/* Reset Styles */\nbody {\n padding: 0;\n margin: 0;\n overflow-x: hidden; }\n\n.form-control,\n.form-control:focus {\n -webkit-box-shadow: none;\n -moz-box-shadow: none; }\n\n.form-control {\n box-shadow: none; }\n\n.form-control:focus {\n outline: 0;\n box-shadow: none; }\n\na,\ndiv, h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5,\np,\nspan {\n text-shadow: none; }\n\n[type=button]:focus,\na:active,\na:focus,\na:visited,\nbutton::-moz-focus-inner,\ninput[type=reset]::-moz-focus-inner,\ninput[type=button]::-moz-focus-inner,\ninput[type=submit]::-moz-focus-inner,\ninput[type=file] > input[type=button]::-moz-focus-inner,\nselect::-moz-focus-inner {\n outline: 0; }\n\ninput,\n.form-control:focus,\ninput:focus,\nselect:focus,\ntextarea:focus,\nbutton:focus {\n outline: none;\n outline-width: 0;\n outline-color: transparent;\n box-shadow: none;\n outline-style: none; }\n\ntextarea {\n resize: none;\n overflow-x: hidden; }\n\n.btn,\n.btn-group.open .dropdown-toggle,\n.btn:active,\n.btn:focus,\n.btn:hover,\n.btn:visited,\na,\na:active,\na:checked,\na:focus,\na:hover,\na:visited,\nbody,\nbutton,\nbutton:active,\nbutton:hover,\nbutton:visited,\ndiv,\ninput,\ninput:active,\ninput:focus,\ninput:hover,\ninput:visited,\nselect,\nselect:active,\nselect:focus,\nselect:visited,\ntextarea,\ntextarea:active,\ntextarea:focus,\ntextarea:hover,\ntextarea:visited {\n -webkit-box-shadow: none;\n -moz-box-shadow: none;\n box-shadow: none; }\n\n.btn.active.focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn:active:focus,\n.btn:focus,\nbutton,\nbutton:active,\nbutton:checked,\nbutton:focus,\nbutton:hover,\nbutton:visited {\n outline: 0;\n outline-offset: 0; }\n\n.bootstrap-select .dropdown-toggle:focus {\n outline: 0;\n outline-offset: 0; }\n\n.dropdown-menu > li > a:active,\n.dropdown-menu > li > a:focus,\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:visited {\n outline: 0; }\n\na:focus,\ninput:focus {\n border-color: transparent;\n outline: none; }\n\n/* Fonts */\n@font-face {\n font-family: 'ubuntu-light';\n src: url(\"../fonts/Ubuntu/Ubuntu-Light.eot\");\n /* IE9 Compat Modes */\n src: url(\"../fonts/Ubuntu/Ubuntu-Light.woff2\") format(\"woff2\"), url(\"../fonts/Ubuntu/Ubuntu-Light.woff\") format(\"woff\"), url(\"../fonts/Ubuntu/Ubuntu-Light.ttf\") format(\"truetype\"); }\n\n@font-face {\n font-family: 'ubuntu-regular';\n src: url(\"../fonts/Ubuntu/Ubuntu-Regular.eot\");\n /* IE9 Compat Modes */\n src: url(\"../fonts/Ubuntu/Ubuntu-Regular.woff2\") format(\"woff2\"), url(\"../fonts/Ubuntu/Ubuntu-Regular.woff\") format(\"woff\"), url(\"../fonts/Ubuntu/Ubuntu-Regular.ttf\") format(\"truetype\"); }\n\n@font-face {\n font-family: 'ubuntu-medium';\n src: url(\"../fonts/Ubuntu/Ubuntu-Medium.eot\");\n /* IE9 Compat Modes */\n src: url(\"../fonts/Ubuntu/Ubuntu-Medium.woff2\") format(\"woff2\"), url(\"../fonts/Ubuntu/Ubuntu-Medium.woff\") format(\"woff\"), url(\"../fonts/Ubuntu/Ubuntu-Medium.ttf\") format(\"truetype\"); }\n\n@font-face {\n font-family: 'ubuntu-bold';\n src: url(\"../fonts/Ubuntu/Ubuntu-Bold.eot\");\n /* IE9 Compat Modes */\n src: url(\"../fonts/Ubuntu/Ubuntu-Bold.woff2\") format(\"woff2\"), url(\"../fonts/Ubuntu/Ubuntu-Bold.woff\") format(\"woff\"), url(\"../fonts/Ubuntu/Ubuntu-Bold.ttf\") format(\"truetype\"); }\n\n.text-twitter {\n color: #2caae1; }\n\n.text-facebook {\n color: #3b579d; }\n\n.text-google {\n color: #dc4a38; }\n\n.text-linkedin {\n color: #0177b5; }\n\n.text-pinterest {\n color: #cc2127; }\n\n.text-youtube {\n color: #e52d27; }\n\n.text-github {\n color: #333333; }\n\n.text-behance {\n color: #1769ff; }\n\n.text-dribbble {\n color: #ea4c89; }\n\n.text-reddit {\n color: #ff4500; }\n\n.bg-twitter {\n background: #2caae1; }\n\n.bg-facebook {\n background: #3b579d; }\n\n.bg-google {\n background: #dc4a38; }\n\n.bg-linkedin {\n background: #0177b5; }\n\n.bg-pinterest {\n background: #cc2127; }\n\n.bg-youtube {\n background: #e52d27; }\n\n.bg-github {\n background: #333333; }\n\n.bg-behance {\n background: #1769ff; }\n\n.bg-dribbble {\n background: #ea4c89; }\n\n.bg-reddit {\n background: #ff4500; }\n\n/* Typography */\nbody {\n font-size: 1rem;\n font-family: \"ubuntu-regular\", sans-serif;\n font-weight: initial;\n line-height: normal;\n -webkit-font-smoothing: antialiased; }\n\nh1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: \"ubuntu-medium\", sans-serif; }\n\np {\n font-size: 0.875rem; }\n\nh1, .h1,\n.h1 {\n font-size: 2.19rem; }\n\nh2, .h2,\n.h2 {\n font-size: 1.88rem; }\n\nh3, .h3,\n.h3 {\n font-size: 1.56rem; }\n\nh4, .h4,\n.h4 {\n font-size: 1.13rem; }\n\nh5, .h5,\n.h5 {\n font-size: 1rem; }\n\nh6, .h6,\n.h6 {\n font-size: .9375rem; }\n\np {\n font-size: .9375rem;\n line-height: 1.5; }\n\n.display-1 {\n font-size: 3.75rem; }\n @media (max-width: 991px) {\n .display-1 {\n font-size: 3rem; } }\n\n.display-2 {\n font-size: 3.125rem; }\n @media (max-width: 991px) {\n .display-2 {\n font-size: 2.5rem; } }\n\n.display-3 {\n font-size: 2.5rem; }\n @media (max-width: 991px) {\n .display-3 {\n font-size: 2rem; } }\n\n.display-4 {\n font-size: 1.875rem; }\n @media (max-width: 991px) {\n .display-4 {\n font-size: 1.5rem; } }\n\n.display-5 {\n font-size: 1.25rem; }\n @media (max-width: 991px) {\n .display-5 {\n font-size: 1rem; } }\n\n.blockquote {\n padding: 1.25rem;\n border: 1px solid #ebedf2; }\n\naddress p {\n margin-bottom: 0; }\n\n.blockquote-primary {\n border-color: #b66dff; }\n .blockquote-primary .blockquote-footer {\n color: #b66dff; }\n\n.blockquote-secondary {\n border-color: #c3bdbd; }\n .blockquote-secondary .blockquote-footer {\n color: #c3bdbd; }\n\n.blockquote-success {\n border-color: #1bcfb4; }\n .blockquote-success .blockquote-footer {\n color: #1bcfb4; }\n\n.blockquote-info {\n border-color: #198ae3; }\n .blockquote-info .blockquote-footer {\n color: #198ae3; }\n\n.blockquote-warning {\n border-color: #fed713; }\n .blockquote-warning .blockquote-footer {\n color: #fed713; }\n\n.blockquote-danger {\n border-color: #fe7c96; }\n .blockquote-danger .blockquote-footer {\n color: #fe7c96; }\n\n.blockquote-light {\n border-color: #f8f9fa; }\n .blockquote-light .blockquote-footer {\n color: #f8f9fa; }\n\n.blockquote-dark {\n border-color: #3e4b5b; }\n .blockquote-dark .blockquote-footer {\n color: #3e4b5b; }\n\n.error-page h1, .error-page .h1 {\n font-size: 12rem; }\n @media (max-width: 991px) {\n .error-page h1, .error-page .h1 {\n font-size: 8rem; } }\n\n.icon-lg {\n font-size: 2.5rem; }\n\n.icon-md {\n font-size: 1.875rem; }\n\n.icon-sm {\n font-size: 1rem; }\n\n/* Miscellanoeous */\nbody,\nhtml {\n overflow-x: hidden;\n padding-right: 0 !important; }\n\n*:-moz-full-screen,\n*:-webkit-full-screen,\n*:fullscreen *:-ms-fullscreen {\n overflow: auto; }\n\n.container-scroller {\n overflow: hidden; }\n\npre {\n background: color(gray-lighter);\n padding: 15px;\n font-size: 14px; }\n\ncode {\n padding: 5px;\n color: #fe7c96;\n font-family: \"ubuntu-light\", sans-serif;\n font-size: 0.875rem;\n border-radius: 4px; }\n\n.page-header {\n margin: 0 0 1.5rem 0; }\n .page-header .breadcrumb {\n border: 0;\n margin-bottom: 0; }\n\n.page-title {\n color: #343a40;\n font-size: 1.125rem;\n margin-bottom: 0; }\n .page-title .page-title-icon {\n display: inline-block;\n width: 36px;\n height: 36px;\n border-radius: 4px;\n text-align: center;\n box-shadow: 0px 3px 8.3px 0.7px rgba(163, 93, 255, 0.35); }\n .page-title .page-title-icon i {\n font-size: .9375rem;\n line-height: 36px; }\n\n/* Footer */\n.footer {\n background: #f2edf3;\n color: color(dark);\n border-top: 1px solid #e7dee9;\n padding: 30px 1rem;\n transition: all 0.25s ease;\n -moz-transition: all 0.25s ease;\n -webkit-transition: all 0.25s ease;\n -ms-transition: all 0.25s ease;\n font-size: calc(0.875rem - 0.05rem);\n font-family: \"ubuntu-regular\", sans-serif; }\n .footer a {\n color: #1bcfb4;\n font-size: inherit; }\n @media (max-width: 991px) {\n .footer {\n margin-left: 0;\n width: 100%; } }\n\n/* Utilities */\n.grid-margin, .purchase-popup {\n margin-bottom: 2.5rem; }\n\n@media (min-width: 576px) {\n .grid-margin-sm-0 {\n margin-bottom: 0; } }\n\n@media (min-width: 768px) {\n .grid-margin-md-0 {\n margin-bottom: 0; } }\n\n@media (min-width: 992px) {\n .grid-margin-lg-0 {\n margin-bottom: 0; } }\n\n@media (min-width: 1200px) {\n .grid-margin-xl-0 {\n margin-bottom: 0; } }\n\n.img-lg {\n width: 92px;\n height: 92px; }\n\n.img-sm {\n width: 43px;\n height: 43px; }\n\n.img-xs {\n width: 37px;\n height: 37px; }\n\n.img-ss, .image-grouped .text-avatar,\n.image-grouped img {\n width: 35px;\n height: 35px; }\n\n.stretch-card {\n display: -webkit-flex;\n display: flex;\n -webkit-align-items: stretch;\n align-items: stretch;\n -webkit-justify-content: stretch;\n justify-content: stretch; }\n .stretch-card > .card {\n width: 100%;\n min-width: 100%; }\n\n@media (min-width: 576px) {\n .border-right-sm {\n border-right: 1px solid #ebedf2; } }\n\n@media (min-width: 768px) {\n .border-right-md {\n border-right: 1px solid #ebedf2; } }\n\n@media (min-width: 992px) {\n .border-right-lg {\n border-right: 1px solid #ebedf2; } }\n\n@media (min-width: 576px) {\n .border-left-sm {\n border-left: 1px solid #ebedf2; } }\n\n@media (min-width: 768px) {\n .border-left-md {\n border-left: 1px solid #ebedf2; } }\n\n@media (min-width: 992px) {\n .border-left-lg {\n border-left: 1px solid #ebedf2; } }\n\n.text-gray, .card .card-subtitle {\n color: #8c8c8c; }\n\n.text-black {\n color: #000000; }\n\n.text-small {\n font-size: 12px; }\n\n.flex-grow {\n flex-grow: 1; }\n\n.font-weight-light {\n font-family: \"ubuntu-light\", sans-serif; }\n\n.font-weight-bold {\n font-family: \"ubuntu-bold\", sans-serif; }\n\n.font-weight-normal {\n font-family: \"ubuntu-regular\", sans-serif; }\n\n.image-grouped {\n display: flex; }\n .image-grouped .text-avatar,\n .image-grouped img {\n border-radius: 100%;\n margin-left: -10px;\n z-index: 0;\n border: 4px solid #fff;\n transform: scale(1);\n transition-duration: 0.3s;\n transition-timing-function: ease;\n transition-property: \"box-shadow\", \"z-index\", \"transform\", \"border-width\"; }\n .image-grouped .text-avatar:first-child,\n .image-grouped img:first-child {\n margin-left: 0; }\n .image-grouped .text-avatar:hover,\n .image-grouped img:hover {\n z-index: 1;\n box-shadow: 0 0 5px -2px rgba(0, 0, 0, 0.5);\n transform: scale(1.05);\n border-width: 0; }\n .image-grouped .text-avatar {\n color: #b66dff;\n font-size: 11px;\n font-weight: 600; }\n\n.aligner-wrapper {\n position: relative; }\n .aligner-wrapper .absolute {\n position: absolute; }\n .aligner-wrapper .absolute.absolute-center {\n top: 50%;\n transform: translateY(-50%);\n bottom: 0;\n right: 0;\n left: 0;\n margin: auto; }\n .aligner-wrapper .absolute.left {\n left: 0; }\n .aligner-wrapper .absolute.right {\n right: 0; }\n .aligner-wrapper .absolute.bottom {\n bottom: 0; }\n .aligner-wrapper .absolute.top {\n top: 0; }\n\n.v-strock-1 {\n width: 2px; }\n\n.v-strock-2 {\n width: 3px; }\n\n.v-strock-3 {\n width: 4px; }\n\n.v-strock-4 {\n width: 5px; }\n\n.dot-indicator {\n width: 10px;\n height: 10px;\n border-radius: 100%; }\n .dot-indicator.dot-indicator-sm {\n width: 6px;\n height: 6px; }\n\n.bg-gradient-primary {\n background: linear-gradient(to right, #da8cff, #9a55ff) !important; }\n\n.bg-gradient-secondary {\n background: linear-gradient(to right, #e7ebf0, #868e96) !important; }\n\n.bg-gradient-success {\n background: linear-gradient(to right, #84d9d2, #07cdae) !important; }\n\n.bg-gradient-info {\n background: linear-gradient(to right, #90caf9, #047edf 99%) !important; }\n\n.bg-gradient-warning {\n background: linear-gradient(to right, #f6e384, #ffd500) !important; }\n\n.bg-gradient-danger {\n background: linear-gradient(to right, #ffbf96, #fe7096) !important; }\n\n.bg-gradient-light {\n background: linear-gradient(to bottom, #f4f4f4, #e4e4e9) !important; }\n\n.bg-gradient-dark {\n background: linear-gradient(89deg, #5e7188, #3e4b5b) !important; }\n\n/* Demo Styles */\n.template-demo .slider-wrap {\n height: 100px; }\n\n.template-demo .progress {\n margin-top: 1.5rem; }\n\n.template-demo > h2, .template-demo > .h2,\n.template-demo > h3,\n.template-demo > .h3,\n.template-demo > h4,\n.template-demo > .h4,\n.template-demo > h5,\n.template-demo > .h5,\n.template-demo > h6,\n.template-demo > .h6,\n.template-demo > h1,\n.template-demo > .h1 {\n border-top: 1px solid #ebedf2;\n padding: 0.5rem 0 0; }\n\n.template-demo .ul-slider.noUi-horizontal {\n margin-top: 2rem; }\n\n.template-demo .ul-slider.noUi-vertical {\n margin-right: 2rem; }\n\n.template-demo > .dropdown {\n display: inline-block;\n margin-bottom: 0.5rem; }\n\n.template-demo nav .breadcrumb {\n margin-bottom: 1.375rem; }\n\n.template-demo nav:last-child .breadcrumb {\n margin-bottom: 0; }\n\n.template-demo .editable-form > .form-group {\n border-bottom: 1px solid #ebedf2;\n padding-bottom: 0.8rem;\n margin-bottom: 0.8rem; }\n\n.template-demo .circle-progress {\n padding: 15px; }\n\n.demo-modal {\n position: static;\n display: block; }\n .demo-modal .modal-dialog.modal-lg {\n max-width: 100%; }\n\n.loader-demo-box {\n width: 100%;\n height: 200px; }\n\n.dropdown-menu-static-demo {\n height: 250px;\n margin-bottom: 20px; }\n\n.rounded-legend ul li {\n list-style-type: none;\n color: #9c9fa6;\n font-size: .75rem; }\n .rounded-legend ul li .legend-dots {\n width: 1rem;\n height: 1rem;\n border-radius: 100%;\n display: inline-block;\n vertical-align: text-bottom;\n margin-right: .5rem; }\n .rtl .rounded-legend ul li .legend-dots {\n margin-left: .5rem; }\n\n.rounded-legend.legend-horizontal {\n display: -webkit-flex;\n display: flex; }\n .rounded-legend.legend-horizontal ul li {\n display: inline-block;\n margin-right: 1.5rem; }\n .rtl .rounded-legend.legend-horizontal ul li {\n margin-right: auto;\n margin-left: 1.5rem; }\n\n.rounded-legend.legend-top-right ul {\n float: right; }\n .rtl .rounded-legend.legend-top-right ul {\n float: left; }\n\n.rounded-legend.legend-vertical ul li {\n margin-top: 1rem; }\n\n#proBanner {\n position: fixed;\n left: 0;\n top: 0;\n width: 100%;\n z-index: 9999;\n background: #000; }\n #proBanner .card-body-padding {\n padding-top: .5rem;\n padding-bottom: .5rem;\n padding-left: 2rem;\n padding-right: 2rem; }\n @media (max-width: 766px) {\n #proBanner .card-body-padding {\n padding-left: 1rem;\n padding-right: 1rem; } }\n #proBanner .buy-now-text {\n color: #ffffff; }\n @media (max-width: 766px) {\n #proBanner .buy-now-text {\n font-size: 10px;\n line-height: 1.5; } }\n #proBanner .btn.buy-now-btn {\n background: transparent;\n color: #88b6ff;\n border-radius: 10px;\n padding: 1rem 0;\n border-radius: 4px;\n font-weight: bold;\n font-size: 1rem; }\n @media (max-width: 766px) {\n #proBanner .btn.buy-now-btn {\n min-width: 80px;\n padding: 1rem .5rem;\n font-size: 12px; } }\n #proBanner .btn#bannerClose i {\n margin-right: 1rem;\n font-size: 1.25rem; }\n @media (max-width: 766px) {\n #proBanner .btn#bannerClose i {\n font-size: 1rem;\n margin-right: 0; } }\n #proBanner a {\n text-decoration: none; }\n #proBanner a i {\n font-size: 1.25rem; }\n @media (max-width: 766px) {\n #proBanner a i {\n font-size: 1rem; } }\n\n.proBanner-padding-top {\n padding-top: 80px !important; }\n\n/* Dashboard */\n.card-statistics .highlight-icon {\n height: 53px;\n width: 53px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50px; }\n .card-statistics .highlight-icon i {\n font-size: 27px; }\n\n.card-statistics .card-col {\n border-right: 1px solid #ebedf2; }\n .card-statistics .card-col:last-child {\n border-right: none; }\n @media (max-width: 575.98px) {\n .card-statistics .card-col {\n padding-left: 0;\n padding-right: 0;\n position: relative;\n border: none; }\n .card-statistics .card-col:first-child:after, .card-statistics .card-col:first-child:before, .card-statistics .card-col:nth-child(2):after, .card-statistics .card-col:nth-child(2):before, .card-statistics .card-col:nth-child(3):after, .card-statistics .card-col:nth-child(3):before {\n content: \"\";\n position: absolute;\n background: #ebedf2; }\n .card-statistics .card-col:first-child:before {\n bottom: 0;\n width: 94.2%;\n height: 1px;\n right: 0; }\n .card-statistics .card-col:first-child:after {\n bottom: 0;\n width: 1px;\n height: 100%;\n right: 0; }\n .card-statistics .card-col:nth-child(2):before {\n bottom: 0;\n width: 94.2%;\n height: 1px;\n left: 0; }\n .card-statistics .card-col:nth-child(3):before {\n width: 1px;\n height: 100%;\n right: 0; } }\n\n.card-revenue-table .revenue-item {\n border-bottom: 1px solid #ebedf2; }\n .card-revenue-table .revenue-item:last-child {\n border-bottom: 0; }\n .card-revenue-table .revenue-item .revenue-desc {\n margin-right: auto;\n width: 80%; }\n .card-revenue-table .revenue-item .revenue-desc p {\n margin-bottom: 0; }\n .card-revenue-table .revenue-item .revenue-amount {\n margin-left: auto;\n width: 40%; }\n .card-revenue-table .revenue-item .revenue-amount p {\n font-size: 1.25rem;\n font-family: \"roboto\", sans-serif;\n font-weight: 600;\n text-align: right; }\n .rtl .card-revenue-table .revenue-item .revenue-amount p {\n text-align: left; }\n\n.card-revenue {\n background: linear-gradient(120deg, #556cdc, #128bfc, #18bef1);\n background-size: cover;\n color: color(white); }\n .card-revenue .highlight-text {\n font-size: 1.875rem;\n font-family: \"roboto\", sans-serif;\n font-weight: 500; }\n .card-revenue .badge {\n background-color: rgba(255, 255, 255, 0.2);\n font-size: 1.125rem;\n padding: 0.5rem 1.25rem; }\n\n.product-chart-wrapper {\n height: 92%; }\n\n#dashboardTrendingProgress {\n width: 60px; }\n\n.dashboard-bar-chart-legend .col {\n text-align: center;\n display: flex;\n align-items: center;\n flex-direction: column; }\n .dashboard-bar-chart-legend .col .bg {\n margin-left: auto;\n margin-right: auto;\n height: 5px;\n width: 30px;\n display: block;\n margin-top: 5px; }\n .dashboard-bar-chart-legend .col:nth-child(1) .bg {\n background: #198ae3; }\n .dashboard-bar-chart-legend .col:nth-child(2) .bg {\n background: #b66dff; }\n .dashboard-bar-chart-legend .col:nth-child(3) .bg {\n background: #fe7c96; }\n\n.intro-banner {\n background: #dbe4ec;\n display: flex;\n align-items: center;\n padding: 20px;\n border-radius: 2px; }\n .intro-banner .banner-image {\n width: 24%;\n max-width: 100%; }\n .intro-banner .banner-image img {\n display: block;\n margin: auto; }\n .intro-banner .content-area {\n width: 58%;\n color: #000000;\n display: flex;\n flex-direction: column;\n align-items: end; }\n\n.sales-mini-tabs {\n border-bottom: none; }\n .sales-mini-tabs .nav-item .nav-link {\n border: none;\n font-weight: 500;\n padding: 5px 15px;\n border-radius: 2px;\n transition-duration: 0.7s;\n transition-property: \"color\"; }\n .sales-mini-tabs .nav-item .nav-link.active {\n font-weight: 600;\n background: white;\n color: #b66dff; }\n\n.purchase-popup {\n background: #fff;\n padding: 15px 20px;\n border-radius: 3px; }\n .purchase-popup .btn {\n margin-right: 20px;\n font-weight: 500;\n color: #ffffff;\n border-radius: 5px;\n -webkit-transition-duration: 0.2s;\n -moz-transition-duration: 0.2s;\n -o-transition-duration: 0.2s;\n transition-duration: 0.2s; }\n .purchase-popup .btn.download-button {\n background: rgba(249, 249, 249, 0.7);\n color: #969292;\n border: 1px solid #d7d7d7; }\n .purchase-popup .btn.purchase-button {\n background-color: rgba(172, 50, 228, 0.9);\n background-image: -owg-linear-gradient(to right, #da8cff, #9a55ff);\n background-image: -webkit-linear-gradient(to right, #da8cff, #9a55ff);\n background-image: -moz-linear-gradient(to right, #da8cff, #9a55ff);\n background-image: -o-linear-gradient(to right, #da8cff, #9a55ff);\n background-image: linear-gradient(to right, #da8cff, #9a55ff);\n color: #ffffff;\n border: none;\n line-height: 1;\n vertical-align: middle; }\n .purchase-popup p {\n margin-bottom: auto;\n margin-top: auto;\n color: #7e7e7e;\n font-weight: 400;\n vertical-align: middle;\n line-height: 1; }\n .purchase-popup i {\n vertical-align: middle;\n line-height: 1;\n margin: auto 0;\n color: #b1b1b1; }\n\n/*-------------------------------------------------------------------*/\n/* === Components === */\n/* Badges */\n.badge {\n border-radius: .125rem;\n font-size: 11px;\n font-weight: initial;\n line-height: 1;\n padding: .375rem .5625rem;\n font-family: \"ubuntu-medium\", sans-serif; }\n .badge.badge-pill {\n border-radius: 10rem; }\n\n/*Badge variations*/\n.badge-primary {\n border: 1px solid #b66dff;\n background: #b66dff;\n color: #ffffff; }\n\n.badge-secondary {\n border: 1px solid #c3bdbd;\n background: #c3bdbd;\n color: #ffffff; }\n\n.badge-success, .preview-list .preview-item .preview-thumbnail .badge.badge-online {\n border: 1px solid #1bcfb4;\n background: #1bcfb4;\n color: #ffffff; }\n\n.badge-info, .preview-list .preview-item .preview-thumbnail .badge.badge-offline {\n border: 1px solid #198ae3;\n background: #198ae3;\n color: #ffffff; }\n\n.badge-warning, .preview-list .preview-item .preview-thumbnail .badge.badge-busy {\n border: 1px solid #fed713;\n background: #fed713;\n color: #ffffff; }\n\n.badge-danger {\n border: 1px solid #fe7c96;\n background: #fe7c96;\n color: #ffffff; }\n\n.badge-light {\n border: 1px solid #f8f9fa;\n background: #f8f9fa;\n color: #ffffff; }\n\n.badge-dark {\n border: 1px solid #3e4b5b;\n background: #3e4b5b;\n color: #ffffff; }\n\n/*Badge gradient variations*/\n.badge-gradient-primary {\n background: linear-gradient(to right, #da8cff, #9a55ff);\n color: #ffffff; }\n\n.badge-gradient-secondary {\n background: linear-gradient(to right, #e7ebf0, #868e96);\n color: #ffffff; }\n\n.badge-gradient-success {\n background: linear-gradient(to right, #84d9d2, #07cdae);\n color: #ffffff; }\n\n.badge-gradient-info {\n background: linear-gradient(to right, #90caf9, #047edf 99%);\n color: #ffffff; }\n\n.badge-gradient-warning {\n background: linear-gradient(to right, #f6e384, #ffd500);\n color: #ffffff; }\n\n.badge-gradient-danger {\n background: linear-gradient(to right, #ffbf96, #fe7096);\n color: #ffffff; }\n\n.badge-gradient-light {\n background: linear-gradient(to bottom, #f4f4f4, #e4e4e9);\n color: #ffffff; }\n\n.badge-gradient-dark {\n background: linear-gradient(89deg, #5e7188, #3e4b5b);\n color: #ffffff; }\n\n/*Badge outlined variations*/\n.badge-outline-primary {\n color: #b66dff;\n border: 1px solid #b66dff; }\n\n.badge-outline-secondary {\n color: #c3bdbd;\n border: 1px solid #c3bdbd; }\n\n.badge-outline-success {\n color: #1bcfb4;\n border: 1px solid #1bcfb4; }\n\n.badge-outline-info {\n color: #198ae3;\n border: 1px solid #198ae3; }\n\n.badge-outline-warning {\n color: #fed713;\n border: 1px solid #fed713; }\n\n.badge-outline-danger {\n color: #fe7c96;\n border: 1px solid #fe7c96; }\n\n.badge-outline-light {\n color: #f8f9fa;\n border: 1px solid #f8f9fa; }\n\n.badge-outline-dark {\n color: #3e4b5b;\n border: 1px solid #3e4b5b; }\n\n/* Bootstrap Progress */\n.progress {\n border-radius: 3px;\n height: 8px; }\n .progress .progress-bar {\n border-radius: 3px; }\n .progress.progress-sm {\n height: 0.375rem; }\n .progress.progress-md {\n height: 8px; }\n .progress.progress-lg {\n height: 15px; }\n .progress.progress-xl {\n height: 18px; }\n\n/* Buttons */\n.btn {\n font-size: 0.875rem;\n line-height: 1;\n font-family: \"ubuntu-bold\", sans-serif;\n /* Buttons with only icons */\n /* Buttons with icon and text */ }\n .btn i {\n font-size: 1rem; }\n .btn.btn-rounded {\n border-radius: 50px; }\n .btn.btn-fw {\n min-width: 150px; }\n .btn.btn-sm, .btn-group-sm > .btn {\n font-size: 0.875rem; }\n .btn.btn-lg, .btn-group-lg > .btn {\n font-size: 0.875rem; }\n .btn.btn-xs {\n padding: 0.5rem 0.75rem;\n font-size: 0.625rem; }\n .btn.btn-icon {\n width: 42px;\n height: 42px;\n padding: 0; }\n .btn.btn-icon-text .btn-icon-prepend {\n margin-right: .5rem; }\n .btn.btn-icon-text .btn-icon-append {\n margin-left: .5rem; }\n .btn.btn-social-icon {\n width: 50px;\n height: 50px;\n padding: 0; }\n\n.btn-group .btn + .btn {\n border-left: 0; }\n\n/*social buttons*/\n.btn-twitter {\n background: #2caae1;\n color: #ffffff; }\n .btn-twitter:hover, .btn-twitter:focus {\n background: #1b8dbf;\n color: #ffffff; }\n .btn-twitter.btn-social-icon-text {\n padding: 0 1.5rem 0 0;\n background: #59bce7; }\n .btn-twitter.btn-social-icon-text i {\n background: #2caae1;\n padding: .75rem;\n display: inline-block;\n margin-right: 1.5rem; }\n\n.btn-outline-twitter {\n border: 1px solid #2caae1;\n color: #2caae1; }\n .btn-outline-twitter:hover {\n background: #2caae1;\n color: #ffffff; }\n\n.btn-facebook {\n background: #3b579d;\n color: #ffffff; }\n .btn-facebook:hover, .btn-facebook:focus {\n background: #2d4278;\n color: #ffffff; }\n .btn-facebook.btn-social-icon-text {\n padding: 0 1.5rem 0 0;\n background: #4e6ebd; }\n .btn-facebook.btn-social-icon-text i {\n background: #3b579d;\n padding: .75rem;\n display: inline-block;\n margin-right: 1.5rem; }\n\n.btn-outline-facebook {\n border: 1px solid #3b579d;\n color: #3b579d; }\n .btn-outline-facebook:hover {\n background: #3b579d;\n color: #ffffff; }\n\n.btn-google {\n background: #dc4a38;\n color: #ffffff; }\n .btn-google:hover, .btn-google:focus {\n background: #bf3322;\n color: #ffffff; }\n .btn-google.btn-social-icon-text {\n padding: 0 1.5rem 0 0;\n background: #e47163; }\n .btn-google.btn-social-icon-text i {\n background: #dc4a38;\n padding: .75rem;\n display: inline-block;\n margin-right: 1.5rem; }\n\n.btn-outline-google {\n border: 1px solid #dc4a38;\n color: #dc4a38; }\n .btn-outline-google:hover {\n background: #dc4a38;\n color: #ffffff; }\n\n.btn-linkedin {\n background: #0177b5;\n color: #ffffff; }\n .btn-linkedin:hover, .btn-linkedin:focus {\n background: #015682;\n color: #ffffff; }\n .btn-linkedin.btn-social-icon-text {\n padding: 0 1.5rem 0 0;\n background: #0198e8; }\n .btn-linkedin.btn-social-icon-text i {\n background: #0177b5;\n padding: .75rem;\n display: inline-block;\n margin-right: 1.5rem; }\n\n.btn-outline-linkedin {\n border: 1px solid #0177b5;\n color: #0177b5; }\n .btn-outline-linkedin:hover {\n background: #0177b5;\n color: #ffffff; }\n\n.btn-pinterest {\n background: #cc2127;\n color: #ffffff; }\n .btn-pinterest:hover, .btn-pinterest:focus {\n background: #a01a1f;\n color: #ffffff; }\n .btn-pinterest.btn-social-icon-text {\n padding: 0 1.5rem 0 0;\n background: #e04046; }\n .btn-pinterest.btn-social-icon-text i {\n background: #cc2127;\n padding: .75rem;\n display: inline-block;\n margin-right: 1.5rem; }\n\n.btn-outline-pinterest {\n border: 1px solid #cc2127;\n color: #cc2127; }\n .btn-outline-pinterest:hover {\n background: #cc2127;\n color: #ffffff; }\n\n.btn-youtube {\n background: #e52d27;\n color: #ffffff; }\n .btn-youtube:hover, .btn-youtube:focus {\n background: #c21d17;\n color: #ffffff; }\n .btn-youtube.btn-social-icon-text {\n padding: 0 1.5rem 0 0;\n background: #ea5955; }\n .btn-youtube.btn-social-icon-text i {\n background: #e52d27;\n padding: .75rem;\n display: inline-block;\n margin-right: 1.5rem; }\n\n.btn-outline-youtube {\n border: 1px solid #e52d27;\n color: #e52d27; }\n .btn-outline-youtube:hover {\n background: #e52d27;\n color: #ffffff; }\n\n.btn-github {\n background: #333333;\n color: #ffffff; }\n .btn-github:hover, .btn-github:focus {\n background: #1a1a1a;\n color: #ffffff; }\n .btn-github.btn-social-icon-text {\n padding: 0 1.5rem 0 0;\n background: #4d4d4d; }\n .btn-github.btn-social-icon-text i {\n background: #333333;\n padding: .75rem;\n display: inline-block;\n margin-right: 1.5rem; }\n\n.btn-outline-github {\n border: 1px solid #333333;\n color: #333333; }\n .btn-outline-github:hover {\n background: #333333;\n color: #ffffff; }\n\n.btn-behance {\n background: #1769ff;\n color: #ffffff; }\n .btn-behance:hover, .btn-behance:focus {\n background: #0050e3;\n color: #ffffff; }\n .btn-behance.btn-social-icon-text {\n padding: 0 1.5rem 0 0;\n background: #4a8aff; }\n .btn-behance.btn-social-icon-text i {\n background: #1769ff;\n padding: .75rem;\n display: inline-block;\n margin-right: 1.5rem; }\n\n.btn-outline-behance {\n border: 1px solid #1769ff;\n color: #1769ff; }\n .btn-outline-behance:hover {\n background: #1769ff;\n color: #ffffff; }\n\n.btn-dribbble {\n background: #ea4c89;\n color: #ffffff; }\n .btn-dribbble:hover, .btn-dribbble:focus {\n background: #e51e6b;\n color: #ffffff; }\n .btn-dribbble.btn-social-icon-text {\n padding: 0 1.5rem 0 0;\n background: #ef7aa7; }\n .btn-dribbble.btn-social-icon-text i {\n background: #ea4c89;\n padding: .75rem;\n display: inline-block;\n margin-right: 1.5rem; }\n\n.btn-outline-dribbble {\n border: 1px solid #ea4c89;\n color: #ea4c89; }\n .btn-outline-dribbble:hover {\n background: #ea4c89;\n color: #ffffff; }\n\n.btn-reddit {\n background: #ff4500;\n color: #ffffff; }\n .btn-reddit:hover, .btn-reddit:focus {\n background: #cc3700;\n color: #ffffff; }\n .btn-reddit.btn-social-icon-text {\n padding: 0 1.5rem 0 0;\n background: #ff6a33; }\n .btn-reddit.btn-social-icon-text i {\n background: #ff4500;\n padding: .75rem;\n display: inline-block;\n margin-right: 1.5rem; }\n\n.btn-outline-reddit {\n border: 1px solid #ff4500;\n color: #ff4500; }\n .btn-outline-reddit:hover {\n background: #ff4500;\n color: #ffffff; }\n\n/* inverse buttons */\n.btn-inverse-primary {\n background-color: rgba(182, 109, 255, 0.2);\n background-image: none;\n border-color: rgba(182, 109, 255, 0); }\n .btn-inverse-primary:not(.btn-inverse-light) {\n color: #b66dff; }\n .btn-inverse-primary:hover {\n color: #ffffff;\n background-color: #b66dff;\n border-color: #b66dff; }\n .btn-inverse-primary.focus, .btn-inverse-primary:focus {\n box-shadow: 0 0 0 3px rgba(182, 109, 255, 0.5); }\n .btn-inverse-primary.disabled, .btn-inverse-primary:disabled {\n color: #b66dff;\n background-color: transparent; }\n .btn-inverse-primary.active, .btn-inverse-primary:active,\n .show > .btn-inverse-primary.dropdown-toggle {\n color: #ffffff;\n background-color: #b66dff;\n border-color: #b66dff; }\n\n.btn-primary:not(.btn-light) {\n color: #ffffff; }\n .btn-primary:not(.btn-light):hover, .btn-primary:not(.btn-light):focus, .btn-primary:not(.btn-light):active {\n color: #ffffff; }\n .btn-primary:not(.btn-light):focus, .btn-primary:not(.btn-light):active {\n background: #b66dff;\n border-color: #b66dff; }\n\n.btn-outline-primary:hover, .btn-outline-primary:focus, .btn-outline-primary:active {\n background: linear-gradient(to right, #da8cff, #9a55ff);\n color: #000000; }\n\n.btn-inverse-secondary {\n background-color: rgba(195, 189, 189, 0.2);\n background-image: none;\n border-color: rgba(195, 189, 189, 0); }\n .btn-inverse-secondary:not(.btn-inverse-light) {\n color: #c3bdbd; }\n .btn-inverse-secondary:hover {\n color: #ffffff;\n background-color: #c3bdbd;\n border-color: #c3bdbd; }\n .btn-inverse-secondary.focus, .btn-inverse-secondary:focus {\n box-shadow: 0 0 0 3px rgba(195, 189, 189, 0.5); }\n .btn-inverse-secondary.disabled, .btn-inverse-secondary:disabled {\n color: #c3bdbd;\n background-color: transparent; }\n .btn-inverse-secondary.active, .btn-inverse-secondary:active,\n .show > .btn-inverse-secondary.dropdown-toggle {\n color: #ffffff;\n background-color: #c3bdbd;\n border-color: #c3bdbd; }\n\n.btn-secondary:not(.btn-light) {\n color: #ffffff; }\n .btn-secondary:not(.btn-light):hover, .btn-secondary:not(.btn-light):focus, .btn-secondary:not(.btn-light):active {\n color: #ffffff; }\n .btn-secondary:not(.btn-light):focus, .btn-secondary:not(.btn-light):active {\n background: #c3bdbd;\n border-color: #c3bdbd; }\n\n.btn-outline-secondary:hover, .btn-outline-secondary:focus, .btn-outline-secondary:active {\n background: linear-gradient(to right, #e7ebf0, #868e96);\n color: #000000; }\n\n.btn-inverse-success {\n background-color: rgba(27, 207, 180, 0.2);\n background-image: none;\n border-color: rgba(27, 207, 180, 0); }\n .btn-inverse-success:not(.btn-inverse-light) {\n color: #1bcfb4; }\n .btn-inverse-success:hover {\n color: #ffffff;\n background-color: #1bcfb4;\n border-color: #1bcfb4; }\n .btn-inverse-success.focus, .btn-inverse-success:focus {\n box-shadow: 0 0 0 3px rgba(27, 207, 180, 0.5); }\n .btn-inverse-success.disabled, .btn-inverse-success:disabled {\n color: #1bcfb4;\n background-color: transparent; }\n .btn-inverse-success.active, .btn-inverse-success:active,\n .show > .btn-inverse-success.dropdown-toggle {\n color: #ffffff;\n background-color: #1bcfb4;\n border-color: #1bcfb4; }\n\n.btn-success:not(.btn-light) {\n color: #ffffff; }\n .btn-success:not(.btn-light):hover, .btn-success:not(.btn-light):focus, .btn-success:not(.btn-light):active {\n color: #ffffff; }\n .btn-success:not(.btn-light):focus, .btn-success:not(.btn-light):active {\n background: #1bcfb4;\n border-color: #1bcfb4; }\n\n.btn-outline-success:hover, .btn-outline-success:focus, .btn-outline-success:active {\n background: linear-gradient(to right, #84d9d2, #07cdae);\n color: #000000; }\n\n.btn-inverse-info {\n background-color: rgba(25, 138, 227, 0.2);\n background-image: none;\n border-color: rgba(25, 138, 227, 0); }\n .btn-inverse-info:not(.btn-inverse-light) {\n color: #198ae3; }\n .btn-inverse-info:hover {\n color: #ffffff;\n background-color: #198ae3;\n border-color: #198ae3; }\n .btn-inverse-info.focus, .btn-inverse-info:focus {\n box-shadow: 0 0 0 3px rgba(25, 138, 227, 0.5); }\n .btn-inverse-info.disabled, .btn-inverse-info:disabled {\n color: #198ae3;\n background-color: transparent; }\n .btn-inverse-info.active, .btn-inverse-info:active,\n .show > .btn-inverse-info.dropdown-toggle {\n color: #ffffff;\n background-color: #198ae3;\n border-color: #198ae3; }\n\n.btn-info:not(.btn-light) {\n color: #ffffff; }\n .btn-info:not(.btn-light):hover, .btn-info:not(.btn-light):focus, .btn-info:not(.btn-light):active {\n color: #ffffff; }\n .btn-info:not(.btn-light):focus, .btn-info:not(.btn-light):active {\n background: #198ae3;\n border-color: #198ae3; }\n\n.btn-outline-info:hover, .btn-outline-info:focus, .btn-outline-info:active {\n background: linear-gradient(to right, #90caf9, #047edf 99%);\n color: #000000; }\n\n.btn-inverse-warning {\n background-color: rgba(254, 215, 19, 0.2);\n background-image: none;\n border-color: rgba(254, 215, 19, 0); }\n .btn-inverse-warning:not(.btn-inverse-light) {\n color: #fed713; }\n .btn-inverse-warning:hover {\n color: #ffffff;\n background-color: #fed713;\n border-color: #fed713; }\n .btn-inverse-warning.focus, .btn-inverse-warning:focus {\n box-shadow: 0 0 0 3px rgba(254, 215, 19, 0.5); }\n .btn-inverse-warning.disabled, .btn-inverse-warning:disabled {\n color: #fed713;\n background-color: transparent; }\n .btn-inverse-warning.active, .btn-inverse-warning:active,\n .show > .btn-inverse-warning.dropdown-toggle {\n color: #ffffff;\n background-color: #fed713;\n border-color: #fed713; }\n\n.btn-warning:not(.btn-light) {\n color: #ffffff; }\n .btn-warning:not(.btn-light):hover, .btn-warning:not(.btn-light):focus, .btn-warning:not(.btn-light):active {\n color: #ffffff; }\n .btn-warning:not(.btn-light):focus, .btn-warning:not(.btn-light):active {\n background: #fed713;\n border-color: #fed713; }\n\n.btn-outline-warning:hover, .btn-outline-warning:focus, .btn-outline-warning:active {\n background: linear-gradient(to right, #f6e384, #ffd500);\n color: #000000; }\n\n.btn-inverse-danger {\n background-color: rgba(254, 124, 150, 0.2);\n background-image: none;\n border-color: rgba(254, 124, 150, 0); }\n .btn-inverse-danger:not(.btn-inverse-light) {\n color: #fe7c96; }\n .btn-inverse-danger:hover {\n color: #ffffff;\n background-color: #fe7c96;\n border-color: #fe7c96; }\n .btn-inverse-danger.focus, .btn-inverse-danger:focus {\n box-shadow: 0 0 0 3px rgba(254, 124, 150, 0.5); }\n .btn-inverse-danger.disabled, .btn-inverse-danger:disabled {\n color: #fe7c96;\n background-color: transparent; }\n .btn-inverse-danger.active, .btn-inverse-danger:active,\n .show > .btn-inverse-danger.dropdown-toggle {\n color: #ffffff;\n background-color: #fe7c96;\n border-color: #fe7c96; }\n\n.btn-danger:not(.btn-light) {\n color: #ffffff; }\n .btn-danger:not(.btn-light):hover, .btn-danger:not(.btn-light):focus, .btn-danger:not(.btn-light):active {\n color: #ffffff; }\n .btn-danger:not(.btn-light):focus, .btn-danger:not(.btn-light):active {\n background: #fe7c96;\n border-color: #fe7c96; }\n\n.btn-outline-danger:hover, .btn-outline-danger:focus, .btn-outline-danger:active {\n background: linear-gradient(to right, #ffbf96, #fe7096);\n color: #000000; }\n\n.btn-inverse-light {\n background-color: rgba(248, 249, 250, 0.2);\n background-image: none;\n border-color: rgba(248, 249, 250, 0); }\n .btn-inverse-light:not(.btn-inverse-light) {\n color: #f8f9fa; }\n .btn-inverse-light:hover {\n color: #ffffff;\n background-color: #f8f9fa;\n border-color: #f8f9fa; }\n .btn-inverse-light.focus, .btn-inverse-light:focus {\n box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5); }\n .btn-inverse-light.disabled, .btn-inverse-light:disabled {\n color: #f8f9fa;\n background-color: transparent; }\n .btn-inverse-light.active, .btn-inverse-light:active,\n .show > .btn-inverse-light.dropdown-toggle {\n color: #ffffff;\n background-color: #f8f9fa;\n border-color: #f8f9fa; }\n\n.btn-light:not(.btn-light) {\n color: #ffffff; }\n .btn-light:not(.btn-light):hover, .btn-light:not(.btn-light):focus, .btn-light:not(.btn-light):active {\n color: #ffffff; }\n .btn-light:not(.btn-light):focus, .btn-light:not(.btn-light):active {\n background: #f8f9fa;\n border-color: #f8f9fa; }\n\n.btn-outline-light:hover, .btn-outline-light:focus, .btn-outline-light:active {\n background: linear-gradient(to bottom, #f4f4f4, #e4e4e9);\n color: #000000; }\n\n.btn-inverse-dark {\n background-color: rgba(62, 75, 91, 0.2);\n background-image: none;\n border-color: rgba(62, 75, 91, 0); }\n .btn-inverse-dark:not(.btn-inverse-light) {\n color: #3e4b5b; }\n .btn-inverse-dark:hover {\n color: #ffffff;\n background-color: #3e4b5b;\n border-color: #3e4b5b; }\n .btn-inverse-dark.focus, .btn-inverse-dark:focus {\n box-shadow: 0 0 0 3px rgba(62, 75, 91, 0.5); }\n .btn-inverse-dark.disabled, .btn-inverse-dark:disabled {\n color: #3e4b5b;\n background-color: transparent; }\n .btn-inverse-dark.active, .btn-inverse-dark:active,\n .show > .btn-inverse-dark.dropdown-toggle {\n color: #ffffff;\n background-color: #3e4b5b;\n border-color: #3e4b5b; }\n\n.btn-dark:not(.btn-light) {\n color: #ffffff; }\n .btn-dark:not(.btn-light):hover, .btn-dark:not(.btn-light):focus, .btn-dark:not(.btn-light):active {\n color: #ffffff; }\n .btn-dark:not(.btn-light):focus, .btn-dark:not(.btn-light):active {\n background: #3e4b5b;\n border-color: #3e4b5b; }\n\n.btn-outline-dark:hover, .btn-outline-dark:focus, .btn-outline-dark:active {\n background: linear-gradient(89deg, #5e7188, #3e4b5b);\n color: #000000; }\n\n/* gradient buttons */\n.btn-gradient-primary {\n background: linear-gradient(to right, #da8cff, #9a55ff);\n border: 0;\n -webkit-transition: opacity 0.3s ease;\n -moz-transition: opacity 0.3s ease;\n -ms-transition: opacity 0.3s ease;\n -o-transition: opacity 0.3s ease;\n transition: opacity 0.3s ease; }\n .btn-gradient-primary:not([disabled]):not(.disabled):active, .btn-gradient-primary:not([disabled]):not(.disabled).active,\n .show > .btn-gradient-primary.dropdown-toggle {\n background: linear-gradient(to right, #da8cff, #9a55ff); }\n .btn-gradient-primary:hover {\n opacity: .8; }\n .btn-gradient-primary:not(.btn-gradient-light) {\n color: #ffffff; }\n .btn-gradient-primary:not(.btn-gradient-light):hover, .btn-gradient-primary:not(.btn-gradient-light):focus, .btn-gradient-primary:not(.btn-gradient-light):active {\n color: #ffffff; }\n\n.btn-gradient-secondary {\n background: linear-gradient(to right, #e7ebf0, #868e96);\n border: 0;\n -webkit-transition: opacity 0.3s ease;\n -moz-transition: opacity 0.3s ease;\n -ms-transition: opacity 0.3s ease;\n -o-transition: opacity 0.3s ease;\n transition: opacity 0.3s ease; }\n .btn-gradient-secondary:not([disabled]):not(.disabled):active, .btn-gradient-secondary:not([disabled]):not(.disabled).active,\n .show > .btn-gradient-secondary.dropdown-toggle {\n background: linear-gradient(to right, #e7ebf0, #868e96); }\n .btn-gradient-secondary:hover {\n opacity: .8; }\n .btn-gradient-secondary:not(.btn-gradient-light) {\n color: #ffffff; }\n .btn-gradient-secondary:not(.btn-gradient-light):hover, .btn-gradient-secondary:not(.btn-gradient-light):focus, .btn-gradient-secondary:not(.btn-gradient-light):active {\n color: #ffffff; }\n\n.btn-gradient-success {\n background: linear-gradient(to right, #84d9d2, #07cdae);\n border: 0;\n -webkit-transition: opacity 0.3s ease;\n -moz-transition: opacity 0.3s ease;\n -ms-transition: opacity 0.3s ease;\n -o-transition: opacity 0.3s ease;\n transition: opacity 0.3s ease; }\n .btn-gradient-success:not([disabled]):not(.disabled):active, .btn-gradient-success:not([disabled]):not(.disabled).active,\n .show > .btn-gradient-success.dropdown-toggle {\n background: linear-gradient(to right, #84d9d2, #07cdae); }\n .btn-gradient-success:hover {\n opacity: .8; }\n .btn-gradient-success:not(.btn-gradient-light) {\n color: #ffffff; }\n .btn-gradient-success:not(.btn-gradient-light):hover, .btn-gradient-success:not(.btn-gradient-light):focus, .btn-gradient-success:not(.btn-gradient-light):active {\n color: #ffffff; }\n\n.btn-gradient-info {\n background: linear-gradient(to right, #90caf9, #047edf 99%);\n border: 0;\n -webkit-transition: opacity 0.3s ease;\n -moz-transition: opacity 0.3s ease;\n -ms-transition: opacity 0.3s ease;\n -o-transition: opacity 0.3s ease;\n transition: opacity 0.3s ease; }\n .btn-gradient-info:not([disabled]):not(.disabled):active, .btn-gradient-info:not([disabled]):not(.disabled).active,\n .show > .btn-gradient-info.dropdown-toggle {\n background: linear-gradient(to right, #90caf9, #047edf 99%); }\n .btn-gradient-info:hover {\n opacity: .8; }\n .btn-gradient-info:not(.btn-gradient-light) {\n color: #ffffff; }\n .btn-gradient-info:not(.btn-gradient-light):hover, .btn-gradient-info:not(.btn-gradient-light):focus, .btn-gradient-info:not(.btn-gradient-light):active {\n color: #ffffff; }\n\n.btn-gradient-warning {\n background: linear-gradient(to right, #f6e384, #ffd500);\n border: 0;\n -webkit-transition: opacity 0.3s ease;\n -moz-transition: opacity 0.3s ease;\n -ms-transition: opacity 0.3s ease;\n -o-transition: opacity 0.3s ease;\n transition: opacity 0.3s ease; }\n .btn-gradient-warning:not([disabled]):not(.disabled):active, .btn-gradient-warning:not([disabled]):not(.disabled).active,\n .show > .btn-gradient-warning.dropdown-toggle {\n background: linear-gradient(to right, #f6e384, #ffd500); }\n .btn-gradient-warning:hover {\n opacity: .8; }\n .btn-gradient-warning:not(.btn-gradient-light) {\n color: #ffffff; }\n .btn-gradient-warning:not(.btn-gradient-light):hover, .btn-gradient-warning:not(.btn-gradient-light):focus, .btn-gradient-warning:not(.btn-gradient-light):active {\n color: #ffffff; }\n\n.btn-gradient-danger {\n background: linear-gradient(to right, #ffbf96, #fe7096);\n border: 0;\n -webkit-transition: opacity 0.3s ease;\n -moz-transition: opacity 0.3s ease;\n -ms-transition: opacity 0.3s ease;\n -o-transition: opacity 0.3s ease;\n transition: opacity 0.3s ease; }\n .btn-gradient-danger:not([disabled]):not(.disabled):active, .btn-gradient-danger:not([disabled]):not(.disabled).active,\n .show > .btn-gradient-danger.dropdown-toggle {\n background: linear-gradient(to right, #ffbf96, #fe7096); }\n .btn-gradient-danger:hover {\n opacity: .8; }\n .btn-gradient-danger:not(.btn-gradient-light) {\n color: #ffffff; }\n .btn-gradient-danger:not(.btn-gradient-light):hover, .btn-gradient-danger:not(.btn-gradient-light):focus, .btn-gradient-danger:not(.btn-gradient-light):active {\n color: #ffffff; }\n\n.btn-gradient-light {\n background: linear-gradient(to bottom, #f4f4f4, #e4e4e9);\n border: 0;\n -webkit-transition: opacity 0.3s ease;\n -moz-transition: opacity 0.3s ease;\n -ms-transition: opacity 0.3s ease;\n -o-transition: opacity 0.3s ease;\n transition: opacity 0.3s ease; }\n .btn-gradient-light:not([disabled]):not(.disabled):active, .btn-gradient-light:not([disabled]):not(.disabled).active,\n .show > .btn-gradient-light.dropdown-toggle {\n background: linear-gradient(to bottom, #f4f4f4, #e4e4e9); }\n .btn-gradient-light:hover {\n opacity: .8; }\n .btn-gradient-light:not(.btn-gradient-light) {\n color: #ffffff; }\n .btn-gradient-light:not(.btn-gradient-light):hover, .btn-gradient-light:not(.btn-gradient-light):focus, .btn-gradient-light:not(.btn-gradient-light):active {\n color: #ffffff; }\n\n.btn-gradient-dark {\n background: linear-gradient(89deg, #5e7188, #3e4b5b);\n border: 0;\n -webkit-transition: opacity 0.3s ease;\n -moz-transition: opacity 0.3s ease;\n -ms-transition: opacity 0.3s ease;\n -o-transition: opacity 0.3s ease;\n transition: opacity 0.3s ease; }\n .btn-gradient-dark:not([disabled]):not(.disabled):active, .btn-gradient-dark:not([disabled]):not(.disabled).active,\n .show > .btn-gradient-dark.dropdown-toggle {\n background: linear-gradient(89deg, #5e7188, #3e4b5b); }\n .btn-gradient-dark:hover {\n opacity: .8; }\n .btn-gradient-dark:not(.btn-gradient-light) {\n color: #ffffff; }\n .btn-gradient-dark:not(.btn-gradient-light):hover, .btn-gradient-dark:not(.btn-gradient-light):focus, .btn-gradient-dark:not(.btn-gradient-light):active {\n color: #ffffff; }\n\n/* Breadcrumbs */\n.breadcrumb {\n border: 1px solid #ebedf2; }\n .breadcrumb .breadcrumb-item {\n font-size: 0.875rem; }\n .breadcrumb .breadcrumb-item.active {\n color: rgba(52, 58, 64, 0.8); }\n .breadcrumb.breadcrumb-custom {\n padding: 0 0;\n border-color: #dbe3e6; }\n .breadcrumb.breadcrumb-custom .breadcrumb-item {\n font-size: 0.875rem;\n background: #dbe3e6;\n padding: 0.56rem 10px;\n color: #000000;\n display: inline-block;\n vertical-align: top; }\n .breadcrumb.breadcrumb-custom .breadcrumb-item:last-child {\n background: transparent; }\n .breadcrumb.breadcrumb-custom .breadcrumb-item:before {\n content: \"\"; }\n .breadcrumb.breadcrumb-custom .breadcrumb-item a {\n position: relative;\n color: inherit;\n border: 1px solid #dbe3e6;\n display: inline-block;\n vertical-align: top; }\n .breadcrumb.breadcrumb-custom .breadcrumb-item a:before, .breadcrumb.breadcrumb-custom .breadcrumb-item a:after {\n position: absolute;\n top: -9px;\n width: 0;\n height: 0;\n content: \"\";\n border-top: 21px solid transparent;\n border-bottom: 21px solid transparent; }\n .breadcrumb.breadcrumb-custom .breadcrumb-item a:before {\n right: -22px;\n z-index: 3;\n border-left-color: #dbe3e6;\n border-left-style: solid;\n border-left-width: 12px; }\n .breadcrumb.breadcrumb-custom .breadcrumb-item a:after {\n border-top: 21px solid transparent;\n border-bottom: 22px solid transparent;\n border-left: 12px solid #ffffff;\n top: -9px;\n right: -23px; }\n .breadcrumb.breadcrumb-custom .breadcrumb-item span {\n display: inline-block;\n vertical-align: top; }\n .breadcrumb.breadcrumb-custom .breadcrumb-item.active {\n color: rgba(52, 58, 64, 0.8); }\n .breadcrumb.bg-success, .breadcrumb.bg-dark, .breadcrumb.bg-danger, .breadcrumb.bg-warning, .breadcrumb.bg-primary, .breadcrumb.bg-info {\n border: none; }\n .breadcrumb.bg-success .breadcrumb-item, .breadcrumb.bg-dark .breadcrumb-item, .breadcrumb.bg-danger .breadcrumb-item, .breadcrumb.bg-warning .breadcrumb-item, .breadcrumb.bg-primary .breadcrumb-item, .breadcrumb.bg-info .breadcrumb-item {\n color: #ffffff; }\n .breadcrumb.bg-success .breadcrumb-item:before, .breadcrumb.bg-dark .breadcrumb-item:before, .breadcrumb.bg-danger .breadcrumb-item:before, .breadcrumb.bg-warning .breadcrumb-item:before, .breadcrumb.bg-primary .breadcrumb-item:before, .breadcrumb.bg-info .breadcrumb-item:before {\n color: inherit; }\n .breadcrumb.bg-success .breadcrumb-item a, .breadcrumb.bg-success .breadcrumb-item span, .breadcrumb.bg-dark .breadcrumb-item a, .breadcrumb.bg-dark .breadcrumb-item span, .breadcrumb.bg-danger .breadcrumb-item a, .breadcrumb.bg-danger .breadcrumb-item span, .breadcrumb.bg-warning .breadcrumb-item a, .breadcrumb.bg-warning .breadcrumb-item span, .breadcrumb.bg-primary .breadcrumb-item a, .breadcrumb.bg-primary .breadcrumb-item span, .breadcrumb.bg-info .breadcrumb-item a, .breadcrumb.bg-info .breadcrumb-item span {\n color: inherit; }\n\n/* inverse breadcrumb */\n.bg-inverse-primary, .image-grouped .text-avatar {\n background: #f6edff;\n border-color: #b66dff; }\n .bg-inverse-primary .breadcrumb-item, .image-grouped .text-avatar .breadcrumb-item {\n color: #b66dff; }\n .bg-inverse-primary .breadcrumb-item:before, .image-grouped .text-avatar .breadcrumb-item:before {\n color: inherit; }\n .bg-inverse-primary .breadcrumb-item a, .image-grouped .text-avatar .breadcrumb-item a {\n color: inherit; }\n .bg-inverse-primary.breadcrumb-custom, .image-grouped .breadcrumb-custom.text-avatar {\n background: transparent; }\n .bg-inverse-primary.breadcrumb-custom .breadcrumb-item, .image-grouped .breadcrumb-custom.text-avatar .breadcrumb-item {\n background: #f6edff; }\n .bg-inverse-primary.breadcrumb-custom .breadcrumb-item a, .image-grouped .breadcrumb-custom.text-avatar .breadcrumb-item a {\n color: #b66dff;\n border: none; }\n .bg-inverse-primary.breadcrumb-custom .breadcrumb-item a:before, .image-grouped .breadcrumb-custom.text-avatar .breadcrumb-item a:before {\n border-left-color: #f6edff; }\n .bg-inverse-primary.breadcrumb-custom .breadcrumb-item span, .image-grouped .breadcrumb-custom.text-avatar .breadcrumb-item span {\n color: #b66dff; }\n .bg-inverse-primary.breadcrumb-custom .breadcrumb-item:last-child, .image-grouped .breadcrumb-custom.text-avatar .breadcrumb-item:last-child {\n background: transparent; }\n\n.bg-inverse-secondary {\n background: white;\n border-color: #c3bdbd; }\n .bg-inverse-secondary .breadcrumb-item {\n color: #c3bdbd; }\n .bg-inverse-secondary .breadcrumb-item:before {\n color: inherit; }\n .bg-inverse-secondary .breadcrumb-item a {\n color: inherit; }\n .bg-inverse-secondary.breadcrumb-custom {\n background: transparent; }\n .bg-inverse-secondary.breadcrumb-custom .breadcrumb-item {\n background: white; }\n .bg-inverse-secondary.breadcrumb-custom .breadcrumb-item a {\n color: #c3bdbd;\n border: none; }\n .bg-inverse-secondary.breadcrumb-custom .breadcrumb-item a:before {\n border-left-color: white; }\n .bg-inverse-secondary.breadcrumb-custom .breadcrumb-item span {\n color: #c3bdbd; }\n .bg-inverse-secondary.breadcrumb-custom .breadcrumb-item:last-child {\n background: transparent; }\n\n.bg-inverse-success {\n background: #7ceedd;\n border-color: #1bcfb4; }\n .bg-inverse-success .breadcrumb-item {\n color: #1bcfb4; }\n .bg-inverse-success .breadcrumb-item:before {\n color: inherit; }\n .bg-inverse-success .breadcrumb-item a {\n color: inherit; }\n .bg-inverse-success.breadcrumb-custom {\n background: transparent; }\n .bg-inverse-success.breadcrumb-custom .breadcrumb-item {\n background: #7ceedd; }\n .bg-inverse-success.breadcrumb-custom .breadcrumb-item a {\n color: #1bcfb4;\n border: none; }\n .bg-inverse-success.breadcrumb-custom .breadcrumb-item a:before {\n border-left-color: #7ceedd; }\n .bg-inverse-success.breadcrumb-custom .breadcrumb-item span {\n color: #1bcfb4; }\n .bg-inverse-success.breadcrumb-custom .breadcrumb-item:last-child {\n background: transparent; }\n\n.bg-inverse-info {\n background: #89c4f2;\n border-color: #198ae3; }\n .bg-inverse-info .breadcrumb-item {\n color: #198ae3; }\n .bg-inverse-info .breadcrumb-item:before {\n color: inherit; }\n .bg-inverse-info .breadcrumb-item a {\n color: inherit; }\n .bg-inverse-info.breadcrumb-custom {\n background: transparent; }\n .bg-inverse-info.breadcrumb-custom .breadcrumb-item {\n background: #89c4f2; }\n .bg-inverse-info.breadcrumb-custom .breadcrumb-item a {\n color: #198ae3;\n border: none; }\n .bg-inverse-info.breadcrumb-custom .breadcrumb-item a:before {\n border-left-color: #89c4f2; }\n .bg-inverse-info.breadcrumb-custom .breadcrumb-item span {\n color: #198ae3; }\n .bg-inverse-info.breadcrumb-custom .breadcrumb-item:last-child {\n background: transparent; }\n\n.bg-inverse-warning {\n background: #ffed92;\n border-color: #fed713; }\n .bg-inverse-warning .breadcrumb-item {\n color: #fed713; }\n .bg-inverse-warning .breadcrumb-item:before {\n color: inherit; }\n .bg-inverse-warning .breadcrumb-item a {\n color: inherit; }\n .bg-inverse-warning.breadcrumb-custom {\n background: transparent; }\n .bg-inverse-warning.breadcrumb-custom .breadcrumb-item {\n background: #ffed92; }\n .bg-inverse-warning.breadcrumb-custom .breadcrumb-item a {\n color: #fed713;\n border: none; }\n .bg-inverse-warning.breadcrumb-custom .breadcrumb-item a:before {\n border-left-color: #ffed92; }\n .bg-inverse-warning.breadcrumb-custom .breadcrumb-item span {\n color: #fed713; }\n .bg-inverse-warning.breadcrumb-custom .breadcrumb-item:last-child {\n background: transparent; }\n\n.bg-inverse-danger {\n background: #fffbfb;\n border-color: #fe7c96; }\n .bg-inverse-danger .breadcrumb-item {\n color: #fe7c96; }\n .bg-inverse-danger .breadcrumb-item:before {\n color: inherit; }\n .bg-inverse-danger .breadcrumb-item a {\n color: inherit; }\n .bg-inverse-danger.breadcrumb-custom {\n background: transparent; }\n .bg-inverse-danger.breadcrumb-custom .breadcrumb-item {\n background: #fffbfb; }\n .bg-inverse-danger.breadcrumb-custom .breadcrumb-item a {\n color: #fe7c96;\n border: none; }\n .bg-inverse-danger.breadcrumb-custom .breadcrumb-item a:before {\n border-left-color: #fffbfb; }\n .bg-inverse-danger.breadcrumb-custom .breadcrumb-item span {\n color: #fe7c96; }\n .bg-inverse-danger.breadcrumb-custom .breadcrumb-item:last-child {\n background: transparent; }\n\n.bg-inverse-light {\n background: white;\n border-color: #f8f9fa; }\n .bg-inverse-light .breadcrumb-item {\n color: #f8f9fa; }\n .bg-inverse-light .breadcrumb-item:before {\n color: inherit; }\n .bg-inverse-light .breadcrumb-item a {\n color: inherit; }\n .bg-inverse-light.breadcrumb-custom {\n background: transparent; }\n .bg-inverse-light.breadcrumb-custom .breadcrumb-item {\n background: white; }\n .bg-inverse-light.breadcrumb-custom .breadcrumb-item a {\n color: #f8f9fa;\n border: none; }\n .bg-inverse-light.breadcrumb-custom .breadcrumb-item a:before {\n border-left-color: white; }\n .bg-inverse-light.breadcrumb-custom .breadcrumb-item span {\n color: #f8f9fa; }\n .bg-inverse-light.breadcrumb-custom .breadcrumb-item:last-child {\n background: transparent; }\n\n.bg-inverse-dark {\n background: #778aa2;\n border-color: #3e4b5b; }\n .bg-inverse-dark .breadcrumb-item {\n color: #3e4b5b; }\n .bg-inverse-dark .breadcrumb-item:before {\n color: inherit; }\n .bg-inverse-dark .breadcrumb-item a {\n color: inherit; }\n .bg-inverse-dark.breadcrumb-custom {\n background: transparent; }\n .bg-inverse-dark.breadcrumb-custom .breadcrumb-item {\n background: #778aa2; }\n .bg-inverse-dark.breadcrumb-custom .breadcrumb-item a {\n color: #3e4b5b;\n border: none; }\n .bg-inverse-dark.breadcrumb-custom .breadcrumb-item a:before {\n border-left-color: #778aa2; }\n .bg-inverse-dark.breadcrumb-custom .breadcrumb-item span {\n color: #3e4b5b; }\n .bg-inverse-dark.breadcrumb-custom .breadcrumb-item:last-child {\n background: transparent; }\n\n/* Cards */\n.card {\n border: 0;\n background: #fff; }\n .card .card-body {\n padding: 2.5rem 2.5rem; }\n .card .card-body + .card-body {\n padding-top: 1rem; }\n .card .card-title {\n color: #343a40;\n margin-bottom: 0.75rem;\n text-transform: capitalize;\n font-family: \"ubuntu-medium\", sans-serif;\n font-size: 1.125rem; }\n .card .card-subtitle {\n font-family: \"ubuntu-regular\", sans-serif;\n margin-top: 0.625rem;\n margin-bottom: 0.625rem; }\n .card .card-description {\n color: #76838f;\n margin-bottom: 1.5rem;\n font-family: \"ubuntu-regular\", sans-serif; }\n .card.card-outline-success {\n border: 1px solid theme-color(\"success\"); }\n .card.card-outline-primary {\n border: 1px solid theme-color(\"primary\"); }\n .card.card-outline-warning {\n border: 1px solid theme-color(\"warning\"); }\n .card.card-outline-danger {\n border: 1px solid theme-color(\"danger\"); }\n .card.card-rounded {\n border-radius: 5px; }\n .card.card-faded {\n background: #b5b0b2;\n border-color: #b5b0b2; }\n .card.card-circle-progress {\n color: #ffffff;\n text-align: center; }\n .card.card-img-holder {\n position: relative; }\n .card.card-img-holder .card-img-absolute {\n position: absolute;\n top: 0;\n right: 0;\n height: 100%; }\n .card.bg-blue-gradient {\n background: linear-gradient(to right, #065efd, #3169fd, #6f79fc);\n color: #fff; }\n .card.bg-orange-gradient {\n background: linear-gradient(to right, #ff7f2e, #fe7452);\n color: #fff; }\n .card.bg-green-gradient {\n background: linear-gradient(to right, #24e8a6, #09cdd1);\n color: #fff; }\n .card.card-no-shadow {\n box-shadow: none; }\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1; }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n margin-bottom: 0.75rem; } }\n\n.card-inverse-primary {\n background: rgba(182, 109, 255, 0.2);\n border: 1px solid theme-color-level(#b66dff, 1);\n color: theme-color-level(#b66dff, 3); }\n\n.card-inverse-secondary {\n background: rgba(195, 189, 189, 0.2);\n border: 1px solid theme-color-level(#c3bdbd, 1);\n color: theme-color-level(#c3bdbd, 3); }\n\n.card-inverse-success {\n background: rgba(27, 207, 180, 0.2);\n border: 1px solid theme-color-level(#1bcfb4, 1);\n color: theme-color-level(#1bcfb4, 3); }\n\n.card-inverse-info {\n background: rgba(25, 138, 227, 0.2);\n border: 1px solid theme-color-level(#198ae3, 1);\n color: theme-color-level(#198ae3, 3); }\n\n.card-inverse-warning {\n background: rgba(254, 215, 19, 0.2);\n border: 1px solid theme-color-level(#fed713, 1);\n color: theme-color-level(#fed713, 3); }\n\n.card-inverse-danger {\n background: rgba(254, 124, 150, 0.2);\n border: 1px solid theme-color-level(#fe7c96, 1);\n color: theme-color-level(#fe7c96, 3); }\n\n.card-inverse-light {\n background: rgba(248, 249, 250, 0.2);\n border: 1px solid theme-color-level(#f8f9fa, 1);\n color: theme-color-level(#f8f9fa, 3); }\n\n.card-inverse-dark {\n background: rgba(62, 75, 91, 0.2);\n border: 1px solid theme-color-level(#3e4b5b, 1);\n color: theme-color-level(#3e4b5b, 3); }\n\n/* Checkboxes and Radios */\n.form-check {\n position: relative;\n display: block;\n margin-top: 15px;\n margin-bottom: 10px;\n padding-left: 0; }\n .form-check .form-check-label {\n display: block;\n margin-left: 1.75rem;\n font-size: 0.875rem;\n line-height: 1.5; }\n .rtl .form-check .form-check-label {\n margin-left: 0;\n margin-right: 1.75rem; }\n .form-check .form-check-label input {\n position: absolute;\n top: 0;\n left: 0;\n margin-left: 0;\n margin-top: 0;\n z-index: 1;\n cursor: pointer;\n opacity: 0;\n filter: alpha(opacity=0); }\n .rtl .form-check .form-check-label input {\n left: auto;\n right: 0; }\n .form-check .form-check-label input[type=\"checkbox\"] + .input-helper:before, .form-check .form-check-label input[type=\"checkbox\"] + .input-helper:after {\n position: absolute;\n top: 0;\n left: 0; }\n .rtl .form-check .form-check-label input[type=\"checkbox\"] + .input-helper:before, .rtl .form-check .form-check-label input[type=\"checkbox\"] + .input-helper:after {\n left: auto;\n right: 0; }\n .form-check .form-check-label input[type=\"checkbox\"] + .input-helper:before {\n content: \"\";\n width: 18px;\n height: 18px;\n border-radius: 2px;\n border: solid #b66dff;\n border-width: 2px;\n -webkit-transition: all;\n -moz-transition: all;\n -ms-transition: all;\n -o-transition: all;\n transition: all;\n transition-duration: 0s;\n -webkit-transition-duration: 250ms;\n transition-duration: 250ms; }\n .form-check .form-check-label input[type=\"checkbox\"] + .input-helper:after {\n -webkit-transition: all;\n -moz-transition: all;\n -ms-transition: all;\n -o-transition: all;\n transition: all;\n transition-duration: 0s;\n -webkit-transition-duration: 250ms;\n transition-duration: 250ms;\n font-family: Material Design Icons;\n opacity: 0;\n filter: alpha(opacity=0);\n -webkit-transform: scale(0);\n -ms-transform: scale(0);\n -o-transform: scale(0);\n transform: scale(0);\n content: '\\F12C';\n font-size: .9375rem;\n font-weight: bold;\n color: #ffffff; }\n .form-check .form-check-label input[type=\"checkbox\"]:checked + .input-helper:before {\n background: linear-gradient(to right, #da8cff, #9a55ff);\n border-width: 0; }\n .form-check .form-check-label input[type=\"checkbox\"]:checked + .input-helper:after {\n width: 18px;\n opacity: 1;\n line-height: 18px;\n filter: alpha(opacity=100);\n -webkit-transform: scale(1);\n -ms-transform: scale(1);\n -o-transform: scale(1);\n transform: scale(1); }\n .form-check .form-check-label input[type=\"checkbox\"]:disabled + .input-helper:before {\n border-color: #ebedf2; }\n .form-check .form-check-label input[type=\"checkbox\"]:disabled:checked + .input-helper:after {\n background: #ebedf2;\n color: #ffffff; }\n .form-check .form-check-label input[type=\"radio\"] + .input-helper:before {\n position: absolute;\n content: \"\";\n top: 0;\n left: 0;\n border: solid #b66dff;\n border-width: 2px;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n -webkit-transition: all;\n -moz-transition: all;\n -ms-transition: all;\n -o-transition: all;\n transition: all;\n transition-duration: 0s;\n -webkit-transition-duration: 250ms;\n transition-duration: 250ms; }\n .rtl .form-check .form-check-label input[type=\"radio\"] + .input-helper:before {\n left: auto;\n right: 0; }\n .form-check .form-check-label input[type=\"radio\"] + .input-helper:after {\n content: \"\";\n width: 8px;\n height: 8px;\n background: #ffffff;\n border-radius: 50%;\n top: 6px;\n left: 6px;\n -webkit-transition: all;\n -o-transition: all;\n transition: all;\n transition-duration: 0s;\n -webkit-transition-duration: 250ms;\n transition-duration: 250ms;\n opacity: 0;\n filter: alpha(opacity=0);\n -webkit-transform: scale(0);\n -ms-transform: scale(0);\n -o-transform: scale(0);\n transform: scale(0);\n position: absolute; }\n .rtl .form-check .form-check-label input[type=\"radio\"] + .input-helper:after {\n left: auto;\n right: 6px; }\n .form-check .form-check-label input[type=\"radio\"]:checked + .input-helper:before {\n background: linear-gradient(to right, #da8cff, #9a55ff);\n border-width: 0; }\n .form-check .form-check-label input[type=\"radio\"]:checked + .input-helper:after {\n opacity: 1;\n line-height: 1.5;\n filter: alpha(opacity=100);\n -webkit-transform: scale(1);\n -ms-transform: scale(1);\n -o-transform: scale(1);\n transform: scale(1); }\n .form-check .form-check-label input[type=\"radio\"]:disabled + .input-helper:before {\n border-color: #ebedf2; }\n .form-check .form-check-label input[type=\"radio\"]:disabled:checked + .input-helper:before {\n background: #ebedf2; }\n .form-check .form-check-label input[type=\"radio\"]:disabled:checked + .input-helper:after {\n background: #ffffff; }\n\n.form-check-primary.form-check label input[type=\"checkbox\"] + .input-helper:before,\n.form-check-primary.form-check label input[type=\"radio\"] + .input-helper:before {\n border-color: theme-color(primary); }\n\n.form-check-primary.form-check label input[type=\"checkbox\"]:checked + .input-helper:before,\n.form-check-primary.form-check label input[type=\"radio\"]:checked + .input-helper:before {\n background: linear-gradient(to right, #da8cff, #9a55ff); }\n\n.form-check-secondary.form-check label input[type=\"checkbox\"] + .input-helper:before,\n.form-check-secondary.form-check label input[type=\"radio\"] + .input-helper:before {\n border-color: theme-color(secondary); }\n\n.form-check-secondary.form-check label input[type=\"checkbox\"]:checked + .input-helper:before,\n.form-check-secondary.form-check label input[type=\"radio\"]:checked + .input-helper:before {\n background: linear-gradient(to right, #e7ebf0, #868e96); }\n\n.form-check-success.form-check label input[type=\"checkbox\"] + .input-helper:before,\n.form-check-success.form-check label input[type=\"radio\"] + .input-helper:before {\n border-color: theme-color(success); }\n\n.form-check-success.form-check label input[type=\"checkbox\"]:checked + .input-helper:before,\n.form-check-success.form-check label input[type=\"radio\"]:checked + .input-helper:before {\n background: linear-gradient(to right, #84d9d2, #07cdae); }\n\n.form-check-info.form-check label input[type=\"checkbox\"] + .input-helper:before,\n.form-check-info.form-check label input[type=\"radio\"] + .input-helper:before {\n border-color: theme-color(info); }\n\n.form-check-info.form-check label input[type=\"checkbox\"]:checked + .input-helper:before,\n.form-check-info.form-check label input[type=\"radio\"]:checked + .input-helper:before {\n background: linear-gradient(to right, #90caf9, #047edf 99%); }\n\n.form-check-warning.form-check label input[type=\"checkbox\"] + .input-helper:before,\n.form-check-warning.form-check label input[type=\"radio\"] + .input-helper:before {\n border-color: theme-color(warning); }\n\n.form-check-warning.form-check label input[type=\"checkbox\"]:checked + .input-helper:before,\n.form-check-warning.form-check label input[type=\"radio\"]:checked + .input-helper:before {\n background: linear-gradient(to right, #f6e384, #ffd500); }\n\n.form-check-danger.form-check label input[type=\"checkbox\"] + .input-helper:before,\n.form-check-danger.form-check label input[type=\"radio\"] + .input-helper:before {\n border-color: theme-color(danger); }\n\n.form-check-danger.form-check label input[type=\"checkbox\"]:checked + .input-helper:before,\n.form-check-danger.form-check label input[type=\"radio\"]:checked + .input-helper:before {\n background: linear-gradient(to right, #ffbf96, #fe7096); }\n\n.form-check-light.form-check label input[type=\"checkbox\"] + .input-helper:before,\n.form-check-light.form-check label input[type=\"radio\"] + .input-helper:before {\n border-color: theme-color(light); }\n\n.form-check-light.form-check label input[type=\"checkbox\"]:checked + .input-helper:before,\n.form-check-light.form-check label input[type=\"radio\"]:checked + .input-helper:before {\n background: linear-gradient(to bottom, #f4f4f4, #e4e4e9); }\n\n.form-check-dark.form-check label input[type=\"checkbox\"] + .input-helper:before,\n.form-check-dark.form-check label input[type=\"radio\"] + .input-helper:before {\n border-color: theme-color(dark); }\n\n.form-check-dark.form-check label input[type=\"checkbox\"]:checked + .input-helper:before,\n.form-check-dark.form-check label input[type=\"radio\"]:checked + .input-helper:before {\n background: linear-gradient(89deg, #5e7188, #3e4b5b); }\n\n/* Dropdowns */\n.dropdown .dropdown-toggle:after {\n border-top: 0;\n border-right: 0;\n border-left: 0;\n border-bottom: 0;\n font: normal normal normal 24px/1 \"Material Design Icons\";\n content: \"\\f140\";\n width: auto;\n height: auto;\n vertical-align: baseline;\n font-size: .75rem; }\n\n.dropdown .dropdown-menu {\n margin-top: .75rem;\n font-size: 0.875rem;\n box-shadow: 0px 1px 15px 1px rgba(230, 234, 236, 0.35); }\n .dropdown .dropdown-menu .dropdown-item {\n font-size: 1rem;\n padding: .25rem 1.5rem; }\n .dropdown .dropdown-menu .dropdown-item:active {\n background: initial; }\n .dropdown .dropdown-menu .dropdown-item:hover {\n background-color: #f8f9fa;\n color: #ffffff; }\n\n/* Forms */\n.form-group {\n margin-bottom: 1.5rem; }\n\n.input-group-append,\n.input-group-prepend {\n color: #c9c8c8;\n width: auto;\n border: none; }\n .input-group-append .input-group-text,\n .input-group-prepend .input-group-text {\n border-color: #ebedf2;\n padding: 0.94rem 0.75rem;\n color: #c9c8c8; }\n\n.form-control {\n border: 1px solid #ebedf2;\n font-family: \"ubuntu-regular\", sans-serif;\n font-size: 0.8125rem; }\n .form-control:focus {\n background-color: #ffffff;\n color: #000000;\n outline: none; }\n\nselect.form-control {\n padding: .4375rem .75rem;\n border: 0;\n outline: 1px solid #ebedf2;\n color: #c9c8c8; }\n select.form-control:focus {\n outline: 1px solid #ebedf2; }\n select.form-control.border-primary {\n outline: 1px solid #b66dff; }\n select.form-control.border-primary:focus {\n outline: 1px solid #b66dff; }\n select.form-control.border-secondary, select.form-control.loader-demo-box {\n outline: 1px solid #c3bdbd; }\n select.form-control.border-secondary:focus, select.form-control.loader-demo-box:focus {\n outline: 1px solid #c3bdbd; }\n select.form-control.border-success {\n outline: 1px solid #1bcfb4; }\n select.form-control.border-success:focus {\n outline: 1px solid #1bcfb4; }\n select.form-control.border-info {\n outline: 1px solid #198ae3; }\n select.form-control.border-info:focus {\n outline: 1px solid #198ae3; }\n select.form-control.border-warning {\n outline: 1px solid #fed713; }\n select.form-control.border-warning:focus {\n outline: 1px solid #fed713; }\n select.form-control.border-danger {\n outline: 1px solid #fe7c96; }\n select.form-control.border-danger:focus {\n outline: 1px solid #fe7c96; }\n select.form-control.border-light {\n outline: 1px solid #f8f9fa; }\n select.form-control.border-light:focus {\n outline: 1px solid #f8f9fa; }\n select.form-control.border-dark {\n outline: 1px solid #3e4b5b; }\n select.form-control.border-dark:focus {\n outline: 1px solid #3e4b5b; }\n\n.form-group label {\n font-size: 0.875rem;\n line-height: 1;\n vertical-align: top;\n margin-bottom: .5rem; }\n\n.form-group.has-danger .form-control {\n border-color: #fe7c96; }\n\n.form-group .file-upload-default {\n visibility: hidden;\n position: absolute; }\n\n.form-group .file-upload-info {\n background: transparent; }\n\n/* Icons */\n.icons-list {\n border-left: 1px solid #ebedf2;\n border-top: 1px solid #ebedf2; }\n .icons-list > div {\n border-bottom: 1px solid #ebedf2;\n border-right: 1px solid #ebedf2;\n display: -webkit-flex;\n display: flex;\n -webkit-align-items: center;\n align-items: center;\n padding: 15px 15px;\n font-family: \"ubuntu-regular\", sans-serif;\n font-size: 0.875rem; }\n .icons-list > div i {\n display: inline-block;\n font-size: 20px;\n width: 40px;\n text-align: left;\n color: #b66dff; }\n\n/* Lists */\nul,\nol,\ndl {\n padding-left: 1rem;\n font-size: 0.875rem; }\n ul li,\n ol li,\n dl li {\n line-height: 1.8; }\n\n.list-ticked,\n.list-arrow,\n.list-star {\n list-style: none;\n padding: 0; }\n .list-ticked li,\n .list-arrow li,\n .list-star li {\n padding-left: 1.5rem; }\n .list-ticked li:before,\n .list-arrow li:before,\n .list-star li:before {\n font-family: \"Material Design Icons\";\n margin-left: -1.5rem;\n width: 1.5rem;\n margin-right: .5rem; }\n\n.list-ticked li:before {\n content: '\\F12D';\n color: #fe7c96; }\n\n.list-arrow li:before {\n content: '\\F142';\n color: #1bcfb4; }\n\n.list-star li:before {\n content: '\\F4CE';\n color: #fed713; }\n\n.gradient-bullet-list {\n padding-left: 0; }\n .rtl .gradient-bullet-list {\n padding-right: 0; }\n .gradient-bullet-list li {\n position: relative;\n list-style-type: none;\n padding-left: 25px;\n line-height: 1;\n padding-bottom: 25px; }\n .gradient-bullet-list li:before, .gradient-bullet-list li:after {\n content: \"\";\n position: absolute; }\n .gradient-bullet-list li:before {\n top: 0;\n left: 0;\n width: 15px;\n height: 15px;\n border-radius: 100%; }\n .gradient-bullet-list li:after {\n width: 11px;\n height: 11px;\n top: 2px;\n left: 2px;\n background: #fff;\n border-radius: 100%; }\n .gradient-bullet-list li:nth-child(1):before {\n background: linear-gradient(to right, #ffbf96, #fe7096); }\n .gradient-bullet-list li:nth-child(2):before {\n background: linear-gradient(to right, #90caf9, #047edf 99%); }\n .gradient-bullet-list li:nth-child(3):before {\n background: linear-gradient(to right, #f6e384, #ffd500); }\n .gradient-bullet-list li:nth-child(4):before {\n background: linear-gradient(to right, #84d9d2, #07cdae); }\n .gradient-bullet-list li:nth-child(5):before {\n background: linear-gradient(to right, #da8cff, #9a55ff); }\n\n.bullet-line-list {\n padding-left: 30px;\n margin-bottom: 0;\n position: relative;\n list-style-type: none; }\n .rtl .bullet-line-list {\n padding-right: 0px; }\n .bullet-line-list li {\n position: relative;\n line-height: 1;\n padding-bottom: 10px; }\n .bullet-line-list li:before {\n content: \"\";\n position: absolute;\n border-radius: 100%;\n width: 12px;\n height: 12px;\n left: -28px;\n top: 6px;\n border: 3px solid #b66dff;\n margin-right: 15px;\n z-index: 2;\n background: color(white); }\n .bullet-line-list li:after {\n content: \"\";\n border: 1px solid #ebedf2;\n position: absolute;\n bottom: 0;\n left: -23px;\n height: 100%; }\n .bullet-line-list li:first-child:after {\n content: \"\";\n height: 80%; }\n .bullet-line-list li:last-child {\n padding-bottom: 0; }\n .bullet-line-list li:last-child:after {\n content: \"\";\n top: 0;\n height: 30%; }\n\n/* Preview */\n.preview-list .preview-item {\n display: -webkit-flex;\n display: flex;\n -webkit-flex-direction: row;\n flex-direction: row;\n -webkit-align-items: flex-start;\n align-items: flex-start;\n padding: .75rem 1.5rem;\n font-size: .875rem; }\n .preview-list .preview-item:last-child {\n border-bottom: 0; }\n .preview-list .preview-item:hover {\n background: #e9ecef; }\n .preview-list .preview-item .form-check {\n margin-top: 8px;\n margin-right: 1rem; }\n .preview-list .preview-item .preview-thumbnail {\n color: color(white);\n position: relative; }\n .preview-list .preview-item .preview-thumbnail img,\n .preview-list .preview-item .preview-thumbnail .preview-icon {\n width: 36px;\n height: 36px;\n border-radius: 100%; }\n .preview-list .preview-item .preview-thumbnail .preview-icon {\n padding: 6px;\n text-align: center;\n display: -webkit-flex;\n display: flex;\n -webkit-align-items: center;\n align-items: center;\n -webkit-justify-content: center;\n justify-content: center; }\n .preview-list .preview-item .preview-thumbnail .preview-icon i {\n font-size: 1.125rem;\n margin: 0; }\n .preview-list .preview-item .preview-thumbnail .badge {\n border: 2px solid color(white);\n border-radius: 100%;\n bottom: 5px;\n display: block;\n height: 14px;\n left: -5px;\n padding: 0;\n position: absolute;\n width: 14px; }\n .preview-list .preview-item .preview-item-content {\n line-height: 1;\n padding-left: 15px; }\n .preview-list .preview-item .preview-item-content:first-child {\n padding-left: 0; }\n .preview-list .preview-item .preview-item-content p {\n margin-bottom: 10px; }\n .preview-list .preview-item .preview-item-content p .content-category {\n font-family: 'source-sans-pro-semibold', sans-serif;\n padding-right: 15px;\n border-right: 1px solid #ebedf2; }\n .rtl .preview-list .preview-item .preview-item-content {\n padding-left: 0;\n padding-right: 1rem;\n margin-right: 0;\n margin-left: auto; }\n .preview-list .preview-item .preview-actions {\n display: -webkit-flex;\n display: flex;\n -webkit-flex-direction: row;\n flex-direction: row; }\n .preview-list .preview-item .preview-actions i {\n width: 29px;\n color: color(gray-lightest);\n height: 29px;\n border: 2px solid color(gray-lightest);\n border-radius: 100%;\n padding: 3px 6px;\n display: inline-block; }\n .preview-list .preview-item .preview-actions i:first-child {\n margin-right: 10px; }\n\n.preview-list.comment-preview .preview-item {\n padding: .87rem 0; }\n .preview-list.comment-preview .preview-item:first-child {\n padding-top: 0; }\n .preview-list.comment-preview .preview-item p {\n line-height: 27px; }\n\n.preview-list.bordered .preview-item {\n border-bottom: 1px solid #ebedf2; }\n .preview-list.bordered .preview-item:last-child {\n border-bottom: 0; }\n\n/* Tables */\n.table {\n margin-bottom: 0; }\n .table thead th {\n border-top: 0;\n border-bottom-width: 1px;\n font-family: \"ubuntu-medium\", sans-serif;\n font-weight: initial; }\n .table thead th i {\n margin-left: 0.325rem; }\n .table th,\n .table td {\n vertical-align: middle;\n font-size: 0.875rem;\n line-height: 1;\n white-space: nowrap;\n padding: 0.9375rem; }\n .table th img,\n .table td img {\n width: 36px;\n height: 36px;\n border-radius: 100%; }\n .table th .badge,\n .table td .badge {\n margin-bottom: 0; }\n .table.table-borderless {\n border: none; }\n .table.table-borderless tr,\n .table.table-borderless td,\n .table.table-borderless th {\n border: none; }\n\n.table > :not(:last-child) > :last-child > *, .jsgrid .jsgrid-table > :not(:last-child) > :last-child > * {\n border-bottom-color: #ebedf2; }\n\n.table > :not(:first-child), .jsgrid .jsgrid-table > :not(:first-child) {\n border-top: none; }\n\n/* Tabs */\n.add-items {\n margin-bottom: 1.5rem;\n overflow: hidden; }\n .add-items input[type=\"text\"] {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n width: 100%;\n background: transparent; }\n .add-items .btn {\n margin-left: .5rem; }\n .rtl .add-items .btn {\n margin-left: auto;\n margin-right: .5rem; }\n\n.list-wrapper {\n height: 100%;\n max-height: 100%; }\n .list-wrapper ul {\n padding: 0;\n text-align: left;\n list-style: none;\n margin-bottom: 0; }\n .list-wrapper ul li {\n font-size: .9375rem;\n padding: .4rem 0;\n border-bottom: 1px solid #ebedf2; }\n .list-wrapper ul li:first-child {\n border-bottom: none; }\n .list-wrapper ul li .form-check {\n max-width: 90%;\n margin-top: .25rem;\n margin-bottom: .25rem; }\n .list-wrapper input[type=\"checkbox\"] {\n margin-right: 15px; }\n .list-wrapper .remove {\n cursor: pointer;\n font-size: 1.438rem;\n font-weight: 600;\n width: 1.25rem;\n height: 1.25rem;\n line-height: 20px;\n text-align: center; }\n .list-wrapper .completed {\n text-decoration: line-through;\n text-decoration-color: #198ae3; }\n\n/*-------------------------------------------------------------------*/\n/* === Landing screens === */\n/* Auth */\n.auth .auth-form-light {\n background: #ffffff; }\n .auth .auth-form-light select {\n color: #c9c8c8; }\n .auth .auth-form-light .input-group .form-control:focus, .auth .auth-form-light .input-group .form-control:active {\n border-color: #ebedf2; }\n\n.auth .brand-logo {\n margin-bottom: 2rem; }\n .auth .brand-logo img {\n width: 150px; }\n\n.auth form .form-group {\n margin-bottom: 1.5rem; }\n .auth form .form-group label {\n font-size: .8125rem; }\n .auth form .form-group .form-control {\n background: transparent;\n border-radius: 0;\n font-size: .9375rem; }\n\n.auth form .auth-form-btn {\n height: 50px;\n line-height: 1.5; }\n\n.auth form .auth-link {\n font-size: 0.875rem; }\n .auth form .auth-link:hover {\n color: initial; }\n\n/* Navbar */\n.navbar {\n font-family: \"ubuntu-light\", sans-serif;\n background: #fff;\n transition: background 0.25s ease;\n -webkit-transition: background 0.25s ease;\n -moz-transition: background 0.25s ease;\n -ms-transition: background 0.25s ease; }\n .navbar .navbar-brand {\n width: 110px; }\n .navbar .navbar-brand-wrapper {\n transition: width 0.25s ease, background 0.25s ease;\n -webkit-transition: width 0.25s ease, background 0.25s ease;\n -moz-transition: width 0.25s ease, background 0.25s ease;\n -ms-transition: width 0.25s ease, background 0.25s ease;\n background: #fff;\n width: 260px;\n height: 70px; }\n @media (max-width: 991px) {\n .navbar .navbar-brand-wrapper {\n width: 55px; } }\n .navbar .navbar-brand-wrapper .navbar-brand {\n color: #27367f;\n font-size: 1.5rem;\n line-height: 48px;\n margin-right: 0;\n padding: .25rem 0;\n width: 100%; }\n .navbar .navbar-brand-wrapper .navbar-brand:active, .navbar .navbar-brand-wrapper .navbar-brand:focus, .navbar .navbar-brand-wrapper .navbar-brand:hover {\n color: #1b2658; }\n .navbar .navbar-brand-wrapper .navbar-brand img {\n width: calc(260px - 120px);\n max-width: 100%;\n height: 28px;\n margin: auto;\n vertical-align: middle; }\n .navbar .navbar-brand-wrapper .navbar-brand.brand-logo-mini {\n display: none; }\n .navbar .navbar-brand-wrapper .navbar-brand.brand-logo-mini img {\n width: calc(70px - 50px);\n max-width: 100%;\n height: 28px;\n margin: auto; }\n .navbar .navbar-menu-wrapper {\n transition: width 0.25s ease;\n -webkit-transition: width 0.25s ease;\n -moz-transition: width 0.25s ease;\n -ms-transition: width 0.25s ease;\n color: #9c9fa6;\n padding-left: 24px;\n padding-right: 24px;\n width: calc(100% - 260px);\n height: 70px; }\n @media (max-width: 991px) {\n .navbar .navbar-menu-wrapper {\n width: auto;\n padding-left: 15px;\n padding-right: 15px; } }\n .navbar .navbar-menu-wrapper .navbar-toggler {\n border: 0;\n color: inherit;\n height: 70px;\n border-radius: 0px;\n padding-left: 5px;\n padding-right: 20px; }\n .navbar .navbar-menu-wrapper .navbar-toggler:focus {\n box-shadow: none; }\n .navbar .navbar-menu-wrapper .navbar-toggler:not(.navbar-toggler-right) {\n font-size: 1.5rem; }\n @media (max-width: 991px) {\n .navbar .navbar-menu-wrapper .navbar-toggler:not(.navbar-toggler-right) {\n display: none; } }\n @media (max-width: 991px) {\n .navbar .navbar-menu-wrapper .navbar-toggler.navbar-toggler-right {\n padding-left: 15px;\n padding-right: 11px;\n border-right: none; } }\n .navbar .navbar-menu-wrapper .search-field .input-group input {\n font-size: 0.875rem;\n padding: .5rem; }\n .navbar .navbar-menu-wrapper .search-field .input-group input:-ms-input-placeholder {\n font-size: 0.875rem;\n color: #9c9fa6;\n font-family: \"ubuntu-light\", sans-serif; }\n .navbar .navbar-menu-wrapper .search-field .input-group input:-moz-placeholder {\n font-size: 0.875rem;\n color: #9c9fa6;\n font-family: \"ubuntu-light\", sans-serif; }\n .navbar .navbar-menu-wrapper .search-field .input-group input::-moz-placeholder {\n font-size: 0.875rem;\n color: #9c9fa6;\n font-family: \"ubuntu-light\", sans-serif; }\n .navbar .navbar-menu-wrapper .search-field .input-group input::-webkit-input-placeholder {\n font-size: 0.875rem;\n color: #9c9fa6;\n font-family: \"ubuntu-light\", sans-serif; }\n .navbar .navbar-menu-wrapper .search-field .input-group i {\n font-size: 17px;\n margin-right: 0;\n color: #9c9fa6; }\n .navbar .navbar-menu-wrapper .search-field .input-group .input-group-text {\n background: transparent; }\n .navbar .navbar-menu-wrapper .count-indicator {\n position: relative; }\n .navbar .navbar-menu-wrapper .count-indicator .count-symbol,\n .navbar .navbar-menu-wrapper .count-indicator .count-number {\n position: absolute;\n border-radius: 100%;\n border: 2px solid #ffffff; }\n .navbar .navbar-menu-wrapper .count-indicator .count-symbol {\n top: 17px;\n right: -3px;\n width: 10px;\n height: 10px; }\n .navbar .navbar-menu-wrapper .count-indicator .count-number {\n min-width: 14px;\n height: 14px;\n font-size: .5rem;\n color: #ffffff;\n bottom: 16px;\n right: -5px;\n line-height: 1;\n text-align: center; }\n .navbar .navbar-menu-wrapper .count-indicator:after {\n display: none; }\n .navbar .navbar-menu-wrapper .navbar-nav {\n flex-direction: row;\n align-items: center; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item .nav-link {\n color: inherit;\n font-size: 0.875rem;\n margin-left: 1.5rem;\n margin-right: 1.5rem;\n height: 70px;\n display: -webkit-flex;\n display: flex;\n -webkit-align-items: center;\n align-items: center; }\n @media (max-width: 767px) {\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item .nav-link {\n margin-left: .8rem;\n margin-right: .8rem; } }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item .nav-link i {\n font-size: 1.25rem; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-toggle:after {\n color: #b66dff;\n font-size: 1rem; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu {\n border: none;\n border-radius: 5px;\n -webkit-box-shadow: 0px 3px 21px 0px rgba(0, 0, 0, 0.2);\n -moz-box-shadow: 0px 3px 21px 0px rgba(0, 0, 0, 0.2);\n box-shadow: 0px 3px 21px 0px rgba(0, 0, 0, 0.2); }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu.navbar-dropdown {\n position: absolute;\n font-size: 0.9rem;\n margin-top: 0;\n padding: 0; }\n .rtl .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu.navbar-dropdown {\n right: auto;\n left: 0; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu.navbar-dropdown .dropdown-item {\n margin-bottom: 0;\n padding: 11px 13px;\n cursor: pointer; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu.navbar-dropdown .dropdown-item i {\n font-size: 17px; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu.navbar-dropdown .dropdown-item .ellipsis {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis; }\n .rtl .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu.navbar-dropdown .dropdown-item i {\n margin-left: 10px; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .dropdown-menu.navbar-dropdown .dropdown-divider {\n margin: 0; }\n @media (max-width: 991px) {\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown {\n position: static; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.dropdown .navbar-dropdown {\n left: 20px;\n right: 20px;\n top: 70px;\n width: calc(100% - 40px); } }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-settings {\n padding-left: 20px;\n padding-right: 5px; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-settings .nav-link {\n margin-right: 0;\n margin-left: 0; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link .nav-profile-img {\n position: relative;\n width: 32px;\n height: 32px; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link .nav-profile-img img {\n width: 32px;\n height: 32px;\n border-radius: 100%; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link .nav-profile-img .availability-status {\n position: absolute;\n width: 10px;\n height: 10px;\n border-radius: 100%;\n border: 2px solid #ffffff;\n bottom: 5px;\n right: -5px; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link .nav-profile-img .availability-status.online {\n background: #1bcfb4; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link .nav-profile-img .availability-status.offline {\n background: #fe7c96; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link .nav-profile-img .availability-status.busy {\n background: #fed713; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link .nav-profile-text {\n margin-left: 1.25rem; }\n .rtl .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link .nav-profile-text {\n margin-left: 0;\n margin-right: 1.25rem; }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link .nav-profile-text p {\n line-height: 1; }\n @media (max-width: 767px) {\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link .nav-profile-text {\n display: none; } }\n .navbar .navbar-menu-wrapper .navbar-nav .nav-item.nav-profile .nav-link.dropdown-toggle:after {\n line-height: 2; }\n @media (min-width: 992px) {\n .navbar .navbar-menu-wrapper .navbar-nav.navbar-nav-right {\n margin-left: auto; }\n .rtl .navbar .navbar-menu-wrapper .navbar-nav.navbar-nav-right {\n margin-left: 0;\n margin-right: auto; } }\n\n@media (max-width: 991px) {\n .navbar {\n flex-direction: row; }\n .navbar .navbar-brand-wrapper {\n width: 75px; }\n .navbar .navbar-brand-wrapper .navbar-brand.brand-logo {\n display: none; }\n .navbar .navbar-brand-wrapper .navbar-brand.brand-logo-mini {\n display: inline-block; }\n .navbar-collapse {\n display: flex;\n margin-top: 0.5rem; } }\n\n@media (max-width: 480px) {\n .navbar .navbar-brand-wrapper {\n width: 55px; }\n .navbar .navbar-brand-wrapper .brand-logo-mini {\n padding-top: 0px; } }\n\n/* Navbar color variations */\n.navbar.navbar-primary .navbar-menu-wrapper {\n background: linear-gradient(to right, #da8cff, #9a55ff);\n color: #ffffff; }\n .navbar.navbar-primary .navbar-menu-wrapper .search-field .input-group input:-ms-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-primary .navbar-menu-wrapper .search-field .input-group input:-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-primary .navbar-menu-wrapper .search-field .input-group input::-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-primary .navbar-menu-wrapper .search-field .input-group input::-webkit-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-primary .navbar-menu-wrapper .search-field .input-group i {\n color: #ffffff; }\n\n.navbar.navbar-secondary .navbar-menu-wrapper {\n background: linear-gradient(to right, #e7ebf0, #868e96);\n color: #ffffff; }\n .navbar.navbar-secondary .navbar-menu-wrapper .search-field .input-group input:-ms-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-secondary .navbar-menu-wrapper .search-field .input-group input:-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-secondary .navbar-menu-wrapper .search-field .input-group input::-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-secondary .navbar-menu-wrapper .search-field .input-group input::-webkit-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-secondary .navbar-menu-wrapper .search-field .input-group i {\n color: #ffffff; }\n\n.navbar.navbar-success .navbar-menu-wrapper {\n background: linear-gradient(to right, #84d9d2, #07cdae);\n color: #ffffff; }\n .navbar.navbar-success .navbar-menu-wrapper .search-field .input-group input:-ms-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-success .navbar-menu-wrapper .search-field .input-group input:-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-success .navbar-menu-wrapper .search-field .input-group input::-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-success .navbar-menu-wrapper .search-field .input-group input::-webkit-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-success .navbar-menu-wrapper .search-field .input-group i {\n color: #ffffff; }\n\n.navbar.navbar-info .navbar-menu-wrapper {\n background: linear-gradient(to right, #90caf9, #047edf 99%);\n color: #ffffff; }\n .navbar.navbar-info .navbar-menu-wrapper .search-field .input-group input:-ms-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-info .navbar-menu-wrapper .search-field .input-group input:-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-info .navbar-menu-wrapper .search-field .input-group input::-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-info .navbar-menu-wrapper .search-field .input-group input::-webkit-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-info .navbar-menu-wrapper .search-field .input-group i {\n color: #ffffff; }\n\n.navbar.navbar-warning .navbar-menu-wrapper {\n background: linear-gradient(to right, #f6e384, #ffd500);\n color: #ffffff; }\n .navbar.navbar-warning .navbar-menu-wrapper .search-field .input-group input:-ms-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-warning .navbar-menu-wrapper .search-field .input-group input:-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-warning .navbar-menu-wrapper .search-field .input-group input::-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-warning .navbar-menu-wrapper .search-field .input-group input::-webkit-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-warning .navbar-menu-wrapper .search-field .input-group i {\n color: #ffffff; }\n\n.navbar.navbar-danger .navbar-menu-wrapper {\n background: linear-gradient(to right, #ffbf96, #fe7096);\n color: #ffffff; }\n .navbar.navbar-danger .navbar-menu-wrapper .search-field .input-group input:-ms-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-danger .navbar-menu-wrapper .search-field .input-group input:-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-danger .navbar-menu-wrapper .search-field .input-group input::-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-danger .navbar-menu-wrapper .search-field .input-group input::-webkit-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-danger .navbar-menu-wrapper .search-field .input-group i {\n color: #ffffff; }\n\n.navbar.navbar-light .navbar-menu-wrapper {\n background: linear-gradient(to bottom, #f4f4f4, #e4e4e9);\n color: #ffffff; }\n .navbar.navbar-light .navbar-menu-wrapper .search-field .input-group input:-ms-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-light .navbar-menu-wrapper .search-field .input-group input:-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-light .navbar-menu-wrapper .search-field .input-group input::-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-light .navbar-menu-wrapper .search-field .input-group input::-webkit-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-light .navbar-menu-wrapper .search-field .input-group i {\n color: #ffffff; }\n\n.navbar.navbar-dark .navbar-menu-wrapper {\n background: linear-gradient(89deg, #5e7188, #3e4b5b);\n color: #ffffff; }\n .navbar.navbar-dark .navbar-menu-wrapper .search-field .input-group input:-ms-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-dark .navbar-menu-wrapper .search-field .input-group input:-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-dark .navbar-menu-wrapper .search-field .input-group input::-moz-placeholder {\n color: #ffffff; }\n .navbar.navbar-dark .navbar-menu-wrapper .search-field .input-group input::-webkit-input-placeholder {\n color: #ffffff; }\n .navbar.navbar-dark .navbar-menu-wrapper .search-field .input-group i {\n color: #ffffff; }\n\n/* Sidebar */\n.sidebar {\n min-height: calc(100vh - 70px);\n background: #ffffff;\n font-family: \"ubuntu-regular\", sans-serif;\n padding: 0;\n width: 260px;\n z-index: 11;\n transition: width 0.25s ease, background 0.25s ease;\n -webkit-transition: width 0.25s ease, background 0.25s ease;\n -moz-transition: width 0.25s ease, background 0.25s ease;\n -ms-transition: width 0.25s ease, background 0.25s ease; }\n .sidebar .nav {\n overflow: hidden;\n flex-wrap: nowrap;\n flex-direction: column;\n margin-bottom: 60px; }\n .sidebar .nav .nav-item {\n padding: 0 2.25rem;\n -webkit-transition-duration: 0.25s;\n -moz-transition-duration: 0.25s;\n -o-transition-duration: 0.25s;\n transition-duration: 0.25s;\n transition-property: background;\n -webkit-transition-property: background; }\n .sidebar .nav .nav-item .collapse {\n z-index: 999; }\n .sidebar .nav .nav-item .nav-link {\n display: -webkit-flex;\n display: flex;\n -webkit-align-items: center;\n align-items: center;\n white-space: nowrap;\n padding: 1.125rem 0 1.125rem 0;\n color: #3e4b5b;\n -webkit-transition-duration: 0.45s;\n -moz-transition-duration: 0.45s;\n -o-transition-duration: 0.45s;\n transition-duration: 0.45s;\n transition-property: color;\n -webkit-transition-property: color; }\n .sidebar .nav .nav-item .nav-link i {\n color: inherit; }\n .sidebar .nav .nav-item .nav-link i.menu-icon {\n font-size: 1.125rem;\n line-height: 1;\n margin-left: auto;\n color: #bba8bff5; }\n .rtl .sidebar .nav .nav-item .nav-link i.menu-icon {\n margin-left: 0;\n margin-right: auto; }\n .sidebar .nav .nav-item .nav-link i.menu-icon:before {\n vertical-align: middle; }\n .sidebar .nav .nav-item .nav-link i.menu-arrow {\n font: normal normal normal 24px/1 \"Material Design Icons\";\n line-height: 1;\n font-size: 1.125rem;\n margin-left: auto;\n color: #9e9da0; }\n .rtl .sidebar .nav .nav-item .nav-link i.menu-arrow {\n margin-left: 0;\n margin-right: auto; }\n .sidebar .nav .nav-item .nav-link i.menu-arrow:before {\n content: \"\\f141\";\n font-size: inherit;\n color: inherit; }\n .sidebar .nav .nav-item .nav-link i.menu-arrow + .menu-icon {\n margin-left: .25rem; }\n .rtl .sidebar .nav .nav-item .nav-link i.menu-arrow + .menu-icon {\n margin-left: 0;\n margin-right: .25rem; }\n .sidebar .nav .nav-item .nav-link .menu-title {\n color: inherit;\n display: inline-block;\n font-size: 0.875rem;\n line-height: 1;\n vertical-align: middle; }\n .sidebar .nav .nav-item .nav-link .badge {\n margin-right: auto;\n margin-left: 1rem; }\n .sidebar .nav .nav-item .nav-link[aria-expanded=\"true\"] .menu-arrow:before {\n content: \"\\f140\"; }\n .sidebar .nav .nav-item.active {\n background: #ffffff; }\n .sidebar .nav .nav-item.active > .nav-link .menu-title {\n color: #b66dff;\n font-family: \"ubuntu-medium\", sans-serif; }\n .sidebar .nav .nav-item.active > .nav-link i {\n color: #b66dff; }\n .sidebar .nav .nav-item:hover {\n background: #fcfcfc; }\n .sidebar .nav .nav-item.nav-profile .nav-link {\n height: auto;\n line-height: 1;\n border-top: 0;\n padding: 1.25rem 0; }\n .sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-image {\n width: 44px;\n height: 44px; }\n .sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-image img {\n width: 44px;\n height: 44px;\n border-radius: 100%; }\n .sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-text {\n margin-left: 1rem; }\n .rtl .sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-text {\n margin-left: auto;\n margin-right: 1rem; }\n .sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-badge {\n font-size: 1.125rem;\n margin-left: auto; }\n .rtl .sidebar .nav .nav-item.nav-profile .nav-link .nav-profile-badge {\n margin-left: 0;\n margin-right: auto; }\n .sidebar .nav .nav-item.sidebar-actions {\n margin-top: 1rem; }\n .sidebar .nav .nav-item.sidebar-actions .nav-link {\n border-top: 0;\n display: block;\n height: auto; }\n .sidebar .nav .nav-item.sidebar-actions:hover {\n background: initial; }\n .sidebar .nav .nav-item.sidebar-actions:hover .nav-link {\n color: initial; }\n .sidebar .nav:not(.sub-menu) > .nav-item:hover:not(.nav-category):not(.nav-profile) > .nav-link {\n color: #29323d; }\n .sidebar .nav.sub-menu {\n margin-bottom: 20px;\n margin-top: 0;\n list-style: none; }\n .sidebar .nav.sub-menu .nav-item {\n padding: 0; }\n .sidebar .nav.sub-menu .nav-item .nav-link {\n color: #888;\n padding: 0.75rem 2rem 0.75rem 2rem;\n position: relative;\n font-size: 0.8125rem;\n line-height: 1;\n height: auto;\n border-top: 0; }\n .sidebar .nav.sub-menu .nav-item .nav-link:before {\n content: \"\\F054\";\n font-family: \"Material Design Icons\";\n display: block;\n position: absolute;\n left: 0px;\n top: 50%;\n -moz-transform: translateY(-50%);\n -o-transform: translateY(-50%);\n -ms-transform: translateY(-50%);\n -webkit-transform: translateY(-50%);\n transform: translateY(-50%);\n color: #a2a2a2;\n font-size: .75rem; }\n .rtl .sidebar .nav.sub-menu .nav-item .nav-link:before {\n left: auto;\n right: 0; }\n .sidebar .nav.sub-menu .nav-item .nav-link.active {\n color: #b66dff;\n background: transparent; }\n .sidebar .nav.sub-menu .nav-item .nav-link:hover {\n color: #555555; }\n .sidebar .nav.sub-menu .nav-item:hover {\n background: transparent; }\n\n/* style for off-canvas menu*/\n@media screen and (max-width: 991px) {\n .sidebar-offcanvas {\n position: fixed;\n max-height: calc(100vh - 70px);\n top: 70px;\n bottom: 0;\n overflow: auto;\n right: -260px;\n -webkit-transition: all 0.25s ease-out;\n -o-transition: all 0.25s ease-out;\n transition: all 0.25s ease-out; }\n .sidebar-offcanvas.active {\n right: 0; } }\n\n/* Layouts */\n.navbar.fixed-top + .page-body-wrapper {\n padding-top: 70px; }\n\n@media (min-width: 992px) {\n .sidebar-icon-only .navbar .navbar-brand-wrapper {\n width: 70px; }\n .sidebar-icon-only .navbar .navbar-brand-wrapper .brand-logo {\n display: none; }\n .sidebar-icon-only .navbar .navbar-brand-wrapper .brand-logo-mini {\n display: inline-block; }\n .sidebar-icon-only .navbar .navbar-menu-wrapper {\n width: calc(100% - 70px); }\n .sidebar-icon-only .sidebar {\n width: 70px; }\n .sidebar-icon-only .sidebar .nav {\n overflow: visible; }\n .sidebar-icon-only .sidebar .nav .nav-item {\n position: relative;\n padding: 0; }\n .sidebar-icon-only .sidebar .nav .nav-item .nav-link {\n display: block;\n text-align: center; }\n .sidebar-icon-only .sidebar .nav .nav-item .nav-link .menu-title,\n .sidebar-icon-only .sidebar .nav .nav-item .nav-link .badge, .sidebar-icon-only .sidebar .nav .nav-item .nav-link .menu-sub-title {\n display: none; }\n .sidebar-icon-only .sidebar .nav .nav-item .nav-link .menu-title {\n border-radius: 0 5px 5px 0px; }\n .rtl.sidebar-icon-only .sidebar .nav .nav-item .nav-link .menu-title {\n border-radius: 5px 0 0 5px; }\n .sidebar-icon-only .sidebar .nav .nav-item .nav-link i.menu-icon {\n margin-right: 0;\n margin-left: 0; }\n .sidebar-icon-only .sidebar .nav .nav-item .nav-link i.menu-arrow {\n display: none; }\n .sidebar-icon-only .sidebar .nav .nav-item .nav-link[aria-expanded] .menu-title {\n border-radius: 0 5px 0 0px; }\n .rtl.sidebar-icon-only .sidebar .nav .nav-item .nav-link[aria-expanded] .menu-title {\n border-radius: 5px 0 0 0; }\n .sidebar-icon-only .sidebar .nav .nav-item.nav-profile {\n display: none; }\n .sidebar-icon-only .sidebar .nav .nav-item.nav-category {\n display: none; }\n .sidebar-icon-only .sidebar .nav .nav-item.nav-doc {\n margin: 0; }\n .sidebar-icon-only .sidebar .nav .nav-item.nav-doc i {\n display: block; }\n .sidebar-icon-only .sidebar .nav .nav-item .collapse {\n display: none; }\n .sidebar-icon-only .sidebar .nav .nav-item.hover-open .nav-link .menu-title {\n display: -webkit-flex;\n display: flex;\n -webkit-align-items: center;\n align-items: center;\n background: #fcfcfc;\n padding: 0.5rem 1.4rem;\n left: 70px;\n position: absolute;\n text-align: left;\n top: 0;\n bottom: 0;\n width: 190px;\n z-index: 1;\n line-height: 1.8; }\n .rtl.sidebar-icon-only .sidebar .nav .nav-item.hover-open .nav-link .menu-title {\n left: auto;\n right: 70px;\n text-align: left; }\n .sidebar-icon-only .sidebar .nav .nav-item.hover-open .nav-link .menu-title:after {\n display: none; }\n .sidebar-icon-only .sidebar .nav .nav-item.hover-open .collapse,\n .sidebar-icon-only .sidebar .nav .nav-item.hover-open .collapsing {\n display: block;\n padding: .5rem 0;\n background: #fcfcfc;\n border-radius: 0 0 5px 0;\n position: absolute;\n left: 70px;\n width: 190px; }\n .rtl.sidebar-icon-only .sidebar .nav .nav-item.hover-open .collapse, .rtl.sidebar-icon-only .sidebar .nav .nav-item.hover-open .collapsing {\n left: auto;\n right: 70px;\n border-radius: 0 0 0 5px; }\n .sidebar-icon-only .sidebar .nav.sub-menu {\n padding: 0 0 0 1.5rem; }\n .sidebar-icon-only .sidebar .nav.sub-menu .nav-item .nav-link {\n text-align: left;\n padding-left: 20px; }\n .rtl.sidebar-icon-only .sidebar .nav.sub-menu .nav-item {\n margin-right: auto;\n margin-left: 0; }\n .rtl.sidebar-icon-only .sidebar .nav.sub-menu .nav-item .nav-link {\n text-align: right; }\n .rtl.sidebar-icon-only .sidebar .nav.sub-menu .nav-item .nav-link:before {\n left: 0;\n right: unset; }\n .sidebar-icon-only .sidebar .sidebar-actions {\n display: none; }\n .sidebar-icon-only .main-panel {\n width: calc(100% - 70px); } }\n\n.rtl {\n direction: rtl;\n text-align: right; }\n .rtl .sidebar .nav {\n padding-right: 0; }\n .rtl .product-chart-wrapper::-webkit-scrollbar,\n .rtl .sidebar-fixed .nav::-webkit-scrollbar,\n .rtl .table-responsive::-webkit-scrollbar,\n .rtl ul.chats::-webkit-scrollbar {\n width: 0.5em; }\n .rtl .product-chart-wrapper::-webkit-scrollbar-track,\n .rtl .sidebar-fixed .nav::-webkit-scrollbar-track,\n .rtl .table-responsive::-webkit-scrollbar-track,\n .rtl ul.chats::-webkit-scrollbar-track {\n -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); }\n .rtl .product-chart-wrapper::-webkit-scrollbar-thumb,\n .rtl .sidebar-fixed .nav::-webkit-scrollbar-thumb,\n .rtl .table-responsive::-webkit-scrollbar-thumb,\n .rtl ul.chats::-webkit-scrollbar-thumb {\n background-color: darkgrey;\n outline: 1px solid slategrey; }\n\n.page-body-wrapper {\n min-height: calc(100vh - 70px);\n display: -webkit-flex;\n display: flex;\n -webkit-flex-direction: row;\n flex-direction: row;\n padding-left: 0;\n padding-right: 0; }\n .page-body-wrapper.full-page-wrapper {\n width: 100%;\n min-height: 100vh; }\n\n.main-panel {\n transition: width 0.25s ease, margin 0.25s ease;\n width: calc(100% - 260px);\n min-height: calc(100vh - 70px);\n display: -webkit-flex;\n display: flex;\n -webkit-flex-direction: column;\n flex-direction: column; }\n @media (max-width: 991px) {\n .main-panel {\n margin-left: 0;\n width: 100%; } }\n\n.content-wrapper {\n background: #f2edf3;\n padding: 2.75rem 2.25rem;\n width: 100%;\n -webkit-flex-grow: 1;\n flex-grow: 1; }\n","@import \"shared\";\n\n// CSS Animations.\n\n// Apply an animation property and value with the correct browser support\n@mixin animation-support($property, $value) {\n @include experimental($property, $value, -moz, -webkit, -o, -ms, not -khtml, official); }\n\n// Name of any animation as a string.\n$default-animation-name : false !default;\n\n// Duration of the entire animation in seconds.\n$default-animation-duration : false !default;\n\n// Delay for start of animation in seconds.\n$default-animation-delay : false !default;\n\n// The timing function(s) to be used between keyframes. [ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier($number, $number, $number, $number)]\n$default-animation-timing-function : false !default;\n\n// The number of times an animation cycle is played. [infinite | $number]\n$default-animation-iteration-count : false !default;\n\n// Whether or not the animation should play in reverse on alternate cycles. [normal | alternate]\n$default-animation-direction : false !default;\n\n// What values are applied by the animation outside the time it is executing. [none | forwards | backwards | both]\n$default-animation-fill-mode : false !default;\n\n// Whether the animation is running or paused. [running | paused]\n$default-animation-play-state : false !default;\n\n// Create a named animation sequence that can be applied to elements later.\n//\n// $name - The name of your animation.\n// @content - The keyframes of the animation.\n@mixin keyframes(\n $name,\n $moz: $experimental-support-for-mozilla,\n $webkit: $experimental-support-for-webkit,\n $o: $experimental-support-for-opera,\n $ms: $experimental-support-for-microsoft,\n $khtml: $experimental-support-for-khtml,\n $official: true\n) {\n @if $moz {\n @include with-only-support-for($moz: true) {\n @-moz-keyframes #{$name} { @content; }\n }\n }\n @if $webkit {\n @include with-only-support-for($webkit: true) {\n @-webkit-keyframes #{$name} { @content; }\n }\n }\n @if $o {\n @include with-only-support-for($o: true) {\n @-o-keyframes #{$name} { @content; }\n }\n }\n @if $ms {\n @include with-only-support-for($ms: true) {\n @-ms-keyframes #{$name} { @content; }\n }\n }\n @if $khtml {\n @include with-only-support-for($khtml: true) {\n @-khtml-keyframes #{$name} { @content; }\n }\n }\n @if $official {\n @include with-only-support-for {\n @keyframes #{$name} { @content; }\n }\n }\n}\n\n// Apply 1-10 animation names.\n@mixin animation-name($name-1: $default-animation-name, $name-2: false, $name-3: false, $name-4: false, $name-5: false, $name-6: false, $name-7: false, $name-8: false, $name-9: false, $name-10: false) {\n $name: compact($name-1, $name-2, $name-3, $name-4, $name-5, $name-6, $name-7, $name-8, $name-9, $name-10);\n @include animation-support(animation-name, $name); }\n\n// Apply 1-10 animation durations.\n@mixin animation-duration($duration-1: $default-animation-duration, $duration-2: false, $duration-3: false, $duration-4: false, $duration-5: false, $duration-6: false, $duration-7: false, $duration-8: false, $duration-9: false, $duration-10: false) {\n $duration: compact($duration-1, $duration-2, $duration-3, $duration-4, $duration-5, $duration-6, $duration-7, $duration-8, $duration-9, $duration-10);\n @include animation-support(animation-duration, $duration); }\n\n// Apply 1-10 animation delays.\n@mixin animation-delay($delay-1: $default-animation-delay, $delay-2: false, $delay-3: false, $delay-4: false, $delay-5: false, $delay-6: false, $delay-7: false, $delay-8: false, $delay-9: false, $delay-10: false) {\n $delay: compact($delay-1, $delay-2, $delay-3, $delay-4, $delay-5, $delay-6, $delay-7, $delay-8, $delay-9, $delay-10);\n @include animation-support(animation-delay, $delay); }\n\n// Apply 1-10 animation timing functions.\n@mixin animation-timing-function($function-1: $default-animation-timing-function, $function-2: false, $function-3: false, $function-4: false, $function-5: false, $function-6: false, $function-7: false, $function-8: false, $function-9: false, $function-10: false) {\n $function: compact($function-1, $function-2, $function-3, $function-4, $function-5, $function-6, $function-7, $function-8, $function-9, $function-10);\n @include animation-support(animation-timing-function, $function); }\n\n// Apply 1-10 animation iteration counts.\n@mixin animation-iteration-count($count-1: $default-animation-iteration-count, $count-2: false, $count-3: false, $count-4: false, $count-5: false, $count-6: false, $count-7: false, $count-8: false, $count-9: false, $count-10: false) {\n $count: compact($count-1, $count-2, $count-3, $count-4, $count-5, $count-6, $count-7, $count-8, $count-9, $count-10);\n @include animation-support(animation-iteration-count, $count); }\n\n// Apply 1-10 animation directions.\n@mixin animation-direction($direction-1: $default-animation-direction, $direction-2: false, $direction-3: false, $direction-4: false, $direction-5: false, $direction-6: false, $direction-7: false, $direction-8: false, $direction-9: false, $direction-10: false) {\n $direction: compact($direction-1, $direction-2, $direction-3, $direction-4, $direction-5, $direction-6, $direction-7, $direction-8, $direction-9, $direction-10);\n @include animation-support(animation-direction, $direction); }\n\n// Apply 1-10 animation fill modes.\n@mixin animation-fill-mode($mode-1: $default-animation-fill-mode, $mode-2: false, $mode-3: false, $mode-4: false, $mode-5: false, $mode-6: false, $mode-7: false, $mode-8: false, $mode-9: false, $mode-10: false) {\n $mode: compact($mode-1, $mode-2, $mode-3, $mode-4, $mode-5, $mode-6, $mode-7, $mode-8, $mode-9, $mode-10);\n @include animation-support(animation-fill-mode, $mode); }\n\n// Apply 1-10 animation play states.\n@mixin animation-play-state($state-1: $default-animation-play-state, $state-2: false, $state-3: false, $state-4: false, $state-5: false, $state-6: false, $state-7: false, $state-8: false, $state-9: false, $state-10: false) {\n $state: compact($state-1, $state-2, $state-3, $state-4, $state-5, $state-6, $state-7, $state-8, $state-9, $state-10);\n @include animation-support(animation-play-state, $state); }\n\n// Shortcut to apply a named animation to an element, with all the settings.\n//\n// $animation-1 : Name and settings for the first animation. [ | default]\n// ...\n// $animation-10 : Name and settings for the tenth animation. \n@mixin animation($animation-1: default, $animation-2: false, $animation-3: false, $animation-4: false, $animation-5: false, $animation-6: false, $animation-7: false, $animation-8: false, $animation-9: false, $animation-10: false) {\n @if $animation-1 == default {\n $animation-1: -compass-space-list(compact($default-animation-name, $default-animation-duration, $default-animation-timing-function, $default-animation-delay, $default-animation-iteration-count, $default-animation-direction, $default-animation-fill-mode, $default-animation-play-state)); }\n $animation: compact($animation-1, $animation-2, $animation-3, $animation-4, $animation-5, $animation-6, $animation-7, $animation-8, $animation-9, $animation-10);\n @include animation-support(animation, $animation); }\n","// ---------------------------------------------------------------------------\n@include keyframes(flash) {\n 0% {\n opacity: 1; }\n 25% {\n opacity: 0; }\n 50% {\n opacity: 1; }\n 75% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounce) {\n 0% {\n @include translateY(0); }\n 20% {\n @include translateY(0); }\n 40% {\n @include translateY(-30px); }\n 50% {\n @include translateY(0); }\n 60% {\n @include translateY(-15px); }\n 80% {\n @include translateY(0); }\n 100% {\n @include translateY(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(shake) {\n 0% {\n @include translateX(0); }\n 10% {\n @include translateX(-10px); }\n 20% {\n @include translateX(10px); }\n 30% {\n @include translateX(-10px); }\n 40% {\n @include translateX(10px); }\n 50% {\n @include translateX(-10px); }\n 60% {\n @include translateX(10px); }\n 70% {\n @include translateX(-10px); }\n 80% {\n @include translateX(10px); }\n 90% {\n @include translateX(-10px); }\n 100% {\n @include translateX(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(tada) {\n 0% {\n @include scale(1); }\n 10% {\n @include transform(scale(0.9) rotate(-3deg)); }\n 20% {\n @include transform(scale(0.9) rotate(-3deg)); }\n 30% {\n @include transform(scale(1.1) rotate(3deg)); }\n 40% {\n @include transform(scale(1.1) rotate(-3deg)); }\n 50% {\n @include transform(scale(1.1) rotate(3deg)); }\n 60% {\n @include transform(scale(1.1) rotate(-3deg)); }\n 70% {\n @include transform(scale(1.1) rotate(3deg)); }\n 80% {\n @include transform(scale(1.1) rotate(-3deg)); }\n 90% {\n @include transform(scale(1.1) rotate(3deg)); }\n 100% {\n @include transform(scale(1) rotate(0)); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(swing) {\n 20%, 40%, 60%, 80%, 100% {\n @include transform-origin(top center); }\n 20% {\n @include rotate(15deg); }\n 40% {\n @include rotate(-10deg); }\n 60% {\n @include rotate(5deg); }\n 80% {\n @include rotate(-5deg); }\n 100% {\n @include rotate(0deg); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(wobble) {\n 0% {\n @include translateX(0%); }\n 15% {\n @include transform(translateX(-25%) rotate(-5deg)); }\n 30% {\n @include transform(translateX(20%) rotate(3deg)); }\n 45% {\n @include transform(translateX(-15%) rotate(-3deg)); }\n 60% {\n @include transform(translateX(10%) rotate(2deg)); }\n 75% {\n @include transform(translateX(-5%) rotate(-1deg)); }\n 100% {\n @include transform(translateX(0%)); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(pulse) {\n 0% {\n @include scale(1); }\n 50% {\n @include scale(1.1); }\n 100% {\n @include scale(1); } }\n \n \n// ---------------------------------------------------------------------------\n@include keyframes(wiggle) {\n 0% {\n @include skewX(9deg); }\n 10% {\n @include skewX(-8deg); }\n 20% {\n @include skewX(7deg); }\n 30% {\n @include skewX(-6deg); }\n 40% {\n @include skewX(5deg); }\n 50% {\n @include skewX(-4deg); }\n 60% {\n @include skewX(3deg); }\n 70% {\n @include skewX(-2deg); }\n 80% {\n @include skewX(1deg); }\n 90% {\n @include skewX(0deg); }\n 100% {\n @include skewX(0deg); } }","@import \"../support\";\n\n// This mixin provides basic support for CSS3 properties and\n// their corresponding experimental CSS2 properties when\n// the implementations are identical except for the property\n// prefix.\n@mixin experimental($property, $value,\n $moz : $experimental-support-for-mozilla,\n $webkit : $experimental-support-for-webkit,\n $o : $experimental-support-for-opera,\n $ms : $experimental-support-for-microsoft,\n $khtml : $experimental-support-for-khtml,\n $official : true\n) {\n @if $webkit and $experimental-support-for-webkit { -webkit-#{$property} : $value; }\n @if $khtml and $experimental-support-for-khtml { -khtml-#{$property} : $value; }\n @if $moz and $experimental-support-for-mozilla { -moz-#{$property} : $value; }\n @if $ms and $experimental-support-for-microsoft { -ms-#{$property} : $value; }\n @if $o and $experimental-support-for-opera { -o-#{$property} : $value; }\n @if $official { #{$property} : $value; }\n}\n\n// Same as experimental(), but for cases when the property is the same and the value is vendorized\n@mixin experimental-value($property, $value,\n $moz : $experimental-support-for-mozilla,\n $webkit : $experimental-support-for-webkit,\n $o : $experimental-support-for-opera,\n $ms : $experimental-support-for-microsoft,\n $khtml : $experimental-support-for-khtml,\n $official : true\n) {\n @if $webkit and $experimental-support-for-webkit { #{$property} : -webkit-#{$value}; }\n @if $khtml and $experimental-support-for-khtml { #{$property} : -khtml-#{$value}; }\n @if $moz and $experimental-support-for-mozilla { #{$property} : -moz-#{$value}; }\n @if $ms and $experimental-support-for-microsoft { #{$property} : -ms-#{$value}; }\n @if $o and $experimental-support-for-opera { #{$property} : -o-#{$value}; }\n @if $official { #{$property} : #{$value}; }\n}\n","@import \"shared\";\n\n// @doc off\n// Note ----------------------------------------------------------------------\n// Safari, Chrome, and Firefox all support 3D transforms. However,\n// only in the most recent builds. You should also provide fallback 2d support for\n// Opera and IE. IE10 is slated to have 3d enabled, but is currently unreleased.\n// To make that easy, all 2D transforms include an browser-targeting toggle ($only3d)\n// to switch between the two support lists. The toggle defaults to 'false' (2D),\n// and also accepts 'true' (3D). Currently the lists are as follows:\n// 2D: Mozilla, Webkit, Opera, Official\n// 3D: Webkit, Firefox.\n\n// Available Transforms ------------------------------------------------------\n// - Scale (2d and 3d)\n// - Rotate (2d and 3d)\n// - Translate (2d and 3d)\n// - Skew (2d only)\n\n// Transform Parameters ------------------------------------------------------\n// - Transform Origin (2d and 3d)\n// - Perspective (3d)\n// - Perspective Origin (3d)\n// - Transform Style (3d)\n// - Backface Visibility (3d)\n\n// Mixins --------------------------------------------------------------------\n// transform-origin\n// - shortcuts: transform-origin2d, transform-origin3d\n// - helpers: apply-origin\n// transform\n// - shortcuts: transform2d, transform3d\n// - helpers: simple-transform, create-transform\n// perspective\n// - helpers: perspective-origin\n// transform-style\n// backface-visibility\n// scale\n// - shortcuts: scaleX, scaleY, scaleZ, scale3d\n// rotate\n// - shortcuts: rotateX, rotateY, rotate3d\n// translate\n// - shortcuts: translateX, translateY, translateZ, translate3d\n// skew\n// - shortcuts: skewX, skewY\n\n// Defaults ------------------------------------------------------------------\n// @doc on\n\n// The default x-origin for transforms\n$default-origin-x : 50% !default;\n// The default y-origin for transforms\n$default-origin-y : 50% !default;\n// The default z-origin for transforms\n$default-origin-z : 50% !default;\n\n\n// The default x-multiplier for scaling\n$default-scale-x : 1.25 !default;\n// The default y-multiplier for scaling\n$default-scale-y : $default-scale-x !default;\n// The default z-multiplier for scaling\n$default-scale-z : $default-scale-x !default;\n\n\n// The default angle for rotations\n$default-rotate : 45deg !default;\n\n\n// The default x-vector for the axis of 3d rotations\n$default-vector-x : 1 !default;\n// The default y-vector for the axis of 3d rotations\n$default-vector-y : 1 !default;\n// The default z-vector for the axis of 3d rotations\n$default-vector-z : 1 !default;\n\n\n// The default x-length for translations\n$default-translate-x : 1em !default;\n// The default y-length for translations\n$default-translate-y : $default-translate-x !default;\n// The default z-length for translations\n$default-translate-z : $default-translate-x !default;\n\n\n// The default x-angle for skewing\n$default-skew-x : 5deg !default;\n// The default y-angle for skewing\n$default-skew-y : 5deg !default;\n\n\n// **Transform-origin**\n// Transform-origin sent as a complete string\n//\n// @include apply-origin( origin [, 3D-only ] )\n//\n// where 'origin' is a space separated list containing 1-3 (x/y/z) coordinates\n// in percentages, absolute (px, cm, in, em etc..) or relative\n// (left, top, right, bottom, center) units\n//\n// @param only3d Set this to true to only apply this\n// mixin where browsers have 3D support.\n@mixin apply-origin($origin, $only3d) {\n $only3d: $only3d or -compass-list-size(-compass-list($origin)) > 2;\n @if $only3d {\n @include experimental(transform-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n } @else {\n @include experimental(transform-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n }\n}\n\n// Transform-origin sent as individual arguments:\n//\n// @include transform-origin( [ origin-x, origin-y, origin-z, 3D-only ] )\n//\n// where the 3 'origin-' arguments represent x/y/z coordinates.\n//\n// **NOTE:** setting z coordinates triggers 3D support list, leave false for 2D support\n@mixin transform-origin(\n $origin-x: $default-origin-x,\n $origin-y: $default-origin-y,\n $origin-z: false,\n $only3d: if($origin-z, true, false)\n) {\n $origin: unquote('');\n @if $origin-x or $origin-y or $origin-z {\n @if $origin-x { $origin: $origin-x; } @else { $origin: 50%; }\n @if $origin-y { $origin: $origin $origin-y; } @else { @if $origin-z { $origin: $origin 50%; }}\n @if $origin-z { $origin: $origin $origin-z; }\n @include apply-origin($origin, $only3d);\n }\n}\n\n\n// Transform sent as a complete string:\n//\n// @include transform( transforms [, 3D-only ] )\n//\n// where 'transforms' is a space separated list of all the transforms to be applied.\n@mixin transform(\n $transform,\n $only3d: false\n) {\n @if $only3d {\n @include experimental(transform, $transform,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n } @else {\n @include experimental(transform, $transform,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n }\n}\n\n// Shortcut to target all browsers with 2D transform support\n@mixin transform2d($trans) {\n @include transform($trans, false);\n}\n\n// Shortcut to target only browsers with 3D transform support\n@mixin transform3d($trans) {\n @include transform($trans, true);\n}\n\n// @doc off\n// 3D Parameters -------------------------------------------------------------\n// @doc on\n\n// Set the perspective of 3D transforms on the children of an element:\n//\n// @include perspective( perspective )\n//\n// where 'perspective' is a unitless number representing the depth of the\n// z-axis. The higher the perspective, the more exaggerated the foreshortening.\n// values from 500 to 1000 are more-or-less \"normal\" - a good starting-point.\n@mixin perspective($p) {\n @include experimental(perspective, $p,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Set the origin position for the perspective\n//\n// @include perspective-origin(origin-x [origin-y])\n//\n// where the two arguments represent x/y coordinates\n@mixin perspective-origin($origin: 50%) {\n @include experimental(perspective-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Determine whether a 3D objects children also live in the given 3D space\n//\n// @include transform-style( [ style ] )\n//\n// where `style` can be either `flat` or `preserve-3d`.\n// Browsers default to `flat`, mixin defaults to `preserve-3d`.\n@mixin transform-style($style: preserve-3d) {\n @include experimental(transform-style, $style,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Determine the visibility of an element when it's back is turned\n//\n// @include backface-visibility( [ visibility ] )\n//\n// where `visibility` can be either `visible` or `hidden`.\n// Browsers default to visible, mixin defaults to hidden\n@mixin backface-visibility($visibility: hidden) {\n @include experimental(backface-visibility, $visibility,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// @doc off\n// Transform Partials --------------------------------------------------------\n// These work well on their own, but they don't add to each other, they override.\n// Use along with transform parameter mixins to adjust origin, perspective and style\n// ---------------------------------------------------------------------------\n\n\n// Scale ---------------------------------------------------------------------\n// @doc on\n\n// Scale an object along the x and y axis:\n//\n// @include scale( [ scale-x, scale-y, perspective, 3D-only ] )\n//\n// where the 'scale-' arguments are unitless multipliers of the x and y dimensions\n// and perspective, which works the same as the stand-alone perspective property/mixin\n// but applies to the individual element (multiplied with any parent perspective)\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scale(\n $scale-x: $default-scale-x,\n $scale-y: $scale-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: scale($scale-x, $scale-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the x axis\n// @include scaleX( [ scale-x, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleX(\n $scale: $default-scale-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: scaleX($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the y axis\n// @include scaleY( [ scale-y, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleY(\n $scale: $default-scale-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: scaleY($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the z axis\n// @include scaleZ( [ scale-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleZ(\n $scale: $default-scale-z,\n $perspective: false\n) {\n $trans: scaleZ($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Scale and object along all three axis\n// @include scale3d( [ scale-x, scale-y, scale-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scale3d(\n $scale-x: $default-scale-x,\n $scale-y: $default-scale-y,\n $scale-z: $default-scale-z,\n $perspective: false\n) {\n $trans: scale3d($scale-x, $scale-y, $scale-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Rotate --------------------------------------------------------------------\n// @doc on\n\n// Rotate an object around the z axis (2D)\n// @include rotate( [ rotation, perspective, 3D-only ] )\n// where 'rotation' is an angle set in degrees (deg) or radian (rad) units\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotate(\n $rotate: $default-rotate,\n $perspective: false,\n $only3d: false\n) {\n $trans: rotate($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// A longcut for 'rotate' in case you forget that 'z' is implied\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateZ(\n $rotate: $default-rotate,\n $perspective: false,\n $only3d: false\n) {\n @include rotate($rotate, $perspective, $only3d);\n}\n\n// Rotate an object around the x axis (3D)\n// @include rotateX( [ rotation, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateX(\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotateX($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Rotate an object around the y axis (3D)\n// @include rotate( [ rotation, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateY(\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotateY($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Rotate an object around an arbitrary axis (3D)\n// @include rotate( [ vector-x, vector-y, vector-z, rotation, perspective ] )\n// where the 'vector-' arguments accept unitless numbers.\n// These numbers are not important on their own, but in relation to one another\n// creating an axis from your transform-origin, along the axis of Xx = Yy = Zz.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotate3d(\n $vector-x: $default-vector-x,\n $vector-y: $default-vector-y,\n $vector-z: $default-vector-z,\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotate3d($vector-x, $vector-y, $vector-z, $rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Translate -----------------------------------------------------------------\n// @doc on\n\n// Move an object along the x or y axis (2D)\n// @include translate( [ translate-x, translate-y, perspective, 3D-only ] )\n// where the 'translate-' arguments accept any distance in percentages or absolute (px, cm, in, em etc..) units.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translate(\n $translate-x: $default-translate-x,\n $translate-y: $default-translate-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: translate($translate-x, $translate-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the x axis (2D)\n// @include translate( [ translate-x, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateX(\n $trans-x: $default-translate-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: translateX($trans-x);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the y axis (2D)\n// @include translate( [ translate-y, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateY(\n $trans-y: $default-translate-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: translateY($trans-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the z axis (3D)\n// @include translate( [ translate-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateZ(\n $trans-z: $default-translate-z,\n $perspective: false\n) {\n $trans: translateZ($trans-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Move an object along the x, y and z axis (3D)\n// @include translate( [ translate-x, translate-y, translate-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translate3d(\n $translate-x: $default-translate-x,\n $translate-y: $default-translate-y,\n $translate-z: $default-translate-z,\n $perspective: false\n) {\n $trans: translate3d($translate-x, $translate-y, $translate-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Skew ----------------------------------------------------------------------\n// @doc on\n\n// Skew an element:\n//\n// @include skew( [ skew-x, skew-y, 3D-only ] )\n//\n// where the 'skew-' arguments accept css angles in degrees (deg) or radian (rad) units.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skew(\n $skew-x: $default-skew-x,\n $skew-y: $default-skew-y,\n $only3d: false\n) {\n $trans: skew($skew-x, $skew-y);\n @include transform($trans, $only3d);\n}\n\n// Skew an element along the x axiz\n//\n// @include skew( [ skew-x, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skewX(\n $skew-x: $default-skew-x,\n $only3d: false\n) {\n $trans: skewX($skew-x);\n @include transform($trans, $only3d);\n}\n\n// Skew an element along the y axis\n//\n// @include skew( [ skew-y, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skewY(\n $skew-y: $default-skew-y,\n $only3d: false\n) {\n $trans: skewY($skew-y);\n @include transform($trans, $only3d);\n}\n\n\n// Full transform mixins\n// For settings any combination of transforms as arguments\n// These are complex and not highly recommended for daily use. They are mainly\n// here for backward-compatibility purposes.\n//\n// * they include origin adjustments\n// * scale takes a multiplier (unitless), rotate and skew take degrees (deg)\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin create-transform(\n $perspective: false,\n $scale-x: false,\n $scale-y: false,\n $scale-z: false,\n $rotate-x: false,\n $rotate-y: false,\n $rotate-z: false,\n $rotate3d: false,\n $trans-x: false,\n $trans-y: false,\n $trans-z: false,\n $skew-x: false,\n $skew-y: false,\n $origin-x: false,\n $origin-y: false,\n $origin-z: false,\n $only3d: false\n) {\n $trans: unquote(\"\");\n\n // perspective\n @if $perspective { $trans: perspective($perspective) ; }\n\n // scale\n @if $scale-x and $scale-y {\n @if $scale-z { $trans: $trans scale3d($scale-x, $scale-y, $scale-z); }\n @else { $trans: $trans scale($scale-x, $scale-y); }\n } @else {\n @if $scale-x { $trans: $trans scaleX($scale-x); }\n @if $scale-y { $trans: $trans scaleY($scale-y); }\n @if $scale-z { $trans: $trans scaleZ($scale-z); }\n }\n\n // rotate\n @if $rotate-x { $trans: $trans rotateX($rotate-x); }\n @if $rotate-y { $trans: $trans rotateY($rotate-y); }\n @if $rotate-z { $trans: $trans rotateZ($rotate-z); }\n @if $rotate3d { $trans: $trans rotate3d($rotate3d); }\n\n // translate\n @if $trans-x and $trans-y {\n @if $trans-z { $trans: $trans translate3d($trans-x, $trans-y, $trans-z); }\n @else { $trans: $trans translate($trans-x, $trans-y); }\n } @else {\n @if $trans-x { $trans: $trans translateX($trans-x); }\n @if $trans-y { $trans: $trans translateY($trans-y); }\n @if $trans-z { $trans: $trans translateZ($trans-z); }\n }\n\n // skew\n @if $skew-x and $skew-y { $trans: $trans skew($skew-x, $skew-y); }\n @else {\n @if $skew-x { $trans: $trans skewX($skew-x); }\n @if $skew-y { $trans: $trans skewY($skew-y); }\n }\n\n // apply it!\n @include transform($trans, $only3d);\n @include transform-origin($origin-x, $origin-y, $origin-z, $only3d);\n}\n\n\n// A simplified set of options\n// backwards-compatible with the previous version of the 'transform' mixin\n@mixin simple-transform(\n $scale: false,\n $rotate: false,\n $trans-x: false,\n $trans-y: false,\n $skew-x: false,\n $skew-y: false,\n $origin-x: false,\n $origin-y: false\n) {\n @include create-transform(\n false,\n $scale, $scale, false,\n false, false, $rotate, false,\n $trans-x, $trans-y, false,\n $skew-x, $skew-y,\n $origin-x, $origin-y, false,\n false\n );\n}\n","// ---------------------------------------------------------------------------\n@include keyframes(bounceOut) {\n 0% {\n @include scale(1); }\n 25% {\n @include scale(0.95); }\n 50% {\n opacity: 1;\n @include scale(1.1); }\n 100% {\n opacity: 0;\n @include scale(0.3); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceOutUp) {\n 0% {\n @include translateY(0); }\n 20% {\n opacity: 1;\n @include translateY(20px); }\n 100% {\n opacity: 0;\n @include translateY(-2000px); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceOutDown) {\n 0% {\n @include translateY(0); }\n 20% {\n opacity: 1;\n @include translateY(-20px); }\n 100% {\n opacity: 0;\n @include translateY(2000px); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceOutLeft) {\n 0% {\n @include translateX(0); }\n 20% {\n opacity: 1;\n @include translateX(20px); }\n 100% {\n opacity: 0;\n @include translateX(-2000px); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceOutRight) {\n 0% {\n @include translateX(0); }\n 20% {\n opacity: 1;\n @include translateX(-20px); }\n 100% {\n opacity: 0;\n @include translateX(2000px); } }\n","// ---------------------------------------------------------------------------\n@include keyframes(bounceIn) {\n 0% {\n opacity: 0;\n @include scale(0.3); }\n 50% {\n opacity: 1;\n @include scale(1.05); }\n 70% {\n @include scale(0.9); }\n 100% {\n @include scale(1); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceInDown) {\n 0% {\n opacity: 0;\n @include translateY(-2000px); }\n 60% {\n opacity: 1;\n @include translateY(30px); }\n 80% {\n @include translateY(-10px); }\n 100% {\n @include translateY(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceInUp) {\n 0% {\n opacity: 0;\n @include translateY(2000px); }\n 60% {\n opacity: 1;\n @include translateY(-30px); }\n 80% {\n @include translateY(10px); }\n 100% {\n @include translateY(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceInRight) {\n 0% {\n opacity: 0;\n @include translateX(2000px); }\n 60% {\n opacity: 1;\n @include translateX(-30px); }\n 80% {\n @include translateX(10px); }\n 100% {\n @include translateX(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceInLeft) {\n 0% {\n opacity: 0;\n @include translateX(-2000px); }\n 60% {\n opacity: 1;\n @include translateX(30px); }\n 80% {\n @include translateX(-10px); }\n 100% {\n @include translateX(0); } }\n","// ---------------------------------------------------------------------------\n@include keyframes(fadeOut) {\n 0% {\n opacity: 1; }\n 100% {\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutUp) {\n 0% {\n @include translateY(0);\n opacity: 1; }\n 100% {\n @include translateY(-20px);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutDown) {\n 0% {\n @include translateY(0);\n opacity: 1; }\n 100% {\n @include translateY(20px);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutRight) {\n 0% {\n @include translateX(0);\n opacity: 1; }\n 100% {\n @include translateX(20px);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutLeft) {\n 0% {\n @include translateX(0);\n opacity: 1; }\n 100% {\n @include translateX(-20px);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutUpBig) {\n 0% {\n @include translateY(0);\n opacity: 1; }\n 100% {\n @include translateY(-2000px);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutDownBig) {\n 0% {\n opacity: 1;\n @include translateY(0); }\n 100% {\n opacity: 0;\n @include translateY(2000px); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutRightBig) {\n 0% {\n opacity: 1;\n @include translateX(0); }\n 100% {\n opacity: 0;\n @include translateX(2000px); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutLeftBig) {\n 0% {\n opacity: 1;\n @include translateX(0); }\n 100% {\n opacity: 0;\n @include translateX(-2000px); } }\n","// ---------------------------------------------------------------------------\n@include keyframes(fadeIn) {\n 0% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInUp) {\n 0% {\n @include translateY(20px);\n opacity: 0; }\n 100% {\n @include translateY(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInDown) {\n 0% {\n @include translateY(-20px);\n opacity: 0; }\n 100% {\n @include translateY(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInRight) {\n 0% {\n @include translateX(20px);\n opacity: 0; }\n 100% {\n @include translateX(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInLeft) {\n 0% {\n @include translateX(-20px);\n opacity: 0; }\n 100% {\n @include translateX(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInUpBig) {\n 0% {\n @include translateY(2000px);\n opacity: 0; }\n 100% {\n @include translateY(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInDownBig) {\n 0% {\n opacity: 0;\n @include translateY(-2000px); }\n 100% {\n opacity: 1;\n @include translateY(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInRightBig) {\n 0% {\n opacity: 0;\n @include translateX(2000px); }\n 100% {\n opacity: 1;\n @include translateX(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInLeftBig) {\n 0% {\n opacity: 0;\n @include translateX(-2000px); }\n 100% {\n opacity: 1;\n @include translateX(0); } }\n","// ---------------------------------------------------------------------------\n@include keyframes(flip) {\n 0% {\n @include transform(perspective(400px) rotateY(0));\n @include animation-timing-function(ease-out);\n }\n 40% {\n @include transform(perspective(400px) translateZ(150px) rotateY(170deg));\n @include animation-timing-function(ease-out);\n }\n 50% {\n @include transform(perspective(400px) translateZ(150px) rotateY(190deg) scale(1));\n @include animation-timing-function(ease-in);\n }\n 80% {\n @include transform(perspective(400px) rotateY(360deg) scale(0.95));\n @include animation-timing-function(ease-in);\n }\n 100% {\n @include transform(perspective(400px) scale(1));\n @include animation-timing-function(ease-in);\n }\n}\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(flipInX) {\n 0% {\n @include transform(perspective(400px) rotateX(90deg));\n @include opacity(0);\n }\n 40% {\n @include transform(perspective(400px) rotateX(-10deg));\n }\n 70% {\n @include transform(perspective(400px) rotateX(10deg));\n }\n 100% {\n @include transform(perspective(400px) rotateX(0deg));\n @include opacity(1);\n }\n}\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(flipOutX) {\n 0% {\n @include transform(perspective(400px) rotateX(0deg));\n @include opacity(1);\n }\n 100% {\n @include transform(perspective(400px) rotateX(90deg));\n @include opacity(0);\n }\n}\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(flipInY) {\n 0% {\n @include transform(perspective(400px) rotateY(90deg));\n @include opacity(0);\n }\n 40% {\n @include transform(perspective(400px) rotateY(-10deg));\n }\n 70% {\n @include transform(perspective(400px) rotateY(10deg));\n }\n 100% {\n @include transform(perspective(400px) rotateY(0deg));\n @include opacity(1);\n }\n}\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(flipOutY) {\n 0% {\n @include transform(perspective(400px) rotateY(0deg));\n @include opacity(1);\n }\n 100% {\n @include transform(perspective(400px) rotateY(90deg));\n @include opacity(0);\n }\n}\n","@import \"shared\";\n\n// Provides cross-browser CSS opacity. Takes a number between 0 and 1 as the argument, e.g. 0.5 for 50% opacity.\n//\n// @param $opacity\n// A number between 0 and 1, where 0 is transparent and 1 is opaque.\n\n@mixin opacity($opacity) {\n @if $legacy-support-for-ie6 or $legacy-support-for-ie7 or $legacy-support-for-ie8 {\n filter: unquote(\"progid:DXImageTransform.Microsoft.Alpha(Opacity=#{round($opacity * 100)})\");\n }\n opacity: $opacity;\n}\n\n// Make an element completely transparent.\n@mixin transparent { @include opacity(0); }\n\n// Make an element completely opaque.\n@mixin opaque { @include opacity(1); }\n","// ---------------------------------------------------------------------------\n@include keyframes(lightSpeedIn) {\n 0% {\n @include transform(translateX(100%) skewX(-30deg));\n @include opacity(0); }\n 60% {\n @include transform(translateX(-20%) skewX(30deg));\n @include opacity(1); }\n 80% {\n @include transform(translateX(0%) skewX(-15deg));\n @include opacity(1); }\n 100% {\n @include transform(translateX(0%) skewX(0deg));\n @include opacity(1); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(lightSpeedOut) {\n 0% {\n @include transform(translateX(0%) skewX(0deg));\n @include opacity(1); }\n 100% {\n @include transform(translateX(100%) skewX(-30deg));\n @include opacity(0); } }","// ---------------------------------------------------------------------------\n@include keyframes(rotateOut) {\n 0% {\n @include transform-origin(center center);\n @include rotate(0);\n opacity: 1; }\n 100% {\n @include transform-origin(center center);\n @include rotate(200deg);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateOutDownLeft) {\n 0% {\n @include transform-origin(left bottom);\n @include rotate(0);\n opacity: 1; }\n 100% {\n @include transform-origin(left bottom);\n @include rotate(90deg);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateOutUpLeft) {\n 0% {\n @include transform-origin(left bottom);\n @include rotate(0);\n opacity: 1; }\n 100% {\n @include transform-origin(left bottom);\n @include rotate(-90deg);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateOutDownRight) {\n 0% {\n @include transform-origin(right bottom);\n @include rotate(0);\n opacity: 1; }\n 100% {\n @include transform-origin(right bottom);\n @include rotate(-90deg);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateOutUpRight) {\n 0% {\n @include transform-origin(right bottom);\n @include rotate(0);\n opacity: 1; }\n 100% {\n @include transform-origin(right bottom);\n @include rotate(90deg);\n opacity: 0; } }\n","// ---------------------------------------------------------------------------\n@include keyframes(rotateIn) {\n 0% {\n @include transform-origin(center center);\n @include rotate(-200deg);\n opacity: 0; }\n 100% {\n @include transform-origin(center center);\n @include rotate(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateInDownLeft) {\n 0% {\n @include transform-origin(left bottom);\n @include rotate(-90deg);\n opacity: 0; }\n 100% {\n @include transform-origin(left bottom);\n @include rotate(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateInUpLeft) {\n 0% {\n @include transform-origin(left bottom);\n @include rotate(90deg);\n opacity: 0; }\n 100% {\n @include transform-origin(left bottom);\n @include rotate(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateInUpRight) {\n 0% {\n @include transform-origin(right bottom);\n @include rotate(-90deg);\n opacity: 0; }\n 100% {\n @include transform-origin(right bottom);\n @include rotate(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateInDownRight) {\n 0% {\n @include transform-origin(right bottom);\n @include rotate(90deg);\n opacity: 0; }\n 100% {\n @include transform-origin(right bottom);\n @include rotate(0);\n opacity: 1; } }\n","// ---------------------------------------------------------------------------\n@include keyframes(hinge) {\n 0% {\n @include rotate(0);\n @include transform-origin(top left);\n @include animation-timing-function(ease-in-out); }\n 20%, 60% {\n @include rotate(80deg);\n @include transform-origin(top left);\n @include animation-timing-function(ease-in-out); }\n 40% {\n @include rotate(60deg);\n @include transform-origin(top left);\n @include animation-timing-function(ease-in-out); }\n 80% {\n @include transform(rotate(60deg) translateY(0));\n @include opacity(1);\n @include transform-origin(top left);\n @include animation-timing-function(ease-in-out); }\n 100% {\n @include translateY(700px);\n @include opacity(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rollIn) {\n 0% {\n @include opacity(0);\n @include transform(translateX(-100%) rotate(-120deg)); }\n 100% {\n @include opacity(1);\n @include transform(translateX(0px) rotate(0deg)); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rollOut) {\n 0% {\n @include opacity(1);\n @include transform(translateX(0px) rotate(0deg)); }\n 100% {\n @include opacity(0);\n @include transform(translateX(-100%) rotate(-120deg)); } }\n","/*!\n * Bootstrap v5.1.3 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$variable-prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` + +

+ + + + + + + + + + + + @foreach ($categories as $item) + + + + + + + + + + + @endforeach + + +
NoNamaFotoDeskripsiAksi
{{ $loop->iteration }}{{ $item->name }}gambar + {{ $item->description }} +
+ + Edit + +
+ @method('DELETE') + @csrf + + +
+
+
+
+@endsection +{{-- modal add new blog --}} + +@push('script') + +@endpush diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/dashboard/index.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/dashboard/index.blade.php new file mode 100644 index 0000000..de10cab --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/dashboard/index.blade.php @@ -0,0 +1,115 @@ +@extends('layouts.main') +@section('content') +
+
+
+
+
+
Jumlah customer
+

{{ $jumlahUserAktif }}

+
+
+
+
+
+
+
Transaksi hari ini
+

{{ $totalTransaksi }}

+
+
+
+
+
+
+
Pendapatan Harian
+

Rp {{ number_format($totalPendapatanHarian) }}

+
+
+
+
+ {{--
+
+
+
+
Transaksi hari ini
+

123

+
+
+
+
+
+
+
Jumlah Barang Terjual
+

10

+
+
+
+
+
+
+
Jumlah
+

Rp 300.000

+
+
+
+
--}} +
+ +
+
+ +
+
+@endsection + +@section('footer') + + +@endsection diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/order/index.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/order/index.blade.php new file mode 100644 index 0000000..d72b480 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/order/index.blade.php @@ -0,0 +1,207 @@ +@extends('layouts.main') +@section('content') + {{--
+ +
--}} +
+ + + + + + + + + + + + + @foreach ($orders as $item) + + + + + + + + + + + @endforeach + + +
NoTransaction DateTotalStatusShipping NameAksi
{{ $loop->iteration }}{{ $item->created_at }}Rp. {{ number_format($item->total_cost) }}{{ $item->status }}{{ $item->shipping_service }} +
+ + Edit + +
+ @method('DELETE') + @csrf + + +
+
+
+
+@endsection +{{-- modal add new Order --}} + +@push('script') + +@endpush diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/product/index.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/product/index.blade.php new file mode 100644 index 0000000..7c2f39f --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/product/index.blade.php @@ -0,0 +1,255 @@ +@extends('layouts.main') +@section('content') +
+ +
+
+ + + + + + + + + + + + + + + @foreach ($products as $item) + + + + + + + + + + + + + @endforeach + + +
NoNamaHargaStokKategoriFotoTersediaAksi
{{ $loop->iteration }}{{ $item->name }}Rp. {{ number_format($item->price) }}{{ $item->stock }}{{ $item->category->name }}gambar + + @if ($item->is_available == 1) + Ada + @else + Habis + @endif + +
+ + Edit + +
+ @method('DELETE') + @csrf + + +
+
+
+
+@endsection +{{-- modal add new product --}} + +@push('script') + +@endpush diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/promo/index.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/promo/index.blade.php new file mode 100644 index 0000000..7c98d61 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/promo/index.blade.php @@ -0,0 +1,155 @@ +@extends('layouts.main') +@section('content') +
+ +
+
+ + + + + + + + + + + @foreach ($promos as $item) + + + + + + + + + + @endforeach + + +
NoJudulDeskripsiAksi
{{ $loop->iteration }}{{ $item->judul }}{{ $item->deskripsi }} +
+ + Edit + +
+ @method('DELETE') + @csrf + + +
+
+
+
+@endsection +{{-- modal add new blog --}} + +@push('script') + +@endpush diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/report/cekLaporan.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/report/cekLaporan.blade.php new file mode 100644 index 0000000..c90b923 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/report/cekLaporan.blade.php @@ -0,0 +1,80 @@ +@extends('layouts.main') +@section('content') +
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ Proses +
+
+ + + + + + + + + + + + + + +{{-- + @dd($data) --}} + @foreach ($data as $m) + + + + + + + + + + + @endforeach + + + @if ($jumlah != null) + + + + + @endif + +
NoTgl PenjualanKasirProdukJumlahHargaDiskonStatus
{{ $loop->iteration }}{{ $m->tanggal }}{{ $m->kasir }}{{ $m->pesanan }}{{ $m->jumlah }}Rp {{ number_format($m->harga_satuan) }}{{ $m->diskon }} %{{ $m->status }}
Total Pendapatan :Rp {{ number_format($sumTotal) }}
+ Cetak + Laporan +
+@endsection + +@push('script') + +@endpush diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/report/cetak.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/report/cetak.blade.php new file mode 100644 index 0000000..52428dd --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/report/cetak.blade.php @@ -0,0 +1,90 @@ + + + + + + + + DiKantin | Cetak Laporan + + + + + + +
+
LAPORAN PENDAPATAN TOKO
+

"NUSA DUA AGRO"

+
JL KOPTU BERLIAN NO 115
+
+
+

Dari Tanggal

+

: {{ $tglMulai }}

+
+
+

Sampai Tanggal

+

: {{ $tglSelesai }}

+
+
+ + + + + + + + + + + + + + + @foreach ($data as $m) + + + + + + + + + + + @endforeach + + + @if ($jumlah != null) + + + + + @endif + +
+ NoTgl PenjualanKasirProdukJumlahHargaDiskonStatus +
{{ $loop->iteration }}{{ $m->tanggal }}{{ $m->kasir }}{{ $m->pesanan }}{{ $m->jumlah }}Rp {{ number_format($m->harga_satuan) }}{{ $m->diskon }}{{ $m->status }}
Total Pendapatan : + Rp {{ number_format($sumTotal) }}
+
+
+ + + + diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/report/index.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/report/index.blade.php new file mode 100644 index 0000000..17e7a88 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/report/index.blade.php @@ -0,0 +1,78 @@ +@extends('layouts.main') +@section('content') +
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ Proses +
+
+ + + + + + + + + + + + + + + + + + + {{-- @if ($sumTotal == 0) + + + + @endif --}} + {{-- @if ($jumlah != null) --}} + + {{-- --}} + {{-- + {{-- @endif --}} + + +
NoTgl PenjualanKasirProdukJumlahHargaDiskonStatus
+
Data tidak Ditemukan ! +
+
Total Pendapatan :{{ $sumTotal }} --}} +
+ Cetak + Laporan +
+@endsection + +@push('script') + +@endpush diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/user/index.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/user/index.blade.php new file mode 100644 index 0000000..0cb7bc0 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/admin/user/index.blade.php @@ -0,0 +1,214 @@ +@extends('layouts.main') +@section('content') +
+ +
+
+ + + + + + + + + + + + + + @foreach ($users as $item) + + + + + + + + + + + + + @endforeach + + +
NoNamaEmailPhoneRolesFotoAksi
{{ $loop->iteration }}{{ $item->name }}{{ $item->email }}{{ $item->phone }}{{ $item->roles }}gambar + +
+ + Edit + +
+ @method('DELETE') + @csrf + + +
+
+
+
+@endsection +{{-- modal add new blog --}} + +@push('script') + +@endpush diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/login.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/login.blade.php new file mode 100644 index 0000000..437f7bb --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/login.blade.php @@ -0,0 +1,46 @@ +@extends('layouts.app') + +@section('content') +
+ +
+ +
+ +

+ +
+ + +
+
+
+

LOGIN

+

Masukkan email dan password

+
+
+ @csrf +
+ +
+
+ +
+
+ +
+
+ {{--

belum punya akun ? silahkan + register

--}} +
+
+
+
+@endsection diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/passwords/confirm.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/passwords/confirm.blade.php new file mode 100644 index 0000000..f8c8e61 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/passwords/confirm.blade.php @@ -0,0 +1,49 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Confirm Password') }}
+ +
+ {{ __('Please confirm your password before continuing.') }} + +
+ @csrf + +
+ + +
+ + + @error('password') + + {{ $message }} + + @enderror +
+
+ +
+
+ + + @if (Route::has('password.request')) + + {{ __('Forgot Your Password?') }} + + @endif +
+
+
+
+
+
+
+
+@endsection diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/passwords/email.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/passwords/email.blade.php new file mode 100644 index 0000000..d1ac783 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/passwords/email.blade.php @@ -0,0 +1,47 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Reset Password') }}
+ +
+ @if (session('status')) + + @endif + +
+ @csrf + +
+ + +
+ + + @error('email') + + {{ $message }} + + @enderror +
+
+ +
+
+ +
+
+
+
+
+
+
+
+@endsection diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/passwords/reset.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/passwords/reset.blade.php new file mode 100644 index 0000000..dccf6c6 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/passwords/reset.blade.php @@ -0,0 +1,65 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Reset Password') }}
+ +
+
+ @csrf + + + +
+ + +
+ + + @error('email') + + {{ $message }} + + @enderror +
+
+ +
+ + +
+ + + @error('password') + + {{ $message }} + + @enderror +
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+@endsection diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/register.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/register.blade.php new file mode 100644 index 0000000..e13e178 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/register.blade.php @@ -0,0 +1,57 @@ +@extends('layouts.app') + +@section('content') +
+ +
+ +
+ +

Let's + Support

+ Dukung Program Dakwah Syiar Quran + Project +
+ + +
+
+
+

Hello,Again

+

We are happy to have you back.

+
+
+ @csrf + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+

punya akun ? silahkan + Login

+
+
+
+
+@endsection diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/verify.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/verify.blade.php new file mode 100644 index 0000000..9f8c1bc --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/auth/verify.blade.php @@ -0,0 +1,28 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Verify Your Email Address') }}
+ +
+ @if (session('resent')) + + @endif + + {{ __('Before proceeding, please check your email for a verification link.') }} + {{ __('If you did not receive the email') }}, +
+ @csrf + . +
+
+
+
+
+
+@endsection diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/home.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/home.blade.php new file mode 100644 index 0000000..1f34466 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/home.blade.php @@ -0,0 +1,23 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Dashboard') }}
+ +
+ @if (session('status')) + + @endif + + {{ __('You are logged in!') }} +
+
+
+
+
+@endsection diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/layouts/app.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/layouts/app.blade.php new file mode 100644 index 0000000..6ea0482 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/layouts/app.blade.php @@ -0,0 +1,87 @@ + + + + + + + + + + + + Nusa Dua Agro + + + + + + + @vite(['resources/sass/app.scss', 'resources/js/app.js']) + + + +
+ {{-- --}} + +
+ @yield('content') +
+
+ + + diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/layouts/main.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/layouts/main.blade.php new file mode 100644 index 0000000..bf8e6f9 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/layouts/main.blade.php @@ -0,0 +1,149 @@ + + + + + + + + + POS - Ecommerce + + + + + + + + + + + + + {{-- + --}} + + + + + + + + +
+ + + +
+ + @include('partials.sidebar') + +
+
+ @yield('content') +
+ + @include('partials.footer') + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + @stack('script'); + @yield('footer') + + + + diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/partials/footer.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/partials/footer.blade.php new file mode 100644 index 0000000..5470102 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/partials/footer.blade.php @@ -0,0 +1,11 @@ +{{--
+ +

Copyright © + UKM Labbaik 2023

+

Politeknik Negeri Jember

--}} +{{-- Copyright © + UKM Labbaik 2023 + Politeknik + Negeri Jember --}} + +{{--
--}} diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/partials/header.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/partials/header.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/partials/sidebar.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/partials/sidebar.blade.php new file mode 100644 index 0000000..2168239 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/partials/sidebar.blade.php @@ -0,0 +1,74 @@ + diff --git a/BackEnd/laravel-pos-ecommerce-backend/resources/views/welcome.blade.php b/BackEnd/laravel-pos-ecommerce-backend/resources/views/welcome.blade.php new file mode 100644 index 0000000..3353350 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/resources/views/welcome.blade.php @@ -0,0 +1,133 @@ + + + + + + + Laravel + + + + + + + + + + + + diff --git a/BackEnd/laravel-pos-ecommerce-backend/routes/api.php b/BackEnd/laravel-pos-ecommerce-backend/routes/api.php new file mode 100644 index 0000000..017dac5 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/routes/api.php @@ -0,0 +1,89 @@ +get('/user', function (Request $request) { + return $request->user(); +}); + +Route::post('/register', [AuthController::class, 'register']); +Route::post('/login', [AuthController::class, 'login']); +Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth:sanctum'); +// category +Route::get('/categories', [CategoryController::class, 'index']); + +// product +Route::get('/products/{id}', [ProductApiController::class, 'show']); +Route::put('/products/{id}', [ProductApiController::class, 'updateProduct']); +Route::delete('/products/{id}', [ProductApiController::class, 'destroyProduct']); + +Route::apiResource('addresses', AddressController::class)->middleware('auth:sanctum'); +Route::apiResource('products', ProductApiController::class)->middleware('auth:sanctum'); + +Route::post('/order', [OrderApiController::class, 'orderApi'])->middleware('auth:sanctum'); +Route::post('/orderApiPos', [OrderApiController::class, 'orderApiPos'])->middleware('auth:sanctum'); + +Route::get('/promo', [PromoApiController::class, 'index']); +Route::post('/promo', [PromoApiController::class, 'store']); + +// callback +Route::post('/callback', [CallbackController::class, 'callback']); + +// profilej +Route::get('/profile', [ProfileController::class, 'getProfile'])->middleware('auth:sanctum'); +Route::put('/profile', [ProfileController::class, 'updateProfile'])->middleware('auth:sanctum'); +// Route::put('/profile', [ProfileController::class, 'update'])->middleware('auth:sanctum'); + +// check sttaus order by id order +Route::get('/order/status/{id}', [OrderApiController::class, 'checkStatusOrder'])->middleware('auth:sanctum'); + +Route::get('/orders', [OrderApiController::class, 'getOrderByUser'])->middleware('auth:sanctum'); +//get order by id +Route::get('/order/{id}', [OrderApiController::class, 'getOrderById'])->middleware('auth:sanctum'); +Route::get('/transaction-count', [OrderApiController::class, 'getTransactionCount'])->middleware('auth:sanctum'); + +//discounts api +Route::get('/api-discounts', [DiscountController::class, 'index'])->middleware('auth:sanctum'); +Route::post('/api-discounts', [DiscountController::class, 'store'])->middleware('auth:sanctum'); +Route::put('/api-discounts/{id}', [DiscountController::class, 'update'])->middleware('auth:sanctum'); +Route::delete('/api-discounts/{id}', [DiscountController::class, 'destroy'])->middleware('auth:sanctum'); + +Route::middleware('auth:sanctum')->post('send-message', [MessageController::class, 'sendMessage']); +Route::middleware('auth:sanctum')->get('messages/{channel_id}', [MessageController::class, 'getMessages']); + +Route::middleware('auth:sanctum')->post('channels', [ChannelController::class, 'create']); +Route::middleware('auth:sanctum')->get('channels', [ChannelController::class, 'index']); + +Route::middleware('auth:sanctum')->group(function () { + Route::apiResource('chat', ChatController::class)->only(['index', 'store', 'show']); + Route::apiResource('chat_message', ChatMessageController::class)->only(['index', 'store']); + Route::apiResource('userApi', UserApiController::class)->only(['index']); +}); + +Route::post('/update-fcm', [AuthController::class, 'updateFcmId'])->middleware('auth:sanctum'); diff --git a/BackEnd/laravel-pos-ecommerce-backend/routes/channels.php b/BackEnd/laravel-pos-ecommerce-backend/routes/channels.php new file mode 100644 index 0000000..5d451e1 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/routes/channels.php @@ -0,0 +1,18 @@ +id === (int) $id; +}); diff --git a/BackEnd/laravel-pos-ecommerce-backend/routes/console.php b/BackEnd/laravel-pos-ecommerce-backend/routes/console.php new file mode 100644 index 0000000..e05f4c9 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/routes/console.php @@ -0,0 +1,19 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/BackEnd/laravel-pos-ecommerce-backend/routes/web.php b/BackEnd/laravel-pos-ecommerce-backend/routes/web.php new file mode 100644 index 0000000..420d434 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/routes/web.php @@ -0,0 +1,63 @@ +group(function () { + // dashborad + Route::get('/', [DashboardController::class, 'index']); + + // user + Route::get('/user', [UserController::class, 'index']); + Route::post('/saveUser', [UserController::class, 'store']); + Route::put('/user/{id}', [UserController::class, 'update']); + Route::delete('/user/{id}', [UserController::class, 'destroy']); + + // product + Route::get('/product', [ProductController::class, 'index']); + Route::post('/saveProduct', [ProductController::class, 'store']); + Route::put('/product/{id}', [ProductController::class, 'update']); + Route::delete('/product/{id}', [ProductController::class, 'destroy']); + + // category + Route::get('/category', [CategoryController::class, 'index']); + Route::post('/saveCategory', [CategoryController::class, 'store']); + Route::put('/category/{id}', [CategoryController::class, 'update']); + Route::delete('/category/{id}', [CategoryController::class, 'destroy']); + + // order + Route::get('/order', [OrderController::class, 'index']); + Route::post('/saveOrder', [OrderController::class, 'store']); + Route::put('/order/{id}', [OrderController::class, 'update']); + Route::delete('/order/{id}', [OrderController::class, 'destroy']); + + // report + Route::get('/report', [ReportController::class, 'index']); + Route::get('/ceklaporan/{tglMulai}/{tglSelesai}/{status}', [ReportController::class, 'cekLaporan']); + Route::get('/laporan/cetak/{tglMulai}/{tglSelesai}/{status}', [ReportController::class, 'cetak']); +}); +Auth::routes(); + +Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); diff --git a/BackEnd/laravel-pos-ecommerce-backend/storage/app/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/storage/app/.gitignore new file mode 100644 index 0000000..8f4803c --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/storage/app/.gitignore @@ -0,0 +1,3 @@ +* +!public/ +!.gitignore diff --git a/BackEnd/laravel-pos-ecommerce-backend/storage/app/public/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/storage/app/public/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/BackEnd/laravel-pos-ecommerce-backend/storage/framework/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/.gitignore new file mode 100644 index 0000000..05c4471 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/.gitignore @@ -0,0 +1,9 @@ +compiled.php +config.php +down +events.scanned.php +maintenance.php +routes.php +routes.scanned.php +schedule-* +services.json diff --git a/BackEnd/laravel-pos-ecommerce-backend/storage/framework/cache/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/cache/.gitignore new file mode 100644 index 0000000..01e4a6c --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/BackEnd/laravel-pos-ecommerce-backend/storage/framework/cache/data/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/cache/data/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/BackEnd/laravel-pos-ecommerce-backend/storage/framework/sessions/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/sessions/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/BackEnd/laravel-pos-ecommerce-backend/storage/framework/testing/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/testing/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/BackEnd/laravel-pos-ecommerce-backend/storage/framework/views/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/views/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/BackEnd/laravel-pos-ecommerce-backend/storage/logs/.gitignore b/BackEnd/laravel-pos-ecommerce-backend/storage/logs/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/BackEnd/laravel-pos-ecommerce-backend/tests/CreatesApplication.php b/BackEnd/laravel-pos-ecommerce-backend/tests/CreatesApplication.php new file mode 100644 index 0000000..cc68301 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/tests/CreatesApplication.php @@ -0,0 +1,21 @@ +make(Kernel::class)->bootstrap(); + + return $app; + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/tests/Feature/ExampleTest.php b/BackEnd/laravel-pos-ecommerce-backend/tests/Feature/ExampleTest.php new file mode 100644 index 0000000..8364a84 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/tests/Feature/ExampleTest.php @@ -0,0 +1,19 @@ +get('/'); + + $response->assertStatus(200); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/tests/TestCase.php b/BackEnd/laravel-pos-ecommerce-backend/tests/TestCase.php new file mode 100644 index 0000000..2932d4a --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/tests/TestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } +} diff --git a/BackEnd/laravel-pos-ecommerce-backend/vite.config.js b/BackEnd/laravel-pos-ecommerce-backend/vite.config.js new file mode 100644 index 0000000..dbbf333 --- /dev/null +++ b/BackEnd/laravel-pos-ecommerce-backend/vite.config.js @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + plugins: [ + laravel({ + input: [ + 'resources/sass/app.scss', + 'resources/js/app.js', + ], + refresh: true, + }), + ], +}); diff --git a/FrontEnd/flutter_pos_ecommerce/.gitignore b/FrontEnd/flutter_pos_ecommerce/.gitignore new file mode 100644 index 0000000..29a3a50 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/FrontEnd/flutter_pos_ecommerce/.metadata b/FrontEnd/flutter_pos_ecommerce/.metadata new file mode 100644 index 0000000..5e4a304 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "b0366e0a3f089e15fd89c97604ab402fe26b724c" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + base_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + - platform: android + create_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + base_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + - platform: ios + create_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + base_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + - platform: linux + create_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + base_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + - platform: macos + create_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + base_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + - platform: web + create_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + base_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + - platform: windows + create_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + base_revision: b0366e0a3f089e15fd89c97604ab402fe26b724c + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/FrontEnd/flutter_pos_ecommerce/.vscode/launch.json b/FrontEnd/flutter_pos_ecommerce/.vscode/launch.json new file mode 100644 index 0000000..eba3399 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "flutter_pos_ecommerce", + "request": "launch", + "type": "dart" + }, + { + "name": "flutter_pos_ecommerce (profile mode)", + "request": "launch", + "type": "dart", + "flutterMode": "profile" + }, + { + "name": "flutter_pos_ecommerce (release mode)", + "request": "launch", + "type": "dart", + "flutterMode": "release" + } + ] +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/README.md b/FrontEnd/flutter_pos_ecommerce/README.md new file mode 100644 index 0000000..d3a8c80 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/README.md @@ -0,0 +1,16 @@ +# flutter_pos_ecommerce + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/FrontEnd/flutter_pos_ecommerce/analysis_options.yaml b/FrontEnd/flutter_pos_ecommerce/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/FrontEnd/flutter_pos_ecommerce/android/.gitignore b/FrontEnd/flutter_pos_ecommerce/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/build.gradle b/FrontEnd/flutter_pos_ecommerce/android/app/build.gradle new file mode 100644 index 0000000..46649e4 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/app/build.gradle @@ -0,0 +1,73 @@ +plugins { + id "com.android.application" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + // END: FlutterFire Configuration + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +android { + namespace "com.example.flutter_pos_ecommerce" + compileSdkVersion 33 + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.flutter_pos_ecommerce" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + multiDexEnabled true + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + +} diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/google-services.json b/FrontEnd/flutter_pos_ecommerce/android/app/google-services.json new file mode 100644 index 0000000..29d7343 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "262926188813", + "project_id": "chat-app-20117", + "storage_bucket": "chat-app-20117.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:262926188813:android:840cd3bd354a95190ab044", + "android_client_info": { + "package_name": "com.example.flutter_pos_ecommerce" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAbCNqoxcUko5hGM0Ss9AyN86n-W46yU80" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/debug/AndroidManifest.xml b/FrontEnd/flutter_pos_ecommerce/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/AndroidManifest.xml b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ddbebe0 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java new file mode 100644 index 0000000..752fc18 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java @@ -0,0 +1,25 @@ +// Generated file. +// +// If you wish to remove Flutter's multidex support, delete this entire file. +// +// Modifications to this file should be done in a copy under a different name +// as this file may be regenerated. + +package io.flutter.app; + +import android.app.Application; +import android.content.Context; +import androidx.annotation.CallSuper; +import androidx.multidex.MultiDex; + +/** + * Extension of {@link android.app.Application}, adding multidex support. + */ +public class FlutterMultiDexApplication extends Application { + @Override + @CallSuper + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + MultiDex.install(this); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/kotlin/com/example/flutter_pos_ecommerce/MainActivity.kt b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/kotlin/com/example/flutter_pos_ecommerce/MainActivity.kt new file mode 100644 index 0000000..6695705 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/kotlin/com/example/flutter_pos_ecommerce/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.flutter_pos_ecommerce + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/drawable-v21/launch_background.xml b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/drawable/ic_seller.png b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/drawable/ic_seller.png new file mode 100644 index 0000000..0174024 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/drawable/ic_seller.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/drawable/launch_background.xml b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/values-night/styles.xml b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/values/styles.xml b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/android/app/src/profile/AndroidManifest.xml b/FrontEnd/flutter_pos_ecommerce/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/android/build.gradle b/FrontEnd/flutter_pos_ecommerce/android/build.gradle new file mode 100644 index 0000000..e83fb5d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/build.gradle @@ -0,0 +1,30 @@ +buildscript { + ext.kotlin_version = '1.7.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/FrontEnd/flutter_pos_ecommerce/android/gradle.properties b/FrontEnd/flutter_pos_ecommerce/android/gradle.properties new file mode 100644 index 0000000..598d13f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G +android.useAndroidX=true +android.enableJetifier=true diff --git a/FrontEnd/flutter_pos_ecommerce/android/gradle/wrapper/gradle-wrapper.properties b/FrontEnd/flutter_pos_ecommerce/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..3c472b9 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/FrontEnd/flutter_pos_ecommerce/android/settings.gradle b/FrontEnd/flutter_pos_ecommerce/android/settings.gradle new file mode 100644 index 0000000..495528e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/android/settings.gradle @@ -0,0 +1,32 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + + plugins { + id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false + // START: FlutterFire Configuration + id "com.google.gms.google-services" version "4.3.15" apply false + // END: FlutterFire Configuration +} + +include ":app" diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/all_categories.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/all_categories.svg new file mode 100644 index 0000000..a7860d5 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/all_categories.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/bag.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/bag.svg new file mode 100644 index 0000000..0fc7019 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/bag.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/calendar.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/calendar.svg new file mode 100644 index 0000000..4e4ffd3 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/calendar.svg @@ -0,0 +1,3 @@ + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/cart.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/cart.svg new file mode 100644 index 0000000..09a7c72 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/cart.svg @@ -0,0 +1,3 @@ + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/cash.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/cash.svg new file mode 100644 index 0000000..b18590c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/cash.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/clock.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/clock.svg new file mode 100644 index 0000000..27b4ccf --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/clock.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/copy.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/copy.svg new file mode 100644 index 0000000..ec87e03 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/copy.svg @@ -0,0 +1,3 @@ + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/creditcard.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/creditcard.svg new file mode 100644 index 0000000..b5dfbcc --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/creditcard.svg @@ -0,0 +1,4 @@ + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/dashboard.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/dashboard.svg new file mode 100644 index 0000000..f979c61 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/dashboard.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/debit.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/debit.svg new file mode 100644 index 0000000..21aee2d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/debit.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/delete.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/delete.svg new file mode 100644 index 0000000..efcf6fe --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/delete.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/done.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/done.svg new file mode 100644 index 0000000..8495552 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/done.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/drink.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/drink.svg new file mode 100644 index 0000000..93b7b7c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/drink.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/edit.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/edit.svg new file mode 100644 index 0000000..d86f40c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/edit.svg @@ -0,0 +1,3 @@ + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/email.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/email.svg new file mode 100644 index 0000000..d61bc23 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/email.svg @@ -0,0 +1,3 @@ + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/food.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/food.svg new file mode 100644 index 0000000..ea4d7c7 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/food.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/history.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/history.svg new file mode 100644 index 0000000..e2b93bc --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/history.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/home.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/home.svg new file mode 100644 index 0000000..18dee74 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/home.svg @@ -0,0 +1,4 @@ + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/home_pos.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/home_pos.svg new file mode 100644 index 0000000..ce62918 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/home_pos.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/image.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/image.svg new file mode 100644 index 0000000..a1e9610 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/image.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/location.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/location.svg new file mode 100644 index 0000000..8b9e29c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/location.svg @@ -0,0 +1,4 @@ + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/notification.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/notification.svg new file mode 100644 index 0000000..c2f079d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/notification.svg @@ -0,0 +1,3 @@ + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/order.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/order.svg new file mode 100644 index 0000000..0ed3810 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/order.svg @@ -0,0 +1,3 @@ + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/orders.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/orders.svg new file mode 100644 index 0000000..7167e85 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/orders.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/password.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/password.svg new file mode 100644 index 0000000..e10b170 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/password.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/payments.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/payments.svg new file mode 100644 index 0000000..13715dc --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/payments.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/person.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/person.svg new file mode 100644 index 0000000..234e81c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/person.svg @@ -0,0 +1,4 @@ + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/print.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/print.svg new file mode 100644 index 0000000..b54f535 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/print.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/qr_code.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/qr_code.svg new file mode 100644 index 0000000..173fb1d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/qr_code.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/report.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/report.svg new file mode 100644 index 0000000..541c01d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/report.svg @@ -0,0 +1,3 @@ + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/search.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/search.svg new file mode 100644 index 0000000..41a6e46 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/shield-done.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/shield-done.svg new file mode 100644 index 0000000..bb0b024 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/shield-done.svg @@ -0,0 +1,3 @@ + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/snack.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/snack.svg new file mode 100644 index 0000000..5bbb7c8 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/snack.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/icons/user.svg b/FrontEnd/flutter_pos_ecommerce/assets/icons/user.svg new file mode 100644 index 0000000..0ae7dac --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/assets/icons/user.svg @@ -0,0 +1,4 @@ + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/banks/BCA.png b/FrontEnd/flutter_pos_ecommerce/assets/images/banks/BCA.png new file mode 100644 index 0000000..596b6da Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/banks/BCA.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/banks/BRI Direct Debit.png b/FrontEnd/flutter_pos_ecommerce/assets/images/banks/BRI Direct Debit.png new file mode 100644 index 0000000..867ee59 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/banks/BRI Direct Debit.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/banks/Mandiri.png b/FrontEnd/flutter_pos_ecommerce/assets/images/banks/Mandiri.png new file mode 100644 index 0000000..2419147 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/banks/Mandiri.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/banner1.png b/FrontEnd/flutter_pos_ecommerce/assets/images/banner1.png new file mode 100644 index 0000000..2b61368 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/banner1.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/banner2.png b/FrontEnd/flutter_pos_ecommerce/assets/images/banner2.png new file mode 100644 index 0000000..d46b8c8 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/banner2.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-bestseller.png b/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-bestseller.png new file mode 100644 index 0000000..e14e40e Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-bestseller.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-flashsale.png b/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-flashsale.png new file mode 100644 index 0000000..c118572 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-flashsale.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-more.png b/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-more.png new file mode 100644 index 0000000..d17f37d Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-more.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-toprated.png b/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-toprated.png new file mode 100644 index 0000000..2702d18 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/categories/menu-toprated.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/f1.jpeg b/FrontEnd/flutter_pos_ecommerce/assets/images/f1.jpeg new file mode 100644 index 0000000..941db0e Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/f1.jpeg differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/f2.jpeg b/FrontEnd/flutter_pos_ecommerce/assets/images/f2.jpeg new file mode 100644 index 0000000..4b1783d Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/f2.jpeg differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/f3.jpeg b/FrontEnd/flutter_pos_ecommerce/assets/images/f3.jpeg new file mode 100644 index 0000000..1e21cd2 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/f3.jpeg differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/f4.jpeg b/FrontEnd/flutter_pos_ecommerce/assets/images/f4.jpeg new file mode 100644 index 0000000..b64628a Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/f4.jpeg differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/f5.jpeg b/FrontEnd/flutter_pos_ecommerce/assets/images/f5.jpeg new file mode 100644 index 0000000..79b82e4 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/f5.jpeg differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/f6.jpeg b/FrontEnd/flutter_pos_ecommerce/assets/images/f6.jpeg new file mode 100644 index 0000000..1b58d93 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/f6.jpeg differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/f7.jpeg b/FrontEnd/flutter_pos_ecommerce/assets/images/f7.jpeg new file mode 100644 index 0000000..93d068f Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/f7.jpeg differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/f8.jpeg b/FrontEnd/flutter_pos_ecommerce/assets/images/f8.jpeg new file mode 100644 index 0000000..1e08aee Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/f8.jpeg differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/google.png b/FrontEnd/flutter_pos_ecommerce/assets/images/google.png new file mode 100644 index 0000000..c04e54f Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/google.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/img_friend4.png b/FrontEnd/flutter_pos_ecommerce/assets/images/img_friend4.png new file mode 100644 index 0000000..1d1aba9 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/img_friend4.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/img_logo.png b/FrontEnd/flutter_pos_ecommerce/assets/images/img_logo.png new file mode 100644 index 0000000..0174024 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/img_logo.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/manage_printer.png b/FrontEnd/flutter_pos_ecommerce/assets/images/manage_printer.png new file mode 100644 index 0000000..1c00210 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/manage_printer.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/manage_product.png b/FrontEnd/flutter_pos_ecommerce/assets/images/manage_product.png new file mode 100644 index 0000000..4c3bdf9 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/manage_product.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/oops.png b/FrontEnd/flutter_pos_ecommerce/assets/images/oops.png new file mode 100644 index 0000000..6bc805c Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/oops.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/process-order.png b/FrontEnd/flutter_pos_ecommerce/assets/images/process-order.png new file mode 100644 index 0000000..27408f7 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/process-order.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/products/earphone.png b/FrontEnd/flutter_pos_ecommerce/assets/images/products/earphone.png new file mode 100644 index 0000000..d83bdc7 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/products/earphone.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/products/keyboard.png b/FrontEnd/flutter_pos_ecommerce/assets/images/products/keyboard.png new file mode 100644 index 0000000..6efdb46 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/products/keyboard.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/products/lampu.png b/FrontEnd/flutter_pos_ecommerce/assets/images/products/lampu.png new file mode 100644 index 0000000..51cbedf Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/products/lampu.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/products/mac.png b/FrontEnd/flutter_pos_ecommerce/assets/images/products/mac.png new file mode 100644 index 0000000..f61d077 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/products/mac.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/products/mac2.png b/FrontEnd/flutter_pos_ecommerce/assets/images/products/mac2.png new file mode 100644 index 0000000..6630534 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/products/mac2.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/products/sepatu.png b/FrontEnd/flutter_pos_ecommerce/assets/images/products/sepatu.png new file mode 100644 index 0000000..d08bdaf Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/products/sepatu.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/assets/images/products/sepatu2.png b/FrontEnd/flutter_pos_ecommerce/assets/images/products/sepatu2.png new file mode 100644 index 0000000..44f029a Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/assets/images/products/sepatu2.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/firebase.json b/FrontEnd/flutter_pos_ecommerce/firebase.json new file mode 100644 index 0000000..4ec955f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/firebase.json @@ -0,0 +1 @@ +{"flutter":{"platforms":{"android":{"default":{"projectId":"chat-app-20117","appId":"1:262926188813:android:840cd3bd354a95190ab044","fileOutput":"android/app/google-services.json"}},"dart":{"lib/firebase_options.dart":{"projectId":"chat-app-20117","configurations":{"android":"1:262926188813:android:840cd3bd354a95190ab044","ios":"1:262926188813:ios:1a927ccd8013e3ac0ab044","macos":"1:262926188813:ios:1a927ccd8013e3ac0ab044","web":"1:262926188813:web:7ec9d28470b7b2360ab044","windows":"1:262926188813:web:e4c1abc6a4507a380ab044"}}}}}} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/flutter_jank_metrics_01.json b/FrontEnd/flutter_pos_ecommerce/flutter_jank_metrics_01.json new file mode 100644 index 0000000..36820ef --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/flutter_jank_metrics_01.json @@ -0,0 +1 @@ +{"type":"RenderFrameWithRasterStats","snapshots":[{"layer_unique_id":32086,"duration_micros":6021,"top":0.0,"left":0.0,"width":720.0,"height":1512.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,28,235,73,68,65,84,120,156,236,214,193,13,128,32,0,192,64,100,255,137,49,70,86,160,47,99,114,55,65,159,189,214,115,191,3,0,0,56,50,191,14,0,0,128,63,49,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,176,219,173,99,1,0,0,0,128,65,254,214,99,216,95,20,1,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,1,154,40,15,193,76,245,230,194,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32089,"duration_micros":736,"top":103.31999969482422,"left":37.77000045776367,"width":354.1797180175781,"height":49.079994201660156,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,156,101,103,89,32,254,231,57,183,170,187,19,146,9,33,105,146,190,247,214,210,157,22,76,68,16,18,17,20,152,160,3,178,42,163,140,44,10,168,24,81,65,20,70,248,161,206,0,142,226,168,145,69,220,69,81,150,159,200,128,11,203,32,130,10,130,10,178,43,26,32,118,210,181,220,186,157,166,137,177,81,210,75,85,157,119,254,168,234,230,110,181,116,167,151,116,252,126,63,159,34,93,239,57,231,61,239,189,247,220,226,61,239,121,222,231,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,115,71,158,237,6,112,135,100,187,61,253,176,82,202,35,34,98,91,41,229,221,221,238,220,95,68,68,57,219,13,3,0,184,171,58,103,58,208,237,246,212,163,163,196,83,54,220,49,227,104,212,121,107,68,125,107,70,53,215,216,18,239,158,153,153,249,215,51,208,196,51,174,221,158,250,206,40,241,198,190,194,44,207,237,116,230,126,249,44,53,137,30,19,173,201,87,150,200,75,142,23,148,56,220,233,206,254,64,68,212,103,175,85,0,192,29,117,14,117,160,39,175,139,146,191,117,18,135,30,142,200,223,140,92,250,149,78,167,179,231,148,55,236,44,106,183,166,63,18,81,190,118,160,120,95,103,97,182,21,70,161,207,170,102,115,250,43,171,44,159,25,44,175,75,124,67,183,59,251,183,103,163,77,0,192,169,49,118,182,27,112,6,108,139,40,63,18,165,241,172,118,123,242,133,157,206,220,175,198,93,102,4,176,76,143,40,220,209,110,183,183,117,58,157,67,167,251,236,147,147,147,23,47,47,87,83,199,126,207,204,186,211,217,251,15,167,251,188,231,130,170,138,39,140,186,133,201,140,111,143,8,29,104,34,34,226,170,171,174,218,114,240,224,237,87,245,150,149,114,244,198,110,183,123,251,217,106,19,0,27,171,206,118,3,206,160,109,81,242,213,19,205,169,231,159,237,134,156,42,25,229,93,35,138,255,244,76,116,158,35,34,202,82,245,200,140,242,201,99,63,81,234,15,156,137,243,158,3,198,162,148,239,27,181,33,35,158,185,125,251,246,11,206,116,131,184,115,250,226,23,191,56,217,251,29,202,40,159,28,27,27,219,121,182,219,5,192,250,206,233,17,232,18,249,222,140,114,203,64,225,5,145,177,51,34,238,21,17,231,15,29,147,113,253,196,142,137,191,155,223,55,255,193,51,212,204,211,102,169,110,188,164,81,149,7,68,148,175,94,45,186,49,114,249,71,206,212,249,75,148,237,3,69,119,145,145,253,59,102,98,98,231,215,151,186,190,98,141,205,23,109,27,191,219,127,137,56,240,39,103,180,81,220,73,141,93,50,20,109,117,84,248,21,192,157,221,185,221,129,46,245,47,44,116,231,254,124,212,182,221,187,119,111,61,114,251,210,163,74,150,159,138,136,251,245,110,171,171,124,118,68,156,243,29,232,125,251,246,206,238,218,181,235,161,135,15,47,61,172,170,114,75,196,242,251,58,157,206,191,156,169,243,151,140,203,7,130,232,207,233,235,233,84,41,203,229,219,215,155,93,80,170,242,29,17,161,3,77,148,82,111,207,129,139,165,140,151,255,72,79,6,1,206,73,119,217,63,212,123,246,236,57,50,223,157,121,91,85,151,103,14,110,203,200,39,237,216,177,115,106,212,113,231,154,155,111,190,249,96,183,59,247,142,78,103,246,15,207,100,231,57,34,34,51,118,156,201,243,157,11,182,111,223,126,65,228,232,240,141,227,74,60,101,122,122,250,242,51,212,36,238,196,170,82,13,62,197,1,224,28,112,151,31,49,156,219,55,247,241,86,107,242,205,25,249,164,222,242,170,170,239,19,17,179,235,29,59,121,249,228,85,165,202,135,215,25,151,85,81,182,215,145,37,51,15,100,93,246,151,106,249,61,39,155,213,99,215,174,93,23,29,61,186,252,95,162,46,87,100,230,229,37,242,110,17,229,188,18,49,94,69,30,93,239,216,44,245,27,231,186,115,239,141,136,104,183,119,62,48,74,253,156,190,215,85,202,27,142,109,95,75,179,121,197,68,85,45,93,19,117,236,206,44,205,18,85,102,196,231,74,198,222,177,177,248,212,204,204,204,45,163,142,107,181,166,31,148,81,126,232,120,65,137,135,15,236,178,173,221,154,122,253,208,129,165,220,212,233,206,253,212,122,109,106,183,219,231,101,61,246,173,165,170,167,74,201,237,153,113,247,136,184,45,234,114,32,170,188,105,219,182,241,119,238,217,179,231,200,134,175,43,151,94,214,87,152,203,215,119,58,157,79,71,28,155,244,24,15,168,74,53,89,170,152,138,40,19,117,157,215,119,187,51,159,93,175,222,19,177,101,203,121,143,138,17,161,67,131,22,23,235,111,137,136,147,201,42,19,17,17,173,86,171,29,209,120,76,150,216,17,85,110,47,37,50,179,220,24,145,243,165,84,55,45,44,236,253,135,56,249,76,44,141,118,123,234,145,81,199,125,34,242,210,136,114,143,146,113,75,85,242,230,58,235,185,204,250,147,119,228,102,173,217,156,186,127,35,226,235,235,140,29,25,185,61,178,44,70,93,14,148,140,125,85,85,222,57,63,63,223,221,168,142,118,187,125,94,148,198,111,246,150,149,200,207,44,44,204,252,239,141,142,157,104,78,61,187,100,124,93,111,89,93,22,159,223,237,118,191,240,229,54,142,186,150,170,95,60,54,73,118,199,142,157,83,99,89,63,54,50,90,37,227,178,168,243,11,17,165,83,50,63,182,176,48,243,145,88,35,156,169,217,108,94,90,229,248,43,142,183,185,148,43,7,247,169,235,198,203,218,173,169,131,67,7,231,242,179,206,212,252,6,0,214,119,78,119,160,199,54,153,134,47,179,250,84,148,210,223,129,46,121,225,90,251,79,94,62,121,85,105,196,11,235,200,103,68,172,156,164,196,234,131,214,82,162,100,68,148,70,180,219,83,191,218,88,140,151,207,238,159,221,187,153,118,108,223,190,253,130,173,91,207,127,241,209,35,203,207,142,136,243,35,115,181,135,179,242,191,43,231,89,191,207,83,103,252,69,207,111,151,68,196,211,122,183,47,103,140,12,105,137,136,152,152,152,104,214,117,190,44,99,233,187,163,172,156,176,244,158,181,68,44,45,198,237,173,214,212,43,198,199,243,87,7,59,210,165,212,219,51,243,105,163,234,94,53,62,216,158,149,23,150,163,38,59,70,196,74,168,205,225,195,71,159,30,37,95,88,178,236,142,114,236,125,62,126,108,68,137,56,124,104,241,31,39,154,211,47,155,239,206,188,37,34,150,71,215,86,159,63,120,254,172,199,223,120,245,213,87,127,246,150,91,110,125,118,189,92,94,156,17,23,151,44,199,235,175,170,252,205,17,21,157,180,44,249,212,193,171,178,90,46,95,85,55,242,83,177,242,254,28,219,243,251,227,36,58,208,205,230,21,19,85,44,63,39,162,60,47,34,198,87,63,190,213,247,108,229,196,25,117,180,91,83,239,170,75,249,217,110,119,238,111,78,164,249,237,246,212,19,162,228,143,71,41,95,219,251,65,100,68,148,92,253,22,148,198,109,19,173,169,159,105,140,231,107,79,36,199,122,187,189,243,190,17,245,139,162,196,83,86,47,191,149,250,75,68,228,202,231,94,234,92,108,181,166,126,185,148,177,87,117,187,55,205,175,85,215,145,35,71,26,91,183,156,223,255,89,71,121,235,102,218,81,103,92,149,3,215,73,85,85,63,62,176,215,208,181,84,213,203,111,104,183,219,247,136,186,241,210,200,250,135,143,127,83,75,68,228,177,247,169,68,187,53,253,233,200,242,255,117,58,179,127,58,120,238,70,163,177,165,212,61,245,142,248,11,150,81,190,101,84,187,143,28,57,242,67,163,202,1,56,243,238,178,33,28,189,74,25,142,41,44,85,25,57,210,59,209,156,126,114,221,200,79,149,213,206,243,250,21,199,179,151,199,226,147,173,214,228,19,55,218,117,234,178,169,157,91,183,156,255,193,40,241,130,216,196,8,229,218,170,117,111,26,170,168,70,126,166,205,230,21,19,165,174,254,46,35,191,123,131,19,156,159,17,255,99,105,177,124,182,217,220,121,239,147,110,102,175,50,250,58,107,54,155,151,30,58,180,244,127,86,243,123,239,222,160,150,251,148,44,111,154,104,77,255,126,179,217,188,116,243,39,175,219,159,191,229,214,63,204,40,175,140,136,139,55,127,220,137,107,54,175,152,136,140,255,58,80,252,71,115,183,204,221,144,81,126,191,183,48,35,174,94,233,80,110,94,187,61,253,159,171,92,250,80,100,121,97,244,117,198,71,122,76,149,249,215,19,173,201,223,219,189,123,247,214,141,234,222,190,125,251,5,237,246,212,107,162,196,31,141,200,45,62,232,226,18,241,242,197,197,242,217,201,230,228,67,54,213,246,230,212,51,163,212,127,191,137,197,144,198,51,226,249,85,46,125,104,179,117,31,87,162,113,66,251,247,168,235,173,27,254,45,44,145,247,139,210,248,243,200,248,225,13,246,252,234,40,241,174,137,214,212,255,56,217,246,140,114,209,242,69,255,33,254,94,3,156,11,206,233,63,200,75,155,124,68,157,37,174,25,46,173,58,131,37,173,214,212,79,148,44,111,138,141,59,39,189,46,202,200,183,180,219,147,107,102,191,152,156,156,188,120,121,44,254,56,34,190,230,4,234,29,169,58,185,197,111,198,170,88,124,99,68,180,79,224,152,139,170,170,254,163,157,247,220,121,217,73,156,175,95,14,63,206,158,190,124,122,186,170,198,255,106,173,209,182,181,148,40,223,81,229,248,223,108,182,93,37,227,119,74,148,199,175,187,199,41,82,197,210,183,14,213,30,229,15,34,34,234,200,183,12,29,80,47,63,97,179,117,183,90,147,79,139,82,222,31,17,173,19,105,83,137,124,198,225,195,139,47,143,117,190,235,205,102,243,210,109,91,206,127,119,148,24,154,47,176,158,140,184,172,206,252,147,118,187,253,213,235,236,86,181,90,83,47,143,140,223,62,145,186,35,162,85,103,126,112,162,57,253,228,19,60,238,180,41,25,215,71,196,253,55,189,127,196,79,159,240,77,192,58,14,54,14,202,114,3,112,39,113,151,15,225,152,152,152,184,166,212,67,163,130,183,46,46,222,254,79,125,251,53,167,159,84,162,188,44,70,59,152,145,31,40,165,140,71,198,85,17,49,57,180,71,201,87,181,90,211,127,183,176,48,243,225,193,77,203,203,249,252,28,200,4,178,234,93,25,241,225,82,226,182,146,113,101,70,60,37,70,140,146,102,137,23,148,170,28,140,136,40,81,125,98,141,54,174,169,213,154,124,66,68,62,108,196,166,219,35,226,195,171,255,125,104,68,92,212,255,154,226,170,197,177,229,31,136,136,159,138,136,200,172,14,68,148,55,244,236,241,152,136,184,164,231,247,197,136,248,131,161,179,148,114,83,239,175,219,183,111,191,96,169,81,126,63,74,92,53,180,239,138,191,47,81,62,155,37,175,136,140,251,68,196,182,129,237,247,58,58,190,252,75,17,241,157,177,102,56,199,102,229,169,74,25,150,37,227,187,7,46,200,219,143,30,61,244,167,17,17,153,203,127,25,165,113,48,122,223,227,204,235,174,186,234,170,159,187,225,134,27,214,141,123,223,177,99,234,1,25,49,28,91,190,226,112,68,124,56,178,28,140,146,15,140,24,49,177,179,196,179,219,237,233,91,59,157,153,151,140,106,119,149,227,175,40,17,223,48,170,242,18,49,147,17,31,139,200,169,136,242,53,49,124,115,121,73,41,141,183,79,93,54,245,141,163,66,153,218,205,201,31,139,136,181,114,175,31,44,145,127,149,165,190,123,100,62,120,68,221,81,178,188,105,98,98,103,119,126,126,239,157,49,199,248,109,145,241,87,81,226,162,88,185,57,30,250,238,46,103,190,42,34,30,20,17,75,17,17,203,203,203,71,171,172,122,190,67,249,53,61,105,40,35,34,162,68,190,61,163,12,197,64,111,221,186,245,14,94,235,0,156,42,231,116,7,122,163,17,232,201,230,228,67,234,58,127,125,176,188,68,252,198,254,253,251,191,116,236,247,86,107,215,189,74,44,191,97,112,191,40,229,165,217,40,111,156,159,159,223,27,61,147,130,38,118,76,60,180,84,213,245,17,253,19,145,50,202,107,98,101,132,106,233,120,27,38,39,47,174,151,99,112,116,122,49,75,253,196,249,238,252,219,123,11,39,38,38,94,86,234,234,245,17,241,77,125,205,168,162,219,233,204,245,133,0,156,136,42,170,199,15,198,86,103,201,167,148,106,233,109,61,147,146,198,90,173,233,107,50,202,219,35,226,203,153,1,50,159,26,17,63,29,17,245,234,205,193,241,27,132,118,107,234,67,209,223,129,62,220,89,152,125,250,70,237,217,186,229,110,63,19,81,30,220,87,88,226,99,81,229,11,142,28,249,210,199,14,28,56,240,239,199,138,119,237,218,117,209,209,195,75,63,26,153,47,237,107,127,228,147,90,173,201,183,46,44,204,109,42,238,117,229,20,177,63,51,222,80,74,249,104,41,249,207,153,89,142,28,222,114,211,198,71,110,108,98,98,226,234,82,199,213,3,231,123,221,177,215,210,233,116,14,181,90,83,191,157,17,255,189,103,151,246,193,131,255,254,208,136,222,184,246,126,151,94,122,239,11,27,213,225,215,142,122,45,17,229,185,71,143,30,122,87,239,251,53,121,249,228,85,203,141,252,222,129,243,68,148,242,226,201,203,39,223,60,119,203,220,13,189,197,173,214,244,211,35,202,136,184,245,120,109,196,242,171,22,86,39,96,70,172,220,248,108,217,114,222,181,25,249,202,232,9,185,201,136,233,229,177,124,81,68,60,171,183,138,201,230,228,35,234,204,159,31,170,187,196,199,50,170,159,188,231,142,123,188,239,227,31,255,248,226,177,186,183,141,223,237,113,117,150,87,101,68,223,211,133,82,215,111,157,154,154,186,223,236,236,236,190,53,222,166,51,109,46,50,126,224,178,203,46,253,243,99,237,111,183,219,231,101,105,252,143,18,241,19,189,59,102,196,213,173,214,244,53,199,110,172,87,39,42,30,255,142,180,90,83,255,43,35,250,58,208,85,181,252,147,243,243,243,255,120,6,94,7,0,39,233,156,238,64,103,230,163,219,237,201,193,85,187,182,69,29,205,168,226,202,186,228,208,35,245,136,216,87,215,213,107,250,139,150,159,24,3,163,95,89,226,217,243,221,185,95,27,117,222,249,125,243,31,220,181,107,215,55,31,57,178,252,23,25,125,157,166,251,76,236,152,120,112,239,34,45,117,93,221,43,162,244,77,88,204,18,63,49,216,121,142,136,152,159,159,239,54,155,211,207,169,178,124,166,111,67,157,247,139,136,147,238,64,151,40,95,49,80,244,111,243,221,153,55,71,255,13,200,210,194,194,204,135,219,205,201,95,140,254,78,207,189,154,205,169,251,117,187,179,159,60,217,243,247,90,137,95,46,131,55,20,123,74,46,61,106,161,179,112,235,224,254,55,223,124,243,193,136,248,169,86,107,114,111,70,190,174,119,91,70,126,111,68,108,166,3,125,56,178,92,55,62,86,189,243,68,38,189,157,136,186,174,158,48,248,56,164,148,242,71,189,191,55,74,249,147,58,179,175,99,91,69,60,49,214,233,64,111,219,118,248,91,162,12,61,189,184,181,148,188,182,219,157,29,202,30,178,218,65,126,65,187,61,85,162,196,143,245,110,91,110,84,15,139,136,222,14,244,88,70,25,142,211,205,184,190,211,153,125,81,12,100,146,88,237,168,191,115,250,242,233,127,92,106,148,27,163,239,59,83,158,212,110,183,127,180,55,75,68,157,249,253,131,85,151,200,247,142,111,137,239,152,153,217,251,175,243,221,47,15,88,175,212,125,224,15,154,205,233,79,101,150,191,142,254,27,179,237,203,139,241,237,17,241,43,67,109,61,195,74,196,254,82,170,71,118,23,246,126,174,211,249,114,18,159,213,215,253,147,237,246,212,206,225,56,239,242,216,232,185,241,4,224,220,119,78,199,64,103,196,243,163,228,111,13,252,188,58,50,95,20,163,59,207,145,85,245,228,125,251,246,246,166,175,27,203,136,239,237,219,169,196,199,230,187,179,235,102,103,184,249,230,155,15,150,18,207,29,44,175,171,170,47,102,51,235,229,161,88,221,82,229,71,215,170,119,53,165,90,95,71,178,100,125,71,115,86,15,246,237,46,108,183,167,255,243,168,29,151,75,254,121,70,190,190,247,103,44,202,9,76,218,91,95,85,141,61,106,168,113,37,95,176,176,48,220,121,238,181,176,48,247,134,200,161,197,71,30,189,153,137,142,37,242,71,59,157,185,55,158,174,206,115,187,221,62,47,35,6,59,139,157,187,223,253,130,190,176,131,185,238,220,135,35,162,47,245,97,137,124,250,174,93,187,250,67,103,122,183,151,225,201,172,89,234,239,221,32,245,94,137,88,30,186,126,115,165,35,215,211,238,233,135,196,192,228,205,18,241,215,219,182,141,255,207,88,103,85,201,153,91,102,102,162,196,111,12,20,95,84,213,213,241,155,201,233,203,167,167,99,229,230,160,215,193,186,206,235,214,251,28,186,221,153,207,102,201,225,60,218,25,207,138,59,193,223,171,170,212,223,223,237,238,253,220,90,219,51,235,87,14,149,149,13,39,101,2,112,142,57,167,71,160,79,208,77,117,137,167,119,231,247,254,109,111,97,171,181,107,87,196,114,223,178,203,37,179,219,110,79,246,119,170,71,169,99,40,187,65,70,60,178,247,247,229,200,81,203,138,109,20,187,125,74,59,10,37,226,147,185,18,135,217,83,88,222,211,110,79,255,108,93,215,239,173,235,45,55,222,114,203,158,3,17,17,251,246,205,126,34,34,54,206,64,114,210,242,65,131,37,117,198,206,118,123,242,186,13,143,44,185,56,20,138,146,203,247,141,136,53,59,52,17,17,165,28,253,195,19,109,229,137,105,92,27,189,97,47,17,81,34,126,119,68,108,243,82,137,124,109,70,249,217,158,178,243,23,15,215,143,142,17,177,227,173,86,235,146,140,242,136,129,226,27,231,187,243,239,220,168,69,157,78,103,79,171,53,249,140,204,161,107,116,53,241,93,68,150,242,144,193,24,168,170,228,175,110,148,111,59,34,162,170,203,111,212,99,241,233,222,178,197,58,111,63,254,239,70,125,205,224,10,123,81,226,245,3,55,175,35,205,119,103,222,222,110,77,237,137,254,206,253,125,154,205,93,237,110,247,230,185,141,142,63,93,74,196,254,109,231,111,253,179,245,246,105,52,26,159,94,170,7,222,213,76,139,230,0,220,197,252,71,232,64,31,140,146,191,185,84,143,253,226,177,78,98,175,70,89,186,103,157,253,255,71,159,81,190,37,74,110,156,29,98,116,55,184,47,211,197,88,137,110,61,176,95,150,114,117,68,188,127,212,193,43,35,170,245,192,100,164,60,169,5,91,142,105,52,202,175,214,203,249,61,209,63,25,111,60,74,121,73,149,249,146,170,177,24,237,214,212,39,51,202,187,163,148,15,55,182,52,62,112,186,70,107,163,196,208,104,122,70,121,197,102,146,97,140,202,145,157,37,255,211,186,7,101,121,79,119,225,203,11,100,156,14,89,202,147,202,192,197,80,215,163,151,234,206,92,122,103,148,198,207,246,23,198,83,99,212,228,203,24,159,24,12,243,47,17,111,142,117,70,135,123,45,44,204,173,53,241,240,88,93,247,26,44,27,91,202,247,109,166,238,213,80,145,27,214,218,158,25,173,161,143,171,90,59,31,248,128,186,68,188,41,35,254,103,223,225,85,185,60,34,206,90,7,58,162,188,127,163,155,139,153,153,153,195,237,214,244,167,7,38,6,238,58,205,13,3,224,12,59,235,143,68,239,136,18,249,222,136,120,195,241,159,18,255,255,136,221,46,106,148,242,123,163,58,207,17,17,203,167,126,57,234,109,87,93,117,213,150,99,191,44,229,210,103,34,162,239,220,37,226,127,183,90,83,143,29,60,112,98,98,162,89,101,61,52,233,49,162,220,161,248,201,185,185,185,127,42,81,54,154,220,119,255,18,249,227,37,171,183,45,45,150,219,218,205,233,95,106,54,167,191,242,142,156,119,13,167,186,206,243,214,219,152,37,110,62,197,231,235,211,108,54,47,45,145,79,29,40,254,199,125,251,70,199,140,119,58,157,79,71,137,143,245,150,149,40,143,111,54,119,13,101,118,169,74,76,15,150,101,89,127,245,204,19,147,131,105,21,23,247,126,126,239,231,79,73,205,37,71,132,29,229,134,43,12,30,223,51,71,117,148,235,19,74,225,119,170,101,201,77,190,55,101,240,111,205,133,113,142,255,173,5,160,223,57,61,2,221,40,245,245,131,203,86,183,91,83,117,12,172,32,182,84,197,15,71,196,26,171,120,85,151,156,252,138,199,163,221,112,195,13,199,71,8,187,221,238,237,237,246,244,175,71,41,47,238,217,101,60,35,222,57,209,154,126,71,68,249,232,106,26,187,171,74,29,79,142,225,84,88,183,102,214,107,78,50,219,172,133,133,185,183,180,219,83,223,22,37,94,19,253,19,180,70,203,242,220,42,226,25,147,205,201,199,205,117,231,254,250,142,158,127,85,35,54,94,48,229,132,148,204,165,117,183,151,234,139,167,242,124,131,50,199,30,19,131,19,80,35,26,237,214,212,235,214,56,36,98,56,45,95,84,213,210,19,34,226,213,189,101,117,198,229,67,227,242,85,220,118,146,77,29,148,131,233,211,34,227,159,227,20,125,25,74,198,229,131,53,141,45,149,19,249,44,70,44,21,126,234,98,241,79,206,151,67,84,0,248,143,237,156,238,64,143,146,85,253,203,165,174,6,150,248,141,31,108,183,219,175,232,116,58,35,66,33,234,127,25,138,197,200,242,158,40,185,255,164,206,31,229,246,232,73,99,183,98,233,151,34,26,223,18,3,11,169,172,46,240,241,248,200,117,130,162,51,158,222,155,217,224,142,232,116,102,255,120,231,61,119,254,237,210,88,121,80,169,226,202,82,226,193,27,44,100,114,81,157,249,39,173,86,235,222,27,77,242,219,164,229,136,184,41,34,122,99,206,247,69,172,189,252,248,198,202,141,27,237,112,242,117,111,108,212,202,142,37,226,202,88,249,217,188,146,215,197,74,150,137,227,55,95,213,202,141,85,255,110,165,92,112,50,237,28,117,198,200,216,27,37,118,246,148,156,186,80,131,58,190,48,120,81,47,141,109,16,110,211,127,252,197,67,33,212,229,212,220,60,228,202,136,48,0,156,180,187,92,7,122,126,126,254,163,237,230,212,187,35,163,63,219,67,61,246,195,17,67,249,152,35,34,135,66,59,178,174,126,109,190,59,243,182,83,216,172,67,25,121,99,89,89,136,98,243,50,174,235,116,102,55,27,55,186,41,123,63,191,119,127,68,188,109,245,39,86,66,7,150,238,215,136,188,119,169,226,27,162,196,224,234,120,151,100,142,95,23,17,63,119,42,206,95,34,111,206,40,189,29,232,207,111,38,119,244,157,209,212,142,169,43,151,35,30,126,138,170,187,207,196,196,196,213,243,243,243,199,51,180,148,42,246,15,119,255,243,212,141,224,215,229,198,200,236,77,3,185,109,231,61,119,94,182,122,141,220,49,85,118,163,12,54,190,220,99,179,135,103,198,229,131,71,55,74,220,114,236,223,219,183,111,63,250,197,131,95,26,56,40,214,204,102,50,160,57,88,80,85,71,172,242,7,192,166,221,229,58,208,17,17,81,229,207,69,41,253,29,232,44,63,184,99,199,206,87,12,102,1,104,52,202,231,235,229,161,17,232,7,198,106,7,115,61,187,119,239,222,122,232,208,82,223,72,227,248,114,252,235,204,45,51,51,199,126,159,158,158,222,182,188,24,175,43,81,254,219,102,155,95,34,254,186,170,234,231,247,118,166,78,86,187,61,245,237,49,16,22,210,233,204,254,94,172,142,146,175,102,53,152,139,136,119,68,196,47,182,90,211,207,200,40,191,215,215,158,18,223,24,167,168,3,157,165,204,14,140,44,222,111,98,98,162,57,63,63,191,97,124,236,142,29,59,167,170,170,244,189,150,204,165,207,157,170,17,250,19,181,156,229,241,39,183,178,250,26,234,234,9,17,113,252,51,175,150,234,207,215,141,193,9,174,249,168,136,120,73,108,98,100,189,213,154,124,250,96,22,142,78,103,238,119,226,248,40,119,14,197,25,31,25,91,126,96,172,92,11,235,154,218,49,117,229,114,163,244,45,83,93,215,249,177,99,249,194,179,196,45,131,13,204,82,30,26,107,76,158,29,218,53,98,104,142,192,114,142,29,143,65,190,225,134,27,142,182,91,83,157,232,159,180,187,97,186,184,237,219,183,95,16,17,15,30,44,175,235,173,98,148,1,216,180,187,100,7,186,211,153,249,64,187,53,245,254,136,184,182,167,120,188,209,168,159,19,17,47,232,221,119,203,150,45,123,14,31,90,236,75,153,85,34,174,107,54,155,175,92,93,53,108,77,71,110,95,122,66,102,233,203,158,176,52,86,190,63,34,94,19,177,210,193,62,124,251,226,111,71,70,95,231,185,68,236,175,34,127,170,148,250,194,204,188,188,68,222,45,50,110,41,37,186,85,181,252,55,157,83,185,10,217,202,136,242,119,245,22,77,94,62,249,183,131,43,210,29,179,176,48,243,198,118,107,234,149,209,211,233,206,40,15,138,158,244,103,253,47,229,4,155,147,229,3,25,253,121,126,203,114,245,157,17,113,253,122,199,237,222,189,123,235,225,67,139,111,139,254,37,209,111,219,182,109,219,169,158,4,186,89,99,145,57,148,122,175,68,254,64,102,189,185,209,204,146,191,213,127,108,60,171,221,110,255,204,177,27,130,11,238,113,193,158,47,30,252,210,64,58,183,242,181,205,230,212,131,187,221,217,190,116,140,131,118,236,216,57,149,81,191,110,224,19,250,163,88,189,54,35,34,50,242,125,37,74,223,107,168,170,120,102,108,162,3,189,84,197,51,179,244,47,10,147,43,203,113,175,252,187,81,127,180,12,220,152,150,136,231,237,216,177,115,195,84,118,171,177,250,125,157,220,140,248,76,103,225,230,254,9,161,153,123,163,148,222,14,244,133,237,246,206,251,118,58,123,255,97,173,186,183,141,223,237,113,37,202,249,131,229,103,107,4,58,51,203,224,72,125,230,41,91,94,30,128,211,228,46,217,129,142,149,248,206,95,136,210,215,129,142,40,241,35,19,19,19,175,236,29,237,220,179,103,207,145,118,123,242,87,162,228,171,122,246,220,94,229,248,43,35,226,123,98,40,158,121,197,212,212,212,142,229,165,242,178,193,242,186,30,127,247,177,127,31,62,188,248,180,200,248,206,193,125,178,148,95,175,51,63,84,53,202,82,41,245,77,167,117,4,53,203,71,162,100,95,7,186,30,203,31,140,136,31,30,181,251,238,221,187,199,14,31,90,28,44,254,124,140,238,44,15,198,69,95,216,108,54,207,239,118,187,107,78,182,58,239,208,150,183,29,62,111,241,182,232,29,21,207,248,133,118,123,231,95,117,58,123,63,178,214,113,135,111,95,124,110,228,192,138,124,37,95,179,153,156,197,167,195,196,196,206,175,47,117,61,176,8,73,249,189,133,133,245,23,224,233,213,110,78,61,48,50,122,111,38,46,137,104,60,60,34,222,21,177,50,202,218,106,77,255,98,70,233,91,180,164,202,120,249,246,237,219,31,209,187,132,247,128,170,145,245,79,14,22,102,169,251,38,54,30,94,252,210,59,182,110,57,127,95,68,79,38,154,146,223,58,209,156,126,242,124,119,102,68,90,189,213,118,183,119,222,55,74,221,183,136,80,137,248,248,194,194,204,223,29,251,125,110,110,238,159,90,173,233,247,14,228,177,190,184,81,213,175,221,181,107,215,183,173,174,48,57,164,213,218,121,191,40,245,239,14,111,201,95,142,161,239,98,249,187,136,120,104,95,81,93,158,25,35,67,181,142,127,103,215,189,81,59,211,178,148,47,14,126,177,150,150,226,238,103,165,49,0,108,218,93,246,177,101,167,51,251,158,136,24,76,37,54,30,117,62,103,112,223,82,150,223,24,25,123,7,138,191,171,221,154,250,221,149,165,167,251,140,181,219,211,215,46,47,197,187,162,127,50,92,148,136,63,232,118,111,154,63,246,123,142,88,104,101,101,67,190,52,163,124,178,212,213,167,163,52,110,111,183,166,74,187,53,117,180,221,158,250,167,118,107,234,93,237,246,244,75,39,38,38,134,226,52,79,70,85,15,189,7,17,37,158,211,106,77,63,47,134,111,160,26,135,14,29,125,70,12,132,124,100,228,39,70,86,222,19,147,122,188,130,216,242,248,88,231,186,218,243,47,123,190,24,37,94,60,180,161,212,239,89,77,237,215,119,108,187,221,110,181,155,147,47,142,140,95,24,60,36,27,203,111,89,235,60,167,91,89,174,7,87,217,139,204,252,63,39,84,73,149,67,11,188,100,201,39,245,254,126,222,161,177,55,69,196,223,15,236,246,160,173,227,231,189,117,212,42,140,147,147,147,23,183,155,211,175,140,140,193,209,241,125,165,42,125,25,107,14,28,56,240,239,25,249,19,131,117,148,44,111,106,183,39,175,219,189,123,247,208,245,219,110,79,95,27,165,254,191,49,152,121,36,227,55,98,224,38,43,179,244,222,148,30,243,141,71,143,44,191,187,221,158,190,54,122,174,191,201,201,201,139,87,194,135,234,15,198,240,36,191,125,203,229,232,208,103,93,213,229,61,67,181,103,121,238,68,115,234,199,122,235,110,183,219,231,181,219,83,223,182,188,20,31,140,129,60,237,95,110,235,217,25,245,173,35,135,158,114,85,81,61,126,122,122,122,40,83,11,0,119,30,167,48,128,243,244,106,183,39,175,27,124,228,93,149,242,200,193,52,118,253,199,76,125,123,148,120,235,64,241,225,172,234,43,6,99,110,87,58,6,101,212,34,18,139,177,18,15,125,40,86,38,31,93,19,49,60,89,169,68,236,175,235,234,235,122,31,79,79,77,77,237,88,90,202,215,141,88,77,110,51,14,151,136,151,111,221,218,184,126,173,209,186,118,123,234,209,81,162,111,146,97,70,126,207,252,194,204,241,24,230,171,175,190,122,124,255,45,95,120,91,68,60,122,68,21,115,81,226,131,153,185,92,162,100,100,60,164,47,43,195,177,58,75,254,215,249,238,204,208,194,32,19,173,233,31,44,81,126,109,68,189,7,34,226,175,98,229,61,139,44,249,127,231,187,51,111,238,217,62,214,110,78,189,99,104,162,231,138,191,143,136,127,40,17,227,153,113,223,40,113,213,168,215,94,34,126,122,97,97,182,175,35,222,108,238,188,119,149,117,255,18,215,37,127,190,211,157,121,209,168,58,78,214,246,237,219,47,216,186,229,252,253,17,209,27,10,112,32,114,121,234,68,158,38,180,219,237,243,162,52,102,163,127,21,195,197,186,44,54,123,195,135,118,236,152,122,64,163,138,143,175,81,205,251,35,98,229,166,45,227,194,40,241,200,129,118,173,108,42,245,183,206,119,231,223,62,226,248,92,77,185,247,180,17,219,110,45,81,254,60,35,143,174,214,127,245,26,159,199,251,234,178,248,184,81,79,30,218,237,169,95,137,18,207,94,163,237,183,69,150,15,148,146,151,100,196,67,214,216,39,34,227,49,157,206,236,159,14,22,95,118,217,101,119,27,31,219,246,217,24,221,41,62,16,89,62,25,37,143,70,196,55,198,136,247,164,239,20,85,221,234,253,155,112,71,174,165,118,107,234,47,86,207,121,92,103,97,182,17,35,22,192,153,152,152,184,166,212,213,168,185,14,135,35,226,47,99,245,41,79,137,152,25,188,222,1,56,123,238,178,35,208,17,17,157,206,236,219,34,135,86,75,219,86,74,227,89,195,251,206,188,191,68,252,244,136,106,198,35,226,137,177,210,193,248,166,24,209,121,142,136,197,204,124,242,96,108,231,236,236,236,190,139,46,58,255,113,25,185,238,138,112,107,216,150,17,63,121,244,200,242,71,38,38,38,174,216,120,247,209,62,254,241,143,47,102,85,127,95,140,94,238,122,50,50,190,115,117,145,149,167,141,236,60,71,252,205,133,119,63,127,100,38,144,198,114,12,117,106,86,109,143,47,191,103,79,43,85,61,184,32,200,82,29,141,103,197,192,2,51,171,238,23,17,79,203,136,39,175,213,121,206,200,183,156,119,222,248,80,248,204,153,178,101,203,121,143,138,193,14,89,201,223,61,209,80,156,78,167,115,40,74,190,118,160,120,188,145,91,30,215,91,176,111,223,236,39,178,196,208,147,147,85,215,198,234,251,188,26,239,62,220,81,44,241,194,53,58,207,17,17,165,46,139,207,143,136,81,171,93,94,146,145,79,234,169,127,248,243,200,216,155,85,253,93,107,133,237,28,57,114,251,139,34,226,83,107,156,251,226,40,249,173,235,117,158,75,196,203,70,117,158,35,34,246,239,223,255,165,200,120,238,168,109,17,177,61,74,62,50,34,30,23,27,116,158,35,34,74,217,196,82,152,167,193,252,252,252,39,34,242,211,35,54,109,139,136,199,196,234,123,159,89,190,238,204,182,12,128,245,220,165,59,208,17,177,84,74,249,249,161,210,82,158,119,217,101,87,220,115,176,120,97,97,246,127,149,200,231,157,224,57,110,203,82,61,174,211,153,25,153,93,224,223,254,237,246,135,111,98,21,192,245,220,171,212,141,63,190,244,210,123,159,116,238,218,249,249,249,110,86,245,99,99,56,20,96,125,25,123,151,75,227,169,55,220,112,195,209,81,155,103,110,153,153,137,44,39,53,186,219,237,222,60,87,151,124,88,100,126,240,68,142,43,81,222,124,116,233,208,247,156,173,216,231,136,136,204,28,138,107,47,25,127,124,50,117,149,28,181,228,119,249,190,193,146,249,238,236,175,69,150,167,69,196,191,157,80,253,17,191,222,233,206,190,124,189,125,186,221,238,23,34,151,175,141,114,98,175,161,68,236,207,172,191,99,189,12,42,7,14,28,248,247,186,44,62,162,68,140,88,97,115,93,7,51,242,123,22,22,102,95,186,222,78,157,206,236,159,68,228,47,157,64,189,55,70,198,224,77,203,217,84,175,115,19,0,192,157,212,57,221,129,94,206,225,71,162,131,50,235,183,140,136,111,190,112,108,108,105,168,147,18,17,75,11,11,51,175,170,75,245,149,81,242,231,35,98,100,232,196,170,219,35,227,250,241,197,234,202,249,238,222,225,88,204,88,201,28,81,234,242,234,129,226,131,89,170,111,46,145,247,239,253,137,204,135,103,201,167,70,196,59,135,107,42,95,189,109,219,225,199,175,211,150,227,234,24,157,1,98,126,126,254,166,177,241,124,80,100,249,254,140,248,204,134,21,149,124,245,248,209,234,193,171,105,238,214,52,54,86,253,82,148,120,97,156,96,199,46,34,162,219,91,127,238,183,0,0,18,247,73,68,65,84,157,249,236,182,109,99,143,88,77,241,183,209,106,139,31,138,140,199,46,44,204,61,101,255,254,253,95,218,96,223,227,54,157,17,99,147,154,205,43,38,134,114,101,103,220,176,176,48,115,82,41,7,23,22,102,62,58,248,121,148,136,111,24,17,223,92,58,157,185,55,214,101,236,171,34,203,139,74,196,76,172,163,68,190,189,68,124,253,194,194,236,15,197,136,208,129,65,157,78,103,161,211,157,253,111,145,241,216,200,120,211,6,187,31,40,145,207,219,186,181,113,239,249,249,249,143,109,176,111,116,187,221,47,44,44,204,254,80,86,245,3,163,228,171,99,37,60,97,164,140,248,76,70,252,88,99,44,174,92,13,69,90,119,165,201,136,40,157,133,153,31,205,146,79,142,149,69,122,214,178,24,165,252,92,213,40,15,202,186,30,74,81,185,153,24,232,59,120,45,173,89,127,167,51,243,254,200,120,98,68,108,180,40,16,0,119,18,231,80,22,142,236,68,196,27,122,75,234,58,55,92,153,172,211,233,28,154,104,78,255,120,201,210,151,87,54,75,236,220,189,123,247,214,81,35,153,221,238,222,207,69,196,139,182,111,223,254,51,219,198,182,221,191,174,242,202,44,121,159,136,44,81,213,221,172,171,207,30,58,186,245,47,191,240,133,207,173,219,105,60,124,120,241,27,35,226,94,125,133,37,254,251,90,29,238,85,127,208,110,78,253,216,224,164,185,44,229,97,17,241,251,253,187,86,183,70,212,125,239,73,163,196,190,181,42,158,153,153,57,28,43,105,204,126,103,98,98,226,234,88,174,30,88,103,236,200,18,247,140,200,219,162,170,23,34,242,159,75,89,250,200,66,119,115,43,15,174,214,121,253,165,151,222,251,55,182,108,57,116,109,85,85,95,181,18,10,82,206,59,222,246,186,90,179,179,183,250,254,191,53,34,222,218,108,78,127,101,102,125,223,42,242,43,74,228,100,137,114,32,34,59,153,75,127,211,233,116,254,49,54,76,155,87,221,62,248,126,68,169,254,121,51,175,99,179,26,141,229,171,74,221,127,29,70,148,247,196,202,42,139,39,99,185,100,249,217,213,112,131,47,159,39,150,238,29,35,194,110,86,39,169,254,252,213,87,95,253,138,253,251,111,125,64,41,245,189,171,136,175,44,153,23,150,146,55,103,150,217,82,170,155,22,22,246,158,216,211,134,213,182,172,46,220,243,174,86,171,245,194,136,198,215,84,145,247,138,40,95,81,71,30,168,74,238,173,179,158,107,52,226,19,115,115,179,39,188,42,224,106,94,243,143,78,78,78,190,52,150,226,154,18,121,175,213,21,49,255,53,51,62,147,89,223,56,63,63,255,201,216,184,211,60,92,247,74,140,253,31,78,236,152,120,112,105,228,253,35,178,29,117,92,92,50,246,71,228,124,85,45,191,227,216,72,249,196,196,68,55,6,62,195,229,229,229,129,167,44,39,127,45,149,136,15,101,196,194,137,180,191,211,153,253,195,171,175,190,250,237,251,246,29,120,96,85,197,53,17,185,59,202,151,195,197,74,201,117,111,152,0,56,179,206,153,73,132,231,162,118,115,242,37,145,217,247,8,122,112,178,210,40,171,57,143,251,71,233,74,249,179,78,119,110,212,164,59,0,0,206,160,115,58,132,227,78,175,202,237,131,69,227,227,227,27,134,31,236,217,179,103,49,34,250,39,101,101,90,106,24,0,224,78,64,7,250,180,42,243,131,37,71,143,214,247,223,232,168,201,230,228,55,197,64,230,128,140,50,42,139,6,0,0,103,152,14,244,105,52,50,246,183,148,223,156,152,152,184,38,214,120,239,91,173,169,135,215,153,175,27,218,48,58,71,53,0,0,103,152,24,232,211,168,213,106,93,146,49,246,137,136,152,28,177,249,214,136,120,95,137,248,76,102,57,144,37,190,170,68,94,27,17,67,171,203,69,196,167,254,211,69,119,251,186,181,210,201,1,0,112,230,232,64,159,102,19,19,211,223,92,234,242,142,24,88,250,248,4,28,168,75,62,172,219,157,249,236,198,187,2,0,112,186,9,225,56,205,230,231,103,254,44,50,158,16,43,75,130,159,168,155,234,18,223,172,243,12,0,112,231,209,56,219,13,248,143,224,139,95,60,248,207,119,187,224,30,175,207,44,203,25,241,128,216,68,254,237,140,124,253,248,98,245,148,249,91,102,70,45,177,12,0,192,89,34,132,227,12,107,54,155,231,55,26,141,175,170,235,188,50,179,106,102,41,247,44,37,46,204,44,7,34,242,11,37,99,182,170,202,95,206,205,205,157,240,66,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,191,246,224,144,0,0,0,0,64,208,255,215,86,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,5,57,156,152,27,198,252,100,213,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32091,"duration_micros":941,"top":160.9239959716797,"left":38.51397705078125,"width":563.22998046875,"height":74.35600280761719,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,156,28,101,157,63,240,207,247,169,158,35,129,16,32,199,76,170,170,187,107,38,131,200,45,130,92,226,177,72,80,60,96,17,143,21,81,241,0,249,161,120,0,162,192,122,236,138,136,46,178,34,120,224,201,170,220,40,2,222,172,192,2,11,136,196,44,199,134,195,33,233,163,186,147,16,174,192,146,57,186,251,249,254,254,232,171,186,167,123,210,147,153,36,38,249,188,95,175,188,50,213,253,84,213,83,213,79,117,127,235,169,231,0,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,104,235,33,91,58,3,91,35,223,247,119,83,141,189,165,186,60,62,254,210,15,215,174,93,251,127,229,247,130,215,171,226,21,0,96,128,231,179,185,212,21,91,42,159,51,205,117,221,217,34,221,167,84,151,85,229,119,249,252,202,199,183,100,158,104,219,52,217,53,182,61,115,221,228,97,198,232,94,0,160,138,117,185,92,230,186,45,157,167,233,136,199,227,7,170,202,254,0,160,138,209,92,46,243,179,45,157,167,153,230,251,254,44,192,156,88,93,22,209,219,178,217,236,147,91,34,47,158,151,120,63,96,118,45,47,233,67,185,92,250,182,45,145,15,162,109,65,108,75,103,160,19,174,235,206,55,38,118,92,117,57,22,51,183,164,82,169,213,147,175,147,56,210,24,12,0,128,42,86,229,114,153,95,207,84,126,140,53,129,21,253,247,218,178,217,233,42,160,252,227,46,170,175,6,112,62,0,88,224,110,0,219,76,0,45,34,179,4,245,227,22,131,199,0,48,128,166,25,55,217,53,182,61,115,4,71,168,202,151,1,192,0,255,13,96,171,14,160,85,229,80,168,124,11,0,4,24,6,176,205,5,208,170,58,91,32,223,175,45,195,28,13,96,139,4,208,2,57,9,208,127,168,100,236,75,0,24,64,19,109,164,173,34,128,6,186,231,67,181,246,5,52,62,174,175,4,48,105,0,109,140,28,11,197,199,203,75,122,45,128,25,11,160,137,136,182,144,109,237,169,225,182,118,60,19,168,170,200,54,127,148,68,219,159,173,34,128,238,82,149,210,212,191,128,248,149,69,68,109,197,221,224,31,213,216,5,0,96,109,236,15,249,252,138,204,150,202,139,235,46,142,27,83,120,83,121,73,158,14,195,244,141,91,42,47,219,18,223,31,56,8,40,237,87,94,50,15,133,97,234,207,91,54,71,180,169,252,61,93,207,180,125,216,42,2,104,34,162,153,166,130,115,161,242,42,0,112,28,125,29,128,45,246,131,43,82,220,23,90,123,204,255,59,0,12,160,103,128,170,61,70,32,231,85,22,206,6,192,0,122,27,245,247,116,61,211,246,193,108,233,12,16,17,109,1,2,232,203,182,116,38,170,140,202,194,45,157,135,109,145,8,22,109,233,60,208,102,241,119,117,61,211,246,129,53,208,0,60,207,155,103,76,247,94,40,169,107,197,90,71,145,239,30,237,126,104,248,217,225,23,54,229,126,43,163,90,236,11,216,184,81,227,192,145,188,106,225,145,48,12,159,157,201,253,4,253,65,80,140,217,37,64,99,207,253,5,11,22,236,216,219,219,251,114,85,179,187,88,251,162,21,39,147,203,165,30,6,80,154,129,221,138,239,15,236,163,106,227,128,206,19,145,181,166,168,233,204,234,204,242,142,242,28,4,189,118,212,14,150,28,25,16,193,206,128,228,98,49,60,182,161,206,163,64,181,215,123,215,110,98,139,129,26,51,71,85,87,3,165,199,115,185,92,216,201,190,55,71,121,112,221,129,221,141,209,1,85,187,208,168,89,87,130,125,186,80,24,121,176,211,145,38,54,166,236,248,126,242,120,0,187,148,151,74,119,132,97,56,60,176,112,160,175,208,173,251,3,118,190,177,88,83,80,231,137,85,171,86,166,163,235,205,159,191,251,156,89,93,235,95,161,142,36,69,204,90,167,128,199,83,171,83,169,86,251,216,18,101,109,104,104,168,103,116,180,180,31,96,125,64,103,171,74,222,24,251,88,54,155,205,55,167,173,142,98,33,86,186,21,152,91,125,93,213,190,213,247,19,187,87,151,173,117,238,108,53,194,204,84,246,181,33,13,163,51,40,142,140,188,21,247,253,196,201,245,69,89,31,134,233,43,171,89,67,253,15,173,38,240,125,127,111,192,217,77,172,244,192,41,13,207,153,51,231,193,229,203,151,143,119,146,143,160,63,8,172,177,187,149,4,253,70,205,11,162,54,204,172,202,60,8,160,56,213,99,106,165,220,9,188,123,47,177,88,100,197,22,141,209,212,156,57,115,30,90,190,124,249,56,172,216,72,99,59,59,201,102,36,30,143,47,42,149,76,96,12,6,196,218,23,75,48,217,124,62,253,112,115,62,147,125,201,129,82,151,150,207,167,226,128,250,22,112,80,227,121,53,127,11,195,212,29,45,246,21,243,125,63,80,53,73,0,174,49,230,41,107,205,202,92,110,197,19,27,113,248,48,198,216,218,39,5,64,164,188,84,253,158,81,181,190,170,142,3,38,84,29,127,40,159,207,175,239,116,219,155,242,179,27,88,56,208,55,222,101,247,20,129,11,96,68,196,102,123,122,122,30,26,30,30,30,107,78,235,251,193,155,0,27,7,0,85,201,231,114,233,223,76,76,147,60,1,208,29,0,64,172,147,206,230,87,254,177,57,77,220,11,78,82,177,93,229,165,13,55,185,153,238,245,12,192,113,221,228,190,14,108,220,138,204,117,20,171,91,125,7,18,181,178,93,7,208,158,231,205,19,137,125,22,138,83,213,218,57,16,64,32,176,2,140,206,42,60,227,121,193,55,102,205,138,93,220,234,11,99,58,202,193,79,215,167,0,124,66,160,125,128,64,69,1,171,0,156,23,125,55,241,109,149,210,69,185,92,238,153,153,216,95,193,177,139,165,242,120,88,4,203,227,241,248,221,214,154,51,5,56,67,43,63,89,42,6,2,133,239,37,151,137,202,215,178,249,212,181,27,187,191,184,27,28,171,162,159,131,218,67,202,191,141,2,40,96,29,129,239,37,111,131,200,185,237,190,24,171,231,166,88,208,243,224,200,108,1,42,97,130,162,88,0,124,63,113,83,172,104,62,213,38,128,51,113,55,121,170,42,190,1,216,94,21,3,104,249,51,5,98,163,190,155,248,234,88,97,228,226,118,65,234,230,40,15,241,248,192,107,85,75,231,65,237,81,213,188,169,40,12,4,61,61,179,151,123,94,242,236,86,63,62,205,231,7,27,83,118,202,157,106,95,15,0,16,243,169,184,151,216,163,0,251,33,40,186,80,57,78,71,44,124,63,121,81,239,250,174,47,99,87,140,141,140,20,62,47,24,253,132,194,204,129,2,170,138,162,3,248,94,242,215,86,99,167,229,243,79,102,163,187,216,204,101,45,230,251,137,211,70,70,10,159,22,32,40,191,84,254,180,213,154,130,239,38,175,176,136,125,57,154,199,234,40,22,218,220,67,66,241,153,104,183,9,99,236,241,104,28,97,102,202,251,218,144,232,232,12,26,141,176,128,189,35,205,57,0,193,114,0,87,2,229,160,185,154,75,17,209,132,155,88,98,69,46,133,98,119,0,149,178,96,240,194,186,151,114,158,23,156,151,203,165,254,163,221,254,227,241,248,222,176,206,231,139,208,119,213,142,69,20,42,130,184,151,124,84,5,231,135,97,250,170,78,143,167,217,192,194,129,190,66,151,158,3,232,71,161,218,171,149,235,73,173,96,221,186,151,214,248,126,226,2,64,35,71,212,120,18,170,22,45,74,190,210,49,248,55,181,56,194,8,42,171,24,24,0,190,151,12,5,114,65,54,151,250,94,117,125,117,116,168,225,252,213,189,3,42,239,168,45,137,94,4,32,26,64,139,239,39,143,131,226,171,80,188,172,154,43,181,10,65,9,190,155,124,0,70,62,211,38,232,110,203,24,163,54,122,155,88,194,174,190,155,252,62,128,147,213,150,47,138,202,217,135,72,215,90,223,79,124,35,22,51,151,164,82,169,209,118,219,220,148,159,157,235,46,142,59,82,56,183,0,251,97,1,186,170,159,138,170,193,200,72,33,21,119,147,23,101,243,233,203,17,13,210,173,14,65,228,210,242,177,32,131,242,53,82,251,60,251,251,135,22,64,11,87,86,175,49,21,251,4,128,151,71,211,248,190,239,169,234,79,170,229,65,12,222,180,161,188,78,227,122,22,207,75,156,40,144,51,1,236,87,254,6,70,237,59,208,243,146,215,56,142,158,159,201,100,254,119,67,121,160,237,215,118,219,132,195,247,253,33,65,236,142,242,133,134,57,45,146,204,19,232,5,99,35,197,235,135,118,29,218,105,166,246,59,176,112,160,207,152,238,223,11,240,21,1,250,90,36,153,3,145,207,9,98,119,248,190,191,219,76,237,183,70,177,167,90,115,191,0,103,180,73,177,191,138,94,227,121,201,243,49,245,142,152,226,121,201,115,85,244,87,0,14,105,147,230,8,168,222,225,251,201,55,55,191,209,215,215,183,131,72,247,213,2,124,5,192,236,214,249,151,99,139,142,222,237,251,254,80,243,91,113,55,121,134,10,190,13,160,183,197,154,189,16,249,151,222,238,89,151,161,69,185,223,28,229,193,119,147,31,86,107,255,11,42,71,181,76,160,216,83,128,95,251,110,242,227,173,222,158,129,178,83,175,225,83,249,166,66,62,10,160,171,69,62,206,26,237,45,92,49,58,90,184,70,128,243,208,250,124,188,85,164,120,167,239,251,94,203,99,169,28,207,166,42,107,243,231,239,62,199,247,146,215,66,229,146,122,64,219,160,11,130,147,141,20,255,211,243,6,167,245,104,119,115,238,107,74,84,95,101,69,254,8,96,247,22,239,122,2,189,34,238,38,79,107,181,106,220,29,56,74,173,185,71,161,239,106,185,105,96,15,40,174,244,188,228,191,98,35,58,100,187,110,240,242,66,151,253,47,64,63,137,22,215,163,0,125,80,185,4,42,255,58,217,118,124,63,121,180,99,112,31,128,35,218,37,81,232,119,124,55,184,112,170,121,156,184,175,224,139,80,252,2,64,235,207,80,112,32,84,111,143,187,241,99,166,179,31,21,189,10,130,147,219,188,189,0,42,23,150,10,184,110,112,112,112,110,171,4,155,242,179,139,199,227,7,26,41,222,171,144,83,209,226,187,65,128,64,5,151,249,94,242,218,232,247,160,45,15,169,88,149,72,46,74,190,60,186,94,151,25,59,180,105,83,47,115,221,160,161,220,138,141,29,216,176,44,246,254,169,228,189,83,67,67,67,61,190,23,124,79,32,63,5,176,95,171,52,2,252,147,45,201,189,241,120,240,198,77,145,7,218,54,108,151,1,244,208,174,67,59,169,58,215,0,216,187,246,162,234,157,10,156,39,192,23,160,122,103,237,101,232,219,70,103,21,90,6,93,83,21,4,65,111,161,203,94,9,213,215,52,188,161,120,0,192,159,154,146,239,13,141,253,34,145,72,236,50,221,253,182,16,13,122,158,84,200,205,0,94,140,38,16,224,60,207,75,28,63,165,141,122,137,247,85,130,95,0,128,2,107,160,248,33,68,63,137,114,96,91,173,81,233,133,226,23,241,120,252,85,209,245,187,99,189,159,22,104,244,199,105,45,4,23,65,244,115,128,60,220,144,127,117,46,71,228,199,33,8,130,126,21,124,57,146,38,7,200,37,2,124,65,129,165,245,60,201,7,226,110,208,240,195,179,57,202,67,220,141,31,3,193,15,155,94,126,14,138,27,209,220,217,69,112,105,249,145,104,221,38,45,59,34,119,85,182,19,205,195,113,80,252,99,228,149,103,32,248,21,128,231,234,73,16,136,198,46,222,192,214,55,69,89,147,222,238,209,139,1,188,61,178,141,71,33,184,72,33,103,8,36,58,54,242,203,4,165,95,244,247,15,45,0,128,146,226,54,136,158,34,229,27,165,104,38,254,13,162,167,84,255,89,107,170,53,79,27,189,175,13,30,132,200,250,218,62,129,223,70,222,122,36,154,23,0,23,180,217,68,52,48,93,7,209,155,20,104,120,50,163,130,111,55,223,76,249,190,191,143,138,189,9,245,27,163,81,40,110,84,200,25,80,189,16,64,173,169,130,0,159,143,123,193,169,157,28,79,213,208,208,80,143,17,252,20,19,2,123,121,184,242,249,23,34,47,182,12,18,129,242,53,13,197,207,16,13,228,84,255,32,192,153,149,224,167,222,212,65,244,236,132,155,88,2,0,82,146,225,234,185,107,58,31,55,52,158,87,169,61,233,73,184,137,37,80,253,98,116,255,10,189,66,128,51,161,248,125,195,235,98,174,24,88,56,208,234,6,118,99,60,211,234,59,64,161,111,27,27,43,125,161,57,241,166,252,236,22,45,26,72,170,53,55,163,241,154,45,64,245,15,209,237,86,188,125,116,118,225,223,81,249,14,174,52,165,89,85,125,179,104,180,225,187,221,138,121,93,243,254,12,244,213,209,101,5,14,171,231,93,110,201,100,50,207,53,175,211,108,35,174,103,140,140,20,62,15,232,41,77,233,87,10,228,22,212,127,163,0,96,142,90,253,149,235,38,247,223,80,62,104,251,180,85,52,225,40,136,168,137,60,221,19,193,219,125,63,113,224,36,171,0,138,61,219,189,53,54,171,112,186,160,214,54,238,69,136,44,9,115,233,104,147,130,175,250,126,226,76,168,84,107,53,222,231,251,193,85,97,152,250,61,166,161,56,174,31,129,224,13,145,60,222,104,17,251,100,245,177,175,231,121,243,12,98,231,41,240,233,74,130,125,108,209,124,22,192,231,166,179,223,150,4,191,138,21,229,211,213,166,16,7,28,112,64,215,218,85,107,95,111,69,254,3,40,119,188,17,200,183,134,118,29,250,99,39,109,127,251,251,135,22,8,10,151,215,15,13,223,29,31,95,127,118,180,185,132,239,251,151,64,157,107,1,236,15,160,23,214,252,59,128,195,129,74,219,210,145,194,217,168,111,224,129,174,162,121,235,202,167,86,174,169,188,242,245,184,151,60,95,129,115,43,203,71,248,254,192,62,97,184,242,33,0,40,141,227,16,72,61,160,176,26,59,52,242,56,253,124,223,79,254,0,138,15,3,128,26,61,6,192,53,213,180,155,186,60,44,88,176,96,71,21,19,13,158,95,84,232,9,115,231,238,248,199,74,59,85,241,188,193,221,12,74,63,86,160,252,163,162,122,1,128,63,160,242,136,115,134,202,78,83,109,148,60,12,41,30,31,134,225,223,202,219,8,14,17,232,157,104,170,121,82,200,169,179,102,197,174,24,30,30,30,235,235,235,219,161,59,214,115,81,165,134,10,10,125,87,50,153,252,84,58,157,94,133,118,102,184,172,185,110,226,13,16,124,164,190,125,61,37,27,102,126,88,61,87,0,224,251,193,79,160,122,35,202,65,230,222,177,88,241,99,0,190,148,207,167,239,1,112,79,60,30,119,97,205,191,213,54,33,230,215,217,236,202,59,209,100,58,251,218,208,113,132,97,56,2,224,7,0,224,121,201,164,0,213,167,50,217,48,204,252,160,213,58,6,144,9,237,28,4,39,246,246,118,221,80,105,90,36,158,151,56,94,32,215,71,214,58,26,192,223,106,139,234,124,11,213,224,91,228,46,213,194,9,185,124,189,127,64,16,4,95,43,142,235,101,16,188,23,0,20,250,157,254,254,161,27,86,175,30,94,187,161,99,2,128,145,145,241,15,8,164,22,64,41,244,10,99,244,188,106,59,241,114,219,111,231,77,80,252,28,237,158,52,1,40,21,112,28,128,121,145,227,60,57,204,101,126,4,84,219,16,15,126,69,80,250,19,0,31,0,74,130,19,0,220,154,94,147,94,137,202,121,245,221,228,41,144,202,83,3,197,253,97,174,245,121,181,70,62,24,249,137,89,39,198,46,9,179,217,191,84,150,47,118,221,196,219,140,200,205,149,229,93,138,49,251,22,0,63,238,228,124,180,241,184,24,251,190,108,54,187,12,229,166,16,146,92,148,124,121,73,244,123,16,121,109,249,112,113,70,60,30,191,38,91,207,199,38,253,236,98,70,255,77,17,233,116,41,114,78,119,183,249,238,138,21,43,214,1,128,231,13,190,76,80,186,28,213,102,96,138,15,197,221,224,230,108,62,117,19,128,162,64,111,170,126,47,136,202,107,0,252,180,178,37,71,128,119,55,239,79,68,142,2,240,163,250,11,90,187,73,85,177,183,110,40,191,0,48,213,235,217,247,131,131,161,122,94,125,159,88,110,45,78,204,231,210,15,2,176,190,239,207,18,141,189,91,161,63,169,164,232,53,130,31,1,56,16,147,183,209,167,237,208,86,89,3,45,192,63,67,229,251,147,254,3,254,161,205,234,49,5,62,88,219,150,226,156,22,237,113,139,97,152,249,122,165,102,160,146,206,254,35,166,199,192,224,255,213,150,84,255,16,235,150,19,162,109,38,115,185,220,51,217,92,250,44,0,63,175,165,19,61,117,193,130,5,59,78,103,199,170,19,30,227,13,119,119,59,39,69,219,17,47,93,186,180,144,201,103,110,109,8,22,128,69,163,179,11,111,64,7,98,177,194,81,168,215,136,173,234,233,113,206,105,110,107,28,134,225,223,20,82,123,164,172,192,171,19,253,137,61,1,96,108,108,108,55,68,155,10,24,249,76,36,120,46,31,134,148,206,71,67,237,165,221,167,246,151,216,201,154,85,40,202,67,131,85,151,222,129,250,205,227,38,47,15,61,61,179,223,8,160,94,43,41,242,174,92,46,243,235,72,39,47,205,229,86,60,81,180,248,68,100,181,253,19,110,162,90,67,179,105,202,142,200,137,213,224,185,188,141,212,125,16,92,222,144,4,122,121,46,151,186,188,218,238,123,205,154,53,47,137,131,127,139,166,177,5,91,15,150,54,67,89,19,145,72,109,176,92,87,9,54,27,226,202,48,76,253,30,162,181,27,50,85,253,0,54,162,194,96,115,238,171,19,182,105,223,2,156,21,134,233,43,35,237,242,53,151,203,220,128,72,121,87,173,215,236,185,238,192,238,168,6,64,0,68,74,103,54,119,174,77,165,82,207,247,142,118,157,6,32,87,125,205,113,198,55,216,30,181,158,39,249,80,100,241,190,89,179,186,79,141,118,178,12,195,112,36,12,211,55,138,74,115,83,165,134,178,163,170,175,140,44,252,33,12,211,13,55,46,185,220,138,39,32,250,245,200,234,71,119,154,199,38,6,138,122,147,50,213,11,26,130,86,0,249,124,230,22,0,191,172,46,91,193,228,21,56,17,214,218,9,205,40,172,226,61,149,125,84,219,17,107,122,85,250,81,139,174,19,17,121,202,163,106,222,89,253,123,83,126,118,174,187,56,174,208,218,190,20,248,74,24,166,46,172,6,207,64,249,124,27,71,223,222,240,52,176,18,168,151,87,50,119,68,94,63,14,128,3,0,241,120,124,15,52,214,106,87,246,161,199,245,245,245,237,80,222,255,96,2,64,173,89,94,169,36,255,221,156,126,102,104,244,73,87,206,218,216,155,242,249,244,50,84,130,227,48,12,71,178,185,212,21,149,39,63,85,251,251,126,208,80,163,78,4,108,37,53,208,51,41,145,72,236,110,75,88,92,93,182,130,185,190,159,252,72,171,180,162,82,172,118,238,81,72,187,54,189,29,113,221,129,221,160,182,86,43,174,130,203,218,116,18,177,198,234,55,173,145,19,43,203,115,123,122,118,56,16,88,59,165,142,43,147,82,92,18,253,98,140,10,195,244,239,124,47,185,12,229,90,98,192,226,205,232,100,76,90,139,215,71,126,254,30,29,31,47,189,211,247,147,45,210,105,111,244,103,82,141,121,25,128,229,142,227,132,5,91,222,167,181,106,28,167,248,130,231,5,135,24,69,160,70,163,65,224,11,168,5,218,90,175,157,130,121,34,26,91,136,20,255,226,121,193,151,68,240,152,227,232,227,233,116,250,23,104,209,30,112,115,148,7,85,188,161,190,99,249,75,24,166,254,208,42,221,170,85,233,101,190,159,168,125,113,23,85,94,2,102,180,236,212,179,161,120,32,204,149,107,239,155,60,216,144,119,49,215,52,39,200,100,50,43,125,47,185,14,149,199,239,10,211,190,201,194,204,151,53,17,160,214,4,71,129,231,219,125,94,176,226,87,235,107,5,8,92,119,241,162,169,116,242,219,204,251,234,72,115,13,180,211,37,87,182,76,168,122,31,164,28,80,10,164,118,33,138,104,180,220,62,163,106,246,243,253,228,132,118,160,163,40,0,42,207,2,234,1,128,168,217,171,147,252,249,190,63,4,197,193,181,253,169,92,210,174,211,173,211,141,171,139,5,252,59,234,205,56,26,42,116,44,228,27,2,124,27,0,140,99,139,137,68,98,47,107,77,92,44,22,169,81,167,124,152,120,121,173,83,37,208,23,4,65,239,100,157,239,218,48,10,169,5,166,49,197,152,235,38,247,119,96,227,106,76,125,120,65,171,59,64,106,221,162,55,186,9,135,64,174,207,231,83,203,90,189,151,207,63,153,141,123,137,239,41,228,28,0,128,226,36,0,231,0,40,109,202,207,206,152,226,107,163,183,102,177,88,249,188,55,203,100,50,207,121,94,240,29,1,190,91,206,158,190,115,112,112,112,238,138,21,43,214,149,96,238,53,245,65,117,230,249,190,191,103,24,134,15,171,74,189,253,179,224,219,80,236,133,242,141,64,87,44,214,123,48,128,219,140,41,29,24,217,255,51,171,86,165,27,190,135,102,76,249,124,86,254,196,21,237,175,81,251,115,192,249,26,170,163,22,89,251,58,112,12,113,106,178,85,6,208,10,156,47,162,147,15,146,174,242,30,180,168,133,46,149,100,97,52,138,18,224,43,173,251,126,79,232,25,191,31,202,231,107,163,134,7,50,70,23,69,55,215,85,50,143,180,75,91,148,226,163,166,225,41,186,186,27,179,207,118,196,177,147,125,17,168,2,191,145,106,80,35,232,232,135,19,70,19,145,222,244,71,64,219,116,250,105,10,97,173,160,31,40,215,156,0,248,159,184,27,63,70,28,243,85,168,179,167,64,203,155,108,247,249,168,212,2,235,92,46,245,151,184,23,220,162,208,183,85,118,211,7,232,119,161,64,169,8,248,94,242,207,162,114,121,87,175,249,101,52,160,219,28,229,65,84,7,171,63,188,10,189,171,253,17,65,91,61,186,223,20,101,71,4,119,181,124,221,218,167,84,234,113,140,106,97,184,85,62,1,60,138,74,71,81,145,246,237,88,103,186,172,5,65,48,183,88,136,222,56,233,41,80,156,210,50,113,83,99,135,152,22,22,2,232,56,168,221,156,251,218,72,143,183,29,214,209,96,85,173,204,72,61,216,19,177,253,145,235,116,30,20,45,155,52,148,69,142,201,104,162,179,44,197,188,134,27,217,88,251,142,96,169,84,106,212,243,18,55,10,164,26,212,52,60,34,207,231,83,143,13,44,28,232,43,196,244,92,181,230,19,213,91,215,232,119,66,243,29,113,177,88,156,141,198,118,172,157,40,230,114,169,255,241,253,129,125,97,237,215,74,6,111,50,0,20,166,241,74,109,156,143,123,231,41,238,163,78,117,210,202,16,21,185,59,178,223,5,3,11,7,230,175,124,106,229,154,77,250,217,89,245,34,55,7,143,78,214,36,75,213,62,28,157,155,124,116,84,251,1,172,203,231,87,100,124,47,249,8,170,125,73,172,115,16,128,135,69,205,146,200,119,231,237,80,164,33,229,154,116,17,121,29,128,219,84,113,88,109,212,19,224,58,204,204,80,170,13,6,7,7,231,142,143,149,106,55,251,34,104,121,19,3,148,107,162,61,47,184,171,218,39,71,69,90,212,6,209,246,110,171,8,160,155,167,242,86,197,47,115,185,76,219,194,15,0,190,159,220,15,58,49,128,54,42,59,233,196,86,132,157,218,232,21,197,98,231,232,80,59,5,167,240,98,187,180,249,124,126,189,239,37,71,81,109,18,97,177,235,198,238,23,0,98,128,68,127,153,84,245,249,73,243,170,88,83,253,101,82,96,176,163,157,168,76,187,83,77,220,77,126,76,5,151,109,228,89,46,245,140,196,78,28,237,29,63,7,34,173,218,140,31,172,162,7,143,143,149,206,11,250,131,35,171,77,10,54,75,121,16,227,70,146,78,121,104,194,25,44,59,181,98,160,170,45,107,133,213,152,98,244,168,122,122,122,90,238,75,129,98,100,240,177,90,196,189,169,203,218,248,184,51,199,200,140,12,79,188,65,155,115,95,27,67,129,182,237,90,197,74,169,90,102,26,154,213,88,179,75,139,86,212,51,70,44,118,137,150,213,82,169,212,178,156,85,25,96,149,54,44,214,5,65,208,95,40,216,223,163,205,72,9,51,201,243,130,67,160,246,143,144,150,35,206,76,139,170,54,134,222,144,13,140,243,47,207,68,191,90,198,98,186,11,128,53,155,246,179,51,243,170,251,84,96,210,177,246,99,49,60,31,29,150,207,152,200,13,180,234,245,16,217,27,0,68,244,53,11,22,44,184,86,161,181,230,110,34,246,94,53,78,8,173,30,135,190,3,192,23,5,56,182,190,69,189,109,186,71,211,202,232,168,236,100,34,31,132,177,58,105,127,11,81,173,125,55,25,72,71,29,131,105,251,178,85,4,208,51,73,13,214,53,132,61,138,211,97,180,131,113,125,69,49,141,187,98,53,120,174,177,22,177,107,14,218,4,83,190,239,207,130,214,59,196,9,100,70,198,131,174,42,149,156,73,127,36,68,176,75,189,242,74,58,155,14,85,117,53,68,246,171,172,115,157,138,253,207,78,86,19,152,63,3,149,9,56,68,47,139,188,181,86,129,235,43,79,26,106,63,56,170,242,229,118,143,79,43,29,208,206,25,88,56,240,205,98,172,120,176,26,115,56,20,71,35,58,186,6,176,184,232,232,119,0,188,5,128,110,158,242,160,33,128,125,0,192,64,167,220,158,125,6,203,206,6,251,60,168,170,145,104,188,213,162,253,102,121,187,229,246,141,0,160,45,154,198,84,205,116,89,235,237,213,23,198,163,159,142,202,215,97,108,171,90,242,9,198,181,123,74,83,251,110,206,125,77,129,137,252,209,246,188,171,65,173,223,181,52,124,238,246,217,200,106,15,66,180,229,163,250,102,34,166,163,227,81,131,231,59,45,171,21,109,43,7,10,5,61,75,162,193,179,232,31,69,177,20,48,89,21,91,44,191,132,3,42,195,49,110,180,3,14,56,160,107,205,234,167,191,131,122,31,140,2,128,107,161,58,12,131,250,4,57,42,239,6,208,81,59,253,40,85,141,86,216,194,78,242,196,6,0,140,181,59,217,200,10,93,93,213,155,221,77,249,217,217,103,34,219,158,244,137,103,177,40,115,77,67,133,150,212,111,146,141,185,179,26,28,43,228,173,189,189,59,92,173,86,187,42,25,185,43,155,205,230,15,56,224,128,181,107,86,63,253,12,202,181,232,123,38,220,196,18,27,105,255,12,148,238,235,228,184,166,106,246,168,172,27,157,85,95,182,70,38,31,142,212,232,194,106,141,191,138,62,181,41,242,68,91,183,237,46,128,22,41,61,173,90,255,61,49,49,189,189,221,96,233,139,22,13,36,141,209,93,202,235,21,95,154,206,126,77,209,174,181,78,253,91,167,100,74,251,162,105,200,169,122,30,101,111,141,252,8,169,65,251,17,14,58,80,4,52,26,57,57,130,253,1,252,181,77,114,81,145,37,245,47,65,125,178,163,157,24,9,171,63,156,170,186,174,93,111,247,161,161,161,158,145,145,226,30,213,229,177,177,238,149,0,80,140,217,37,145,199,147,80,200,81,185,92,234,127,162,235,6,65,208,95,44,104,109,130,132,106,0,209,188,77,237,210,84,54,149,189,25,192,205,0,206,46,143,205,91,250,164,0,213,14,140,71,199,227,241,189,178,217,236,35,155,163,60,8,52,83,173,4,84,72,243,120,168,13,73,125,63,249,225,234,130,181,88,154,207,167,151,109,201,178,51,85,155,186,172,173,88,177,226,5,223,75,22,80,25,41,68,197,254,111,46,204,252,180,85,90,207,243,230,1,93,241,234,242,234,213,195,79,119,120,24,155,125,95,155,139,136,121,170,222,142,31,115,251,251,22,92,177,116,233,210,66,171,180,137,68,98,175,82,201,116,1,128,227,232,154,86,105,154,25,99,215,218,82,103,101,181,18,184,70,3,210,232,195,11,71,128,51,35,203,63,11,195,204,251,155,183,81,25,189,100,90,86,175,126,102,175,90,51,34,0,16,253,88,139,166,84,226,123,193,201,145,154,225,142,119,219,60,19,161,129,61,20,104,236,172,27,101,129,134,239,136,116,58,189,22,216,180,159,157,10,86,71,14,104,119,223,247,189,48,12,115,173,210,58,192,254,209,58,135,158,30,212,182,63,54,246,210,3,61,221,179,171,215,204,60,107,245,159,107,219,181,122,11,80,238,68,236,187,201,27,171,157,136,173,152,175,212,206,171,226,129,232,168,34,51,105,248,217,225,23,162,125,55,68,245,0,0,191,104,149,182,92,17,81,111,23,15,232,166,110,142,69,91,161,173,114,20,142,233,232,233,233,249,27,34,61,148,181,132,211,219,36,117,28,99,175,22,232,50,129,46,19,117,90,14,90,223,169,29,119,221,113,24,130,149,213,101,43,206,135,209,230,252,107,201,68,219,89,190,216,221,109,38,109,174,50,101,130,115,130,32,104,217,134,207,247,147,71,71,199,26,22,69,103,189,161,45,238,141,108,255,164,74,143,241,9,70,70,10,71,214,206,41,244,254,238,238,23,123,202,251,145,133,145,100,47,54,7,207,0,80,42,104,67,7,174,234,136,4,163,163,163,70,160,247,86,183,91,28,183,13,237,84,115,185,21,79,196,98,56,191,97,93,107,146,192,230,41,15,22,184,39,178,248,122,215,77,30,214,42,93,34,145,216,19,138,31,84,255,57,142,153,3,252,157,149,157,169,154,249,178,166,10,173,117,156,19,200,25,229,97,209,90,137,125,186,254,121,217,75,16,137,126,98,99,177,134,167,7,170,218,234,124,206,200,190,58,20,153,228,166,101,94,102,132,138,212,110,102,4,8,158,90,245,76,203,241,183,227,241,184,107,75,242,72,245,152,180,160,123,183,74,215,172,187,187,123,24,64,237,70,72,197,249,231,161,161,161,158,86,105,159,90,245,244,251,208,80,243,88,231,121,94,67,153,81,232,132,39,90,229,161,51,49,249,56,199,18,237,163,48,97,190,58,0,128,163,182,225,241,188,41,78,44,135,9,55,113,36,208,48,182,241,52,218,125,201,7,22,45,74,190,178,213,123,174,187,56,14,145,79,85,151,43,195,17,22,129,77,251,217,57,165,198,113,224,69,157,9,195,206,1,229,201,174,84,26,106,252,127,27,237,83,82,25,121,233,150,72,62,15,175,254,173,34,119,213,95,151,72,51,141,250,121,149,242,88,243,83,214,225,245,12,64,106,179,158,42,228,253,174,235,206,111,157,206,121,59,34,99,148,75,73,239,105,157,142,182,103,219,93,0,61,60,60,60,166,144,218,163,47,133,124,212,247,19,159,12,130,160,246,216,219,247,253,89,113,47,121,14,34,53,1,226,232,213,211,217,239,242,229,203,199,69,81,107,162,32,208,99,124,55,184,32,58,219,212,130,5,11,118,244,188,228,185,209,225,189,4,184,180,221,40,6,157,18,153,240,101,191,184,56,174,63,110,254,242,240,253,224,117,208,198,201,62,44,98,55,117,178,143,162,237,138,78,144,209,37,98,127,24,143,199,27,190,184,61,47,120,69,116,162,21,1,46,203,231,243,79,3,128,10,26,106,73,170,195,219,213,215,77,188,95,129,134,137,5,170,53,208,97,24,142,64,34,147,29,136,156,222,28,192,23,10,218,60,236,212,179,192,230,41,15,61,61,177,155,16,105,175,106,68,190,231,251,254,62,209,52,174,187,56,110,75,229,169,112,43,158,200,102,87,222,3,108,217,178,51,85,155,163,172,1,242,179,200,194,126,128,115,105,95,223,226,232,13,152,248,126,242,237,209,26,76,21,68,155,7,97,189,172,111,24,98,81,108,100,252,219,25,222,87,39,12,80,127,12,46,178,24,155,232,233,96,101,220,244,218,196,59,42,122,145,239,39,143,70,164,70,53,8,130,126,9,27,152,196,0,0,32,0,73,68,65,84,88,231,155,245,181,228,225,76,62,115,123,39,219,31,30,30,30,19,200,55,234,175,232,171,70,70,198,191,215,60,171,94,220,13,142,173,204,26,26,21,25,162,46,183,14,64,173,236,138,200,62,209,64,124,96,225,64,95,204,140,255,12,209,113,162,91,16,72,189,157,184,145,150,157,233,74,226,52,60,158,87,99,26,218,92,47,90,148,124,165,21,105,158,4,105,42,53,208,19,130,109,199,224,170,230,239,128,69,139,6,146,142,20,175,70,117,228,7,0,208,82,109,88,202,77,249,217,101,86,103,150,3,248,117,109,219,192,133,190,159,56,17,145,114,24,143,199,221,174,88,239,247,0,173,229,91,212,78,168,73,87,200,31,91,236,226,153,254,254,121,181,9,173,156,104,133,75,148,49,45,59,55,111,72,167,215,179,81,27,189,158,61,99,98,63,12,250,131,232,236,162,38,238,6,199,170,34,82,134,229,47,217,85,89,6,208,52,193,118,215,132,3,0,198,199,95,186,180,167,123,246,49,168,78,55,173,242,205,98,65,63,226,121,193,85,128,206,22,197,241,10,212,154,4,64,245,139,153,76,102,197,116,247,171,82,250,46,172,57,182,58,80,62,68,63,59,62,86,122,79,220,11,238,0,0,133,30,130,198,105,100,151,117,245,56,181,113,78,23,44,88,176,99,79,247,236,103,81,157,232,66,113,122,152,79,79,249,199,186,188,111,28,103,208,117,132,239,37,111,65,249,135,107,62,84,27,199,81,21,253,92,62,215,217,80,92,171,87,15,175,141,187,193,41,42,229,192,82,128,195,213,154,135,61,47,113,133,8,150,193,202,65,128,190,55,178,202,51,48,246,162,250,98,233,142,72,179,218,57,214,145,59,124,55,113,17,12,70,161,242,143,104,49,162,74,116,76,92,85,92,42,168,205,156,231,27,177,143,249,110,242,70,0,183,193,200,142,209,89,198,20,88,83,44,142,214,134,112,219,212,229,97,197,138,21,235,226,110,112,114,101,138,115,0,186,15,212,121,200,247,146,127,18,197,239,33,114,144,162,248,206,134,149,68,78,65,100,132,143,233,150,157,45,106,134,203,90,46,151,190,205,119,147,151,66,42,79,11,20,31,238,138,21,223,238,251,201,31,137,98,181,2,111,137,118,32,86,200,173,185,92,186,97,120,188,53,107,214,172,247,253,228,114,84,38,92,82,209,203,125,55,249,22,72,185,38,216,41,226,139,233,53,233,149,51,177,175,78,168,32,21,185,245,24,242,253,224,54,168,166,42,219,252,107,46,151,250,102,219,149,167,200,170,124,220,136,222,143,114,155,95,15,138,223,122,94,112,43,128,223,138,234,96,177,160,239,71,180,246,77,229,44,76,97,244,161,158,89,177,31,143,142,20,63,88,173,89,20,200,73,99,99,165,163,125,47,89,13,172,124,133,182,27,167,191,170,8,149,255,128,104,121,108,116,197,89,163,163,227,187,249,126,242,215,176,178,79,65,236,123,1,153,16,60,55,7,171,42,250,56,20,111,171,108,227,99,190,159,244,160,229,27,125,49,114,101,54,155,250,67,46,183,242,127,125,47,249,56,42,51,39,170,232,85,158,151,60,16,208,199,69,228,245,40,143,27,223,60,173,245,116,123,243,237,94,249,14,248,37,128,151,32,136,65,237,59,180,113,63,191,203,230,179,209,25,42,55,233,103,39,198,126,74,173,57,24,229,49,235,187,160,242,51,223,75,126,92,32,143,43,212,168,197,177,136,142,213,15,249,126,54,159,189,165,121,59,198,148,254,91,109,83,221,156,226,198,104,115,147,212,234,84,202,119,147,15,160,113,60,237,245,170,133,191,96,35,116,122,61,103,242,153,187,125,55,248,122,109,220,118,149,99,139,142,190,209,119,147,191,20,145,162,133,14,42,244,240,200,221,209,122,49,165,15,97,19,140,10,66,91,191,237,50,128,94,187,118,237,255,37,251,146,39,20,99,184,62,50,3,221,222,2,189,0,104,252,102,20,200,79,157,110,153,145,64,36,12,195,17,223,247,79,128,58,215,163,94,155,153,80,232,132,182,125,0,150,57,69,28,191,34,87,175,65,156,213,53,235,21,182,254,5,91,232,42,154,235,91,172,55,21,115,1,156,216,234,13,129,92,175,40,125,107,42,27,203,230,83,215,196,221,164,175,82,159,104,67,32,39,65,113,82,83,125,205,58,171,56,38,223,56,185,194,112,220,75,126,94,81,155,142,123,1,68,190,54,225,103,74,176,18,138,129,230,125,231,114,233,219,226,94,242,76,69,164,230,160,60,152,255,113,208,198,141,24,149,79,174,89,179,166,214,134,121,115,148,135,108,62,117,147,239,39,78,169,76,242,83,245,6,21,188,97,194,111,177,224,228,48,76,253,87,244,165,233,150,157,191,3,51,90,214,10,165,209,115,186,156,222,121,40,207,62,7,0,187,64,113,86,115,113,81,96,169,49,165,147,48,49,136,80,64,191,15,72,53,48,157,19,157,20,162,212,85,170,149,225,25,216,215,6,25,163,183,219,146,172,66,117,38,184,114,211,150,215,0,128,136,182,108,231,186,177,242,249,212,99,158,151,56,174,210,60,160,220,166,31,186,4,192,146,9,245,170,162,159,200,230,86,182,170,81,108,107,120,120,120,204,117,131,247,155,242,227,248,221,203,219,71,31,128,247,77,72,220,230,122,6,0,11,231,34,65,241,24,65,117,38,65,57,22,192,177,13,35,81,52,173,223,220,233,85,85,126,33,208,179,234,47,68,166,167,47,161,90,51,91,180,170,31,55,34,181,217,239,4,56,3,144,230,139,191,109,94,167,232,9,212,111,118,223,94,201,87,179,7,197,216,211,209,84,150,54,229,103,151,205,102,159,244,188,224,24,129,254,18,245,25,9,15,86,232,193,205,105,21,184,102,124,252,165,51,91,229,60,155,205,62,234,123,201,12,128,90,141,191,64,254,212,156,78,4,55,41,34,1,180,226,87,97,46,28,233,52,191,19,179,212,217,245,28,235,198,23,139,69,204,67,101,102,90,0,189,16,156,160,152,48,11,212,115,10,188,35,204,102,219,14,27,74,219,183,173,162,9,71,65,54,106,236,158,73,215,73,175,73,175,116,28,93,2,149,175,161,97,118,187,134,13,156,159,205,165,62,188,17,3,243,183,21,134,97,110,108,124,253,81,149,64,177,85,239,244,117,80,189,48,214,37,71,84,166,164,173,41,85,107,31,203,174,105,154,169,175,99,98,236,65,208,54,19,86,40,30,16,149,127,202,230,82,239,174,76,53,60,37,217,124,250,34,8,222,12,160,93,79,234,199,33,230,181,149,41,88,27,215,205,165,47,80,52,182,85,142,120,70,161,111,83,197,85,213,23,76,83,249,205,230,210,23,67,240,14,180,249,60,1,132,86,245,152,108,62,117,109,243,27,155,163,60,132,97,230,7,98,204,235,32,218,242,71,77,32,215,41,112,88,101,198,181,22,235,111,124,217,217,82,54,85,89,91,179,102,205,75,97,62,253,1,40,78,215,54,157,212,160,184,81,164,116,84,116,22,188,168,222,222,238,239,65,113,105,171,247,102,122,95,27,146,201,100,158,19,107,223,13,193,242,13,36,237,236,187,208,78,158,46,151,203,252,201,148,244,112,141,76,105,223,100,189,66,223,25,134,153,13,158,159,86,242,249,212,99,93,5,243,58,64,46,65,235,113,153,215,137,202,123,196,154,182,109,152,243,249,39,179,177,242,228,58,79,180,76,32,184,218,113,240,234,232,75,170,141,237,156,115,185,212,125,10,253,40,34,205,65,90,239,43,243,159,162,246,216,54,121,133,66,206,85,109,232,31,177,241,191,157,82,122,171,40,62,214,230,221,85,80,253,236,216,248,250,195,179,217,108,203,78,181,155,242,179,203,229,82,247,137,177,175,129,68,166,216,110,244,164,40,62,150,203,165,79,108,158,105,54,162,4,149,134,182,204,69,149,137,77,54,140,105,152,106,91,32,29,141,220,212,78,167,215,115,42,149,26,13,195,244,201,16,156,44,229,241,236,39,82,92,105,85,14,203,229,210,155,100,72,61,218,54,76,183,3,243,102,225,186,238,124,99,98,199,85,151,99,49,115,75,219,9,4,106,235,36,142,52,166,92,91,160,138,85,185,92,230,215,237,210,122,158,55,79,164,107,31,64,93,64,119,80,197,152,136,189,39,12,195,150,67,86,249,190,191,155,106,236,45,213,229,241,241,151,126,88,253,50,241,253,224,245,170,120,5,80,110,215,152,205,165,174,104,183,223,193,193,193,185,133,145,194,190,16,199,5,32,112,36,47,82,122,56,147,201,60,215,42,189,239,37,239,69,181,153,129,224,205,97,152,254,93,171,116,205,92,55,113,100,180,118,165,88,234,90,184,122,245,240,218,100,50,185,168,88,212,61,1,120,70,245,121,53,177,84,24,174,124,4,77,19,26,212,183,227,206,22,233,174,117,82,83,149,223,229,243,43,31,111,179,91,241,253,129,125,172,45,37,13,100,33,140,26,99,145,50,221,230,174,13,5,160,174,59,176,187,3,61,76,141,141,1,229,97,152,70,70,122,238,121,250,233,199,95,244,188,228,161,34,229,78,49,214,202,255,182,10,196,131,32,216,185,88,212,35,16,153,169,80,21,171,68,236,159,58,9,212,166,90,30,54,134,235,14,236,110,140,29,84,213,5,170,50,12,20,158,168,182,7,239,196,84,203,14,0,120,94,226,29,34,229,90,43,99,241,104,38,159,185,187,57,141,239,251,67,128,169,61,94,143,197,204,207,90,125,94,158,151,120,87,125,2,21,243,80,117,250,243,153,42,107,147,93,99,205,42,163,176,236,47,162,30,160,187,2,162,166,164,203,50,171,50,181,41,122,39,19,4,193,206,227,227,118,47,71,204,110,42,182,11,0,10,133,174,155,214,172,121,114,194,208,85,211,221,87,7,28,215,29,24,50,198,238,85,47,191,38,27,134,169,223,3,128,235,38,15,51,70,247,2,0,85,172,203,229,50,215,181,218,136,231,13,236,39,82,58,168,146,110,44,151,107,61,122,8,80,30,66,178,100,228,101,86,116,145,136,237,86,197,243,64,233,182,92,46,55,35,195,103,150,191,191,187,247,46,207,32,104,119,4,228,37,107,99,119,229,243,79,102,125,223,247,0,83,157,70,123,36,12,51,63,111,94,191,220,113,211,249,7,84,102,214,83,197,88,204,202,95,210,171,210,143,249,190,223,11,152,200,147,13,251,243,86,215,184,239,251,179,172,117,94,110,12,246,0,116,135,242,171,206,159,43,237,138,107,250,250,22,47,236,118,74,111,40,231,19,16,107,94,128,83,186,43,155,205,230,131,254,32,40,198,236,146,74,30,158,171,76,153,190,65,229,252,215,243,88,40,140,93,181,102,205,154,151,202,163,3,21,15,22,65,47,32,207,2,18,2,197,135,166,114,51,57,213,207,206,243,18,239,7,76,101,232,64,125,104,178,0,49,30,143,187,165,146,236,41,130,69,34,242,146,136,205,206,153,51,231,193,229,203,151,143,119,112,204,251,0,166,60,209,146,154,66,171,223,65,215,117,103,27,19,171,213,18,139,232,111,54,246,6,52,106,42,215,51,128,88,98,81,98,63,21,19,183,98,231,56,138,213,69,116,61,182,41,102,17,165,109,207,86,17,64,83,185,211,76,161,203,86,111,26,114,177,46,25,234,180,38,52,225,38,150,88,169,119,236,40,20,99,125,109,190,76,136,166,133,101,141,136,136,182,7,91,69,19,14,2,10,221,182,54,236,145,2,63,158,201,102,37,68,68,68,68,212,57,6,208,91,13,57,164,250,151,49,182,229,99,91,34,34,34,34,218,244,182,203,81,56,182,70,98,177,76,141,158,34,106,10,217,108,182,229,76,121,68,68,68,68,180,233,49,128,222,74,100,243,169,141,154,161,137,136,136,136,136,102,22,3,232,237,128,148,100,24,93,26,153,226,249,255,94,106,159,154,104,227,177,172,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,109,181,156,45,157,129,109,144,248,254,192,190,115,230,236,244,218,157,119,222,233,249,23,94,120,225,197,45,157,33,34,34,34,34,154,57,102,75,103,96,91,19,119,147,31,132,218,7,5,114,157,90,115,175,239,251,67,91,58,79,68,68,68,68,52,115,24,64,207,48,43,88,18,89,76,168,154,195,182,88,102,136,136,136,136,104,198,197,182,116,6,182,53,34,242,4,84,107,203,170,120,114,166,182,237,251,3,7,1,165,253,202,75,230,161,48,76,253,121,166,182,77,68,27,143,215,38,17,209,246,133,1,244,12,235,238,54,23,23,198,74,115,20,152,175,144,123,242,249,244,127,207,212,182,85,237,49,2,57,175,178,112,54,0,254,72,19,253,29,224,181,73,68,180,125,97,0,61,195,86,172,88,177,14,192,25,155,98,219,34,88,4,221,112,58,34,218,188,120,109,18,17,109,95,182,138,0,58,232,15,130,98,204,46,1,0,177,230,133,108,62,117,45,0,241,188,96,63,17,244,3,118,190,49,88,150,201,100,254,183,213,186,214,216,221,74,130,126,163,230,5,81,27,102,86,101,30,4,80,236,100,223,241,120,124,49,74,177,197,86,74,125,128,217,65,196,150,0,153,240,83,105,173,220,157,207,167,30,139,199,227,139,85,229,136,234,235,177,152,249,89,42,149,26,109,78,239,251,254,44,160,107,55,177,197,64,141,153,163,170,171,129,210,227,185,92,46,140,166,75,246,37,7,74,93,122,36,0,64,113,64,237,13,193,65,190,159,56,185,158,210,252,45,12,83,119,180,56,4,241,253,129,125,84,109,28,208,121,34,178,214,20,53,157,89,157,89,222,238,152,125,63,121,60,160,187,86,142,236,246,48,12,135,93,215,157,239,168,179,135,58,102,129,170,238,152,203,101,126,218,246,164,181,17,4,65,175,29,181,131,37,71,6,68,176,51,32,185,88,12,143,165,82,169,213,83,221,22,48,161,92,188,152,205,167,174,1,32,137,254,196,30,106,116,200,138,204,5,100,184,88,28,125,104,205,154,53,47,117,178,77,207,243,230,25,211,189,23,74,234,90,177,214,81,228,187,71,187,31,26,126,118,248,133,104,58,223,31,216,23,40,29,92,93,14,195,204,143,0,216,198,52,193,235,1,187,91,37,127,197,108,62,245,147,230,253,37,220,196,18,107,16,148,151,228,233,48,76,223,56,181,179,48,35,231,53,182,104,81,114,223,152,88,223,138,236,44,34,79,139,216,167,178,217,236,82,160,179,176,112,254,252,221,231,244,244,140,237,5,216,184,136,116,25,171,107,75,18,75,231,114,43,158,232,244,56,92,119,96,119,99,116,64,213,46,0,228,89,145,82,38,12,195,71,218,229,193,117,147,135,25,163,123,1,128,42,214,229,114,153,235,90,165,139,199,227,7,170,202,254,229,37,89,31,134,233,43,171,239,181,42,235,243,231,239,62,103,118,247,200,126,37,193,32,32,207,136,148,30,15,195,112,184,121,187,51,112,109,18,17,209,86,74,182,116,6,58,225,121,137,55,8,228,63,1,0,130,229,198,232,219,108,17,63,129,200,107,107,137,4,239,13,195,244,85,213,197,120,60,190,55,172,243,121,133,190,171,121,123,2,60,170,130,243,163,233,155,197,227,241,87,169,202,249,80,57,170,147,60,42,244,157,185,92,230,6,223,15,222,4,213,223,85,95,143,117,201,46,169,84,234,249,72,82,19,119,147,167,170,224,27,0,122,155,54,51,10,213,175,142,21,70,46,94,187,118,237,255,1,149,0,75,228,143,27,204,128,224,162,48,76,127,166,225,24,220,224,88,21,253,28,128,67,90,172,113,27,68,206,109,213,86,211,247,146,127,2,112,68,101,187,239,128,197,34,8,190,6,96,118,37,73,46,204,165,253,13,230,169,194,117,221,217,34,93,159,18,224,188,200,54,34,121,215,155,98,69,243,169,212,234,84,170,211,109,2,77,229,2,242,48,4,39,171,234,183,5,145,96,166,108,29,68,191,26,134,153,139,0,148,90,111,203,155,39,18,251,44,20,167,2,152,211,244,246,51,10,249,198,172,89,177,139,135,135,135,199,0,192,247,131,131,161,122,95,53,129,85,243,242,124,126,229,227,209,149,124,47,121,15,128,67,171,203,198,209,197,153,76,102,69,83,154,101,0,94,1,0,80,253,82,152,207,252,75,167,199,63,3,231,85,226,110,112,146,138,158,1,96,239,22,239,255,214,148,244,51,147,221,108,45,88,176,96,199,158,158,29,206,130,234,105,0,22,52,191,175,192,55,128,226,87,115,185,220,51,237,182,225,121,193,33,2,253,2,128,163,91,188,125,159,2,231,231,114,233,223,52,191,17,247,146,255,172,192,151,1,64,128,255,206,230,210,135,183,218,190,239,39,78,135,202,183,80,78,184,60,12,211,123,213,222,107,44,235,239,133,213,125,32,242,41,52,95,155,170,119,26,139,255,23,61,23,211,185,54,137,136,104,235,182,245,141,194,161,8,108,73,110,111,8,158,155,196,221,129,163,212,154,123,90,5,207,229,77,96,15,40,174,244,188,228,191,162,197,77,68,124,81,252,53,106,205,253,157,6,207,21,149,237,232,164,55,37,113,55,121,134,10,190,141,137,193,51,0,244,66,228,95,122,187,103,93,134,233,125,54,226,121,201,115,85,244,87,104,29,60,3,192,17,80,189,195,247,147,111,158,116,75,138,11,32,184,20,173,2,180,14,244,245,245,237,32,210,125,181,0,95,105,187,13,149,99,139,142,222,61,189,33,255,116,55,168,222,215,34,120,6,128,185,80,185,208,119,131,139,91,173,233,251,254,144,32,118,7,20,159,193,196,224,25,0,230,9,244,130,177,145,226,245,67,187,14,237,4,0,59,237,52,123,25,128,117,213,4,34,165,131,162,43,120,158,231,35,18,60,3,128,181,104,24,145,197,117,23,199,81,13,158,1,168,200,93,147,31,99,221,116,207,107,16,4,189,158,151,248,177,138,254,24,173,131,103,0,120,179,117,100,169,231,5,45,203,80,60,30,119,123,186,103,223,10,213,47,162,69,240,12,0,2,156,105,16,187,107,96,225,64,95,171,247,125,63,113,162,64,239,69,235,224,25,0,14,17,224,215,158,151,60,23,19,175,213,78,43,0,58,75,167,248,30,68,62,135,86,215,166,200,107,173,35,247,36,23,37,247,232,112,159,68,68,180,13,219,250,2,232,114,176,144,104,247,166,239,251,251,168,216,155,80,15,132,70,161,184,81,33,103,64,245,66,0,181,71,202,2,124,62,238,5,167,54,173,63,75,141,249,65,195,70,5,63,134,232,167,20,122,197,132,29,42,78,135,232,41,170,230,225,13,101,60,8,130,126,149,114,141,89,69,14,144,75,4,248,130,2,75,235,155,148,15,196,221,224,93,0,32,37,25,134,232,41,16,61,69,129,104,77,226,13,213,215,33,122,10,32,181,26,58,207,75,188,175,18,88,85,182,135,53,80,252,16,162,159,68,57,120,175,54,41,233,133,226,23,241,120,252,85,147,100,251,101,27,58,174,201,116,199,122,63,45,208,99,34,47,173,133,224,34,136,126,14,144,232,57,243,160,206,229,216,248,167,34,209,160,167,32,144,91,4,120,180,33,133,232,39,124,63,217,16,168,13,237,58,180,147,170,115,13,162,65,164,234,157,10,156,39,192,23,160,122,103,237,101,232,219,70,103,21,46,3,96,150,47,95,62,14,193,13,181,77,195,52,212,126,138,196,14,70,19,81,28,25,93,118,80,106,8,246,199,199,215,223,223,193,113,2,152,254,121,45,142,227,95,4,114,82,244,53,5,82,16,252,10,192,115,145,151,123,5,122,67,208,31,4,209,180,190,239,207,210,146,92,141,137,55,104,203,32,250,71,0,133,200,118,247,24,239,210,159,5,65,208,16,152,198,227,193,27,161,242,179,166,245,159,83,200,205,0,214,70,95,20,224,43,190,155,252,80,243,121,152,97,209,155,167,39,4,114,11,128,245,145,215,230,90,131,31,160,242,189,185,49,215,38,17,17,109,27,182,138,54,208,170,16,105,14,171,20,87,25,213,139,209,133,21,153,76,166,254,131,175,206,183,80,13,166,68,238,82,45,156,144,203,215,219,21,7,65,240,181,226,184,94,6,193,123,203,155,209,239,244,247,15,221,176,122,245,240,90,0,176,214,28,105,4,187,87,211,27,213,215,100,114,153,187,171,203,158,151,248,121,189,217,0,160,130,229,185,48,115,91,39,199,81,26,199,33,144,122,160,103,53,118,104,62,255,100,182,178,120,190,239,39,127,0,197,135,1,64,141,30,3,224,154,244,154,244,74,0,63,0,0,223,77,158,2,169,180,151,85,220,31,230,50,141,129,62,128,254,254,161,5,130,194,229,245,211,132,239,142,143,175,63,187,218,36,4,0,124,223,191,4,234,92,11,96,127,0,189,176,230,223,1,68,3,192,230,179,253,162,168,124,212,177,184,55,181,58,21,162,195,246,227,67,67,67,61,163,35,133,179,107,47,40,30,232,42,154,183,174,124,106,229,154,202,43,95,143,123,201,243,21,56,183,178,124,132,239,15,236,19,134,43,31,234,100,251,173,202,133,2,95,25,31,95,127,97,245,120,93,55,121,152,17,220,138,74,45,173,168,190,27,64,173,137,205,216,172,194,233,145,90,235,23,33,178,36,204,165,163,205,90,190,234,251,137,51,161,114,97,101,249,125,190,31,92,21,134,169,223,3,122,7,32,31,174,236,249,120,0,167,161,210,68,68,21,71,76,44,178,242,206,32,8,78,173,182,137,87,163,135,69,90,247,254,50,250,25,77,102,186,231,213,243,146,135,2,122,118,100,147,143,40,228,125,185,92,234,65,0,122,192,1,7,116,61,245,212,179,135,170,181,55,160,92,179,236,21,13,78,5,240,185,250,42,230,148,166,167,64,55,88,141,157,81,45,207,125,125,125,59,116,59,179,222,85,169,225,134,64,151,148,198,229,77,0,126,5,148,155,126,88,171,255,17,57,71,235,21,250,238,89,179,186,111,173,52,147,137,197,227,3,135,169,181,87,1,240,80,222,200,119,93,119,240,214,124,126,69,166,147,243,212,161,230,143,41,103,172,30,155,89,149,249,43,0,29,28,28,156,59,54,86,186,64,202,159,45,20,120,181,239,15,236,29,134,43,31,154,234,181,73,68,68,219,142,173,177,6,26,0,126,187,211,206,59,124,48,179,42,179,52,26,60,187,238,192,238,0,94,95,93,22,41,157,217,220,41,47,149,74,61,223,59,218,117,26,128,92,245,53,199,25,127,83,125,29,179,184,250,183,66,110,205,228,235,193,51,0,228,114,153,63,1,120,176,158,94,23,163,67,86,236,78,147,188,173,136,4,118,80,188,3,27,113,131,19,139,21,142,66,189,54,118,85,79,143,115,78,115,96,22,134,225,223,20,114,90,100,199,175,78,244,39,246,156,36,99,199,102,243,169,171,43,109,105,59,10,158,1,96,108,108,108,55,68,107,245,140,124,38,18,228,1,128,170,148,206,7,16,153,238,220,238,211,233,246,69,26,59,151,9,228,250,92,46,253,197,232,241,230,243,233,123,20,168,53,221,80,200,59,81,15,154,98,10,124,176,182,190,226,156,22,109,194,139,97,152,249,58,20,55,214,211,217,127,172,228,245,190,72,186,121,241,120,188,250,120,223,17,224,221,45,178,60,219,142,219,3,107,75,138,227,34,249,218,112,91,218,138,25,56,175,199,71,254,206,89,117,222,146,203,165,254,7,149,206,122,75,151,46,45,100,179,43,239,84,200,231,107,169,68,79,27,28,28,156,91,221,35,84,62,18,217,219,31,98,93,242,190,200,205,32,214,172,89,243,82,54,159,250,9,20,87,214,183,129,90,13,114,79,207,236,37,2,212,155,117,136,28,159,203,101,126,93,109,99,14,160,152,205,174,188,179,100,17,173,101,239,50,40,69,151,103,130,54,45,188,51,179,42,83,235,60,185,98,197,138,117,177,24,206,143,166,17,27,249,12,137,136,104,187,180,85,212,64,79,32,184,108,249,242,229,227,19,94,22,141,62,78,126,70,213,236,231,251,201,253,154,211,141,162,0,168,60,11,168,7,0,162,102,175,250,54,172,86,155,49,11,212,105,147,131,218,104,11,170,83,105,114,96,158,136,254,94,139,20,255,226,121,193,151,68,240,152,227,232,227,233,116,250,23,152,110,199,78,139,215,71,182,240,232,248,120,233,157,190,159,108,145,78,123,163,123,82,99,94,6,160,85,103,177,123,115,185,244,237,27,147,21,199,113,194,130,197,254,0,96,173,26,199,41,190,224,121,193,33,70,17,168,209,29,35,73,95,64,45,32,212,121,157,110,191,185,6,90,69,175,64,139,78,130,34,248,107,228,180,207,30,28,28,220,105,197,138,21,235,18,137,196,238,182,132,218,13,144,21,204,245,253,228,71,154,215,7,0,81,41,106,101,35,10,57,4,0,194,48,28,246,189,228,35,168,54,255,40,57,175,2,240,136,235,38,247,5,80,61,142,28,84,191,15,145,127,1,0,107,204,225,0,238,94,180,104,32,9,216,90,219,100,145,226,61,157,30,247,116,207,171,0,239,175,254,173,192,21,237,106,116,99,49,189,185,84,210,90,89,47,149,74,179,1,172,115,221,129,221,0,91,107,242,98,129,111,183,26,105,166,242,222,55,140,232,127,149,247,213,48,193,208,146,200,71,247,231,114,141,254,68,171,86,165,255,234,187,201,171,32,56,161,178,230,91,1,92,214,42,237,70,138,100,67,254,146,203,165,238,109,78,144,78,167,87,69,63,103,53,218,178,189,55,17,17,109,63,182,202,0,218,41,224,177,86,175,139,216,254,72,31,190,121,80,76,242,24,53,82,241,100,180,214,166,90,21,79,70,126,81,143,240,188,228,161,185,92,186,246,163,234,121,201,35,80,110,250,80,221,235,132,225,173,218,201,229,82,127,137,123,193,45,10,125,27,0,148,107,224,244,187,80,160,84,4,124,47,249,103,81,185,188,171,215,252,178,50,158,244,212,25,77,68,206,193,17,80,28,209,50,93,83,152,110,5,253,109,146,221,215,234,245,78,84,70,31,249,159,184,27,63,70,28,243,85,168,179,167,160,114,127,210,102,112,52,85,217,177,245,59,27,102,140,182,44,23,198,234,90,27,137,180,71,71,101,39,0,235,74,37,89,24,61,13,2,124,165,109,190,26,223,216,15,229,107,167,168,192,77,82,13,160,197,190,14,192,79,12,240,234,250,122,184,198,56,206,29,106,43,113,168,213,227,1,92,232,56,246,192,200,38,115,97,24,182,29,233,162,217,116,206,235,224,224,224,220,241,177,82,45,0,20,193,178,118,251,73,167,211,171,128,137,215,144,49,218,48,230,113,183,109,223,254,63,159,79,47,3,38,238,67,84,7,81,249,76,20,184,187,249,253,134,188,139,60,32,208,19,42,25,222,119,178,180,211,33,176,109,39,61,18,200,74,133,150,63,103,107,118,221,84,121,32,34,162,173,195,86,209,132,35,214,20,238,25,53,235,91,38,180,102,151,233,238,75,196,254,9,130,149,181,101,224,30,223,79,254,200,247,19,159,136,123,137,43,4,248,83,36,249,35,115,231,238,48,233,143,127,147,82,207,72,236,196,74,103,198,86,14,86,209,31,143,143,149,150,54,119,218,234,152,74,203,209,14,166,168,118,190,85,228,197,201,18,110,72,220,77,126,76,197,220,4,69,219,38,34,51,101,124,188,187,101,94,173,49,133,198,87,202,119,24,70,101,178,38,53,27,162,229,109,152,72,39,67,121,43,0,7,130,55,214,94,83,253,47,199,209,251,81,109,78,33,56,208,117,23,199,85,235,35,116,8,244,122,180,25,94,175,157,141,61,175,149,155,135,26,107,117,202,55,106,98,177,115,116,185,24,43,190,208,46,109,251,141,24,183,250,167,105,236,180,216,202,179,145,191,23,237,185,231,158,221,149,191,107,181,227,118,242,241,170,35,85,223,141,99,117,55,36,82,60,223,246,61,232,88,109,193,76,62,210,14,17,17,109,251,182,202,26,232,245,98,218,252,88,218,103,35,177,223,131,16,253,118,39,219,19,49,181,71,216,97,24,142,196,221,224,12,21,173,79,104,161,248,16,32,19,126,161,141,234,255,107,213,148,100,50,149,9,57,206,25,88,56,240,205,98,172,120,176,26,115,56,20,71,163,113,40,177,197,69,71,191,3,224,45,232,112,34,139,122,94,117,53,68,246,3,0,129,92,167,98,255,115,67,171,148,211,154,122,219,95,85,131,122,141,237,70,207,175,22,244,7,65,81,52,250,184,125,173,2,215,139,104,6,145,160,72,85,190,220,208,30,182,67,49,64,162,209,144,106,235,192,70,21,13,125,13,171,233,212,96,93,195,209,41,78,135,137,4,74,109,137,162,18,240,58,221,122,127,177,30,158,207,243,253,224,53,80,125,107,61,109,241,222,84,42,63,234,187,201,155,171,29,87,69,10,135,10,228,216,72,134,166,212,68,102,58,231,117,246,168,172,27,157,85,95,118,160,83,31,158,208,145,103,97,163,205,49,116,54,26,131,220,13,83,205,65,176,15,0,88,96,67,53,186,181,27,99,5,214,180,108,190,5,116,181,91,89,84,118,106,91,136,85,157,90,233,48,166,125,96,172,112,34,183,241,12,160,137,136,182,115,91,101,0,221,142,136,121,170,222,78,21,115,251,251,22,92,177,116,233,210,66,171,180,137,68,98,175,82,201,116,1,128,227,104,173,3,214,208,174,67,59,141,72,241,180,73,127,33,69,255,104,173,124,46,204,103,218,62,254,110,54,52,52,212,51,50,82,172,141,33,171,93,154,202,166,178,55,3,184,25,192,217,158,55,248,50,160,244,201,106,111,127,0,71,199,227,241,189,178,217,236,35,157,238,3,0,96,36,172,6,133,170,186,174,221,104,0,205,249,25,27,235,94,217,42,221,116,20,99,118,73,116,88,108,133,28,85,233,172,86,19,4,65,127,177,160,223,175,46,155,205,24,156,136,148,158,86,173,63,132,49,49,189,189,213,108,150,0,176,104,209,64,210,24,221,165,188,94,177,54,171,97,42,149,122,62,218,44,71,85,191,28,57,128,223,229,243,249,167,1,64,69,110,21,104,57,128,134,57,11,208,90,251,231,18,74,29,183,127,6,166,119,94,135,159,29,126,193,247,146,207,161,26,148,138,217,23,229,50,56,65,16,4,253,197,98,253,102,192,113,240,155,116,58,189,202,20,237,218,82,228,217,149,163,206,30,0,194,22,155,128,235,38,247,55,166,62,54,119,24,166,127,132,242,77,89,173,195,161,0,111,40,255,215,250,102,205,0,135,86,223,16,209,90,7,94,85,172,139,148,150,182,99,136,171,96,47,78,179,77,68,68,51,105,171,104,194,209,41,21,249,107,245,111,1,130,167,86,61,115,124,171,116,241,120,220,181,37,121,68,160,203,4,186,76,11,229,182,141,125,125,125,59,140,206,42,92,45,208,37,149,164,171,32,120,179,24,121,147,66,63,32,106,222,232,20,49,24,134,153,55,86,218,118,118,108,116,116,212,8,244,222,234,62,139,227,246,148,232,251,185,220,138,39,154,123,251,91,107,26,123,255,73,116,4,140,54,143,145,45,234,157,160,4,39,85,70,38,153,96,100,164,112,100,53,47,2,189,191,187,251,197,158,169,28,79,39,68,101,97,100,241,197,230,32,15,0,74,5,109,232,180,183,129,71,241,51,170,167,167,231,111,136,140,198,162,37,156,222,38,169,227,24,123,117,237,124,169,211,48,65,143,138,189,181,250,183,68,135,3,20,141,116,140,51,145,206,105,26,29,119,251,246,106,144,221,169,233,158,87,129,94,23,121,253,227,190,239,183,172,1,46,20,240,70,40,126,80,249,119,113,215,139,93,47,1,192,124,119,254,48,128,90,219,127,107,240,49,180,185,241,49,192,105,145,109,188,29,149,124,168,104,180,233,211,126,9,55,241,234,86,235,187,110,240,242,232,132,72,98,37,114,174,37,58,187,225,188,100,95,114,160,121,125,223,247,247,129,226,61,245,87,100,211,148,175,78,174,77,34,34,218,102,108,83,1,116,101,156,219,90,27,101,21,189,168,50,113,70,237,7,45,8,130,126,88,231,155,245,181,228,225,76,62,115,59,0,196,98,61,135,0,136,206,204,55,95,84,254,73,45,222,46,138,0,176,190,117,204,110,137,254,196,158,205,147,66,108,56,111,225,8,4,245,128,74,228,244,230,224,182,80,208,230,225,177,26,30,139,11,164,62,185,132,145,150,147,201,20,109,215,205,168,15,95,214,37,98,127,24,143,199,27,102,154,243,188,224,21,209,137,86,4,184,108,170,65,92,39,84,16,29,90,13,205,67,229,121,94,226,253,10,124,33,250,218,230,172,129,30,30,30,30,83,72,173,153,143,66,62,234,251,137,79,70,63,91,223,247,103,197,189,228,57,136,204,42,40,142,94,29,221,78,169,36,45,59,159,149,74,82,11,18,115,185,21,79,64,90,140,114,162,145,161,11,59,52,221,243,42,138,159,215,254,6,250,84,205,119,92,215,157,31,77,239,186,201,195,4,90,43,35,80,92,81,105,126,132,165,75,151,22,4,248,110,36,67,199,250,110,226,51,77,215,68,44,238,5,39,65,80,11,228,69,229,167,213,191,123,122,98,55,33,50,89,138,53,114,121,194,77,52,76,70,179,104,81,242,149,70,244,39,145,151,70,75,136,93,91,219,173,145,134,167,5,54,166,159,69,228,169,154,239,251,67,82,30,239,60,98,211,4,183,157,92,155,68,68,180,237,216,166,154,112,0,128,85,249,184,17,189,31,229,225,187,60,40,126,235,121,193,173,0,126,43,170,131,197,130,190,31,64,117,60,91,136,202,89,168,140,109,220,211,19,123,96,108,204,222,26,169,129,238,82,104,121,200,175,218,160,195,22,234,8,108,65,95,140,123,193,103,179,185,212,247,208,97,173,169,42,46,21,160,50,134,48,124,35,246,49,223,77,222,8,224,54,24,217,177,50,37,114,57,45,176,166,88,28,109,152,80,68,69,31,135,226,109,149,4,31,243,253,164,7,45,7,203,98,228,202,108,54,245,135,213,171,135,215,198,221,224,20,149,114,144,39,192,225,106,205,195,158,151,184,66,4,203,96,229,32,84,154,18,84,60,3,99,47,234,36,255,83,87,186,3,168,141,4,56,199,58,114,135,239,38,46,130,193,40,84,254,127,123,247,22,35,73,85,6,0,248,63,53,61,179,46,11,198,4,70,216,238,158,203,6,34,151,128,49,217,23,65,163,65,133,16,18,54,162,160,9,130,145,128,18,19,47,81,73,76,4,245,197,64,86,12,151,144,232,131,241,5,148,0,241,130,60,248,6,49,129,16,52,106,130,4,113,133,236,78,207,84,247,100,93,120,32,202,178,48,211,117,124,232,185,244,244,246,44,51,92,22,118,253,190,183,174,254,123,170,186,186,42,243,247,233,115,254,255,211,17,113,225,224,43,142,230,8,116,68,196,107,175,189,124,247,150,177,19,118,197,114,71,189,156,238,92,92,200,215,55,26,211,247,69,228,19,82,142,207,230,136,213,246,205,57,255,112,118,118,118,111,255,223,152,159,111,253,189,217,152,58,16,107,219,89,31,152,159,111,173,253,252,114,252,46,197,218,69,127,155,105,223,189,234,205,157,215,217,206,236,227,205,230,212,109,75,173,203,35,69,250,124,74,163,159,105,54,166,30,136,156,159,78,41,237,202,107,43,137,204,164,162,187,123,237,113,119,127,22,121,228,178,88,174,187,158,210,238,197,133,124,227,68,99,234,151,85,196,193,148,226,170,156,243,234,136,112,138,135,182,108,173,173,172,43,216,187,119,239,75,19,245,137,235,115,42,126,191,180,147,115,170,148,30,107,54,166,254,144,34,189,144,83,126,111,228,149,123,101,41,36,223,208,95,107,186,44,247,61,221,108,76,61,18,189,41,32,189,47,64,245,201,179,35,165,86,228,40,162,247,217,13,124,209,125,123,70,160,55,114,111,190,29,251,5,224,157,113,92,141,199,54,157,165,0,0,19,27,73,68,65,84,64,71,68,116,58,51,255,204,145,47,143,190,149,253,41,242,69,41,242,29,145,226,235,209,151,60,71,202,223,152,235,236,91,105,96,177,119,239,222,151,82,202,119,198,198,156,148,35,255,116,162,62,117,237,235,135,246,180,219,173,71,83,196,119,214,108,76,113,121,164,184,59,114,190,53,250,254,217,23,57,125,115,255,254,253,47,247,135,230,156,126,179,230,181,189,4,227,154,136,184,38,186,177,82,213,96,174,51,115,127,90,74,142,86,119,147,190,20,57,221,181,188,144,109,201,75,85,142,93,115,115,115,157,141,190,135,205,40,203,242,249,20,241,253,190,77,227,145,210,238,200,233,174,232,79,242,250,170,158,28,109,7,14,28,248,239,200,98,92,213,223,74,61,34,206,77,145,111,73,17,55,247,39,207,41,210,61,181,177,226,199,67,254,204,98,142,213,182,222,75,193,15,196,64,211,153,145,220,171,135,220,231,224,214,173,181,77,77,5,138,120,107,206,107,173,150,126,16,41,126,209,183,105,52,34,174,142,148,118,247,39,207,17,113,48,34,93,94,150,101,187,255,245,189,95,84,186,87,71,68,127,221,228,241,28,241,173,20,113,83,228,232,159,78,241,84,68,247,186,190,38,41,17,17,49,215,153,123,184,215,234,122,141,75,115,228,47,30,158,60,167,111,183,219,179,247,12,196,230,72,221,175,70,196,234,84,142,94,119,196,107,150,174,243,229,251,233,95,67,79,194,91,104,163,247,38,0,199,135,227,46,129,142,232,117,11,44,186,249,163,57,226,254,117,66,14,230,200,87,150,229,236,221,253,27,207,56,227,140,45,145,163,191,13,246,237,145,210,133,145,227,250,72,249,43,57,226,166,20,233,193,136,88,105,26,145,139,184,121,231,206,157,125,21,0,142,60,194,53,215,110,221,30,41,174,136,53,93,226,214,40,171,156,119,205,117,102,30,24,124,162,221,158,121,50,71,190,33,34,94,183,244,216,92,167,245,147,72,113,105,172,95,199,121,79,164,226,99,157,78,235,240,5,108,41,173,91,234,107,179,230,218,173,91,114,172,157,219,221,231,197,28,249,178,156,227,190,229,13,197,59,112,77,182,246,183,246,141,140,228,139,34,167,221,177,206,231,146,35,126,52,215,158,185,110,189,134,33,69,78,131,201,241,97,149,53,106,239,169,253,121,205,134,20,247,15,38,149,27,245,102,207,235,204,204,204,161,178,108,125,57,69,186,54,34,134,45,84,61,148,34,223,218,173,138,115,134,205,177,142,136,40,203,178,253,234,107,7,47,94,250,229,228,192,144,144,217,148,227,107,99,91,70,62,94,150,229,208,42,29,101,57,251,243,72,233,194,136,120,116,216,243,57,226,241,84,164,75,218,237,153,59,214,57,134,231,34,117,207,95,239,245,145,226,182,148,139,245,230,182,111,252,90,63,188,8,207,26,155,185,55,1,56,246,29,19,139,93,166,78,157,218,209,29,205,159,90,126,188,176,240,234,125,131,163,179,235,153,62,109,122,186,91,164,15,84,41,111,79,169,26,235,213,122,237,62,218,110,183,95,28,140,109,52,38,63,153,34,45,151,125,59,148,99,177,57,44,110,162,190,227,226,156,170,149,159,100,171,92,156,213,233,236,219,19,17,49,49,49,113,122,206,105,165,121,73,173,86,220,59,44,233,154,158,158,126,223,226,98,254,68,127,135,184,156,99,62,165,234,145,178,44,95,57,210,123,106,54,155,91,171,106,228,172,162,136,179,35,242,182,222,214,145,63,45,205,1,31,148,154,205,29,231,85,85,119,170,136,244,254,40,114,81,84,49,83,140,21,143,173,151,12,54,26,147,87,164,212,171,210,80,84,241,236,96,59,243,55,162,94,223,113,230,72,228,11,114,81,213,34,122,165,3,95,121,101,203,19,47,188,176,231,63,141,198,212,249,41,245,22,114,86,85,122,102,104,82,63,196,70,175,139,102,179,217,136,40,86,230,182,143,141,213,30,92,175,81,77,163,209,56,57,165,209,243,34,114,61,34,111,203,57,94,77,169,122,162,44,203,35,54,204,169,215,235,167,20,69,109,181,53,119,238,254,118,157,107,236,202,148,122,117,148,187,221,244,215,249,249,214,223,6,99,54,227,45,58,175,181,237,219,167,62,88,75,105,34,23,121,91,85,197,179,17,11,123,58,157,206,240,122,235,67,140,143,143,159,56,54,182,237,220,136,106,50,165,212,237,237,111,230,249,216,68,235,247,201,211,38,207,169,106,105,58,231,124,74,68,122,113,100,36,207,204,206,206,254,35,54,56,173,167,119,239,21,103,70,21,219,163,200,69,68,245,100,89,150,79,215,235,167,79,20,197,194,37,189,168,244,114,89,182,86,190,88,108,244,90,159,168,79,236,202,197,114,141,245,226,185,178,156,249,227,176,184,77,222,155,0,28,163,142,137,4,250,104,105,54,39,175,142,156,238,93,122,216,46,219,173,230,176,184,122,125,199,153,69,170,86,186,222,229,40,62,212,110,239,123,106,88,44,0,0,199,151,227,114,10,199,27,149,115,204,247,61,108,76,214,39,47,26,140,217,185,115,231,104,17,213,141,125,155,14,141,142,230,214,219,127,116,0,0,188,27,24,129,238,51,62,62,126,226,150,177,19,254,18,17,203,229,229,22,34,197,175,83,78,143,229,148,23,82,78,163,57,242,21,17,177,50,69,35,69,190,117,174,61,251,189,119,228,128,1,0,56,234,36,208,3,234,245,169,11,138,20,15,71,196,201,175,27,156,226,161,170,90,248,194,102,230,138,2,0,112,108,51,133,99,64,167,211,122,162,202,197,71,34,199,175,142,16,54,31,57,127,247,212,83,79,249,156,228,25,0,224,255,139,17,232,35,232,85,240,136,15,231,162,58,41,85,169,91,165,252,239,136,145,185,118,123,223,51,177,137,234,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,203,253,15,199,48,24,5,208,219,242,167,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32094,"duration_micros":896,"top":485.0,"left":39.0,"width":642.0,"height":2.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,16,191,73,68,65,84,120,156,236,214,193,13,0,17,20,64,65,52,236,40,42,144,61,110,197,148,224,230,139,204,84,240,142,47,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,73,57,58,96,167,246,54,163,27,0,0,56,231,31,223,213,143,90,162,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,237,193,33,1,0,0,0,128,160,255,175,157,97,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,93,160,215,4,4,61,30,36,171,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32097,"duration_micros":879,"top":401.0559997558594,"left":134.51600646972656,"width":108.05613708496094,"height":39.264007568359375,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,25,23,73,68,65,84,120,156,236,221,125,140,101,245,89,7,240,239,239,206,190,240,178,164,72,5,77,173,64,140,20,173,145,2,107,2,180,153,157,1,186,115,231,78,119,41,209,108,149,90,80,155,146,18,94,98,107,107,172,182,10,22,105,155,82,165,130,96,154,82,173,66,69,186,193,26,182,157,183,110,219,153,221,182,91,219,110,43,209,16,64,20,2,168,17,148,148,101,23,118,151,185,247,231,31,115,161,219,93,118,102,119,118,102,103,73,62,159,127,238,249,221,243,220,231,62,231,100,38,121,238,201,115,207,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,86,22,187,0,94,25,122,91,173,19,27,233,60,217,93,62,184,125,201,178,179,183,110,216,240,220,129,188,182,175,53,112,77,82,110,78,146,78,39,43,55,143,141,125,111,193,10,5,0,88,96,141,197,46,128,87,164,211,87,76,237,254,224,98,23,1,0,176,24,52,208,204,73,77,62,208,219,108,158,189,216,117,0,0,28,110,26,104,230,164,36,141,70,35,183,175,92,185,114,233,98,215,2,0,112,56,105,160,153,139,167,187,143,103,173,56,233,199,223,187,168,149,0,0,28,102,26,104,14,90,73,238,72,178,169,187,188,190,127,96,224,231,22,179,30,0,128,195,105,201,98,23,192,43,79,173,105,151,78,125,119,237,41,247,37,89,86,123,202,167,214,173,91,119,193,250,245,235,219,135,154,187,255,226,254,227,235,206,163,46,171,165,94,84,146,95,72,234,171,146,242,68,106,254,165,166,124,174,177,115,231,189,19,19,19,83,251,123,125,223,80,243,203,169,121,115,77,238,222,52,50,246,107,221,124,151,167,212,75,146,188,46,201,174,164,126,183,212,198,29,39,30,119,220,93,123,214,220,219,108,158,221,104,228,138,36,253,73,126,42,201,127,38,217,82,106,249,244,196,232,232,215,15,248,24,6,7,251,107,169,151,38,89,149,228,167,147,76,165,228,225,90,203,151,123,106,110,255,218,232,232,131,115,60,61,0,192,17,192,21,104,230,100,98,124,252,129,36,127,216,93,174,122,106,199,182,203,15,53,231,249,67,205,183,214,157,203,31,78,169,127,94,146,11,147,252,100,82,142,78,114,90,74,126,185,148,122,79,231,232,229,163,111,28,24,56,233,0,210,29,223,219,106,189,190,238,58,106,107,74,253,120,146,179,146,28,155,228,132,164,12,212,82,239,120,114,251,51,195,43,215,174,61,38,73,233,31,28,252,80,163,145,239,38,185,60,201,105,73,142,233,62,94,86,75,221,220,215,106,222,48,219,27,14,12,12,28,219,55,212,252,187,90,234,215,146,188,51,201,207,38,89,158,228,216,212,188,161,164,190,191,93,234,253,253,173,230,213,115,57,63,0,192,145,65,3,205,156,109,127,242,127,111,74,242,253,36,169,53,55,190,105,205,155,79,158,107,174,190,214,192,218,78,205,23,82,242,234,36,53,53,159,79,234,149,181,228,87,147,252,94,74,30,72,146,146,92,184,180,167,220,153,235,174,155,241,111,183,36,167,54,82,55,36,245,103,146,124,63,165,188,47,37,151,213,82,62,150,228,217,110,212,192,138,246,174,27,251,90,3,87,215,82,175,79,82,82,51,90,146,107,106,173,191,89,106,110,77,178,187,155,242,15,86,181,154,151,237,239,253,86,174,93,123,204,174,70,153,76,205,37,221,167,254,45,201,181,165,214,75,82,114,89,106,189,57,201,179,37,105,212,228,150,254,193,193,15,205,245,92,1,0,139,203,8,7,115,182,117,235,214,23,122,155,205,119,149,70,190,83,146,21,61,157,158,219,146,172,57,216,60,43,215,174,61,38,83,187,111,75,82,146,250,124,169,141,161,137,209,209,137,61,99,206,91,183,238,150,165,59,182,173,47,53,111,73,178,186,255,159,190,121,209,68,242,143,51,164,61,61,169,73,242,241,201,145,177,15,164,187,72,146,11,90,173,219,219,233,108,73,114,98,173,229,138,146,180,147,212,148,252,198,228,200,216,29,123,228,248,155,222,102,243,111,27,141,108,78,178,172,36,55,174,91,183,238,115,47,55,170,178,162,253,194,159,164,100,101,119,121,109,121,126,215,71,246,26,53,185,227,194,139,46,252,200,212,212,146,245,169,233,237,148,250,199,253,173,214,198,137,145,145,111,29,204,185,2,0,22,159,43,208,28,146,205,99,99,223,43,201,199,146,164,212,188,101,213,80,243,237,7,155,99,69,103,247,57,73,94,155,36,169,249,228,222,205,115,146,108,89,191,254,249,70,167,188,52,250,80,75,121,219,108,121,107,202,55,38,207,57,239,247,179,71,243,156,36,95,29,25,249,247,164,94,155,76,223,142,47,201,210,154,220,58,57,252,35,205,115,146,100,243,216,216,183,75,114,83,119,121,210,147,219,182,189,113,239,152,11,134,134,78,73,173,239,157,126,207,252,197,228,200,216,135,95,110,78,251,43,247,126,229,127,118,183,115,113,146,167,74,210,232,164,243,254,217,142,1,0,56,242,104,160,57,100,219,151,44,187,33,201,67,73,82,58,185,249,0,103,148,95,82,218,229,145,70,39,107,26,157,172,41,141,37,55,239,47,110,98,116,244,209,148,220,215,93,158,53,107,222,154,63,205,117,215,117,94,110,223,84,79,231,75,123,174,59,165,231,150,253,230,73,103,195,15,23,229,23,247,222,223,78,231,87,146,164,38,157,246,84,231,163,51,213,180,101,108,236,233,90,202,103,166,243,230,173,253,23,247,31,63,227,65,0,0,71,28,35,28,28,178,173,27,54,60,215,215,108,190,43,141,108,74,201,171,151,246,148,155,146,252,250,129,190,126,98,116,244,209,36,143,238,249,220,121,205,230,9,203,147,19,58,61,61,71,215,78,167,252,112,79,221,54,253,208,189,98,61,131,221,181,78,238,111,223,55,190,184,241,241,190,86,115,42,211,255,3,79,124,125,120,248,161,253,197,78,117,26,255,209,232,126,212,172,233,156,184,79,64,77,127,146,148,100,199,210,158,158,101,253,131,131,167,206,84,87,173,157,255,74,74,146,44,201,238,165,167,38,249,231,217,142,5,0,56,114,104,160,153,23,147,99,99,155,251,7,155,183,214,146,171,146,188,189,127,104,224,174,137,225,241,47,30,76,142,254,193,193,83,83,234,123,106,114,113,146,83,106,146,82,219,41,123,180,207,123,12,99,28,53,75,186,93,91,198,198,158,158,97,127,205,244,151,9,127,44,53,143,205,148,104,121,187,253,220,11,141,158,36,73,163,148,227,246,9,40,245,228,110,93,199,213,82,31,153,165,174,116,155,231,233,173,78,207,79,204,30,15,0,28,73,140,112,48,111,150,76,181,63,152,228,241,36,169,181,252,229,193,140,39,172,26,106,190,173,150,250,80,77,126,59,201,41,243,80,206,15,14,32,230,197,118,124,219,76,65,207,46,93,250,82,219,94,107,202,62,1,157,236,123,85,250,0,213,70,221,55,31,0,112,68,115,5,154,121,179,113,227,198,103,86,13,14,94,81,74,253,82,146,215,214,221,203,110,72,114,213,108,175,235,29,28,60,35,181,222,149,233,15,116,59,106,114,125,26,237,123,143,122,161,241,216,248,248,248,142,61,99,251,90,205,225,36,173,5,57,128,185,42,121,50,201,107,82,178,113,114,120,108,245,98,151,3,0,44,44,13,52,243,106,211,232,232,112,223,208,192,157,169,229,29,169,229,202,85,67,3,119,255,232,61,48,246,213,152,30,251,104,36,73,73,125,199,228,200,248,76,183,167,123,253,252,85,59,111,30,75,114,102,106,94,183,216,133,0,0,11,207,8,7,243,174,83,123,126,39,53,255,151,36,165,150,219,83,26,43,102,138,175,169,111,232,110,78,157,184,226,85,27,246,23,215,219,108,158,157,249,25,239,152,87,181,228,171,221,205,147,251,135,86,255,210,108,241,171,214,172,62,173,119,112,240,140,243,7,7,79,95,224,210,0,128,5,160,129,102,222,109,30,25,121,170,164,190,120,207,230,211,82,235,140,247,59,46,169,47,94,163,94,242,204,51,207,236,239,203,129,165,209,168,215,207,91,145,243,168,81,27,247,164,59,79,93,107,185,97,166,95,73,92,181,102,245,105,165,221,184,191,81,234,125,157,116,174,60,108,69,2,0,243,70,3,205,130,152,24,29,255,251,164,188,120,53,249,132,25,131,107,190,253,226,230,238,70,174,217,123,119,127,127,255,146,85,173,230,159,37,101,40,169,207,207,111,165,135,110,98,100,228,137,212,250,137,233,85,25,232,255,214,55,111,107,181,90,203,247,142,123,211,234,213,175,41,237,114,79,166,71,167,118,149,90,246,123,239,105,0,224,200,101,6,154,5,83,219,157,171,74,79,57,63,201,140,35,28,157,210,243,169,70,58,87,36,89,86,75,249,104,95,171,121,78,74,238,77,167,252,160,148,122,74,77,126,171,36,103,36,121,56,53,95,72,201,239,30,150,3,56,8,101,231,238,63,170,71,47,235,77,202,185,181,148,119,63,151,206,96,95,171,249,153,90,242,96,58,245,232,148,114,102,73,46,79,114,108,146,148,146,171,39,198,198,30,94,228,178,1,128,57,112,5,154,5,179,105,124,252,241,90,203,172,63,87,189,121,100,228,254,90,114,105,146,93,221,167,46,78,205,95,165,212,127,168,211,63,163,125,70,146,71,75,187,174,77,242,223,11,88,242,156,77,76,76,236,220,190,100,249,133,41,245,206,238,83,167,36,249,112,169,185,187,148,242,217,146,188,39,211,205,243,142,148,188,115,98,120,236,246,197,171,22,0,56,20,26,104,22,212,166,115,207,253,116,146,137,89,227,134,199,62,223,46,61,103,212,148,79,36,249,215,36,207,118,191,136,184,37,165,188,111,233,11,237,51,39,198,199,31,72,41,219,23,186,230,185,218,186,97,195,115,147,195,227,151,150,90,206,79,201,103,83,242,72,146,221,73,158,78,242,157,36,215,214,118,253,249,201,225,177,191,94,220,74,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,191,61,56,36,0,0,0,0,16,244,255,181,35,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,4,210,163,185,40,182,203,68,64,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32098,"duration_micros":1522,"top":398.0,"left":64.0,"width":48.0,"height":48.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,25,213,73,68,65,84,120,156,236,221,125,140,165,87,89,0,240,231,188,51,75,119,217,82,62,4,13,130,109,10,169,13,217,217,150,86,90,181,214,22,37,54,6,89,2,132,237,125,223,183,157,56,182,66,43,105,144,196,106,164,32,148,200,151,68,163,6,155,210,149,172,197,237,220,119,198,73,128,180,165,68,171,133,214,74,139,8,161,221,113,173,98,72,11,86,4,161,64,43,217,110,247,238,61,254,177,99,178,190,123,239,220,157,143,187,219,48,191,95,50,127,188,207,249,120,206,252,247,228,228,220,115,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,33,157,232,5,252,48,168,235,250,229,17,177,45,231,124,106,68,156,31,17,23,69,196,243,90,221,190,29,17,143,166,148,30,234,247,251,159,75,41,125,182,105,154,7,143,247,90,1,0,88,27,5,244,42,205,204,204,60,231,201,39,159,252,245,148,210,155,35,226,140,85,78,243,80,68,124,108,203,150,45,55,236,222,189,251,137,117,92,30,0,0,99,162,128,94,161,178,44,127,60,165,116,125,68,188,105,29,167,125,60,34,254,228,164,147,78,250,227,155,111,190,249,123,235,56,47,0,0,235,76,1,125,140,102,102,102,54,63,245,212,83,239,200,57,191,115,140,105,190,31,17,239,111,154,230,67,99,204,1,0,192,26,40,160,143,65,167,211,57,187,40,138,249,136,56,243,24,135,124,51,14,31,207,136,136,120,118,68,188,40,34,94,112,172,249,114,206,95,40,138,162,236,118,187,95,93,217,74,1,0,24,55,5,244,8,85,85,93,30,17,123,70,116,219,159,82,250,108,68,252,117,74,233,206,217,217,217,125,237,14,59,118,236,120,230,201,39,159,124,94,68,252,108,68,188,58,34,126,126,196,156,143,69,196,107,154,166,185,111,53,235,6,0,96,60,20,208,203,40,203,242,173,41,165,63,93,166,203,167,250,253,254,13,243,243,243,159,94,233,220,85,85,61,63,165,244,134,156,243,187,226,240,14,245,64,41,165,95,236,118,187,159,89,233,252,0,0,140,135,2,122,136,170,170,126,53,34,110,30,210,252,47,69,81,92,49,59,59,123,255,90,243,76,79,79,111,61,120,240,224,245,41,165,183,69,196,228,128,46,79,244,251,253,11,230,231,231,23,215,154,11,0,128,181,83,64,15,80,85,213,47,71,196,176,93,229,166,105,154,122,189,115,118,58,157,115,139,162,184,53,6,236,70,167,148,190,118,240,224,193,115,22,22,22,30,91,239,188,0,0,172,76,113,162,23,240,116,51,61,61,125,122,68,252,213,144,230,247,141,163,120,142,136,152,159,159,255,210,166,77,155,206,142,136,191,111,183,229,156,79,157,156,156,252,196,56,242,2,0,176,50,19,39,122,1,79,55,219,182,109,187,43,34,78,27,208,244,214,166,105,62,56,206,220,15,60,240,192,254,197,197,197,191,216,190,125,251,185,113,244,141,31,167,77,77,77,77,44,46,46,58,15,13,0,112,2,217,129,62,66,89,150,239,142,136,115,218,241,156,243,53,77,211,124,248,120,173,163,215,235,149,17,241,64,59,158,82,250,189,78,167,115,222,241,90,7,0,0,71,115,6,122,201,229,151,95,254,194,67,135,14,125,53,34,54,31,25,207,57,239,154,155,155,187,234,88,230,152,153,153,217,124,224,192,129,215,230,156,47,73,41,157,27,17,47,137,195,247,64,47,70,196,61,17,113,119,175,215,187,109,97,97,97,255,168,185,46,187,236,178,23,247,251,253,47,71,196,143,180,154,238,109,154,102,212,21,120,0,0,140,137,29,232,37,189,94,239,250,104,21,207,17,241,200,230,205,155,127,115,212,216,233,233,233,173,101,89,94,123,224,192,129,71,34,98,62,165,116,101,28,222,201,126,246,82,151,169,136,120,75,68,204,79,78,78,62,92,215,245,200,57,103,103,103,255,35,165,116,205,128,166,11,235,186,126,245,168,241,0,0,140,135,29,232,136,168,235,250,185,57,231,255,138,136,103,180,154,58,77,211,12,251,65,225,225,14,135,95,41,188,61,34,94,188,146,156,57,231,251,35,162,154,155,155,123,120,185,126,85,85,221,21,17,191,208,10,223,211,52,205,197,43,201,7,0,192,250,176,3,29,17,57,231,171,163,85,60,231,156,191,48,170,120,174,235,186,44,138,226,203,177,194,226,57,34,34,165,244,51,41,165,47,117,58,157,169,229,250,77,76,76,252,198,128,240,69,85,85,157,181,210,156,0,0,172,157,2,250,176,78,59,144,82,250,237,229,6,148,101,217,201,57,55,35,230,253,231,165,191,97,158,91,20,197,103,234,186,30,116,235,71,68,68,220,114,203,45,255,26,17,119,12,90,194,136,220,0,0,140,193,160,151,239,54,148,233,233,233,211,123,189,222,217,173,240,191,53,77,115,247,176,49,59,119,238,124,81,74,233,163,131,218,82,74,243,253,126,255,15,231,230,230,254,233,200,120,89,150,63,157,82,122,71,68,236,104,13,121,126,206,249,47,35,98,232,145,140,126,191,255,103,69,81,180,207,61,191,46,34,174,27,54,6,0,128,241,216,240,59,208,7,15,30,60,170,112,205,57,207,47,55,102,211,166,77,31,136,136,147,91,225,239,23,69,177,163,219,237,150,237,226,57,34,98,110,110,238,243,77,211,188,54,165,84,69,68,251,22,142,139,234,186,190,114,88,190,249,249,249,79,167,148,190,214,10,191,172,170,170,31,91,110,157,0,0,172,191,13,95,64,71,196,133,237,64,81,20,247,12,235,60,61,61,125,122,206,121,122,64,211,204,236,236,236,237,163,146,117,187,221,185,148,210,111,181,227,57,231,223,89,110,92,206,249,111,7,132,143,90,59,0,0,227,181,225,11,232,148,210,25,237,216,196,196,196,125,195,250,247,122,189,65,79,121,223,214,52,205,39,143,53,103,183,219,189,49,34,190,216,10,255,100,85,85,203,21,196,71,189,64,152,115,110,31,61,1,0,96,204,54,124,1,29,17,167,183,190,31,222,179,103,207,15,150,233,127,212,35,38,41,165,247,174,52,105,206,121,208,179,224,67,239,119,206,57,223,219,142,21,69,241,210,149,230,5,0,96,109,20,208,17,207,105,125,127,107,68,255,246,174,239,55,187,221,238,63,174,52,233,161,67,135,62,53,32,60,244,133,193,65,247,69,231,156,219,197,63,0,0,99,166,128,142,120,214,10,251,183,127,184,55,170,224,30,104,233,57,239,71,142,140,165,148,78,29,49,236,177,214,247,11,87,147,27,0,128,213,83,64,31,237,153,35,218,219,175,55,110,90,67,174,3,71,126,228,156,71,21,208,223,104,125,187,133,3,0,224,56,83,64,71,60,222,250,110,31,233,104,251,207,214,247,79,172,33,247,168,130,185,237,201,214,247,150,53,228,6,0,96,21,20,208,17,143,182,190,71,61,203,253,80,235,123,107,89,150,175,90,105,210,178,44,127,37,34,54,175,116,28,0,0,39,150,2,58,162,253,64,73,116,58,157,151,45,211,127,208,109,24,111,95,69,222,119,175,98,204,51,86,49,6,0,128,117,164,128,142,88,108,7,138,162,120,249,176,206,69,81,28,245,74,97,206,249,85,117,93,95,115,172,9,171,170,122,87,74,233,188,65,109,157,78,103,185,187,157,183,183,190,191,114,172,57,1,0,88,31,27,190,128,206,57,223,63,32,252,134,97,253,103,103,103,247,69,196,29,3,230,249,112,89,150,111,26,149,175,44,203,119,70,196,123,134,181,23,69,49,112,103,186,44,203,65,113,5,52,0,192,113,182,225,11,232,77,155,54,13,122,182,251,141,51,51,51,67,127,76,216,239,247,175,29,20,79,41,237,170,170,170,169,235,250,167,218,109,101,89,94,80,215,245,29,41,165,223,31,177,164,215,87,85,181,251,200,64,85,85,111,79,41,93,223,238,152,115,190,109,196,92,0,0,172,179,246,149,108,27,82,85,85,247,68,235,17,147,148,210,85,221,110,119,215,176,49,101,89,94,157,82,186,113,196,212,123,227,240,185,229,51,87,177,172,31,228,156,247,45,61,53,62,168,152,255,118,175,215,59,117,233,62,105,0,0,142,147,13,191,3,189,100,161,29,232,247,251,191,187,220,128,185,185,185,143,68,196,117,35,230,221,30,163,139,231,59,135,196,183,46,157,147,30,182,19,126,173,226,25,0,224,248,83,64,71,68,175,215,251,104,68,124,239,200,88,74,233,244,170,170,222,178,220,184,166,105,62,144,82,122,219,106,243,166,148,46,109,154,230,146,136,216,61,178,243,255,31,119,67,211,52,31,91,109,94,0,0,86,111,226,68,47,224,233,96,223,190,125,189,169,169,169,173,41,165,139,91,77,175,56,231,156,115,110,124,240,193,7,15,14,27,187,119,239,222,207,111,219,182,237,142,148,210,89,49,250,14,233,136,136,72,41,125,36,165,244,198,110,183,251,185,136,136,197,197,197,91,167,166,166,190,158,82,250,185,24,253,18,226,251,154,166,25,120,6,27,0,128,241,115,6,122,201,21,87,92,241,172,253,251,247,255,123,68,252,104,171,233,19,77,211,12,189,149,227,72,85,85,93,28,17,175,139,136,87,70,196,255,93,133,247,63,17,241,104,206,249,43,41,165,143,167,148,62,217,237,118,191,59,104,252,206,157,59,183,76,78,78,94,154,82,170,115,206,103,70,196,105,75,77,223,136,136,91,115,206,31,156,155,155,123,120,165,255,27,0,0,235,71,1,125,132,186,174,223,156,115,190,169,29,79,41,189,167,219,237,30,117,11,6,0,0,27,143,35,28,71,216,187,119,239,23,167,166,166,126,41,165,116,106,171,233,149,219,183,111,127,98,113,113,241,190,19,178,48,0,0,158,54,252,136,176,101,114,114,242,202,136,120,124,64,211,31,85,85,53,244,90,59,0,0,54,6,71,56,6,168,235,250,252,156,243,93,17,177,181,221,150,115,254,135,162,40,126,173,219,237,122,5,16,0,96,3,82,64,15,81,85,213,133,17,241,119,113,248,33,148,182,3,57,231,247,158,114,202,41,127,176,107,215,174,161,55,116,0,0,240,195,71,1,189,140,178,44,95,159,82,250,248,50,93,190,30,17,55,77,78,78,254,249,158,61,123,190,117,188,214,5,0,192,137,163,128,30,161,211,233,156,91,20,197,66,68,188,100,185,126,57,231,219,35,226,238,137,137,137,123,103,103,103,239,63,62,171,3,0,224,120,83,64,31,131,165,251,153,223,31,17,43,121,117,240,59,17,241,157,156,243,127,167,148,122,203,117,76,41,245,114,206,127,211,52,205,135,214,180,80,0,0,198,78,1,189,2,75,231,162,119,71,196,25,99,74,113,83,211,52,87,143,105,110,0,0,214,129,2,122,21,234,186,190,46,34,174,202,57,183,239,139,94,171,239,54,77,243,188,117,158,19,0,128,117,164,128,94,131,170,170,46,76,41,149,57,231,75,35,226,5,235,48,229,157,77,211,92,178,14,243,0,0,48,38,10,232,117,82,85,213,89,57,231,11,82,74,231,71,196,43,34,98,251,74,198,231,156,111,63,116,232,208,213,11,11,11,143,142,103,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,219,30,28,16,0,0,0,0,8,249,255,186,33,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,38,231,25,161,141,70,187,216,46,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32107,"duration_micros":805,"top":653.0,"left":39.0,"width":642.0,"height":2.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,16,191,73,68,65,84,120,156,236,214,193,13,0,17,20,64,65,52,236,40,42,144,61,110,197,148,224,230,139,204,84,240,142,47,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,73,57,58,96,167,246,54,163,27,0,0,56,231,31,223,213,143,90,162,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,237,193,33,1,0,0,0,128,160,255,175,157,97,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,93,28,97,4,4,142,137,53,1,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32110,"duration_micros":855,"top":569.0560302734375,"left":134.51600646972656,"width":138.84022521972656,"height":39.26397705078125,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,24,117,73,68,65,84,120,156,236,221,125,108,157,215,93,7,240,239,185,78,235,54,77,58,74,200,214,63,186,49,164,177,151,66,135,68,104,183,182,137,237,66,106,251,38,237,24,21,105,215,82,54,173,188,8,164,21,193,24,67,147,6,219,10,42,210,64,12,68,131,198,52,193,208,198,203,102,170,78,140,228,218,206,210,56,9,89,233,166,242,178,151,104,99,188,117,208,33,82,149,173,33,125,113,226,251,28,254,176,157,164,105,18,39,129,228,238,54,159,207,95,207,241,249,221,251,124,31,75,182,126,62,58,62,55,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206,119,165,215,1,160,223,140,188,113,228,219,234,236,224,39,146,92,147,228,183,119,118,166,238,57,182,102,120,195,248,187,82,235,189,73,210,170,229,213,59,38,39,191,114,174,115,2,0,103,199,178,94,7,160,63,172,107,183,87,183,210,236,59,237,23,214,76,238,156,156,106,159,133,72,189,115,112,240,77,73,110,92,24,189,239,250,155,214,127,100,207,95,125,250,107,103,227,86,195,237,177,127,72,242,218,36,159,223,217,153,250,190,99,231,111,216,48,246,195,77,205,39,79,240,242,185,36,251,147,250,88,77,217,91,106,217,85,146,173,51,147,147,255,118,54,178,2,192,249,162,213,235,0,208,111,186,201,227,71,13,159,190,96,217,220,254,158,133,57,185,101,73,190,61,41,87,149,228,182,148,186,185,150,250,47,195,27,198,254,244,250,155,214,191,172,215,225,0,160,95,89,129,230,12,148,191,40,53,155,79,169,180,213,253,230,89,14,115,206,237,190,230,218,7,70,30,254,204,47,53,41,63,144,212,15,237,252,228,204,183,202,51,222,83,74,30,90,28,148,110,6,186,3,185,164,52,229,59,83,114,77,82,55,36,89,158,154,219,151,117,7,110,30,217,48,182,105,102,235,212,100,15,243,2,64,95,210,64,115,250,106,253,218,204,228,212,76,175,99,244,204,123,223,219,204,36,191,213,235,24,199,106,149,252,237,142,147,52,196,107,55,110,188,172,213,61,244,115,165,148,119,39,89,209,212,108,25,106,143,222,184,171,51,253,224,57,140,9,0,125,207,22,14,56,79,252,245,150,45,223,216,53,57,253,190,210,164,157,100,182,36,173,146,242,231,107,55,110,188,172,215,217,0,160,159,104,160,225,60,51,51,53,245,233,146,188,99,97,184,122,89,51,247,139,61,13,4,0,125,198,22,14,206,185,145,241,241,181,181,212,221,73,82,90,245,170,153,45,211,95,28,30,27,91,151,146,183,165,228,186,36,171,147,60,90,147,173,203,210,186,239,193,78,231,159,23,95,59,58,58,122,201,179,173,214,157,165,212,59,147,124,79,106,154,148,252,99,73,62,145,193,217,143,204,156,226,126,228,225,177,177,117,105,229,246,36,63,152,228,165,73,14,36,121,180,148,178,181,153,107,254,120,215,244,244,191,158,244,245,237,177,154,36,41,249,179,157,91,167,238,56,147,239,67,47,237,91,113,233,135,86,31,216,255,203,73,174,168,53,63,211,110,183,127,173,211,233,204,246,58,23,0,244,3,43,208,244,84,147,92,58,60,62,122,111,90,217,149,146,91,147,92,145,100,48,201,43,75,242,243,221,52,159,31,110,143,222,156,36,55,140,143,191,106,118,160,124,182,148,250,193,36,107,147,92,150,146,85,73,174,173,201,7,234,236,224,231,134,54,174,127,205,201,238,247,186,118,251,210,225,241,177,251,211,202,174,36,63,155,228,85,73,150,39,121,113,146,171,107,173,239,41,3,249,210,80,123,244,199,206,226,99,247,220,222,137,137,131,53,11,199,223,149,172,122,166,214,171,123,28,9,0,250,134,6,154,158,42,221,242,43,41,229,93,73,102,75,205,230,148,220,85,75,222,150,154,29,11,37,203,147,50,113,195,198,209,53,77,169,147,73,174,76,205,19,169,245,55,106,242,150,146,252,66,146,191,91,168,125,69,105,6,238,95,115,243,205,203,143,119,175,53,107,214,92,112,81,154,201,148,220,178,240,165,127,79,242,158,212,114,71,74,238,74,242,135,73,230,146,114,113,73,249,216,208,134,209,161,179,248,232,61,87,82,167,23,175,155,82,95,215,203,44,0,208,79,108,225,160,183,74,198,147,252,71,233,214,27,103,166,167,191,124,212,204,230,161,246,248,111,150,212,119,36,25,108,154,178,39,201,96,82,255,102,217,161,238,77,219,183,111,127,98,177,112,100,100,228,190,230,226,193,143,149,228,182,36,175,89,217,61,248,230,36,31,60,246,86,43,94,188,234,39,147,92,59,63,170,15,44,207,192,237,199,108,91,248,163,161,246,232,159,36,101,91,73,90,165,230,190,204,127,136,201,11,82,233,230,171,117,96,254,186,85,235,119,247,54,13,0,244,15,13,52,167,175,228,237,195,237,177,183,47,85,86,83,246,236,234,76,174,93,186,174,249,137,157,211,219,190,124,236,215,47,73,121,247,211,169,119,38,185,60,243,219,58,102,75,109,221,190,125,251,244,19,71,215,205,204,204,204,173,107,183,239,46,105,110,73,114,65,83,243,163,57,78,3,157,148,55,45,92,28,90,118,176,251,83,157,237,211,207,219,243,187,171,51,253,224,112,123,252,195,73,253,233,164,92,181,174,221,190,114,119,167,179,119,169,103,232,71,3,23,117,191,49,119,104,254,87,64,77,89,221,227,56,0,208,55,108,225,160,215,190,184,171,179,109,250,120,19,157,78,103,246,240,62,221,121,31,63,209,199,80,239,238,116,30,79,234,142,36,41,201,53,199,171,105,213,114,111,171,201,77,105,242,67,71,175,96,31,171,214,108,89,188,30,72,247,202,83,122,138,62,212,221,223,125,242,168,225,113,183,189,0,0,207,103,5,154,211,86,147,143,151,90,126,119,201,194,86,235,192,210,111,86,59,39,155,46,165,124,53,181,46,222,119,251,18,55,252,74,82,71,147,172,188,118,211,166,139,31,154,152,120,230,232,217,29,147,147,83,71,143,219,237,246,224,236,192,192,119,28,234,118,95,148,90,143,252,44,180,234,138,204,223,50,77,41,47,89,242,25,250,213,202,149,43,50,119,112,254,186,212,103,78,94,12,0,44,210,64,115,218,74,205,99,59,39,39,31,90,186,114,105,181,85,30,59,233,124,147,167,74,89,184,111,169,255,121,242,55,107,14,100,161,120,240,217,103,47,73,242,188,166,112,211,166,77,3,255,245,212,254,219,74,173,111,121,58,205,72,186,205,133,173,36,41,71,191,207,145,203,210,212,11,79,229,57,250,81,57,116,104,85,93,124,238,90,78,184,34,15,0,60,151,6,154,222,170,245,127,78,54,93,210,212,195,221,109,179,196,138,118,41,135,91,223,238,220,92,57,118,122,253,250,245,47,218,119,96,255,95,150,100,232,185,29,243,249,169,182,234,119,45,254,177,80,75,254,169,183,105,0,160,127,104,160,57,111,28,188,96,224,15,230,155,231,36,53,59,74,43,239,239,214,214,35,151,175,88,241,223,19,19,19,221,197,186,145,118,251,245,53,205,255,203,10,251,183,178,154,50,186,184,220,94,90,249,108,143,227,0,64,223,208,64,115,94,24,25,31,127,121,77,189,109,97,248,185,199,87,94,58,190,119,98,226,224,113,139,107,125,197,11,125,129,122,100,100,100,89,173,245,71,22,134,79,30,104,93,248,112,79,3,1,64,31,113,10,7,231,135,86,125,245,225,235,90,38,78,216,60,39,169,165,185,229,68,115,47,20,245,226,193,183,38,121,121,146,148,228,195,143,124,234,83,79,247,56,18,0,244,13,13,52,231,133,210,28,217,31,157,82,87,156,168,110,104,227,232,117,73,121,227,57,9,213,35,35,227,227,107,147,252,206,252,168,126,243,96,183,190,191,167,129,0,160,207,104,160,57,47,28,236,118,191,144,35,231,107,220,53,178,97,195,229,199,214,172,27,31,127,109,105,202,253,73,125,246,220,166,59,55,174,127,195,27,86,14,183,199,222,89,75,221,158,249,115,159,107,171,41,119,126,102,122,122,95,175,179,1,64,63,177,7,154,51,113,197,194,42,230,146,154,86,235,201,93,91,183,126,225,108,7,90,202,158,109,219,190,62,220,30,251,104,146,55,39,185,162,214,238,223,15,183,199,54,55,37,123,75,50,216,106,234,80,45,245,173,73,46,44,41,119,215,228,247,122,28,249,180,53,53,223,63,178,97,236,240,167,43,54,77,105,45,156,105,253,210,36,87,151,67,179,27,146,172,156,159,173,207,52,165,252,248,206,169,169,45,199,127,55,0,224,68,52,208,156,190,146,91,107,234,173,167,84,218,116,39,147,180,207,114,162,83,242,108,90,119,95,148,230,101,73,70,146,188,36,201,61,173,195,199,184,205,255,215,96,173,245,215,119,190,254,186,223,31,126,248,161,15,164,255,126,62,126,181,30,125,134,117,169,207,57,211,250,136,250,64,105,202,59,119,79,77,57,186,14,0,206,64,191,53,8,112,198,30,238,116,246,111,218,180,105,253,190,167,246,223,145,38,119,164,228,123,147,172,78,242,104,74,30,105,213,102,243,142,201,109,123,50,57,157,140,143,61,153,146,85,189,206,252,127,52,151,212,3,73,249,122,74,190,148,90,119,151,166,116,102,166,166,53,206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,219,30,28,18,0,0,0,0,8,250,255,218,17,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,0,158,29,142,6,181,219,164,30,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32111,"duration_micros":1381,"top":566.0,"left":64.0,"width":48.0,"height":48.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,25,213,73,68,65,84,120,156,236,221,125,140,165,87,89,0,240,231,188,51,75,119,217,82,62,4,13,130,109,10,169,13,217,217,150,86,90,181,214,22,37,54,6,89,2,132,237,125,223,183,157,56,182,66,43,105,144,196,106,164,32,148,200,151,68,163,6,155,210,149,172,197,237,220,119,198,73,128,180,165,68,171,133,214,74,139,8,161,221,113,173,98,72,11,86,4,161,64,43,217,110,247,238,61,254,177,99,178,190,123,239,220,157,143,187,219,48,191,95,50,127,188,207,249,120,206,252,247,228,228,220,115,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,33,157,232,5,252,48,168,235,250,229,17,177,45,231,124,106,68,156,31,17,23,69,196,243,90,221,190,29,17,143,166,148,30,234,247,251,159,75,41,125,182,105,154,7,143,247,90,1,0,88,27,5,244,42,205,204,204,60,231,201,39,159,252,245,148,210,155,35,226,140,85,78,243,80,68,124,108,203,150,45,55,236,222,189,251,137,117,92,30,0,0,99,162,128,94,161,178,44,127,60,165,116,125,68,188,105,29,167,125,60,34,254,228,164,147,78,250,227,155,111,190,249,123,235,56,47,0,0,235,76,1,125,140,102,102,102,54,63,245,212,83,239,200,57,191,115,140,105,190,31,17,239,111,154,230,67,99,204,1,0,192,26,40,160,143,65,167,211,57,187,40,138,249,136,56,243,24,135,124,51,14,31,207,136,136,120,118,68,188,40,34,94,112,172,249,114,206,95,40,138,162,236,118,187,95,93,217,74,1,0,24,55,5,244,8,85,85,93,30,17,123,70,116,219,159,82,250,108,68,252,117,74,233,206,217,217,217,125,237,14,59,118,236,120,230,201,39,159,124,94,68,252,108,68,188,58,34,126,126,196,156,143,69,196,107,154,166,185,111,53,235,6,0,96,60,20,208,203,40,203,242,173,41,165,63,93,166,203,167,250,253,254,13,243,243,243,159,94,233,220,85,85,61,63,165,244,134,156,243,187,226,240,14,245,64,41,165,95,236,118,187,159,89,233,252,0,0,140,135,2,122,136,170,170,126,53,34,110,30,210,252,47,69,81,92,49,59,59,123,255,90,243,76,79,79,111,61,120,240,224,245,41,165,183,69,196,228,128,46,79,244,251,253,11,230,231,231,23,215,154,11,0,128,181,83,64,15,80,85,213,47,71,196,176,93,229,166,105,154,122,189,115,118,58,157,115,139,162,184,53,6,236,70,167,148,190,118,240,224,193,115,22,22,22,30,91,239,188,0,0,172,76,113,162,23,240,116,51,61,61,125,122,68,252,213,144,230,247,141,163,120,142,136,152,159,159,255,210,166,77,155,206,142,136,191,111,183,229,156,79,157,156,156,252,196,56,242,2,0,176,50,19,39,122,1,79,55,219,182,109,187,43,34,78,27,208,244,214,166,105,62,56,206,220,15,60,240,192,254,197,197,197,191,216,190,125,251,185,113,244,141,31,167,77,77,77,77,44,46,46,58,15,13,0,112,2,217,129,62,66,89,150,239,142,136,115,218,241,156,243,53,77,211,124,248,120,173,163,215,235,149,17,241,64,59,158,82,250,189,78,167,115,222,241,90,7,0,0,71,115,6,122,201,229,151,95,254,194,67,135,14,125,53,34,54,31,25,207,57,239,154,155,155,187,234,88,230,152,153,153,217,124,224,192,129,215,230,156,47,73,41,157,27,17,47,137,195,247,64,47,70,196,61,17,113,119,175,215,187,109,97,97,97,255,168,185,46,187,236,178,23,247,251,253,47,71,196,143,180,154,238,109,154,102,212,21,120,0,0,140,137,29,232,37,189,94,239,250,104,21,207,17,241,200,230,205,155,127,115,212,216,233,233,233,173,101,89,94,123,224,192,129,71,34,98,62,165,116,101,28,222,201,126,246,82,151,169,136,120,75,68,204,79,78,78,62,92,215,245,200,57,103,103,103,255,35,165,116,205,128,166,11,235,186,126,245,168,241,0,0,140,135,29,232,136,168,235,250,185,57,231,255,138,136,103,180,154,58,77,211,12,251,65,225,225,14,135,95,41,188,61,34,94,188,146,156,57,231,251,35,162,154,155,155,123,120,185,126,85,85,221,21,17,191,208,10,223,211,52,205,197,43,201,7,0,192,250,176,3,29,17,57,231,171,163,85,60,231,156,191,48,170,120,174,235,186,44,138,226,203,177,194,226,57,34,34,165,244,51,41,165,47,117,58,157,169,229,250,77,76,76,252,198,128,240,69,85,85,157,181,210,156,0,0,172,157,2,250,176,78,59,144,82,250,237,229,6,148,101,217,201,57,55,35,230,253,231,165,191,97,158,91,20,197,103,234,186,30,116,235,71,68,68,220,114,203,45,255,26,17,119,12,90,194,136,220,0,0,140,193,160,151,239,54,148,233,233,233,211,123,189,222,217,173,240,191,53,77,115,247,176,49,59,119,238,124,81,74,233,163,131,218,82,74,243,253,126,255,15,231,230,230,254,233,200,120,89,150,63,157,82,122,71,68,236,104,13,121,126,206,249,47,35,98,232,145,140,126,191,255,103,69,81,180,207,61,191,46,34,174,27,54,6,0,128,241,216,240,59,208,7,15,30,60,170,112,205,57,207,47,55,102,211,166,77,31,136,136,147,91,225,239,23,69,177,163,219,237,150,237,226,57,34,98,110,110,238,243,77,211,188,54,165,84,69,68,251,22,142,139,234,186,190,114,88,190,249,249,249,79,167,148,190,214,10,191,172,170,170,31,91,110,157,0,0,172,191,13,95,64,71,196,133,237,64,81,20,247,12,235,60,61,61,125,122,206,121,122,64,211,204,236,236,236,237,163,146,117,187,221,185,148,210,111,181,227,57,231,223,89,110,92,206,249,111,7,132,143,90,59,0,0,227,181,225,11,232,148,210,25,237,216,196,196,196,125,195,250,247,122,189,65,79,121,223,214,52,205,39,143,53,103,183,219,189,49,34,190,216,10,255,100,85,85,203,21,196,71,189,64,152,115,110,31,61,1,0,96,204,54,124,1,29,17,167,183,190,31,222,179,103,207,15,150,233,127,212,35,38,41,165,247,174,52,105,206,121,208,179,224,67,239,119,206,57,223,219,142,21,69,241,210,149,230,5,0,96,109,20,208,17,207,105,125,127,107,68,255,246,174,239,55,187,221,238,63,174,52,233,161,67,135,62,53,32,60,244,133,193,65,247,69,231,156,219,197,63,0,0,99,166,128,142,120,214,10,251,183,127,184,55,170,224,30,104,233,57,239,71,142,140,165,148,78,29,49,236,177,214,247,11,87,147,27,0,128,213,83,64,31,237,153,35,218,219,175,55,110,90,67,174,3,71,126,228,156,71,21,208,223,104,125,187,133,3,0,224,56,83,64,71,60,222,250,110,31,233,104,251,207,214,247,79,172,33,247,168,130,185,237,201,214,247,150,53,228,6,0,96,21,20,208,17,143,182,190,71,61,203,253,80,235,123,107,89,150,175,90,105,210,178,44,127,37,34,54,175,116,28,0,0,39,150,2,58,162,253,64,73,116,58,157,151,45,211,127,208,109,24,111,95,69,222,119,175,98,204,51,86,49,6,0,128,117,164,128,142,88,108,7,138,162,120,249,176,206,69,81,28,245,74,97,206,249,85,117,93,95,115,172,9,171,170,122,87,74,233,188,65,109,157,78,103,185,187,157,183,183,190,191,114,172,57,1,0,88,31,27,190,128,206,57,223,63,32,252,134,97,253,103,103,103,247,69,196,29,3,230,249,112,89,150,111,26,149,175,44,203,119,70,196,123,134,181,23,69,49,112,103,186,44,203,65,113,5,52,0,192,113,182,225,11,232,77,155,54,13,122,182,251,141,51,51,51,67,127,76,216,239,247,175,29,20,79,41,237,170,170,170,169,235,250,167,218,109,101,89,94,80,215,245,29,41,165,223,31,177,164,215,87,85,181,251,200,64,85,85,111,79,41,93,223,238,152,115,190,109,196,92,0,0,172,179,246,149,108,27,82,85,85,247,68,235,17,147,148,210,85,221,110,119,215,176,49,101,89,94,157,82,186,113,196,212,123,227,240,185,229,51,87,177,172,31,228,156,247,45,61,53,62,168,152,255,118,175,215,59,117,233,62,105,0,0,142,147,13,191,3,189,100,161,29,232,247,251,191,187,220,128,185,185,185,143,68,196,117,35,230,221,30,163,139,231,59,135,196,183,46,157,147,30,182,19,126,173,226,25,0,224,248,83,64,71,68,175,215,251,104,68,124,239,200,88,74,233,244,170,170,222,178,220,184,166,105,62,144,82,122,219,106,243,166,148,46,109,154,230,146,136,216,61,178,243,255,31,119,67,211,52,31,91,109,94,0,0,86,111,226,68,47,224,233,96,223,190,125,189,169,169,169,173,41,165,139,91,77,175,56,231,156,115,110,124,240,193,7,15,14,27,187,119,239,222,207,111,219,182,237,142,148,210,89,49,250,14,233,136,136,72,41,125,36,165,244,198,110,183,251,185,136,136,197,197,197,91,167,166,166,190,158,82,250,185,24,253,18,226,251,154,166,25,120,6,27,0,128,241,115,6,122,201,21,87,92,241,172,253,251,247,255,123,68,252,104,171,233,19,77,211,12,189,149,227,72,85,85,93,28,17,175,139,136,87,70,196,255,93,133,247,63,17,241,104,206,249,43,41,165,143,167,148,62,217,237,118,191,59,104,252,206,157,59,183,76,78,78,94,154,82,170,115,206,103,70,196,105,75,77,223,136,136,91,115,206,31,156,155,155,123,120,165,255,27,0,0,235,71,1,125,132,186,174,223,156,115,190,169,29,79,41,189,167,219,237,30,117,11,6,0,0,27,143,35,28,71,216,187,119,239,23,167,166,166,126,41,165,116,106,171,233,149,219,183,111,127,98,113,113,241,190,19,178,48,0,0,158,54,252,136,176,101,114,114,242,202,136,120,124,64,211,31,85,85,53,244,90,59,0,0,54,6,71,56,6,168,235,250,252,156,243,93,17,177,181,221,150,115,254,135,162,40,126,173,219,237,122,5,16,0,96,3,82,64,15,81,85,213,133,17,241,119,113,248,33,148,182,3,57,231,247,158,114,202,41,127,176,107,215,174,161,55,116,0,0,240,195,71,1,189,140,178,44,95,159,82,250,248,50,93,190,30,17,55,77,78,78,254,249,158,61,123,190,117,188,214,5,0,192,137,163,128,30,161,211,233,156,91,20,197,66,68,188,100,185,126,57,231,219,35,226,238,137,137,137,123,103,103,103,239,63,62,171,3,0,224,120,83,64,31,131,165,251,153,223,31,17,43,121,117,240,59,17,241,157,156,243,127,167,148,122,203,117,76,41,245,114,206,127,211,52,205,135,214,180,80,0,0,198,78,1,189,2,75,231,162,119,71,196,25,99,74,113,83,211,52,87,143,105,110,0,0,214,129,2,122,21,234,186,190,46,34,174,202,57,183,239,139,94,171,239,54,77,243,188,117,158,19,0,128,117,164,128,94,131,170,170,46,76,41,149,57,231,75,35,226,5,235,48,229,157,77,211,92,178,14,243,0,0,48,38,10,232,117,82,85,213,89,57,231,11,82,74,231,71,196,43,34,98,251,74,198,231,156,111,63,116,232,208,213,11,11,11,143,142,103,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,219,30,28,16,0,0,0,0,8,249,255,186,33,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,38,94,228,161,141,245,53,229,133,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32120,"duration_micros":973,"top":821.0,"left":39.0,"width":642.0,"height":2.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,16,191,73,68,65,84,120,156,236,214,193,13,0,17,20,64,65,52,236,40,42,144,61,110,197,148,224,230,139,204,84,240,142,47,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,73,57,58,96,167,246,54,163,27,0,0,56,231,31,223,213,143,90,162,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,237,193,33,1,0,0,0,128,160,255,175,157,97,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,93,151,220,4,4,198,193,223,37,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32123,"duration_micros":824,"top":737.0560302734375,"left":134.51600646972656,"width":115.32814025878906,"height":39.26397705078125,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,25,40,73,68,65,84,120,156,236,221,109,108,94,229,121,7,240,255,253,216,137,21,8,47,85,73,26,216,186,209,170,133,142,126,216,86,169,91,161,36,126,128,96,251,49,29,98,147,204,166,85,133,169,91,5,76,45,85,187,151,106,116,211,198,218,110,221,154,65,225,67,213,161,105,132,169,90,95,172,174,64,147,216,9,33,216,132,169,210,88,216,246,161,89,55,218,193,68,41,35,160,209,4,83,192,137,207,189,15,126,210,133,188,216,9,139,227,145,254,126,146,229,115,158,251,58,215,125,29,203,31,46,157,231,62,231,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,143,186,178,216,5,240,163,169,127,120,240,190,212,172,77,242,244,228,216,230,85,139,93,15,0,192,209,234,93,236,2,120,109,88,221,233,172,104,165,217,117,228,136,250,98,82,158,172,201,127,150,90,238,237,233,237,253,234,182,13,27,158,60,113,21,2,0,156,24,173,197,46,128,147,69,89,150,228,45,37,185,44,165,222,54,51,51,253,104,127,103,224,134,248,150,3,0,56,201,184,2,205,171,80,191,86,74,185,227,160,207,122,211,180,206,74,154,119,213,82,222,151,148,83,146,124,174,127,120,104,217,228,166,241,91,22,165,76,0,128,5,160,129,230,216,213,242,216,196,216,230,241,35,140,174,111,15,13,125,186,182,234,182,212,188,169,214,250,153,139,135,135,55,60,180,105,211,191,159,208,26,1,0,22,136,37,28,28,119,19,227,227,143,215,218,92,159,36,37,105,181,154,125,239,91,236,154,0,0,142,23,13,52,11,226,13,203,207,188,63,201,84,146,164,148,11,23,183,26,0,128,227,199,18,14,22,196,232,232,232,76,255,240,224,119,83,243,182,146,188,241,104,142,105,15,13,93,220,148,92,95,146,11,147,186,42,201,19,73,30,108,181,234,95,62,176,113,203,142,163,157,123,245,224,224,59,90,165,94,155,82,214,38,57,55,169,37,41,143,167,212,7,210,180,214,79,142,143,63,60,95,29,181,212,237,73,210,164,245,246,237,99,99,59,215,12,12,188,177,213,83,174,171,37,239,73,205,91,146,236,73,201,55,107,83,191,240,236,105,103,124,113,231,232,232,244,209,212,118,201,208,208,249,77,169,239,79,50,144,228,173,73,122,147,242,100,82,31,74,43,235,39,55,110,126,224,104,207,19,0,88,28,174,64,179,112,106,206,236,110,252,247,92,97,237,118,187,183,127,120,232,150,90,234,246,146,250,222,164,190,57,201,41,73,206,79,242,129,166,41,15,175,25,30,252,240,124,211,93,48,50,178,180,127,120,232,150,86,43,59,82,202,141,73,46,152,205,83,150,37,249,169,212,242,155,41,245,31,250,59,67,183,95,48,50,178,244,104,78,161,183,53,179,172,61,60,56,84,122,202,55,107,242,241,212,252,116,146,83,147,156,157,154,181,165,148,245,43,94,216,179,117,117,167,179,98,158,84,165,221,25,248,237,166,212,127,77,242,187,73,126,166,155,167,175,123,190,215,164,201,182,118,103,104,253,133,35,35,203,142,166,54,0,96,113,104,160,89,16,237,129,129,183,37,233,190,32,165,236,156,43,182,46,235,187,57,181,126,36,201,115,53,101,93,74,222,95,74,110,72,234,215,186,33,165,212,124,118,77,103,224,210,35,229,24,25,25,233,89,49,181,251,235,221,60,73,242,131,164,220,81,107,185,62,181,94,151,82,63,151,228,133,238,140,31,90,49,181,251,235,35,35,35,61,243,157,71,211,228,231,106,205,61,73,150,167,230,43,181,228,131,53,185,182,166,172,75,178,123,54,93,86,183,106,243,249,185,242,172,233,12,222,94,83,62,147,217,199,250,61,87,146,219,106,173,191,86,83,127,37,201,31,166,228,177,217,84,245,218,165,83,123,238,57,154,218,0,128,197,97,9,7,199,221,200,200,72,207,174,169,61,127,182,127,191,166,249,242,28,225,175,79,114,83,82,55,149,190,233,247,78,222,61,241,253,3,198,62,191,166,51,120,77,73,238,74,146,146,124,42,201,97,215,83,239,154,218,115,83,82,6,186,187,15,53,77,174,222,190,121,252,169,3,99,46,187,242,178,63,222,183,183,247,75,73,218,73,25,216,53,181,231,99,73,254,100,238,179,41,235,146,188,80,106,185,114,98,124,252,161,3,71,218,157,206,109,53,117,50,169,111,78,201,47,181,135,134,46,62,56,102,54,110,224,170,154,124,176,187,123,247,116,147,95,255,198,230,205,175,184,42,127,193,200,200,167,87,76,61,191,46,169,31,74,114,249,174,231,119,223,152,228,214,185,107,3,0,22,131,43,208,28,23,237,118,187,247,162,129,129,149,151,12,14,94,177,107,106,207,182,36,87,206,142,212,77,221,27,10,143,164,55,201,163,125,51,185,122,226,149,205,115,146,228,193,177,205,127,147,212,77,179,123,229,93,107,6,6,14,89,79,125,233,240,240,79,214,228,143,186,187,143,151,190,151,127,97,251,230,205,79,29,28,119,255,189,247,63,189,100,239,204,85,73,30,239,126,116,115,187,211,249,241,121,78,237,148,212,114,221,225,26,227,137,177,177,239,38,205,254,198,56,53,245,23,15,115,124,169,41,127,222,221,126,100,122,249,233,191,122,112,243,156,36,59,71,71,167,39,199,198,63,156,212,45,179,71,149,223,59,218,101,38,0,192,137,165,129,230,216,149,124,180,191,51,88,15,252,169,203,250,246,46,233,41,79,55,173,108,72,178,166,27,249,96,239,244,204,53,163,163,163,51,115,165,171,201,39,183,108,217,242,194,17,199,107,190,178,127,187,213,91,222,126,240,248,76,211,92,93,186,255,203,181,228,227,135,107,196,247,219,186,117,235,238,154,250,251,221,221,222,38,205,47,207,85,91,146,71,39,199,199,71,143,52,184,114,249,25,91,242,195,165,33,249,217,131,199,87,15,14,190,51,179,55,11,166,214,242,169,111,140,142,190,56,199,92,53,201,103,187,219,43,206,154,250,126,123,158,218,0,128,69,96,9,7,11,225,145,164,254,213,202,229,103,220,49,95,243,156,36,173,210,179,101,174,241,158,82,191,221,236,127,35,120,83,206,58,36,160,212,75,146,164,38,205,210,233,153,141,243,205,183,116,111,179,97,122,73,79,83,146,86,73,189,52,201,95,28,41,182,36,247,206,149,107,116,116,116,166,191,51,184,51,201,59,83,114,206,193,227,173,82,223,253,195,183,153,151,242,88,123,104,232,220,185,242,53,173,102,119,105,186,199,166,117,94,146,57,255,54,0,192,137,167,129,230,213,184,183,85,242,215,7,126,80,147,151,75,169,207,76,79,215,167,254,254,190,251,190,119,12,185,166,39,54,109,122,122,206,136,166,53,181,255,187,146,90,154,211,14,13,40,231,39,53,37,249,222,214,173,91,119,207,55,225,214,173,91,119,247,15,13,254,215,108,195,91,206,155,115,234,146,39,230,203,87,147,61,221,22,249,140,67,42,43,229,199,234,254,237,52,143,212,50,119,174,210,188,34,96,213,124,115,3,0,39,158,6,154,99,87,243,237,7,198,54,223,115,156,178,61,151,217,165,11,71,180,175,148,218,218,31,82,91,135,105,65,235,242,238,198,179,71,61,107,201,174,36,231,36,57,76,67,126,96,234,250,252,188,169,74,106,183,188,67,106,171,37,175,159,251,236,230,152,250,48,249,0,128,197,167,129,230,36,80,166,146,186,50,201,161,203,59,142,164,102,101,183,61,157,183,65,254,191,168,181,60,91,102,59,232,58,181,235,217,190,29,59,118,236,93,200,249,0,128,133,231,38,66,94,243,106,234,163,179,191,115,206,207,119,58,167,207,23,223,190,170,125,102,74,206,78,146,90,242,111,11,89,91,43,245,201,238,102,89,182,234,204,163,122,35,35,0,240,255,155,43,208,188,230,149,82,38,83,235,96,73,90,125,165,121,79,146,191,157,43,190,121,185,239,202,178,127,121,68,205,130,190,58,187,180,234,246,218,93,215,220,219,244,94,153,255,125,202,198,97,173,30,28,60,59,165,172,72,146,158,151,94,218,57,49,49,177,111,33,235,3,0,142,157,43,208,188,230,205,148,189,95,78,119,29,117,73,62,185,118,237,218,67,110,230,219,239,226,43,174,120,93,73,62,209,221,221,219,219,179,228,75,11,89,219,3,27,183,236,72,201,183,50,91,224,199,46,26,24,88,121,164,216,11,70,70,150,182,90,153,108,149,250,47,173,82,191,56,49,49,49,239,19,76,0,128,19,79,3,205,107,222,67,27,239,255,143,36,127,154,36,169,121,211,222,37,189,127,183,186,211,89,113,112,92,123,120,120,85,79,221,119,79,146,159,152,13,205,31,108,219,176,225,201,131,227,142,183,146,250,59,221,205,85,75,122,202,221,239,190,252,242,67,30,119,215,233,116,250,86,76,237,185,51,221,103,70,151,90,63,145,121,110,174,4,0,22,135,37,28,156,20,158,89,126,250,205,43,166,246,92,148,164,157,212,75,91,169,223,233,31,26,184,51,173,242,207,181,41,173,210,106,222,81,235,204,181,73,78,77,146,90,178,241,13,167,158,190,238,68,212,54,177,105,203,134,254,225,161,91,83,235,71,146,92,216,219,219,250,86,255,208,192,157,37,173,135,155,210,236,109,213,214,91,127,144,230,3,233,54,246,41,245,11,19,99,91,22,244,202,56,0,240,234,105,160,57,41,236,28,29,157,110,183,219,157,102,89,223,173,37,185,62,201,105,41,229,198,212,164,148,154,28,240,0,230,154,178,238,133,167,159,185,105,116,199,230,19,182,68,98,114,211,248,71,251,135,6,158,168,165,172,43,221,218,106,106,74,74,106,57,224,66,115,173,183,151,23,167,127,235,68,213,5,0,28,59,13,52,39,141,137,137,137,151,146,220,208,238,116,238,106,210,92,91,146,75,146,156,155,212,38,41,223,73,173,219,106,233,89,255,224,216,216,63,45,70,125,147,227,91,110,189,120,120,120,99,79,179,239,55,210,42,3,169,245,188,164,204,36,121,162,38,247,183,74,115,215,196,216,125,255,184,24,181,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,79,123,112,32,0,0,0,0,32,200,223,122,133,1,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,11,233,105,217,155,230,115,107,3,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32124,"duration_micros":1339,"top":734.0,"left":64.0,"width":48.0,"height":48.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,25,213,73,68,65,84,120,156,236,221,125,140,165,87,89,0,240,231,188,51,75,119,217,82,62,4,13,130,109,10,169,13,217,217,150,86,90,181,214,22,37,54,6,89,2,132,237,125,223,183,157,56,182,66,43,105,144,196,106,164,32,148,200,151,68,163,6,155,210,149,172,197,237,220,119,198,73,128,180,165,68,171,133,214,74,139,8,161,221,113,173,98,72,11,86,4,161,64,43,217,110,247,238,61,254,177,99,178,190,123,239,220,157,143,187,219,48,191,95,50,127,188,207,249,120,206,252,247,228,228,220,115,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,33,157,232,5,252,48,168,235,250,229,17,177,45,231,124,106,68,156,31,17,23,69,196,243,90,221,190,29,17,143,166,148,30,234,247,251,159,75,41,125,182,105,154,7,143,247,90,1,0,88,27,5,244,42,205,204,204,60,231,201,39,159,252,245,148,210,155,35,226,140,85,78,243,80,68,124,108,203,150,45,55,236,222,189,251,137,117,92,30,0,0,99,162,128,94,161,178,44,127,60,165,116,125,68,188,105,29,167,125,60,34,254,228,164,147,78,250,227,155,111,190,249,123,235,56,47,0,0,235,76,1,125,140,102,102,102,54,63,245,212,83,239,200,57,191,115,140,105,190,31,17,239,111,154,230,67,99,204,1,0,192,26,40,160,143,65,167,211,57,187,40,138,249,136,56,243,24,135,124,51,14,31,207,136,136,120,118,68,188,40,34,94,112,172,249,114,206,95,40,138,162,236,118,187,95,93,217,74,1,0,24,55,5,244,8,85,85,93,30,17,123,70,116,219,159,82,250,108,68,252,117,74,233,206,217,217,217,125,237,14,59,118,236,120,230,201,39,159,124,94,68,252,108,68,188,58,34,126,126,196,156,143,69,196,107,154,166,185,111,53,235,6,0,96,60,20,208,203,40,203,242,173,41,165,63,93,166,203,167,250,253,254,13,243,243,243,159,94,233,220,85,85,61,63,165,244,134,156,243,187,226,240,14,245,64,41,165,95,236,118,187,159,89,233,252,0,0,140,135,2,122,136,170,170,126,53,34,110,30,210,252,47,69,81,92,49,59,59,123,255,90,243,76,79,79,111,61,120,240,224,245,41,165,183,69,196,228,128,46,79,244,251,253,11,230,231,231,23,215,154,11,0,128,181,83,64,15,80,85,213,47,71,196,176,93,229,166,105,154,122,189,115,118,58,157,115,139,162,184,53,6,236,70,167,148,190,118,240,224,193,115,22,22,22,30,91,239,188,0,0,172,76,113,162,23,240,116,51,61,61,125,122,68,252,213,144,230,247,141,163,120,142,136,152,159,159,255,210,166,77,155,206,142,136,191,111,183,229,156,79,157,156,156,252,196,56,242,2,0,176,50,19,39,122,1,79,55,219,182,109,187,43,34,78,27,208,244,214,166,105,62,56,206,220,15,60,240,192,254,197,197,197,191,216,190,125,251,185,113,244,141,31,167,77,77,77,77,44,46,46,58,15,13,0,112,2,217,129,62,66,89,150,239,142,136,115,218,241,156,243,53,77,211,124,248,120,173,163,215,235,149,17,241,64,59,158,82,250,189,78,167,115,222,241,90,7,0,0,71,115,6,122,201,229,151,95,254,194,67,135,14,125,53,34,54,31,25,207,57,239,154,155,155,187,234,88,230,152,153,153,217,124,224,192,129,215,230,156,47,73,41,157,27,17,47,137,195,247,64,47,70,196,61,17,113,119,175,215,187,109,97,97,97,255,168,185,46,187,236,178,23,247,251,253,47,71,196,143,180,154,238,109,154,102,212,21,120,0,0,140,137,29,232,37,189,94,239,250,104,21,207,17,241,200,230,205,155,127,115,212,216,233,233,233,173,101,89,94,123,224,192,129,71,34,98,62,165,116,101,28,222,201,126,246,82,151,169,136,120,75,68,204,79,78,78,62,92,215,245,200,57,103,103,103,255,35,165,116,205,128,166,11,235,186,126,245,168,241,0,0,140,135,29,232,136,168,235,250,185,57,231,255,138,136,103,180,154,58,77,211,12,251,65,225,225,14,135,95,41,188,61,34,94,188,146,156,57,231,251,35,162,154,155,155,123,120,185,126,85,85,221,21,17,191,208,10,223,211,52,205,197,43,201,7,0,192,250,176,3,29,17,57,231,171,163,85,60,231,156,191,48,170,120,174,235,186,44,138,226,203,177,194,226,57,34,34,165,244,51,41,165,47,117,58,157,169,229,250,77,76,76,252,198,128,240,69,85,85,157,181,210,156,0,0,172,157,2,250,176,78,59,144,82,250,237,229,6,148,101,217,201,57,55,35,230,253,231,165,191,97,158,91,20,197,103,234,186,30,116,235,71,68,68,220,114,203,45,255,26,17,119,12,90,194,136,220,0,0,140,193,160,151,239,54,148,233,233,233,211,123,189,222,217,173,240,191,53,77,115,247,176,49,59,119,238,124,81,74,233,163,131,218,82,74,243,253,126,255,15,231,230,230,254,233,200,120,89,150,63,157,82,122,71,68,236,104,13,121,126,206,249,47,35,98,232,145,140,126,191,255,103,69,81,180,207,61,191,46,34,174,27,54,6,0,128,241,216,240,59,208,7,15,30,60,170,112,205,57,207,47,55,102,211,166,77,31,136,136,147,91,225,239,23,69,177,163,219,237,150,237,226,57,34,98,110,110,238,243,77,211,188,54,165,84,69,68,251,22,142,139,234,186,190,114,88,190,249,249,249,79,167,148,190,214,10,191,172,170,170,31,91,110,157,0,0,172,191,13,95,64,71,196,133,237,64,81,20,247,12,235,60,61,61,125,122,206,121,122,64,211,204,236,236,236,237,163,146,117,187,221,185,148,210,111,181,227,57,231,223,89,110,92,206,249,111,7,132,143,90,59,0,0,227,181,225,11,232,148,210,25,237,216,196,196,196,125,195,250,247,122,189,65,79,121,223,214,52,205,39,143,53,103,183,219,189,49,34,190,216,10,255,100,85,85,203,21,196,71,189,64,152,115,110,31,61,1,0,96,204,54,124,1,29,17,167,183,190,31,222,179,103,207,15,150,233,127,212,35,38,41,165,247,174,52,105,206,121,208,179,224,67,239,119,206,57,223,219,142,21,69,241,210,149,230,5,0,96,109,20,208,17,207,105,125,127,107,68,255,246,174,239,55,187,221,238,63,174,52,233,161,67,135,62,53,32,60,244,133,193,65,247,69,231,156,219,197,63,0,0,99,166,128,142,120,214,10,251,183,127,184,55,170,224,30,104,233,57,239,71,142,140,165,148,78,29,49,236,177,214,247,11,87,147,27,0,128,213,83,64,31,237,153,35,218,219,175,55,110,90,67,174,3,71,126,228,156,71,21,208,223,104,125,187,133,3,0,224,56,83,64,71,60,222,250,110,31,233,104,251,207,214,247,79,172,33,247,168,130,185,237,201,214,247,150,53,228,6,0,96,21,20,208,17,143,182,190,71,61,203,253,80,235,123,107,89,150,175,90,105,210,178,44,127,37,34,54,175,116,28,0,0,39,150,2,58,162,253,64,73,116,58,157,151,45,211,127,208,109,24,111,95,69,222,119,175,98,204,51,86,49,6,0,128,117,164,128,142,88,108,7,138,162,120,249,176,206,69,81,28,245,74,97,206,249,85,117,93,95,115,172,9,171,170,122,87,74,233,188,65,109,157,78,103,185,187,157,183,183,190,191,114,172,57,1,0,88,31,27,190,128,206,57,223,63,32,252,134,97,253,103,103,103,247,69,196,29,3,230,249,112,89,150,111,26,149,175,44,203,119,70,196,123,134,181,23,69,49,112,103,186,44,203,65,113,5,52,0,192,113,182,225,11,232,77,155,54,13,122,182,251,141,51,51,51,67,127,76,216,239,247,175,29,20,79,41,237,170,170,170,169,235,250,167,218,109,101,89,94,80,215,245,29,41,165,223,31,177,164,215,87,85,181,251,200,64,85,85,111,79,41,93,223,238,152,115,190,109,196,92,0,0,172,179,246,149,108,27,82,85,85,247,68,235,17,147,148,210,85,221,110,119,215,176,49,101,89,94,157,82,186,113,196,212,123,227,240,185,229,51,87,177,172,31,228,156,247,45,61,53,62,168,152,255,118,175,215,59,117,233,62,105,0,0,142,147,13,191,3,189,100,161,29,232,247,251,191,187,220,128,185,185,185,143,68,196,117,35,230,221,30,163,139,231,59,135,196,183,46,157,147,30,182,19,126,173,226,25,0,224,248,83,64,71,68,175,215,251,104,68,124,239,200,88,74,233,244,170,170,222,178,220,184,166,105,62,144,82,122,219,106,243,166,148,46,109,154,230,146,136,216,61,178,243,255,31,119,67,211,52,31,91,109,94,0,0,86,111,226,68,47,224,233,96,223,190,125,189,169,169,169,173,41,165,139,91,77,175,56,231,156,115,110,124,240,193,7,15,14,27,187,119,239,222,207,111,219,182,237,142,148,210,89,49,250,14,233,136,136,72,41,125,36,165,244,198,110,183,251,185,136,136,197,197,197,91,167,166,166,190,158,82,250,185,24,253,18,226,251,154,166,25,120,6,27,0,128,241,115,6,122,201,21,87,92,241,172,253,251,247,255,123,68,252,104,171,233,19,77,211,12,189,149,227,72,85,85,93,28,17,175,139,136,87,70,196,255,93,133,247,63,17,241,104,206,249,43,41,165,143,167,148,62,217,237,118,191,59,104,252,206,157,59,183,76,78,78,94,154,82,170,115,206,103,70,196,105,75,77,223,136,136,91,115,206,31,156,155,155,123,120,165,255,27,0,0,235,71,1,125,132,186,174,223,156,115,190,169,29,79,41,189,167,219,237,30,117,11,6,0,0,27,143,35,28,71,216,187,119,239,23,167,166,166,126,41,165,116,106,171,233,149,219,183,111,127,98,113,113,241,190,19,178,48,0,0,158,54,252,136,176,101,114,114,242,202,136,120,124,64,211,31,85,85,53,244,90,59,0,0,54,6,71,56,6,168,235,250,252,156,243,93,17,177,181,221,150,115,254,135,162,40,126,173,219,237,122,5,16,0,96,3,82,64,15,81,85,213,133,17,241,119,113,248,33,148,182,3,57,231,247,158,114,202,41,127,176,107,215,174,161,55,116,0,0,240,195,71,1,189,140,178,44,95,159,82,250,248,50,93,190,30,17,55,77,78,78,254,249,158,61,123,190,117,188,214,5,0,192,137,163,128,30,161,211,233,156,91,20,197,66,68,188,100,185,126,57,231,219,35,226,238,137,137,137,123,103,103,103,239,63,62,171,3,0,224,120,83,64,31,131,165,251,153,223,31,17,43,121,117,240,59,17,241,157,156,243,127,167,148,122,203,117,76,41,245,114,206,127,211,52,205,135,214,180,80,0,0,198,78,1,189,2,75,231,162,119,71,196,25,99,74,113,83,211,52,87,143,105,110,0,0,214,129,2,122,21,234,186,190,46,34,174,202,57,183,239,139,94,171,239,54,77,243,188,117,158,19,0,128,117,164,128,94,131,170,170,46,76,41,149,57,231,75,35,226,5,235,48,229,157,77,211,92,178,14,243,0,0,48,38,10,232,117,82,85,213,89,57,231,11,82,74,231,71,196,43,34,98,251,74,198,231,156,111,63,116,232,208,213,11,11,11,143,142,103,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,219,30,28,16,0,0,0,0,8,249,255,186,33,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,38,214,160,161,141,153,172,147,8,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32133,"duration_micros":786,"top":989.0,"left":39.0,"width":642.0,"height":2.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,16,191,73,68,65,84,120,156,236,214,193,13,0,17,20,64,65,52,236,40,42,144,61,110,197,148,224,230,139,204,84,240,142,47,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,73,57,58,96,167,246,54,163,27,0,0,56,231,31,223,213,143,90,162,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,237,193,33,1,0,0,0,128,160,255,175,157,97,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,93,19,102,4,4,243,83,127,238,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32136,"duration_micros":847,"top":905.0560302734375,"left":134.51600646972656,"width":164.79225158691406,"height":39.26397705078125,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,31,73,73,68,65,84,120,156,236,221,125,144,94,87,125,31,240,239,185,171,23,203,150,109,94,132,101,211,186,152,212,105,33,53,96,163,130,95,132,180,43,108,239,179,207,26,49,45,116,3,129,49,78,152,9,161,131,200,128,25,200,184,52,141,50,105,27,8,147,210,38,3,105,152,132,146,216,161,53,130,26,176,188,111,178,236,149,140,236,152,140,193,64,198,78,11,19,243,26,176,13,6,203,18,150,228,221,231,244,143,231,89,121,181,236,74,50,72,50,118,63,159,25,205,60,231,222,223,253,157,115,87,210,204,239,57,123,238,185,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,255,187,242,100,15,0,120,122,234,111,183,222,159,228,61,73,82,74,223,89,83,163,163,223,123,146,135,4,0,199,196,146,39,123,0,60,53,172,107,183,159,211,164,243,192,226,17,245,209,164,124,167,38,223,40,181,124,182,111,201,146,79,221,178,117,235,119,78,220,8,1,0,78,140,230,201,30,0,79,23,101,69,146,115,75,114,105,74,253,111,51,51,7,190,218,223,30,252,183,241,91,14,0,224,105,198,12,52,63,133,122,67,41,229,35,243,142,45,73,167,89,149,116,46,170,165,92,153,148,147,147,124,184,127,120,104,197,142,209,241,255,242,164,12,19,0,224,56,80,64,243,196,213,114,223,212,216,196,248,34,103,63,54,48,52,244,190,218,212,91,82,243,252,90,235,7,94,49,60,188,245,115,163,163,255,247,132,142,17,0,224,56,177,132,131,99,110,106,124,252,235,181,118,222,154,36,37,105,154,206,244,149,79,246,152,0,0,142,21,5,52,199,197,234,149,207,216,158,100,79,146,164,148,139,159,220,209,0,0,28,59,150,112,112,92,108,217,178,101,166,127,184,245,237,212,188,160,36,103,47,22,55,208,106,157,219,41,245,170,146,210,78,201,47,36,105,146,250,205,82,115,123,77,243,23,59,198,199,239,56,154,254,54,180,90,87,204,52,185,178,36,23,37,57,43,221,226,253,203,37,249,212,35,75,150,125,244,174,27,111,252,241,241,200,209,223,30,252,114,82,94,148,228,11,59,198,38,214,44,148,183,127,104,232,101,41,245,243,189,102,237,164,89,125,219,216,216,131,243,227,214,172,89,179,116,229,25,171,126,152,228,148,164,222,176,99,108,242,53,11,229,91,179,113,227,201,43,167,15,188,49,53,175,73,201,75,147,60,43,201,15,147,220,157,90,62,93,246,237,251,203,169,169,169,61,135,187,215,254,225,214,182,212,92,86,147,235,119,142,77,188,62,73,214,181,219,191,84,210,249,245,146,92,150,228,156,61,75,150,173,94,232,158,71,70,70,250,238,223,187,251,181,165,147,215,37,185,40,37,171,146,220,95,147,123,154,90,174,203,190,125,159,156,154,154,218,119,184,254,1,224,169,204,12,52,199,79,205,51,122,31,30,90,224,108,89,63,52,248,59,181,201,189,165,148,127,159,146,53,73,158,153,228,244,164,188,168,150,242,27,41,245,246,254,161,214,31,14,12,12,44,250,69,111,205,154,53,75,251,135,90,215,119,154,108,45,201,235,146,60,47,201,178,116,139,202,129,154,252,241,202,233,3,119,175,31,28,124,254,113,201,81,179,181,247,233,165,3,27,55,174,90,40,127,73,231,210,185,205,82,58,27,22,138,59,109,245,179,95,154,228,148,36,169,181,153,88,40,102,195,21,131,107,86,78,31,184,39,201,71,82,50,148,228,140,116,191,8,63,39,201,229,41,245,67,117,197,242,123,215,181,90,47,95,236,126,15,29,91,78,75,146,254,225,161,107,154,116,254,182,36,239,72,114,94,146,149,11,197,175,31,28,60,251,129,61,187,239,40,53,215,167,228,53,41,121,110,186,63,171,179,75,210,170,165,94,91,87,44,191,125,160,213,58,247,104,250,7,128,167,34,5,52,199,197,192,224,224,11,146,156,217,109,149,123,230,159,239,111,183,222,87,74,217,156,110,241,183,55,181,254,81,74,222,92,75,222,88,146,247,39,233,22,221,37,87,119,86,44,251,173,197,250,57,245,140,85,191,147,146,95,238,182,234,87,74,242,206,90,242,186,90,178,41,201,84,47,236,23,203,146,114,195,154,53,107,150,30,235,28,181,228,230,217,207,101,230,192,218,133,242,215,82,174,152,219,46,73,123,193,184,154,117,7,27,75,102,110,153,127,126,160,213,186,172,211,41,183,167,91,224,39,201,23,75,173,215,212,228,170,36,191,149,228,111,122,199,255,113,211,228,182,129,86,235,178,133,250,57,180,211,156,62,208,110,109,74,173,255,57,7,183,28,172,63,74,242,237,101,39,157,84,231,245,127,110,233,43,127,147,228,101,189,67,15,151,154,15,149,228,237,169,245,234,148,124,44,201,254,36,23,212,38,99,169,121,214,17,251,7,128,167,32,75,56,56,230,70,70,70,250,30,216,179,251,253,179,237,154,206,245,115,207,175,27,26,122,113,82,223,221,107,126,173,164,217,48,53,62,246,237,57,33,31,95,63,56,248,161,210,87,62,151,228,159,148,148,205,3,195,195,127,62,255,77,118,237,118,123,249,143,211,121,71,175,121,247,129,149,167,95,114,199,150,45,143,206,9,249,208,250,118,235,131,37,121,71,106,94,114,218,234,85,195,73,62,115,44,115,60,182,242,244,59,150,237,121,248,209,164,172,152,169,25,152,159,255,21,87,92,241,204,218,153,190,164,91,153,150,79,38,245,223,164,230,138,145,145,145,190,45,91,182,204,204,141,173,181,92,154,146,164,228,190,157,91,183,125,117,238,185,129,225,225,51,107,157,185,46,221,217,222,199,106,234,91,119,142,77,126,52,135,250,131,254,225,214,149,169,249,179,36,203,106,147,107,47,25,28,124,201,237,147,147,139,191,0,167,228,220,218,251,194,82,74,222,123,96,186,254,239,133,226,71,70,70,250,238,223,243,200,199,74,234,234,238,96,243,137,125,165,249,245,59,199,199,118,207,27,231,53,181,206,92,159,100,125,74,254,233,162,253,2,192,83,152,25,104,142,137,129,129,129,37,151,12,14,158,177,161,213,186,226,129,61,187,111,73,242,234,238,153,58,218,123,160,240,160,166,212,127,149,222,108,103,41,121,251,212,216,33,197,115,146,100,231,228,228,183,106,201,53,189,230,146,218,153,126,245,252,152,71,59,157,179,211,91,242,144,100,116,94,225,155,36,153,158,169,191,159,154,31,36,121,168,211,169,23,30,235,28,221,248,178,45,221,27,106,205,191,182,111,102,102,160,116,255,159,29,168,125,51,255,174,119,248,57,223,255,241,195,231,207,141,107,183,219,203,83,106,127,146,164,83,111,156,159,167,102,250,183,147,172,238,245,115,245,2,197,115,146,100,199,232,196,181,181,228,234,94,243,204,165,77,222,187,80,220,28,103,36,217,87,251,58,23,77,141,78,252,247,197,138,237,7,30,121,228,53,37,181,59,195,94,114,243,142,139,46,254,149,59,199,14,45,158,147,100,106,116,244,123,123,150,44,107,39,185,55,94,162,3,192,211,148,25,104,158,184,146,171,251,219,173,171,231,30,170,73,150,38,233,28,26,185,115,201,129,153,55,205,159,105,109,154,122,83,166,203,93,73,178,251,251,223,223,158,69,52,125,203,38,235,244,129,94,159,205,121,243,207,207,36,123,103,191,1,214,228,210,129,129,129,223,155,255,240,90,175,32,92,112,109,242,177,202,145,90,38,82,234,171,147,188,112,237,229,151,63,119,215,182,109,255,112,240,92,169,151,247,62,109,223,185,117,219,87,251,219,173,47,38,185,96,166,83,46,75,114,215,108,216,190,76,255,203,164,89,209,189,230,241,101,33,73,50,48,48,112,82,173,229,170,94,194,191,159,186,240,162,15,103,108,193,37,210,73,146,157,47,191,248,79,250,63,127,199,187,82,243,252,148,242,230,118,187,253,158,177,177,177,253,139,197,151,228,247,118,204,155,241,254,201,160,250,134,199,111,119,230,55,179,121,115,103,177,208,187,110,188,241,199,27,134,134,222,217,41,117,177,189,194,1,224,41,77,1,205,241,240,133,164,254,217,25,43,79,255,200,252,226,57,73,110,189,105,242,174,185,237,145,145,145,190,135,246,63,180,106,102,95,223,51,103,154,102,217,236,241,153,199,30,75,83,50,157,238,191,211,179,230,231,185,109,98,226,187,253,237,214,84,146,129,146,92,88,87,44,191,189,127,104,232,247,203,73,251,182,77,125,122,234,71,71,51,208,99,145,163,116,58,183,212,190,238,100,107,223,210,230,21,73,62,49,123,42,201,171,122,31,70,123,199,182,38,185,160,116,143,63,190,204,165,150,117,41,73,77,58,205,242,3,183,29,210,193,138,21,231,39,157,222,195,133,157,143,31,174,120,77,146,108,222,220,41,237,214,199,107,242,222,36,43,247,149,153,243,147,220,185,104,124,45,159,62,210,45,230,241,117,219,119,239,188,233,230,123,143,16,159,186,111,223,246,172,88,254,96,186,15,55,2,192,211,138,2,154,159,198,103,155,146,67,150,16,212,100,127,41,245,193,3,7,234,119,15,153,129,61,140,13,237,203,215,118,82,54,61,176,231,225,161,100,201,51,210,151,52,169,139,133,47,95,232,224,116,223,204,85,75,102,250,198,147,188,48,201,5,41,245,19,117,255,242,218,223,110,125,169,38,159,43,169,147,123,150,44,223,126,184,109,236,126,214,28,83,147,147,127,215,223,110,125,61,201,57,169,217,144,94,1,189,174,221,126,97,210,57,59,73,58,205,76,119,166,189,147,109,105,242,219,73,214,94,220,106,61,235,142,137,137,135,146,164,54,229,210,212,164,36,59,127,162,112,175,51,231,164,244,86,67,148,114,248,153,226,158,78,173,95,45,189,107,102,106,206,201,226,5,244,99,83,227,227,95,63,92,174,129,141,27,159,93,167,15,204,254,252,191,112,52,253,79,77,77,77,247,183,135,190,146,212,87,30,77,60,0,60,149,40,160,121,226,106,190,118,235,216,196,103,142,28,184,168,210,63,60,244,135,157,90,223,249,179,14,101,215,214,155,191,217,110,183,47,216,91,103,94,95,74,121,91,186,59,68,148,36,231,151,228,252,164,108,90,57,125,224,254,254,225,214,187,119,140,78,92,123,188,114,212,100,107,73,54,149,242,248,58,232,38,51,151,246,150,1,127,99,118,214,246,193,211,78,187,243,57,123,118,239,73,178,114,73,95,54,36,249,212,197,35,35,43,178,103,247,250,222,101,99,243,115,119,210,156,82,122,95,44,74,234,15,143,230,231,82,74,230,110,29,120,202,162,129,221,253,163,15,239,192,129,103,204,62,45,81,83,22,218,146,112,65,53,245,65,139,160,1,120,58,242,16,33,39,220,192,112,235,55,50,91,60,151,220,151,146,55,77,247,205,60,175,60,186,127,197,142,177,137,50,231,79,147,100,250,72,249,198,198,198,246,239,28,159,252,139,29,99,19,47,95,114,96,122,85,82,135,107,173,155,243,248,108,233,234,212,252,101,255,112,235,215,142,91,142,218,125,144,48,53,207,31,24,26,58,167,123,176,180,187,135,114,240,161,192,123,182,108,57,144,148,241,36,105,106,183,216,94,186,247,225,151,165,187,187,70,154,166,254,196,154,240,38,157,189,7,187,73,121,230,145,126,30,73,82,15,221,66,110,239,162,129,89,124,202,127,86,223,244,244,193,34,187,164,30,245,214,116,37,197,242,13,0,158,150,20,208,156,112,181,166,183,175,115,125,180,212,102,253,142,209,137,107,119,109,189,249,155,243,31,222,91,63,56,120,78,158,224,111,73,182,111,223,254,131,29,99,147,99,59,199,39,127,119,199,216,196,154,166,150,161,36,221,39,17,107,222,151,205,155,143,248,111,254,167,201,209,156,180,111,103,237,61,67,89,155,186,110,205,198,141,39,39,121,101,146,148,212,201,121,247,63,251,112,221,198,108,222,220,52,157,102,118,246,249,161,85,39,159,126,247,252,220,157,190,124,115,206,197,191,120,164,241,39,73,41,229,159,29,188,164,83,238,59,154,107,22,179,125,251,246,135,146,218,221,157,164,230,37,71,115,205,200,200,72,95,82,255,197,207,210,47,0,252,188,82,64,115,66,93,216,110,159,150,164,59,67,91,203,142,133,182,176,155,85,250,186,15,224,45,102,221,112,235,181,253,67,131,111,89,63,52,120,213,98,49,183,142,143,79,36,249,95,189,230,25,107,119,237,58,243,88,231,72,146,169,79,79,253,168,36,59,123,205,87,158,50,189,239,21,233,174,219,158,94,250,88,103,231,220,216,38,153,157,101,62,115,224,243,187,94,92,75,237,190,169,176,212,209,133,30,186,220,219,44,191,123,182,128,45,165,121,195,145,190,4,116,139,215,188,177,215,220,179,178,105,190,116,184,248,163,80,147,230,166,238,24,179,102,195,208,208,63,63,210,5,15,238,222,189,33,189,109,247,0,224,233,70,1,205,9,181,100,233,210,131,75,6,106,41,167,46,22,119,113,171,245,172,164,92,179,216,249,36,105,106,134,83,202,159,150,82,62,182,190,221,190,96,177,184,82,243,200,241,204,49,71,119,253,114,77,171,73,51,216,253,152,29,55,223,124,243,195,115,131,122,15,237,221,155,36,181,54,255,58,201,218,36,41,157,133,95,223,221,125,120,177,92,215,109,213,95,232,255,235,191,126,235,225,6,113,255,222,221,155,210,123,91,97,73,254,252,112,91,216,29,173,90,243,63,103,63,119,82,255,235,225,138,248,139,71,70,86,212,38,31,252,89,251,4,128,159,87,10,104,78,168,93,159,253,236,35,233,21,143,37,117,237,192,208,208,43,230,199,92,122,233,165,207,94,214,228,134,36,103,29,92,58,176,128,185,111,56,44,233,124,244,146,193,193,51,230,199,188,242,85,175,250,71,53,121,125,175,249,189,93,107,215,30,242,54,195,99,145,99,214,156,245,203,103,213,228,93,73,82,74,25,93,40,54,181,110,237,125,250,15,233,110,161,157,102,201,146,91,23,140,77,210,215,183,244,119,115,240,245,230,245,131,235,135,91,111,88,40,174,127,184,245,107,165,230,3,189,155,251,135,153,52,255,105,177,156,79,196,234,83,79,253,76,102,95,107,94,50,212,127,231,237,127,213,251,109,194,33,6,134,135,207,92,246,200,238,155,146,156,151,163,88,95,13,0,79,69,118,225,224,196,43,249,64,106,119,27,188,90,234,45,235,219,173,63,109,106,221,149,146,233,154,242,226,233,228,45,73,86,167,212,235,146,242,188,212,172,91,40,205,206,177,109,147,253,237,161,238,235,177,147,243,151,54,229,158,254,161,193,143,212,146,47,213,82,166,155,154,95,154,153,121,108,83,74,158,221,237,43,255,113,254,30,202,199,34,199,172,85,39,159,126,247,3,143,236,254,193,108,108,146,116,58,135,190,20,229,160,38,219,82,243,238,57,71,190,124,203,214,173,223,89,236,71,118,203,214,173,223,89,63,52,116,101,41,245,51,73,150,149,154,191,234,31,106,189,45,169,159,172,77,185,191,169,245,185,53,229,151,83,243,178,222,37,251,155,210,188,97,199,216,216,131,139,229,124,34,182,108,217,50,179,126,112,240,205,165,175,220,158,228,204,164,188,254,164,116,218,235,219,173,107,83,242,119,77,205,210,154,188,168,214,153,55,166,100,121,146,175,165,214,209,148,242,155,199,162,127,0,248,121,162,128,230,132,219,49,58,241,63,250,135,90,231,165,251,202,233,165,37,217,84,75,217,116,72,80,205,248,190,244,189,237,164,212,235,14,55,145,89,30,221,119,101,86,156,180,183,166,94,213,45,92,203,53,37,73,153,127,73,173,31,216,57,54,249,225,227,149,35,233,22,153,253,237,214,77,73,222,212,59,244,221,219,198,199,191,178,80,236,158,190,229,187,86,78,31,216,159,217,253,173,107,189,105,209,155,236,217,57,62,62,186,254,138,193,254,210,41,159,76,114,86,74,46,73,202,37,165,38,117,238,91,179,75,238,171,181,121,237,173,99,99,95,60,82,206,39,98,231,228,228,125,235,7,7,95,94,250,202,167,210,221,234,239,244,146,108,74,157,247,55,84,115,87,95,211,247,218,153,76,15,31,203,254,1,224,231,133,37,28,60,41,118,140,79,188,171,212,178,33,53,215,38,229,239,123,75,53,190,149,212,201,90,242,186,178,111,255,198,59,199,198,118,39,245,176,107,143,167,166,166,246,77,141,141,255,106,109,234,218,164,252,113,146,191,77,242,112,186,91,183,253,159,148,250,225,78,39,23,238,24,159,124,79,22,169,196,143,69,142,89,181,100,206,58,230,114,227,98,241,189,117,205,7,119,231,104,210,44,250,74,243,185,118,222,52,121,251,190,52,47,40,201,219,123,175,252,126,40,221,173,254,30,72,119,119,143,183,236,233,91,118,222,206,99,92,60,31,236,127,114,242,91,229,209,253,151,148,90,127,37,169,55,36,249,110,146,199,82,243,131,154,76,212,90,127,245,193,83,79,187,228,150,209,209,111,164,54,223,63,30,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,127,237,193,33,1,0,0,0,128,160,255,175,157,97,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,22,75,216,237,143,189,59,64,167,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32137,"duration_micros":2046,"top":902.0,"left":70.54545593261719,"width":34.909088134765625,"height":48.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,23,53,73,68,65,84,120,156,236,221,95,136,92,103,25,7,224,247,219,221,196,24,75,145,90,109,19,168,165,122,145,10,201,34,216,42,180,222,137,212,210,210,198,234,176,51,179,180,213,88,114,161,109,177,168,23,22,73,210,160,85,111,180,77,189,138,53,74,54,153,153,101,41,196,38,109,90,65,20,149,34,21,236,69,22,189,240,31,182,144,72,73,85,226,54,209,38,59,159,23,78,97,60,153,217,153,221,157,113,54,242,60,176,100,207,123,206,247,189,47,123,245,203,225,204,153,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,97,72,163,30,224,255,76,170,86,171,119,228,156,111,77,41,221,152,115,126,111,68,68,74,233,15,17,241,98,68,60,87,171,213,158,142,136,60,210,41,1,0,88,49,1,122,64,202,229,242,13,41,165,239,70,196,251,123,92,250,82,179,217,188,111,118,118,246,215,255,139,185,0,0,24,44,1,122,0,170,213,234,116,206,249,7,17,49,209,231,146,55,82,74,59,106,181,218,225,97,206,5,0,192,224,141,143,122,128,75,93,181,90,45,229,156,235,17,49,182,140,101,227,17,113,215,214,173,91,127,55,63,63,127,98,72,163,1,0,48,4,238,64,175,194,244,244,244,182,102,179,249,98,68,108,40,156,58,29,17,79,69,196,47,90,199,31,142,136,79,68,196,149,133,235,206,141,141,141,221,112,248,240,225,223,12,119,82,0,0,6,165,223,71,14,232,160,217,108,62,25,23,135,231,198,194,194,194,103,142,30,61,122,182,173,118,104,199,142,29,95,58,119,238,220,129,136,248,100,91,253,173,139,139,139,251,227,63,1,27,0,128,75,192,114,30,59,160,205,244,244,244,205,17,241,193,66,249,200,150,45,91,166,11,225,57,34,34,14,28,56,240,143,45,91,182,76,229,156,143,181,215,83,74,55,151,203,229,15,13,115,86,0,0,6,71,128,94,161,197,197,197,237,133,210,249,241,241,241,207,238,217,179,167,217,109,205,158,61,123,154,139,139,139,159,139,136,11,237,245,148,210,157,195,152,17,0,128,193,19,160,87,40,165,244,190,194,241,79,14,29,58,116,170,215,186,185,185,185,151,35,226,103,133,242,245,131,156,13,0,128,225,17,160,87,238,170,246,131,156,243,111,251,93,152,82,42,94,123,245,64,38,2,0,96,232,4,232,149,123,75,251,65,206,249,124,191,11,115,206,255,44,148,222,54,144,137,0,0,24,58,1,26,0,0,150,65,128,6,0,128,101,240,30,232,1,170,84,42,31,141,136,91,34,226,221,57,231,205,17,177,185,117,234,100,74,233,100,68,188,28,17,207,143,106,62,0,0,86,79,128,30,144,148,210,253,17,241,197,182,227,246,211,215,181,253,254,133,136,40,62,3,13,0,192,37,194,35,28,43,183,190,253,32,231,92,252,70,194,165,20,175,93,223,241,42,0,0,214,28,1,122,5,170,213,234,61,17,177,101,128,91,94,223,218,19,0,128,53,110,124,212,3,92,106,42,149,202,35,17,241,88,177,222,246,200,198,27,41,165,31,69,196,207,35,226,217,214,191,191,79,41,253,37,34,174,141,238,127,243,143,79,78,78,166,19,39,78,252,116,240,83,3,0,48,40,169,247,37,188,169,92,46,63,209,122,214,185,147,35,57,231,131,151,95,126,249,177,253,251,247,119,124,39,244,206,157,59,215,157,57,115,230,246,136,184,183,219,215,119,231,156,191,211,104,52,30,24,212,204,0,0,12,150,0,221,167,114,185,252,80,74,233,91,29,78,189,208,108,54,191,58,59,59,123,124,57,251,77,77,77,221,58,54,54,246,149,136,184,169,195,233,135,234,245,250,69,119,185,1,0,24,61,1,186,15,229,114,249,142,148,210,15,139,245,148,210,76,173,86,91,213,179,203,213,106,245,96,206,249,238,98,61,231,124,103,163,209,120,122,53,123,3,0,48,120,62,68,216,159,175,117,168,61,190,218,240,28,17,209,218,227,241,62,123,2,0,48,98,62,68,216,67,181,90,189,63,34,62,85,40,31,173,215,235,247,14,170,199,252,252,252,115,219,182,109,251,64,180,189,217,35,165,244,174,201,201,201,215,78,156,56,241,226,160,250,0,0,176,122,238,64,47,161,84,42,141,231,156,31,46,148,207,164,148,6,22,158,223,212,218,243,76,123,45,231,252,112,169,84,242,159,28,0,128,53,68,128,94,194,186,117,235,238,138,136,77,237,181,148,210,163,181,90,237,111,189,214,86,42,149,7,42,149,202,233,214,79,207,183,106,180,246,252,122,161,188,169,53,3,0,0,107,132,0,189,132,156,243,237,133,210,171,181,90,237,155,189,214,85,42,149,171,34,98,95,68,188,163,245,179,175,85,91,82,189,94,255,70,68,188,218,99,6,0,0,70,72,128,94,90,49,188,30,235,103,81,179,217,188,186,159,90,23,197,30,2,52,0,192,26,34,64,119,81,42,149,174,136,136,43,218,107,41,165,103,134,221,183,67,143,43,90,179,0,0,176,6,8,208,93,108,216,176,225,178,98,237,252,249,243,47,13,187,111,151,30,23,205,2,0,192,104,8,208,93,52,155,205,139,66,235,194,194,194,201,97,247,237,212,99,253,250,245,2,52,0,192,26,33,64,119,177,184,184,184,177,80,58,125,252,248,241,127,13,187,111,171,199,233,30,179,0,0,48,34,2,116,23,41,165,115,133,210,149,59,119,238,92,55,236,190,173,30,87,246,152,5,0,128,17,17,160,187,72,41,45,20,107,11,11,11,155,135,221,183,83,143,78,179,0,0,48,26,2,116,23,19,19,19,23,133,214,102,179,185,117,216,125,59,245,232,52,11,0,0,163,33,64,119,113,240,224,193,215,34,226,191,130,235,216,216,216,208,223,201,220,161,199,66,107,22,0,0,214,0,1,122,9,57,231,103,10,199,183,245,179,46,165,244,215,126,106,93,122,222,86,56,30,250,187,167,1,0,232,159,0,189,132,148,82,241,91,1,175,169,84,42,15,244,90,215,104,52,94,137,136,221,109,165,221,173,218,146,170,213,234,253,17,113,77,143,25,0,0,24,33,1,122,9,23,46,92,56,18,17,103,10,229,47,151,74,165,245,189,214,214,235,245,189,19,19,19,151,77,76,76,92,86,175,215,247,246,186,190,84,42,173,207,57,63,92,40,159,105,205,0,0,192,26,33,64,47,97,110,110,110,33,165,244,104,161,188,105,98,98,226,123,253,172,159,153,153,121,125,102,102,230,245,126,174,109,237,185,169,189,150,82,122,116,110,110,206,7,8,1,0,214,144,52,234,1,46,5,229,114,249,143,41,165,235,10,229,189,245,122,125,119,199,5,203,84,169,84,30,137,136,93,237,181,156,243,159,26,141,198,123,6,177,63,0,0,131,227,14,116,31,82,74,187,58,148,119,149,203,229,199,87,187,119,165,82,121,44,10,225,121,137,158,0,0,140,152,59,208,125,42,151,203,187,83,74,123,138,245,156,243,177,156,243,222,217,217,217,95,45,103,191,169,169,169,27,83,74,187,82,74,23,189,26,47,165,244,72,173,86,187,168,23,0,0,163,39,64,47,67,185,92,62,152,82,186,187,203,233,39,115,206,223,111,52,26,47,244,216,227,166,148,210,167,35,226,190,78,231,115,206,51,141,70,227,158,213,206,10,0,192,112,8,208,203,84,169,84,246,69,196,82,175,178,123,37,165,244,227,156,243,169,136,56,213,170,109,74,41,109,202,57,127,36,10,175,169,43,120,162,94,175,63,56,168,89,1,0,24,60,1,122,5,42,149,202,231,35,226,219,3,222,246,161,122,189,254,216,128,247,4,0,96,192,198,71,61,192,165,104,126,126,254,151,147,147,147,199,35,226,157,17,113,253,42,183,59,146,82,186,183,94,175,63,53,128,209,0,0,24,50,119,160,87,105,106,106,234,214,177,177,177,7,35,226,99,203,92,250,92,179,217,220,55,59,59,123,124,24,115,1,0,48,28,2,244,128,108,223,190,253,237,27,55,110,188,45,34,110,201,57,95,155,115,222,156,82,218,20,17,145,115,62,149,82,58,153,82,250,115,68,60,127,246,236,217,103,142,28,57,242,247,209,78,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,239,246,224,128,4,0,0,0,64,208,255,215,253,8,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,46,213,183,1,241,157,176,213,38,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32146,"duration_micros":1526,"top":1086.0,"left":32.66666793823242,"width":654.6666259765625,"height":115.3333740234375,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,148,149,229,157,39,240,223,123,239,173,189,138,42,138,125,149,181,88,5,68,80,220,13,42,46,81,211,49,73,119,116,210,173,113,58,29,187,117,226,104,250,36,51,153,100,146,238,201,100,38,61,73,143,166,181,237,140,142,73,102,218,142,233,62,89,212,137,73,140,75,71,141,98,32,168,168,44,82,32,130,236,197,94,11,181,207,31,20,23,138,42,80,68,184,85,197,231,115,14,135,251,222,251,212,251,254,222,203,57,248,229,241,247,62,79,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,142,37,185,46,160,135,73,14,249,221,119,3,0,156,234,218,59,126,197,33,191,159,242,78,245,144,152,154,255,221,191,25,155,95,88,122,78,170,160,96,70,146,74,38,69,146,26,29,73,50,52,73,146,242,136,40,12,223,17,0,112,234,105,143,136,125,237,237,237,187,163,189,125,115,180,183,173,107,111,107,95,217,214,216,184,180,105,95,237,139,79,127,246,11,111,69,68,91,174,139,204,149,83,49,28,166,46,121,240,59,243,243,139,75,174,77,167,51,11,34,149,76,202,117,65,0,0,189,74,91,251,202,214,214,150,39,154,234,235,30,125,234,230,207,61,29,167,88,152,62,101,2,244,153,95,251,252,192,65,19,39,221,146,201,47,248,148,208,12,0,240,1,105,107,95,217,210,212,248,143,219,86,173,252,135,223,127,237,219,53,185,46,231,100,232,243,1,250,204,175,125,126,224,224,73,83,190,152,206,207,191,53,34,138,114,93,15,0,64,31,213,208,218,212,116,239,214,149,203,191,217,215,131,116,95,14,208,233,43,126,240,221,59,51,37,133,95,138,36,169,200,117,49,0,0,167,132,246,246,93,45,117,251,190,241,203,27,63,251,183,17,209,154,235,114,78,132,62,25,160,47,185,247,91,115,11,6,14,248,86,42,147,190,48,215,181,0,0,156,138,218,90,90,159,109,172,217,254,151,79,221,250,151,139,114,93,203,7,173,175,5,232,212,130,31,252,195,173,249,165,197,119,71,223,187,55,0,128,222,166,189,169,182,254,246,39,110,188,229,222,232,67,15,26,246,165,144,153,190,242,135,15,220,149,206,207,191,45,215,133,0,0,112,80,107,83,211,61,191,184,254,79,255,125,244,145,150,142,190,18,160,243,174,122,248,193,135,82,121,153,79,228,186,16,0,0,186,106,107,110,249,151,199,63,121,243,191,137,136,230,92,215,114,188,250,66,128,206,187,234,71,15,254,56,149,201,92,147,235,66,0,0,56,178,182,150,150,199,30,255,163,155,63,22,189,60,68,167,114,93,192,113,202,92,245,240,131,15,9,207,0,0,61,95,42,147,185,230,170,135,31,124,40,34,50,185,174,229,120,244,230,0,157,190,226,161,251,239,210,182,1,0,208,123,164,242,50,159,184,226,161,251,239,138,136,116,174,107,121,191,122,107,128,78,22,124,255,190,91,51,133,5,183,230,186,16,0,0,142,77,166,176,224,214,5,223,191,239,214,232,165,237,196,189,177,232,100,254,119,190,57,183,120,196,176,133,209,59,235,7,0,32,162,189,126,195,166,121,79,127,238,139,139,34,162,61,215,197,28,139,222,56,3,157,41,28,60,232,91,33,60,3,0,244,102,73,71,166,235,117,253,208,189,45,64,167,46,255,222,223,223,153,202,203,92,144,235,66,0,0,56,62,169,188,204,5,151,127,239,239,239,140,94,150,73,123,83,243,118,50,253,246,63,29,60,96,226,132,135,35,73,10,115,93,12,0,0,199,47,157,159,55,39,127,216,192,239,109,125,105,73,125,174,107,121,175,122,83,218,79,141,156,51,247,139,145,36,21,185,46,4,0,128,15,72,146,84,140,156,51,247,139,209,139,114,105,111,41,52,153,250,23,55,13,74,23,21,254,121,174,11,1,0,224,131,149,46,42,252,243,169,127,113,211,160,232,37,207,184,245,150,0,157,26,57,119,238,45,137,214,13,0,128,62,39,73,146,194,145,115,231,222,18,189,36,155,246,134,34,147,136,200,228,149,20,223,144,235,66,0,0,56,49,58,178,94,38,122,193,44,116,175,8,208,23,222,253,141,75,146,116,122,98,174,11,1,0,224,196,72,210,233,137,23,222,253,141,75,66,128,254,64,164,138,250,87,94,147,235,34,0,0,56,177,58,50,95,143,207,167,61,189,192,36,34,242,50,133,5,151,228,186,16,0,0,78,172,142,204,151,23,61,124,22,186,199,7,232,185,95,185,99,156,246,13,0,128,190,47,73,167,39,206,253,202,29,227,66,128,62,46,169,178,33,195,206,201,117,17,0,0,156,28,29,217,175,71,103,212,158,92,92,18,17,73,94,89,217,244,92,23,2,0,192,201,209,145,253,146,232,193,179,208,61,57,64,71,68,164,83,153,116,85,174,139,0,0,224,228,232,200,126,233,92,215,113,52,61,57,64,39,17,145,74,210,233,81,185,46,4,0,128,147,163,35,251,165,194,12,244,251,146,68,68,58,210,233,193,185,46,4,0,128,147,100,127,246,75,135,0,253,190,165,146,36,233,151,235,34,0,0,56,57,58,178,95,143,206,168,61,185,184,36,34,146,36,73,10,114,93,8,0,0,39,71,71,246,243,16,225,113,232,209,95,30,0,0,31,184,30,159,255,122,67,128,6,0,224,212,210,163,51,96,79,15,208,0,0,208,163,8,208,0,0,112,12,4,104,0,0,56,6,153,92,23,0,192,126,31,171,154,22,31,171,154,22,169,36,137,159,85,47,143,135,151,47,205,117,73,0,116,67,128,6,122,141,63,153,118,70,124,98,210,244,35,126,222,210,214,22,181,205,77,177,107,95,67,44,221,182,37,158,122,123,117,172,217,189,227,36,86,248,254,21,164,51,113,195,148,153,145,159,222,191,123,237,39,39,207,136,39,215,86,71,77,67,125,142,43,3,224,112,2,52,208,103,100,82,169,168,40,40,140,138,130,194,24,83,222,63,174,24,59,49,126,242,230,27,241,208,242,87,115,93,218,187,202,164,146,72,37,7,31,58,79,37,73,164,83,186,236,0,122,34,1,26,232,149,154,90,91,99,83,221,222,78,239,229,165,210,81,81,80,24,197,121,121,17,17,145,159,78,199,39,167,204,136,84,146,196,255,93,246,74,46,202,124,207,234,154,155,227,231,107,86,198,181,227,39,71,36,73,252,242,173,55,99,75,93,237,9,185,214,255,190,226,186,24,92,92,18,17,17,159,254,197,143,205,114,3,28,35,1,26,232,149,182,212,215,198,109,79,62,214,237,103,243,71,143,139,27,167,207,142,202,194,162,136,136,184,174,106,90,188,184,113,125,84,239,218,126,50,75,60,102,15,44,93,28,143,84,47,143,84,146,156,176,240,28,17,81,150,159,127,194,206,13,112,42,240,255,7,129,62,231,233,117,107,226,191,45,252,77,52,183,181,70,196,254,214,142,203,198,140,207,113,85,239,205,182,250,186,19,26,158,75,242,242,162,48,147,119,194,206,15,112,42,16,160,129,62,105,197,142,109,241,70,205,214,236,241,184,138,202,28,86,211,115,12,47,237,215,179,183,247,2,232,5,180,112,0,125,214,166,186,189,49,43,134,69,68,68,121,126,225,17,199,13,46,46,141,107,39,76,142,153,131,134,198,144,146,210,40,72,103,162,169,181,53,182,213,215,197,107,53,91,226,209,234,229,177,161,118,207,187,94,111,66,197,128,184,114,92,85,156,62,112,72,148,23,20,70,126,58,29,181,205,77,81,81,208,253,181,87,237,220,30,119,62,243,120,246,248,203,231,92,28,103,15,27,21,17,17,47,109,90,31,95,127,241,95,187,253,185,121,195,71,197,165,167,77,136,9,21,149,81,150,95,16,169,36,137,61,77,141,241,214,238,29,241,196,91,213,241,194,198,117,93,126,230,95,174,189,62,10,51,93,255,202,255,222,149,31,235,116,188,104,243,59,241,215,47,60,211,237,117,167,12,24,28,87,142,157,24,147,43,7,197,128,162,226,200,164,82,81,223,210,28,27,107,247,196,162,205,27,226,177,234,229,81,215,220,220,237,207,126,116,226,212,184,249,244,51,59,238,237,157,248,250,139,251,175,113,246,176,81,113,249,216,9,49,190,98,64,20,164,51,241,201,199,30,238,246,231,1,122,18,1,26,232,179,242,83,233,236,235,198,214,150,110,199,92,60,106,108,124,118,214,89,81,154,215,185,47,184,48,147,137,81,253,202,99,84,191,242,184,104,212,216,184,127,233,162,120,234,237,213,71,188,214,71,38,76,137,79,77,157,213,37,164,30,41,60,191,95,183,205,158,23,11,198,76,236,50,139,92,89,88,20,149,133,35,98,246,144,17,241,235,181,213,241,119,75,94,252,64,175,123,211,244,217,241,7,19,167,70,58,233,124,229,210,188,252,168,234,63,48,170,250,15,140,249,163,198,197,183,23,63,31,43,119,212,28,245,92,7,190,235,59,231,156,23,23,143,30,151,189,151,166,214,214,15,180,102,128,19,69,128,6,250,172,9,253,7,100,95,111,173,175,235,242,249,53,227,39,199,191,157,49,167,83,40,220,177,175,33,246,52,238,139,210,252,252,24,80,84,18,73,236,239,27,190,125,246,57,81,152,206,196,207,215,172,236,114,158,11,70,142,137,79,159,126,102,246,60,77,173,173,177,185,110,111,52,180,180,196,160,226,146,236,195,140,7,188,94,179,37,34,34,214,239,221,125,76,247,243,241,73,211,227,242,49,19,179,199,13,45,205,177,165,174,54,146,36,137,161,29,51,231,73,68,44,24,51,33,182,214,215,198,143,86,188,150,29,187,177,110,79,20,164,51,145,151,74,197,224,226,210,236,251,155,106,247,70,91,180,103,143,183,119,179,34,199,157,115,206,139,15,141,30,151,61,110,107,111,143,154,134,186,168,111,110,142,202,162,226,232,151,95,16,17,17,195,74,203,226,175,206,187,52,190,242,252,175,99,213,206,35,63,176,89,146,151,23,183,205,158,215,233,156,0,189,137,0,13,244,73,31,157,56,53,78,235,87,145,61,94,184,105,125,167,207,199,85,84,198,167,166,206,202,134,222,181,187,119,198,247,95,95,18,191,223,178,49,59,102,218,192,193,113,243,233,103,70,85,255,129,145,36,73,252,241,180,51,98,217,246,173,241,214,238,157,157,206,245,241,170,105,217,243,44,221,182,57,238,121,121,97,108,170,61,184,196,222,31,76,156,26,55,77,159,157,29,243,227,55,223,136,197,155,55,28,243,61,45,56,109,66,246,245,43,91,55,197,183,23,61,31,187,26,247,69,68,196,160,226,146,248,119,103,204,139,51,134,12,143,136,136,171,198,77,234,20,160,111,127,234,231,17,17,49,115,240,208,248,250,249,151,101,223,255,210,115,79,28,117,25,187,43,198,86,197,197,135,4,221,23,55,174,139,127,90,246,106,172,221,179,43,251,222,135,70,143,139,27,167,157,17,3,138,138,163,36,47,47,62,55,251,156,184,227,153,199,163,165,173,173,219,115,14,46,46,141,81,29,127,54,123,155,26,227,237,61,187,162,166,161,62,234,143,208,254,1,208,211,120,136,16,232,51,202,11,10,227,204,33,195,227,142,57,231,197,77,211,103,103,223,95,189,107,71,60,179,110,77,167,177,215,79,158,145,93,47,122,237,238,157,241,133,223,252,170,83,120,142,136,120,163,102,107,124,249,185,39,99,109,71,96,46,201,203,139,107,198,79,238,114,205,177,29,15,40,54,182,182,196,223,252,238,185,78,225,57,34,226,103,171,150,197,139,27,14,246,37,207,29,58,226,152,239,173,32,157,137,33,37,7,103,142,31,91,189,34,27,158,35,246,175,222,113,247,146,23,99,95,75,75,180,180,181,69,191,252,130,152,50,96,240,49,95,231,112,127,56,105,122,182,197,226,233,117,107,226,27,11,127,211,41,60,71,68,60,179,110,77,252,245,11,207,100,3,240,152,242,254,113,209,168,177,71,60,103,113,94,94,164,59,214,186,254,244,47,126,18,255,241,217,39,226,219,139,158,143,251,94,121,233,184,235,5,56,25,204,64,3,189,210,168,178,242,120,236,186,63,126,215,113,91,234,106,227,174,197,191,237,52,27,90,154,151,31,51,7,15,205,30,255,159,55,94,137,134,150,238,103,63,27,90,154,227,255,173,94,25,183,205,158,23,17,17,115,14,11,191,195,74,202,178,1,179,166,161,62,118,31,18,106,15,245,78,237,193,118,141,138,130,162,110,199,28,77,107,123,91,180,181,183,103,119,43,156,58,96,112,252,110,211,59,157,198,108,111,168,143,79,60,250,195,99,62,247,145,156,51,124,116,12,234,216,112,165,174,185,57,254,215,171,191,59,226,216,53,187,119,196,194,77,235,99,126,199,108,245,249,35,78,59,106,207,248,226,205,27,226,222,151,5,102,160,119,18,160,129,62,169,165,173,45,158,125,103,109,60,176,116,113,236,109,106,236,244,217,172,33,195,162,232,144,181,144,71,150,245,139,145,101,83,143,120,174,3,51,213,17,17,253,11,139,162,188,160,48,27,148,55,215,237,141,246,136,72,34,98,64,225,254,22,134,238,86,162,24,94,210,47,251,122,215,17,66,246,187,221,207,155,59,107,98,106,199,172,242,117,85,211,98,124,69,101,188,176,97,93,44,218,252,206,9,217,77,240,208,127,100,100,82,73,44,56,164,255,186,59,121,135,108,61,126,232,108,121,119,186,235,37,7,232,45,4,104,160,87,218,211,212,24,11,55,30,236,107,46,203,207,143,115,134,143,206,30,63,249,246,234,184,247,229,133,221,254,236,160,162,146,78,199,7,150,87,123,175,70,148,246,203,6,232,93,141,251,226,173,221,59,98,92,121,101,20,102,50,241,249,185,231,199,61,75,22,198,142,125,13,217,241,151,141,153,16,231,142,56,88,219,239,183,28,123,255,115,196,254,157,10,191,124,206,135,162,178,176,40,146,136,152,53,120,88,204,26,60,44,218,218,207,138,205,117,181,81,189,107,123,44,222,188,33,158,123,103,237,17,251,143,143,69,255,67,102,202,11,210,153,99,250,158,14,60,88,216,157,230,182,214,120,101,235,166,227,170,13,32,151,4,104,160,87,218,221,184,175,203,82,109,255,105,222,197,49,111,248,254,117,148,47,24,57,38,126,184,252,213,78,65,246,128,163,133,187,247,162,181,189,115,56,253,233,155,203,226,142,57,231,69,42,73,98,238,208,145,113,223,101,31,137,119,106,119,71,99,75,107,12,44,42,142,97,165,101,217,177,75,183,109,238,210,122,241,94,173,218,185,61,62,255,204,227,241,209,137,211,226,162,81,99,162,188,99,137,188,84,146,196,240,210,178,24,94,90,22,23,142,28,19,55,76,153,25,15,44,93,28,47,29,246,224,228,177,42,61,142,45,191,219,143,242,89,67,71,159,54,64,111,37,64,3,125,198,207,170,151,197,217,195,70,70,146,36,81,146,151,23,215,85,77,139,7,150,46,238,50,174,182,185,41,251,122,221,158,93,113,235,147,143,29,215,117,255,117,253,91,113,213,184,73,49,101,192,160,136,216,223,242,81,213,127,96,151,113,43,119,212,196,223,46,254,237,113,93,171,166,161,62,238,95,186,40,238,95,186,40,206,24,50,60,78,31,56,36,198,85,84,198,196,254,3,178,255,48,24,90,82,26,95,56,235,130,248,15,207,254,234,168,203,201,189,155,67,87,197,120,234,237,213,113,215,239,95,56,174,218,15,104,107,63,90,188,6,232,249,4,104,160,207,120,163,102,107,188,86,179,37,102,12,218,223,187,59,127,244,184,248,209,138,215,186,244,64,111,107,56,184,38,116,101,199,142,122,199,51,35,122,229,216,170,168,170,236,28,152,247,181,180,68,38,149,138,186,230,166,216,80,187,39,94,216,176,46,30,169,94,254,190,175,209,157,151,183,108,140,151,59,86,14,201,164,82,241,225,113,147,226,198,233,103,68,94,42,29,249,233,116,92,51,126,242,113,5,246,157,141,7,103,239,15,60,76,8,128,0,13,244,49,143,86,175,200,6,232,178,252,130,184,174,106,90,252,224,245,37,157,198,44,221,186,57,26,91,91,162,32,157,137,210,188,252,184,112,228,152,120,250,176,101,238,14,117,254,136,211,98,104,199,67,113,27,107,247,118,218,42,251,162,81,99,227,51,51,247,111,198,178,175,165,37,254,199,162,231,222,119,139,198,209,92,53,110,82,140,238,87,30,17,17,27,246,238,137,199,86,175,232,244,121,75,91,91,60,82,189,60,102,14,30,26,115,135,142,140,136,200,214,124,168,195,39,127,147,228,240,61,13,15,122,189,102,75,92,57,182,42,34,34,38,87,14,138,129,69,197,71,125,88,241,234,241,147,162,48,189,255,63,43,175,213,108,121,215,29,9,1,122,43,235,64,3,125,202,75,155,214,71,245,174,131,109,11,151,158,54,62,74,14,89,69,35,98,255,131,127,75,183,109,201,30,95,63,101,102,182,159,248,112,99,250,85,196,237,103,158,27,55,78,159,29,55,78,159,221,169,159,185,162,160,48,110,59,99,94,228,117,108,25,94,144,201,196,132,138,1,49,99,208,208,78,171,124,124,16,70,149,149,199,135,199,77,138,15,143,155,20,55,76,157,25,3,138,138,187,29,119,104,123,68,107,55,173,18,59,15,235,9,31,82,124,228,213,50,158,93,191,54,219,67,158,159,78,199,45,179,206,62,226,216,203,199,76,140,207,206,60,43,110,156,62,59,254,100,218,25,209,218,166,77,3,232,187,4,104,160,207,121,124,205,155,217,215,21,5,133,241,145,9,93,151,168,251,231,21,175,197,190,150,150,136,216,63,83,251,223,47,92,208,101,141,231,121,195,71,197,127,62,119,126,20,102,246,207,170,110,169,171,141,95,190,117,240,220,13,45,45,157,194,122,18,17,215,79,153,17,255,245,130,203,226,71,215,252,81,60,116,245,31,198,125,151,93,27,255,229,252,75,227,51,51,230,198,164,202,174,125,209,239,213,111,214,191,149,13,196,165,121,249,241,165,121,23,197,168,142,25,233,3,206,29,62,58,102,13,30,150,61,94,119,216,134,39,17,17,91,234,107,163,177,181,37,123,124,245,248,73,71,13,251,63,121,243,141,236,235,179,135,141,140,175,158,59,63,198,150,247,207,190,151,73,165,226,163,19,167,198,159,205,156,155,125,239,119,155,223,233,244,189,0,244,53,90,56,128,62,231,215,107,171,227,227,85,211,99,120,199,108,241,130,49,19,226,199,111,190,209,41,56,174,216,177,45,254,105,249,171,241,233,233,179,35,73,146,24,89,86,30,95,61,119,126,236,216,215,16,123,154,26,163,95,126,65,84,22,30,92,198,109,95,75,75,124,247,213,69,157,214,120,110,108,109,137,175,254,246,169,248,204,140,185,113,197,216,206,107,36,39,73,18,253,242,11,162,95,126,65,140,44,43,143,89,131,135,197,53,19,38,199,194,141,235,226,239,150,44,236,210,151,253,110,86,236,216,22,79,190,93,29,151,119,172,197,92,213,127,96,124,103,254,213,177,126,239,238,168,107,110,138,138,130,194,24,81,86,158,221,212,165,174,185,41,30,173,94,209,229,60,77,173,173,241,70,205,214,152,221,177,229,247,121,35,78,139,51,135,140,136,157,141,13,209,214,222,30,79,175,91,19,255,124,200,22,224,143,84,47,143,201,3,6,197,249,35,78,139,136,253,27,201,204,30,50,60,182,213,215,69,83,107,107,244,47,42,138,210,188,131,171,117,108,174,171,141,239,190,186,232,152,238,13,160,183,49,3,13,244,73,191,90,187,42,251,122,64,81,113,92,59,97,114,151,49,63,93,181,44,238,94,242,98,167,80,92,89,88,20,99,250,85,116,10,207,59,246,53,196,183,22,61,31,139,54,119,237,109,30,82,82,26,103,13,27,217,233,189,21,59,182,197,235,29,61,192,111,239,217,149,93,205,34,137,253,187,251,221,49,231,220,247,117,79,247,44,89,24,191,90,187,42,59,19,157,73,165,98,108,121,255,152,62,112,72,140,60,36,60,239,110,220,23,255,115,241,111,99,67,237,158,110,207,243,143,203,94,233,116,207,133,153,76,12,43,41,139,17,165,253,162,162,155,86,150,111,190,244,108,60,82,189,60,219,30,146,74,146,24,82,82,26,163,250,149,119,10,207,171,118,110,143,175,189,240,84,108,171,175,235,114,14,128,190,196,12,52,208,39,253,124,245,202,248,200,132,41,217,32,124,197,216,137,241,211,85,203,186,172,182,241,212,219,171,99,89,205,214,184,118,194,148,56,125,208,144,24,82,92,26,121,233,116,52,180,52,199,214,186,218,88,178,101,99,252,172,122,249,17,183,232,254,179,25,115,179,215,120,124,205,202,184,239,149,174,219,93,23,164,51,113,211,244,217,113,245,248,73,17,17,49,103,232,200,152,216,127,192,251,90,98,238,158,37,11,227,217,245,107,227,210,211,198,199,228,202,65,81,94,80,24,5,153,76,52,180,52,71,77,125,93,188,186,109,115,252,116,213,178,216,126,148,135,253,86,237,220,30,95,122,238,137,184,97,202,140,168,250,255,237,221,91,140,156,101,25,192,241,103,103,207,187,221,30,216,114,40,181,5,1,105,3,69,72,52,138,152,138,38,40,193,112,65,98,72,212,68,140,13,154,72,98,188,64,67,140,18,47,36,122,161,198,155,38,36,208,64,69,176,53,141,74,132,216,6,8,88,64,160,1,161,165,165,173,41,180,165,173,221,182,219,227,158,79,51,159,23,51,95,119,218,2,165,219,109,103,190,217,223,47,249,210,201,102,210,60,59,87,255,190,125,231,125,103,205,142,142,166,230,104,200,125,244,122,202,178,183,223,136,215,246,238,142,219,174,184,58,22,204,154,29,23,180,182,70,93,212,69,255,232,72,236,234,57,22,175,238,221,117,202,23,27,1,106,213,135,127,253,186,242,26,34,98,250,237,127,125,204,70,58,160,42,93,212,54,45,30,190,245,142,200,149,78,224,88,178,230,111,31,185,53,227,161,91,239,136,57,237,197,109,37,203,222,126,99,210,143,181,3,168,21,79,127,227,174,206,136,232,137,136,177,211,189,183,18,108,225,0,152,160,203,103,204,140,92,233,24,184,99,195,67,167,221,215,92,126,2,70,115,131,255,0,4,200,42,1,13,48,65,229,103,34,119,182,182,157,112,58,197,201,102,52,183,196,188,142,241,83,51,186,250,122,207,233,108,0,156,59,2,26,96,130,182,31,61,124,252,156,228,134,92,46,238,251,220,151,142,95,226,82,110,94,199,140,248,249,141,55,71,71,233,170,237,195,67,131,241,106,217,101,44,0,100,139,255,67,4,56,11,127,223,182,57,150,92,247,153,168,139,136,185,29,211,227,129,197,95,141,174,190,222,56,48,208,23,99,133,66,204,104,110,137,203,103,204,60,126,217,74,18,17,43,182,108,56,171,171,195,1,143,216,150,104,0,0,9,108,73,68,65,84,168,44,1,13,112,22,158,220,182,57,154,235,235,227,206,5,139,162,185,190,33,234,34,226,210,105,29,199,207,160,46,55,52,54,22,127,222,178,33,214,236,216,118,234,95,4,64,102,8,104,128,179,244,151,173,27,227,197,61,59,227,246,43,22,198,213,23,116,198,156,246,142,104,109,104,140,250,92,46,250,71,71,226,240,208,96,108,236,222,23,207,236,216,22,59,63,224,118,64,0,178,37,11,1,157,68,117,31,183,7,16,93,125,189,241,240,219,110,224,3,152,4,73,165,7,56,157,170,255,18,97,146,36,103,118,223,45,0,0,153,149,133,246,171,246,128,78,146,66,193,89,79,0,0,83,68,169,253,170,122,21,186,218,3,186,144,140,229,187,43,61,4,0,0,231,71,169,253,170,250,168,162,106,15,232,36,201,143,237,169,244,16,0,0,156,31,165,246,179,2,61,65,73,68,20,198,134,134,223,171,244,32,0,0,156,31,165,246,43,68,21,71,116,53,7,116,68,68,50,124,248,200,230,74,15,1,0,192,249,81,106,191,170,141,231,136,234,14,232,36,34,10,135,182,110,117,46,20,0,192,20,81,106,63,43,208,19,148,68,68,97,243,163,43,119,20,70,70,183,87,122,24,0,0,206,173,194,200,232,246,205,143,174,220,17,2,250,172,20,34,98,100,184,167,231,165,74,15,2,0,192,185,85,106,190,145,112,10,199,132,37,165,39,127,236,253,93,107,42,61,12,0,0,231,86,169,249,242,49,222,129,85,169,218,175,200,206,69,68,75,68,204,248,250,138,101,255,206,53,53,125,178,210,3,1,0,48,249,10,35,35,59,254,249,173,187,191,24,17,199,34,98,40,170,120,21,186,154,87,160,35,74,43,208,17,49,220,191,191,251,201,74,15,3,0,192,185,81,106,189,225,24,95,129,174,90,89,9,232,209,45,43,86,45,79,146,66,213,223,141,14,0,192,153,73,146,194,240,150,21,171,150,71,196,104,8,232,73,81,136,136,177,3,235,222,220,55,176,191,251,241,74,15,3,0,192,228,26,216,223,253,248,129,117,111,238,139,136,177,168,226,173,27,169,44,4,116,18,197,15,115,120,211,242,39,150,38,249,124,111,165,7,2,0,96,114,36,249,124,239,166,229,79,44,141,226,246,141,177,168,242,213,231,136,236,4,116,33,34,70,187,95,95,223,213,179,115,247,131,149,30,8,0,128,201,209,179,115,247,131,221,175,175,239,138,226,246,141,170,62,255,57,85,237,167,112,164,234,34,162,49,34,90,35,98,214,215,254,248,224,170,166,105,237,159,173,240,76,0,0,156,133,145,190,254,55,158,249,238,15,239,140,136,35,17,49,24,197,136,174,250,128,206,194,10,116,196,248,151,9,71,34,162,127,239,218,151,127,29,25,248,112,1,0,248,80,73,169,233,250,163,216,120,85,255,229,193,84,125,165,7,152,136,3,111,109,60,56,251,211,139,134,91,47,236,92,92,233,89,0,0,56,115,135,183,108,251,205,127,126,191,244,201,56,49,160,51,33,147,1,29,17,177,251,249,23,55,207,93,252,133,139,154,58,166,93,87,233,89,0,0,248,248,250,247,238,91,241,210,79,239,255,93,68,244,70,241,210,148,76,124,121,48,149,181,128,62,225,131,221,185,250,217,117,243,111,249,242,130,134,182,214,43,43,53,16,0,0,31,223,208,161,35,207,60,127,207,189,247,69,68,79,140,239,123,174,250,163,235,202,101,45,160,83,105,72,23,182,63,181,102,237,101,183,126,101,81,67,75,203,229,21,157,8,0,128,143,52,124,244,232,218,231,190,255,227,31,69,196,209,136,24,136,226,209,117,153,138,231,136,108,7,116,250,20,182,255,99,245,243,243,110,185,249,234,70,43,209,0,0,85,105,240,208,225,103,203,226,185,63,50,114,109,247,7,201,106,64,167,142,71,244,142,167,214,188,112,233,226,27,59,155,58,58,22,85,122,40,0,0,198,245,237,237,90,249,194,61,63,249,89,68,28,139,140,199,115,68,182,3,250,120,60,167,207,206,213,207,189,122,193,53,11,7,218,46,190,240,166,200,206,25,215,0,0,181,42,57,184,113,203,111,95,190,239,151,127,136,241,120,78,191,52,152,185,173,27,169,44,7,116,196,169,17,157,223,243,175,151,55,229,234,115,175,181,207,157,123,69,67,75,243,156,202,142,7,0,48,53,13,31,235,125,107,231,211,107,238,93,191,244,161,167,162,248,133,193,116,229,57,211,241,28,81,59,171,180,185,40,254,99,160,57,138,183,21,182,71,196,244,155,126,245,139,37,179,22,92,185,164,174,190,190,163,162,211,1,0,76,17,73,62,223,123,228,191,239,61,242,202,253,15,60,18,227,225,60,24,227,219,54,50,29,207,17,181,19,208,17,197,223,165,62,34,154,162,24,210,109,17,209,62,115,225,85,115,174,255,193,247,238,158,54,127,238,157,117,117,185,230,138,78,8,0,80,163,146,164,48,220,183,235,127,171,54,60,244,232,178,163,91,223,237,138,98,56,167,39,109,100,234,166,193,211,169,165,128,142,40,254,62,185,136,104,136,98,72,183,68,113,69,186,109,230,194,171,46,185,246,174,111,127,115,250,252,79,220,86,223,218,50,191,146,67,2,0,212,138,252,224,208,174,158,93,123,86,191,243,216,159,87,30,221,250,238,190,40,70,243,96,20,247,58,143,196,248,150,141,154,136,231,136,218,11,232,84,186,165,163,60,164,211,152,110,189,246,238,239,220,52,123,209,53,55,183,205,238,252,188,152,6,0,56,51,249,193,161,93,3,7,15,173,59,184,105,243,218,119,150,253,233,149,40,6,115,26,205,229,225,92,19,91,54,78,86,171,1,29,49,190,26,157,134,116,99,20,183,118,164,79,83,68,180,204,187,101,241,188,139,111,184,254,134,182,57,151,124,170,169,99,218,101,245,173,45,23,231,26,27,59,115,13,245,237,117,117,185,166,168,237,207,8,0,224,131,36,73,82,24,41,140,229,251,11,163,163,135,242,131,67,251,71,122,251,222,31,232,218,183,109,255,250,13,235,119,63,247,210,238,24,15,229,225,178,103,52,78,12,231,154,89,117,46,55,21,226,48,13,233,116,107,71,26,211,141,81,140,232,198,147,126,158,43,123,0,0,166,178,66,217,147,198,241,88,233,245,72,233,207,242,159,167,239,173,201,112,78,77,133,128,78,213,197,137,171,210,229,79,67,217,235,52,158,211,247,3,0,76,69,167,28,23,92,122,198,202,94,167,79,161,236,253,53,111,170,6,98,121,76,151,175,80,151,135,179,128,6,0,166,178,228,164,167,124,53,58,137,41,22,205,229,4,226,248,103,80,119,210,107,0,0,198,3,57,57,233,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,101,253,31,184,242,210,184,59,35,204,43,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":32149,"duration_micros":904,"top":1292.9239501953125,"left":166.32077026367188,"width":394.4184875488281,"height":34.3560791015625,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,220,111,144,93,229,93,7,240,239,115,238,134,36,32,29,176,166,1,167,21,112,28,66,212,202,208,90,21,102,180,181,58,12,72,147,221,77,76,37,89,160,117,208,1,73,168,80,154,80,74,98,111,75,144,18,160,212,110,169,150,17,219,66,179,137,161,100,255,1,190,64,11,197,169,242,194,170,29,45,88,148,161,226,140,3,133,209,129,182,48,100,115,239,227,139,37,33,169,201,46,164,147,92,82,62,159,87,247,185,231,121,158,243,61,207,222,217,251,59,123,206,217,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,134,210,235,0,0,112,24,42,107,214,110,56,35,37,167,166,91,255,234,51,55,110,124,188,215,129,128,67,71,1,205,235,206,192,248,200,63,150,228,180,164,222,50,218,63,180,166,215,121,14,182,101,227,155,219,53,229,163,53,245,137,177,254,161,19,122,157,7,118,89,189,110,253,149,77,45,115,146,164,219,237,62,120,203,77,215,62,216,235,76,175,212,234,117,235,175,42,181,252,241,75,205,231,74,147,95,27,190,254,154,111,28,178,253,127,104,195,185,77,201,207,36,73,74,125,120,120,211,198,237,179,141,89,179,118,253,229,37,229,168,36,73,173,15,13,223,184,241,175,15,110,74,248,209,213,215,235,0,112,160,150,76,220,126,82,95,237,123,44,211,39,130,95,29,237,95,245,174,94,103,226,149,25,24,219,124,123,41,229,252,36,169,221,242,235,99,131,43,31,232,117,38,102,54,48,57,50,208,116,242,190,90,242,246,36,111,74,242,221,146,60,86,107,198,58,229,133,91,38,250,47,252,238,171,157,179,212,242,71,53,57,50,73,210,52,31,77,114,216,20,208,165,150,179,247,104,190,33,181,158,153,228,144,21,208,41,89,85,147,37,73,146,90,166,46,89,183,254,212,207,110,218,248,200,44,131,174,172,201,194,233,151,101,83,18,5,52,28,160,166,215,1,224,64,181,234,156,11,242,242,85,148,95,93,118,215,151,222,220,203,60,188,50,75,38,39,143,44,165,12,236,106,55,77,206,235,101,30,102,246,254,251,63,63,111,112,124,203,100,233,102,180,150,12,36,121,75,146,185,73,126,162,38,191,156,146,235,90,153,255,205,101,19,95,122,199,1,76,127,248,126,7,149,250,232,94,237,110,243,240,33,221,125,217,107,237,230,148,90,238,88,177,98,69,107,150,97,187,199,212,90,92,129,134,31,194,225,251,203,139,215,189,146,186,114,143,102,211,237,107,206,239,89,24,94,177,57,157,239,13,36,57,122,87,187,166,46,95,177,109,219,17,61,140,244,186,52,56,190,249,220,193,241,145,58,56,54,242,119,51,245,123,246,185,185,127,158,212,247,36,217,89,107,62,91,74,247,244,190,190,190,227,155,38,139,107,234,101,73,158,74,242,150,90,155,201,165,227,35,11,15,73,248,215,128,29,157,190,15,39,185,51,201,87,82,202,199,134,111,252,248,61,189,204,83,146,183,47,60,113,209,7,122,153,1,94,79,220,194,193,97,105,96,116,243,47,37,89,148,36,165,230,174,90,178,188,212,172,74,114,93,111,147,49,155,90,234,249,73,82,74,38,107,205,153,73,142,233,28,209,89,154,228,203,189,77,246,122,83,126,114,182,30,203,39,71,78,233,118,179,42,73,82,235,133,99,3,67,183,239,177,249,201,36,255,54,48,186,101,188,148,250,245,148,44,108,213,242,129,36,87,31,156,188,175,45,183,222,212,126,38,201,123,123,157,99,111,229,19,151,174,93,63,49,124,195,198,199,122,157,4,126,212,41,160,57,44,149,38,23,76,191,170,15,149,210,92,91,83,151,167,228,231,7,39,183,158,58,186,228,220,67,119,31,34,175,202,224,246,219,223,148,228,55,147,100,250,175,153,73,173,89,82,75,206,139,2,250,208,170,245,248,204,114,21,191,214,188,59,211,183,73,125,123,116,239,226,121,183,177,193,149,223,30,28,31,249,66,146,15,150,82,127,35,61,42,160,87,175,253,200,219,154,210,183,56,233,30,215,77,243,76,171,116,254,253,211,215,95,251,247,73,234,108,99,219,237,118,243,63,47,76,253,74,167,219,156,146,154,55,148,146,133,169,245,123,251,234,91,230,116,110,29,190,238,186,167,215,92,185,225,173,165,155,254,93,239,191,120,84,235,147,183,182,219,207,39,201,165,87,180,127,54,77,103,89,146,212,212,103,63,115,195,198,225,36,229,210,117,87,191,163,118,203,91,75,147,99,106,167,121,184,236,104,190,54,60,220,126,238,64,142,183,214,116,247,241,211,59,162,166,220,150,100,127,207,131,116,119,31,71,169,51,174,203,234,43,174,62,161,52,173,95,76,186,63,85,106,158,79,242,88,95,231,251,95,187,249,230,155,95,248,129,174,101,245,186,245,31,110,106,217,117,251,200,223,14,223,112,205,87,247,154,235,170,171,222,216,236,236,251,131,221,3,154,238,87,62,125,253,181,123,93,249,184,236,178,143,28,223,153,211,186,112,87,187,41,245,206,63,217,180,241,91,51,101,132,94,82,64,115,216,89,177,109,91,107,103,118,174,72,146,154,108,189,171,127,229,63,13,78,140,60,146,154,197,233,118,47,72,114,197,129,204,187,116,252,182,163,91,153,255,92,146,148,190,122,226,246,115,134,254,115,96,116,203,187,154,82,215,212,146,51,146,60,48,218,191,106,213,255,203,50,119,106,89,106,126,47,165,44,78,178,32,53,79,165,228,95,83,186,127,54,186,244,188,187,103,218,231,217,247,222,59,119,222,142,103,47,41,165,254,118,77,22,39,153,87,82,158,172,169,15,214,110,29,30,27,28,250,250,76,227,219,237,118,243,207,111,59,121,48,53,191,159,212,197,37,101,97,146,167,147,60,84,82,135,183,247,15,237,247,161,172,129,137,145,123,74,205,111,37,121,116,180,127,213,162,153,215,230,142,69,173,180,30,73,82,82,234,192,232,210,161,241,153,250,239,87,51,103,40,169,125,73,190,211,247,98,223,125,59,231,78,29,147,148,37,73,61,235,156,187,55,31,123,207,123,134,254,119,182,41,86,220,187,109,65,103,106,234,226,154,12,36,229,164,36,243,147,252,119,146,7,186,181,251,169,241,129,243,254,101,182,57,6,38,183,158,89,186,221,139,147,156,150,228,248,36,207,39,249,102,106,217,186,224,169,231,110,189,245,162,139,166,102,26,191,116,124,100,97,147,114,113,82,251,75,114,82,146,86,146,39,106,114,95,55,157,91,38,250,207,255,143,125,141,27,156,216,220,159,90,198,146,100,71,171,254,248,254,142,119,112,98,228,157,169,121,32,73,250,74,223,9,119,46,125,239,19,187,183,141,143,124,42,201,31,214,90,191,48,54,48,244,187,75,199,239,88,212,42,173,43,211,205,187,83,114,92,146,239,36,121,48,77,115,195,15,158,76,238,249,25,223,173,228,244,193,241,145,250,114,179,60,190,189,127,229,79,39,73,183,83,255,161,105,149,203,187,201,127,205,180,30,165,230,209,58,125,50,116,220,76,253,14,134,75,214,174,63,171,169,229,19,73,78,173,181,38,41,41,169,233,214,38,107,214,110,120,188,150,242,177,91,54,125,252,139,251,26,187,98,197,138,214,194,19,79,185,252,153,239,119,214,37,205,130,146,188,252,84,197,126,78,46,186,221,190,177,36,79,151,90,126,161,166,94,179,235,253,185,47,190,248,185,76,127,142,82,155,238,207,37,121,105,91,121,242,210,181,235,191,85,83,110,171,53,111,206,244,58,37,77,77,157,215,153,90,189,110,195,159,46,56,178,117,69,187,221,222,249,106,142,187,148,52,251,57,53,120,231,165,31,90,127,209,240,141,27,63,183,143,109,179,222,3,189,250,131,237,147,75,171,115,83,82,207,73,106,73,74,234,75,61,167,250,126,236,217,213,107,55,12,47,56,170,117,77,187,221,222,177,107,170,82,203,146,154,156,158,36,53,153,76,178,87,1,221,116,230,156,181,231,90,117,59,205,169,73,246,42,160,167,230,180,206,46,187,215,44,233,164,239,47,246,123,240,240,26,224,30,104,14,59,59,231,237,56,59,211,255,5,96,103,233,116,182,36,73,173,229,47,95,218,252,59,237,118,251,135,254,92,215,218,58,122,112,98,228,186,210,212,251,107,201,242,76,23,89,115,246,236,51,184,253,139,111,220,57,119,231,223,36,101,91,74,57,51,211,15,87,205,75,201,9,73,206,73,109,38,7,38,54,111,125,255,253,159,159,183,175,125,44,29,191,99,209,252,169,103,31,73,169,159,172,201,25,73,142,77,50,191,166,158,148,228,125,165,41,15,13,142,109,89,189,191,140,231,220,189,249,216,111,156,118,242,125,165,230,203,255,215,222,157,199,199,85,215,251,31,127,127,206,76,218,178,149,93,112,3,84,46,139,160,44,23,5,245,34,155,34,91,147,76,176,177,77,216,138,254,10,216,6,129,54,69,47,13,206,37,133,43,77,89,36,45,2,151,165,66,147,212,84,146,76,138,101,19,212,139,94,20,100,149,159,2,226,206,173,172,178,180,165,77,50,115,62,247,143,51,147,156,36,51,211,133,34,173,190,158,143,71,31,157,115,206,247,156,243,157,153,147,228,123,190,231,243,253,124,77,250,130,201,118,83,52,184,235,3,146,190,232,178,31,215,100,218,210,165,246,55,87,107,254,229,94,53,61,109,159,43,247,121,4,158,56,87,146,153,236,15,7,60,250,219,165,229,202,150,227,230,249,27,16,95,178,164,182,54,183,237,248,254,30,73,43,37,141,173,200,105,210,218,246,63,185,167,237,11,217,129,236,51,46,187,68,178,131,21,125,102,227,36,125,88,210,153,129,5,143,166,122,58,102,150,218,255,216,187,111,221,42,149,233,232,180,48,188,91,82,74,210,30,138,62,179,237,37,253,155,204,231,191,188,235,54,143,148,27,144,90,147,233,56,49,33,61,109,242,116,148,14,81,219,41,138,233,222,207,164,243,18,74,60,85,221,219,246,229,82,251,111,44,102,182,101,117,239,226,227,147,74,60,34,215,148,252,117,55,86,209,117,88,175,48,124,48,213,219,86,181,150,195,148,213,147,170,127,168,171,178,238,234,158,202,186,219,203,149,43,100,118,112,211,203,111,231,124,235,107,218,204,166,11,2,217,157,50,29,80,162,200,135,204,125,97,67,227,197,243,85,36,109,235,123,62,180,207,149,146,90,36,237,188,174,231,76,228,18,38,73,30,250,186,14,194,123,143,203,238,86,244,115,57,82,133,185,206,125,101,101,238,123,69,182,149,231,195,154,207,63,118,105,240,102,59,52,107,153,62,43,189,214,16,157,145,166,207,156,125,180,37,115,143,72,58,169,196,29,196,182,38,205,126,101,85,246,39,231,159,159,222,97,168,42,186,171,240,218,164,99,210,233,244,176,206,57,119,63,46,190,108,129,142,27,89,70,242,163,99,11,191,158,63,55,189,124,125,235,15,252,61,209,128,198,102,199,101,81,214,6,247,251,187,107,78,123,73,146,20,218,162,252,230,247,63,121,224,191,28,93,98,215,117,102,57,255,170,92,95,151,212,39,233,167,50,221,34,215,178,194,246,137,157,157,9,37,146,119,74,58,66,210,106,185,93,230,161,31,148,147,118,13,100,159,144,244,109,73,89,115,251,210,27,111,142,29,213,19,52,97,233,210,45,3,5,247,228,27,203,175,73,154,21,122,184,95,78,246,126,147,157,228,210,99,146,146,50,191,186,88,118,131,116,58,29,140,201,105,153,164,194,123,189,87,242,147,3,211,254,161,219,103,101,186,84,210,155,46,251,166,155,157,84,236,61,118,87,213,221,37,233,89,73,114,11,206,41,86,38,255,94,183,53,139,66,102,220,117,109,58,157,14,75,149,45,167,50,115,219,222,38,29,34,73,10,172,77,146,22,30,53,101,141,164,140,36,153,130,250,114,251,87,245,116,28,30,154,221,161,168,177,251,188,153,206,85,34,248,88,232,225,126,146,159,34,249,163,138,62,179,150,84,166,253,244,98,199,216,114,77,242,118,201,39,230,23,23,123,104,159,179,132,127,68,166,195,21,125,103,171,37,125,204,147,193,221,197,110,124,82,189,237,71,184,60,163,168,209,188,92,110,23,4,210,1,65,160,125,221,124,138,164,167,37,141,53,183,27,171,51,237,239,108,118,17,215,30,230,97,155,75,175,73,118,78,16,104,223,32,208,190,138,158,192,188,41,105,11,133,118,115,62,108,70,146,212,91,245,229,21,253,9,223,161,63,225,59,72,186,57,127,156,135,10,235,250,19,190,195,234,138,220,129,235,83,141,137,157,157,99,100,81,156,180,69,215,237,223,197,244,153,77,117,102,186,98,196,234,254,124,67,114,77,124,165,203,167,53,52,54,125,35,190,110,218,204,166,67,205,21,31,116,183,198,76,157,46,187,66,242,167,70,28,119,185,73,77,38,53,121,69,223,139,235,89,213,216,223,89,247,252,117,58,252,70,195,84,51,109,214,197,27,60,8,218,37,207,143,45,200,70,135,211,54,230,185,155,214,231,24,211,103,164,247,145,89,175,92,91,15,175,175,126,37,233,213,225,165,237,176,129,100,174,99,176,179,194,117,111,108,227,150,175,190,53,112,112,188,176,75,195,26,208,114,109,253,202,170,220,161,195,142,40,59,54,182,184,76,192,38,142,16,14,108,86,42,51,55,109,99,110,149,249,197,182,194,250,158,212,164,223,165,122,218,31,146,233,147,110,118,138,222,102,126,83,151,159,45,233,129,156,108,82,111,213,228,81,61,33,217,49,217,70,69,13,229,149,30,250,225,61,169,186,199,99,155,95,148,244,203,170,158,246,251,2,83,70,210,105,53,153,182,133,93,85,245,63,42,20,72,230,86,158,37,179,221,36,133,30,250,113,61,169,250,135,98,251,47,175,204,220,244,223,129,198,61,101,178,221,194,208,206,147,52,172,113,249,196,129,123,95,32,249,97,146,36,211,37,221,149,117,223,28,81,197,7,78,94,218,190,40,12,117,191,92,255,90,230,125,94,107,178,171,229,62,161,50,211,241,190,226,239,53,247,255,36,109,109,210,170,68,127,226,191,74,29,107,109,146,74,156,158,239,50,251,125,247,132,186,7,11,235,3,247,246,208,172,94,242,79,87,119,119,236,209,147,154,252,199,145,251,78,236,236,28,147,85,246,54,69,191,179,158,81,46,251,217,174,194,205,83,228,215,19,59,59,151,100,199,12,44,205,63,13,184,252,248,101,203,22,223,121,194,9,125,133,2,53,189,237,95,117,215,23,36,201,76,231,119,85,214,93,29,219,255,247,146,126,90,211,211,118,135,155,221,41,233,163,111,190,57,118,154,52,212,64,155,216,217,57,102,192,7,110,53,89,66,210,51,201,100,242,200,37,39,214,190,16,59,198,211,19,59,59,191,159,29,155,253,129,164,207,154,180,160,50,211,126,111,111,85,221,250,54,184,214,141,233,147,146,254,215,178,185,79,118,157,124,234,95,227,245,168,201,180,61,230,178,251,101,218,33,10,155,209,85,133,141,133,176,145,84,166,173,63,223,41,155,91,151,208,153,98,170,187,59,246,200,218,192,245,146,237,45,215,128,194,224,170,181,239,245,246,77,189,240,194,109,21,42,118,45,122,206,100,95,73,102,87,126,239,170,171,174,90,61,117,234,212,138,138,241,187,158,96,129,47,42,52,8,93,62,231,107,179,102,223,94,136,171,53,249,57,177,78,233,191,201,253,144,214,150,193,217,4,27,27,26,47,110,117,121,254,9,144,191,55,167,228,141,215,182,164,227,223,119,73,238,110,163,250,111,221,191,155,204,38,207,187,250,234,244,235,146,52,173,113,246,9,38,245,42,186,158,100,238,167,73,186,109,3,62,14,73,210,181,115,231,252,166,161,177,233,155,46,93,26,189,95,29,55,125,102,211,41,243,231,53,47,90,219,190,146,228,150,189,105,112,146,21,73,146,181,246,135,137,75,242,131,37,213,112,65,211,65,97,66,29,150,31,188,45,233,216,151,87,229,206,148,116,227,206,91,39,30,126,229,173,220,202,193,207,218,131,35,37,61,20,189,207,127,63,200,164,157,70,157,47,106,84,255,76,146,190,54,107,246,222,57,143,61,5,8,140,252,212,216,228,209,3,141,205,74,194,183,248,162,162,152,215,213,201,254,138,17,51,111,217,226,252,139,84,169,176,137,245,240,106,178,47,57,161,88,131,50,58,149,190,34,73,114,251,143,158,84,253,227,197,138,100,170,235,150,74,214,43,73,161,231,203,231,185,249,56,73,119,153,236,218,17,141,103,73,81,79,97,32,221,42,73,102,118,204,168,211,155,206,202,191,124,160,72,227,89,146,116,251,132,186,167,37,47,59,211,98,168,53,55,75,90,33,83,69,194,252,172,145,219,211,233,116,96,166,175,230,207,122,235,146,218,218,55,202,29,175,28,151,162,180,131,62,248,61,73,146,130,254,138,187,21,245,200,89,16,132,69,123,225,6,198,101,171,243,33,10,82,160,41,221,195,27,207,146,164,37,181,181,253,129,89,163,203,255,236,242,190,45,6,94,27,214,195,229,94,120,31,186,119,68,227,121,80,87,117,253,15,221,125,81,116,12,125,38,190,45,59,118,160,42,31,38,35,179,240,140,17,141,231,66,29,86,90,54,172,87,244,228,98,124,194,252,140,98,231,217,88,204,236,27,35,26,207,146,164,174,170,250,31,201,245,160,36,121,224,101,195,115,214,85,205,237,183,189,183,58,211,62,47,149,105,251,78,42,211,222,81,157,105,127,216,2,255,93,254,134,165,223,100,167,118,215,76,90,203,68,30,27,71,69,56,230,75,42,76,192,34,201,44,56,189,181,165,121,97,97,128,219,13,55,220,48,176,96,222,37,25,133,62,97,104,47,179,172,219,105,67,139,218,47,182,173,109,196,84,220,110,10,191,29,223,55,161,220,191,172,107,253,204,108,88,116,178,187,255,207,78,91,39,191,82,104,60,75,210,130,150,57,203,228,138,13,204,244,163,214,43,252,204,134,90,255,150,191,19,216,113,171,196,92,69,61,198,133,13,173,103,207,76,191,103,244,206,195,77,187,32,189,151,153,125,58,86,225,239,206,111,185,228,220,66,227,89,146,90,175,108,126,44,89,145,59,66,81,246,149,66,185,41,146,148,78,167,179,10,117,207,208,122,13,61,5,180,224,243,197,171,239,39,20,94,103,221,142,136,109,234,179,183,94,99,98,37,108,242,104,64,99,243,98,42,52,176,150,46,169,173,29,54,74,62,103,222,46,41,39,105,252,27,111,142,169,30,181,239,122,157,198,22,151,106,44,86,245,44,250,168,164,143,228,207,89,182,199,200,204,239,139,254,183,195,226,235,123,170,234,254,179,187,170,238,248,174,170,201,13,37,119,246,160,208,24,217,121,98,103,231,224,4,9,169,174,197,251,186,124,79,73,114,211,119,202,157,191,187,178,174,91,101,6,128,245,86,125,121,133,123,190,215,203,245,229,248,121,36,233,201,3,247,174,202,135,153,184,5,126,77,185,115,149,83,147,105,251,172,162,120,227,120,184,141,36,105,73,109,109,206,100,223,143,170,96,117,163,247,150,204,149,202,215,241,169,120,239,245,72,183,87,213,61,217,83,85,191,123,79,85,253,238,241,1,148,169,174,197,123,73,81,131,201,220,110,40,87,215,158,234,250,41,61,85,245,187,119,87,213,213,140,168,69,97,249,87,93,149,167,252,188,212,254,93,39,159,242,188,164,187,37,73,161,213,148,42,183,17,244,175,28,59,80,114,250,102,51,123,68,146,204,125,163,12,236,243,177,21,59,154,52,67,178,179,37,77,50,233,16,185,254,34,211,141,30,6,31,237,170,158,188,254,113,188,27,110,48,44,201,165,63,182,206,189,164,173,88,161,249,243,230,252,88,177,1,109,86,152,185,79,146,203,98,3,39,71,255,45,244,88,198,138,188,117,254,123,233,62,60,62,58,48,187,190,216,32,65,55,139,93,71,150,88,190,66,59,140,44,179,62,210,233,116,214,2,157,42,121,46,191,106,187,10,203,149,189,222,163,51,103,79,140,47,39,147,201,162,99,39,190,125,217,101,47,202,108,48,36,205,204,62,61,117,70,122,39,73,114,203,95,243,146,100,58,114,48,198,217,237,11,67,235,237,210,1,115,169,160,0,0,20,101,73,68,65,84,216,89,15,46,236,107,166,163,98,167,249,73,107,107,107,159,128,77,28,33,28,216,108,84,102,58,222,39,121,212,83,17,53,150,135,233,173,170,123,49,213,211,246,99,153,29,163,40,78,122,241,200,50,235,42,180,176,104,175,178,36,37,101,123,20,254,178,38,164,23,82,153,81,85,25,20,75,20,245,222,98,219,107,122,58,190,232,166,201,146,127,66,209,99,206,45,6,247,29,26,35,20,244,141,93,177,165,164,21,146,20,4,185,15,133,249,206,167,32,240,95,148,125,35,102,174,76,199,195,146,127,176,84,145,208,114,215,36,148,56,71,210,251,179,99,7,170,36,13,54,202,220,252,107,249,55,114,239,237,19,234,159,46,123,174,50,10,113,235,46,61,214,83,164,151,210,205,219,229,58,71,210,62,213,221,109,255,58,58,251,136,239,145,239,103,43,249,189,148,149,8,63,60,248,58,25,62,186,65,199,112,237,158,255,216,215,158,38,209,244,184,92,149,178,252,77,195,59,193,245,215,123,190,112,218,170,82,155,67,233,181,168,186,182,221,70,57,95,191,250,85,184,189,202,5,31,205,37,86,61,223,91,189,254,211,119,111,12,166,161,207,213,84,254,103,192,221,30,50,243,66,15,231,224,117,96,238,191,150,217,39,36,201,229,147,166,205,184,168,101,193,21,151,254,105,232,20,193,249,67,25,240,220,115,74,110,112,74,53,243,68,137,107,206,151,199,199,54,86,184,118,144,244,74,241,178,235,166,245,242,230,39,166,207,188,120,174,204,191,33,73,46,85,77,159,53,187,122,254,220,57,61,165,247,10,118,143,101,251,123,249,234,111,165,71,133,81,21,88,168,135,227,183,7,21,65,255,110,146,94,49,247,123,99,227,14,199,190,178,42,119,232,212,116,250,49,91,149,59,188,176,50,84,216,22,184,157,84,24,244,57,198,114,199,73,90,164,40,31,124,158,223,37,96,51,64,15,52,54,27,9,11,79,149,20,200,245,183,157,255,186,178,248,32,19,11,162,214,172,235,216,9,75,219,71,197,221,173,171,32,12,74,134,42,228,204,226,189,68,203,215,241,223,176,56,216,51,126,116,203,184,84,79,219,221,110,190,68,242,26,13,78,143,236,111,13,253,27,62,16,170,216,249,19,111,85,188,90,172,76,156,173,229,15,114,111,213,169,207,168,16,51,62,20,230,160,147,51,237,31,87,52,72,82,102,193,6,247,62,79,236,236,28,35,215,201,249,197,162,55,53,221,149,117,63,149,235,79,146,100,9,157,54,114,187,41,136,190,75,243,191,109,72,29,60,22,131,185,58,240,13,106,160,152,217,206,146,228,174,181,199,11,135,86,248,94,118,220,144,115,173,91,133,84,54,127,112,160,48,140,138,109,156,41,155,221,188,144,182,76,7,60,249,244,51,189,85,239,78,227,57,111,40,94,214,173,236,207,128,217,176,239,123,171,51,210,233,113,146,228,178,248,224,222,29,45,8,158,110,152,213,244,189,233,141,77,151,79,111,108,122,98,40,254,89,146,172,103,93,227,159,139,241,64,175,23,91,31,72,253,241,229,100,50,187,81,190,171,157,182,14,210,46,13,53,248,221,190,211,208,144,30,95,166,134,241,44,36,229,127,167,4,185,225,219,45,185,163,36,229,67,96,254,52,184,90,58,98,236,202,240,24,13,117,212,189,116,237,220,57,191,113,211,224,140,141,110,126,220,87,103,205,222,87,26,234,121,15,60,25,31,144,8,108,178,232,129,198,230,195,45,26,72,103,218,225,229,93,183,233,47,222,243,155,239,69,49,85,84,184,38,75,131,169,218,214,75,24,148,153,100,192,130,87,229,161,36,133,201,190,228,110,75,106,107,115,37,203,150,240,198,155,99,191,37,211,177,249,10,95,165,92,112,125,119,234,75,191,85,44,118,178,166,167,163,206,205,71,63,154,30,58,191,114,91,14,236,40,169,108,92,178,23,25,192,51,82,232,106,13,76,159,151,217,209,169,174,197,123,117,215,76,122,54,52,157,39,151,76,246,92,87,229,164,101,133,16,230,245,53,48,46,59,193,162,158,53,153,116,121,42,211,126,121,217,29,220,106,211,233,244,249,195,179,125,248,171,146,246,148,108,155,146,251,149,19,251,204,182,88,173,241,82,249,198,103,137,138,189,42,105,79,51,109,191,214,146,166,157,242,45,161,97,141,117,243,192,11,79,22,182,124,171,162,100,99,201,220,182,29,158,165,236,221,87,49,38,177,38,155,205,74,82,118,67,51,177,108,44,38,127,201,101,187,74,146,5,107,189,190,227,55,49,111,45,76,167,215,72,210,130,121,205,15,78,107,156,221,102,178,194,0,221,113,238,69,103,22,124,195,44,177,190,83,100,15,235,156,202,101,7,138,126,215,57,41,136,23,204,229,146,27,165,1,157,78,167,251,191,58,163,233,84,11,84,24,95,177,107,56,46,119,85,169,131,155,233,165,194,111,188,181,253,190,8,221,118,136,31,39,200,14,221,160,184,41,19,203,108,114,180,203,227,79,222,186,36,41,144,238,113,233,223,37,201,100,39,202,253,103,177,50,47,94,51,47,61,50,3,10,176,73,162,7,26,155,133,124,111,232,199,98,171,250,202,252,147,36,185,123,209,120,218,183,203,178,42,60,222,12,194,177,217,253,202,22,46,173,208,203,122,91,119,85,221,140,238,154,73,207,106,228,192,35,243,162,233,196,44,171,161,105,122,179,193,168,20,119,195,184,155,220,75,102,225,40,200,84,77,190,67,81,38,10,243,68,120,206,132,165,237,59,201,243,121,153,205,23,140,172,219,250,8,66,197,211,185,173,245,123,147,180,235,19,7,237,21,79,105,165,208,60,250,204,93,7,109,72,29,66,31,248,253,224,235,49,193,33,27,114,12,47,244,174,185,214,154,230,205,228,7,71,255,107,216,163,240,48,28,106,184,231,182,28,40,19,90,225,235,60,96,237,239,101,201,137,181,47,116,87,213,89,119,85,93,197,218,75,191,179,220,237,127,7,95,75,135,171,72,142,231,152,216,96,80,31,188,14,26,46,104,58,72,26,204,232,83,244,44,114,221,41,247,131,90,231,166,159,127,59,245,125,55,92,123,69,243,195,146,13,14,132,52,233,76,197,122,238,135,207,68,232,203,99,229,118,106,104,156,253,145,210,71,182,79,197,151,250,44,49,52,198,194,125,176,247,216,165,35,100,67,55,36,238,118,151,36,237,184,85,226,103,50,21,198,175,108,103,178,11,135,14,237,101,39,158,2,54,37,244,64,99,179,16,74,133,188,190,127,233,174,156,188,123,185,6,93,20,87,236,75,36,59,172,50,115,219,158,165,102,133,219,80,221,53,147,126,83,147,233,120,206,229,123,134,209,31,165,243,138,22,116,183,234,222,142,43,229,190,157,5,126,123,97,86,194,137,157,157,91,103,149,221,94,146,60,202,9,59,202,241,203,150,141,213,192,235,69,187,124,187,107,38,61,155,202,180,63,35,105,111,143,50,103,148,28,188,85,211,187,120,130,23,178,87,148,99,230,234,233,248,142,204,91,204,117,90,50,103,111,201,124,11,73,43,178,190,122,189,242,201,198,157,120,71,219,246,158,211,241,249,147,76,237,174,154,92,54,13,94,170,167,253,87,50,237,47,233,20,197,39,103,112,245,72,250,146,164,3,139,199,72,71,42,51,183,237,29,40,184,71,146,220,131,83,50,213,147,31,144,162,48,149,84,166,253,105,73,251,88,104,95,150,84,50,30,52,213,211,126,157,155,31,111,10,126,217,93,53,185,16,122,34,115,203,184,121,173,76,251,215,244,46,58,172,212,64,194,234,238,142,61,228,126,172,76,10,99,241,228,249,99,44,47,60,37,241,156,62,169,232,166,101,20,151,127,177,124,155,112,163,40,60,57,73,148,45,181,41,50,221,47,229,175,43,215,123,167,53,206,62,113,65,203,156,81,141,175,233,179,46,58,68,62,212,128,54,179,123,36,233,220,153,233,253,67,203,221,103,209,4,56,146,235,57,185,157,43,11,223,39,211,120,153,254,16,122,242,231,215,206,219,240,176,141,119,90,124,42,111,87,241,199,21,227,252,173,139,214,216,22,213,210,218,126,7,248,79,226,215,155,71,3,69,27,71,150,106,104,72,143,119,229,98,25,133,252,241,120,166,142,129,173,146,247,143,89,149,203,42,106,91,36,21,77,120,37,201,115,3,91,39,238,149,162,129,142,13,141,77,247,185,6,167,65,31,172,155,135,54,148,201,3,216,196,209,3,141,77,95,52,162,189,86,146,92,234,92,91,111,232,234,49,219,46,85,62,172,33,97,137,13,158,156,160,108,149,44,188,49,255,114,90,169,89,252,82,153,197,13,38,157,103,102,167,42,155,28,236,53,206,103,15,89,41,73,22,229,146,30,101,220,192,107,87,171,248,204,101,146,36,51,93,151,127,121,84,77,166,173,169,232,249,187,22,239,229,242,178,89,58,226,220,215,220,40,249,91,50,237,32,243,11,243,245,251,238,219,137,117,205,207,46,56,86,82,159,135,107,150,172,195,46,139,163,243,170,250,216,187,111,29,204,73,155,159,177,240,121,73,178,192,110,170,238,190,101,84,239,237,196,206,206,68,66,201,121,38,219,205,100,21,99,250,19,195,7,151,185,229,63,11,63,41,213,211,62,165,216,201,107,50,139,62,35,233,76,147,237,230,10,135,77,131,62,126,219,53,93,138,226,217,229,30,220,18,159,160,164,224,248,101,139,198,155,121,187,76,21,146,222,176,92,118,97,124,123,119,205,164,103,7,223,135,236,188,145,89,79,36,41,213,211,113,174,52,60,107,203,59,193,21,68,241,228,166,15,200,215,109,86,189,154,222,69,135,165,238,88,188,255,59,90,177,117,208,31,38,22,42,54,70,192,100,55,53,204,188,120,66,188,204,244,153,179,143,148,7,157,177,85,97,152,77,92,47,73,110,225,217,82,44,20,199,180,189,5,62,67,102,39,185,217,30,30,218,135,205,195,79,157,51,51,253,241,169,83,167,190,235,61,238,197,152,13,253,253,182,18,119,91,243,230,205,91,37,247,51,139,109,139,79,229,221,58,247,210,135,100,241,73,112,124,198,180,153,77,23,196,223,251,57,95,79,127,56,28,151,235,145,134,166,107,119,217,176,16,185,27,210,233,183,148,207,237,60,162,182,63,205,111,139,246,51,21,25,40,232,62,144,232,191,123,244,122,96,211,68,15,52,54,121,53,153,246,99,220,236,3,146,100,65,176,214,137,6,238,60,225,132,190,84,166,189,71,210,233,230,86,39,169,104,158,228,183,35,185,166,98,94,110,108,54,229,210,161,110,246,131,234,76,123,107,96,65,187,6,6,254,170,10,219,221,221,78,151,242,121,149,221,175,26,153,31,215,221,191,111,102,103,72,170,175,206,180,191,236,30,222,236,22,188,148,148,239,45,179,153,238,154,32,247,251,84,36,7,180,36,125,252,209,103,175,121,242,160,189,38,186,244,105,151,93,146,202,180,125,202,20,92,151,85,246,153,164,217,246,114,59,206,21,158,43,105,123,201,31,86,137,134,122,92,79,106,202,235,53,153,142,69,46,159,170,168,87,50,180,32,220,224,193,131,146,242,179,11,186,36,187,171,39,53,165,232,64,170,56,119,107,51,243,102,151,182,218,114,77,50,37,105,145,20,205,88,88,221,221,113,134,5,126,143,164,3,44,24,251,203,84,166,189,217,146,254,227,68,88,145,237,207,101,15,206,90,118,150,164,127,203,31,233,130,37,181,181,195,6,104,117,87,77,106,77,101,58,82,50,29,41,211,141,53,153,142,195,100,185,91,60,27,254,62,12,130,93,204,18,53,146,55,230,27,191,79,244,85,108,127,93,124,255,133,71,77,89,83,189,116,241,20,11,195,187,36,237,163,68,242,151,213,153,182,185,9,179,31,133,217,32,180,32,252,140,15,232,235,50,229,31,127,251,217,197,242,85,187,236,70,147,167,93,58,52,59,54,123,111,117,119,199,165,146,126,103,9,255,128,164,51,229,62,69,238,247,228,243,43,191,115,2,127,52,159,168,237,125,169,76,251,220,160,183,125,161,15,228,254,214,55,54,88,83,108,98,149,154,222,246,6,119,93,163,92,24,86,47,93,124,124,207,132,73,27,163,183,48,30,75,125,100,67,99,83,217,216,106,55,127,114,254,220,57,189,55,92,145,126,101,250,204,217,211,101,86,184,145,125,143,155,247,78,111,156,253,184,201,94,13,165,241,146,134,93,243,102,254,245,249,87,166,159,141,22,114,183,202,131,58,13,53,162,119,116,233,24,73,81,114,187,104,178,110,37,148,83,176,237,46,175,52,204,154,125,86,235,220,57,37,83,6,110,202,230,207,155,115,255,180,198,166,155,243,33,28,165,153,78,151,235,33,73,227,36,51,51,93,81,177,237,46,13,13,141,77,191,11,165,192,114,185,195,53,188,205,176,108,65,75,243,45,35,15,227,230,119,218,240,188,206,210,136,153,5,61,23,222,105,193,168,254,187,95,220,112,249,229,27,156,103,30,248,123,163,7,26,155,60,55,43,244,34,255,186,123,194,164,181,167,16,147,228,65,148,141,195,229,123,214,244,46,218,232,189,121,75,106,107,115,158,27,56,81,81,142,217,49,38,205,112,15,31,241,100,98,185,123,240,96,62,87,174,201,117,125,119,85,221,172,145,251,91,152,157,169,252,40,121,147,206,11,44,120,50,33,189,224,178,159,184,107,130,164,159,42,153,40,30,26,34,41,157,78,135,97,216,119,162,60,202,51,45,217,241,46,207,36,148,120,218,61,120,208,101,223,148,180,173,153,95,180,182,188,199,113,93,85,147,207,138,26,220,81,47,209,237,19,234,127,187,238,159,202,112,19,122,111,253,144,228,159,142,142,53,58,237,96,49,61,169,201,127,52,169,144,231,249,148,17,219,238,147,121,141,162,1,128,31,145,180,208,179,246,199,108,152,125,62,48,245,42,106,60,247,155,233,220,238,170,250,209,217,62,204,124,205,152,176,74,178,59,36,5,46,159,234,30,60,168,68,242,197,192,130,39,243,141,218,173,36,127,52,153,76,30,23,159,197,112,176,14,19,38,221,35,249,23,21,61,65,248,160,201,90,67,215,83,74,132,191,118,211,127,229,235,181,90,210,25,69,235,32,233,61,47,188,121,153,92,133,137,34,142,178,192,127,104,129,255,65,174,7,228,154,34,233,129,32,161,178,19,224,108,12,21,171,147,203,20,77,61,46,153,205,12,93,79,121,50,177,124,76,46,184,181,88,121,119,21,98,95,3,133,254,169,98,101,222,14,147,142,114,169,185,236,63,183,84,161,252,252,121,115,110,50,105,196,211,23,59,208,165,99,108,68,227,217,221,90,90,231,206,105,41,44,183,206,189,244,33,185,151,73,235,54,172,94,59,185,219,146,105,51,46,250,236,219,123,135,239,158,96,77,226,124,197,39,64,41,98,254,229,205,191,10,229,41,73,131,169,17,77,218,35,255,121,30,165,225,141,231,7,250,131,254,58,21,9,29,73,228,70,207,34,24,42,49,236,102,107,193,21,151,254,105,88,150,16,73,242,98,189,210,192,166,139,6,52,54,105,249,25,5,83,146,100,242,117,206,235,124,224,35,79,255,80,249,63,24,97,24,188,35,97,28,221,53,167,191,154,236,75,30,227,166,186,124,67,118,185,162,180,84,203,205,117,187,135,246,185,238,234,186,179,139,133,156,228,247,61,196,101,205,146,254,191,162,6,217,10,73,143,75,154,145,236,75,30,163,254,190,81,51,204,197,245,164,166,188,126,192,227,191,61,214,220,38,202,253,30,69,161,1,253,138,82,230,125,223,44,252,76,87,101,253,101,50,27,213,11,90,74,116,179,17,245,86,39,194,13,159,56,69,146,146,97,242,84,69,125,121,43,182,219,166,175,119,157,119,180,193,48,142,99,42,51,237,187,196,55,117,87,214,103,114,178,125,243,159,219,19,138,66,117,250,36,253,94,166,27,3,211,193,93,149,117,37,51,175,220,121,194,41,111,118,87,78,170,12,93,149,102,90,154,79,157,215,47,233,117,73,255,45,217,57,175,141,127,223,161,197,102,25,28,172,67,85,125,87,50,72,238,35,183,203,36,61,169,168,65,191,66,174,167,92,186,34,107,217,253,186,171,234,190,91,106,255,27,206,58,107,224,181,109,223,251,121,73,51,100,122,36,191,255,74,151,30,115,249,121,59,191,176,226,152,21,99,114,197,103,192,220,136,150,212,214,246,39,131,228,231,36,181,41,250,89,41,219,251,107,242,235,36,189,96,178,231,70,78,134,243,110,105,109,105,158,227,110,53,146,138,207,128,232,122,78,174,250,5,243,46,25,118,19,219,208,216,116,184,204,226,97,60,223,144,219,153,38,53,201,253,98,185,127,87,209,207,101,65,96,137,96,216,49,44,40,29,74,54,114,38,194,82,130,32,216,224,193,185,238,67,223,87,169,24,232,130,214,214,244,155,26,49,211,232,240,65,132,145,107,91,230,220,165,64,159,146,171,84,40,197,107,50,107,222,105,171,196,209,165,122,139,175,185,162,249,81,105,88,170,199,151,175,109,73,143,202,223,110,178,97,189,210,65,194,73,95,135,205,202,59,62,74,5,192,230,35,149,105,239,144,52,73,210,211,221,85,117,251,190,219,245,193,63,182,105,179,102,95,24,184,173,115,140,113,33,132,163,216,182,134,89,23,125,82,30,236,35,243,93,66,5,47,5,202,61,211,58,247,210,95,168,72,227,178,161,241,226,249,177,60,207,191,153,223,210,252,209,162,245,107,188,248,58,211,96,195,115,213,252,150,230,173,11,219,166,95,216,244,49,11,7,7,194,169,111,171,196,149,133,56,223,105,23,54,237,23,132,26,236,45,215,154,196,53,173,173,233,81,169,19,163,108,23,54,56,88,184,47,76,92,23,31,148,87,206,180,153,77,147,2,211,158,249,197,63,183,182,52,23,125,114,48,236,124,51,103,159,165,124,62,115,185,255,188,117,222,156,81,189,197,5,231,124,61,253,225,32,155,59,36,8,252,131,10,181,50,12,130,231,86,109,25,252,172,144,6,176,236,121,26,47,158,44,249,71,36,201,101,191,157,223,114,201,168,129,206,231,206,76,239,239,150,27,156,49,118,199,173,18,223,42,54,91,35,176,169,162,1,13,64,146,52,241,7,157,187,102,179,217,63,73,26,227,242,134,158,170,250,249,239,118,157,128,119,194,180,198,166,222,216,180,222,221,243,91,154,139,78,185,62,109,102,211,121,102,186,42,90,242,220,252,150,57,21,90,75,111,47,128,127,14,132,112,0,144,36,101,115,217,233,146,198,72,122,189,162,175,98,225,218,202,3,155,171,64,246,231,216,226,177,211,46,72,239,53,178,204,185,23,126,115,55,51,157,31,91,245,43,209,120,6,144,71,22,14,0,154,122,253,245,21,47,187,190,34,73,46,45,204,167,218,3,254,33,185,188,67,82,33,132,99,43,75,228,158,156,222,216,116,167,73,143,184,187,187,5,219,135,97,120,134,98,179,24,142,76,217,6,224,159,27,61,208,0,244,242,174,219,212,73,218,69,82,24,36,156,134,2,254,161,205,111,105,254,153,204,254,35,182,106,172,164,106,151,154,101,54,199,228,51,20,107,60,155,108,193,130,150,230,155,255,238,21,5,176,201,162,1,13,64,174,40,109,154,153,126,208,117,82,125,209,217,241,128,127,36,243,231,94,146,54,243,137,114,149,155,169,244,37,151,206,106,109,185,228,29,79,43,8,96,243,194,32,66,0,192,63,173,116,58,29,252,109,245,192,97,57,183,195,3,183,10,153,247,133,161,253,37,8,245,76,235,149,205,143,139,184,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,231,241,127,175,62,8,200,80,110,124,70,0,0,0,0,73,69,78,68,174,66,96,130]}],"frame_width":720,"frame_height":1512} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/flutter_jank_metrics_02.json b/FrontEnd/flutter_pos_ecommerce/flutter_jank_metrics_02.json new file mode 100644 index 0000000..478eb42 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/flutter_jank_metrics_02.json @@ -0,0 +1 @@ +{"type":"RenderFrameWithRasterStats","snapshots":[{"layer_unique_id":31105,"duration_micros":6392,"top":0.0,"left":0.0,"width":720.0,"height":1512.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,28,235,73,68,65,84,120,156,236,214,193,13,128,32,0,192,64,100,255,137,49,70,86,160,47,99,114,55,65,159,189,214,115,191,3,0,0,56,50,191,14,0,0,128,63,49,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,176,219,173,99,1,0,0,0,128,65,254,214,99,216,95,20,1,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,1,154,40,15,193,76,245,230,194,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":30838,"duration_micros":1087,"top":-43.05882263183594,"left":48.0,"width":282.0,"height":331.76470947265625,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,156,93,119,93,63,254,215,231,222,73,211,150,210,34,91,75,210,74,91,176,44,202,166,128,138,32,45,10,8,180,153,153,212,134,54,1,172,95,20,220,80,112,249,186,224,18,245,171,130,95,193,141,229,87,148,10,180,153,212,196,102,150,20,248,98,133,82,118,5,132,162,172,69,182,102,210,98,1,105,75,151,36,115,207,231,247,71,50,201,157,233,204,100,14,180,157,73,242,124,62,72,31,115,206,249,156,207,121,223,123,39,135,215,61,249,156,207,73,14,113,147,147,147,117,114,114,178,46,117,29,192,225,199,249,5,128,185,116,150,186,0,0,0,56,148,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,194,192,82,23,0,247,148,225,241,145,155,146,172,220,183,184,107,116,112,253,9,75,89,15,0,112,104,18,160,57,146,172,204,129,0,13,0,240,109,49,132,3,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,143,242,230,144,53,60,62,114,83,218,61,154,187,191,237,202,225,241,145,59,90,236,187,107,116,112,253,9,45,218,3,0,135,41,1,154,67,217,202,180,11,208,115,237,15,0,208,138,33,28,0,0,208,130,43,208,28,202,118,181,108,63,251,138,115,155,253,219,30,11,0,56,76,9,208,28,178,218,142,73,222,55,230,121,58,68,239,26,29,92,127,244,93,95,21,0,112,184,51,132,3,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,143,242,230,72,178,107,158,159,1,0,22,77,128,230,136,49,58,184,254,132,165,174,1,0,56,244,25,194,1,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,194,192,82,23,192,225,97,120,219,155,239,151,129,21,47,155,94,174,181,78,142,13,110,120,253,82,214,52,109,120,124,211,121,41,229,49,211,203,189,218,187,100,98,240,249,159,93,202,154,0,128,67,151,0,125,23,25,222,62,242,195,169,121,206,119,214,75,189,101,116,205,134,87,222,53,21,221,211,86,222,47,181,121,249,244,82,41,229,163,73,150,69,128,78,202,218,212,156,191,127,169,118,255,53,137,0,13,0,124,91,4,232,187,72,169,249,193,90,243,242,131,183,92,176,151,27,146,28,162,1,122,150,90,203,82,151,48,159,110,41,203,182,54,0,96,249,51,6,122,121,169,75,93,0,0,0,11,19,160,1,0,160,5,67,56,238,34,219,214,172,255,171,36,127,53,215,182,225,177,145,171,82,114,230,244,114,83,203,143,140,15,93,240,129,123,172,56,0,0,238,50,174,64,3,0,64,11,174,64,47,103,181,150,161,177,127,60,61,221,156,145,218,59,35,41,43,75,234,87,106,147,207,140,13,111,248,248,124,187,157,183,101,203,125,123,43,247,188,236,64,63,185,122,219,208,134,127,57,111,203,150,163,246,28,211,156,89,122,245,209,181,212,78,73,157,76,167,251,159,163,231,156,127,205,236,62,214,94,177,233,244,218,203,19,75,201,233,181,118,190,81,155,92,251,192,255,190,249,61,111,120,241,139,247,44,170,244,148,102,250,231,161,209,205,167,150,78,243,67,41,121,112,106,105,74,45,147,165,228,211,151,15,94,240,177,54,111,199,121,91,182,28,55,117,204,212,163,106,147,135,36,229,212,146,124,173,83,155,47,222,118,84,253,224,219,159,253,188,155,23,219,79,45,189,38,73,158,241,142,183,220,235,216,93,71,253,104,106,239,140,82,203,49,181,147,107,87,148,129,15,109,61,103,221,100,155,186,0,128,35,203,33,63,27,193,228,228,100,77,146,213,171,87,47,219,215,210,122,8,71,173,101,104,98,228,23,75,202,111,37,89,61,79,171,175,213,228,213,143,253,216,231,94,185,113,227,198,166,127,195,185,219,55,125,79,211,148,207,245,117,248,218,148,242,205,82,243,210,154,220,107,142,3,190,125,119,55,27,222,122,246,134,255,25,28,219,252,148,78,169,127,155,228,49,179,91,149,228,214,90,234,27,31,112,253,183,126,125,118,144,30,222,118,217,25,233,54,125,83,195,213,15,167,215,125,94,186,245,85,73,125,78,230,254,93,251,84,77,254,108,108,112,253,165,243,188,198,36,201,154,241,75,30,214,77,247,207,146,12,205,211,79,47,201,123,122,233,253,252,92,243,59,15,143,143,108,78,250,166,177,43,229,5,181,214,103,167,230,220,148,172,152,227,117,126,160,246,58,63,51,186,246,252,79,47,84,23,135,191,67,225,252,2,192,61,207,16,142,101,104,120,124,243,235,75,202,223,102,254,240,156,36,247,47,201,159,94,243,184,51,22,12,159,123,149,159,73,205,203,231,14,207,73,82,158,117,84,175,92,53,52,177,233,194,78,169,239,206,28,225,57,73,106,114,175,212,242,203,55,158,116,239,119,29,116,154,186,90,30,146,110,239,99,73,61,59,243,127,81,123,100,73,46,89,59,190,105,227,124,221,12,142,93,250,200,110,186,239,77,50,188,64,63,221,36,103,117,211,253,248,208,232,166,199,46,88,87,146,90,235,197,73,206,159,43,60,39,73,77,158,148,110,243,177,225,43,46,251,190,131,245,5,0,28,121,4,232,101,102,104,124,228,121,41,121,113,139,93,46,88,59,190,233,172,131,180,89,185,136,126,30,83,106,249,135,44,238,119,226,201,195,19,155,127,125,193,22,37,247,77,202,177,139,232,43,53,229,15,134,38,54,93,56,123,253,121,91,182,116,59,165,51,154,228,1,139,233,39,201,209,165,211,121,205,34,218,45,102,232,210,202,76,245,230,188,41,20,0,56,178,9,208,203,76,185,243,131,84,174,174,37,63,57,80,6,30,60,80,6,30,92,74,126,49,201,140,49,186,139,127,128,75,185,162,118,58,207,28,216,53,112,159,218,212,199,39,121,207,124,45,107,205,235,82,242,148,94,110,63,126,223,240,147,25,67,35,106,234,47,45,238,152,105,146,252,93,83,203,143,222,122,244,212,113,77,109,30,93,83,254,56,201,77,51,42,171,229,47,207,123,219,150,25,65,121,106,101,239,103,147,156,209,183,234,142,212,252,110,83,203,143,244,114,251,241,73,158,81,82,222,56,171,242,31,25,158,24,121,242,34,235,250,191,37,245,169,183,30,61,117,92,109,234,227,106,173,151,204,104,81,202,143,13,142,93,250,200,69,190,78,0,224,8,225,38,194,101,228,220,241,145,71,55,201,170,190,85,55,14,236,26,120,198,214,117,235,118,247,173,123,221,121,219,183,140,247,154,169,207,238,31,146,81,202,153,231,109,217,114,223,173,235,214,125,99,129,238,223,55,186,230,252,53,41,101,250,97,45,31,189,240,170,127,120,230,77,55,175,220,153,228,187,250,27,214,154,215,141,13,173,255,197,190,85,87,159,247,214,45,103,78,237,153,250,202,244,176,135,146,242,221,131,99,151,62,114,124,232,121,159,154,247,136,53,123,82,242,156,209,193,245,87,246,173,253,143,36,255,177,246,138,77,111,170,189,242,238,36,167,236,91,127,159,222,158,61,191,156,228,247,166,27,150,90,159,57,99,160,72,45,191,55,58,116,193,95,244,173,185,50,201,149,195,227,155,238,72,74,95,189,245,188,36,239,91,224,189,72,45,245,133,99,107,54,188,169,111,213,199,147,188,96,120,124,228,212,36,79,217,95,67,233,12,38,153,255,53,2,0,71,28,87,160,151,145,38,229,241,253,203,181,214,43,103,133,231,36,201,214,115,214,77,214,90,223,223,183,170,219,91,185,251,17,11,118,94,242,187,125,225,57,73,242,166,179,126,250,142,90,179,121,86,203,222,138,221,3,191,55,107,93,182,62,103,221,13,181,147,254,32,156,210,233,44,120,204,82,234,43,103,133,231,253,182,157,189,225,11,73,94,216,191,174,166,60,111,230,114,30,215,191,220,233,54,227,115,245,213,212,206,200,140,253,106,89,240,170,113,77,62,50,43,60,247,111,123,67,255,114,73,14,58,166,26,0,56,178,184,2,189,140,140,14,94,112,113,146,139,147,100,205,248,200,137,221,146,179,134,199,70,94,158,78,78,77,83,191,59,165,28,211,215,252,140,25,59,215,238,131,22,232,250,230,209,115,46,120,79,178,254,78,27,58,157,92,91,251,98,117,73,254,117,190,43,217,37,245,243,253,247,241,149,166,44,116,147,99,205,84,243,186,5,182,103,116,112,253,149,195,99,35,95,78,201,131,247,173,58,117,205,248,230,85,19,131,23,236,76,146,209,161,245,167,78,183,29,26,221,124,102,83,203,51,134,199,71,126,54,41,167,38,245,196,76,23,83,235,140,49,222,37,57,113,161,227,38,217,54,239,150,166,126,58,157,25,247,42,30,172,47,0,224,8,35,64,47,55,181,150,225,137,205,175,76,242,146,164,28,157,146,164,38,41,7,153,69,171,147,99,22,216,186,115,246,213,231,105,77,178,115,70,207,53,215,47,216,79,159,210,105,142,91,160,237,77,219,206,125,254,66,125,237,235,36,255,153,236,15,208,233,150,250,61,253,199,25,26,221,244,216,210,41,151,38,245,123,251,139,156,213,199,172,197,178,208,123,145,146,250,149,249,182,53,157,178,163,59,115,213,125,23,234,11,0,56,242,8,208,203,204,240,248,200,171,82,202,203,14,222,114,166,166,214,57,3,242,94,245,150,249,182,148,90,167,250,19,104,179,96,219,50,181,192,65,102,29,114,230,77,130,243,54,171,245,27,165,239,203,65,237,27,3,190,246,138,77,167,215,169,242,206,220,197,33,182,169,101,222,135,174,172,92,49,208,76,237,153,234,43,240,208,159,43,29,0,184,107,9,208,203,200,185,219,71,30,222,52,121,233,172,213,77,146,207,212,90,255,173,116,202,129,217,55,106,214,36,121,212,244,98,167,44,112,137,186,148,121,199,186,215,82,102,95,155,238,206,211,52,181,150,146,190,198,181,89,232,152,185,223,188,219,250,117,202,253,102,92,80,46,157,175,79,255,216,52,249,211,82,238,20,158,191,89,147,143,148,228,99,41,217,189,183,142,124,87,41,249,133,69,29,47,73,119,161,247,106,182,226,62,1,0,96,38,1,122,25,233,53,249,153,50,115,64,194,39,203,84,239,233,115,13,133,88,59,62,242,227,253,185,179,54,205,114,187,82,122,220,154,241,75,30,54,215,147,1,247,171,181,148,137,205,51,110,156,236,166,249,74,146,172,25,127,227,189,75,45,231,245,111,43,37,191,184,237,156,11,94,63,123,56,202,208,196,101,207,74,109,246,7,232,154,42,244,2,0,119,27,65,99,25,41,41,15,157,181,230,213,115,133,231,115,183,143,60,188,38,79,232,95,87,75,105,102,183,91,106,221,210,189,211,195,81,250,157,59,62,242,140,36,15,236,91,117,99,231,246,129,107,147,164,211,28,253,144,244,253,126,214,212,175,108,91,179,254,117,115,141,229,46,181,121,193,140,229,44,191,247,2,0,56,124,8,208,203,203,204,225,19,53,39,204,110,112,222,150,45,221,166,151,139,51,235,179,91,112,8,199,82,169,249,141,161,237,151,61,99,174,77,67,163,155,79,109,74,249,251,25,205,107,182,110,93,183,174,151,36,157,110,119,198,235,43,41,247,218,184,113,227,157,126,95,135,38,46,123,86,146,243,239,194,170,1,0,22,100,8,199,178,82,63,157,228,236,253,139,165,94,120,238,216,166,207,62,234,227,215,254,191,141,27,55,54,67,163,151,61,100,170,51,245,215,73,126,120,246,158,11,223,68,184,100,186,165,105,222,190,118,124,243,223,215,82,47,185,117,229,212,199,142,185,189,115,122,41,221,243,74,234,47,39,51,190,32,220,209,237,230,111,167,23,110,31,152,250,252,209,123,58,187,147,28,181,111,213,177,215,60,246,123,254,98,205,248,230,191,152,24,188,96,231,139,46,186,104,197,215,30,116,252,249,181,54,119,122,116,119,205,178,124,47,0,128,195,132,43,208,203,72,47,189,55,102,239,77,131,211,30,221,148,242,214,107,30,119,70,111,120,124,164,150,78,243,249,36,207,89,162,242,190,93,157,154,250,162,212,188,247,94,119,12,124,171,83,58,159,40,169,191,151,153,225,57,53,245,55,46,63,103,253,103,166,151,223,254,236,231,221,156,100,75,95,147,99,82,202,203,186,169,147,195,227,35,245,198,147,238,189,187,214,250,150,36,199,207,62,96,57,232,156,127,0,0,223,62,1,122,25,153,24,124,254,103,107,202,31,45,170,113,205,66,143,237,62,164,212,148,141,99,131,27,238,116,37,121,96,197,192,175,38,185,97,17,93,236,78,234,109,119,125,101,0,0,119,38,64,47,129,78,119,254,33,6,99,107,206,255,163,164,188,176,164,124,126,206,6,53,123,74,242,231,181,59,243,49,216,165,46,183,153,39,234,107,83,154,115,146,124,117,129,70,59,75,45,27,198,6,47,248,195,185,54,110,125,246,186,27,7,202,192,15,214,90,71,146,236,154,167,143,79,214,166,62,41,41,159,219,127,228,131,204,194,209,107,55,220,197,112,16,0,96,6,99,160,239,25,111,73,201,251,167,23,202,238,230,186,121,91,150,82,71,247,62,206,251,226,193,177,75,31,213,41,229,209,53,157,211,74,169,71,215,228,19,165,183,231,157,219,214,254,212,215,135,70,47,123,72,186,205,159,236,223,175,211,189,102,250,199,102,207,212,55,50,176,98,255,182,90,235,100,230,81,155,230,211,165,211,217,223,182,36,255,62,127,105,189,15,214,210,223,182,190,247,192,214,93,95,79,57,112,204,210,228,221,219,6,159,247,47,47,186,232,162,83,190,118,210,241,207,170,181,62,54,157,253,227,153,83,154,124,233,254,95,189,229,205,111,120,241,139,247,204,251,94,36,217,186,102,221,87,146,108,56,103,251,246,159,29,104,110,249,209,82,242,61,53,57,177,164,222,214,107,58,239,126,220,199,63,251,161,141,27,55,54,107,199,70,94,91,59,217,251,232,239,166,124,125,102,47,117,91,74,249,175,253,75,233,125,46,243,184,169,123,199,109,247,154,26,232,127,63,22,250,2,0,0,112,232,153,156,156,172,147,147,147,174,18,2,119,57,231,23,0,230,178,204,254,217,31,0,0,150,55,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,5,1,26,0,0,90,16,160,1,0,160,133,129,165,46,128,197,91,59,113,233,15,213,166,251,228,146,230,227,221,221,43,174,218,186,110,93,239,174,236,127,104,124,228,127,151,146,227,167,151,31,112,253,45,127,248,134,23,191,120,207,93,121,12,0,128,67,157,0,125,23,91,59,190,105,99,45,101,206,247,181,214,178,39,105,190,217,41,157,111,148,166,249,122,231,168,21,31,222,250,236,117,55,46,174,223,145,63,173,53,191,157,82,83,83,210,59,106,106,44,201,240,93,89,123,73,126,37,53,171,166,151,191,116,234,49,127,150,228,136,8,208,11,125,110,251,244,106,173,55,164,116,191,84,166,118,253,219,232,218,159,250,250,61,86,28,0,176,172,8,208,119,177,154,242,91,169,89,57,215,182,146,186,247,191,181,166,150,146,102,207,84,29,30,31,121,127,146,209,94,110,255,187,137,193,23,222,50,127,191,89,59,99,185,100,240,69,23,93,180,226,238,188,66,124,194,77,71,151,187,171,239,229,102,161,207,109,90,73,73,106,147,116,87,100,104,124,228,35,181,150,95,29,31,186,224,189,247,84,141,0,192,242,96,12,244,210,42,73,158,156,228,85,221,28,243,137,181,19,151,125,255,2,109,191,58,107,249,27,134,87,44,157,146,60,190,83,234,213,67,227,155,126,105,169,107,1,0,238,89,2,244,242,113,106,173,205,191,14,143,111,218,48,215,198,146,242,170,36,117,255,138,90,94,113,79,21,198,188,74,73,249,155,225,137,145,167,45,117,33,0,192,61,199,16,142,187,215,237,163,131,235,143,157,94,120,209,69,23,173,184,254,65,199,156,60,80,6,78,74,47,79,77,201,249,73,30,211,215,126,32,201,27,134,70,55,191,127,108,248,130,47,245,119,180,109,240,130,137,53,227,151,60,162,211,12,156,220,237,228,27,151,15,93,240,177,123,232,53,28,129,234,109,163,131,27,238,213,191,230,156,237,219,143,237,78,221,252,136,78,55,207,172,181,188,44,201,253,247,109,42,169,249,173,36,239,186,199,203,4,0,150,132,0,125,15,218,55,228,226,139,251,254,124,48,201,43,134,38,54,93,88,154,242,134,148,172,216,219,170,28,91,58,245,77,73,206,156,189,255,196,224,243,63,155,228,179,247,92,197,76,219,126,206,57,183,37,249,104,146,143,14,109,191,236,35,165,105,222,177,127,99,205,153,27,55,110,236,108,220,184,177,89,178,2,1,128,123,140,0,125,183,170,245,96,45,198,214,108,120,211,218,241,205,55,214,212,43,250,86,63,117,120,98,228,105,163,107,214,239,191,170,185,118,226,178,239,175,105,246,223,72,216,105,234,7,46,31,218,240,182,185,250,60,243,170,171,6,238,119,203,245,15,235,149,124,79,233,229,225,73,153,42,201,206,82,234,127,94,62,184,254,19,139,173,254,166,19,238,184,83,253,195,227,35,79,79,201,83,251,215,149,90,255,121,219,224,134,247,204,110,123,206,246,237,199,118,235,173,79,77,237,157,90,106,121,64,45,245,198,148,238,151,86,220,209,121,239,214,117,235,190,181,208,177,251,167,212,43,77,174,219,54,180,254,162,36,89,51,126,201,195,6,234,192,15,164,211,156,90,155,206,77,41,245,115,119,172,184,207,123,222,254,236,103,239,90,236,235,58,184,178,224,205,147,99,103,63,247,202,225,137,205,183,39,57,102,111,243,172,248,228,15,60,242,65,73,38,231,220,161,214,50,52,246,143,167,167,155,51,82,123,103,36,101,101,73,253,74,109,242,153,177,225,13,31,159,239,56,231,142,111,126,124,83,234,208,244,114,167,212,55,95,126,206,134,107,159,245,182,75,143,95,57,53,240,35,165,214,7,213,212,19,75,234,23,71,7,55,92,182,102,124,228,196,110,201,75,246,191,138,38,95,218,54,180,254,239,231,235,127,120,124,211,134,148,242,136,233,229,169,76,189,113,251,154,23,124,113,161,215,14,0,8,208,119,179,133,131,216,180,109,131,23,188,117,104,108,211,155,74,41,23,238,223,179,150,159,76,223,176,128,38,189,199,149,90,94,62,189,220,75,249,219,36,119,10,208,107,199,70,94,92,111,190,254,79,154,228,126,101,239,164,31,73,106,106,246,14,160,30,30,31,185,178,54,245,127,47,20,220,230,51,60,49,242,212,52,121,107,50,125,181,60,73,114,117,119,215,138,63,154,81,195,229,151,158,92,7,58,175,72,115,203,218,36,199,36,101,223,255,246,206,98,49,181,178,185,99,120,124,100,180,54,229,119,102,15,85,217,255,250,251,166,212,107,74,62,182,118,226,210,107,82,187,151,212,212,135,214,82,147,90,146,178,55,223,31,189,231,155,183,15,143,111,122,243,9,199,239,126,217,155,206,250,233,59,218,190,174,214,74,169,25,31,185,41,211,1,58,73,110,207,77,119,106,87,107,25,154,24,249,197,50,177,249,183,210,201,234,189,35,216,167,127,37,74,74,39,25,30,31,249,90,77,94,253,216,143,125,238,149,179,175,96,55,201,227,83,179,255,51,175,77,231,163,67,227,155,126,188,236,41,175,74,154,99,14,244,86,254,41,201,101,43,146,19,155,190,246,41,249,64,146,121,3,116,210,57,63,181,158,61,189,180,34,221,119,102,239,191,142,0,0,11,112,19,225,221,107,209,211,192,213,116,46,158,185,92,135,83,235,188,251,119,202,157,195,249,218,137,205,207,175,37,255,95,146,251,45,112,168,167,151,78,121,215,208,232,230,83,15,86,83,255,52,118,131,99,151,62,42,53,87,28,24,106,146,164,228,163,183,30,61,245,156,173,235,214,237,222,95,195,216,230,225,58,208,249,116,146,13,233,15,152,51,29,157,228,130,210,169,159,24,218,62,50,52,79,155,190,195,228,161,181,118,222,85,83,31,58,79,147,99,146,242,115,55,221,178,242,125,47,186,232,162,21,243,180,105,97,225,127,57,88,51,126,201,67,147,156,212,183,106,114,174,43,234,195,227,155,95,95,246,126,209,89,189,64,119,247,47,201,159,94,243,184,51,46,61,104,85,165,190,172,164,188,46,243,191,175,223,145,58,199,239,20,0,112,103,2,244,50,49,62,120,254,251,146,122,91,223,170,147,134,198,46,123,240,98,247,127,206,21,155,190,43,181,190,126,145,205,191,171,116,234,216,98,251,94,51,126,201,67,59,165,243,206,36,199,237,95,89,242,233,221,157,250,244,127,126,230,11,110,157,94,53,188,237,178,71,212,82,55,207,104,183,176,123,151,38,35,251,2,233,130,237,178,152,208,88,243,3,55,158,120,252,198,69,30,123,1,243,7,201,53,227,155,87,117,75,247,178,153,205,243,166,217,237,134,198,71,158,151,146,23,183,56,232,5,107,199,55,157,117,144,54,79,105,209,31,0,112,55,49,132,99,185,40,165,102,108,228,63,83,242,196,233,85,157,110,239,164,36,115,14,113,152,109,69,47,231,215,164,127,230,136,47,36,245,247,123,41,255,82,106,115,191,110,167,115,102,173,121,85,246,94,253,77,146,199,12,95,113,217,247,141,158,125,254,127,46,212,239,154,241,145,19,187,201,85,73,30,208,183,250,75,189,154,179,222,122,246,134,255,153,209,184,219,123,115,82,250,31,70,242,173,212,188,34,157,92,221,171,183,95,51,144,149,143,110,210,249,209,146,252,118,246,134,226,36,57,166,155,238,197,73,126,116,17,47,115,103,82,254,184,211,169,239,238,77,237,186,161,91,142,122,82,83,202,223,36,121,200,129,38,245,231,206,219,178,229,247,191,163,199,156,215,12,12,79,140,252,159,89,235,142,74,202,25,73,253,177,212,3,95,16,74,202,23,187,119,116,255,239,236,46,74,242,202,89,171,174,174,37,127,187,34,3,31,78,146,94,166,206,174,53,191,147,190,171,211,117,239,240,139,171,22,81,225,174,212,250,190,148,92,155,82,190,94,154,242,31,45,94,29,0,240,29,18,160,151,145,90,242,63,253,151,62,107,202,137,139,223,187,60,100,198,98,45,175,25,29,90,191,105,223,210,87,147,124,106,120,108,243,119,167,212,223,220,191,71,175,55,156,164,63,64,207,28,186,112,175,28,215,237,229,93,169,57,185,111,237,142,50,80,207,156,120,206,134,25,15,118,25,26,221,124,102,82,159,208,183,170,169,77,61,115,108,120,195,71,251,214,189,63,201,251,135,70,55,189,179,116,202,191,246,173,127,202,218,241,75,127,100,219,224,243,222,191,192,11,188,189,116,235,83,182,157,189,254,11,125,235,222,118,222,219,182,124,184,183,103,234,139,251,191,60,148,220,119,234,232,169,39,39,185,122,129,190,22,86,178,162,127,236,241,1,119,26,217,241,165,210,169,207,222,186,110,221,140,241,207,231,142,143,60,186,201,129,71,162,39,185,113,96,215,192,51,250,135,186,36,121,221,121,219,183,140,247,154,169,207,30,168,189,156,121,222,150,45,247,221,186,110,221,55,230,43,173,38,31,233,76,245,214,108,59,247,249,215,183,124,85,0,192,93,196,16,142,187,215,65,103,225,232,87,146,153,143,242,174,229,62,139,221,183,147,122,251,172,67,159,119,238,248,230,199,247,175,233,149,169,127,72,201,159,76,255,169,201,39,23,234,115,106,106,234,29,169,121,68,223,170,27,123,233,157,181,237,57,27,190,124,167,218,59,245,167,103,174,200,155,103,133,231,253,198,134,55,252,91,146,183,204,168,182,116,46,156,171,109,159,215,108,59,123,195,23,102,175,220,250,236,117,55,54,181,110,157,177,178,150,71,204,110,119,247,168,55,78,245,154,59,253,29,106,82,102,188,239,181,214,43,103,133,231,36,201,214,115,214,77,214,90,251,191,52,116,123,43,119,47,84,123,77,83,206,19,158,1,96,105,185,2,125,247,106,117,83,86,77,238,211,191,67,83,51,239,149,200,57,188,43,201,239,246,29,249,135,155,212,127,29,30,27,249,72,45,249,64,73,249,143,166,246,62,52,58,184,254,119,231,239,226,78,245,62,186,239,231,155,107,83,159,49,49,252,252,207,207,179,239,147,251,23,106,175,108,154,167,221,180,75,147,188,160,111,249,71,22,106,92,74,179,109,254,141,157,235,102,124,87,41,245,65,7,57,246,193,52,73,62,48,115,85,29,72,202,105,73,250,254,85,160,60,161,83,202,135,214,140,95,242,132,125,115,116,39,73,70,7,47,184,56,201,197,201,190,33,48,37,103,13,143,141,188,60,157,156,154,166,126,119,74,233,31,207,125,198,204,195,116,231,175,189,230,67,243,205,90,2,0,220,115,4,232,101,164,28,120,186,93,146,100,160,148,69,95,105,220,54,184,225,170,217,83,225,37,233,164,228,137,37,121,98,82,211,41,157,12,143,143,92,83,82,126,127,219,224,5,19,173,106,171,245,220,209,133,167,190,251,238,254,133,111,222,231,164,5,135,80,12,236,26,248,224,212,202,169,3,43,102,14,19,185,147,169,218,253,202,252,181,229,171,153,249,205,227,222,243,181,93,164,93,163,131,235,231,188,97,239,220,137,145,239,109,106,94,151,3,99,182,239,221,77,119,75,106,125,108,74,233,123,212,122,45,195,19,155,95,153,228,37,73,57,58,37,123,51,254,193,38,186,232,204,127,179,100,41,229,83,237,94,6,0,112,119,48,132,99,153,56,243,170,171,6,146,25,195,37,178,39,217,217,166,143,177,193,245,255,171,36,127,158,100,161,185,144,31,83,83,199,135,39,54,253,117,155,190,107,233,252,210,124,211,234,93,120,213,63,28,157,190,47,99,37,185,245,221,103,157,53,53,87,219,105,251,166,125,235,175,243,222,251,222,131,57,221,113,244,158,59,207,179,124,224,128,51,111,24,236,15,178,223,150,249,167,177,187,124,205,250,79,14,236,26,120,78,146,235,250,86,63,122,120,98,243,143,247,183,27,30,31,121,85,146,223,200,129,155,54,23,165,169,243,31,187,73,189,101,190,109,0,192,61,71,128,94,38,238,243,205,27,158,156,164,127,6,139,175,78,12,94,208,42,64,167,148,186,109,112,253,111,14,12,12,156,86,82,255,79,146,247,101,190,48,93,203,47,15,143,143,252,212,226,59,175,131,67,19,155,95,61,215,150,189,15,47,57,48,5,95,77,238,117,222,150,45,71,45,212,219,190,176,220,31,46,111,95,40,116,247,207,73,125,208,74,191,227,223,235,133,47,19,111,93,183,238,91,41,153,49,68,165,36,251,3,244,185,219,71,30,158,82,94,58,107,183,38,201,167,106,173,111,234,31,135,158,100,198,12,26,115,205,239,125,247,169,247,154,177,212,43,30,69,14,0,139,96,8,199,221,170,46,58,144,148,78,243,220,254,33,200,37,101,235,2,205,23,180,245,57,235,110,72,242,123,201,222,160,122,223,91,38,31,159,90,158,94,83,46,76,114,122,95,211,95,77,242,230,249,250,169,181,142,148,82,214,31,168,41,47,93,59,54,242,153,233,199,106,207,168,63,157,157,253,15,58,217,179,98,207,163,146,204,121,19,97,146,156,112,211,13,79,156,53,226,250,78,55,8,46,103,53,245,243,165,239,5,212,190,89,55,122,77,126,166,204,28,79,254,201,50,213,123,250,92,55,255,173,29,31,249,241,254,75,206,181,105,190,237,0,93,187,245,91,233,205,168,105,161,7,234,36,201,162,231,25,7,0,14,112,5,250,110,181,184,171,137,131,99,151,62,50,41,47,234,95,215,52,185,124,177,71,25,218,126,217,51,134,199,71,106,223,159,119,79,111,123,247,89,103,77,109,91,243,188,15,109,27,220,240,199,3,187,6,158,48,107,215,51,102,45,207,24,62,176,235,168,250,243,169,249,224,140,6,37,175,29,30,31,249,137,217,53,212,212,153,83,208,149,252,202,66,53,151,78,243,203,51,155,151,247,44,212,254,30,118,208,207,173,52,157,254,47,34,169,53,55,31,216,185,204,122,48,76,121,245,92,225,249,220,237,35,15,175,201,140,207,164,150,111,255,42,240,84,239,142,27,103,174,169,167,108,220,184,113,206,191,227,131,99,151,62,42,51,191,76,1,0,139,36,64,47,177,193,177,145,115,246,61,229,239,192,103,81,243,238,177,225,11,222,61,255,94,51,245,210,252,251,172,85,63,180,55,148,207,244,173,227,142,187,53,201,129,233,212,106,186,243,5,172,36,233,117,155,222,192,238,129,179,83,211,63,109,93,55,169,151,159,59,49,242,189,253,109,107,83,46,233,95,46,165,60,127,120,124,211,249,115,245,59,52,177,233,194,82,203,115,51,115,135,191,159,175,142,37,112,144,71,121,143,156,152,50,115,218,190,82,102,60,204,164,59,171,183,19,102,247,113,222,150,45,221,166,151,139,51,235,239,224,119,50,132,99,98,240,133,183,100,198,131,119,202,177,159,120,236,25,255,107,174,99,119,74,231,53,223,238,113,0,224,72,39,64,223,131,94,116,209,69,43,206,153,120,203,105,195,219,71,126,120,120,108,228,183,134,199,71,62,222,41,153,72,114,82,95,179,155,7,58,3,45,198,38,39,219,207,89,255,181,164,246,135,232,149,157,210,121,215,240,196,165,103,79,7,228,243,182,111,89,125,244,158,155,46,73,178,127,108,114,45,249,207,141,27,55,246,95,241,156,17,222,78,184,233,232,178,117,221,186,111,116,186,249,137,146,220,218,215,236,216,166,230,29,107,47,191,100,255,148,107,99,67,231,191,107,246,213,234,212,242,150,181,19,35,191,48,125,115,224,179,222,246,182,149,195,227,35,191,90,106,121,227,172,151,112,229,182,53,231,207,254,18,176,172,156,121,213,85,3,107,198,47,121,216,240,248,230,159,237,238,29,183,220,63,221,220,29,187,187,205,63,30,88,172,159,158,177,115,169,23,158,59,182,233,217,211,159,197,208,232,101,15,153,90,57,53,158,146,31,158,125,156,133,110,34,92,140,146,242,246,254,229,90,242,154,181,19,35,47,29,26,221,124,106,178,247,177,236,123,86,78,253,191,44,238,201,143,0,192,28,140,129,190,123,29,51,60,62,178,63,16,221,152,100,160,102,223,116,102,115,182,255,106,109,234,115,182,14,175,155,119,202,182,249,52,181,243,210,78,169,87,229,192,213,207,19,83,59,219,175,121,220,25,25,30,31,201,84,51,215,253,121,245,239,22,211,247,229,231,172,255,204,185,99,155,214,213,82,174,232,171,124,117,237,118,255,249,156,237,219,127,112,251,57,231,220,150,82,234,192,196,150,243,167,234,212,53,73,246,62,0,166,100,69,173,121,237,119,221,124,253,107,135,199,71,146,61,223,156,171,251,235,6,118,13,204,121,165,122,9,205,248,220,146,36,55,95,159,189,111,237,28,249,182,214,215,244,63,214,188,151,222,27,187,233,254,90,14,124,65,125,116,83,202,91,167,63,139,189,247,19,222,61,154,166,121,99,233,148,159,203,129,207,105,101,173,249,203,210,169,127,185,247,216,243,43,221,239,44,188,3,192,145,194,21,232,229,227,63,6,58,3,63,48,223,211,251,14,102,124,232,130,247,38,121,225,226,247,40,91,87,236,90,241,134,197,182,190,124,104,195,219,74,234,31,204,236,34,223,55,208,220,252,79,211,211,219,109,93,179,238,43,181,169,103,37,89,236,252,213,255,213,233,212,31,91,232,209,213,135,128,171,255,231,132,85,191,221,191,98,98,240,249,159,173,41,127,180,168,189,219,61,44,231,160,198,134,55,124,52,37,127,188,200,230,95,61,120,19,0,96,54,1,122,105,213,236,157,106,238,215,6,118,13,60,105,235,57,235,38,23,187,227,92,255,212,63,58,184,254,205,157,90,127,34,11,7,216,169,212,252,193,232,154,243,159,187,117,221,186,222,2,237,114,199,49,199,204,184,84,186,109,112,195,31,231,78,179,131,148,103,13,111,31,249,171,233,165,177,225,13,31,239,237,125,148,245,150,36,187,230,238,185,222,150,228,205,233,237,249,193,203,207,217,112,237,66,53,76,187,233,132,59,22,125,117,180,124,135,195,32,22,233,230,212,252,246,99,62,246,185,167,205,53,253,222,216,154,243,255,40,41,47,44,41,115,63,185,177,102,79,73,254,188,118,103,126,233,41,181,206,251,119,114,177,175,107,116,205,250,63,72,173,63,149,100,199,60,77,118,215,228,55,83,203,95,44,166,63,0,96,38,67,56,238,98,37,245,21,181,148,57,223,215,90,203,158,164,249,102,167,116,190,81,154,230,235,157,163,86,124,120,235,179,215,221,56,87,219,217,58,233,126,172,150,230,79,166,151,187,181,126,96,174,118,151,15,109,120,199,139,46,186,232,193,95,63,241,184,167,53,157,242,164,244,221,208,86,146,175,214,169,169,127,28,93,251,130,255,78,214,223,105,223,154,252,117,41,57,126,122,249,150,227,142,219,61,187,205,9,199,223,241,130,155,110,89,249,233,204,184,81,174,100,237,229,151,60,104,122,166,137,125,243,87,63,119,205,248,27,239,61,144,99,127,52,165,62,184,54,185,127,73,190,90,82,191,116,239,19,118,95,189,119,238,232,249,205,174,229,212,47,221,126,167,90,166,117,146,143,52,123,231,84,158,174,231,125,11,245,61,151,133,62,183,57,138,187,118,96,215,192,230,173,235,214,237,30,157,183,195,82,71,247,62,206,251,226,193,177,75,31,213,41,229,209,53,157,211,74,169,71,215,228,19,165,183,231,157,219,214,254,212,215,135,70,47,182,152,101,136,0,0,21,114,73,68,65,84,123,72,186,7,62,215,116,186,215,220,21,175,107,116,104,195,91,146,188,101,237,196,101,223,95,107,243,168,154,114,106,41,117,69,173,185,185,244,166,222,52,182,246,5,255,189,118,226,210,39,212,116,246,247,95,123,229,203,11,116,9,0,28,46,38,39,39,235,228,228,164,177,155,192,93,206,249,5,128,185,24,194,1,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,130,0,13,0,0,45,8,208,0,0,208,194,225,16,160,155,36,169,181,30,14,175,5,88,38,250,206,41,205,146,22,2,192,178,115,56,132,206,219,147,228,83,159,250,212,177,75,93,8,112,248,232,59,167,220,190,164,133,0,176,236,28,14,1,250,155,73,114,194,9,39,220,103,169,11,1,14,31,125,231,148,111,46,105,33,0,44,59,135,67,128,254,239,36,105,154,230,164,165,46,4,56,124,244,157,83,254,123,73,11,1,96,217,57,28,2,244,117,73,50,48,48,240,221,75,93,8,112,248,232,59,167,92,183,164,133,0,176,236,28,242,1,186,214,250,95,251,126,60,99,73,11,1,14,55,103,36,51,206,49,0,144,228,48,8,208,165,148,79,238,251,241,251,150,180,16,224,112,243,125,201,140,115,12,0,36,57,60,2,244,199,147,164,214,250,248,165,174,5,56,124,76,159,83,166,207,49,0,48,173,44,117,1,119,133,201,201,201,111,37,185,215,81,71,29,181,250,1,15,120,192,206,165,174,7,56,180,221,120,227,141,171,118,239,222,61,153,228,214,213,171,87,31,183,212,245,0,176,188,28,242,87,160,147,164,214,122,117,146,236,218,181,235,199,150,186,22,224,208,55,125,46,153,62,183,0,64,191,195,34,64,39,185,50,73,74,41,207,90,234,66,128,67,95,223,185,228,202,37,45,4,128,101,233,176,8,208,71,29,117,212,21,251,126,28,172,181,14,44,105,49,192,33,109,223,57,100,48,153,113,110,1,128,253,14,139,0,253,192,7,62,240,243,73,222,151,228,216,29,59,118,156,191,212,245,0,135,174,125,231,144,99,147,188,111,223,185,5,0,102,56,44,2,244,62,155,147,164,211,233,188,96,169,11,1,14,93,125,231,144,205,75,90,8,0,203,214,97,19,160,75,41,111,74,114,91,146,167,95,127,253,245,79,88,234,122,128,67,207,190,115,199,211,147,220,182,239,156,2,0,119,114,216,4,232,85,171,86,221,86,107,189,40,73,122,189,222,75,150,186,30,224,208,51,125,238,168,181,94,180,106,213,170,219,150,186,30,0,150,167,195,98,30,232,105,55,220,112,195,105,189,94,239,11,251,22,127,96,245,234,213,255,190,164,5,1,135,140,201,201,201,239,79,242,209,36,233,118,187,167,159,116,210,73,95,92,226,146,0,88,166,14,155,43,208,73,178,239,255,240,254,38,73,106,173,47,95,226,114,128,67,72,223,57,227,111,132,103,0,22,114,88,5,232,36,217,181,107,215,159,38,185,181,148,178,118,231,206,157,231,46,117,61,192,242,183,115,231,206,115,75,41,107,147,220,186,239,28,2,0,243,58,236,2,244,233,167,159,254,213,90,235,239,39,73,173,245,21,215,94,123,237,202,165,174,9,88,190,174,189,246,218,149,181,214,87,36,73,173,245,247,79,63,253,244,175,46,117,77,0,176,36,38,39,39,175,158,156,156,172,59,119,238,124,253,82,215,2,44,95,59,119,238,124,253,228,228,100,157,156,156,244,216,110,0,22,229,176,187,2,221,231,101,73,82,107,253,185,235,175,191,254,194,165,46,6,88,126,174,191,254,250,11,107,173,63,183,111,241,101,75,90,12,0,135,140,195,54,64,239,155,129,227,37,73,210,52,205,197,59,118,236,248,161,37,46,9,88,70,118,236,216,241,67,77,211,92,188,111,241,37,102,237,1,96,177,14,219,0,157,36,171,87,175,126,77,173,245,13,217,59,93,223,166,201,201,201,83,150,186,38,96,233,237,59,23,108,74,82,106,173,111,88,189,122,245,107,150,186,38,0,14,29,135,213,60,208,243,153,156,156,124,71,146,103,212,90,63,220,235,245,158,249,224,7,63,248,127,150,186,38,96,105,124,249,203,95,254,174,110,183,251,142,82,202,19,146,252,243,234,213,171,159,185,212,53,1,112,104,57,172,175,64,79,219,189,123,247,115,147,124,164,148,242,132,129,129,129,43,118,236,216,113,191,165,174,9,184,231,237,216,177,227,126,3,3,3,87,236,11,207,31,217,119,110,0,128,86,142,136,0,125,218,105,167,125,179,105,154,161,36,215,36,121,82,41,229,202,235,174,187,238,161,75,93,23,112,207,185,238,186,235,30,90,74,185,50,201,147,146,92,211,52,205,208,105,167,157,246,205,165,174,11,128,67,207,17,17,160,147,228,148,83,78,153,220,179,103,207,179,146,124,40,201,227,74,41,87,223,112,195,13,79,91,234,186,128,187,223,13,55,220,240,180,82,202,213,73,30,151,228,67,123,246,236,121,214,41,167,156,50,185,212,117,1,112,104,58,34,198,64,247,219,185,115,231,177,181,214,205,73,214,36,73,41,229,165,171,86,173,250,235,37,46,11,184,155,236,220,185,243,87,106,173,127,181,111,113,162,148,114,193,170,85,171,110,91,210,162,0,56,164,29,113,1,122,218,206,157,59,95,85,107,253,213,36,169,181,110,77,242,171,39,159,124,242,142,37,46,11,184,139,236,216,177,227,228,36,175,46,165,156,151,36,165,148,87,175,90,181,234,215,150,184,44,0,14,3,71,108,128,78,146,157,59,119,62,175,214,250,218,36,199,39,185,37,201,239,152,206,10,14,125,147,147,147,191,148,228,79,147,220,59,201,205,165,148,95,92,181,106,213,165,75,92,22,0,135,137,35,58,64,39,201,23,190,240,133,7,31,125,244,209,127,81,107,253,201,36,169,181,126,184,214,250,138,83,78,57,101,219,82,215,6,180,115,221,117,215,173,45,165,252,214,190,89,54,82,74,249,167,59,238,184,227,215,79,63,253,244,47,47,117,109,0,28,62,142,248,0,61,109,114,114,242,130,36,127,144,228,97,251,86,125,160,148,242,186,85,171,86,109,90,194,178,128,69,216,185,115,231,134,90,235,47,100,239,12,27,73,242,217,36,127,184,122,245,234,205,75,88,22,0,135,41,1,122,150,157,59,119,190,172,214,250,107,73,86,239,91,181,35,123,159,88,182,197,163,126,97,249,152,156,156,252,254,36,235,146,108,72,114,242,244,234,82,202,171,86,173,90,245,151,75,87,25,0,135,59,1,122,30,59,118,236,248,249,82,202,207,102,239,180,87,211,62,147,228,159,75,41,239,222,181,107,215,7,79,59,237,180,27,150,168,60,56,226,124,241,139,95,60,105,229,202,149,63,92,107,61,51,201,51,146,60,188,111,243,199,106,173,127,119,242,201,39,191,126,137,202,3,224,8,34,64,31,196,117,215,93,247,212,82,202,115,75,41,195,73,78,154,181,249,203,165,148,79,213,90,255,171,105,154,29,157,78,231,191,75,41,55,55,77,179,43,73,93,130,114,225,80,87,58,157,206,202,90,235,241,77,211,60,176,211,233,156,92,74,121,72,173,245,145,73,30,60,171,237,13,181,214,209,90,235,63,158,114,202,41,87,47,69,177,0,28,153,4,232,22,118,238,220,249,148,94,175,247,99,157,78,231,201,165,148,39,214,90,239,189,212,53,193,145,162,148,114,75,173,245,223,154,166,121,95,183,219,125,231,170,85,171,222,187,212,53,1,112,100,18,160,191,3,147,147,147,15,75,242,240,82,202,105,181,214,213,73,238,95,107,61,190,148,114,84,41,197,123,11,45,213,189,118,151,82,110,78,242,181,82,202,100,173,245,139,73,62,179,122,245,234,207,46,117,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,255,183,7,7,36,0,0,0,0,130,254,191,238,71,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,1,82,41,29,229,137,101,117,118,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":30840,"duration_micros":1640,"top":-43.05882263183594,"left":390.0,"width":289.513671875,"height":331.76470947265625,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,119,156,84,213,253,255,241,247,153,45,192,210,165,8,187,44,189,175,116,68,65,141,216,176,2,130,198,174,209,4,77,80,147,88,82,140,223,68,211,212,228,23,75,98,140,198,22,99,67,99,163,104,44,168,193,130,168,136,32,32,189,187,59,11,44,72,103,97,203,204,249,253,113,103,96,102,152,221,157,129,153,189,51,179,175,231,227,177,143,221,123,239,153,123,63,115,225,113,231,189,103,207,61,215,8,0,128,16,94,175,215,74,82,65,65,129,113,187,22,32,153,38,78,159,114,171,149,238,117,187,142,35,97,164,159,189,54,254,178,251,220,174,35,86,153,114,125,241,184,93,0,0,0,64,125,155,56,227,249,219,211,61,60,75,146,149,238,157,56,227,249,219,221,174,163,161,33,64,3,0,128,6,101,194,244,41,183,88,107,238,114,187,142,68,177,214,220,53,97,250,148,91,220,174,163,33,33,64,3,0,128,6,227,252,169,207,95,41,41,109,134,60,196,225,190,192,123,67,61,32,64,3,0,128,6,97,194,235,83,70,26,143,121,198,237,58,146,197,120,204,51,19,94,159,50,210,237,58,26,2,2,52,0,0,200,120,163,159,122,170,177,252,246,9,183,235,72,58,191,125,98,244,83,79,53,118,187,140,76,71,128,6,0,0,25,175,117,155,70,127,151,76,127,183,235,72,62,211,223,121,175,72,38,2,52,0,0,200,104,19,167,189,112,161,172,38,185,93,71,189,177,154,52,113,218,11,23,186,93,70,38,35,64,3,0,128,140,230,55,254,123,220,174,161,190,53,196,247,92,159,8,208,0,0,32,99,77,152,54,229,14,35,211,211,237,58,234,155,145,233,57,97,218,148,59,220,174,35,83,17,160,1,0,64,70,26,251,250,148,182,50,186,205,237,58,92,99,116,219,216,215,167,180,117,187,140,76,68,128,6,0,0,25,41,219,234,38,73,77,220,174,195,69,77,2,231,0,9,70,128,6,0,0,25,231,186,71,31,205,145,213,245,110,215,17,77,215,22,173,116,76,219,246,234,209,234,168,228,31,204,234,250,235,30,125,52,39,249,7,106,88,178,221,46,0,0,0,32,209,182,30,221,252,251,146,90,187,93,71,168,209,133,221,116,102,215,158,234,211,250,224,168,138,53,59,182,233,221,13,107,52,115,195,234,100,29,182,117,224,92,60,154,172,3,52,68,4,104,0,0,144,113,172,209,21,110,215,16,234,194,222,69,186,172,239,192,67,214,247,104,117,148,122,180,58,74,237,242,242,244,252,178,69,73,57,118,224,92,16,160,19,136,0,13,0,0,50,202,184,233,207,246,145,116,162,219,117,4,93,220,103,128,46,238,115,140,36,105,238,166,18,77,91,189,92,235,119,110,87,151,22,173,52,174,71,95,141,204,47,212,5,189,138,84,233,243,233,229,149,75,146,81,194,137,227,166,63,219,103,198,248,43,87,36,99,231,13,17,99,160,1,0,64,70,201,178,158,177,110,215,16,116,121,191,65,7,194,243,27,107,87,232,79,115,63,214,242,109,91,180,223,87,173,21,219,183,234,47,243,102,107,198,154,229,146,164,75,251,14,212,152,174,201,153,113,47,149,206,73,38,32,64,3,0,128,204,98,204,24,183,75,144,164,239,21,13,209,5,189,14,62,61,220,99,76,212,118,255,94,178,64,239,110,88,35,73,250,126,209,80,181,107,210,52,241,197,164,200,57,201,20,4,104,0,0,144,49,190,251,210,75,89,70,26,237,118,29,87,244,27,164,241,61,250,74,146,22,109,217,36,73,58,167,91,111,93,55,112,120,212,246,255,92,56,87,43,183,111,85,110,86,150,46,233,59,32,225,245,24,105,244,119,95,122,41,43,225,59,110,160,8,208,0,0,32,99,84,230,250,142,179,146,171,211,182,93,93,52,68,19,3,61,207,47,175,252,90,191,253,116,150,158,91,182,80,146,116,86,215,94,186,110,224,112,69,246,69,91,73,211,3,67,57,146,49,189,157,149,114,42,115,125,199,37,124,199,13,20,1,26,0,0,100,12,143,52,196,205,227,95,83,52,84,227,2,61,207,207,47,91,168,23,150,47,150,36,189,182,106,169,254,189,100,129,36,39,68,79,30,52,226,144,16,93,94,85,37,73,106,145,219,40,41,181,185,125,110,50,9,1,26,0,0,100,12,43,219,191,238,86,201,241,253,99,134,106,108,143,62,146,156,240,252,234,170,165,97,219,103,172,89,174,167,150,204,151,36,157,222,165,135,174,31,124,92,88,136,30,218,62,95,146,180,97,215,142,164,212,231,230,185,201,52,76,99,7,0,0,50,134,199,168,135,117,225,184,215,14,24,174,179,187,245,146,36,61,187,116,161,166,174,94,26,181,221,235,107,86,200,90,39,108,159,214,185,187,178,140,209,223,23,124,166,239,116,234,122,32,124,127,92,178,33,41,53,122,140,122,36,101,199,13,16,1,26,0,0,100,12,191,181,133,166,134,217,46,146,101,210,128,97,49,133,231,160,55,214,174,144,223,90,77,26,48,76,163,11,187,169,109,147,166,58,166,109,123,73,210,135,37,235,245,191,226,181,73,169,211,111,109,97,82,118,220,0,17,160,1,0,64,198,48,198,180,171,207,227,77,30,52,66,103,116,113,58,118,159,94,178,224,192,141,128,117,121,115,221,74,85,249,125,154,60,104,196,129,240,252,249,198,18,61,180,224,179,164,213,90,223,231,38,147,17,160,1,0,64,38,105,81,31,7,49,146,126,20,18,158,159,88,252,165,222,92,183,242,176,247,247,249,198,18,253,101,222,108,249,109,82,7,160,212,203,185,105,8,8,208,0,0,32,147,228,38,251,0,70,210,143,135,28,175,209,133,221,36,29,94,120,62,163,75,15,77,30,52,66,146,52,219,187,65,127,157,255,105,178,195,179,84,15,231,166,161,32,64,3,0,0,196,40,17,225,249,156,110,189,53,105,192,48,73,78,120,126,224,203,57,114,227,198,71,28,62,166,177,3,0,0,153,100,127,178,118,156,232,240,252,65,241,186,250,14,207,73,59,55,13,13,61,208,0,0,32,99,24,99,118,90,107,155,36,124,191,146,110,30,54,74,39,22,116,145,36,61,178,112,174,222,221,176,38,174,125,140,239,209,87,223,43,114,158,101,242,65,241,58,253,125,193,103,245,218,243,108,140,217,89,143,135,203,104,244,64,3,0,128,140,97,253,254,45,201,216,239,181,3,135,31,8,207,143,45,154,23,119,120,190,160,87,255,3,225,121,230,134,213,245,30,158,165,228,157,155,134,136,0,13,0,0,50,134,149,41,78,244,62,135,180,239,168,179,186,58,243,60,63,182,104,158,222,94,191,42,174,215,127,183,247,49,186,188,223,32,73,210,219,235,87,233,209,133,95,184,50,230,57,25,231,166,161,98,8,7,0,0,200,24,70,118,181,148,216,7,169,156,218,185,187,36,231,33,39,241,134,231,75,251,14,212,119,123,23,73,146,222,90,183,74,143,47,158,151,208,218,226,225,156,27,36,2,1,26,0,0,100,12,235,209,18,147,224,238,221,78,205,156,233,147,23,111,221,28,215,235,174,232,55,72,19,123,245,151,228,60,125,240,95,95,207,79,108,97,113,178,30,45,113,181,128,12,66,128,6,0,0,25,35,203,122,230,251,19,60,64,162,81,150,19,151,246,87,87,199,252,154,239,21,13,209,248,30,125,37,57,79,29,116,59,60,75,206,185,113,187,134,76,193,24,104,0,0,144,49,94,29,127,233,60,73,123,18,185,207,28,143,19,151,170,252,190,152,218,79,26,48,236,64,120,158,190,102,185,158,88,252,101,34,203,57,92,123,2,231,6,9,64,128,6,0,0,25,197,24,205,74,228,254,114,178,178,36,73,213,126,127,157,109,39,13,24,166,115,186,245,150,228,132,231,167,151,44,72,100,41,135,45,209,231,164,161,35,64,3,0,128,140,98,253,230,157,68,238,47,251,64,15,116,237,1,122,242,160,17,41,25,158,165,196,159,147,134,142,49,208,0,0,32,163,248,165,25,30,233,161,68,237,47,219,56,1,186,58,202,16,14,99,140,250,180,110,163,139,251,12,208,160,118,29,36,73,47,44,95,172,151,87,126,157,168,195,39,132,95,154,225,118,13,153,132,0,13,0,0,50,202,244,243,47,45,158,56,125,202,59,86,58,51,17,251,203,13,12,225,184,251,196,51,234,108,251,236,210,133,154,186,122,105,216,186,51,187,246,212,117,3,134,203,152,216,167,215,91,250,109,153,126,253,201,251,241,21,90,3,35,189,51,253,252,75,153,3,58,129,8,208,0,0,32,227,248,165,231,76,130,2,116,241,238,157,42,108,222,178,198,237,214,90,45,219,182,69,207,45,91,168,229,219,182,30,178,189,81,86,118,92,225,89,146,154,230,228,198,93,103,77,252,210,115,9,219,25,36,37,122,166,113,0,64,218,243,122,189,86,146,10,10,10,248,140,64,90,155,48,125,202,55,146,10,221,174,195,101,197,83,199,95,214,217,237,34,130,50,229,250,194,77,132,0,0,32,51,25,243,15,183,75,112,29,231,32,41,8,208,0,0,32,35,101,239,207,122,64,214,150,185,93,135,107,172,45,203,222,159,245,128,219,101,100,34,2,52,0,0,200,72,47,95,116,81,165,53,186,219,237,58,220,98,141,238,126,249,162,139,42,221,174,35,19,17,160,1,0,64,198,154,54,254,242,191,89,169,193,61,129,207,74,243,166,141,191,252,111,110,215,145,169,8,208,0,0,32,163,121,172,253,149,219,53,212,183,134,248,158,235,19,1,26,0,0,100,180,215,206,191,252,61,73,127,113,187,142,122,244,151,192,123,70,146,16,160,1,0,64,198,155,58,254,178,95,72,154,237,118,29,245,96,118,224,189,34,137,8,208,0,0,160,65,240,201,55,73,86,219,220,174,35,105,172,182,249,228,155,228,118,25,13,1,79,34,4,0,0,181,154,183,102,91,203,170,93,59,91,155,236,236,22,126,249,154,101,123,76,19,91,105,27,219,44,79,182,245,251,179,36,201,120,60,62,227,243,87,155,92,179,191,218,111,247,121,148,181,199,86,87,239,202,105,209,114,251,240,30,71,237,116,251,61,72,210,140,241,87,174,56,127,198,139,87,24,235,127,211,237,90,146,193,122,60,87,204,24,119,217,10,183,235,104,8,210,250,41,48,0,128,196,203,148,39,133,225,240,205,91,186,190,99,117,181,201,55,198,118,176,214,182,151,60,57,71,182,71,127,149,49,166,204,90,179,41,59,219,150,14,239,223,117,99,98,42,61,60,19,166,61,127,149,140,121,218,205,26,18,206,218,239,77,61,255,242,103,220,46,163,46,153,114,125,73,235,226,1,0,137,151,41,31,112,136,207,188,37,165,157,171,42,43,186,203,163,46,198,120,26,37,243,88,214,250,43,228,215,134,156,220,70,107,135,23,229,127,147,204,99,213,100,194,244,231,174,149,60,143,185,113,236,196,243,95,55,117,252,21,143,187,93,69,44,50,229,250,146,214,197,3,0,18,47,83,62,224,80,183,37,75,202,154,237,241,239,239,43,107,122,91,249,155,185,81,131,145,103,143,140,93,217,204,211,120,121,81,81,251,61,245,121,236,137,51,94,184,210,90,155,242,189,182,181,49,198,92,245,218,184,75,159,117,187,142,88,101,202,245,37,173,139,7,0,36,94,166,124,192,161,102,139,22,109,104,189,95,102,128,95,182,175,219,181,132,242,200,44,111,44,187,120,224,192,46,219,235,235,152,19,166,79,57,75,210,179,146,218,214,215,49,19,100,171,164,43,167,142,191,236,109,183,11,137,71,166,92,95,210,186,120,0,64,226,101,202,7,28,14,245,206,194,133,77,91,102,183,26,34,159,250,187,93,75,173,178,180,116,103,245,142,5,103,14,26,180,183,62,14,55,110,250,75,61,179,84,253,132,164,147,235,227,120,9,240,161,79,217,147,102,140,191,104,181,219,133,196,43,83,174,47,105,93,60,0,32,241,50,229,3,14,225,62,159,191,118,144,178,60,195,173,49,89,110,215,18,11,99,173,79,62,255,188,227,134,118,95,88,95,199,156,56,125,202,221,86,74,233,39,248,25,233,158,215,198,95,118,187,219,117,28,174,76,185,190,164,117,241,0,128,196,203,148,15,56,56,62,154,191,177,93,78,86,213,72,99,108,7,183,107,57,28,214,154,77,85,190,156,79,191,51,180,227,150,250,56,222,132,25,83,78,150,95,247,200,104,100,125,28,47,102,86,159,202,163,95,77,29,119,217,135,110,151,114,36,50,229,250,146,214,197,3,0,18,47,83,62,224,32,205,89,84,60,192,35,127,106,5,193,195,228,151,231,211,81,3,11,23,215,215,241,206,159,254,226,100,35,255,175,36,21,214,215,49,107,80,108,229,185,103,218,248,75,30,113,185,142,132,200,148,235,75,90,23,15,0,72,188,76,249,128,107,200,172,181,230,243,133,27,70,203,99,122,185,93,75,66,249,237,170,227,6,117,249,192,24,99,235,235,144,19,103,76,185,201,111,237,13,70,166,103,125,29,83,146,172,236,106,143,49,255,120,109,220,101,127,173,207,227,38,91,166,92,95,210,186,120,0,64,226,101,202,7,92,67,53,123,249,242,230,217,149,121,167,74,246,104,183,107,73,14,179,185,58,183,252,127,39,246,237,187,187,62,143,122,254,140,41,23,24,107,175,148,204,248,228,30,201,78,183,198,60,59,109,220,101,175,38,247,56,238,200,148,235,75,90,23,15,0,72,188,76,249,128,107,136,62,154,191,170,93,163,220,70,167,91,191,109,238,118,45,201,100,60,102,119,69,101,197,123,223,25,218,171,94,198,69,135,26,251,250,148,182,217,62,141,181,30,123,166,177,102,180,164,35,253,69,101,179,53,246,3,227,55,239,84,103,233,245,215,199,94,182,53,17,117,166,170,76,185,190,164,117,241,0,128,196,203,148,15,184,134,230,179,197,155,143,182,254,242,179,146,253,20,193,84,97,173,191,194,120,242,222,62,126,192,209,155,221,172,227,130,215,167,244,181,62,255,80,235,241,244,183,126,219,211,24,79,39,201,182,151,212,66,82,240,223,162,66,210,46,201,148,89,235,47,49,30,179,218,248,253,75,77,150,103,254,171,99,47,91,238,94,245,245,47,83,174,47,105,93,60,0,32,241,50,229,3,174,33,153,191,106,99,187,170,242,202,115,172,81,131,8,207,65,198,170,34,39,47,247,205,161,189,234,103,134,14,28,185,76,185,190,120,220,46,0,0,0,28,190,121,243,214,180,172,216,87,49,166,161,133,103,73,178,70,141,42,246,85,140,153,55,111,77,75,183,107,65,195,66,128,6,0,32,77,205,154,53,43,187,42,59,235,52,35,211,212,237,90,220,98,100,154,86,101,103,157,54,107,214,172,108,183,107,65,195,65,128,6,0,32,77,53,110,211,125,180,241,152,182,110,215,225,54,227,49,109,27,183,233,62,218,237,58,208,112,16,160,1,0,72,67,95,44,89,63,196,72,221,221,174,35,85,24,169,251,23,75,214,15,113,187,14,52,12,4,104,0,0,210,204,236,249,223,228,251,124,230,88,183,235,72,53,62,159,57,118,246,252,111,242,221,174,3,153,143,0,13,0,64,154,201,206,53,25,241,120,238,100,224,220,160,62,16,160,1,0,72,35,115,191,254,230,88,249,253,109,220,174,35,101,249,253,109,230,126,253,13,189,243,72,42,2,52,0,0,105,98,206,146,226,163,252,126,203,56,223,58,248,253,118,200,156,37,197,71,185,93,7,50,23,1,26,0,128,52,145,227,243,15,117,187,134,116,193,185,66,50,17,160,1,0,72,3,179,231,127,147,239,99,214,141,152,249,164,238,220,80,136,100,33,64,3,0,144,6,60,89,190,129,110,215,144,110,56,103,72,22,2,52,0,0,41,238,147,133,155,218,123,140,167,179,219,117,164,27,143,241,116,254,100,225,166,246,110,215,129,204,67,128,6,0,32,197,25,179,175,159,219,53,164,43,206,29,146,129,0,13,0,64,10,123,243,205,85,141,60,242,244,113,187,142,116,229,145,167,207,155,111,174,106,228,118,29,200,44,4,104,0,0,82,216,81,93,114,123,184,93,67,186,227,28,34,209,8,208,0,0,164,48,227,103,230,141,35,197,57,68,162,101,187,93,0,0,0,136,110,94,105,105,94,245,214,170,195,154,138,109,219,150,45,141,190,156,255,105,199,50,239,198,86,123,203,247,52,110,219,166,253,206,194,174,221,182,13,59,110,84,153,199,227,177,241,238,175,186,170,202,44,93,178,248,168,117,107,86,180,45,219,188,169,213,209,29,242,183,247,234,213,127,75,159,162,162,29,241,236,175,186,170,202,44,94,56,191,237,250,181,107,218,108,221,186,185,101,126,126,193,182,238,61,250,109,173,107,63,207,60,249,240,208,61,187,119,229,5,151,79,63,115,236,215,189,251,21,237,136,229,152,214,42,127,94,105,105,222,240,252,252,242,88,235,4,106,67,128,6,0,32,69,217,45,251,11,101,178,226,122,205,154,213,43,91,60,250,215,63,79,92,183,118,245,8,107,237,33,47,206,107,218,188,108,196,9,39,204,188,238,134,91,63,201,205,109,228,175,107,127,95,207,159,223,230,173,255,190,50,124,225,252,249,167,236,223,95,222,58,114,123,147,166,77,183,14,25,54,98,214,121,231,95,48,175,119,191,129,181,6,218,183,95,159,218,253,229,41,79,93,182,115,199,142,194,200,109,109,218,181,91,125,205,143,110,122,246,248,81,39,109,138,220,246,238,59,51,186,206,120,229,197,31,30,104,219,182,253,170,235,110,184,245,147,186,106,15,101,183,236,47,148,180,34,158,215,0,53,33,64,3,0,144,162,252,242,20,196,211,254,243,143,63,234,248,143,191,221,115,67,249,222,189,237,106,106,83,190,119,119,251,15,102,190,125,197,234,101,203,138,238,254,235,63,159,200,203,107,90,93,83,219,135,30,184,251,164,15,102,190,125,69,109,199,220,183,119,111,219,57,31,205,250,238,156,143,102,125,119,220,133,151,60,122,213,15,174,159,31,173,221,130,121,159,183,251,247,99,127,255,73,117,117,117,147,104,219,191,221,178,165,231,195,247,255,233,134,46,157,187,222,211,177,83,225,129,158,226,234,170,42,243,202,115,207,92,24,218,246,226,43,175,121,57,59,39,39,174,94,244,192,185,36,64,35,33,24,3,13,0,64,170,50,234,16,107,211,146,226,13,77,31,121,232,255,253,176,182,240,28,209,126,200,131,127,254,253,152,154,182,223,117,199,207,198,214,21,158,35,205,120,229,197,31,254,253,47,119,157,28,109,219,139,207,60,121,86,104,120,110,220,56,111,123,126,167,194,175,114,114,26,237,13,174,43,223,187,187,253,211,79,62,28,246,250,41,207,60,49,248,219,173,101,189,130,203,189,250,245,255,240,212,49,231,110,136,167,46,73,113,157,75,160,46,244,64,3,0,144,130,150,44,41,107,182,219,183,175,89,172,237,95,120,234,209,19,247,236,218,213,49,184,156,215,180,233,150,49,103,143,123,117,208,224,97,197,93,122,246,217,57,239,243,217,249,179,63,120,127,200,162,5,243,206,14,182,153,55,247,211,241,235,86,172,156,221,173,79,239,93,161,251,122,233,249,167,142,89,240,197,220,243,66,215,181,108,213,170,248,228,211,207,254,239,177,199,143,90,223,165,91,207,221,171,87,174,104,249,217,236,89,189,62,158,245,238,248,125,229,229,71,5,219,125,248,191,119,46,43,26,48,120,253,169,103,29,12,185,37,197,27,154,174,93,189,98,100,112,185,79,209,49,179,238,188,251,129,151,114,115,27,249,119,236,216,154,123,251,205,55,76,46,219,180,177,191,36,45,93,252,213,9,126,191,255,109,143,199,99,119,236,216,154,251,222,91,111,76,12,190,46,43,43,187,242,154,107,127,252,102,172,231,36,148,149,105,182,100,73,89,179,162,162,246,123,14,231,245,64,40,122,160,1,0,72,65,187,42,247,182,141,181,109,101,101,133,103,241,162,133,39,6,151,141,49,190,201,63,253,249,195,87,252,96,242,130,1,195,70,108,109,209,178,101,213,169,99,206,221,112,199,221,247,79,235,218,163,215,103,161,175,125,251,173,169,3,194,142,187,115,103,206,91,211,167,94,16,186,46,191,83,225,87,127,121,240,201,191,92,245,131,201,11,250,21,13,218,158,151,215,180,122,224,224,161,223,94,119,227,173,159,253,246,207,15,222,211,178,213,81,97,61,194,175,188,248,244,196,202,202,138,3,25,99,245,138,229,71,133,142,199,30,115,238,249,179,131,227,175,91,181,106,91,57,226,184,19,15,140,103,46,223,187,183,221,230,82,111,19,73,122,234,209,135,78,44,223,187,251,192,147,4,143,27,121,210,244,88,111,28,140,38,158,115,10,212,134,0,13,0,64,10,178,198,28,114,195,94,77,22,124,254,249,209,161,65,179,111,209,128,15,70,158,116,106,105,180,182,67,143,61,254,203,208,229,173,91,54,135,133,202,23,159,125,98,216,238,221,59,14,204,252,209,172,121,243,205,119,220,253,215,127,29,213,174,93,69,180,253,245,232,217,123,215,205,63,191,227,81,99,140,47,184,174,108,243,166,190,175,191,242,159,190,193,101,147,101,194,198,43,91,159,53,97,203,30,115,200,120,230,117,43,86,182,248,124,246,71,227,130,203,121,77,155,151,77,186,241,150,15,163,213,16,171,120,206,41,80,27,2,52,0,0,41,40,219,147,213,34,214,182,37,197,235,195,130,97,97,151,110,223,212,212,182,87,239,162,205,161,203,187,247,236,110,25,186,188,116,209,87,131,67,151,191,115,202,153,175,183,173,33,60,7,29,51,116,232,183,131,135,29,23,54,180,98,225,87,95,20,5,127,238,221,171,223,182,208,128,253,238,219,211,79,8,237,161,94,246,245,194,3,109,243,154,54,47,235,216,169,176,252,95,79,60,24,54,102,250,244,179,207,123,173,69,203,150,85,181,213,81,151,120,206,41,80,27,198,64,3,0,144,130,170,253,254,230,158,24,187,185,26,231,53,174,10,29,154,209,169,160,243,214,26,247,91,189,63,108,106,187,156,156,156,202,224,207,37,197,27,154,150,20,111,24,18,92,206,202,202,174,60,255,194,75,23,197,82,195,153,99,207,159,187,96,222,103,99,131,203,107,86,174,56,182,178,178,226,213,220,220,70,254,142,157,10,203,187,245,234,253,217,218,149,43,78,144,164,21,75,190,62,101,242,213,23,119,239,213,167,223,130,229,75,22,141,220,179,123,247,209,193,215,13,24,56,104,246,135,179,102,118,90,246,245,162,211,130,235,218,119,232,184,244,178,171,38,125,21,75,29,181,169,246,251,155,31,233,62,0,137,0,13,0,64,74,50,82,94,221,173,28,231,158,127,209,170,115,207,191,104,85,44,109,215,173,94,29,54,75,71,155,214,237,14,132,237,197,11,190,12,155,169,162,176,115,151,5,53,13,221,136,52,124,196,168,178,102,45,90,108,12,222,200,88,81,177,191,229,138,197,11,143,26,48,108,196,86,73,186,232,242,107,222,190,247,15,191,30,86,93,93,221,88,146,118,110,223,214,101,222,103,159,116,9,221,71,94,211,166,91,46,184,124,210,156,123,255,248,171,239,135,174,191,244,170,107,95,141,119,218,186,104,226,57,167,64,109,24,194,1,0,64,10,50,89,106,148,140,253,126,58,231,163,19,66,151,143,25,50,108,77,240,231,237,223,110,13,155,245,163,99,126,65,73,60,251,238,112,116,193,234,208,229,77,91,55,29,216,223,240,17,163,202,190,119,237,141,15,54,111,209,124,99,180,215,182,105,215,110,245,228,159,254,252,225,207,102,191,223,45,56,35,135,36,245,234,215,255,131,147,78,57,61,174,58,106,146,172,115,138,134,135,30,104,0,0,82,146,201,145,142,184,211,53,204,91,51,94,235,177,177,228,155,65,193,229,230,45,154,111,60,113,244,105,197,193,229,109,59,182,134,141,17,110,214,188,101,92,83,190,53,109,222,124,119,232,242,246,173,223,134,5,242,179,199,77,92,115,242,233,103,254,241,141,169,47,245,93,187,114,101,231,93,59,183,183,110,211,182,237,150,254,3,135,174,57,237,172,115,215,85,87,87,123,30,125,232,254,235,130,237,3,211,214,189,21,79,13,181,51,57,137,219,23,26,50,2,52,0,0,41,200,99,109,86,157,207,217,142,67,121,249,222,236,169,47,61,23,246,68,191,227,71,141,158,25,250,36,194,125,123,202,195,158,18,216,164,89,179,125,241,28,163,105,179,102,97,129,123,207,174,221,135,60,117,48,47,175,105,245,69,151,95,243,181,164,175,35,183,61,250,183,123,79,10,157,203,250,184,19,78,154,222,179,79,191,157,31,207,122,175,211,252,47,230,244,42,219,180,169,67,227,188,188,189,93,186,117,47,57,123,236,5,75,219,181,63,122,127,60,245,121,162,60,218,28,56,28,4,104,0,0,82,144,95,50,117,183,138,77,101,101,133,231,247,183,221,114,201,182,111,183,118,15,174,235,208,177,224,235,43,175,189,126,110,104,187,38,205,242,194,2,115,121,249,222,198,241,28,103,95,121,120,0,111,156,215,36,166,241,211,146,51,109,221,156,143,63,24,31,92,206,107,218,188,236,210,43,39,205,185,253,150,201,151,175,94,177,236,164,208,182,11,191,156,171,119,94,159,182,243,123,215,221,248,200,152,115,198,173,139,245,24,137,60,167,104,216,24,3,13,0,64,10,178,214,38,164,3,218,239,247,155,187,239,248,197,132,213,171,14,134,208,188,166,205,203,110,253,229,239,158,14,237,125,150,164,22,45,90,135,245,32,151,239,217,19,215,77,119,229,123,247,132,13,217,104,221,186,205,222,154,218,70,122,250,95,143,156,94,85,85,209,52,184,60,230,236,243,94,123,240,254,187,206,143,12,207,65,21,21,251,91,254,235,145,191,222,180,248,203,185,49,63,28,37,81,231,20,32,64,3,0,144,138,140,173,174,187,81,237,252,126,191,185,235,55,191,24,247,245,194,5,99,14,236,214,24,223,149,215,254,240,201,200,199,119,75,82,171,214,71,133,5,222,178,141,27,59,70,182,169,205,166,141,165,221,67,151,91,183,109,23,83,128,254,252,227,15,58,126,189,232,203,51,131,203,237,59,116,92,218,162,117,235,189,171,150,45,61,57,184,46,59,39,167,124,208,208,225,111,182,105,219,254,192,108,35,213,213,213,141,159,124,236,161,11,34,247,87,163,4,156,83,64,34,64,3,0,144,146,60,86,49,15,127,168,201,61,119,222,118,238,194,249,115,207,9,93,55,254,130,75,30,63,227,204,113,235,163,181,31,80,52,100,83,232,242,134,245,107,135,238,223,191,47,166,113,195,43,151,45,105,181,115,199,182,3,211,210,101,231,228,148,15,28,60,180,198,249,168,67,61,247,204,19,19,66,151,47,189,234,218,87,63,159,243,209,208,224,114,94,211,230,101,119,221,255,200,157,191,185,235,254,233,143,60,253,210,125,195,71,156,48,61,184,173,228,155,245,67,151,45,94,28,211,19,6,19,113,78,1,137,0,13,0,64,106,50,138,235,6,190,72,247,253,241,215,99,66,31,108,34,73,167,158,121,206,179,87,252,96,242,130,154,94,211,173,79,239,93,249,157,10,23,6,151,171,170,42,154,206,124,115,122,143,88,142,55,107,230,155,253,67,151,123,245,233,247,105,228,16,145,104,94,121,225,233,162,208,153,65,250,20,29,51,235,164,83,78,47,41,243,110,236,118,96,93,255,162,185,61,122,58,61,230,30,143,199,158,59,110,66,216,216,237,229,203,22,31,173,88,28,225,57,5,130,8,208,0,0,164,32,143,60,113,77,33,23,84,89,89,225,185,235,142,159,141,253,244,147,143,194,134,54,156,59,225,162,199,174,191,233,182,217,117,189,254,152,65,67,231,135,46,191,61,99,234,185,126,191,191,214,155,239,190,221,184,185,241,236,143,222,15,11,235,131,135,140,56,100,150,141,72,251,247,239,203,122,107,198,171,7,122,159,179,179,179,247,125,239,7,55,188,45,73,187,247,236,60,16,138,155,229,133,207,238,209,182,99,199,242,208,229,221,59,183,197,52,86,251,112,207,41,16,137,0,13,0,64,10,170,182,254,221,117,183,10,183,121,211,198,38,183,253,244,186,239,47,248,98,238,121,161,235,207,56,107,236,211,215,92,119,227,151,177,236,227,146,43,39,125,217,178,85,171,3,115,67,151,109,222,216,247,206,159,255,228,162,93,59,119,70,157,67,185,164,120,93,211,223,221,113,203,53,251,202,203,143,10,174,107,223,161,227,178,177,23,94,188,188,174,99,61,241,200,3,163,118,238,216,81,24,92,30,49,234,59,175,247,238,87,180,67,146,154,55,107,185,57,184,126,231,206,109,173,194,142,185,97,67,216,35,185,155,53,107,25,83,207,242,225,156,83,32,26,2,52,0,0,41,200,147,155,179,61,158,246,95,124,58,251,232,219,111,158,124,243,55,235,215,29,27,186,254,180,49,231,62,243,195,159,254,124,78,172,251,105,209,178,101,213,121,19,46,121,37,116,221,178,165,139,78,189,249,135,87,222,246,204,147,143,12,89,182,100,97,235,242,242,189,217,139,190,154,223,230,177,135,238,59,254,87,55,77,254,117,105,73,241,224,208,246,23,95,245,131,87,114,115,27,213,58,227,69,73,241,186,166,159,204,154,117,160,247,57,175,105,243,178,73,215,223,252,81,112,185,125,65,199,3,211,211,45,89,188,240,180,143,103,189,215,73,114,122,216,95,120,246,201,176,95,16,250,29,51,56,108,236,118,77,226,61,167,64,77,152,7,26,0,128,20,148,181,215,179,173,58,215,23,83,219,255,206,120,165,199,179,143,63,252,227,234,234,234,67,30,92,242,254,204,255,94,245,254,204,255,94,85,219,235,79,58,249,244,23,127,122,219,29,179,130,203,19,46,186,108,185,183,120,253,115,31,188,247,246,21,193,117,59,119,238,232,52,227,149,23,126,52,227,149,23,106,173,101,220,133,151,254,243,228,83,198,212,249,232,237,167,254,249,247,176,105,235,206,60,103,220,171,45,90,182,172,10,46,159,112,194,41,243,86,44,249,250,20,73,242,249,124,57,15,63,240,231,91,166,191,250,194,226,221,187,118,181,249,118,203,230,94,193,118,157,10,187,44,232,55,96,64,76,193,56,107,175,103,91,44,237,128,186,208,3,13,0,64,10,26,62,60,127,171,177,54,166,4,189,244,171,249,61,163,133,231,35,113,227,173,183,127,124,206,184,11,159,136,231,53,23,92,122,245,67,87,213,114,147,98,208,252,185,115,218,47,156,63,239,192,236,32,237,59,116,92,122,233,213,215,46,12,109,115,206,132,239,174,238,213,175,255,7,193,229,170,170,138,166,235,215,172,58,62,52,60,103,231,228,148,95,53,105,242,107,177,212,102,172,245,13,31,158,31,211,172,32,64,93,232,129,6,0,32,85,121,178,55,201,250,10,146,127,156,232,171,191,63,249,39,95,12,24,60,244,155,87,255,243,236,25,53,61,208,68,146,250,244,59,102,214,37,151,95,253,222,128,97,35,98,155,182,238,169,71,199,133,46,95,116,249,247,95,243,120,60,54,178,221,157,119,63,240,210,195,15,252,185,236,203,185,159,141,169,216,95,30,54,14,186,176,115,183,47,175,252,193,15,167,13,29,49,170,44,150,99,202,147,29,211,48,15,32,22,4,104,0,0,82,148,223,95,189,209,24,83,103,128,30,48,236,216,85,77,154,55,123,238,112,143,211,191,104,208,55,53,109,59,118,228,137,155,143,29,121,226,115,11,23,204,125,123,253,218,53,109,118,238,216,222,116,223,158,189,141,155,52,107,182,175,85,235,214,123,123,244,236,179,181,104,224,144,152,135,70,172,91,177,178,69,247,222,125,86,116,239,221,103,133,228,60,253,112,244,233,103,22,71,107,219,184,113,19,223,45,191,250,237,251,229,229,123,63,252,104,214,204,206,197,27,214,183,107,217,178,213,222,1,3,135,123,99,29,182,17,228,247,87,111,140,167,61,80,27,158,9,15,0,8,227,245,122,173,36,21,20,20,240,25,225,178,79,22,174,110,159,101,114,206,119,187,142,76,224,179,85,211,78,24,212,51,182,222,106,36,77,166,92,95,24,3,13,0,64,138,58,97,80,207,50,195,212,107,71,204,88,255,110,194,51,18,137,0,13,0,64,10,179,210,186,186,91,161,54,156,67,36,26,1,26,0,128,20,86,233,171,94,227,118,13,233,142,115,136,68,35,64,3,0,144,194,190,51,180,215,22,107,13,51,72,28,38,107,205,166,239,12,237,181,197,237,58,144,89,8,208,0,0,164,56,79,174,167,206,199,98,35,58,206,29,146,129,0,13,0,64,138,59,174,95,167,149,220,76,24,63,99,253,187,143,235,215,105,165,219,117,32,243,16,160,1,0,72,3,30,101,45,118,187,134,116,195,57,67,178,16,160,1,0,72,3,199,14,234,252,181,53,102,167,219,117,164,11,107,204,206,99,7,117,254,218,237,58,144,153,8,208,0,0,164,9,143,175,106,129,219,53,164,11,206,21,146,137,0,13,0,64,154,56,110,112,143,149,146,45,113,187,142,212,103,75,156,115,5,36,7,1,26,0,128,52,146,93,153,59,215,237,26,82,29,231,8,201,70,128,6,0,32,141,12,31,158,191,213,239,183,95,184,93,71,170,242,251,237,23,195,135,231,111,117,187,14,100,54,2,52,0,0,105,102,212,224,174,11,172,108,177,219,117,164,26,43,91,60,106,112,87,198,62,35,233,8,208,0,0,164,161,253,89,123,63,150,95,251,220,174,35,101,248,181,111,127,214,222,143,221,46,3,13,3,1,26,0,128,52,116,74,81,209,30,79,86,213,7,110,215,145,42,60,89,85,31,156,82,84,180,199,237,58,208,48,16,160,1,0,72,83,35,6,244,44,182,198,54,248,94,87,107,236,199,35,6,244,100,72,11,234,13,1,26,0,128,52,54,114,64,215,101,13,249,166,66,191,223,126,49,114,64,215,101,110,215,129,134,133,0,13,0,64,154,11,220,56,247,165,219,117,184,224,75,110,26,132,27,8,208,0,0,100,128,227,7,118,249,210,90,59,207,237,58,234,139,181,118,222,241,3,187,52,196,95,26,144,2,8,208,0,0,100,136,145,131,186,206,247,248,245,137,219,117,36,155,199,175,79,70,14,234,58,223,237,58,208,112,17,160,1,0,200,32,35,6,119,89,98,125,254,153,86,166,210,237,90,18,205,202,84,90,159,127,230,136,193,93,150,184,93,11,26,54,2,52,0,0,25,102,228,144,110,235,247,251,124,211,60,30,109,116,187,150,68,241,120,180,113,191,207,55,109,228,144,110,235,221,174,5,200,118,187,0,0,0,144,120,167,12,233,182,67,210,235,115,190,90,59,194,227,201,26,236,118,61,71,194,239,247,125,117,252,192,238,115,221,174,3,8,162,7,26,0,128,12,54,106,112,247,185,213,213,230,13,35,83,230,118,45,241,50,50,101,213,213,230,141,81,131,9,207,72,45,244,64,3,0,144,225,78,28,218,185,84,210,180,57,139,138,7,100,89,255,80,107,212,200,237,154,106,99,172,42,124,198,51,127,212,192,194,197,110,215,2,68,67,15,52,0,0,13,196,168,129,133,139,55,100,239,121,193,231,51,11,100,76,181,219,245,28,194,152,106,159,207,44,216,144,189,231,5,194,51,82,25,61,208,0,0,52,32,23,21,21,85,74,250,98,201,146,37,11,119,86,53,45,202,50,158,190,214,216,230,110,214,100,172,217,237,179,254,229,45,115,246,44,41,26,82,148,113,179,135,32,243,16,160,1,0,104,128,138,156,32,189,64,210,130,79,151,109,236,170,170,202,158,89,30,117,243,251,101,234,227,248,30,143,172,207,175,117,202,201,93,125,124,191,142,204,172,129,180,66,128,6,0,160,129,27,233,4,216,245,243,230,205,203,241,52,106,223,185,170,218,87,232,201,50,249,86,166,89,34,143,99,100,247,248,125,182,52,39,59,171,88,251,203,190,25,49,124,120,85,34,247,15,212,23,2,52,0,0,144,36,13,119,2,237,154,192,151,62,91,245,109,11,255,174,237,237,77,14,112,211,8,0,0,32,0,73,68,65,84,118,86,27,79,86,86,43,127,117,117,75,35,79,51,121,76,237,249,193,111,171,173,252,123,60,217,217,59,253,62,223,14,91,237,251,214,211,162,117,217,113,189,218,236,170,135,183,1,36,29,1,26,0,0,68,117,188,19,120,119,73,90,29,186,254,165,37,75,114,243,183,103,53,106,209,162,73,246,183,149,251,179,36,169,77,110,99,223,174,93,251,170,75,91,251,42,46,26,200,56,102,100,54,2,52,0,0,136,75,224,70,68,66,50,26,44,166,177,3,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,164,178,44,73,54,240,245,139,58,218,30,29,210,182,109,146,235,74,5,83,116,240,253,134,126,85,74,90,45,233,69,73,87,74,106,226,86,129,64,166,34,64,3,0,210,197,31,37,13,116,187,136,20,180,78,210,103,33,95,95,73,202,147,116,177,164,103,36,205,148,212,193,181,234,128,12,68,128,6,0,164,139,28,73,127,147,212,200,237,66,82,204,61,146,70,134,124,141,144,84,32,105,136,156,64,125,162,164,199,36,25,183,10,4,50,13,1,26,0,144,78,70,75,250,145,219,69,164,1,43,167,39,250,251,146,170,36,141,149,52,188,142,215,100,39,187,40,32,83,16,160,1,0,233,226,55,129,239,119,75,234,123,24,175,47,146,116,191,156,96,185,75,210,114,73,15,73,26,28,165,109,112,60,117,169,164,54,114,198,95,207,150,180,77,210,10,73,127,151,212,43,208,182,187,164,63,75,90,36,105,135,164,47,36,221,38,169,69,13,117,180,15,108,255,56,176,191,98,73,255,145,116,158,18,223,75,188,76,210,39,129,159,131,231,172,181,14,142,151,238,36,233,94,57,99,166,171,20,30,162,61,146,38,72,122,73,210,6,57,231,226,45,73,215,42,250,184,234,179,3,251,124,88,82,159,192,126,23,235,224,57,249,191,192,177,37,167,87,252,41,73,171,36,109,149,51,204,228,10,213,156,75,154,73,186,65,210,123,146,202,36,173,149,244,188,164,115,20,223,57,59,85,206,249,254,83,28,175,1,0,0,168,157,215,235,181,94,175,215,186,93,71,64,232,77,132,131,229,4,87,43,233,29,29,218,99,90,219,77,132,23,72,218,23,216,54,79,210,203,114,194,93,176,253,121,181,236,107,177,164,5,114,134,74,220,39,39,64,91,57,65,238,42,57,1,241,211,192,246,7,229,4,77,43,39,108,230,68,236,183,191,156,240,103,229,132,214,87,229,4,233,224,177,254,88,247,41,57,32,120,19,225,181,117,180,123,39,208,238,170,192,114,104,128,254,42,240,125,137,156,95,0,178,2,109,26,73,122,34,164,221,172,192,251,217,27,178,220,46,226,56,193,0,189,66,206,47,40,111,73,250,131,164,127,6,150,173,164,255,73,250,121,224,231,105,129,247,251,180,156,27,31,173,14,254,146,20,42,95,206,80,20,43,231,23,142,255,42,252,156,61,168,216,123,207,127,171,131,191,24,193,5,41,118,125,1,0,32,49,82,236,3,46,50,64,183,209,193,0,26,57,148,163,166,0,221,85,78,240,219,39,39,228,5,123,44,61,146,110,12,180,47,86,248,216,234,208,125,61,168,240,32,220,92,210,71,33,219,255,38,41,55,100,123,59,57,129,212,74,58,35,100,125,182,164,185,129,245,191,140,56,222,137,58,24,240,99,189,81,50,150,0,93,160,131,225,245,196,192,186,208,0,253,145,14,246,164,135,250,85,96,251,28,73,61,66,214,183,149,51,187,135,149,211,107,30,218,251,27,12,208,161,97,61,168,143,156,240,91,211,246,17,129,245,251,228,244,208,7,101,203,9,204,86,206,56,238,150,33,219,250,203,9,253,86,210,143,163,188,135,104,242,229,252,53,225,59,49,182,71,130,165,216,245,5,0,128,196,72,177,15,184,200,0,45,57,227,121,173,156,96,216,51,164,109,77,1,122,136,164,223,43,122,208,244,72,218,20,120,205,49,53,236,171,125,148,215,93,162,131,83,198,29,21,101,251,111,116,48,40,7,29,21,168,227,119,10,15,220,65,143,7,94,115,117,148,109,209,212,21,160,123,72,122,61,208,102,110,200,49,67,3,116,81,148,215,117,208,193,48,63,40,202,246,54,114,134,93,88,73,39,133,172,15,6,232,143,21,125,88,69,240,175,7,51,107,168,247,195,192,246,209,33,235,206,10,172,91,43,103,102,145,72,39,7,182,111,213,193,225,33,72,97,41,118,125,57,108,220,48,0,0,72,55,175,75,122,82,210,15,228,140,105,158,32,201,87,75,251,5,129,175,104,252,114,166,129,59,90,206,56,219,104,202,163,172,219,24,248,62,79,78,207,106,164,173,129,239,161,225,122,155,164,59,106,169,51,184,207,154,198,78,215,228,86,57,129,62,200,200,233,105,237,19,88,94,33,167,199,183,50,202,107,75,162,172,27,45,169,177,156,243,188,48,202,246,111,37,61,34,233,215,146,206,148,19,152,67,237,144,19,106,35,21,7,190,127,26,101,155,116,112,88,69,171,144,117,231,4,190,63,164,232,255,14,31,5,246,55,82,210,9,146,222,168,97,223,64,66,17,160,1,0,233,232,255,228,244,78,142,149,19,14,159,138,225,53,35,36,93,36,103,40,67,79,57,61,169,161,226,185,25,45,24,216,171,107,216,30,12,144,209,62,103,187,74,186,84,210,105,114,134,33,116,60,130,58,36,39,40,247,9,89,174,146,19,198,167,201,25,255,252,31,73,219,227,216,95,239,192,247,121,181,180,89,20,248,62,32,142,253,250,34,190,71,10,158,179,172,144,117,193,191,58,124,93,203,107,62,151,19,160,163,13,69,1,146,130,0,13,0,72,71,155,37,221,36,231,102,192,251,228,220,156,182,191,150,246,191,149,116,167,156,94,204,87,228,4,203,93,129,109,63,145,212,57,105,149,134,59,79,78,160,205,147,244,166,164,127,235,224,216,224,51,21,62,102,58,86,215,201,25,254,145,40,193,158,248,178,90,218,108,9,124,143,54,124,37,145,130,195,50,190,173,165,205,225,246,220,3,135,141,0,13,0,72,87,175,202,25,7,124,153,156,41,211,126,90,67,187,83,229,132,231,133,114,2,108,228,176,133,11,85,63,1,186,189,156,39,3,74,206,77,108,145,67,31,90,234,240,2,116,162,237,9,124,143,156,101,35,84,176,247,62,158,158,237,195,17,220,127,109,65,253,232,192,247,221,73,174,5,56,128,121,160,1,0,233,42,120,147,222,22,57,33,248,138,26,218,157,22,248,254,164,162,143,249,173,47,199,201,233,81,125,91,135,134,231,84,178,50,240,125,88,45,109,130,55,31,46,170,165,77,34,124,21,113,188,72,70,7,31,16,179,178,134,54,64,194,17,160,1,0,233,172,68,206,77,116,82,205,115,40,7,135,36,68,123,248,71,129,194,167,105,75,166,188,136,239,161,114,228,4,236,84,240,161,156,225,48,227,21,125,74,189,150,146,174,15,252,252,78,146,107,121,43,240,253,70,69,255,247,59,94,78,111,254,118,29,124,96,12,144,116,4,104,0,64,186,123,94,210,84,29,250,208,146,160,47,3,223,111,146,116,172,156,94,75,143,156,27,207,166,235,224,80,133,104,193,54,145,22,7,190,159,37,231,198,199,224,48,202,158,114,198,66,143,9,44,55,77,114,29,117,217,40,233,174,192,207,15,43,124,170,192,182,146,254,33,103,216,196,75,114,158,206,152,76,239,202,233,177,239,33,233,175,10,159,161,163,95,160,22,201,25,162,19,203,112,146,14,146,110,145,19,188,129,195,70,128,6,0,164,59,191,156,94,232,157,53,108,127,89,78,16,235,40,103,62,228,141,114,166,153,155,19,216,30,156,109,162,67,18,107,148,164,165,58,24,76,159,150,115,243,96,137,156,199,89,159,45,105,70,96,91,167,36,215,17,139,123,229,132,250,19,228,212,247,145,156,249,155,55,72,186,60,176,28,124,8,77,50,85,203,153,231,250,11,57,55,75,174,151,211,235,61,71,206,249,28,34,103,138,187,71,98,220,223,13,114,110,58,157,146,240,74,209,160,112,19,33,0,32,19,172,147,243,136,232,199,162,108,219,39,105,162,156,97,7,223,149,51,221,217,42,57,179,97,60,46,231,49,223,167,43,252,41,119,201,242,27,57,83,178,93,35,167,55,124,175,156,185,172,31,146,19,224,247,42,53,58,183,246,75,154,36,103,46,232,75,228,12,47,105,36,167,199,249,85,73,207,41,250,188,204,201,80,34,103,28,251,85,114,230,252,30,34,231,60,189,40,231,175,15,193,39,21,198,98,182,36,175,156,127,123,0,0,128,196,200,148,39,133,1,72,61,153,114,125,73,133,223,114,1,0,0,128,180,65,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,52,20,87,73,90,33,233,43,73,231,38,112,159,54,228,235,154,4,237,23,241,27,33,233,99,73,235,36,221,38,201,184,91,78,82,117,148,244,162,164,82,73,79,72,106,233,110,57,0,0,52,112,94,175,215,122,189,94,235,118,29,1,253,21,30,80,67,191,54,72,250,80,210,93,146,70,171,246,192,212,41,226,181,187,36,53,75,64,125,153,26,160,31,85,248,251,26,91,71,251,59,34,218,95,155,212,234,162,91,16,81,195,168,58,218,95,172,154,255,111,197,242,53,37,225,239,32,118,247,68,212,114,147,139,181,196,37,197,174,47,135,141,30,104,0,64,186,234,44,233,59,146,110,151,52,75,210,155,146,250,214,208,54,59,98,185,177,164,172,228,149,6,23,52,137,88,206,117,165,138,250,17,249,222,50,249,189,166,36,2,52,0,32,83,156,37,233,3,73,39,70,217,182,94,210,173,146,118,75,250,86,210,15,36,237,172,191,210,80,15,110,148,243,239,92,37,233,1,57,195,57,50,213,63,116,240,253,189,41,233,223,46,214,210,32,69,254,70,14,0,64,42,91,41,233,250,192,207,141,37,245,144,116,181,164,33,129,117,71,75,122,73,210,9,114,198,194,134,186,95,210,131,114,254,228,237,75,122,165,168,111,239,73,234,46,41,71,82,101,12,237,63,150,116,82,148,245,163,37,253,33,100,249,63,146,30,138,210,110,87,188,5,38,208,90,57,127,125,105,36,169,194,197,58,26,44,2,52,0,32,157,236,150,244,126,196,186,199,229,4,227,73,129,229,142,146,238,149,116,65,148,215,87,39,175,52,164,0,171,216,194,179,228,220,128,87,26,101,253,209,17,203,94,73,179,143,164,168,36,34,60,187,132,33,28,0,128,116,183,79,206,240,140,213,33,235,38,74,58,54,100,57,75,225,55,93,149,212,176,175,33,146,254,159,164,207,36,109,147,180,73,206,141,138,127,144,84,116,24,181,141,143,56,110,165,164,83,163,180,59,38,112,140,217,129,99,110,144,211,163,250,11,73,133,53,236,123,106,200,126,131,189,237,39,200,185,1,112,121,160,254,143,228,12,109,136,28,31,236,134,44,73,103,75,122,68,206,13,127,219,36,21,75,122,93,210,13,146,142,138,242,154,1,10,63,127,55,72,234,18,216,199,134,192,186,14,129,182,83,34,218,246,73,210,251,136,116,56,239,107,164,194,107,189,68,206,76,26,63,145,244,63,73,101,114,122,153,31,215,193,191,174,132,250,81,196,235,47,75,216,187,1,0,0,241,75,177,187,228,35,103,225,152,87,75,219,95,70,180,189,45,100,91,44,1,250,150,136,54,209,190,110,85,248,108,31,181,205,194,49,68,206,159,249,67,183,95,29,113,76,35,39,36,215,118,204,93,146,46,138,82,239,212,136,118,183,215,178,143,255,202,249,115,127,172,18,61,11,71,91,73,51,106,169,207,202,9,140,199,70,188,46,50,64,63,46,231,23,165,208,117,237,3,109,19,21,160,47,136,216,207,125,181,180,61,220,247,21,25,160,255,42,105,81,13,175,175,148,116,102,196,235,211,54,64,167,216,245,229,176,209,3,13,0,200,20,95,68,44,159,28,199,107,39,40,60,40,237,151,52,83,210,39,17,237,238,85,244,48,27,169,64,206,88,236,230,33,235,254,160,67,111,246,250,177,164,63,215,177,175,230,114,198,225,158,85,71,187,187,106,217,118,142,162,15,105,169,15,217,146,158,214,161,33,124,157,156,27,254,130,186,201,249,165,160,109,45,251,154,36,103,220,123,40,255,145,22,120,152,18,249,190,126,42,231,151,133,104,114,228,220,20,201,76,27,41,132,0,13,0,200,20,145,227,89,123,198,241,218,27,67,126,222,34,105,160,156,94,191,19,117,104,112,189,181,142,125,53,147,244,76,196,241,159,149,244,251,40,245,221,27,178,92,46,231,6,201,254,146,6,235,208,64,252,136,106,159,187,122,157,156,112,95,36,231,6,179,215,35,182,215,21,192,107,83,87,47,235,239,106,121,237,241,114,2,124,208,219,146,218,201,185,225,175,157,164,231,67,182,21,72,26,23,67,61,27,229,204,184,178,64,238,221,16,154,232,247,245,176,164,227,228,252,223,187,78,225,33,188,159,156,255,23,72,17,220,68,8,0,200,20,251,34,150,187,200,25,34,17,203,159,139,67,199,153,46,145,180,42,100,249,29,57,227,162,67,195,107,142,194,3,78,80,150,156,222,194,208,113,206,179,228,4,227,200,27,24,175,8,236,39,232,255,228,132,228,160,133,114,110,136,252,126,96,185,171,164,243,228,60,129,46,154,203,228,140,221,14,42,85,120,239,104,77,61,156,201,182,75,78,79,123,208,231,146,182,6,126,222,41,103,134,139,203,67,182,15,172,99,127,87,202,233,145,143,118,254,235,83,34,223,215,43,114,126,137,11,254,95,93,44,231,23,161,159,134,180,233,44,231,41,154,72,1,4,104,0,64,166,56,146,113,149,11,116,48,244,142,150,116,167,156,30,196,53,129,253,254,50,198,253,252,68,225,65,117,133,156,160,188,39,74,219,243,34,150,167,70,105,243,180,14,6,104,201,25,150,82,83,128,246,70,44,111,136,88,142,156,93,162,190,44,10,124,5,53,150,211,251,222,76,206,47,16,93,34,218,183,174,101,95,255,145,244,92,66,171,59,124,137,124,95,107,117,232,255,223,149,17,203,205,133,148,65,128,6,0,100,138,200,225,13,193,89,26,98,241,23,133,247,26,255,54,240,181,70,206,240,133,15,229,140,137,142,236,229,142,20,217,203,59,77,209,167,74,203,145,52,44,100,121,167,164,111,162,180,139,12,81,53,61,105,49,154,200,30,239,35,25,67,251,11,213,62,149,219,53,170,251,241,221,167,200,25,154,112,129,194,123,222,35,213,246,72,246,189,117,28,195,13,137,120,95,209,68,246,176,243,228,204,20,66,128,6,0,100,138,78,17,203,107,226,120,237,219,114,130,208,31,229,76,5,23,212,67,210,205,129,175,53,114,110,4,124,70,177,7,243,95,74,122,85,135,222,224,216,52,98,121,93,13,251,220,29,177,92,219,141,104,201,180,92,210,167,181,108,63,163,142,215,223,161,218,199,73,167,171,76,125,95,168,3,55,17,2,0,50,197,168,136,229,15,227,124,253,7,114,134,111,140,150,115,195,223,130,136,237,61,228,204,162,113,67,156,251,253,135,164,188,136,117,145,61,217,29,107,120,109,203,136,229,173,81,91,165,182,209,10,15,153,139,229,244,246,183,146,211,43,123,56,243,107,167,130,76,125,95,136,1,1,26,0,144,9,218,234,224,147,8,131,222,59,140,253,84,203,9,222,119,74,26,42,231,198,173,200,241,207,191,84,205,127,78,175,146,243,240,148,255,132,172,59,86,206,28,211,161,42,228,220,36,24,116,180,156,153,26,34,69,206,36,178,162,166,194,83,88,228,236,19,55,203,185,177,114,167,11,181,36,82,166,190,47,196,128,0,13,0,72,119,205,229,244,242,134,6,208,233,58,116,216,68,77,198,234,224,13,97,139,20,62,28,161,88,206,12,28,161,55,248,117,146,212,162,134,125,253,74,206,152,233,219,20,30,164,254,160,240,49,207,146,244,70,196,242,133,81,246,23,249,128,140,120,123,213,83,65,228,147,20,35,111,110,76,215,155,227,50,245,125,33,6,4,104,0,64,58,105,38,231,41,110,35,229,4,221,159,200,153,62,44,244,225,38,155,37,253,44,142,125,46,147,115,243,95,240,235,151,146,242,67,182,231,43,252,207,241,155,117,232,216,228,160,109,129,239,235,229,60,25,48,212,67,10,127,164,246,179,17,219,239,150,52,89,206,156,191,3,228,244,130,255,48,100,251,55,58,52,116,167,131,77,17,203,193,199,91,55,145,51,171,200,163,245,94,81,98,100,234,251,66,12,8,208,0,128,116,210,71,210,156,192,215,76,73,127,147,19,56,131,190,149,19,166,87,199,177,207,213,10,127,104,201,105,114,110,24,156,37,233,125,57,115,66,247,14,217,126,175,14,157,225,34,154,39,36,125,20,178,124,188,164,155,66,150,87,40,60,232,231,201,121,152,198,82,57,61,225,191,141,216,223,245,170,57,184,167,178,200,233,249,110,146,243,239,84,46,103,220,249,160,136,237,233,210,115,155,169,239,11,49,32,64,3,0,50,197,76,57,79,224,251,168,174,134,81,252,94,210,131,33,203,141,229,220,36,118,170,194,111,0,188,55,162,93,109,42,229,140,139,13,245,59,133,63,180,229,1,57,15,80,169,77,185,164,75,37,253,55,198,227,166,154,255,169,246,247,56,47,98,57,114,254,228,84,149,169,239,11,49,32,64,3,0,210,213,55,114,194,242,221,114,166,160,59,75,78,239,237,225,168,148,243,212,183,147,228,244,106,127,41,105,187,156,199,122,127,42,103,28,244,113,146,126,30,104,27,171,249,114,166,198,11,202,145,244,119,29,28,202,225,15,212,63,80,78,47,248,167,129,99,122,229,244,128,255,74,78,15,123,77,15,79,73,23,193,127,163,167,229,12,111,217,46,231,223,238,39,114,122,252,223,9,105,59,68,233,19,54,51,245,125,1,0,128,120,120,189,94,235,245,122,143,228,169,126,0,16,85,166,92,95,232,129,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,0,0,226,64,128,6,0,68,242,75,146,181,150,207,8,0,9,19,114,77,241,187,90,72,2,112,113,4,0,68,218,39,73,75,151,46,205,115,187,16,0,153,35,228,154,178,207,213,66,18,128,0,13,0,136,180,67,146,90,182,108,217,202,237,66,0,100,142,144,107,202,14,87,11,73,0,2,52,0,32,82,153,36,249,253,254,14,110,23,2,32,115,132,92,83,202,92,45,36,1,8,208,0,128,72,197,146,148,157,157,221,217,237,66,0,100,142,144,107,74,177,171,133,36,0,1,26,0,16,198,90,187,38,240,99,111,87,11,1,144,105,122,75,97,215,152,180,69,128,6,0,132,49,198,44,9,252,120,140,171,133,0,200,52,199,72,97,215,152,180,69,128,6,0,132,49,198,124,37,73,214,218,225,110,215,2,32,115,4,175,41,193,107,76,58,51,110,23,0,0,72,61,94,175,119,143,164,166,185,185,185,5,237,218,181,43,117,187,30,0,233,109,203,150,45,249,149,149,149,94,73,123,11,10,10,154,185,93,207,145,162,7,26,0,112,8,107,237,135,146,84,81,81,113,154,219,181,0,72,127,193,107,73,240,218,146,238,8,208,0,128,104,222,149,36,99,204,217,110,23,2,32,253,133,92,75,222,117,181,144,4,33,64,3,0,14,145,155,155,251,70,224,199,241,214,218,108,87,139,1,144,214,2,215,144,241,82,216,181,37,173,17,160,1,0,135,104,223,190,253,106,73,179,37,229,149,148,148,92,226,118,61,0,210,87,224,26,146,39,105,118,224,218,146,246,8,208,0,128,154,188,32,73,30,143,231,42,183,11,1,144,190,66,174,33,47,184,90,72,2,17,160,1,0,81,25,99,254,45,169,92,210,25,27,55,110,60,214,237,122,0,164,159,192,181,227,12,73,229,129,107,74,70,32,64,3,0,162,202,207,207,47,183,214,62,42,73,62,159,239,199,110,215,3,32,253,4,175,29,214,218,71,243,243,243,203,221,174,39,81,152,7,26,0,80,163,77,155,54,117,243,249,124,107,3,139,195,10,10,10,230,187,90,16,128,180,225,245,122,135,74,250,82,146,178,178,178,186,119,232,208,97,157,203,37,37,12,61,208,0,128,26,5,62,240,30,148,36,107,237,255,185,92,14,128,52,18,114,205,120,48,147,194,179,68,128,6,0,212,161,162,162,226,110,73,123,141,49,19,75,75,75,47,112,187,30,0,169,175,180,180,244,2,99,204,68,73,123,3,215,144,140,66,128,6,0,212,170,123,247,238,155,173,181,119,72,146,181,246,79,171,86,173,106,228,118,77,0,82,215,170,85,171,26,89,107,255,36,73,214,218,59,186,119,239,190,217,237,154,0,0,112,133,215,235,253,208,235,245,218,210,210,210,71,220,174,5,64,234,42,45,45,125,196,235,245,90,175,215,155,17,143,237,142,134,30,104,0,64,172,110,150,36,107,237,143,54,110,220,120,181,219,197,0,72,61,27,55,110,188,218,90,251,163,192,226,205,174,22,147,68,4,104,0,64,76,2,51,112,252,88,146,252,126,255,191,74,74,74,142,119,185,36,0,41,164,164,164,228,120,191,223,255,175,192,226,143,51,121,214,30,2,52,0,32,102,5,5,5,15,89,107,31,147,51,13,234,243,94,175,183,208,237,154,0,184,47,112,45,120,94,146,177,214,62,86,80,80,240,144,219,53,37,19,243,64,3,0,226,230,245,122,223,145,52,198,90,251,133,207,231,59,179,75,151,46,219,221,174,9,128,59,54,108,216,208,58,43,43,235,29,99,204,177,146,102,22,20,20,156,233,118,77,201,70,15,52,0,32,110,149,149,149,23,75,154,103,140,57,54,59,59,251,141,146,146,146,54,110,215,4,160,254,149,148,148,180,201,206,206,126,35,16,158,231,5,174,13,25,143,0,13,0,136,91,183,110,221,118,248,253,254,243,37,45,148,52,202,24,243,110,113,113,113,79,183,235,2,80,127,138,139,139,123,26,99,222,149,52,74,210,66,191,223,127,126,183,110,221,118,184,93,87,125,32,64,3,0,14,75,97,97,161,183,170,170,234,108,73,159,73,26,98,140,249,112,211,166,77,167,186,93,23,128,228,219,180,105,211,169,198,152,15,37,13,145,244,89,85,85,213,217,133,133,133,94,183,235,170,47,140,129,6,0,28,145,210,210,210,60,107,237,11,146,198,73,146,49,230,166,252,252,252,191,185,92,22,128,36,41,45,45,253,169,181,246,175,129,197,25,198,152,75,243,243,243,203,93,45,170,158,17,160,1,0,9,81,90,90,122,159,181,246,22,73,178,214,190,44,233,150,78,157,58,149,184,92,22,128,4,41,41,41,233,36,233,126,99,204,119,37,201,24,115,127,126,126,254,173,46,151,229,10,2,52,0,32,97,74,75,75,175,176,214,254,67,82,11,73,187,37,221,158,233,211,89,1,13,129,215,235,189,81,210,221,146,154,75,218,101,140,185,33,63,63,255,57,151,203,114,13,1,26,0,144,80,107,215,174,237,210,184,113,227,123,173,181,23,74,146,181,246,11,107,237,159,10,11,11,95,115,187,54,0,241,41,46,46,158,104,140,185,45,48,203,134,140,49,175,236,223,191,255,103,221,187,119,223,224,118,109,110,34,64,3,0,146,194,235,245,94,42,233,78,73,125,2,171,230,24,99,30,206,207,207,127,222,197,178,0,196,160,180,180,244,114,107,237,245,114,102,216,144,164,21,146,126,87,80,80,240,130,139,101,165,12,2,52,0,32,169,74,75,75,111,182,214,222,42,169,32,176,170,68,206,19,203,94,202,228,71,253,2,233,198,235,245,14,149,116,145,164,203,37,117,10,174,54,198,220,151,159,159,255,128,123,149,165,30,2,52,0,160,94,148,148,148,76,54,198,92,43,103,218,171,160,229,146,102,26,99,62,168,168,168,248,180,91,183,110,155,92,42,15,104,112,214,173,91,215,161,81,163,70,35,173,181,163,37,141,145,212,55,100,243,2,107,237,227,157,58,117,122,196,165,242,82,26,1,26,0,80,175,138,139,139,79,54,198,92,108,140,153,32,169,67,196,230,13,198,152,165,214,218,53,126,191,191,196,227,241,148,25,99,118,249,253,254,10,73,214,133,114,129,116,103,60,30,79,35,107,109,11,191,223,223,222,227,241,116,50,198,244,176,214,246,151,212,37,162,237,38,107,237,84,107,237,127,10,11,11,63,116,163,216,116,65,128,6,0,184,166,180,180,244,36,159,207,119,154,199,227,57,209,24,51,194,90,219,220,237,154,128,134,194,24,179,219,90,59,215,239,247,207,206,202,202,122,63,63,63,255,99,183,107,74,23,4,104,0,64,202,240,122,189,125,36,245,53,198,116,179,214,22,72,106,107,173,109,97,140,201,53,198,240,153,5,196,201,58,42,141,49,187,36,109,53,198,120,173,181,235,36,45,47,40,40,88,225,118,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,223,30,28,18,0,0,0,0,8,250,255,218,27,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,220,239,85,0,0,6,235,73,68,65,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,37,125,133,207,161,168,59,156,36,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":30842,"duration_micros":1774,"top":348.70587158203125,"left":48.0,"width":282.0,"height":331.76470947265625,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,124,84,213,253,255,241,247,185,51,9,16,246,125,73,2,178,111,2,178,136,178,184,160,86,235,130,128,182,110,88,171,85,219,175,213,174,118,177,173,181,212,173,237,175,118,247,171,109,173,95,171,85,241,107,85,22,191,173,75,107,81,68,64,100,223,4,65,182,100,194,190,155,64,146,153,123,126,127,220,25,152,196,73,50,3,51,185,147,240,122,62,30,243,24,238,189,231,222,251,153,11,92,222,57,156,57,87,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,234,140,223,5,52,6,214,218,38,219,182,109,203,119,28,167,131,49,166,165,181,182,137,49,134,107,11,164,200,90,107,141,49,229,214,218,195,174,235,238,233,222,189,123,200,24,83,238,119,93,0,0,196,35,228,165,104,247,238,221,93,195,225,240,120,215,117,71,75,26,38,105,128,164,66,159,203,2,26,179,34,73,235,36,173,112,28,103,81,48,24,156,215,177,99,199,237,126,23,5,0,56,117,17,160,147,16,10,133,70,24,99,38,91,107,47,147,52,50,65,147,176,164,98,107,237,110,99,204,33,107,109,185,227,56,182,158,203,4,26,60,215,117,141,49,166,137,181,182,149,49,166,163,164,2,73,193,4,77,151,24,99,254,105,173,157,153,159,159,191,180,158,203,4,0,156,226,8,208,53,216,188,121,115,211,220,220,220,219,140,49,55,89,107,207,140,219,116,68,210,59,146,22,74,90,26,12,6,215,116,238,220,121,147,63,85,2,141,223,206,157,59,123,133,195,225,193,146,70,72,58,91,210,121,146,154,197,182,27,99,62,176,214,62,83,81,81,241,151,158,61,123,30,245,171,78,0,192,169,131,0,93,77,113,113,113,123,73,223,54,198,220,37,169,85,116,245,110,107,237,75,214,218,217,133,133,133,175,251,87,29,0,73,42,42,42,250,172,49,230,74,99,204,231,36,117,140,174,62,100,173,125,84,210,175,11,10,10,246,250,88,30,0,160,145,35,64,199,41,41,41,185,215,90,251,67,29,239,221,250,183,164,39,243,243,243,95,240,177,44,0,181,8,133,66,215,73,186,85,210,69,209,85,71,140,49,15,119,235,214,237,65,31,203,2,0,52,98,4,104,73,37,37,37,87,185,174,251,51,99,76,191,232,170,153,145,72,228,55,221,187,119,159,235,107,97,0,146,182,109,219,182,115,3,129,192,183,36,77,150,36,107,237,71,142,227,252,160,91,183,110,175,248,92,26,0,160,145,57,165,3,244,134,13,27,154,228,229,229,253,65,210,237,209,85,11,140,49,63,237,214,173,219,27,126,214,5,224,196,149,148,148,92,98,173,253,137,164,49,209,85,79,148,149,149,125,173,111,223,190,76,135,7,0,72,139,83,54,64,135,66,161,177,146,158,144,52,40,186,234,187,249,249,249,143,248,88,18,128,52,10,133,66,223,145,244,203,232,226,90,73,183,231,231,231,207,247,177,36,0,64,35,113,74,6,232,226,226,226,155,141,49,79,69,23,231,89,107,239,42,40,40,88,225,107,81,0,210,174,184,184,120,152,49,230,81,73,227,37,201,90,123,75,65,65,193,95,125,46,11,0,128,134,165,164,164,228,7,161,80,200,70,95,143,250,93,15,128,204,11,133,66,143,198,254,222,151,148,148,252,192,239,122,0,0,104,48,138,139,139,31,138,253,35,90,92,92,124,183,223,245,0,168,63,197,197,197,119,199,253,253,127,200,239,122,0,0,200,122,197,197,197,15,196,253,227,121,179,223,245,0,168,127,197,197,197,55,199,221,7,30,240,187,30,0,0,178,86,124,207,83,81,81,209,84,191,235,1,224,159,162,162,162,169,252,79,20,0,0,181,8,133,66,215,198,141,121,190,205,239,122,0,248,47,20,10,221,22,119,95,184,214,239,122,0,0,200,26,69,69,69,67,66,161,80,89,244,139,67,63,242,187,30,0,217,163,164,164,228,71,209,0,93,86,84,84,52,196,239,122,0,0,200,10,161,80,232,189,232,127,211,62,237,119,45,0,178,79,113,113,241,211,209,16,253,158,223,181,0,0,26,14,199,239,2,50,165,164,164,228,97,73,99,37,173,57,120,240,224,237,117,181,7,112,234,137,222,27,214,72,26,27,189,103,0,0,80,167,70,249,32,149,80,40,52,78,210,60,73,114,28,231,130,174,93,187,206,241,185,36,0,89,106,251,246,237,19,92,215,253,79,116,113,124,126,126,62,189,209,0,128,90,53,202,30,104,107,237,131,146,228,186,238,35,132,103,0,181,233,218,181,235,28,215,117,31,145,142,223,59,0,0,56,165,20,23,23,127,49,58,166,113,171,181,54,199,239,122,0,100,63,107,109,78,40,20,218,26,253,206,196,23,253,174,7,0,144,221,26,93,15,180,49,230,251,209,95,62,96,140,169,244,181,24,0,13,66,244,94,241,64,244,215,223,175,163,57,0,0,141,71,40,20,250,82,180,247,121,185,223,181,0,104,120,66,161,208,242,232,61,228,75,126,215,2,0,200,94,141,173,7,250,142,232,251,239,124,173,2,64,67,21,187,119,220,81,107,43,0,0,26,131,226,226,226,11,163,61,71,219,252,174,5,64,195,21,10,133,182,69,199,66,95,232,119,45,0,128,236,212,104,122,160,141,49,55,74,146,181,246,175,126,215,2,160,225,138,221,67,98,247,20,0,0,170,107,20,1,218,90,27,144,116,141,36,25,99,158,243,185,28,0,13,88,220,61,228,154,232,189,5,0,128,42,26,69,128,222,190,125,251,149,146,242,36,205,207,207,207,95,239,119,61,0,26,174,232,61,100,190,164,188,232,189,5,0,128,42,26,69,128,118,93,247,179,146,100,173,253,135,223,181,0,104,248,98,247,146,216,189,5,0,128,120,141,34,64,27,99,38,72,82,32,16,248,151,223,181,0,104,248,98,247,146,216,189,5,0,128,120,198,239,2,78,86,40,20,42,148,180,205,90,123,160,160,160,160,173,223,245,0,104,28,138,139,139,247,27,99,218,72,234,158,159,159,95,228,119,61,0,128,236,209,224,123,160,141,49,35,163,239,139,252,174,5,64,227,17,187,167,196,238,49,0,0,196,52,248,0,237,186,238,144,232,47,121,250,32,128,116,90,46,85,185,199,0,0,32,169,17,4,104,199,113,250,69,127,185,206,215,66,0,52,54,235,164,42,247,24,0,0,36,73,65,191,11,56,89,214,218,211,36,201,113,156,77,126,215,2,52,36,231,207,153,22,108,115,160,127,129,19,136,116,116,35,106,101,141,105,34,73,198,218,114,39,160,67,110,36,176,251,64,155,245,197,111,79,152,22,246,187,86,63,56,142,179,201,117,221,99,247,24,0,0,98,26,124,128,54,198,116,181,214,42,28,14,151,248,93,11,144,173,62,255,226,139,205,194,77,194,231,25,217,179,101,205,8,107,52,88,135,212,75,142,149,181,142,140,19,247,141,98,99,100,173,100,28,171,182,135,250,105,202,172,231,55,25,171,53,50,118,169,149,89,24,44,15,190,243,247,107,174,57,226,231,231,169,15,225,112,184,196,113,28,25,99,186,250,93,11,0,32,187,52,134,89,56,246,73,106,235,186,110,251,194,194,194,125,126,215,3,100,139,137,175,62,223,33,224,218,207,27,153,43,101,204,37,178,54,61,127,223,141,177,178,246,13,43,59,59,226,152,191,191,58,241,134,61,105,57,110,150,41,42,42,106,231,56,206,94,73,251,243,243,243,219,249,93,15,0,32,123,52,248,0,93,92,92,92,97,140,201,233,214,173,91,174,49,166,210,239,122,0,191,77,126,117,250,133,198,181,183,74,186,190,158,78,57,221,58,230,201,153,19,175,127,171,158,206,87,47,172,181,57,37,37,37,21,214,218,202,130,130,130,92,191,235,1,0,100,143,6,31,160,67,161,144,149,164,252,252,252,6,255,89,128,147,49,121,198,243,147,141,163,111,73,58,215,167,18,230,90,87,191,153,57,229,134,153,62,157,63,237,184,191,0,0,18,105,240,255,40,240,15,28,78,117,87,205,126,225,108,215,186,211,140,116,137,223,181,72,146,149,222,112,140,51,237,149,43,175,91,232,119,45,39,139,251,11,0,32,145,6,63,141,29,112,42,155,50,115,250,47,173,117,23,100,75,120,150,36,35,93,98,173,187,96,202,204,233,191,244,187,22,0,0,50,161,193,247,170,208,67,132,83,209,85,179,254,119,156,85,228,191,37,13,243,187,150,58,172,48,10,220,249,202,164,107,223,243,187,144,19,193,253,5,0,144,8,61,208,64,3,51,101,230,179,119,90,69,230,41,251,195,179,36,13,179,138,204,155,50,243,217,59,253,46,4,0,128,116,33,64,3,13,200,228,89,207,63,34,227,60,234,119,29,41,51,206,163,147,103,61,255,136,223,101,0,0,144,14,4,104,160,129,184,106,246,244,167,140,116,183,223,117,156,40,35,221,125,213,236,233,79,249,93,7,0,0,39,139,0,13,52,0,83,102,61,255,172,181,246,102,191,235,56,89,214,218,155,167,204,122,254,89,191,235,0,0,224,100,16,160,129,44,55,101,246,243,79,72,154,234,119,29,105,52,53,250,153,0,0,104,144,8,208,64,22,155,50,243,249,7,101,117,155,223,117,164,157,213,109,83,102,62,255,160,223,101,0,0,112,34,8,208,64,150,154,50,243,185,155,100,244,35,191,235,200,24,163,31,77,153,249,220,77,126,151,1,0,64,170,8,208,64,22,186,122,246,243,131,101,76,227,31,230,96,204,19,87,207,126,126,176,223,101,0,0,144,10,2,52,144,133,92,215,254,65,82,174,223,117,212,131,220,232,103,5,0,160,193,32,64,3,89,102,202,236,233,223,145,49,19,252,174,163,222,24,51,97,202,236,233,223,241,187,12,0,0,146,69,128,6,178,200,231,103,63,221,93,174,125,216,239,58,234,157,107,31,254,252,236,167,187,251,93,6,0,0,201,32,64,3,89,36,236,230,252,88,70,57,126,215,81,239,140,114,194,110,206,143,253,46,3,0,128,100,16,160,129,44,49,229,149,191,13,147,105,132,83,214,37,203,232,182,41,175,252,109,152,223,101,0,0,80,23,2,52,144,45,156,192,55,252,46,193,119,92,3,0,64,3,64,128,6,178,192,164,153,211,11,101,116,139,223,117,84,151,23,204,209,21,189,250,235,218,254,67,52,169,247,0,53,207,201,240,196,32,70,183,76,154,57,189,48,179,39,1,0,224,228,4,253,46,0,128,20,48,186,217,250,93,68,156,128,227,232,171,195,70,107,124,126,15,229,56,199,127,206,158,58,112,152,230,151,108,211,127,47,127,95,149,174,155,153,115,27,221,44,233,129,140,28,28,0,128,52,160,7,26,200,2,174,220,169,126,215,16,19,112,28,253,96,244,185,154,80,216,83,57,142,163,138,72,68,31,31,216,167,242,72,68,65,199,209,185,5,167,233,222,179,207,87,142,19,200,200,249,179,233,90,0,0,144,136,241,187,128,147,21,10,133,172,36,229,231,231,55,248,207,130,83,211,164,153,211,199,58,198,190,231,119,29,146,148,227,56,250,209,89,231,105,104,199,46,114,173,213,95,215,44,211,107,91,54,40,226,186,10,24,163,207,244,232,163,219,134,140,148,99,140,150,238,218,174,159,189,255,142,34,54,253,125,231,174,53,227,102,77,190,126,126,218,15,156,34,238,47,0,128,68,232,129,6,124,230,72,151,251,93,131,36,229,6,2,186,247,236,243,53,180,99,23,73,210,31,150,45,212,255,109,90,175,72,116,168,70,196,90,189,190,101,131,126,249,193,60,89,107,53,162,83,87,221,62,100,84,70,106,201,150,107,2,0,64,34,4,104,192,111,70,159,241,187,132,220,64,64,247,158,117,158,134,116,232,124,108,221,165,61,251,169,105,240,211,95,147,120,127,71,177,126,187,108,129,36,233,226,211,250,28,11,220,105,149,5,215,4,0,128,154,16,160,1,31,77,158,49,163,141,100,207,244,179,134,88,120,62,189,67,103,69,172,213,243,235,86,42,236,186,234,215,182,189,166,141,153,144,48,68,191,91,188,85,239,20,111,145,36,93,218,179,111,6,170,178,103,122,215,6,0,128,236,67,128,6,252,20,44,31,237,231,233,115,3,1,77,27,115,129,78,239,208,89,149,174,171,7,23,190,173,151,62,90,163,251,23,206,81,165,235,170,95,219,14,186,127,236,133,202,11,126,250,225,136,115,163,1,186,119,235,118,153,41,206,231,107,3,0,64,77,8,208,128,159,92,247,12,191,78,29,11,207,3,218,117,80,165,235,234,129,133,115,180,98,247,14,73,210,234,61,187,244,192,194,57,170,136,68,212,167,77,59,61,48,238,211,33,58,55,224,205,194,97,149,161,9,248,124,188,54,0,0,212,134,0,13,248,200,24,13,240,227,188,77,131,65,221,119,246,4,13,104,215,65,97,215,213,67,11,223,214,234,61,187,170,180,89,189,103,151,238,95,248,182,42,221,136,122,182,110,171,251,199,93,168,22,209,7,169,24,73,159,233,209,71,146,180,233,192,254,140,212,232,215,181,1,0,160,46,4,104,192,79,86,189,234,251,148,77,131,65,221,63,246,66,13,106,223,81,149,174,171,251,23,206,209,202,61,59,19,182,93,187,119,151,126,50,255,63,58,26,14,171,87,235,182,122,104,252,69,106,145,155,171,175,13,63,91,35,58,117,85,196,90,189,180,97,77,102,10,245,225,218,0,0,144,12,2,52,224,175,110,245,121,178,166,193,160,126,50,102,130,250,180,105,167,74,55,162,7,18,244,60,87,183,110,223,30,253,116,193,28,29,141,132,85,216,178,181,30,191,112,162,206,47,236,41,73,122,98,213,98,125,124,96,95,166,202,173,215,107,3,0,64,178,8,208,128,159,140,105,95,95,167,202,11,230,232,167,99,46,80,255,182,29,84,30,137,104,218,252,57,90,93,67,207,115,117,235,247,239,209,253,11,230,72,146,154,71,135,113,252,101,213,18,189,185,101,99,198,234,173,207,107,3,0,64,42,62,61,63,21,128,250,227,218,150,245,241,60,208,188,96,142,30,24,119,161,122,182,110,171,138,72,68,63,93,240,31,173,219,183,39,233,253,29,99,52,169,247,192,99,203,143,175,88,164,127,109,253,56,19,165,30,231,218,150,153,61,1,0,0,39,134,0,13,248,201,232,211,243,195,165,89,245,240,60,45,197,240,28,48,70,223,25,53,94,103,117,45,144,149,244,199,250,8,207,82,189,92,27,0,0,78,4,1,26,240,147,181,174,140,201,216,80,170,22,57,185,250,233,216,11,78,42,60,223,51,250,92,141,236,220,77,86,222,227,189,223,46,218,156,169,114,171,178,214,173,159,19,1,0,144,26,198,64,3,126,50,166,44,83,135,142,15,207,71,195,225,134,21,158,165,140,94,27,0,0,78,6,61,208,128,191,14,72,106,145,238,131,182,200,201,213,67,227,47,82,97,203,214,58,26,14,235,190,249,111,105,99,10,179,101,4,28,71,247,156,121,206,177,240,252,155,37,243,53,47,180,53,221,101,214,229,64,125,159,16,0,128,100,208,3,13,248,200,72,59,210,125,76,199,24,253,240,172,115,85,216,178,181,142,132,43,53,109,193,127,78,60,60,91,171,223,45,93,224,71,120,206,200,181,1,0,32,29,8,208,128,143,172,236,182,116,31,243,226,30,125,52,160,93,71,133,93,87,63,93,240,182,62,218,191,55,233,125,115,28,71,63,138,13,219,176,86,191,94,58,95,115,139,183,164,187,196,164,100,226,218,0,0,144,14,12,225,0,252,100,204,71,178,233,61,228,232,46,249,146,164,217,31,175,211,71,251,147,31,243,156,227,56,250,209,89,231,105,104,199,46,178,214,234,145,37,239,105,65,73,81,122,139,75,133,49,31,249,119,114,0,0,106,70,128,6,252,100,237,106,165,121,34,232,246,205,242,36,73,91,15,39,63,132,56,199,113,116,239,217,231,107,72,135,206,114,173,213,47,63,152,167,247,119,20,167,181,174,148,89,187,218,223,2,0,0,72,140,0,13,248,40,162,156,197,1,133,211,122,204,220,64,64,146,20,142,36,55,11,92,110,32,160,123,207,58,95,167,119,232,164,136,181,250,249,162,185,90,178,179,36,173,53,157,136,136,114,22,251,93,3,0,0,137,48,6,26,240,209,236,73,215,172,151,148,214,180,154,227,68,3,116,18,211,40,231,6,2,154,54,230,2,47,60,187,110,214,132,103,73,37,209,107,3,0,64,214,33,64,3,62,51,198,188,149,206,227,229,56,222,95,235,202,72,164,214,118,77,131,65,77,27,115,129,6,180,235,160,136,235,234,193,247,223,201,150,240,156,246,107,2,0,64,58,17,160,1,159,185,178,175,165,243,120,193,104,128,174,173,7,186,105,48,168,251,199,94,168,1,237,58,168,50,26,158,87,236,206,158,89,227,210,125,77,0,0,72,39,198,64,3,62,139,152,150,179,130,246,112,88,105,250,251,24,140,14,225,40,108,217,250,83,219,140,140,250,181,237,160,73,189,7,168,69,110,174,42,221,136,30,122,127,174,86,198,133,231,160,227,168,95,219,246,114,76,242,95,110,220,85,86,170,93,101,165,39,95,188,39,28,49,45,103,165,235,96,0,0,164,27,1,26,141,206,188,117,187,91,170,236,72,203,156,102,78,139,72,121,184,121,192,81,83,215,4,154,152,112,101,142,235,152,128,36,57,174,141,216,96,78,165,99,35,229,17,87,71,3,77,130,165,149,71,220,79,148,215,236,240,248,1,29,15,215,103,189,175,78,156,88,54,101,214,243,47,72,186,49,29,199,139,13,225,184,125,200,168,90,219,29,44,63,170,95,45,121,79,171,247,236,170,178,254,134,1,67,53,185,207,192,148,206,185,171,172,84,255,245,239,217,169,21,90,179,23,94,157,56,145,199,120,3,0,178,22,1,26,13,222,194,85,155,58,71,220,96,71,199,141,116,48,142,105,111,42,75,219,216,160,9,216,202,136,28,199,200,74,50,214,149,2,129,227,99,150,2,222,58,43,35,199,145,108,101,68,193,160,100,42,75,35,11,87,108,57,96,93,187,215,117,2,123,2,78,120,247,217,67,122,237,172,135,143,241,140,210,20,160,95,223,178,33,97,239,115,140,107,173,62,220,187,91,175,110,90,175,210,202,138,79,109,95,189,119,151,250,182,109,159,210,57,183,29,58,152,114,157,181,120,38,157,7,3,0,32,221,210,59,1,173,15,66,161,144,149,164,252,252,252,6,255,89,144,28,107,173,243,254,202,80,55,55,104,187,57,17,219,85,178,157,51,123,70,179,211,13,152,237,78,216,148,156,53,52,191,196,24,147,220,252,112,41,154,50,235,185,69,146,57,51,19,199,110,56,236,7,51,38,77,29,237,119,21,49,220,95,0,0,137,208,3,141,6,99,241,199,251,90,171,180,180,251,162,213,91,187,203,152,124,167,246,73,38,210,200,118,118,34,182,179,140,206,88,180,122,107,104,225,146,77,69,193,54,109,182,142,234,221,46,173,221,174,198,56,127,176,214,158,210,189,175,198,56,127,240,187,6,0,0,234,210,224,123,85,232,33,106,252,230,46,221,208,177,105,110,147,211,172,107,79,179,82,91,191,235,145,36,35,237,55,142,217,114,180,162,124,203,185,35,250,238,78,215,113,167,204,122,110,137,100,70,164,235,120,13,139,93,58,99,210,212,145,126,87,17,143,251,11,0,32,17,122,160,145,181,150,45,219,220,166,34,24,232,99,221,72,31,215,181,173,252,174,39,158,149,218,90,215,182,205,13,4,123,191,191,106,219,198,220,112,100,227,240,225,61,147,127,118,118,205,30,146,244,114,26,142,211,16,61,228,119,1,0,0,36,131,121,160,145,117,230,88,27,92,184,102,235,160,138,64,224,124,107,237,8,25,39,171,194,115,21,198,105,101,173,29,81,17,8,156,191,112,205,214,65,115,172,61,169,31,74,103,76,154,250,138,177,167,94,128,54,86,47,207,152,52,245,21,191,235,0,0,32,25,4,104,100,149,69,107,54,119,105,182,38,116,142,34,26,111,101,59,249,93,79,178,172,108,39,69,52,190,217,154,208,57,139,214,108,238,114,50,199,10,155,200,61,146,41,79,87,109,217,207,148,123,159,25,0,128,134,129,0,141,172,177,112,205,214,65,225,136,115,142,220,72,95,191,107,57,97,110,164,111,56,226,156,179,112,205,214,65,39,122,136,217,147,190,176,81,210,55,211,88,85,182,251,102,244,51,3,0,208,32,52,248,47,198,240,37,159,134,111,197,138,29,205,143,232,200,16,107,156,33,166,17,252,153,148,36,43,89,99,221,85,205,212,108,213,176,97,93,78,232,17,125,147,103,62,247,148,49,230,230,116,215,150,77,172,181,127,157,57,121,234,45,126,215,81,19,238,47,0,128,68,232,129,134,175,230,44,94,223,225,104,240,232,89,50,206,208,198,18,158,37,201,72,70,198,25,122,52,120,244,172,57,139,215,119,56,145,99,204,156,116,195,151,36,179,48,221,181,101,15,179,208,251,140,0,0,52,44,4,104,248,102,241,218,45,93,155,229,54,25,109,35,166,143,223,181,100,138,141,152,62,205,114,155,140,94,188,118,75,215,148,119,54,198,154,128,59,85,82,81,250,43,243,93,145,9,184,83,101,140,245,187,16,0,0,82,69,128,134,47,230,175,47,202,119,93,51,74,50,5,126,215,146,121,166,192,117,205,168,249,235,139,242,83,221,243,149,43,166,110,50,198,185,90,210,254,12,20,230,151,253,198,56,87,191,114,197,212,77,126,23,2,0,192,137,32,64,163,222,45,93,183,173,155,83,30,30,229,186,74,189,87,182,129,114,93,117,117,202,195,163,150,174,219,214,45,213,125,95,185,242,186,15,2,214,92,33,107,247,102,162,182,122,101,237,222,128,53,87,188,114,229,117,31,248,93,10,0,0,39,138,0,141,122,245,222,138,141,157,42,43,221,225,146,211,217,239,90,234,159,211,185,178,210,29,254,222,138,141,41,79,207,247,210,228,235,231,59,198,249,140,145,105,176,179,85,24,153,141,142,113,62,243,210,228,235,231,251,93,11,0,0,39,131,0,141,122,179,112,225,134,86,1,39,103,152,181,38,229,161,12,141,133,181,38,63,224,228,12,91,184,112,67,202,15,135,121,121,210,245,203,194,210,121,146,254,147,129,210,50,237,63,97,233,188,151,39,93,191,204,239,66,0,0,56,89,4,104,212,139,23,95,124,49,96,91,228,14,145,85,79,191,107,241,157,85,79,219,34,119,200,139,47,190,24,72,117,215,217,147,174,47,153,49,233,134,11,37,253,46,3,149,101,202,239,102,76,186,225,194,217,147,174,47,241,187,16,0,0,210,129,0,141,122,209,125,224,152,193,198,213,96,191,235,200,22,198,213,224,238,3,199,156,240,245,152,49,233,134,111,74,206,53,146,138,211,88,86,186,21,75,206,53,94,173,0,0,52,30,4,104,100,220,226,53,37,221,93,27,57,221,239,58,178,141,107,35,167,47,94,83,210,253,68,247,159,49,233,186,191,71,116,100,144,145,121,52,157,117,165,131,145,121,52,162,35,131,102,76,186,238,239,126,215,2,0,64,186,53,248,7,87,240,164,176,236,54,191,168,168,89,224,160,61,215,186,182,135,223,181,100,35,227,152,173,145,214,102,238,216,194,194,35,39,115,156,171,102,191,112,166,181,246,30,201,94,149,174,218,78,140,121,197,24,243,243,198,50,203,6,247,23,0,64,34,65,191,11,64,227,150,115,200,25,16,113,195,132,231,26,88,215,246,200,57,20,24,32,233,164,190,92,23,13,172,87,79,154,57,125,172,99,236,87,37,77,77,75,129,201,123,206,181,230,177,89,204,176,1,0,56,5,52,248,94,21,122,136,178,215,162,53,155,187,216,112,96,130,53,182,165,223,181,100,51,99,205,97,19,140,204,25,61,184,231,142,116,29,243,170,151,159,45,176,1,231,70,25,251,121,201,140,72,215,113,171,178,75,101,205,223,77,196,125,246,149,171,111,204,230,177,216,39,140,251,11,0,32,17,122,160,145,49,54,28,232,75,120,174,155,53,182,165,194,129,190,146,210,22,160,163,129,246,231,146,126,126,245,171,207,15,112,101,46,150,107,207,151,204,24,201,118,57,177,163,154,29,146,93,32,199,188,237,200,190,249,242,196,169,235,210,85,47,0,0,13,73,131,239,85,161,135,40,59,189,187,248,227,238,57,185,57,23,74,54,199,239,90,26,6,83,89,89,81,249,214,57,163,122,111,203,244,153,174,122,249,185,30,110,78,96,144,172,122,75,110,161,49,234,104,92,181,178,198,52,145,36,99,109,185,117,116,200,90,237,150,156,34,25,125,236,84,70,214,190,114,245,212,173,153,174,45,219,112,127,1,0,36,66,15,52,50,34,216,196,233,37,75,120,78,158,205,9,54,113,122,73,202,120,128,142,6,225,83,46,12,3,0,144,46,76,99,135,180,155,191,188,40,223,200,244,242,187,142,134,198,200,244,154,191,188,232,148,125,74,35,0,0,13,5,1,26,233,23,136,244,144,53,252,239,70,170,172,9,42,16,97,198,18,0,0,178,28,1,26,105,181,112,195,222,86,142,235,156,240,195,65,78,117,142,235,116,95,184,97,67,43,191,235,0,0,0,53,35,64,35,189,42,62,41,144,177,4,192,19,101,108,43,85,228,22,248,93,6,0,0,168,25,1,26,233,229,138,49,188,39,139,107,8,0,64,86,99,156,42,210,102,254,252,53,237,172,171,110,230,4,38,252,218,183,123,119,147,37,75,23,116,221,21,218,222,166,180,236,147,166,29,218,119,58,88,120,90,207,125,35,207,26,187,203,113,28,155,234,241,194,149,149,102,237,154,85,237,54,127,188,190,195,174,157,59,218,116,238,210,109,127,223,190,131,118,247,31,60,248,64,42,199,11,87,86,154,85,43,150,118,216,178,233,227,246,123,246,236,108,221,173,91,254,190,94,189,7,238,169,235,56,207,60,249,216,136,79,14,31,202,139,45,95,116,201,196,213,253,6,14,62,144,204,57,173,171,110,243,231,175,105,55,118,236,224,125,201,214,9,0,0,234,15,1,26,233,211,34,175,147,145,154,164,178,203,199,27,63,106,245,167,223,254,226,170,205,155,54,142,182,214,6,170,111,207,107,222,114,215,232,113,227,222,252,242,157,119,191,151,155,219,196,173,235,120,171,151,46,109,255,218,63,94,26,181,98,233,210,9,71,143,150,181,173,190,189,89,243,230,123,134,143,28,61,231,138,201,87,47,238,55,112,104,173,129,246,245,87,103,244,250,251,243,79,221,112,240,192,129,194,234,219,218,119,236,184,241,150,255,250,230,223,206,30,123,206,167,30,126,242,175,55,102,159,54,251,165,23,190,114,172,109,135,78,27,190,124,231,221,239,213,85,123,140,49,106,98,91,228,117,146,68,128,6,0,32,11,17,160,145,54,129,64,160,163,141,36,223,89,252,254,187,115,187,254,247,239,126,118,103,89,105,105,199,154,218,148,149,30,238,244,246,155,175,223,184,241,195,15,7,63,252,219,63,254,37,47,175,121,184,166,182,143,254,230,225,115,222,126,243,245,27,107,59,231,145,210,210,14,243,231,206,249,252,252,185,115,62,127,229,231,174,251,211,77,183,126,117,105,162,118,203,22,191,223,241,175,127,254,195,215,195,225,112,179,68,219,247,238,222,221,231,177,95,255,252,206,30,221,79,251,89,215,130,194,178,216,250,112,101,165,121,233,217,103,62,23,223,246,218,47,220,242,247,96,78,78,74,189,232,129,64,160,163,36,158,244,7,0,64,22,98,12,52,210,198,117,221,26,131,112,117,197,69,91,155,63,254,232,255,251,74,109,225,185,90,251,225,191,255,197,253,23,215,180,253,161,251,190,51,177,174,240,92,221,236,151,94,248,202,31,126,249,208,121,137,182,189,240,204,147,159,141,15,207,77,155,230,237,239,86,80,184,60,39,167,73,105,108,93,89,233,225,78,79,63,249,88,149,253,159,127,230,47,103,236,221,179,171,111,108,185,239,192,65,239,92,112,241,229,41,63,180,36,149,107,9,0,0,234,23,61,208,72,139,119,87,110,109,43,171,246,201,182,159,254,212,159,198,127,114,232,80,215,216,114,94,243,230,187,47,190,244,202,151,135,157,49,178,168,71,159,254,7,23,191,63,175,219,188,183,223,26,190,114,217,226,75,99,109,22,47,90,48,105,243,250,143,230,245,236,223,239,80,252,177,94,124,238,169,211,151,125,176,232,138,248,117,173,219,180,41,58,239,162,75,255,113,230,217,99,183,244,232,217,231,240,198,143,214,183,94,56,111,78,223,119,231,252,107,210,145,178,178,118,177,118,239,252,231,141,27,6,15,57,99,203,5,159,61,30,114,139,139,182,54,223,180,113,253,152,216,114,255,193,167,207,249,201,195,191,121,49,55,183,137,123,224,192,158,220,31,126,235,206,59,118,237,216,62,72,146,214,174,90,62,206,117,221,215,29,199,177,7,14,236,201,253,247,107,255,119,85,108,191,64,32,88,113,203,237,95,251,103,178,215,164,10,107,218,191,187,114,107,219,115,134,246,216,127,66,251,3,0,128,140,161,7,26,105,145,107,109,27,35,37,245,245,193,138,138,114,103,213,202,21,227,99,203,198,152,200,29,223,248,238,99,55,222,122,199,178,33,35,71,239,105,213,186,117,229,5,23,95,190,245,190,135,127,61,243,180,222,125,23,198,239,251,250,107,51,134,196,47,31,58,120,48,231,181,89,51,174,142,95,215,173,160,112,249,47,127,255,228,47,111,186,245,142,101,3,7,15,219,159,151,215,60,60,244,140,17,123,191,124,215,221,11,167,253,226,247,63,107,221,166,93,149,30,225,151,94,120,250,170,138,138,242,99,127,23,54,174,95,215,46,126,60,246,197,151,79,158,23,27,127,221,166,77,135,138,209,103,214,166,159,142,0,0,32,0,73,68,65,84,141,63,54,158,185,172,180,180,227,206,146,80,51,73,122,234,79,143,142,47,43,61,220,41,182,237,172,49,231,204,74,246,139,131,213,25,201,228,90,219,230,68,246,5,0,0,153,69,128,70,90,24,215,182,78,182,237,178,247,223,239,28,31,52,7,12,30,242,246,152,115,46,40,73,212,118,196,153,103,47,137,95,222,179,123,103,135,248,229,23,254,246,151,145,135,15,31,232,22,91,110,209,178,229,206,251,30,254,237,255,180,235,216,177,60,209,241,122,247,233,119,232,91,223,189,239,79,198,152,72,108,221,174,157,59,6,188,250,210,255,14,56,246,89,2,166,202,120,101,27,177,85,126,48,176,142,249,212,120,230,205,235,63,106,245,254,188,185,87,198,150,243,154,183,220,117,219,93,223,126,39,81,13,201,74,229,154,2,0,128,250,67,128,70,90,88,39,208,50,217,182,197,69,91,170,204,142,81,216,163,231,182,154,218,246,237,55,120,103,252,242,225,79,14,87,9,149,107,87,46,63,35,126,249,220,9,151,188,218,161,134,240,28,115,250,136,17,123,207,24,121,86,149,161,21,43,150,127,48,56,246,235,126,125,7,238,139,15,216,255,122,125,214,184,248,30,234,15,87,175,56,214,54,175,121,203,93,93,11,10,203,254,231,47,191,175,50,102,250,162,75,175,120,165,85,235,214,149,181,213,81,151,84,174,41,0,0,168,63,140,129,70,90,184,198,109,97,146,27,193,161,166,121,77,43,227,135,102,20,228,119,223,83,83,219,112,248,104,149,169,237,114,114,114,42,98,191,46,46,218,218,188,184,104,235,240,216,114,32,16,172,152,252,185,235,87,38,83,195,37,19,39,47,90,182,120,225,196,216,242,199,31,173,63,179,162,162,252,229,220,220,38,110,215,130,194,178,158,125,251,45,220,244,209,250,113,146,180,126,205,234,9,119,220,124,109,175,190,253,7,46,91,183,102,229,152,79,14,31,238,28,219,111,200,208,97,243,222,153,243,102,193,135,171,87,94,24,91,215,169,75,215,181,55,220,116,219,242,100,234,168,141,107,220,22,39,123,12,0,0,144,126,4,104,164,133,177,202,75,50,63,235,242,201,215,108,184,124,242,53,27,146,105,187,121,227,198,42,179,81,180,111,219,241,88,216,94,181,108,73,151,248,109,133,221,123,44,171,105,232,70,117,163,70,143,221,213,162,85,171,237,177,47,50,150,151,31,109,189,126,213,138,118,67,70,142,222,35,73,215,76,189,229,245,71,30,184,119,100,56,28,110,42,73,7,247,239,235,177,120,225,123,61,226,143,145,215,188,249,238,171,167,222,54,255,145,7,127,240,165,248,245,215,223,116,251,203,169,78,91,151,136,177,202,171,187,21,0,0,168,111,12,225,64,90,88,163,166,153,56,238,130,249,115,199,197,47,159,62,124,228,199,177,95,239,223,187,167,74,15,109,215,110,249,197,169,28,187,75,231,252,141,241,203,59,246,236,56,118,188,81,163,199,238,250,226,237,119,253,190,101,171,150,219,19,237,219,190,99,199,141,119,124,227,187,143,45,156,247,86,207,216,140,28,146,212,119,224,160,183,207,153,112,81,74,117,212,36,83,215,20,0,0,156,28,122,160,145,22,198,85,147,116,255,56,246,218,236,87,122,111,47,222,54,44,182,220,178,85,203,237,227,207,191,176,40,182,188,239,192,158,86,241,237,91,180,108,253,73,42,199,111,222,178,229,225,248,229,253,123,246,86,9,228,151,94,121,213,199,231,93,116,201,131,255,55,227,197,1,155,62,250,168,251,161,131,251,219,182,239,208,97,247,160,161,35,62,190,240,179,151,111,14,135,195,206,159,30,253,245,151,99,237,163,211,214,189,150,74,13,181,49,110,106,79,117,4,0,0,245,131,0,141,147,54,109,218,52,199,58,38,144,228,8,142,164,148,149,149,6,103,188,248,108,149,39,250,157,61,246,252,55,227,159,68,120,228,147,178,42,79,9,108,214,162,197,145,84,206,209,188,69,139,42,129,251,147,67,135,63,245,212,193,188,188,230,225,107,166,222,178,90,210,234,234,219,254,244,187,71,206,137,159,203,250,172,113,231,204,234,211,127,224,193,119,231,252,187,96,233,7,243,251,238,218,177,163,75,211,188,188,210,30,61,123,21,95,58,241,234,181,29,59,117,62,154,74,125,214,49,159,122,180,57,0,0,240,31,1,26,105,145,236,28,208,201,168,168,40,119,238,191,231,219,215,237,219,187,167,87,108,93,151,174,249,171,191,112,251,87,23,197,183,107,214,34,175,74,96,46,43,43,77,105,200,195,145,178,170,1,188,105,94,179,164,198,79,75,222,180,117,243,223,125,123,82,108,57,175,121,203,93,215,127,225,182,249,63,252,246,29,83,55,174,255,240,156,248,182,43,150,44,210,27,175,206,60,248,197,47,223,245,248,197,151,93,185,57,217,115,164,243,154,2,0,128,244,97,12,52,78,218,180,105,211,92,227,56,110,58,142,229,186,174,121,248,190,239,77,217,184,225,120,8,205,107,222,114,215,221,223,255,233,211,241,189,207,146,212,170,85,219,42,61,200,101,159,124,146,210,151,238,202,74,63,169,50,100,163,109,219,246,165,53,181,173,238,233,255,121,252,162,202,202,242,230,177,229,139,47,189,226,149,223,255,250,161,201,213,195,115,76,121,249,209,214,255,243,248,111,191,185,106,201,162,14,137,182,39,146,174,107,10,0,0,210,139,0,141,52,113,43,234,110,83,199,17,92,215,60,244,227,239,93,185,122,197,178,139,99,235,140,49,145,47,220,254,149,39,171,63,190,91,146,218,180,109,87,37,240,238,218,190,189,107,245,54,181,217,177,189,164,87,252,114,219,14,29,147,10,208,239,191,251,118,215,213,43,151,92,18,91,238,212,165,235,218,86,109,219,150,110,248,112,237,121,177,117,193,156,156,178,97,35,70,253,179,125,135,78,199,102,27,9,135,195,77,159,252,243,163,87,87,63,94,205,78,254,154,2,0,128,244,35,64,35,45,172,204,73,135,189,159,253,228,158,203,87,44,93,116,89,252,186,73,87,95,247,196,103,46,185,114,75,162,246,67,6,15,223,17,191,188,117,203,166,17,71,143,30,73,106,220,240,71,31,174,105,115,240,192,190,99,211,210,5,115,114,202,134,158,49,162,198,249,168,227,61,251,204,95,166,196,47,95,127,211,237,47,191,63,127,238,136,216,114,94,243,150,187,30,250,245,227,63,249,241,67,191,158,245,248,211,47,254,106,212,232,113,179,98,219,138,183,109,25,241,225,170,85,85,30,36,83,147,116,92,83,0,0,144,126,4,104,164,135,27,73,233,11,124,213,253,234,193,123,47,142,127,176,137,36,93,112,201,101,127,187,241,214,59,150,213,180,79,207,254,253,14,117,43,40,92,17,91,174,172,44,111,254,230,63,103,245,78,230,124,115,222,252,231,160,248,229,190,253,7,46,168,62,68,36,145,151,166,63,61,56,126,102,144,254,131,79,159,115,206,132,139,138,119,133,182,247,60,182,110,208,224,69,189,251,120,61,230,142,227,216,203,175,156,82,101,236,246,186,15,87,117,86,50,78,242,154,2,0,128,204,32,64,35,45,2,114,146,30,63,28,175,162,162,220,121,232,190,239,76,92,240,222,220,42,67,27,46,159,114,205,159,191,250,205,123,230,213,181,255,233,195,70,44,141,95,126,125,246,140,203,93,215,173,245,203,119,123,183,239,108,58,111,238,91,85,194,250,25,195,71,127,106,150,141,234,142,30,61,18,120,109,246,203,199,122,159,131,193,224,145,47,222,122,231,235,146,116,248,147,131,199,66,113,139,188,170,179,123,116,232,218,181,44,126,249,240,193,125,73,141,213,62,209,107,10,0,0,50,139,0,141,180,136,88,55,165,57,152,37,105,231,142,237,205,238,249,198,151,191,180,236,131,69,87,196,175,255,204,103,39,62,125,203,151,239,90,146,204,49,174,251,194,109,75,90,183,105,115,108,110,232,93,59,183,15,248,201,119,191,126,205,161,131,7,115,18,181,47,46,218,220,252,167,247,125,251,150,35,101,101,237,98,235,58,117,233,250,225,196,207,93,187,174,174,115,253,229,241,223,140,61,120,224,64,97,108,121,244,216,115,95,237,55,112,240,1,73,106,217,162,245,206,216,250,131,7,247,181,169,114,206,173,91,91,198,47,183,104,209,58,169,158,229,19,185,166,0,0,32,243,8,208,72,143,136,243,169,47,249,213,230,131,5,243,58,255,240,91,119,124,107,219,150,205,103,198,175,191,240,226,203,159,249,202,55,190,59,63,217,227,180,106,221,186,242,138,41,215,189,20,191,238,195,181,43,47,248,214,87,190,112,207,51,79,62,62,252,195,53,43,218,150,149,149,6,87,46,95,218,254,207,143,254,234,236,31,124,243,142,123,75,138,139,206,136,111,127,237,77,183,190,148,155,219,164,214,25,47,138,139,54,55,127,111,206,156,99,189,207,121,205,91,238,186,237,171,223,154,27,91,238,148,223,245,216,244,116,107,86,173,184,240,221,57,255,46,144,188,30,246,233,127,123,178,202,15,8,3,79,63,163,202,216,237,26,165,120,77,1,0,64,253,96,30,104,164,133,235,56,7,29,37,55,235,218,63,102,191,212,251,111,79,60,246,181,112,56,252,169,7,151,188,245,230,63,110,122,235,205,127,220,84,219,254,231,156,119,209,11,223,184,231,190,57,177,229,41,215,220,176,46,84,180,229,217,183,255,253,250,141,177,117,7,15,30,40,152,253,210,244,255,154,253,210,244,90,107,185,242,115,215,255,241,188,9,23,215,249,232,237,167,254,248,135,42,211,214,93,114,217,149,47,183,106,221,186,50,182,60,110,220,132,197,235,215,172,158,32,73,145,72,36,231,177,223,252,226,219,179,94,158,190,234,240,161,67,237,247,238,222,217,55,214,174,160,176,199,178,129,67,134,236,175,235,124,146,119,77,147,105,7,0,0,234,23,61,208,72,143,246,218,103,172,146,122,210,222,218,229,75,251,36,10,207,39,227,174,187,127,248,238,101,87,126,238,47,169,236,115,245,245,55,63,122,83,45,95,82,140,89,186,104,126,167,21,75,23,31,155,29,164,83,151,174,107,175,191,249,246,21,241,109,46,155,242,249,141,125,7,14,122,59,182,92,89,89,222,124,203,199,27,206,142,15,207,193,156,156,178,155,110,187,227,149,100,106,51,86,71,213,94,251,146,251,36,0,0,160,62,17,160,145,22,99,11,11,143,56,198,217,93,47,39,171,225,79,237,151,238,248,250,7,223,191,239,225,251,250,244,31,248,110,109,187,247,31,120,250,156,159,60,248,200,143,174,191,233,75,171,146,57,221,179,79,253,233,202,248,229,107,166,126,233,21,199,113,108,245,118,63,121,248,55,47,142,61,247,130,23,155,52,205,59,80,125,91,97,247,158,75,190,119,239,3,63,27,49,122,236,174,100,206,233,24,103,247,216,194,66,102,225,0,0,32,11,49,132,3,105,83,17,169,216,19,8,4,11,235,106,55,100,228,153,27,154,181,108,241,236,137,158,103,208,224,97,219,106,218,118,230,152,241,59,207,28,51,254,217,21,203,22,189,190,101,211,199,237,15,30,216,223,252,200,39,165,77,155,181,104,113,164,77,219,182,165,189,251,244,223,51,120,232,240,164,123,118,55,175,255,168,85,175,126,253,215,247,234,215,127,189,228,61,253,240,252,139,46,41,74,212,182,105,211,102,145,111,255,96,218,91,101,101,165,239,204,157,243,102,247,162,173,91,58,182,110,221,166,116,200,208,81,161,100,135,109,196,84,68,42,146,154,147,26,0,0,212,191,90,167,251,106,8,66,161,144,149,164,252,252,252,6,255,89,26,186,247,150,110,234,17,8,6,46,169,187,37,234,18,9,71,222,24,55,162,215,86,191,235,56,213,113,127,1,0,36,194,16,14,164,77,167,150,145,29,70,74,169,167,21,159,102,164,253,157,90,70,146,155,169,3,0,0,212,59,2,52,210,166,111,223,190,229,198,216,144,223,117,52,116,198,216,80,223,190,125,203,253,174,3,0,0,36,70,128,70,90,85,86,186,4,232,147,196,53,4,0,32,187,17,160,145,86,99,135,247,44,166,23,250,196,25,99,67,99,135,247,172,115,94,106,0,0,224,31,2,52,210,202,24,19,137,216,64,141,179,100,160,118,17,27,216,102,140,137,248,93,7,0,0,168,25,1,26,105,87,90,81,177,77,142,179,215,239,58,26,28,171,125,185,21,21,252,240,1,0,64,150,35,64,35,237,62,51,170,247,65,27,137,108,246,187,142,134,198,202,110,26,53,170,55,143,239,6,0,32,203,17,160,145,17,71,93,187,201,186,150,135,129,36,201,186,118,207,81,215,110,242,187,14,0,0,80,55,2,52,50,98,194,240,158,7,76,192,221,232,119,29,13,133,9,184,27,39,12,239,249,169,71,128,3,0,128,236,67,128,70,198,236,46,223,183,209,9,56,140,233,173,131,19,112,182,5,203,247,241,195,6,0,0,13,4,1,26,25,51,113,212,168,50,27,142,172,183,114,43,252,174,37,91,89,185,21,54,28,89,63,106,212,168,50,191,107,1,0,0,201,33,64,35,163,206,26,118,218,230,96,32,184,214,239,58,178,85,48,16,92,123,214,176,211,248,194,37,0,0,13,8,1,26,25,87,190,191,244,67,199,50,148,163,58,39,224,108,43,15,148,126,232,119,29,0,0,32,53,4,104,100,220,248,241,3,14,187,50,171,141,180,223,239,90,178,133,145,246,187,97,179,122,252,128,1,135,253,174,5,0,0,164,134,0,141,122,113,246,176,130,98,183,210,174,150,107,195,126,215,226,59,215,134,221,74,187,250,236,97,5,60,178,27,0,128,6,136,0,141,122,51,102,228,105,31,90,163,229,126,215,225,55,107,180,124,204,200,211,24,186,1,0,64,3,69,128,70,189,58,123,104,143,101,214,58,43,252,174,195,47,214,58,43,206,30,218,99,153,223,117,0,0,128,19,71,128,70,189,50,198,216,253,161,163,203,141,236,42,191,107,169,111,70,118,213,254,208,209,229,198,24,235,119,45,0,0,224,196,17,160,81,239,46,187,172,111,249,214,64,233,18,89,119,165,223,181,212,27,235,174,220,26,40,93,114,217,101,125,203,253,46,5,0,0,156,156,160,223,5,224,212,116,205,224,193,21,115,172,93,220,108,213,182,74,25,51,76,214,54,206,63,139,198,132,101,237,138,35,67,79,91,113,141,49,124,129,18,0,128,70,160,113,134,22,52,8,19,188,64,185,228,189,21,27,203,131,166,201,80,43,183,133,223,53,165,147,145,243,73,216,45,95,57,110,88,159,213,126,215,2,0,0,210,135,33,28,240,221,184,97,125,86,187,57,225,249,198,168,196,239,90,210,197,24,149,184,57,225,249,132,103,0,0,26,31,2,52,178,194,152,129,61,183,68,14,59,243,229,170,225,63,246,219,213,218,136,227,204,31,51,176,231,22,191,75,1,0,0,233,199,16,14,100,141,177,99,11,247,73,154,55,127,229,230,61,142,2,253,37,219,217,239,154,82,99,118,186,138,172,31,123,70,207,117,126,87,2,0,0,50,135,30,104,100,157,177,67,123,174,59,18,137,188,227,186,145,229,50,42,243,187,158,58,25,149,185,174,179,252,72,36,242,206,216,161,132,103,0,0,26,59,122,160,145,149,38,12,239,121,64,210,162,185,139,183,20,229,6,35,189,141,9,246,178,70,77,253,174,43,158,177,58,106,173,54,5,195,246,227,81,163,10,183,251,93,15,0,0,168,31,4,104,100,181,115,71,157,182,93,210,246,69,107,54,111,12,71,76,79,99,237,105,142,113,90,250,89,147,177,238,97,25,179,197,4,243,54,159,53,184,211,14,63,107,1,0,0,245,143,0,141,6,97,244,224,158,59,36,237,152,179,108,243,135,77,2,225,194,96,32,55,223,117,109,183,122,155,63,218,152,176,227,152,146,112,164,34,84,238,58,69,19,134,159,118,160,94,206,11,0,0,178,14,1,26,13,74,116,104,199,1,73,171,86,108,220,209,233,208,161,178,174,57,142,58,75,129,206,114,212,44,173,39,115,117,68,50,59,43,221,240,206,86,173,242,182,15,235,211,101,87,90,143,15,0,0,26,36,2,52,26,172,104,160,221,37,73,139,23,151,228,29,209,145,14,185,142,105,27,9,154,54,198,6,90,59,198,180,72,246,225,44,70,206,39,174,181,159,88,19,57,24,8,219,3,21,174,221,223,76,205,246,140,26,213,45,251,191,196,8,0,0,234,21,1,26,141,66,52,232,110,139,190,36,73,214,90,179,100,201,246,102,21,205,34,77,131,165,225,92,183,73,78,208,113,140,145,36,215,181,214,41,175,12,135,155,7,43,114,143,4,142,142,28,217,245,136,49,198,250,85,63,0,0,104,56,8,208,104,180,162,129,184,44,250,2,0,0,72,11,230,129,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,6,0,0,0,82,64,128,78,175,128,36,27,125,125,175,142,182,157,227,218,118,200,112,93,217,224,121,29,255,188,241,175,10,73,27,37,189,32,233,11,146,154,249,85,32,0,0,64,50,8,208,153,243,160,164,161,126,23,145,133,54,75,90,24,247,90,46,41,79,210,181,146,158,145,244,166,164,46,190,85,7,0,0,80,7,2,116,230,228,72,250,157,164,38,126,23,146,101,126,38,105,76,220,107,180,164,124,73,195,229,5,234,241,146,254,44,201,248,85,32,0,0,64,109,8,208,153,117,190,164,255,242,187,136,6,192,202,235,137,254,146,164,74,73,19,37,141,170,99,159,96,166,139,2,0,0,72,132,0,157,57,63,142,190,63,44,105,192,9,236,63,88,210,175,229,5,203,67,146,214,73,122,84,210,25,9,218,198,198,83,151,72,106,47,111,252,245,60,73,251,36,173,151,244,7,73,125,163,109,123,73,250,133,164,149,146,14,72,250,64,210,61,146,90,213,80,71,167,232,246,119,163,199,43,146,244,191,146,174,80,250,123,137,63,148,244,94,244,215,177,107,214,86,199,199,75,23,72,122,68,222,152,233,74,85,13,209,142,164,41,146,94,148,180,85,222,181,120,77,210,237,74,60,174,250,210,232,49,31,147,212,63,122,220,85,58,126,77,126,20,61,183,228,245,138,63,37,105,131,164,61,242,134,153,220,168,154,255,254,180,144,116,167,164,127,75,218,37,105,147,164,231,36,93,166,212,174,217,5,242,174,247,207,83,216,7,0,0,160,118,161,80,200,134,66,33,235,119,29,81,241,95,34,60,67,94,112,181,146,222,208,167,123,76,107,251,18,225,213,146,142,68,183,45,150,244,119,121,225,46,214,254,138,90,142,181,74,210,50,121,67,37,126,37,47,64,91,121,65,238,38,121,1,113,65,116,251,239,229,5,77,43,47,108,230,84,59,238,32,121,225,207,202,11,173,47,203,11,210,177,115,61,88,247,37,57,38,246,37,194,219,235,104,247,70,180,221,77,209,229,248,0,189,60,250,190,70,222,15,0,129,104,155,38,146,254,18,215,110,78,244,243,148,198,45,119,172,118,158,88,128,94,47,239,7,148,215,36,61,32,233,143,209,101,43,233,63,146,190,27,253,245,204,232,231,125,90,222,23,31,173,142,255,144,20,175,155,188,161,40,86,222,15,28,255,80,213,107,246,123,37,223,123,62,77,199,127,48,130,15,178,236,254,2,0,64,122,100,217,63,112,213,3,116,123,29,15,160,213,135,114,212,20,160,79,147,23,252,142,200,11,121,177,30,75,71,210,93,209,246,69,170,58,182,58,254,88,191,87,213,32,220,82,210,220,184,237,191,147,148,27,183,189,163,188,64,106,37,125,38,110,125,80,210,162,232,250,239,87,59,223,120,29,15,248,201,126,81,50,153,0,157,175,227,225,117,124,116,93,124,128,158,171,227,61,233,241,126,16,221,62,95,82,239,184,245,29,228,205,238,97,229,245,154,199,247,254,198,2,116,124,88,143,233,47,47,252,214,180,125,116,116,253,17,121,61,244,49,65,121,129,217,202,27,199,221,58,110,219,32,121,161,223,74,250,90,130,207,144,72,55,121,255,155,112,110,146,237,145,102,89,118,127,1,0,32,61,178,236,31,184,234,1,90,242,198,243,90,121,193,176,79,92,219,154,2,244,112,73,247,43,113,208,116,36,237,136,238,115,122,13,199,234,148,96,191,235,116,124,202,184,118,9,182,255,88,199,131,114,76,187,104,29,63,85,213,192,29,243,68,116,159,155,19,108,75,164,174,0,221,91,210,171,209,54,139,226,206,25,31,160,7,39,216,175,139,142,135,249,97,9,182,183,151,55,236,194,74,58,39,110,125,44,64,191,171,196,195,42,98,255,123,240,102,13,245,190,19,221,126,126,220,186,207,70,215,109,146,55,179,72,117,231,69,183,239,209,241,225,33,200,98,89,118,127,1,0,100,9,190,136,149,121,175,74,122,82,210,173,242,198,52,79,145,20,169,165,253,178,232,43,17,87,222,52,112,157,229,141,179,77,164,44,193,186,237,209,247,197,242,122,86,171,219,19,125,143,15,215,251,36,221,87,75,157,177,99,214,52,118,186,38,119,203,11,244,49,70,94,79,107,255,232,242,122,121,61,190,21,9,246,45,78,176,238,124,73,77,229,93,231,21,9,182,239,149,244,184,164,123,37,93,34,47,48,199,59,32,47,212,86,87,20,125,95,144,96,155,116,124,88,69,155,184,117,151,69,223,31,85,226,223,135,185,209,227,141,145,52,78,210,255,213,112,108,0,0,144,197,8,208,245,227,71,242,122,39,39,202,11,135,79,37,177,207,104,73,215,200,27,202,208,71,94,79,106,188,84,190,140,22,11,236,225,26,182,199,2,100,162,63,15,167,73,186,94,210,133,242,134,33,116,61,137,58,36,47,40,247,143,91,174,148,23,198,103,202,27,255,252,191,146,246,167,112,188,126,209,247,197,181,180,89,25,125,31,146,194,113,35,213,222,171,139,93,179,64,220,186,216,255,58,172,174,101,159,247,229,5,232,68,67,81,0,0,64,3,64,128,174,31,59,37,125,83,222,151,1,127,37,239,203,105,71,107,105,63,77,210,79,228,245,98,190,36,47,88,30,138,110,251,186,164,238,25,171,180,170,43,228,5,218,60,73,255,148,244,87,29,31,27,124,137,170,142,153,78,214,151,229,13,255,72,151,88,79,252,174,90,218,236,142,190,39,26,190,146,78,177,97,25,123,107,105,115,162,61,247,0,0,32,75,16,160,235,207,203,242,198,1,223,32,111,202,180,111,212,208,238,2,121,225,121,133,188,0,91,125,216,194,231,84,63,1,186,147,188,39,3,74,222,151,216,170,15,125,104,173,19,11,208,233,246,73,244,189,250,44,27,241,98,189,247,169,244,108,159,136,216,241,107,11,234,157,163,239,135,51,92,11,0,0,200,16,230,129,174,63,177,47,233,237,150,23,130,111,172,161,221,133,209,247,39,149,120,204,111,125,57,75,94,143,234,235,250,116,120,206,38,31,69,223,71,214,210,38,246,229,195,149,181,180,73,135,229,213,206,87,157,209,241,7,196,124,84,67,27,0,0,144,229,8,208,245,171,88,222,151,232,164,154,231,80,142,13,73,72,244,240,143,124,85,157,166,45,147,242,170,189,199,203,145,23,176,179,193,59,242,134,195,76,82,226,41,245,90,75,250,106,244,215,111,100,184,150,215,162,239,119,41,241,239,223,217,242,122,243,247,235,248,3,99,0,0,64,3,67,128,174,127,207,73,154,161,79,63,180,36,102,73,244,253,155,146,206,148,215,107,233,200,251,226,217,44,29,31,170,144,40,216,166,211,170,232,251,103,229,125,241,49,54,220,167,143,188,177,208,23,71,151,155,103,184,142,186,108,151,244,80,244,215,143,169,234,84,129,29,36,253,183,188,97,19,47,202,123,58,99,38,253,75,94,143,125,111,73,191,85,213,25,58,6,70,107,145,188,33,58,201,12,39,233,34,233,219,242,130,55,0,0,200,18,4,232,250,231,202,235,133,62,88,195,246,191,203,11,98,93,229,205,135,188,93,222,52,115,243,163,219,99,179,77,116,201,96,141,146,180,86,199,131,233,211,242,190,60,88,44,239,113,214,151,74,154,29,221,86,144,225,58,146,241,136,188,80,63,78,94,125,115,229,205,223,188,85,210,212,232,114,236,33,52,153,20,150,55,207,245,7,242,190,44,185,69,94,175,247,124,121,215,115,184,188,41,238,30,79,242,120,119,202,251,210,233,243,105,175,20,0,0,156,48,190,68,232,143,205,242,30,17,253,231,4,219,142,72,186,74,222,176,131,207,203,155,238,108,131,188,217,48,158,144,247,152,239,139,84,245,41,119,153,242,99,121,83,178,221,34,175,55,188,84,222,92,214,143,202,11,240,165,202,142,31,194,142,74,186,77,222,92,208,215,201,27,94,210,68,94,143,243,203,146,158,85,226,121,153,51,161,88,222,56,246,155,228,205,249,61,92,222,117,122,65,222,255,62,196,158,84,152,140,121,146,66,242,126,239,1,0,0,210,131,39,133,1,200,20,238,47,0,128,68,178,161,247,16,0,0,0,104,48,8,208,0,0,0,64,10,8,208,0,0,0,64,10,8,208,0,0,0,64,10,8,208,0,0,0,64,10,8,208,0,0,0,64,10,8,208,0,0,0,64,10,8,208,0,0,0,64,10,8,208,0,0,0,64,10,8,208,0,0,0,64,10,8,208,217,235,38,73,235,37,45,151,116,121,26,143,105,227,94,183,164,233,184,56,113,119,171,234,239,201,68,127,203,1,0,0,117,9,250,93,64,35,51,72,210,154,26,182,109,147,180,69,210,60,73,255,146,244,142,188,192,148,72,129,164,167,227,150,167,75,234,38,233,147,244,148,217,104,181,144,244,57,73,151,74,58,67,82,87,73,219,37,45,145,244,186,164,25,146,14,251,86,29,0,0,104,20,8,208,245,167,123,244,117,174,164,31,202,11,116,223,146,180,46,65,219,234,191,47,77,37,5,50,90,93,195,119,134,164,23,36,245,175,182,190,165,164,126,146,174,151,244,237,232,251,135,41,28,183,173,188,80,30,83,34,233,31,39,94,38,0,0,104,232,24,194,225,159,207,74,122,91,210,248,4,219,182,200,251,175,253,195,146,246,74,186,85,210,193,250,43,173,193,233,35,239,7,146,234,225,185,186,97,146,94,150,212,42,133,99,183,151,244,231,184,215,212,19,41,16,0,0,52,30,4,232,204,250,72,210,69,209,215,21,146,190,33,105,89,220,246,206,146,94,148,212,51,193,190,191,150,212,46,218,230,111,153,45,179,193,251,127,242,174,83,204,63,37,77,144,52,88,210,23,37,237,142,219,54,80,210,231,235,175,52,0,0,208,216,48,132,35,179,14,75,122,171,218,186,39,36,253,94,210,109,209,229,174,146,30,145,116,117,130,253,195,153,43,173,209,24,32,105,74,220,242,106,121,67,46,142,68,151,215,70,223,227,199,148,159,39,233,201,204,151,6,0,0,26,35,122,160,235,223,17,121,195,51,54,198,173,187,74,210,153,113,203,1,85,157,153,161,184,134,99,13,151,215,251,186,80,210,62,73,59,228,125,57,241,1,121,189,175,169,154,84,237,188,21,146,46,72,208,238,244,232,57,230,69,207,185,85,210,191,37,125,79,82,97,13,199,158,17,119,220,205,209,117,227,36,253,73,222,56,240,125,146,230,74,186,75,82,179,20,106,62,163,218,242,95,117,60,60,199,204,171,182,220,37,137,227,94,28,173,117,67,181,245,215,235,248,231,24,93,109,91,75,121,61,222,211,229,205,160,114,40,186,255,179,242,66,125,110,18,231,149,188,107,248,176,164,149,242,174,203,124,121,215,182,109,130,182,175,170,234,239,89,183,4,109,226,183,239,137,91,63,166,218,182,235,36,181,150,244,117,73,255,145,180,75,210,38,121,63,244,13,79,178,118,0,0,144,237,66,161,144,13,133,66,53,205,102,81,223,6,169,106,32,89,92,75,219,239,87,107,123,79,220,182,100,2,244,183,171,181,73,244,186,91,146,137,219,167,182,105,236,134,203,11,124,241,219,111,174,118,78,35,47,200,213,118,206,67,146,174,73,80,239,140,106,237,126,88,203,49,254,33,169,73,130,99,36,50,44,250,57,98,175,65,9,218,244,169,118,252,233,73,28,55,22,160,107,123,197,7,232,51,228,205,192,82,91,251,183,84,117,168,137,244,233,105,236,126,33,47,184,38,218,127,169,164,14,213,246,79,103,128,254,173,188,208,158,232,220,21,146,46,73,112,236,70,45,203,238,47,0,0,164,71,150,253,3,151,74,128,190,160,90,219,215,226,182,213,21,160,167,84,219,126,68,210,27,242,122,90,171,7,159,107,227,246,171,41,64,231,203,235,41,141,223,118,127,130,154,191,158,224,248,53,189,62,91,109,223,234,1,186,174,215,13,9,206,127,162,190,82,237,216,95,75,98,159,241,146,22,200,27,179,94,61,128,46,136,190,134,69,219,118,149,247,123,20,223,174,84,94,79,123,245,207,53,83,85,127,168,169,30,160,235,122,61,92,173,206,116,6,232,186,94,107,149,124,47,122,163,144,101,247,23,0,0,210,35,203,254,129,75,37,64,15,168,214,54,126,168,64,93,1,250,173,184,109,187,164,255,223,222,189,7,73,86,213,119,0,255,222,217,101,125,0,10,168,224,62,36,168,104,32,4,44,21,163,17,141,148,134,196,40,193,242,17,43,90,22,26,149,36,104,66,20,98,0,31,133,10,49,98,18,45,140,196,148,154,68,240,81,162,41,48,150,198,71,52,160,165,137,49,62,66,20,21,35,186,184,115,123,100,81,151,71,64,89,102,231,230,143,219,45,183,239,246,204,110,239,206,238,237,233,253,124,170,186,102,206,125,254,122,88,206,252,230,244,239,158,147,135,52,246,253,102,235,220,47,53,246,141,74,160,15,104,93,175,74,114,105,182,175,143,63,50,245,40,100,51,65,60,61,245,67,121,15,75,114,65,235,26,223,239,95,123,160,157,64,127,47,245,195,124,191,148,228,241,73,62,50,34,134,229,112,255,12,39,183,55,101,116,146,185,152,246,232,245,251,71,28,211,254,52,224,130,212,83,15,38,201,131,146,124,189,181,255,184,198,185,237,4,250,166,212,9,255,49,73,142,79,61,42,220,220,223,203,112,233,213,114,39,208,23,167,30,89,63,54,201,105,25,254,111,94,101,251,146,153,169,54,97,253,11,0,19,194,67,132,221,105,215,233,254,66,234,145,201,157,249,101,221,172,71,189,38,195,201,247,39,83,215,69,55,147,215,253,146,220,57,226,58,171,146,188,37,195,117,206,87,38,121,73,182,127,128,241,121,253,235,12,188,42,201,219,27,237,171,83,143,196,190,176,223,62,34,245,204,35,31,88,228,61,60,55,117,237,246,64,47,195,171,240,29,187,200,121,227,184,91,234,132,112,125,99,219,217,253,123,45,167,111,101,120,84,251,242,36,63,235,127,255,189,212,211,223,189,181,177,255,168,212,165,18,163,156,153,228,31,26,237,171,83,143,230,15,166,232,91,155,250,143,130,229,126,15,73,242,79,169,107,208,7,255,6,191,158,58,145,255,147,198,49,135,167,94,29,19,0,246,89,18,232,238,236,206,168,214,215,114,87,210,123,98,146,243,146,188,47,201,117,253,235,158,189,147,215,57,35,195,137,234,181,169,19,229,81,43,30,158,220,106,95,49,226,152,75,114,87,2,157,212,179,93,44,150,64,151,173,246,245,173,118,187,86,120,92,69,234,114,135,103,52,182,189,55,245,3,113,203,237,227,173,246,189,83,39,201,247,76,253,255,216,125,90,251,151,154,135,250,198,86,251,206,212,73,116,115,142,235,3,119,33,198,157,241,189,108,255,239,242,59,173,246,158,186,55,0,172,24,18,232,238,28,208,106,95,159,157,79,170,255,50,195,163,198,175,237,191,174,75,93,10,241,217,36,159,202,246,163,220,109,237,81,222,15,103,244,200,230,126,73,30,217,104,223,156,122,105,242,182,118,178,117,212,14,238,223,212,30,241,222,157,90,219,34,245,31,21,103,54,182,125,33,245,31,12,11,187,113,221,165,172,73,93,111,254,194,212,127,212,44,165,216,193,254,182,59,90,237,189,185,42,101,251,147,11,43,98,2,176,207,51,141,93,119,54,180,218,215,141,113,238,39,82,47,20,242,133,214,246,7,167,94,30,252,195,169,63,126,127,126,198,75,214,206,206,240,116,122,3,251,183,218,131,135,227,218,110,109,181,219,51,70,236,45,103,165,78,160,7,190,149,122,138,182,45,123,232,126,7,164,94,16,231,210,236,56,121,6,0,86,56,9,116,119,30,219,106,127,118,204,243,175,74,157,172,157,152,122,198,140,175,181,246,63,56,245,156,200,47,29,243,186,23,167,46,61,104,106,143,100,175,93,228,220,123,183,218,63,26,121,212,158,117,122,234,17,250,129,141,169,103,45,89,108,46,237,229,240,146,212,115,104,15,92,158,250,65,193,123,166,254,3,230,249,123,240,222,0,192,94,38,129,238,198,125,115,215,74,132,3,159,222,133,235,204,167,78,188,207,75,242,136,212,15,120,181,235,159,207,206,226,31,187,223,153,58,241,187,172,177,237,81,25,46,125,72,234,18,130,171,27,237,195,50,252,96,222,192,145,173,246,181,139,5,190,135,156,154,228,111,27,237,50,245,131,137,123,58,142,23,53,190,191,51,201,239,167,254,4,96,71,37,52,203,161,93,146,162,196,2,0,246,48,9,244,222,119,96,182,159,25,226,159,147,252,215,78,158,255,219,169,103,112,24,188,78,106,236,219,148,122,6,142,230,3,126,27,178,248,67,107,231,166,174,153,62,39,117,93,243,192,249,25,174,121,78,146,143,182,218,207,26,113,189,246,220,205,227,142,170,239,142,103,102,120,185,238,27,82,255,172,190,177,155,215,109,151,170,180,87,73,188,91,146,135,54,218,101,146,31,183,142,89,234,161,193,221,117,115,171,125,120,171,189,51,171,46,2,0,99,240,16,225,158,117,64,234,185,118,7,223,31,157,228,15,251,95,7,110,72,242,167,99,92,243,91,25,126,248,239,236,212,83,217,13,30,254,91,151,225,101,188,111,200,246,181,201,3,63,233,127,221,152,122,101,192,139,27,251,222,150,250,65,197,193,40,234,123,82,79,93,55,240,134,212,115,4,95,149,250,223,209,51,82,207,95,60,240,131,108,159,116,239,41,191,149,237,87,23,124,121,234,154,231,35,22,57,231,166,254,107,71,218,51,146,60,41,201,41,169,75,66,230,250,175,141,141,251,28,145,122,5,199,203,82,39,215,39,167,158,23,122,79,249,118,171,253,198,36,175,73,253,223,253,33,73,94,189,7,239,13,0,172,68,19,182,208,65,123,33,149,29,189,126,148,228,215,70,92,103,71,11,169,180,23,45,249,105,234,249,155,63,147,122,129,147,230,190,102,114,190,212,82,222,107,82,143,24,55,247,159,219,186,239,56,171,230,61,181,117,110,123,33,149,7,140,120,223,139,45,248,177,148,131,179,253,123,222,153,215,105,59,121,253,34,245,10,124,163,174,241,204,254,49,231,142,121,239,230,188,202,237,159,105,115,46,236,129,75,91,199,52,151,43,127,196,152,247,94,106,33,149,11,71,220,251,180,214,49,167,142,56,102,106,77,88,255,2,192,132,80,194,209,157,79,165,78,158,63,183,11,231,190,62,195,11,115,220,61,245,195,132,79,204,240,3,128,127,213,58,110,41,91,83,143,218,54,189,46,195,139,182,188,37,195,163,208,163,220,158,228,57,73,62,182,147,247,221,93,107,178,253,67,143,203,169,74,253,115,88,202,227,109,36,41,0,0,20,89,73,68,65,84,91,83,63,56,184,152,118,121,206,238,206,113,221,244,213,12,207,56,210,118,85,234,122,108,0,96,153,72,160,247,158,31,164,78,150,223,144,122,10,186,39,167,30,217,220,21,91,83,143,98,62,62,201,69,73,190,146,186,92,225,198,36,255,145,186,14,250,209,73,94,209,63,118,103,125,53,195,229,6,251,37,249,155,220,85,247,187,208,143,255,184,36,127,222,191,215,141,169,235,126,175,76,61,18,123,116,22,95,60,101,165,186,44,201,227,82,47,86,115,109,234,247,124,85,238,90,12,230,182,212,211,228,61,47,117,217,202,141,169,75,40,62,156,122,185,242,167,164,254,195,98,224,228,140,63,23,244,82,94,223,191,199,7,251,49,221,152,228,95,83,207,72,114,114,246,254,195,156,0,192,36,243,17,43,176,167,232,95,0,24,197,8,52,0,0,140,65,2,13,0,0,99,144,64,3,0,192,24,36,208,0,0,48,6,9,52,0,0,140,65,2,13,0,0,99,144,64,3,0,192,24,36,208,0,0,48,6,9,52,0,0,140,65,2,13,0,0,99,144,64,175,60,167,38,169,26,175,223,235,54,28,0,128,125,139,4,26,0,0,198,176,186,235,0,166,208,147,146,60,168,209,254,104,146,185,142,98,1,0,96,153,73,160,151,223,41,73,206,104,180,143,143,4,26,0,96,106,40,225,0,0,128,49,72,160,1,0,96,12,18,232,229,243,185,212,179,98,156,209,218,254,229,254,246,15,142,56,231,151,147,156,159,228,243,73,126,152,228,250,36,159,78,242,103,73,30,176,139,113,60,45,195,179,116,108,77,242,196,214,49,69,146,147,146,188,45,201,215,146,252,36,201,181,73,62,148,228,69,73,14,216,197,123,3,0,48,233,202,178,172,202,178,172,186,142,35,119,37,208,139,189,154,9,116,145,58,73,94,234,248,91,146,60,123,196,125,150,154,198,238,225,253,243,154,251,95,208,58,255,192,36,239,219,193,189,175,77,114,220,88,239,30,166,208,4,245,47,0,76,16,35,208,203,103,99,146,47,38,185,161,181,253,235,253,237,189,198,182,63,78,114,225,14,174,119,96,146,203,146,60,121,39,239,191,62,117,146,126,96,99,219,249,73,222,221,104,175,74,242,206,36,207,221,193,181,30,154,228,19,217,245,81,112,0,0,38,213,4,142,16,93,148,225,209,220,71,182,246,31,153,186,172,98,176,255,182,36,167,39,57,58,201,195,146,92,208,58,255,251,25,46,169,24,53,2,125,64,146,207,180,182,95,154,237,103,89,121,118,235,152,111,167,158,53,228,161,73,126,53,117,2,222,220,255,222,93,252,25,192,84,152,192,254,5,0,118,223,4,254,130,219,81,2,253,218,214,254,151,141,184,198,223,183,142,249,221,198,190,118,2,253,226,212,163,202,205,109,255,150,209,117,204,159,111,29,247,216,214,254,253,83,151,111,52,143,121,200,210,111,23,166,215,4,246,47,0,76,0,37,28,123,223,201,173,246,21,35,142,185,164,213,126,194,18,215,59,35,117,18,61,112,109,146,231,37,249,191,214,113,235,146,156,208,104,95,157,186,180,164,233,182,36,239,106,109,123,244,18,247,6,0,216,231,72,160,247,174,253,50,60,34,125,115,146,31,140,56,238,59,173,246,81,75,92,243,216,86,251,195,25,174,183,30,88,223,106,127,57,201,194,136,227,174,105,181,143,88,226,222,0,0,251,28,9,244,222,181,127,171,253,253,212,101,18,109,183,182,218,247,29,227,30,103,39,121,212,136,237,237,146,142,27,23,57,255,150,86,251,94,99,220,27,0,96,234,73,160,247,174,159,182,218,107,23,57,238,222,173,246,143,198,188,207,197,73,238,217,218,118,123,171,125,208,34,231,30,220,106,183,19,106,0,128,125,154,4,122,239,186,35,117,237,241,192,97,217,190,180,34,169,103,234,104,186,118,137,107,222,153,122,241,148,203,26,219,30,149,228,204,214,113,237,178,142,227,83,207,71,221,214,46,23,185,126,137,123,3,0,236,115,36,208,203,175,93,146,177,166,213,254,104,171,253,172,17,215,104,207,211,252,217,37,238,119,110,146,143,36,57,39,117,77,245,192,249,25,174,183,222,148,228,63,27,237,227,147,60,166,117,173,123,100,120,97,150,180,206,1,0,216,231,73,160,151,95,187,228,225,69,169,147,213,65,93,242,123,90,251,223,144,187,230,129,62,54,201,121,73,254,160,177,255,7,217,62,233,110,250,73,255,235,198,36,175,108,237,123,91,234,164,120,224,162,214,254,127,76,61,15,244,67,82,207,182,241,174,126,28,3,31,200,246,15,52,2,0,176,146,77,224,60,173,207,202,232,229,177,191,221,56,230,172,69,142,25,245,122,106,235,250,75,45,229,189,38,245,104,117,115,255,185,141,253,171,147,92,190,147,247,253,97,204,192,193,62,110,2,251,23,0,38,128,17,232,229,247,241,236,184,236,225,45,73,94,181,131,99,110,79,242,156,36,31,27,227,222,91,147,188,188,181,237,117,73,30,222,255,126,62,117,194,253,193,29,92,231,187,169,151,16,223,56,198,189,1,0,88,9,38,116,132,232,222,73,94,145,228,202,212,51,104,92,155,228,173,35,142,59,54,245,210,221,255,158,100,115,146,217,212,171,8,158,147,228,240,69,174,189,212,8,244,192,249,173,99,62,159,225,82,142,34,201,111,164,158,173,227,191,147,220,148,58,105,190,34,201,105,73,14,220,169,119,9,83,110,66,251,23,0,216,61,126,193,1,123,138,254,5,128,81,148,112,0,0,192,24,36,208,0,0,48,6,9,52,0,0,140,65,2,13,0,0,99,144,64,3,0,192,24,36,208,0,0,48,6,9,52,0,0,140,65,2,13,0,0,99,144,64,3,0,192,24,36,208,0,0,48,6,9,52,0,0,140,65,2,13,0,0,99,144,64,3,0,192,24,36,208,0,0,48,6,9,52,0,0,140,65,2,13,0,0,99,144,64,3,0,192,24,36,208,0,0,48,6,9,52,0,0,140,65,2,13,0,0,99,88,241,9,116,81,20,243,73,114,229,149,87,174,238,58,22,96,122,12,250,148,65,31,3,0,3,43,62,129,174,170,234,246,36,57,252,240,195,247,239,58,22,96,122,12,250,148,65,31,3,0,3,43,62,129,78,178,37,73,246,223,127,255,67,186,14,4,152,30,141,62,101,75,167,129,0,48,113,86,124,2,93,85,213,15,147,100,219,182,109,107,187,142,5,152,30,131,62,101,208,199,0,192,192,138,79,160,139,162,184,62,73,22,22,22,30,216,117,44,192,244,24,244,41,131,62,6,0,6,166,33,129,254,223,254,215,95,236,58,22,96,122,12,250,148,65,31,3,0,3,43,62,129,174,170,234,27,73,82,20,197,113,93,199,2,76,143,65,159,50,232,99,0,96,96,26,18,232,175,246,191,62,170,235,88,128,233,49,232,83,6,125,12,0,12,172,248,4,122,195,134,13,223,73,210,43,138,98,93,175,215,59,186,235,120,128,149,175,215,235,29,93,20,197,186,36,189,126,31,3,0,63,183,226,19,232,190,171,146,164,170,170,95,239,58,16,96,229,107,244,37,87,117,26,8,0,19,105,42,18,232,153,153,153,79,246,191,125,106,167,129,0,211,226,169,201,80,223,2,0,63,87,116,29,192,114,184,233,166,155,14,190,237,182,219,126,146,36,251,237,183,223,218,67,15,61,212,188,173,192,46,217,188,121,243,253,239,188,243,206,185,164,94,76,229,160,131,14,178,144,10,0,67,166,98,4,250,160,131,14,218,82,20,197,21,73,50,63,63,255,156,174,227,1,86,174,65,31,82,20,197,21,146,103,0,70,153,138,4,58,73,22,22,22,222,159,36,85,85,189,160,235,88,128,149,107,208,135,12,250,20,0,152,106,189,94,239,186,178,44,171,178,44,79,233,58,22,96,229,41,203,242,148,178,44,171,94,175,119,93,215,177,0,48,185,166,102,4,58,73,170,170,250,187,254,183,103,116,26,8,176,82,157,145,12,245,37,0,48,221,170,170,90,83,150,229,230,254,40,244,211,186,142,7,88,57,202,178,124,90,191,239,216,92,85,213,154,174,227,1,96,114,77,213,8,116,81,20,91,147,188,169,223,124,117,151,177,0,43,206,160,207,120,83,191,47,1,128,125,71,89,150,223,44,203,178,154,157,157,61,171,235,88,128,201,55,59,59,123,86,127,244,249,155,93,199,2,192,228,155,170,17,232,129,162,40,94,221,255,122,97,175,215,59,170,235,120,128,201,213,235,245,142,42,138,226,194,228,174,190,3,0,150,50,149,9,244,186,117,235,46,79,242,238,36,171,170,170,122,107,215,241,0,147,171,223,71,172,74,242,238,126,223,1,0,75,154,202,4,58,73,238,113,143,123,188,44,201,198,36,39,205,206,206,254,121,215,241,0,147,167,223,55,156,148,100,99,191,207,0,128,29,154,218,4,250,144,67,14,185,121,97,97,225,244,36,41,138,226,149,115,115,115,167,118,29,19,48,57,230,230,230,78,45,138,226,149,73,178,176,176,112,250,33,135,28,114,115,215,49,1,192,68,104,60,28,84,149,101,121,82,215,241,0,221,43,203,242,164,65,191,224,97,99,0,24,161,44,203,139,250,191,44,111,45,203,242,132,174,227,1,186,83,150,229,9,253,190,160,42,203,242,162,174,227,1,128,137,213,235,245,46,233,255,194,220,178,105,211,166,39,116,29,15,176,247,109,218,180,233,9,101,89,110,233,47,215,125,73,215,241,0,192,196,43,203,242,125,253,143,108,183,246,122,189,167,119,29,15,176,247,244,122,189,167,207,206,206,110,237,255,33,253,190,174,227,1,128,21,163,215,235,189,99,80,251,216,235,245,94,222,117,60,192,158,215,235,245,94,222,248,255,254,29,93,199,3,192,202,86,116,29,64,23,102,103,103,207,111,44,152,240,238,162,40,94,186,110,221,186,219,59,13,10,88,118,189,94,239,158,85,85,93,156,228,5,73,82,85,213,5,27,54,108,120,77,199,97,1,176,194,237,147,9,116,146,204,206,206,158,154,228,157,69,81,172,73,242,221,36,103,173,95,191,254,35,29,135,5,44,147,178,44,79,73,242,215,73,142,172,170,106,107,146,211,54,108,216,112,105,199,97,1,48,5,246,217,4,58,73,230,230,230,142,217,182,109,219,219,138,162,56,49,73,170,170,186,100,213,170,85,175,93,187,118,237,198,174,99,3,118,205,220,220,220,17,219,182,109,123,109,81,20,207,79,146,170,170,174,90,181,106,213,31,173,93,187,246,154,174,99,3,96,58,236,211,9,244,64,175,215,59,167,170,170,191,104,108,122,227,204,204,204,155,215,174,93,123,99,103,65,1,99,153,155,155,187,223,194,194,194,153,73,206,25,108,43,138,226,220,117,235,214,189,177,195,176,0,152,66,18,232,190,205,155,55,31,57,63,63,127,94,85,85,207,75,146,162,40,230,171,170,122,251,234,213,171,223,117,216,97,135,253,79,215,241,1,163,221,112,195,13,199,205,207,207,191,184,40,138,211,171,170,90,157,36,69,81,188,119,245,234,213,175,59,244,208,67,191,219,117,124,0,76,31,9,116,75,89,150,39,20,69,113,102,85,85,207,24,108,171,170,234,179,69,81,124,40,201,71,214,175,95,191,169,195,240,128,36,101,89,62,32,201,41,85,85,253,78,81,20,63,159,215,189,40,138,203,171,170,122,243,250,245,235,191,208,97,120,0,76,57,9,244,34,202,178,124,120,85,85,167,21,69,113,106,146,253,27,187,190,156,228,170,133,133,133,47,174,94,189,250,43,234,165,97,207,155,155,155,59,98,126,126,254,145,51,51,51,143,73,114,98,146,227,27,187,111,171,170,234,210,162,40,222,185,126,253,250,175,117,20,34,0,251,16,9,244,14,92,115,205,53,107,14,62,248,224,103,47,44,44,60,189,40,138,167,36,185,123,115,127,81,20,183,84,85,117,93,146,217,36,55,86,85,117,75,81,20,119,36,169,186,136,23,86,184,162,170,170,187,21,69,113,175,36,247,75,178,161,40,138,7,87,85,117,175,214,113,63,171,170,234,95,102,102,102,174,216,178,101,203,7,143,57,230,152,173,29,196,10,192,62,74,2,61,134,170,170,102,122,189,222,147,146,60,46,201,175,20,69,241,176,170,170,214,118,29,23,76,187,162,40,230,170,170,186,58,201,151,146,124,126,221,186,117,159,41,138,98,161,235,184,0,216,55,73,160,119,211,236,236,236,125,102,102,102,30,56,63,63,191,190,40,138,251,174,90,181,234,192,170,170,238,182,176,176,224,103,11,59,97,102,102,102,232,211,154,162,40,238,216,182,109,219,173,85,85,253,104,245,234,213,229,194,194,194,247,55,108,216,240,227,174,226,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,226,252,63,85,93,82,111,92,100,66,5,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":30844,"duration_micros":2254,"top":348.70587158203125,"left":390.0,"width":282.0,"height":331.76470947265625,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,124,21,213,253,255,241,247,153,123,19,32,236,75,88,178,32,171,130,108,130,40,139,168,32,117,41,46,8,182,86,164,174,213,238,253,214,95,237,183,181,59,106,237,183,173,118,113,249,234,183,85,107,181,138,173,85,64,108,235,214,138,43,32,178,11,8,130,108,201,13,75,216,151,64,146,123,231,252,254,152,123,225,38,100,185,193,155,204,189,55,175,231,227,145,199,205,204,156,153,249,100,124,56,121,231,112,230,140,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,238,140,223,5,0,0,80,157,181,182,197,214,173,91,243,29,199,233,98,140,105,107,173,109,97,140,225,119,22,208,64,214,90,107,140,41,183,214,30,116,93,119,87,207,158,61,67,198,152,114,191,235,74,119,220,140,0,0,190,42,45,45,237,17,14,135,199,185,174,123,182,164,97,146,6,72,42,244,185,44,32,147,21,73,90,43,105,133,227,56,139,130,193,224,187,185,185,185,219,252,46,42,157,16,160,1,0,77,46,20,10,141,48,198,92,105,173,157,36,233,204,26,154,132,37,21,91,107,75,141,49,7,172,181,229,142,227,216,38,46,19,72,123,174,235,26,99,76,11,107,109,59,99,76,174,164,2,73,193,26,154,46,49,198,252,203,90,59,39,63,63,127,105,19,151,153,118,8,208,0,128,38,177,105,211,166,150,217,217,217,183,24,99,174,183,214,158,21,183,233,136,164,183,36,45,148,180,52,24,12,174,238,214,173,219,70,127,170,4,50,223,142,29,59,250,132,195,225,65,146,70,72,26,45,233,124,73,173,98,219,141,49,31,88,107,159,170,168,168,120,172,119,239,222,71,253,170,51,149,17,160,1,0,141,170,184,184,184,179,164,239,24,99,190,41,169,93,116,117,169,181,246,121,107,237,220,194,194,194,87,252,171,14,128,36,21,21,21,93,98,140,185,194,24,243,57,73,185,209,213,7,172,181,15,73,250,109,65,65,193,110,31,203,75,57,4,104,0,64,163,41,41,41,249,177,181,246,135,58,222,187,245,111,73,143,231,231,231,255,213,199,178,0,212,33,20,10,93,35,233,75,146,62,19,93,117,196,24,243,139,188,188,188,159,251,88,86,74,33,64,3,0,146,174,164,164,100,170,235,186,255,99,140,57,53,186,106,78,36,18,249,93,207,158,61,223,246,181,48,0,9,219,186,117,235,121,129,64,224,255,73,186,82,146,172,181,31,59,142,243,131,188,188,188,89,62,151,230,59,2,52,0,32,105,214,175,95,223,34,39,39,231,65,73,183,70,87,45,48,198,220,153,151,151,247,170,159,117,1,56,121,37,37,37,23,91,107,127,38,105,76,116,213,163,101,101,101,223,234,223,191,127,179,157,14,143,0,13,0,72,138,80,40,52,86,210,163,146,78,143,174,250,239,252,252,252,251,124,44,9,64,18,133,66,161,239,74,186,55,186,184,70,210,173,249,249,249,243,125,44,201,55,4,104,0,192,167,86,92,92,124,163,49,230,137,232,226,187,214,218,111,22,20,20,172,240,181,40,0,73,87,92,92,60,204,24,243,144,164,113,146,100,173,189,169,160,160,224,207,62,151,5,0,64,122,41,41,41,249,65,40,20,178,209,175,135,252,174,7,64,227,11,133,66,15,197,254,191,47,41,41,249,129,223,245,0,0,144,54,138,139,139,239,137,253,18,45,46,46,190,221,239,122,0,52,157,226,226,226,219,227,254,255,191,199,239,122,0,0,72,121,197,197,197,119,199,253,242,188,209,239,122,0,52,189,226,226,226,27,227,238,3,119,251,93,15,0,0,41,43,190,231,169,168,168,104,186,223,245,0,240,79,81,81,209,116,254,37,10,0,128,58,132,66,161,47,196,141,121,190,197,239,122,0,248,47,20,10,221,18,119,95,248,130,223,245,0,0,144,50,138,138,138,134,132,66,161,178,232,131,67,63,242,187,30,0,169,163,164,164,228,71,209,0,93,86,84,84,52,196,239,122,0,0,72,9,161,80,232,189,232,63,211,62,233,119,45,0,82,79,113,113,241,147,209,16,253,158,223,181,52,38,199,239,2,0,0,233,161,164,164,228,23,146,198,74,90,189,127,255,254,91,235,107,15,160,249,137,222,27,86,75,26,27,189,103,100,36,94,164,2,0,168,87,40,20,58,71,210,187,146,228,56,206,5,61,122,244,152,231,115,73,0,82,212,182,109,219,38,184,174,251,70,116,113,92,126,126,126,198,245,70,211,3,13,0,168,151,181,246,231,146,228,186,238,125,132,103,0,117,233,209,163,199,60,215,117,239,147,142,223,59,0,0,104,86,138,139,139,111,136,142,105,220,98,173,205,242,187,30,0,169,207,90,155,21,10,133,182,68,159,153,184,193,239,122,146,141,30,104,0,64,157,140,49,223,143,126,123,183,49,166,210,215,98,0,164,133,232,189,226,238,232,247,223,175,167,57,0,0,153,35,20,10,221,28,237,125,94,238,119,45,0,210,79,40,20,90,30,189,135,220,236,119,45,201,68,15,52,0,160,46,95,139,126,222,239,107,21,0,210,85,236,222,241,181,58,91,1,0,144,9,138,139,139,39,70,123,142,182,250,93,11,128,244,21,10,133,182,70,199,66,79,244,187,150,100,161,7,26,0,80,35,99,204,23,37,201,90,251,103,191,107,1,144,190,98,247,144,216,61,37,19,16,160,1,0,39,176,214,6,36,93,45,73,198,152,103,124,46,7,64,26,139,187,135,92,29,189,183,164,61,2,52,0,224,4,219,182,109,187,66,82,142,164,249,249,249,249,235,252,174,7,64,250,138,222,67,230,75,202,137,222,91,210,30,1,26,0,112,2,215,117,47,145,36,107,237,63,253,174,5,64,250,139,221,75,98,247,150,116,71,128,6,0,156,192,24,51,65,146,2,129,192,235,126,215,2,32,253,197,238,37,177,123,75,186,51,126,23,0,0,72,45,161,80,168,80,210,86,107,237,190,130,130,130,142,126,215,3,32,51,20,23,23,239,53,198,116,144,212,51,63,63,191,200,239,122,62,13,122,160,1,0,85,24,99,206,140,126,46,242,187,22,0,153,35,118,79,137,221,99,210,25,1,26,0,80,133,235,186,67,162,223,242,246,65,0,201,180,92,170,114,143,73,91,4,104,0,64,21,142,227,156,26,253,118,173,175,133,0,200,52,107,165,42,247,152,180,21,244,187,0,0,64,106,177,214,246,146,36,199,113,54,250,93,11,144,78,198,207,155,17,236,176,239,180,2,39,16,201,117,35,106,103,141,105,33,73,198,218,114,39,160,3,110,36,80,186,175,195,186,226,55,39,204,8,251,93,171,31,28,199,217,232,186,238,177,123,76,58,35,64,3,0,170,48,198,244,176,214,42,28,14,151,248,93,11,144,170,62,255,220,115,173,194,45,194,231,27,217,209,178,102,132,53,26,164,3,234,35,199,202,90,71,198,137,155,169,193,24,89,43,25,199,170,227,129,83,53,229,197,153,27,141,213,106,25,187,212,202,44,12,150,7,223,250,251,213,87,31,241,243,231,105,10,225,112,184,196,113,28,25,99,122,248,93,203,167,197,44,28,0,128,42,66,161,208,30,73,29,93,215,237,92,88,88,184,199,239,122,128,84,113,249,75,51,187,4,92,251,121,35,115,133,140,185,88,214,38,39,71,25,99,101,237,171,86,118,110,196,49,127,127,233,242,107,119,37,229,184,41,166,168,168,168,147,227,56,187,37,237,205,207,207,239,228,119,61,159,6,1,26,0,80,69,113,113,113,133,49,38,43,47,47,47,219,24,83,233,119,61,128,223,174,124,233,217,137,198,181,95,146,52,173,137,78,249,172,117,204,227,115,46,159,246,159,38,58,95,147,176,214,102,149,148,148,84,88,107,43,11,10,10,178,253,174,231,211,32,64,3,0,170,8,133,66,86,146,242,243,243,249,29,129,102,237,202,217,51,175,52,142,254,159,164,243,124,42,225,109,235,234,119,115,166,92,59,199,167,243,39,93,166,220,95,210,186,120,0,64,242,101,202,47,56,224,100,77,157,251,215,209,174,117,103,24,233,98,191,107,145,36,43,189,234,24,103,198,172,43,174,89,232,119,45,159,86,166,220,95,152,198,14,0,0,32,106,202,156,103,239,181,214,93,144,42,225,89,146,140,116,177,181,238,130,41,115,158,189,215,239,90,224,73,235,244,15,0,72,190,76,233,33,2,26,98,234,139,127,59,199,42,242,191,146,134,249,93,75,61,86,24,5,190,49,107,242,23,222,243,187,144,147,145,41,247,23,122,160,1,0,64,179,54,101,206,211,223,176,138,188,171,212,15,207,146,52,204,42,242,238,148,57,79,127,195,239,66,154,51,2,52,0,0,104,182,174,124,113,230,125,50,206,67,126,215,209,96,198,121,232,202,23,103,222,231,119,25,205,21,1,26,0,0,52,75,83,231,62,251,132,145,110,247,187,142,147,101,164,219,167,206,125,246,9,191,235,104,142,8,208,0,0,160,217,153,242,226,204,167,173,181,55,250,93,199,167,101,173,189,113,202,139,51,159,246,187,142,230,134,0,13,0,0,154,149,41,115,103,62,42,105,186,223,117,36,209,244,232,207,132,38,66,128,6,0,0,205,198,148,57,51,127,46,171,91,252,174,35,233,172,110,153,50,103,230,207,253,46,163,185,32,64,3,0,128,102,97,202,156,103,174,151,209,143,252,174,163,209,24,253,104,202,156,103,174,247,187,140,230,128,0,13,0,0,50,222,85,115,103,14,146,49,153,63,204,193,152,71,175,154,59,115,144,223,101,100,58,2,52,0,0,200,120,174,107,31,148,148,237,119,29,77,32,59,250,179,162,17,17,160,1,0,64,70,155,50,247,217,239,202,152,9,126,215,209,100,140,153,48,101,238,179,223,245,187,140,76,70,128,6,0,0,25,235,243,115,159,236,41,215,254,194,239,58,154,156,107,127,241,249,185,79,246,244,187,140,76,69,128,6,0,0,25,43,236,102,253,68,70,89,126,215,209,228,140,178,194,110,214,79,252,46,35,83,17,160,1,0,64,70,154,50,235,47,195,100,50,112,202,186,68,25,221,50,101,214,95,134,249,93,70,38,34,64,3,0,128,204,228,4,190,237,119,9,190,227,26,52,10,2,52,0,0,200,56,147,231,60,91,40,163,155,252,174,163,186,156,96,150,46,235,115,154,190,112,218,16,77,238,59,64,173,179,26,121,98,16,163,155,38,207,121,182,176,113,79,210,252,4,253,46,0,0,0,32,217,2,70,55,90,191,139,136,19,112,28,125,125,216,217,26,151,127,138,178,156,227,253,151,211,7,14,211,252,146,173,250,223,229,239,171,210,117,27,231,220,70,55,74,186,187,81,14,222,76,209,3,13,0,0,50,142,43,119,186,223,53,196,4,28,71,63,56,251,60,77,40,236,173,44,199,81,69,36,162,79,246,237,81,121,36,162,160,227,232,188,130,94,250,241,232,241,202,114,2,141,114,254,84,186,22,153,194,248,93,0,0,32,181,132,66,33,43,73,249,249,249,252,142,64,90,154,60,231,217,177,142,177,239,249,93,135,36,101,57,142,126,52,234,124,13,205,237,46,215,90,253,121,245,50,189,188,121,189,34,174,171,128,49,186,240,148,126,186,101,200,153,114,140,209,210,157,219,244,63,239,191,165,136,77,126,223,185,107,205,57,47,94,57,109,126,210,15,220,64,153,114,127,161,7,26,0,0,100,20,71,186,212,239,26,36,41,59,16,208,143,71,143,215,208,220,238,146,164,7,151,45,212,63,54,174,83,36,58,84,35,98,173,94,217,188,94,247,126,240,174,172,181,26,209,181,135,110,29,50,178,81,106,73,149,107,146,41,8,208,0,0,32,179,24,93,232,119,9,217,129,128,126,60,234,124,13,233,210,237,216,186,207,246,62,85,45,131,39,62,126,246,254,246,98,253,126,217,2,73,210,69,189,250,29,11,220,73,149,2,215,36,147,16,160,1,0,64,198,184,114,246,236,14,146,61,203,207,26,98,225,121,112,151,110,138,88,171,153,107,87,42,236,186,58,181,99,103,205,24,51,161,198,16,253,78,241,22,189,85,188,89,146,244,217,222,253,27,161,42,123,150,119,109,144,12,4,104,0,0,144,57,130,229,103,251,121,250,236,64,64,51,198,92,160,193,93,186,169,210,117,245,243,133,111,234,249,143,87,235,174,133,243,84,233,186,58,181,99,23,221,53,118,162,114,130,39,190,28,241,237,104,128,238,219,190,83,227,20,231,243,181,201,36,4,104,0,0,144,57,92,247,12,191,78,29,11,207,3,58,117,81,165,235,234,238,133,243,180,162,116,187,36,105,213,174,157,186,123,225,60,85,68,34,234,215,161,147,238,62,231,196,16,157,29,240,102,225,176,106,164,9,248,124,188,54,153,134,0,13,0,0,50,134,49,26,224,199,121,91,6,131,250,233,232,9,26,208,169,139,194,174,171,123,22,190,169,85,187,118,86,105,179,106,215,78,221,181,240,77,85,186,17,245,110,223,81,119,157,51,81,109,162,47,82,49,146,46,60,165,159,36,105,227,190,189,141,82,163,95,215,38,19,17,160,1,0,64,230,176,234,211,212,167,108,25,12,234,174,177,19,117,122,231,92,85,186,174,238,90,56,79,43,119,237,168,177,237,154,221,59,245,179,249,111,232,104,56,172,62,237,59,234,158,113,159,81,155,236,108,125,107,248,104,141,232,218,67,17,107,245,252,250,213,141,83,168,15,215,38,83,17,160,1,0,64,38,201,107,202,147,181,12,6,245,179,49,19,212,175,67,39,85,186,17,221,93,67,207,115,117,107,247,236,210,157,11,230,233,104,36,172,194,182,237,245,200,196,203,53,190,176,183,36,233,209,15,23,235,147,125,123,26,171,220,38,189,54,153,140,0,13,0,0,50,135,49,157,155,234,84,57,193,44,221,57,230,2,157,214,177,139,202,35,17,205,152,63,79,171,106,233,121,174,110,221,222,93,186,107,193,60,73,82,235,232,48,142,199,62,92,162,215,54,111,104,180,122,155,242,218,100,186,19,231,81,1,0,0,72,87,174,109,219,20,239,89,206,9,102,233,238,115,38,170,119,251,142,170,136,68,116,231,130,55,180,118,207,174,132,247,119,140,209,228,190,3,143,45,63,178,98,145,94,223,242,73,99,148,122,156,107,219,54,238,9,154,15,2,52,0,0,200,28,70,39,206,15,151,100,213,195,243,140,6,134,231,128,49,250,238,200,113,26,213,163,64,86,210,255,53,69,120,150,154,228,218,52,23,4,104,0,0,144,57,172,117,101,76,163,13,81,109,147,149,173,59,199,94,240,169,194,243,29,103,159,167,51,187,229,201,202,123,189,247,155,69,155,26,171,220,170,172,117,155,230,68,153,143,49,208,0,0,32,115,24,83,214,88,135,142,15,207,71,195,225,244,10,207,82,163,94,155,230,134,30,104,0,0,144,73,246,73,106,147,236,131,182,201,202,214,61,227,62,163,194,182,237,117,52,28,214,79,231,255,71,27,26,48,91,70,192,113,116,199,89,231,30,11,207,191,91,50,95,239,134,182,36,187,204,250,236,107,234,19,102,42,122,160,1,0,64,198,48,210,246,100,31,211,49,70,63,28,117,158,10,219,182,215,145,112,165,102,44,120,227,228,195,179,181,186,127,233,2,63,194,115,163,92,155,230,138,0,13,0,0,50,134,149,221,154,236,99,94,116,74,63,13,232,148,171,176,235,234,206,5,111,234,227,189,187,19,222,55,203,113,244,163,216,176,13,107,245,219,165,243,245,118,241,230,100,151,152,144,198,184,54,205,21,67,56,0,0,64,230,48,230,99,217,228,30,242,236,238,249,146,164,185,159,172,213,199,123,19,31,243,156,229,56,250,209,168,243,53,52,183,187,172,181,186,111,201,123,90,80,82,148,220,226,26,194,152,143,253,59,121,102,33,64,3,0,128,204,97,237,42,37,121,34,232,206,173,114,36,73,91,14,38,62,132,56,203,113,244,227,209,227,53,164,75,55,185,214,234,222,15,222,213,251,219,139,147,90,87,131,89,187,202,223,2,50,7,1,26,0,0,100,140,136,178,22,7,20,78,234,49,179,3,1,73,82,56,146,216,44,112,217,129,128,126,60,106,188,6,119,233,170,136,181,250,229,162,183,181,100,71,73,82,107,58,25,17,101,45,246,187,134,76,193,24,104,0,0,144,49,230,78,190,122,157,164,164,166,213,44,39,26,160,19,152,70,57,59,16,208,140,49,23,120,225,217,117,83,38,60,75,42,137,94,27,36,1,1,26,0,0,100,20,99,204,127,146,121,188,44,199,139,75,149,145,72,157,237,90,6,131,154,49,230,2,13,232,212,69,17,215,213,207,223,127,43,85,194,115,210,175,73,115,71,128,6,0,0,25,197,149,125,57,153,199,11,70,3,116,93,61,208,45,131,65,221,53,118,162,6,116,234,162,202,104,120,94,81,154,58,179,198,37,251,154,52,119,140,129,6,0,0,25,37,98,218,190,24,180,7,195,74,82,206,9,70,135,112,20,182,109,127,194,54,35,163,83,59,118,209,228,190,3,212,38,59,91,149,110,68,247,188,255,182,86,198,133,231,160,227,232,212,142,157,229,152,196,31,110,220,89,118,88,59,203,14,127,250,226,61,225,136,105,251,98,178,14,6,2,52,0,0,168,199,187,107,75,219,170,236,72,219,172,86,78,155,72,121,184,117,192,81,75,215,4,90,152,112,101,150,235,152,128,36,57,174,141,216,96,86,165,99,35,229,17,87,71,3,45,130,135,43,143,184,135,148,211,234,224,184,1,185,7,155,178,222,151,46,191,188,108,202,139,51,255,42,233,139,201,56,94,108,8,199,173,67,70,214,217,110,127,249,81,253,102,201,123,90,181,107,103,149,245,215,14,24,170,43,251,13,108,208,57,119,150,29,214,87,255,61,183,97,133,214,238,175,47,93,126,57,175,241,78,34,2,52,0,0,168,98,225,135,27,187,69,220,96,174,227,70,186,24,199,116,54,149,135,59,216,160,9,216,202,136,28,199,200,74,50,214,149,2,129,227,99,65,3,222,58,43,35,199,145,108,101,68,193,160,100,42,15,71,22,174,216,188,207,186,118,183,235,4,118,5,156,112,233,232,33,125,118,52,193,143,241,148,146,20,160,95,217,188,190,198,222,231,24,215,90,125,180,187,84,47,109,92,167,195,149,21,39,108,95,181,123,167,250,119,236,220,160,115,110,61,176,191,193,117,214,225,169,100,30,12,201,158,40,17,0,144,246,66,161,144,149,164,252,252,124,126,71,52,19,214,90,231,253,149,161,60,55,104,243,156,136,237,33,217,110,141,123,70,179,195,13,152,109,78,216,148,140,26,154,95,98,140,73,108,126,184,6,154,242,226,51,139,36,115,86,99,28,59,125,216,15,102,79,158,126,182,223,85,196,100,202,253,133,30,104,0,0,154,169,197,159,236,105,175,195,135,123,46,90,181,165,167,140,201,119,234,158,100,34,137,108,55,39,98,187,201,232,140,69,171,182,132,22,46,217,88,20,236,208,97,203,200,190,157,146,218,237,106,140,243,160,181,182,89,247,190,26,227,60,232,119,13,153,40,173,211,63,0,32,249,50,165,135,8,181,123,123,233,250,220,150,217,45,122,89,215,246,178,82,71,191,235,145,36,35,237,53,142,217,124,180,162,124,243,121,35,250,151,38,235,184,83,94,124,102,137,100,70,36,235,120,233,197,46,157,61,121,250,153,126,87,17,47,83,238,47,244,64,3,0,208,76,44,91,182,169,67,69,48,208,207,186,145,126,174,107,219,249,93,79,60,43,117,180,174,237,152,29,8,246,125,255,195,173,27,178,195,145,13,195,135,247,78,252,221,217,181,187,71,210,11,73,56,78,58,186,199,239,2,50,21,243,64,3,0,144,225,230,89,27,92,184,122,203,233,21,129,192,120,107,237,8,25,39,165,194,115,21,198,105,103,173,29,81,17,8,140,95,184,122,203,233,243,172,253,84,157,125,179,39,79,159,101,108,243,11,208,198,234,133,217,147,167,207,242,187,142,76,69,128,6,0,32,131,45,90,189,169,123,171,213,161,115,21,209,56,43,219,213,239,122,18,101,101,187,42,162,113,173,86,135,206,93,180,122,83,247,79,115,172,176,137,220,33,153,242,100,213,150,250,76,185,247,51,163,177,16,160,1,0,200,80,11,87,111,57,61,28,113,206,149,27,233,239,119,45,39,205,141,244,15,71,156,115,23,174,222,114,250,201,30,98,238,228,235,54,72,186,45,137,85,165,186,219,162,63,51,26,73,90,15,224,6,0,36,95,166,60,228,211,156,173,88,177,189,245,17,29,25,98,141,51,196,100,200,239,122,43,89,99,221,15,91,169,213,135,195,134,117,63,169,87,244,93,57,231,153,39,140,49,55,38,187,182,84,98,173,253,243,156,43,167,223,228,119,29,181,201,148,251,11,61,208,0,0,100,144,121,139,215,117,57,26,60,58,74,198,25,154,41,225,89,146,140,100,100,156,161,71,131,71,71,205,91,188,174,203,201,28,99,206,228,107,111,150,204,194,100,215,150,58,204,66,239,103,68,99,35,64,3,0,144,33,22,175,217,220,163,85,118,139,179,109,196,244,243,187,150,198,98,35,166,95,171,236,22,103,47,94,179,185,71,131,119,54,198,154,128,59,93,82,81,242,43,243,93,145,9,184,211,101,140,245,187,144,230,128,0,13,0,64,6,152,191,174,40,223,117,205,72,201,20,248,93,75,227,51,5,174,107,70,206,95,87,148,223,208,61,103,93,54,125,163,49,206,85,146,246,54,66,97,126,217,107,140,115,213,172,203,166,111,244,187,144,230,130,0,13,0,64,154,91,186,118,107,158,83,30,30,233,186,106,120,175,108,154,114,93,245,112,202,195,35,151,174,221,154,215,208,125,103,93,113,205,7,1,107,46,147,181,187,27,163,182,38,101,237,238,128,53,151,205,186,226,154,15,252,46,165,57,33,64,3,0,144,198,222,91,177,161,107,101,165,59,92,114,186,249,93,75,211,115,186,85,86,186,195,223,91,177,161,193,211,243,61,127,229,180,249,142,113,46,52,50,105,59,91,133,145,217,224,24,231,194,231,175,156,54,223,239,90,154,27,2,52,0,0,105,106,225,194,245,237,2,78,214,48,107,77,131,135,50,100,10,107,77,126,192,201,26,182,112,225,250,6,191,28,230,133,201,211,150,133,165,243,37,189,209,8,165,53,182,55,194,210,249,47,76,158,182,204,239,66,154,35,2,52,0,0,105,232,185,231,158,11,216,54,217,67,100,213,219,239,90,124,103,213,219,182,201,30,242,220,115,207,5,26,186,235,220,201,211,74,102,79,190,118,162,164,251,27,161,178,198,114,255,236,201,215,78,156,59,121,90,137,223,133,52,87,4,104,0,0,210,80,207,129,99,6,25,87,131,252,174,35,85,24,87,131,122,14,28,115,210,215,99,246,228,107,111,147,156,171,37,21,39,177,172,100,43,150,156,171,189,90,225,39,2,52,0,0,105,102,241,234,146,158,174,141,12,246,187,142,84,227,218,200,224,197,171,75,122,158,236,254,179,39,95,243,247,136,142,156,110,100,30,74,102,93,201,96,100,30,138,232,200,233,179,39,95,243,119,191,107,65,6,77,176,14,0,72,142,76,121,83,88,166,154,95,84,212,42,176,223,158,103,93,123,138,223,181,164,34,227,152,45,145,246,230,237,177,133,133,71,62,205,113,166,206,253,235,89,214,218,59,36,59,53,89,181,157,28,51,203,24,243,203,76,153,101,35,83,238,47,65,191,11,0,0,0,137,203,58,224,12,136,184,97,194,115,45,172,107,79,201,58,16,24,32,233,83,61,92,23,13,172,87,77,158,243,236,88,199,216,175,75,154,158,148,2,19,247,140,107,205,195,47,50,195,70,74,74,235,244,15,0,72,190,76,233,33,202,68,139,86,111,234,110,195,129,9,214,216,182,126,215,146,202,140,53,7,77,48,50,239,236,65,189,183,39,235,152,83,95,120,186,192,6,156,47,202,216,207,75,102,68,178,142,91,149,93,42,107,254,110,34,238,211,179,174,250,98,42,143,197,62,105,153,114,127,161,7,26,0,128,52,97,195,129,254,132,231,250,89,99,219,42,28,232,47,41,105,1,58,26,104,127,41,233,151,87,189,52,115,128,43,115,145,92,59,94,50,99,36,219,253,228,142,106,182,75,118,129,28,243,166,35,251,218,11,151,79,95,155,172,122,209,184,210,58,253,3,0,146,47,83,122,136,50,205,59,139,63,233,153,149,157,53,81,178,89,126,215,146,30,76,101,101,69,229,127,206,29,217,119,107,99,159,105,234,11,207,156,226,102,5,78,151,85,95,201,45,52,70,185,198,85,59,107,76,11,73,50,214,150,91,71,7,172,85,169,228,20,201,232,19,167,50,178,102,214,85,211,183,52,118,109,169,38,83,238,47,244,64,3,0,144,6,130,45,156,62,178,132,231,196,217,172,96,11,167,143,164,70,15,208,209,32,220,236,194,112,115,198,52,118,0,0,164,184,249,203,139,242,141,76,31,191,235,72,55,70,166,207,252,229,69,205,246,45,141,104,60,4,104,0,0,82,93,32,114,138,172,225,95,141,27,202,154,160,2,17,102,44,65,210,17,160,1,0,72,97,11,215,239,110,231,184,206,73,191,28,164,185,115,92,167,231,194,245,235,219,249,93,7,50,11,1,26,0,128,84,86,113,168,64,198,18,0,79,150,177,237,84,145,93,224,119,25,200,44,4,104,0,0,82,153,43,198,240,126,90,92,67,36,25,227,169,0,0,72,81,243,231,175,238,100,93,229,153,147,152,240,235,195,37,139,186,108,218,178,177,211,174,29,59,219,155,128,227,118,203,237,182,127,192,208,51,118,244,233,219,255,224,201,214,179,171,180,180,197,170,21,75,187,110,221,242,73,174,35,99,79,233,211,191,116,208,224,97,165,157,114,115,203,27,114,156,79,54,124,220,238,227,53,171,114,75,66,91,59,183,109,215,190,172,119,159,254,165,67,134,159,185,171,101,203,86,145,218,246,121,229,165,217,125,54,126,178,46,47,182,124,218,160,161,91,39,94,56,41,161,25,54,172,171,188,249,243,87,119,26,59,118,208,158,134,212,9,212,134,0,13,0,64,170,106,147,211,213,72,45,18,109,238,186,174,121,250,137,63,156,241,214,235,47,95,182,127,255,190,26,135,45,116,239,145,191,106,202,180,235,94,76,52,124,150,149,29,14,254,99,246,115,3,22,188,253,230,216,162,173,155,206,172,169,77,175,222,125,223,63,103,252,196,249,151,94,249,249,143,179,179,91,184,181,29,235,163,15,63,236,248,200,131,191,254,66,73,209,150,225,213,183,181,202,201,217,115,249,85,211,158,190,250,218,27,86,87,223,182,99,251,182,86,207,60,249,135,91,142,28,46,235,44,73,193,96,240,200,37,151,95,245,147,68,234,151,36,99,212,194,182,201,233,42,137,0,141,164,32,64,3,0,144,162,2,129,64,174,141,216,132,218,86,84,148,59,51,190,247,237,105,31,175,91,115,94,93,237,182,111,11,13,126,228,183,191,28,188,106,217,146,103,191,253,189,159,188,89,87,219,143,63,90,221,225,183,247,252,244,203,187,118,151,246,173,171,221,230,77,159,140,218,188,233,147,81,255,121,229,31,171,239,184,243,87,143,23,20,158,114,184,122,155,3,251,247,103,253,238,87,63,251,242,158,221,187,106,156,142,239,72,89,89,167,231,254,242,248,127,117,233,212,229,23,23,92,114,105,149,57,149,159,248,195,3,227,99,225,89,146,198,156,51,254,197,134,246,164,7,2,129,92,73,188,233,15,73,193,24,104,0,0,82,148,235,186,185,137,182,253,205,61,63,253,108,125,225,57,222,59,243,94,159,54,243,201,71,135,214,182,253,131,5,243,187,253,252,39,223,253,110,125,225,57,222,246,109,37,131,126,246,253,111,127,251,163,213,43,58,86,223,54,243,169,71,71,198,135,231,96,48,120,52,47,191,112,101,78,235,182,59,227,219,61,255,215,39,167,198,47,175,92,190,180,243,146,247,231,95,30,91,110,211,174,221,182,91,255,235,246,119,18,173,41,166,33,215,18,168,15,61,208,0,0,164,160,119,86,110,233,40,171,206,245,183,148,86,45,93,218,121,201,162,5,87,196,175,27,56,120,232,127,38,94,124,249,130,161,195,70,236,60,116,232,64,214,242,101,31,228,189,50,119,246,165,59,119,108,27,16,107,179,240,157,55,207,189,246,134,91,87,86,63,94,69,69,185,243,216,195,191,189,174,236,240,225,42,161,115,240,176,225,175,77,184,248,210,247,135,12,30,94,90,94,121,52,176,234,195,101,93,95,127,233,197,241,27,63,89,63,38,214,102,255,222,61,167,60,250,208,111,175,250,237,35,79,62,22,191,239,202,165,31,140,138,125,223,177,67,231,205,119,221,251,192,253,61,10,10,203,92,215,53,247,252,228,123,87,172,88,186,104,146,36,237,220,177,125,192,178,197,239,231,14,31,57,170,84,146,158,122,236,127,175,176,214,6,98,251,94,52,105,242,172,156,156,214,225,68,174,75,21,214,116,126,103,229,150,142,231,14,61,101,111,131,247,5,170,161,7,26,0,128,20,148,109,109,7,35,37,244,248,224,155,111,189,114,122,252,114,175,190,253,23,222,125,239,67,207,141,255,204,197,69,157,114,115,203,123,246,238,123,232,138,169,215,124,124,199,207,126,241,104,32,16,168,140,181,43,9,21,13,45,43,59,124,66,103,218,159,255,248,208,217,187,119,237,236,31,91,54,198,68,174,185,254,75,15,204,248,229,253,47,156,63,225,162,226,78,185,185,229,61,242,10,203,46,188,248,138,205,191,126,232,241,63,159,127,193,197,51,227,247,223,186,121,211,89,179,158,253,203,192,216,114,69,69,185,179,187,244,120,79,246,240,81,163,222,233,81,80,88,38,73,142,227,216,75,39,79,93,16,191,16,131,222,34,0,0,32,0,73,68,65,84,255,230,141,159,116,150,188,7,7,55,127,178,126,116,108,125,94,126,225,202,107,174,251,210,135,137,92,147,234,140,100,178,173,237,112,50,251,2,213,17,160,1,0,72,65,198,181,237,19,109,187,179,100,91,247,248,229,115,39,124,102,126,77,237,122,246,238,123,168,67,199,206,155,227,215,237,218,177,189,101,252,114,69,69,185,243,206,155,175,87,233,205,190,224,194,73,207,124,110,218,137,15,247,197,124,235,191,127,244,214,233,67,135,191,22,191,238,213,151,231,92,86,91,123,215,186,85,254,48,8,100,5,171,61,120,232,42,92,89,105,102,63,247,76,149,225,28,211,111,248,202,44,199,113,18,27,20,94,131,134,92,83,160,46,4,104,0,0,82,144,117,2,109,19,109,59,96,240,208,117,227,47,186,228,233,216,215,217,163,198,21,213,212,110,223,190,93,217,251,246,238,238,21,91,110,209,34,251,96,247,252,130,178,248,54,111,188,254,175,94,241,15,236,181,109,215,33,52,253,230,175,46,170,175,134,27,110,253,198,235,193,96,240,72,108,121,119,105,105,191,85,75,151,118,150,164,236,236,22,110,231,220,220,13,177,109,43,22,47,58,103,91,113,81,78,108,121,193,187,111,247,143,63,86,191,190,167,238,250,203,19,127,24,17,223,11,126,250,208,225,175,141,58,247,188,109,245,213,81,151,134,92,83,160,46,140,129,6,0,32,5,185,198,109,99,18,27,193,161,154,198,49,87,247,238,155,175,231,191,240,183,167,39,69,34,145,172,216,186,1,131,134,190,83,125,218,185,229,139,22,13,136,95,30,114,198,136,247,218,181,111,95,169,122,244,237,119,234,129,190,167,13,88,184,110,245,170,9,199,206,249,222,27,167,14,30,49,98,129,36,13,59,99,228,7,175,191,242,210,233,146,180,119,207,158,222,183,127,235,230,59,7,13,62,227,173,162,45,155,79,221,85,186,227,180,216,62,93,187,247,88,211,163,103,239,131,111,252,207,79,175,138,173,203,202,106,113,248,198,47,127,179,74,15,247,201,112,141,219,230,211,30,3,144,8,208,0,0,164,36,99,149,147,96,126,62,193,182,226,162,156,217,207,63,51,66,146,14,236,221,219,110,253,199,31,141,216,191,111,95,97,124,155,86,173,115,118,79,191,249,107,111,84,223,183,164,100,107,175,248,229,17,103,141,249,56,209,243,158,54,112,200,186,248,0,93,178,117,203,177,185,168,191,112,195,77,139,23,47,156,127,254,222,125,94,15,120,197,209,242,118,203,22,191,127,121,245,99,92,241,185,107,94,122,242,15,247,159,31,223,11,62,246,220,134,79,91,87,19,99,149,83,127,43,160,126,4,104,0,0,82,144,53,106,121,146,249,89,219,183,151,180,126,227,213,127,93,87,219,246,156,214,173,75,111,254,234,109,127,168,41,148,30,62,120,176,202,204,31,131,135,141,216,89,189,77,109,78,59,117,224,246,248,229,131,135,14,28,123,104,175,67,135,46,21,183,253,224,167,127,120,228,247,191,158,190,125,91,104,112,245,125,91,229,228,236,249,236,21,87,61,219,167,207,169,123,158,120,228,193,42,211,214,125,233,27,183,189,151,104,13,117,177,70,45,235,111,5,212,143,0,13,0,64,10,50,174,90,52,214,147,74,109,218,182,219,85,18,218,218,81,82,149,177,210,174,235,154,3,7,246,247,56,86,131,49,145,46,13,120,77,119,151,30,121,85,94,160,114,248,224,193,78,241,203,131,134,14,223,243,192,99,207,60,244,230,107,47,247,92,190,108,81,255,210,210,29,93,219,180,110,123,160,79,159,126,69,151,78,189,102,77,187,246,237,43,127,240,157,175,94,27,137,132,179,99,251,76,186,226,170,231,79,106,218,186,26,24,55,241,183,58,2,117,33,64,3,0,144,98,102,204,152,225,88,199,4,78,182,7,186,62,59,183,111,27,56,235,175,127,25,88,94,94,254,199,155,190,252,205,37,177,245,187,119,149,182,136,159,115,185,117,219,182,9,247,62,75,82,110,110,183,35,241,203,101,135,203,78,120,161,138,227,56,246,130,75,46,221,82,253,109,131,146,244,214,188,215,10,214,127,180,230,252,216,114,94,126,225,202,207,77,187,97,245,199,31,173,238,48,239,181,127,157,30,42,41,206,147,164,252,188,130,146,9,23,77,90,115,234,192,65,251,26,82,159,117,76,160,254,86,64,253,8,208,0,0,164,160,68,231,128,174,201,240,145,163,74,159,127,249,237,175,72,82,233,206,29,45,151,47,123,191,251,134,143,62,202,95,252,254,123,19,226,199,66,191,250,210,172,235,71,143,57,127,227,192,33,67,246,74,82,231,46,185,229,198,152,72,44,68,31,57,124,184,75,67,206,187,111,207,174,42,61,188,45,90,181,60,144,232,190,225,202,74,243,183,167,30,191,42,126,221,244,27,190,50,235,225,251,127,57,238,205,215,94,249,98,252,250,53,43,151,233,245,87,94,210,5,23,79,250,203,215,111,187,227,221,68,207,241,105,174,41,16,143,105,236,0,0,72,49,51,102,204,112,141,227,184,245,183,172,95,110,215,110,71,47,188,248,138,205,95,187,237,251,239,253,234,129,199,239,237,222,35,127,85,108,91,56,28,110,249,242,63,94,24,17,91,118,28,199,198,247,58,71,34,145,172,3,251,247,103,85,63,102,109,118,149,238,168,242,144,94,235,214,173,19,238,33,254,219,95,254,52,108,231,246,109,199,94,8,51,120,216,240,215,86,175,90,94,80,61,60,199,123,227,213,127,93,247,212,227,15,143,168,109,123,117,201,186,166,0,1,26,0,128,148,228,86,36,251,136,93,114,115,203,167,94,243,197,185,241,235,54,174,95,87,229,45,134,109,90,183,217,19,191,252,209,202,101,9,247,66,111,216,176,190,202,171,191,219,180,110,187,63,145,253,246,237,219,149,253,234,191,230,86,153,182,238,210,201,159,127,247,245,151,95,154,22,223,174,223,105,3,223,233,119,218,192,119,226,215,189,242,143,217,211,74,119,238,72,240,225,192,228,95,83,52,79,12,225,0,0,32,5,89,153,10,201,214,27,12,159,155,249,228,160,69,243,223,62,59,182,60,246,156,241,11,167,78,187,238,163,218,218,143,30,55,62,244,240,239,126,117,108,249,192,129,3,93,227,183,247,40,40,216,180,125,91,201,160,216,242,210,197,239,247,25,117,238,248,132,94,96,178,118,213,138,42,47,68,201,43,236,185,53,145,253,254,244,200,67,231,150,29,62,120,172,142,177,231,142,127,241,195,229,75,123,86,86,150,183,142,173,187,249,203,223,186,119,210,148,207,111,144,164,89,207,254,101,201,204,167,30,189,77,242,166,195,123,237,31,115,6,76,191,249,43,203,235,59,143,119,77,129,79,143,30,104,0,0,82,145,27,57,82,127,35,41,92,89,17,216,252,201,250,209,177,175,245,235,215,158,210,144,211,56,142,170,188,26,123,196,200,177,107,226,151,87,173,92,118,166,235,186,245,142,29,62,176,127,127,214,198,13,107,171,12,167,56,231,252,137,107,235,219,111,211,186,143,219,45,154,255,246,9,211,214,133,138,55,231,197,214,117,234,220,101,99,44,60,75,210,212,105,215,125,212,166,109,155,29,177,229,226,226,173,85,94,101,94,171,4,175,41,80,31,2,52,0,0,41,40,32,231,112,253,173,164,188,252,158,123,227,151,55,125,188,118,104,93,237,223,158,247,90,207,248,229,182,237,59,86,153,187,121,194,69,159,221,220,170,117,235,93,177,229,29,219,75,6,205,249,219,51,85,222,78,88,147,167,30,123,120,204,161,131,135,186,197,150,59,231,230,110,24,62,114,84,105,125,251,253,233,177,7,46,9,135,195,173,98,203,177,105,235,202,14,31,58,246,214,192,156,214,109,78,24,75,157,211,186,237,177,161,38,135,15,30,72,232,21,221,137,94,83,160,62,4,104,0,0,82,80,196,186,135,18,105,55,122,220,121,37,57,173,143,63,248,183,107,119,105,223,39,254,248,208,153,53,181,45,43,59,28,252,215,236,231,63,27,191,174,79,191,126,85,122,137,91,182,108,21,153,48,241,179,115,226,215,205,126,225,153,235,94,251,215,220,222,181,213,240,212,227,15,143,120,103,222,107,87,199,175,187,248,210,43,255,81,95,237,111,205,123,173,224,163,85,43,39,198,150,243,242,11,87,94,61,253,166,85,146,148,211,186,205,177,159,255,224,129,125,185,241,189,224,21,21,229,206,161,131,135,142,189,240,37,39,39,39,161,96,156,232,53,5,234,67,128,6,0,32,21,69,156,132,166,128,107,217,178,85,228,172,179,199,252,39,126,221,63,103,63,247,229,251,127,121,215,132,93,165,165,199,166,149,91,181,116,105,231,31,223,254,245,27,75,66,69,199,122,168,3,129,64,229,37,151,77,89,86,253,152,215,223,242,181,197,93,187,247,56,54,148,227,200,225,178,206,127,124,240,190,59,102,220,241,237,171,222,252,247,171,133,251,246,237,202,222,86,82,148,243,250,171,115,123,125,239,155,95,186,113,238,243,127,253,74,36,18,57,54,91,71,207,222,125,23,77,253,66,237,227,176,37,239,165,45,53,77,91,23,251,62,191,160,87,73,236,251,253,251,246,21,62,246,240,239,70,197,150,255,240,251,123,207,139,31,51,157,215,179,87,66,99,180,19,189,166,64,125,120,136,16,0,128,20,228,58,206,126,71,137,205,186,118,195,87,190,245,222,186,181,171,135,196,191,34,251,157,183,254,125,205,59,111,253,251,154,186,246,187,224,194,73,51,7,14,26,182,183,250,250,96,86,150,189,237,123,63,125,242,222,187,126,252,181,189,251,118,247,138,173,95,181,98,217,69,171,86,44,187,168,174,99,118,237,222,99,205,127,255,240,174,103,235,171,249,111,79,255,121,112,149,105,235,134,158,249,234,168,115,207,59,22,132,63,59,121,202,234,215,95,126,233,112,236,65,194,215,254,249,226,77,107,62,92,49,204,117,35,78,73,113,209,25,177,118,45,90,100,31,156,116,197,231,214,40,1,174,227,36,52,43,8,80,31,122,160,1,0,72,69,157,181,199,88,29,77,164,105,187,246,237,43,239,184,243,151,127,138,159,227,185,62,99,207,187,224,185,91,191,117,251,130,218,182,159,58,112,208,190,159,252,226,190,7,187,228,118,91,151,232,49,243,242,11,87,222,249,171,7,254,208,163,160,176,172,174,118,101,101,135,131,175,254,115,86,149,105,235,110,249,230,109,175,198,183,233,145,87,88,118,241,164,43,102,198,175,43,222,186,121,68,124,120,150,164,139,47,159,58,51,145,215,141,27,171,163,234,172,61,245,181,3,18,65,128,6,0,32,5,141,45,44,60,226,24,167,222,135,240,98,10,10,79,57,124,223,195,127,122,120,212,152,113,179,130,89,89,181,6,216,188,194,83,150,93,127,235,55,126,243,157,31,204,248,143,227,56,182,182,118,146,212,179,119,223,67,191,253,191,63,63,240,153,73,87,252,57,126,156,117,117,109,218,181,219,54,233,138,207,61,246,235,135,30,251,191,220,174,221,234,13,253,143,61,114,255,216,67,7,14,244,136,45,159,115,254,132,217,5,133,167,156,48,142,249,198,175,126,107,241,213,95,188,233,193,246,29,58,157,240,218,239,142,29,58,111,190,230,250,47,61,112,253,151,190,190,180,190,243,73,146,99,156,210,177,133,133,204,194,129,164,224,149,150,0,128,42,66,161,144,149,164,252,252,124,126,71,248,236,189,101,159,156,21,8,4,135,55,116,191,93,165,165,45,94,125,105,214,192,189,251,119,183,149,164,54,173,218,30,233,152,219,229,224,169,167,14,222,25,123,109,119,67,29,216,191,63,235,253,133,111,229,239,221,181,187,205,254,253,251,90,75,82,251,246,29,14,119,236,210,249,208,57,231,78,44,206,201,105,29,78,228,56,21,21,229,206,19,143,60,48,186,210,173,12,196,214,221,252,149,111,47,168,107,127,215,117,205,123,111,189,145,191,97,253,218,110,129,128,99,251,244,237,191,99,236,121,19,75,234,251,3,32,94,36,18,94,118,206,240,190,31,36,218,30,141,35,83,238,47,105,93,60,0,32,249,50,229,23,92,38,120,111,233,198,83,2,193,192,197,126,215,145,9,34,225,200,171,231,140,232,115,66,79,54,154,86,166,220,95,24,194,1,0,64,138,234,218,54,178,221,72,39,213,99,140,227,140,180,183,107,219,200,246,250,91,2,137,33,64,3,0,144,162,250,247,239,95,110,140,13,249,93,71,186,51,198,134,250,247,239,95,239,131,134,64,162,8,208,0,0,164,176,202,74,151,0,253,41,113,13,145,108,4,104,0,0,82,216,216,225,189,139,233,133,62,121,198,216,208,216,225,189,139,253,174,3,153,133,0,13,0,64,10,51,198,68,34,54,176,213,239,58,210,85,196,6,182,26,99,34,126,215,129,204,66,128,6,0,32,197,29,174,168,216,42,199,217,237,119,29,105,199,106,79,118,69,5,127,124,32,233,8,208,0,0,164,184,11,71,246,221,111,35,145,77,126,215,145,110,172,236,198,145,35,251,242,250,110,36,29,1,26,0,128,52,112,212,181,27,173,107,119,249,93,71,186,176,174,221,117,212,181,27,253,174,3,153,137,0,13,0,64,26,152,48,188,247,62,19,112,55,248,93,71,186,48,1,119,195,132,225,189,247,249,93,7,50,19,1,26,0,128,52,81,90,190,103,131,19,112,24,211,91,15,39,224,108,13,150,239,225,143,13,52,26,2,52,0,0,105,226,242,145,35,203,108,56,178,206,202,173,240,187,150,84,101,229,86,216,112,100,221,200,145,35,203,252,174,5,153,139,0,13,0,64,26,25,53,172,215,166,96,32,184,198,239,58,82,85,48,16,92,51,106,88,47,30,184,68,163,34,64,3,0,144,102,202,247,30,254,200,177,12,229,168,206,9,56,91,203,3,135,63,242,187,14,100,62,2,52,0,0,105,102,220,184,1,7,93,153,85,70,218,235,119,45,169,194,72,123,221,176,89,53,110,192,128,131,126,215,130,204,71,128,6,0,32,13,141,30,86,80,236,86,218,85,114,109,216,239,90,124,231,218,176,91,105,87,141,30,86,192,43,187,209,36,8,208,0,0,164,169,49,103,246,250,200,26,45,247,187,14,191,89,163,229,99,206,236,197,208,13,52,25,2,52,0,0,105,108,244,208,83,150,89,235,172,240,187,14,191,88,235,172,24,61,244,148,101,126,215,129,230,133,0,13,0,64,26,51,198,216,189,161,163,203,141,236,135,126,215,210,212,140,236,135,123,67,71,151,27,99,172,223,181,160,121,33,64,3,0,144,230,38,77,234,95,190,37,112,120,137,172,187,210,239,90,154,140,117,87,110,9,28,94,50,105,82,255,114,191,75,65,243,19,244,187,0,0,0,240,233,93,61,104,80,197,60,107,23,183,250,112,107,165,140,25,38,107,51,243,119,188,49,97,89,187,226,200,208,94,43,174,54,134,7,40,225,139,204,252,159,11,0,128,102,104,130,23,40,151,188,183,98,67,121,208,180,24,106,229,182,241,187,166,100,50,114,14,133,221,242,149,231,12,235,183,202,239,90,208,188,49,132,3,0,128,12,115,206,176,126,171,220,172,240,124,99,84,226,119,45,201,98,140,74,220,172,240,124,194,51,82,1,1,26,0,128,12,52,102,96,239,205,145,131,206,124,185,74,255,215,126,187,90,19,113,156,249,99,6,246,222,236,119,41,128,196,16,14,0,0,50,214,216,177,133,123,36,189,59,127,229,166,93,142,2,167,73,182,155,223,53,53,140,217,225,42,178,110,236,25,189,215,250,93,9,16,143,30,104,0,0,50,220,216,161,189,215,30,137,68,222,114,221,200,114,25,149,249,93,79,189,140,202,92,215,89,126,36,18,121,107,236,80,194,51,82,15,61,208,0,0,52,3,19,134,247,222,39,105,209,219,139,55,23,101,7,35,125,141,9,246,177,70,45,253,174,43,158,177,58,106,173,54,6,195,246,147,145,35,11,183,249,93,15,80,27,2,52,0,0,205,200,121,35,123,109,147,180,109,209,234,77,27,194,17,211,219,88,219,203,49,78,91,63,107,50,214,61,40,99,54,155,96,206,166,81,131,186,110,247,179,22,32,17,4,104,0,0,154,161,179,7,245,222,46,105,251,188,101,155,62,106,17,8,23,6,3,217,249,174,107,243,154,108,254,104,99,194,142,99,74,194,145,138,80,185,235,20,77,24,222,107,95,147,156,23,72,2,2,52,0,0,205,88,116,104,199,62,73,31,174,216,176,189,235,129,3,101,61,178,28,117,147,2,221,228,168,85,82,79,230,234,136,100,118,84,186,225,29,237,218,229,108,27,214,175,251,206,164,30,31,104,34,4,104,0,0,32,73,138,6,218,157,146,180,120,113,73,206,17,29,233,146,237,152,142,145,160,233,96,108,160,189,99,76,155,68,95,206,98,228,28,114,173,61,100,77,100,127,32,108,247,85,184,118,111,43,181,218,53,114,100,94,234,63,196,8,212,131,0,13,0,0,78,16,13,186,91,163,95,146,36,107,173,89,178,100,91,171,138,86,145,150,193,195,225,108,183,69,86,208,113,140,145,36,215,181,214,41,175,12,135,91,7,43,178,143,4,142,158,121,102,143,35,198,24,235,87,253,64,99,34,64,3,0,128,132,68,3,113,89,244,11,104,182,152,7,26,0,0,0,104,0,2,52,0,0,0,208,0,4,104,0,0,0,160,1,8,208,0,0,0,64,3,16,160,1,0,0,128,6,32,64,3,0,0,0,13,64,128,6,0,0,0,26,128,0,13,0,0,0,52,0,1,26,0,0,0,104,0,2,52,0,0,0,208,0,4,104,0,0,0,160,1,8,208,0,0,0,64,3,16,160,1,0,0,128,6,32,64,3,0,0,0,13,64,128,6,0,0,0,26,128,0,13,0,0,0,52,0,1,26,0,0,0,104,0,2,52,0,0,0,208,0,4,104,0,0,0,160,1,8,208,0,0,0,64,3,16,160,1,0,0,128,6,32,64,3,0,0,0,13,64,128,6,0,164,178,128,36,27,253,250,94,61,109,187,197,181,237,210,200,117,165,130,153,58,254,243,198,127,85,72,218,32,233,175,146,174,147,212,202,175,2,129,76,69,128,6,0,164,139,159,75,26,234,119,17,41,104,147,164,133,113,95,203,37,229,72,250,130,164,167,36,189,38,169,187,111,213,1,25,136,0,13,0,72,23,89,146,238,151,212,194,239,66,82,204,255,72,26,19,247,117,182,164,124,73,195,229,5,234,113,146,254,40,201,248,85,32,144,105,8,208,0,128,116,50,94,210,87,253,46,34,13,88,121,61,209,55,75,170,148,116,185,164,145,245,236,19,108,236,162,128,76,65,128,6,0,164,139,159,68,63,127,33,105,192,73,236,63,72,210,111,229,5,203,3,146,214,74,122,72,210,25,53,180,141,141,167,46,145,212,89,222,248,235,119,37,237,145,180,78,210,131,146,250,71,219,246,145,244,43,73,43,37,237,147,244,129,164,59,36,181,171,165,142,174,209,237,239,68,143,87,36,233,111,146,46,83,242,123,137,63,146,244,94,244,251,216,53,235,168,227,227,165,11,36,221,39,111,204,116,165,170,134,104,71,210,20,73,207,73,218,34,239,90,188,44,233,86,213,60,174,250,179,209,99,62,44,233,180,232,113,63,212,241,107,242,163,232,185,37,175,87,252,9,73,235,37,237,146,55,204,228,139,170,61,151,180,145,244,13,73,255,150,180,83,210,70,73,207,72,154,164,134,93,179,11,228,93,239,95,54,96,31,0,0,128,186,133,66,33,27,10,133,172,223,117,68,197,63,68,120,134,188,224,106,37,189,170,19,123,76,235,122,136,240,42,73,71,162,219,22,75,250,187,188,112,23,107,127,89,29,199,250,80,210,50,121,67,37,126,35,47,64,91,121,65,238,122,121,1,113,65,116,251,3,242,130,166,149,23,54,179,170,29,247,116,121,225,207,202,11,173,47,200,11,210,177,115,253,188,254,75,114,76,236,33,194,91,235,105,247,106,180,221,245,209,229,248,0,189,60,250,185,90,222,31,0,129,104,155,22,146,30,139,107,55,47,250,243,28,142,91,206,173,118,158,88,128,94,39,239,15,148,151,37,221,45,233,255,162,203,86,210,27,146,254,59,250,253,156,232,207,251,164,188,7,31,173,142,255,145,20,47,79,222,80,20,43,239,15,142,127,170,234,53,123,64,137,247,158,207,208,241,63,140,224,131,20,187,191,0,0,144,28,41,246,11,174,122,128,238,172,227,1,180,250,80,142,218,2,116,47,121,193,239,136,188,144,23,235,177,116,36,125,51,218,190,72,85,199,86,199,31,235,1,85,13,194,109,37,189,29,183,253,126,73,217,113,219,115,229,5,82,43,233,194,184,245,65,73,139,162,235,191,95,237,124,227,116,60,224,39,250,160,100,34,1,58,95,199,195,235,184,232,186,248,0,253,182,142,247,164,199,251,65,116,251,124,73,125,227,214,119,145,55,187,135,149,215,107,30,223,251,27,11,208,241,97,61,230,52,121,225,183,182,237,103,71,215,31,145,215,67,31,19,148,23,152,173,188,113,220,237,227,182,157,46,47,244,91,73,223,170,225,103,168,73,158,188,127,77,56,47,193,246,72,178,20,187,191,0,0,144,28,41,246,11,174,122,128,150,188,241,188,86,94,48,236,23,215,182,182,0,61,92,210,93,170,57,104,58,146,182,71,247,25,92,203,177,186,214,176,223,53,58,62,101,92,167,26,182,255,68,199,131,114,76,167,104,29,119,170,106,224,142,121,52,186,207,141,53,108,171,73,125,1,186,175,164,151,162,109,22,197,157,51,62,64,15,170,97,191,238,58,30,230,135,213,176,189,179,188,97,23,86,210,185,113,235,99,1,250,29,213,60,172,34,246,175,7,175,213,82,239,91,209,237,227,227,214,93,18,93,183,81,222,204,34,213,157,31,221,190,75,199,135,135,32,133,165,216,253,229,164,241,192,0,0,32,221,188,36,233,113,73,95,146,55,166,121,138,164,72,29,237,151,69,191,106,226,202,155,6,174,155,188,113,182,53,41,171,97,221,182,232,231,98,121,61,171,213,237,138,126,198,135,235,61,146,126,90,71,157,177,99,214,54,118,186,54,183,203,11,244,49,70,94,79,235,105,209,229,117,242,122,124,43,106,216,183,184,134,117,227,37,181,148,119,157,87,212,176,125,183,164,71,36,253,88,210,197,242,2,115,188,125,242,66,109,117,69,209,207,5,53,108,147,142,15,171,232,16,183,110,82,244,243,33,213,252,223,225,237,232,241,198,72,58,71,210,63,106,57,54,144,84,4,104,0,64,58,250,145,188,222,201,203,229,133,195,39,18,216,231,108,73,87,203,27,202,208,79,94,79,106,188,134,60,140,22,11,236,225,90,182,199,2,100,77,191,103,123,73,154,38,105,162,188,97,8,61,62,69,29,146,23,148,79,139,91,174,148,23,198,231,200,27,255,252,55,73,123,27,112,188,83,163,159,139,235,104,179,50,250,57,164,1,199,141,84,251,172,46,118,205,2,113,235,98,255,234,176,170,142,125,222,151,23,160,107,26,138,2,52,10,2,52,0,32,29,237,144,116,155,188,135,1,127,35,239,225,180,163,117,180,159,33,233,103,242,122,49,159,151,23,44,15,68,183,253,151,164,158,141,86,105,85,151,201,11,180,57,146,254,37,233,207,58,62,54,248,98,85,29,51,157,168,47,203,27,254,145,44,177,158,248,157,117,180,41,141,126,214,52,124,37,153,98,195,50,118,215,209,230,100,123,238,129,147,70,128,6,0,164,171,23,228,141,3,190,86,222,148,105,223,174,165,221,5,242,194,243,10,121,1,182,250,176,133,207,169,105,2,116,87,121,111,6,148,188,135,216,170,15,125,104,175,147,11,208,201,118,40,250,89,125,150,141,120,177,222,251,134,244,108,159,140,216,241,235,10,234,221,162,159,7,27,185,22,224,24,230,129,6,0,164,171,216,67,122,165,242,66,240,23,107,105,55,49,250,249,184,106,30,243,219,84,70,201,235,81,125,69,39,134,231,84,242,113,244,243,204,58,218,196,30,62,92,89,71,155,100,88,94,237,124,213,25,29,127,65,204,199,181,180,1,146,142,0,13,0,72,103,197,242,30,162,147,106,159,67,57,54,36,161,166,151,127,228,171,234,52,109,141,41,167,218,103,188,44,121,1,59,21,188,37,111,56,204,100,213,60,165,94,123,73,95,143,126,255,106,35,215,242,114,244,243,155,170,249,191,223,104,121,189,249,123,117,252,133,49,64,163,35,64,3,0,210,221,51,146,102,235,196,151,150,196,44,137,126,222,38,233,44,121,189,150,142,188,7,207,94,212,241,161,10,53,5,219,100,250,48,250,121,137,188,7,31,99,195,40,251,201,27,11,125,81,116,185,117,35,215,81,159,109,146,238,137,126,255,176,170,78,21,216,69,210,255,202,27,54,241,156,188,183,51,54,166,215,229,245,216,247,149,244,123,85,157,161,99,96,180,22,201,27,162,147,200,112,146,238,146,190,35,47,120,3,39,141,0,13,0,72,119,174,188,94,232,253,181,108,255,187,188,32,214,67,222,124,200,219,228,77,51,55,63,186,61,54,219,68,247,70,172,81,146,214,232,120,48,125,82,222,195,131,197,242,94,103,253,89,73,115,163,219,10,26,185,142,68,220,39,47,212,159,35,175,190,183,229,205,223,188,69,210,244,232,114,236,37,52,141,41,44,111,158,235,15,228,61,44,185,89,94,175,247,124,121,215,115,184,188,41,238,30,73,240,120,223,144,247,208,233,204,164,87,138,102,133,135,8,1,0,153,96,147,188,87,68,255,177,134,109,71,36,77,149,55,236,224,243,242,166,59,91,47,111,54,140,71,229,189,230,251,51,170,250,150,187,198,242,19,121,83,178,221,36,175,55,252,176,188,185,172,31,146,23,224,15,43,53,58,183,142,74,186,69,222,92,208,215,200,27,94,210,66,94,143,243,11,146,158,86,205,243,50,55,134,98,121,227,216,175,151,55,231,247,112,121,215,233,175,242,254,245,33,246,166,194,68,188,43,41,36,239,191,61,0,0,64,114,100,202,155,194,0,164,158,76,185,191,164,194,95,185,0,0,0,64,218,32,64,3,0,0,0,13,64,128,6,0,0,0,26,128,0,13,0,0,0,52,0,1,26,0,0,0,104,0,2,52,0,0,0,208,0,4,104,0,0,0,160,1,8,208,0,0,0,64,3,16,160,1,0,0,128,6,32,64,3,0,0,0,13,64,128,6,0,52,23,215,75,90,39,105,185,164,75,147,120,76,27,247,117,83,146,142,139,147,119,187,170,254,55,185,220,223,114,144,137,130,126,23,0,0,64,29,78,151,180,186,150,109,91,37,109,150,244,174,164,215,37,189,37,47,48,213,164,64,210,147,113,203,207,74,202,147,116,40,57,101,102,172,83,36,125,65,210,68,73,131,36,229,200,187,238,31,72,122,69,210,191,36,29,241,173,58,192,39,4,104,0,64,186,234,25,253,58,79,210,15,229,5,186,255,39,105,109,13,109,171,255,190,107,41,41,208,168,213,165,191,47,75,250,157,188,208,28,175,163,164,97,146,110,145,180,68,94,47,252,154,6,28,183,163,164,207,197,45,151,72,250,231,201,151,9,52,61,134,112,0,0,50,197,37,146,222,148,52,174,134,109,155,229,253,211,254,65,73,187,37,125,73,210,254,166,43,45,237,220,34,233,15,58,49,60,87,119,166,164,151,37,229,54,224,216,157,37,253,49,238,107,250,201,20,8,248,137,0,13,0,72,39,31,75,250,76,244,235,50,73,223,150,180,44,110,123,55,73,207,73,234,93,195,190,191,149,212,41,218,230,47,141,91,102,90,107,35,233,215,213,214,61,34,105,180,188,33,53,83,37,125,20,183,173,167,164,235,154,166,52,32,53,48,132,3,0,144,78,14,74,250,79,181,117,143,74,122,64,94,175,169,36,245,144,116,159,164,171,106,216,63,220,120,165,101,140,33,242,134,89,196,204,146,244,13,29,31,95,254,145,164,82,73,239,196,181,57,79,222,31,40,64,179,64,15,52,0,32,221,29,145,55,60,99,67,220,186,169,146,206,138,91,14,168,234,204,12,197,181,28,107,184,188,222,215,133,146,246,72,218,46,239,225,196,187,229,61,68,215,80,147,171,157,183,66,210,5,53,180,27,28,61,199,187,209,115,110,145,244,111,73,223,147,84,88,203,177,103,199,29,119,83,116,221,57,242,134,94,172,141,214,255,182,164,111,74,106,213,128,154,215,72,26,26,247,245,45,157,248,112,102,245,7,59,219,39,112,220,139,162,199,89,95,109,253,52,29,255,57,206,174,182,173,173,164,27,228,61,244,185,78,210,129,232,254,79,203,27,71,157,157,192,121,37,239,26,254,66,210,74,121,215,101,190,188,107,219,177,134,182,47,169,234,127,179,188,26,218,196,111,223,21,183,126,76,181,109,215,200,187,54,255,37,233,13,73,59,37,109,148,247,71,223,240,4,107,7,0,0,169,46,20,10,217,80,40,84,219,108,22,77,237,116,85,13,36,139,235,104,251,253,106,109,239,136,219,150,72,128,254,78,181,54,53,125,221,46,201,196,237,83,215,52,118,195,229,5,190,248,237,55,86,59,167,145,23,228,234,58,231,1,73,87,215,80,239,236,106,237,126,88,199,49,254,41,169,69,13,199,56,89,103,87,59,126,34,189,207,177,0,93,215,87,124,128,62,67,94,80,175,171,253,127,228,13,201,137,87,125,26,187,95,201,11,174,53,237,191,84,82,151,106,251,39,51,64,255,94,94,104,175,233,220,21,146,46,174,225,216,25,45,197,238,47,0,0,36,71,138,253,130,107,72,128,190,160,90,219,151,227,182,213,23,160,167,84,219,126,68,210,171,242,122,132,255,127,123,119,31,109,89,89,223,7,252,187,239,12,227,11,160,48,49,224,188,72,53,162,194,178,232,50,193,38,13,182,218,24,218,164,90,92,38,198,168,203,133,180,74,83,210,134,70,109,10,24,83,95,32,86,210,86,151,86,86,187,212,180,128,209,21,181,1,235,50,175,141,101,76,73,77,82,43,181,22,35,70,34,56,119,159,43,35,97,64,10,134,225,206,221,253,227,57,167,236,179,231,220,151,115,231,206,156,23,62,159,181,206,186,247,217,175,191,123,7,158,251,59,207,249,237,231,233,38,62,63,221,58,111,181,4,122,79,202,72,105,123,223,59,71,196,124,233,136,235,175,246,250,177,206,185,221,4,122,189,215,107,70,220,127,92,39,165,212,66,127,190,117,221,239,166,252,59,173,231,5,253,243,110,233,196,117,119,127,251,231,83,102,247,72,74,25,206,98,231,184,7,82,70,218,187,63,215,167,50,252,166,166,155,64,175,247,122,87,39,206,173,76,160,215,123,125,37,27,31,69,159,11,83,214,191,0,192,214,152,178,63,112,227,36,208,103,117,142,109,151,10,172,151,64,127,182,181,239,64,146,103,180,246,253,157,206,185,127,210,218,55,42,129,62,169,115,189,38,201,245,57,242,185,163,51,83,70,33,219,9,226,37,73,206,78,73,36,175,234,92,227,27,253,107,15,116,19,232,63,79,242,83,41,191,179,191,145,228,211,35,98,216,140,39,117,174,211,126,221,147,228,199,199,188,222,153,157,107,124,108,196,49,221,79,3,174,74,153,122,48,73,190,47,201,151,59,251,159,211,58,183,155,64,223,155,228,103,82,74,112,206,77,25,21,110,239,239,101,184,164,117,171,19,232,107,82,70,214,207,73,114,113,134,255,205,155,148,145,246,71,141,41,235,95,54,205,67,132,0,204,139,238,130,30,127,37,101,100,114,35,127,172,219,245,168,183,102,56,249,254,221,148,186,232,118,242,122,66,146,135,71,92,103,91,202,220,201,237,58,231,155,146,252,108,142,124,128,241,181,253,235,12,252,98,202,108,23,3,95,74,25,137,253,7,253,246,83,83,102,30,249,245,85,126,134,215,164,212,110,15,244,50,188,10,223,57,171,156,183,89,127,153,82,107,190,111,139,175,155,148,7,21,127,174,213,190,161,127,191,164,188,81,248,96,202,131,163,3,103,165,148,74,140,242,166,36,255,161,213,254,82,202,104,254,179,250,237,93,73,158,156,242,251,218,106,255,41,165,6,125,240,223,224,151,83,18,249,127,218,58,230,140,148,213,49,153,33,18,104,0,230,197,209,140,106,221,146,71,146,222,23,37,121,91,146,143,38,185,189,127,221,203,54,120,157,75,51,156,168,222,150,146,40,143,90,241,240,165,157,246,141,35,142,185,46,143,36,208,73,242,194,172,158,64,215,157,246,157,157,118,183,86,248,104,61,54,201,239,165,252,110,222,187,197,215,254,237,78,251,137,41,73,242,227,83,114,151,239,233,236,127,194,26,215,250,118,167,253,112,74,18,253,172,214,182,147,55,17,227,70,252,121,142,252,239,242,107,157,246,177,186,55,199,144,89,56,0,152,23,39,117,218,119,102,227,73,245,191,234,180,223,158,50,10,253,103,41,15,200,189,44,27,155,201,162,59,202,251,169,140,30,217,60,33,101,17,146,129,251,82,150,200,238,234,38,91,103,109,32,134,129,238,136,247,102,107,109,255,34,101,254,236,157,41,163,224,63,158,82,175,156,148,159,227,61,25,253,144,227,209,218,145,50,191,244,77,41,101,24,127,154,178,242,225,31,167,188,193,105,171,50,158,135,58,237,227,185,42,101,247,147,11,43,98,206,32,9,52,0,243,98,111,167,125,251,24,231,254,78,146,191,149,228,15,59,219,159,158,178,60,248,167,82,62,126,127,93,198,75,214,46,203,240,116,122,3,39,118,218,131,135,227,186,238,239,180,187,51,70,28,15,77,146,131,253,215,157,41,191,171,87,39,121,176,117,204,91,50,126,18,187,150,147,82,22,196,185,62,229,19,1,152,42,18,104,0,230,197,15,119,218,159,27,243,252,125,41,201,218,139,82,102,204,184,165,179,255,233,73,174,77,89,84,100,28,215,228,200,37,177,187,245,218,187,86,57,183,59,191,242,221,35,143,58,254,238,204,112,189,245,115,179,181,201,253,207,166,140,250,15,220,144,242,160,224,227,83,18,245,215,109,225,189,96,108,18,104,0,230,193,147,242,200,74,132,3,191,191,137,235,44,167,36,222,111,75,242,253,41,15,120,117,235,159,47,203,234,31,187,63,156,146,248,125,188,181,237,249,41,15,178,181,61,148,82,135,59,112,122,202,212,119,93,103,118,218,183,173,22,248,22,250,201,36,191,218,122,157,183,202,113,135,58,237,238,155,132,163,241,250,214,247,15,39,249,135,41,159,0,116,223,120,28,11,43,157,182,18,11,142,32,129,6,96,214,157,156,50,202,219,78,64,255,115,146,255,177,193,243,255,94,202,12,14,131,215,249,173,125,251,83,102,224,104,63,224,183,55,171,63,180,118,69,202,244,113,151,167,212,53,15,92,153,225,154,231,36,249,76,167,253,138,17,215,235,206,221,60,238,168,250,102,60,54,229,193,197,193,235,162,28,89,158,241,180,12,39,214,247,167,76,255,183,17,221,82,149,110,109,249,99,146,60,179,213,174,83,234,176,219,214,122,104,240,104,221,215,105,159,209,105,63,249,24,222,155,25,97,22,14,0,102,201,73,41,115,237,14,190,63,59,201,63,234,127,29,184,43,201,63,27,227,154,127,154,225,135,255,46,75,153,202,110,240,240,223,238,12,47,227,125,87,142,172,77,30,184,167,255,245,142,148,186,224,107,90,251,62,144,50,211,199,96,20,245,35,41,83,215,13,188,43,101,84,119,95,202,223,231,159,72,153,191,120,224,155,57,50,233,62,22,110,78,153,50,110,48,239,242,27,250,113,125,36,37,185,60,43,201,191,200,240,236,17,31,203,198,71,135,187,51,146,188,56,201,5,41,115,115,47,245,95,119,164,60,176,152,254,215,139,82,70,245,31,147,50,123,201,85,27,254,105,198,247,213,78,251,221,73,126,41,229,223,253,25,73,222,122,12,239,13,0,204,162,41,91,232,160,187,144,202,122,175,187,147,252,205,17,215,89,111,33,149,238,162,37,223,77,153,253,225,179,41,11,156,180,247,181,147,243,181,150,242,222,145,50,98,220,222,127,69,231,190,227,6,69,107,8,0,0,21,32,73,68,65,84,172,154,247,146,206,185,221,133,84,158,50,226,231,94,109,193,143,245,92,62,70,92,251,83,230,220,222,168,42,101,5,190,81,215,250,201,254,49,87,140,113,255,38,195,243,42,119,127,167,237,185,176,7,174,239,28,211,94,73,241,251,199,188,247,90,11,169,92,61,226,222,23,119,142,185,112,196,49,115,107,202,250,151,77,83,194,1,192,188,248,189,148,228,249,15,54,113,238,59,51,188,48,199,99,83,30,38,252,145,12,215,246,254,235,206,113,107,57,148,50,131,71,219,59,50,188,104,203,123,51,60,10,61,202,131,41,179,94,252,230,6,239,187,21,174,78,242,11,121,100,241,146,213,220,156,82,242,210,157,115,122,45,77,202,239,97,45,239,79,121,112,112,53,221,242,156,173,156,227,250,139,57,114,154,188,182,125,41,245,216,60,138,41,225,0,96,86,125,51,229,163,254,155,147,252,151,60,50,218,187,25,135,82,70,49,63,153,82,139,252,130,148,37,163,151,147,124,61,201,127,75,242,27,25,94,198,123,35,190,152,50,186,61,248,216,255,132,36,255,54,37,233,252,110,202,3,107,239,74,89,62,250,167,83,18,246,193,18,223,95,75,121,83,240,177,140,158,35,250,88,106,82,222,44,252,70,74,41,201,143,166,148,110,60,49,37,89,254,124,146,223,234,199,215,125,152,112,35,62,158,242,41,192,37,41,203,107,239,76,41,155,25,44,6,243,64,146,87,165,204,47,253,170,36,63,152,242,187,250,124,202,2,55,251,250,113,12,222,220,188,52,229,141,200,86,141,108,190,51,37,73,191,40,165,214,123,71,202,106,129,55,164,148,178,92,155,173,95,217,17,0,152,85,243,242,17,43,48,125,230,165,127,81,194,1,0,0,99,144,64,3,0,192,24,36,208,0,0,48,6,9,52,0,0,140,65,2,13,0,0,99,144,64,3,0,192,24,36,208,0,0,48,6,9,52,0,0,140,65,2,13,0,0,99,144,64,3,0,192,24,36,208,0,60,218,93,152,164,105,189,254,254,100,195,1,166,157,4,26,0,0,198,176,125,210,1,0,192,58,94,156,228,251,90,237,207,36,89,154,80,44,0,18,104,0,166,222,5,73,46,109,181,207,141,4,26,152,32,37,28,0,0,48,6,9,52,0,0,140,65,2,13,192,180,250,131,148,89,49,46,237,108,255,66,127,251,39,70,156,243,87,147,92,153,228,230,36,223,74,114,103,146,223,79,242,207,147,60,101,147,113,188,44,195,179,116,28,74,242,35,157,99,170,36,231,39,249,64,146,91,146,220,147,228,182,36,159,76,242,250,36,39,109,242,222,0,0,76,187,186,174,155,186,174,155,73,199,145,71,18,232,213,94,237,4,186,74,73,146,215,58,254,59,73,94,57,226,62,107,77,99,247,188,254,121,237,253,23,117,206,63,57,201,71,215,185,247,109,73,158,51,214,79,15,115,104,138,250,151,163,98,4,26,128,105,117,71,146,63,74,114,87,103,251,151,251,219,123,173,109,63,151,228,234,117,174,119,114,146,143,39,249,177,13,222,127,79,74,146,126,114,107,219,149,73,174,109,181,183,37,249,80,146,215,172,115,173,103,38,249,157,108,126,20,28,0,128,105,53,133,35,68,239,203,240,104,238,15,116,246,159,153,82,86,49,216,255,64,146,75,146,156,157,228,185,73,174,234,156,255,141,12,151,84,140,26,129,62,41,201,103,59,219,175,207,145,179,87,189,178,115,204,87,83,102,13,121,102,146,191,158,146,128,183,247,255,218,38,127,7,48,23,166,176,127,1,128,163,55,133,127,224,214,75,160,223,222,217,255,243,35,174,241,171,157,99,94,213,218,215,77,160,223,144,50,170,220,222,246,95,51,186,142,249,230,206,113,63,220,217,127,98,74,249,70,251,152,103,172,253,227,194,252,154,194,254,101,83,148,112,0,48,235,94,218,105,223,56,226,152,235,58,237,23,174,113,189,75,83,146,232,129,219,146,188,54,201,255,237,28,183,59,201,121,173,246,151,82,74,75,218,30,72,242,225,206,182,31,92,227,222,192,12,144,64,3,48,203,78,200,240,136,244,125,73,190,57,226,184,175,117,218,103,173,113,205,115,58,237,79,101,184,222,122,96,79,167,253,133,36,43,35,142,187,181,211,126,234,26,247,6,102,128,4,26,128,89,118,98,167,253,141,148,50,137,174,251,59,237,39,141,113,143,203,146,60,127,196,246,110,73,199,183,87,57,255,59,157,246,19,198,184,55,48,133,36,208,0,204,178,239,118,218,187,86,57,238,137,157,246,221,99,222,231,154,36,143,239,108,123,176,211,62,101,149,115,79,237,180,187,9,53,48,99,36,208,0,204,178,135,82,106,143,7,78,207,145,165,21,73,153,169,163,237,182,53,174,249,112,202,226,41,31,111,109,123,126,146,55,117,142,235,150,117,156,155,50,31,117,87,183,92,228,206,53,238,13,204,0,9,52,0,211,174,91,146,177,163,211,254,76,167,253,138,17,215,232,206,211,252,185,53,238,119,69,146,79,39,185,60,165,166,122,224,202,12,215,91,239,79,242,199,173,246,185,73,126,168,115,173,199,101,120,97,150,116,206,1,102,144,4,26,128,105,215,45,121,120,125,74,178,58,168,75,254,72,103,255,187,242,200,60,208,231,36,121,91,146,159,105,237,255,102,142,76,186,219,238,233,127,189,35,201,91,58,251,62,144,146,20,15,188,175,179,255,63,166,204,3,253,140,148,217,54,62,220,143,99,224,215,115,228,3,141,0,0,204,178,41,156,167,245,21,25,189,60,246,87,91,199,188,121,149,99,70,189,94,210,185,254,90,75,121,239,72,25,173,110,239,191,162,181,127,123,146,27,54,120,223,111,197,12,28,60,202,77,97,255,178,41,70,160,1,152,118,191,157,245,203,30,222,155,228,23,215,57,230,193,36,175,78,242,155,99,220,251,80,146,55,118,182,189,35,201,243,250,223,47,167,36,220,159,88,231,58,95,79,89,66,252,142,49,238,13,0,192,44,152,210,17,162,39,38,249,133,36,55,165,204,160,113,91,146,247,143,56,238,156,148,165,187,255,123,146,3,73,22,83,86,17,188,60,201,25,171,92,123,173,17,232,129,43,59,199,220,156,225,82,142,42,201,223,78,153,173,227,127,37,185,55,37,105,190,49,201,197,73,78,222,208,79,9,115,110,74,251,23,0,56,58,254,192,1,199,202,188,244,47,74,56,0,0,96,12,18,104,0,0,24,131,4,26,0,0,198,32,129,6,0,128,49,72,160,1,0,96,12,18,104,0,0,24,131,4,26,0,0,198,32,129,6,0,128,49,72,160,1,0,96,12,18,104,0,0,24,131,4,26,0,0,198,32,129,6,0,128,49,72,160,1,0,96,12,18,104,0,0,24,131,4,26,0,0,198,32,129,6,0,128,49,72,160,1,0,96,12,18,104,0,0,24,131,4,26,0,0,198,32,129,6,0,128,49,72,160,1,24,82,85,213,114,146,220,116,211,77,219,39,29,11,48,63,6,125,202,160,143,153,101,18,104,0,134,52,77,243,96,146,156,113,198,25,39,78,58,22,96,126,12,250,148,65,31,51,203,36,208,0,116,29,76,146,19,79,60,113,231,164,3,1,230,71,171,79,57,56,209,64,182,128,4,26,128,33,77,211,124,43,73,14,31,62,188,107,210,177,0,243,99,208,167,12,250,152,89,38,129,6,96,72,85,85,119,38,201,202,202,202,211,38,29,11,48,63,6,125,202,160,143,153,101,18,104,0,134,84,85,245,103,253,175,207,154,116,44,192,252,24,244,41,131,62,102,150,73,160,1,24,210,52,205,255,73,146,170,170,158,51,233,88,128,249,49,232,83,6,125,204,44,147,64,3,48,164,105,154,47,246,191,62,127,210,177,0,243,99,208,167,12,250,152,89,38,129,6,96,200,222,189,123,191,150,164,87,85,213,238,94,175,119,246,164,227,1,102,95,175,215,59,187,170,170,221,73,122,253,62,102,166,73,160,1,24,101,95,146,52,77,243,163,147,14,4,152,125,173,190,100,223,68,3,217,34,18,104,0,142,176,176,176,240,187,253,111,95,50,209,64,128,121,241,146,100,168,111,153,105,213,164,3,0,96,250,220,123,239,189,167,62,240,192,3,247,36,201,9,39,156,176,235,180,211,78,155,249,121,91,129,201,56,112,224,192,147,31,126,248,225,165,164,44,166,114,202,41,167,88,72,5,128,249,115,202,41,167,28,172,170,234,198,36,89,94,94,126,245,164,227,1,102,215,160,15,169,170,234,198,121,72,158,19,9,52,0,171,88,89,89,249,88,146,52,77,115,209,164,99,1,102,215,160,15,25,244,41,0,48,215,122,189,222,237,117,93,55,117,93,95,48,233,88,128,217,83,215,245,5,117,93,55,189,94,239,246,73,199,178,149,140,64,3,176,170,166,105,254,125,255,219,75,39,26,8,48,171,46,77,134,250,18,0,152,111,77,211,236,168,235,250,64,127,20,250,101,147,142,7,152,29,117,93,191,172,223,119,28,104,154,102,199,164,227,217,74,70,160,1,88,85,85,85,135,146,252,74,191,249,214,73,198,2,204,156,65,159,241,43,253,190,4,0,30,61,234,186,254,74,93,215,205,226,226,226,155,39,29,11,48,253,22,23,23,223,220,31,125,254,202,164,99,57,22,140,64,3,176,174,170,170,222,218,255,122,117,175,215,59,107,210,241,0,211,171,215,235,157,85,85,213,213,201,35,125,199,188,145,64,3,176,174,221,187,119,223,144,228,218,36,219,154,166,121,255,164,227,1,166,87,191,143,216,150,228,218,126,223,49,119,36,208,0,108,200,227,30,247,184,159,79,114,71,146,243,23,23,23,127,121,210,241,0,211,167,223,55,156,159,228,142,126,159,49,151,36,208,0,108,200,206,157,59,239,91,89,89,185,36,73,170,170,122,203,210,210,210,133,147,142,9,152,30,75,75,75,23,86,85,245,150,36,89,89,89,185,100,231,206,157,247,77,58,38,0,152,10,173,135,131,154,186,174,207,159,116,60,192,228,213,117,125,254,160,95,240,176,49,0,140,80,215,245,251,250,127,44,239,175,235,250,188,73,199,3,76,78,93,215,231,245,251,130,166,174,235,247,77,58,30,0,152,90,189,94,239,186,254,31,204,131,251,247,239,127,225,164,227,1,142,191,253,251,247,191,176,174,235,131,253,229,186,175,155,116,60,0,48,245,234,186,254,104,255,35,219,67,189,94,239,229,147,142,7,56,126,122,189,222,203,23,23,23,15,245,223,72,127,116,210,241,0,192,204,232,245,122,31,28,212,62,246,122,189,55,78,58,30,224,216,235,245,122,111,108,253,127,255,193,73,199,115,188,85,147,14,0,128,217,183,184,184,120,101,107,193,132,107,171,170,250,199,187,119,239,126,112,162,65,1,91,174,215,235,61,190,105,154,107,146,92,148,36,77,211,92,181,119,239,222,95,154,112,88,199,157,4,26,128,45,177,184,184,120,97,146,15,85,85,181,35,201,215,147,188,121,207,158,61,159,158,112,88,192,22,169,235,250,130,36,255,38,201,153,77,211,28,74,114,241,222,189,123,175,159,112,88,19,33,129,6,96,203,44,45,45,61,251,240,225,195,31,168,170,234,69,73,210,52,205,117,219,182,109,123,251,174,93,187,238,152,116,108,192,230,44,45,45,61,245,240,225,195,111,175,170,234,117,73,210,52,205,190,109,219,182,253,147,93,187,118,221,58,233,216,38,69,2,13,192,150,235,245,122,151,55,77,243,47,91,155,222,189,176,176,240,158,93,187,118,125,123,98,65,1,99,89,90,90,250,222,149,149,149,55,37,185,124,176,173,170,170,43,118,239,222,253,238,9,134,53,21,36,208,0,28,19,7,14,28,56,115,121,121,249,109,77,211,188,54,73,170,170,90,110,154,230,223,109,223,190,253,195,167,159,126,250,255,158,116,124,192,104,119,221,117,215,115,150,151,151,223,80,85,213,37,77,211,108,79,146,170,170,126,109,251,246,237,239,56,237,180,211,190,62,233,248,166,129,4,26,128,99,170,174,235,243,170,170,122,83,211,52,63,49,216,214,52,205,231,170,170,250,100,146,79,239,217,179,103,255,4,195,3,146,212,117,253,148,36,23,52,77,243,83,85,85,253,255,121,221,171,170,186,161,105,154,247,236,217,179,231,15,39,24,222,212,145,64,3,112,92,212,117,253,188,166,105,46,174,170,234,194,36,39,182,118,125,33,201,190,149,149,149,63,218,190,125,251,255,84,47,13,199,222,210,210,210,83,151,151,151,127,96,97,97,225,135,146,188,40,201,185,173,221,15,52,77,115,125,85,85,31,218,179,103,207,45,19,10,113,170,73,160,1,56,174,110,189,245,214,29,167,158,122,234,43,87,86,86,94,94,85,213,223,77,242,216,246,254,170,170,190,211,52,205,237,73,22,147,124,187,105,154,239,84,85,245,80,146,102,18,241,194,140,171,154,166,121,76,85,85,79,72,242,189,73,246,86,85,245,244,166,105,158,208,57,238,47,155,166,249,173,133,133,133,27,15,30,60,248,137,103,63,251,217,135,38,16,235,204,144,64,3,48,49,77,211,44,244,122,189,23,39,121,65,146,191,86,85,213,115,155,166,217,53,233,184,96,222,85,85,181,212,52,205,151,146,252,73,146,155,119,239,222,253,217,170,170,86,38,29,215,172,144,64,3,48,85,22,23,23,191,103,97,97,225,105,203,203,203,123,170,170,122,210,182,109,219,78,110,154,230,49,43,43,43,254,102,193,152,22,22,22,154,170,170,30,58,124,248,240,253,77,211,220,189,125,251,246,122,101,101,229,27,123,247,238,253,139,73,199,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,20,254,31,130,23,188,234,82,237,215,36,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":30846,"duration_micros":2306,"top":740.4705810546875,"left":48.0,"width":282.0,"height":331.7647705078125,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,124,93,117,157,63,254,247,185,73,186,164,77,247,189,13,180,84,144,1,133,130,5,129,22,17,40,46,140,116,113,68,190,85,71,199,125,99,112,196,113,4,193,113,65,70,253,250,19,199,81,113,80,190,42,206,80,28,5,75,170,128,80,42,96,41,133,2,165,45,139,108,165,91,110,186,164,45,93,211,166,77,238,249,253,209,164,147,98,104,19,72,114,114,203,243,249,120,244,65,206,185,231,158,207,235,126,30,228,220,119,62,247,115,63,39,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,12,73,214,1,138,221,250,245,235,143,106,104,104,56,42,151,203,141,74,211,116,72,154,166,253,34,162,103,146,232,90,104,175,52,77,35,34,234,147,36,217,150,36,201,198,66,161,80,83,90,90,250,194,240,225,195,95,200,58,27,0,52,83,229,181,195,154,53,107,6,149,150,150,158,147,166,233,228,52,77,79,141,136,9,17,209,59,235,92,240,26,176,43,34,150,36,73,178,40,73,146,251,27,26,26,254,84,89,89,185,57,235,80,0,188,54,41,160,15,97,237,218,181,67,11,133,194,123,35,98,70,68,156,251,210,199,211,52,173,206,229,114,207,71,68,117,68,212,166,105,186,45,73,146,250,136,72,187,56,42,28,14,146,52,77,123,38,73,210,47,34,134,70,196,152,66,161,240,186,36,73,198,180,114,236,188,136,152,157,203,229,126,51,114,228,200,218,174,141,9,192,107,153,2,250,101,172,89,179,230,173,185,92,238,99,17,241,254,151,60,52,47,77,211,251,146,36,89,88,40,20,22,27,5,131,206,183,102,205,154,65,185,92,238,228,52,77,79,79,146,228,172,248,235,63,102,111,44,20,10,215,87,86,86,222,155,69,62,0,94,91,20,208,47,177,102,205,154,243,147,36,185,52,73,146,150,111,208,191,79,146,228,183,61,123,246,172,26,60,120,240,182,204,194,1,17,17,177,105,211,166,126,245,245,245,211,210,52,189,48,34,46,104,222,159,166,233,188,52,77,175,169,172,172,188,61,195,120,0,28,230,20,208,77,242,249,252,201,17,241,213,136,152,26,17,145,166,233,139,185,92,238,218,36,73,174,31,57,114,228,202,108,211,1,47,103,237,218,181,99,211,52,253,88,161,80,248,76,146,36,3,155,118,207,137,136,175,143,30,61,122,113,150,217,0,56,60,41,160,35,162,166,166,230,234,52,77,191,28,17,145,36,201,182,66,161,240,157,189,123,247,94,51,110,220,184,221,89,103,3,218,102,197,138,21,189,202,202,202,46,205,229,114,95,106,90,13,39,146,36,249,183,81,163,70,93,145,117,54,0,14,47,175,233,2,122,221,186,117,167,53,54,54,254,40,34,222,212,180,235,71,105,154,126,109,204,152,49,155,178,204,5,188,114,213,213,213,131,147,36,249,90,68,92,220,180,235,209,146,146,146,139,71,140,24,241,96,150,185,0,56,124,188,102,11,232,124,62,255,153,136,248,113,211,230,146,92,46,119,233,200,145,35,239,201,50,19,208,113,214,174,93,123,118,161,80,184,38,246,45,55,25,17,241,217,209,163,71,95,155,101,38,0,40,90,213,213,213,223,207,231,243,105,211,191,31,102,157,7,232,60,249,124,254,135,205,191,239,213,213,213,223,207,58,15,0,20,157,124,62,63,171,249,205,180,166,166,230,227,89,231,1,58,95,77,77,205,199,91,252,209,60,43,235,60,0,80,52,242,249,252,173,77,111,160,47,230,243,249,243,178,206,3,116,157,124,62,127,94,211,239,126,154,207,231,111,205,58,15,0,116,123,53,53,53,55,55,125,132,155,175,169,169,153,152,117,30,160,235,213,212,212,76,172,174,174,206,55,125,2,117,115,214,121,0,160,219,170,169,169,249,89,211,27,230,186,124,62,127,82,214,121,128,236,228,243,249,147,154,174,5,105,77,77,205,207,178,206,3,0,221,78,117,117,245,87,154,70,158,247,228,243,249,73,89,231,1,178,151,207,231,39,53,93,19,210,234,234,234,175,100,157,7,0,186,141,154,154,154,25,45,190,125,127,97,214,121,128,238,163,186,186,250,194,22,95,40,158,145,117,30,0,200,220,134,13,27,70,52,127,76,91,93,93,125,101,214,121,128,238,167,186,186,250,202,230,233,93,27,54,108,24,145,117,30,0,200,84,62,159,255,117,211,232,82,85,214,89,128,238,43,159,207,87,53,93,43,126,157,117,22,0,138,67,46,235,0,157,97,205,154,53,239,143,136,139,34,98,103,46,151,251,92,214,121,128,238,171,233,26,177,51,34,46,106,186,118,0,192,65,29,118,5,116,154,166,73,46,151,187,170,105,243,75,35,71,142,92,153,105,32,160,91,107,186,70,124,41,34,34,151,203,93,149,166,105,146,113,36,0,232,90,205,115,26,243,249,252,252,172,179,0,197,35,159,207,207,247,157,9,0,218,226,176,26,129,174,173,173,173,72,146,228,95,34,34,10,133,194,213,89,231,1,138,71,243,53,35,73,146,127,169,173,173,173,200,58,15,0,221,215,97,85,64,239,221,187,247,146,136,168,72,211,244,142,202,202,202,63,102,157,7,40,30,149,149,149,127,76,211,244,142,136,168,104,186,150,0,64,171,14,171,2,186,80,40,124,58,34,34,151,203,253,71,214,89,128,226,211,124,237,104,190,150,0,192,97,45,159,207,207,108,154,251,252,112,214,89,128,226,149,207,231,31,110,186,150,204,204,58,11,0,221,211,97,51,2,157,166,105,243,242,83,55,100,26,4,40,118,55,68,28,112,77,1,128,3,28,22,203,53,173,91,183,110,88,99,99,227,250,136,136,52,77,135,140,25,51,102,83,214,153,128,226,84,93,93,61,56,73,146,141,17,17,37,37,37,195,71,140,24,177,33,235,76,0,116,47,135,197,8,116,99,99,227,5,77,63,254,65,241,12,188,26,77,215,144,63,68,28,112,109,1,128,253,14,139,2,58,34,222,22,17,145,166,233,237,89,7,1,138,95,139,107,201,219,50,13,2,64,183,116,184,20,208,111,109,250,239,188,76,83,0,135,139,230,107,201,91,15,122,20,0,175,73,69,95,64,215,212,212,252,77,68,12,139,136,213,99,198,140,121,54,235,60,64,241,107,186,150,172,142,136,97,77,215,24,0,216,175,232,11,232,136,56,57,34,34,77,211,71,178,14,2,28,62,90,92,83,78,206,52,8,0,221,78,209,23,208,105,154,190,33,34,34,73,146,101,89,103,1,14,31,205,215,148,230,107,12,0,52,43,250,2,58,73,146,215,53,253,248,76,166,65,128,195,205,51,17,7,92,99,0,32,34,34,74,179,14,240,106,21,10,133,35,147,36,137,52,77,87,101,157,5,138,197,180,91,111,170,76,210,24,31,185,116,76,146,36,67,211,52,250,229,34,122,70,68,20,34,234,147,36,182,165,105,90,27,133,164,58,77,98,121,213,244,153,107,178,206,220,213,210,52,93,149,36,73,20,10,133,35,179,206,2,64,247,82,244,5,116,146,36,195,35,34,74,74,74,214,102,157,5,186,171,233,191,191,233,220,92,161,240,214,52,141,211,35,73,78,142,72,7,238,191,141,82,154,70,18,17,105,211,102,18,251,54,146,136,136,220,190,199,102,84,205,122,49,210,116,113,146,196,194,66,46,119,239,173,23,204,60,236,87,188,41,41,41,89,91,40,20,246,95,99,0,160,89,209,223,137,48,159,207,111,139,136,138,94,189,122,245,31,60,120,240,182,172,243,64,119,241,119,191,159,117,65,154,38,23,166,105,58,45,34,250,117,240,233,183,37,73,82,149,36,233,111,111,185,224,125,191,239,224,115,119,11,155,54,109,234,183,123,247,238,173,17,177,125,244,232,209,29,221,127,0,20,177,195,161,128,110,136,136,146,81,163,70,149,38,73,210,152,117,30,200,210,133,191,185,126,80,67,143,242,79,71,18,31,139,136,177,93,212,236,202,72,227,250,210,61,117,63,249,237,123,63,182,185,139,218,236,116,105,154,150,212,212,212,52,68,68,227,232,209,163,139,254,211,58,0,58,206,225,80,64,167,17,17,163,71,143,46,250,215,2,175,212,59,111,255,239,126,189,26,74,190,20,105,250,133,104,154,203,156,129,250,72,146,239,237,46,109,252,206,29,231,127,224,176,248,52,200,245,5,128,214,20,253,42,28,240,90,55,189,234,215,23,247,218,147,91,17,105,250,229,200,174,120,142,136,232,25,105,250,229,94,123,114,43,166,87,253,250,226,12,115,0,64,167,42,250,81,21,35,68,188,86,77,191,237,198,9,73,67,114,77,68,156,157,117,150,151,113,79,90,154,94,122,235,223,190,127,73,214,65,94,41,215,23,0,90,99,4,26,138,208,244,170,27,47,78,26,146,199,162,251,22,207,17,17,103,39,13,201,99,211,171,110,52,26,13,192,97,69,1,13,69,102,70,213,172,159,38,145,252,48,235,28,109,149,68,242,195,25,85,179,126,154,117,14,0,232,40,190,89,14,69,98,250,236,95,12,72,114,61,127,19,17,231,101,157,229,21,248,248,140,170,89,99,211,66,253,123,111,157,241,225,45,89,135,1,128,87,195,8,52,20,129,169,85,55,141,202,229,122,206,141,226,44,158,155,157,151,203,245,156,59,181,234,166,81,89,7,1,128,87,67,1,13,221,220,212,170,89,195,75,210,194,109,105,196,196,172,179,188,90,105,196,196,146,180,112,219,212,170,89,238,238,7,64,209,82,64,67,55,246,137,235,174,43,43,137,244,150,72,146,9,89,103,233,48,73,50,161,36,210,91,62,113,221,117,101,89,71,1,128,87,66,1,13,221,88,237,136,126,55,70,36,147,178,206,209,241,146,73,251,94,27,0,20,31,5,52,116,83,239,174,186,241,170,136,244,194,172,115,116,158,244,194,125,175,17,0,138,139,2,26,186,161,119,87,221,52,53,141,228,202,172,115,116,182,52,146,43,223,93,117,211,212,172,115,0,64,123,40,160,161,155,249,251,59,127,213,39,141,244,7,89,231,232,42,105,164,63,248,251,59,127,213,39,235,28,0,208,86,10,104,232,102,118,236,46,249,78,68,140,205,58,71,23,26,219,244,154,1,160,40,40,160,161,27,153,241,187,89,147,35,146,207,102,157,163,235,37,159,221,247,218,1,160,251,83,64,67,119,82,18,87,100,29,33,51,175,229,215,14,64,81,81,64,67,55,49,125,206,175,223,25,17,239,200,58,71,134,222,209,212,7,0,208,173,41,160,161,155,72,210,194,37,89,103,200,154,62,0,160,24,36,89,7,120,181,242,249,124,26,17,49,122,244,232,162,127,45,188,118,77,173,186,105,98,73,164,15,103,157,163,165,146,92,46,222,56,120,88,188,99,220,209,209,167,172,71,236,110,104,136,59,86,60,27,203,54,174,143,134,66,161,211,218,109,140,228,148,57,211,102,62,210,105,13,180,131,235,11,0,173,41,205,58,0,16,81,26,241,161,52,235,16,45,12,238,93,30,223,56,227,156,24,217,167,226,128,253,111,26,62,42,214,215,237,136,175,61,112,79,172,175,219,209,41,109,151,70,124,40,34,186,69,1,13,0,173,49,133,3,186,129,52,210,153,89,103,104,54,184,119,121,92,61,105,202,254,226,121,89,237,186,168,90,254,116,44,169,93,23,105,68,12,47,239,27,223,156,116,110,12,237,221,57,75,55,119,167,190,0,128,214,20,253,199,146,62,98,165,216,205,152,243,223,239,138,52,247,251,172,115,68,252,111,113,60,184,119,121,108,173,223,29,223,120,240,222,88,177,245,197,253,143,87,86,244,143,175,159,113,78,12,232,217,43,214,237,220,17,87,44,184,59,94,220,189,171,227,131,36,133,11,102,79,253,192,31,58,254,196,237,227,250,2,64,107,140,64,67,198,146,180,228,252,172,51,68,236,43,158,175,158,60,37,6,247,46,143,136,136,107,151,46,58,160,120,142,136,88,179,125,107,92,185,224,238,216,182,167,62,70,244,233,27,95,156,56,185,83,254,10,239,46,125,2,0,173,81,64,67,198,210,72,207,205,58,67,115,241,60,168,87,239,253,251,46,158,240,230,24,83,209,239,175,142,173,217,177,61,190,250,192,159,98,79,99,99,28,59,104,72,188,125,236,209,29,158,167,59,244,9,0,188,28,5,52,100,232,93,115,110,56,34,34,142,201,50,195,136,62,255,91,60,111,218,85,23,95,190,255,238,216,80,183,51,42,122,244,140,111,78,154,210,106,17,189,106,219,150,184,245,249,191,68,68,196,105,35,199,116,70,172,99,154,250,6,0,186,29,5,52,100,168,44,45,157,152,101,251,35,251,84,196,213,147,246,21,207,181,187,118,198,101,247,207,141,167,55,215,198,151,239,159,27,27,234,118,70,191,30,61,227,223,38,157,23,71,84,244,255,171,231,62,177,105,67,68,68,28,209,111,64,167,100,203,186,111,0,224,229,40,160,33,67,73,196,9,89,181,221,60,109,99,96,83,241,124,249,252,185,177,105,87,93,68,68,108,222,189,43,46,155,127,87,172,175,219,17,125,123,244,136,111,78,158,18,149,47,41,162,135,52,205,149,222,190,167,190,83,242,101,217,55,0,112,48,10,104,200,80,26,241,250,44,218,29,221,183,95,124,235,204,243,98,64,207,94,177,161,110,103,124,249,254,187,99,243,75,86,211,216,82,191,59,190,124,255,221,177,118,231,246,232,91,214,35,174,158,60,37,198,245,31,24,17,17,229,101,101,113,225,49,199,71,68,196,179,47,110,234,148,140,89,245,13,0,28,138,2,26,178,148,36,71,118,117,147,163,251,246,139,171,39,79,137,1,61,123,69,237,174,157,241,229,251,255,119,228,249,165,94,220,189,43,174,184,255,238,200,239,216,22,125,203,122,196,85,147,206,141,227,6,15,139,171,206,56,55,70,246,169,136,237,123,234,227,198,191,44,237,156,160,25,244,13,0,180,133,2,26,178,148,198,200,174,108,174,178,162,127,92,61,121,74,244,235,209,51,214,238,220,30,151,207,159,251,87,35,207,47,181,165,126,119,92,185,96,94,84,111,223,22,229,165,101,241,205,73,231,198,184,254,3,99,119,99,67,124,107,209,159,99,75,253,238,206,9,219,197,125,3,0,109,165,128,134,108,13,234,170,134,142,168,232,31,223,156,116,238,254,226,249,138,86,166,109,188,156,173,245,187,227,59,15,207,223,191,189,187,177,33,190,177,240,158,120,122,243,198,206,138,27,209,133,125,3,0,237,81,154,117,0,120,141,235,156,251,97,191,68,101,69,255,248,230,228,41,209,183,172,71,172,175,219,17,87,220,127,119,187,70,142,251,245,232,25,151,157,122,102,68,68,236,110,104,136,127,125,96,94,60,191,101,115,103,197,109,214,37,125,3,0,237,101,4,26,178,85,210,217,13,52,79,219,104,46,158,47,159,63,183,93,197,243,128,158,189,226,234,201,83,98,116,223,126,81,215,176,183,171,138,231,136,46,232,27,0,120,37,140,64,67,182,26,162,19,127,15,199,245,31,24,95,63,227,156,232,91,214,35,242,59,182,197,87,22,204,107,119,241,252,173,51,207,139,225,229,125,163,174,97,111,124,101,193,188,191,186,189,119,39,106,232,170,134,0,160,61,140,64,67,182,118,118,214,137,199,245,31,24,87,77,58,119,127,241,220,222,105,27,45,139,231,29,123,247,116,117,241,28,209,137,125,3,0,175,134,2,26,50,148,68,210,41,115,33,198,245,31,24,223,56,227,156,40,47,45,139,252,142,109,113,229,130,121,177,173,29,55,60,25,212,171,119,124,251,204,183,237,43,158,247,100,82,60,119,90,223,0,192,171,165,128,134,76,165,107,59,250,140,125,202,122,196,21,111,62,43,250,148,245,136,53,219,183,198,21,247,223,29,91,219,49,242,60,168,87,239,184,122,242,148,24,86,222,39,182,239,169,143,175,60,48,47,86,109,219,210,209,49,219,160,227,251,6,0,58,130,2,26,50,84,72,211,149,29,125,206,169,227,95,31,131,122,245,142,141,187,234,226,43,237,28,121,30,86,222,103,255,180,141,237,123,234,227,202,5,89,21,207,157,211,55,0,208,17,124,137,16,50,148,75,114,79,167,145,118,232,57,223,56,100,120,68,68,220,190,226,217,118,21,207,195,203,251,198,55,39,157,27,131,123,151,199,214,166,155,167,228,119,108,235,208,108,237,145,75,114,79,103,214,56,0,28,132,2,26,50,148,38,201,178,72,59,182,128,238,215,163,87,68,68,108,124,153,219,115,183,102,120,121,223,184,122,242,148,24,212,171,119,108,169,223,29,151,207,159,27,235,235,118,116,104,174,246,74,147,100,89,166,1,0,224,101,40,160,33,67,141,105,250,112,71,47,118,92,86,178,111,102,86,67,161,208,166,227,135,151,247,141,111,157,121,94,12,232,217,171,219,20,207,17,251,250,38,235,12,0,208,26,115,160,33,67,115,166,205,172,137,52,254,210,145,231,44,77,246,253,90,239,45,52,30,242,216,150,197,243,230,221,187,186,77,241,28,105,252,101,206,180,153,53,89,199,0,128,214,40,160,33,99,105,196,221,29,121,190,178,220,190,49,237,67,141,64,143,238,219,175,123,22,207,209,241,125,2,0,29,73,1,13,25,43,137,244,182,142,60,95,105,174,121,4,250,229,11,232,215,15,28,18,223,156,116,110,12,232,217,43,106,119,237,140,203,231,207,141,218,93,221,231,190,37,29,221,39,0,208,145,204,129,134,140,221,50,253,253,119,206,168,154,181,46,34,70,116,196,249,202,154,10,232,183,86,142,221,191,34,71,179,92,18,113,204,192,33,113,226,208,125,77,173,175,219,17,87,46,152,23,155,90,124,225,112,120,121,223,120,203,152,177,145,75,146,54,183,249,194,214,205,241,240,186,124,7,164,143,136,136,117,183,76,127,255,157,29,117,50,0,232,104,10,104,232,14,210,244,166,72,146,207,119,196,169,146,166,194,119,202,17,227,15,122,220,146,218,117,241,195,199,30,140,23,119,239,58,96,255,212,241,199,198,59,199,29,221,174,54,183,239,169,143,15,253,241,119,237,11,250,114,210,244,166,142,57,17,0,116,14,5,52,116,3,185,36,249,101,33,162,67,10,232,107,151,46,138,179,43,199,181,250,88,154,166,241,252,150,205,177,120,195,218,120,98,227,250,86,143,249,195,11,207,196,144,222,229,81,94,86,214,230,54,231,87,175,122,69,89,91,147,75,146,95,118,216,201,0,160,19,180,253,51,218,110,42,159,207,167,17,17,163,71,143,46,250,215,194,107,219,140,170,89,85,17,49,53,235,28,25,155,51,123,218,251,166,101,29,162,153,235,11,0,173,241,37,66,232,38,210,66,225,63,178,206,144,53,125,0,64,49,80,64,67,55,113,235,140,15,204,139,72,170,178,206,145,157,164,106,95,31,0,64,247,166,128,134,110,36,23,241,205,172,51,100,229,181,252,218,1,40,46,10,104,232,70,110,153,54,243,145,36,226,123,89,231,232,106,73,196,247,110,153,54,243,145,172,115,0,64,91,40,160,161,155,41,169,47,253,82,68,60,157,117,142,46,244,116,211,107,6,128,162,160,128,134,110,230,183,239,125,111,99,68,92,146,117,142,46,116,73,211,107,6,128,162,160,128,134,110,104,246,180,247,205,77,146,244,138,172,115,116,182,36,73,175,152,61,237,125,115,179,206,1,0,237,81,244,107,155,90,167,149,131,185,231,158,180,116,228,200,141,189,55,212,109,233,85,222,171,172,180,97,239,222,146,136,136,210,178,178,198,186,221,123,27,134,149,15,216,189,118,237,144,93,103,159,157,52,100,157,181,53,51,110,157,117,67,36,241,193,172,115,116,138,52,126,53,123,250,251,62,148,117,140,131,113,125,1,160,53,69,255,166,224,13,142,102,11,150,174,27,86,86,90,63,52,26,147,193,133,136,129,145,164,253,34,141,222,109,122,114,18,187,34,77,182,229,34,94,140,146,116,211,222,134,158,181,147,78,28,177,161,147,35,183,201,140,91,111,186,51,146,244,109,89,231,232,80,105,114,215,236,233,51,223,158,117,140,67,113,125,1,160,53,110,229,77,209,122,242,201,13,125,119,238,221,117,100,90,154,140,73,27,10,163,35,169,47,45,52,70,68,164,251,14,72,219,113,178,52,122,71,164,189,11,17,195,163,49,162,36,169,143,7,151,172,108,72,74,115,249,164,33,173,238,83,214,123,213,241,199,15,219,209,9,47,227,144,74,247,148,252,93,67,207,189,127,140,72,38,101,209,126,199,75,23,148,238,41,253,187,172,83,0,192,43,85,244,163,42,70,136,94,91,210,52,205,45,124,124,229,49,81,200,189,46,151,139,81,93,217,118,161,16,53,145,43,60,127,250,27,199,62,155,36,73,161,43,219,190,112,238,111,250,55,212,53,84,69,196,89,93,217,110,39,184,175,180,188,116,218,111,207,123,239,214,172,131,180,133,235,11,0,173,41,250,55,5,111,112,175,13,247,63,93,91,81,90,191,227,248,92,82,114,108,33,210,30,89,102,201,69,178,167,144,54,62,221,208,179,239,147,147,143,29,186,189,171,218,125,211,117,215,149,29,49,162,226,127,34,98,70,87,181,217,193,102,175,94,183,253,162,71,63,249,201,189,89,7,105,43,215,23,0,90,83,244,111,10,222,224,14,111,247,223,255,116,69,105,223,222,39,70,46,142,203,58,75,171,10,241,84,195,142,93,75,39,79,62,182,203,10,233,25,183,222,120,77,36,201,231,187,170,189,14,145,166,223,159,61,253,253,151,102,29,163,189,92,95,0,104,141,101,236,232,182,30,122,124,245,196,210,126,189,103,118,219,226,57,34,34,23,199,149,246,235,61,243,161,199,87,79,236,170,38,155,10,209,127,136,72,235,186,170,205,87,46,173,139,136,127,40,198,226,25,0,94,78,209,143,170,24,33,58,252,60,180,116,229,184,66,46,119,106,146,166,253,179,206,210,30,105,146,108,205,21,10,139,222,124,226,216,21,93,209,222,244,219,127,61,62,217,91,184,38,34,166,118,69,123,175,192,156,180,44,119,233,173,231,255,159,229,89,7,121,165,92,95,0,104,77,209,191,41,120,131,59,124,164,105,154,60,244,212,234,73,209,216,141,71,156,219,162,36,158,122,243,113,71,44,72,146,164,61,235,128,188,98,51,170,102,125,40,34,190,22,17,99,187,162,189,54,88,25,17,95,155,61,237,125,55,100,29,228,213,114,125,1,160,53,69,255,166,224,13,238,240,176,96,233,243,195,74,74,122,158,25,133,194,224,172,179,116,136,92,110,83,99,99,253,252,73,39,190,174,203,214,146,158,49,231,166,47,69,154,94,26,17,195,186,170,205,151,216,16,73,114,205,236,169,51,191,147,81,251,29,206,245,5,128,214,152,3,77,230,30,90,178,252,152,146,164,108,250,97,83,60,71,68,20,10,131,75,146,178,233,15,45,89,126,76,87,53,57,123,234,204,239,148,214,151,142,74,11,113,73,68,44,237,170,118,35,98,105,90,136,75,74,235,75,71,29,78,197,51,0,188,156,162,31,85,49,66,84,220,30,88,178,242,164,92,46,57,37,235,28,157,169,80,72,31,62,99,194,216,199,186,186,221,25,191,155,117,86,82,146,188,39,141,116,90,68,84,118,240,233,215,36,145,84,165,141,233,205,179,223,253,190,251,58,248,220,221,134,235,11,0,173,41,250,55,5,111,112,197,107,225,147,107,222,156,52,22,78,204,58,71,87,72,75,114,75,79,63,190,242,161,172,218,159,90,117,211,196,210,72,207,138,52,78,143,36,57,57,141,116,92,123,158,159,68,178,34,210,116,113,36,177,176,33,146,251,230,76,155,249,72,103,101,237,78,92,95,0,104,77,209,191,41,120,131,43,78,15,45,91,121,122,26,201,27,179,206,209,149,146,72,31,127,243,9,99,23,102,157,35,34,98,106,85,85,69,174,176,99,124,82,82,50,38,146,194,208,180,33,250,39,73,218,51,34,34,77,147,250,164,52,182,70,154,171,77,27,27,171,11,185,190,203,231,76,155,214,101,235,92,119,39,174,47,0,180,166,232,223,20,188,193,21,159,7,158,92,115,106,174,177,48,33,235,28,89,40,148,228,150,156,113,124,229,162,172,115,208,54,174,47,0,180,198,151,8,233,82,15,62,190,230,132,215,106,241,28,17,145,107,44,76,120,240,241,53,39,100,157,3,0,120,229,20,208,116,153,135,151,173,58,42,210,194,105,89,231,200,92,90,56,237,225,101,171,142,202,58,6,0,240,202,40,160,233,18,243,151,173,26,216,24,201,89,89,231,232,46,26,35,57,107,254,178,85,3,179,206,1,0,180,159,2,154,46,81,154,54,158,25,145,150,101,157,163,251,72,203,246,245,9,0,80,108,20,208,116,186,69,79,172,62,37,73,74,70,100,157,163,187,73,146,146,17,139,158,88,125,88,175,129,13,0,135,35,5,52,157,106,209,147,43,70,20,10,233,73,89,231,232,174,10,133,244,164,69,79,174,240,199,5,0,20,17,5,52,157,170,177,161,228,212,172,51,116,119,250,8,0,138,139,2,154,78,243,224,226,85,199,37,73,106,116,245,16,146,36,29,241,224,226,85,199,101,157,3,0,104,27,5,52,157,34,77,211,36,45,53,117,163,173,210,210,244,164,52,77,221,172,3,0,138,128,2,154,78,241,192,146,149,39,38,145,244,201,58,71,177,72,34,233,243,192,146,149,39,102,157,3,0,56,52,5,52,157,162,164,52,247,134,172,51,20,27,125,6,0,197,65,1,77,135,123,112,241,170,227,34,141,242,172,115,20,157,52,202,205,133,6,128,238,79,1,77,135,75,202,114,175,207,58,67,177,210,119,0,208,253,41,160,233,80,139,158,92,49,34,77,11,67,179,206,81,172,210,180,48,212,186,208,0,208,189,41,160,233,80,141,123,114,227,179,206,80,236,244,33,0,116,111,10,104,58,84,73,73,58,54,235,12,197,78,31,2,64,247,86,154,117,0,14,31,139,158,92,49,162,208,216,246,165,235,126,242,239,223,153,212,152,54,182,235,143,184,79,93,252,197,251,75,203,202,210,182,28,91,87,183,179,244,201,165,143,13,94,241,194,115,67,119,108,219,222,187,114,236,184,218,241,199,28,191,233,168,241,71,109,111,79,155,117,117,59,75,31,127,244,225,161,171,86,175,24,188,99,219,246,222,99,142,28,187,241,216,191,57,190,246,136,113,227,119,28,236,57,191,252,233,15,79,107,222,78,210,36,253,232,103,255,105,97,143,30,61,11,135,106,175,16,73,159,69,79,174,24,113,234,241,227,214,181,39,39,0,208,53,20,208,116,152,180,80,50,38,162,77,181,109,172,95,183,182,247,188,59,111,251,96,123,219,248,196,103,191,176,32,14,210,72,161,80,72,230,221,121,219,145,243,239,185,235,148,103,158,122,226,172,198,198,198,178,151,30,51,100,232,240,103,79,61,253,204,63,79,125,207,204,101,67,134,14,173,63,88,123,215,253,224,187,103,220,59,239,174,247,236,221,91,255,87,127,24,28,53,254,232,133,159,191,236,107,191,25,57,166,178,238,165,143,253,236,71,215,76,158,127,207,220,153,205,219,19,44,58,86,53,0,0,32,0,73,68,65,84,79,61,189,170,45,197,115,179,125,125,25,10,104,0,232,134,20,208,116,152,36,73,71,166,109,171,159,227,249,231,158,28,216,209,237,111,219,186,181,236,219,95,253,210,123,159,125,230,169,183,28,236,184,141,181,235,143,185,125,206,205,199,220,51,239,246,77,159,188,248,11,63,158,252,214,243,242,173,29,247,171,255,119,237,201,115,255,248,251,15,189,220,121,94,88,254,220,233,255,247,170,43,123,124,239,39,191,248,89,46,151,219,255,202,87,60,243,108,191,133,243,239,153,222,188,221,187,188,124,243,135,63,253,79,247,180,231,181,36,73,58,178,61,199,3,0,93,199,28,104,58,68,154,166,73,99,33,218,188,122,196,170,23,86,12,233,200,246,107,55,172,239,117,229,63,127,230,227,135,42,158,91,218,181,179,110,240,143,174,249,246,63,223,54,231,230,191,250,210,94,93,221,206,210,59,127,127,235,255,105,185,175,162,98,64,205,136,145,163,159,40,41,41,217,219,188,111,205,234,21,111,170,186,249,215,7,44,61,247,139,159,255,248,188,134,134,134,222,205,219,111,57,247,237,183,14,31,49,114,87,123,94,79,99,33,70,184,181,55,0,116,79,70,160,233,16,15,44,91,62,180,36,41,107,115,193,183,126,93,254,128,2,250,154,107,127,241,133,131,205,41,62,148,159,254,232,187,231,213,84,175,57,224,86,216,163,198,84,46,121,251,59,167,222,253,198,147,38,174,29,48,104,72,253,51,79,61,62,104,222,31,111,123,211,99,143,62,120,126,243,212,142,134,189,123,203,127,125,195,245,31,155,120,234,164,111,180,44,114,231,222,49,103,124,125,253,238,254,205,219,83,206,159,250,203,79,253,227,63,47,140,136,120,98,241,226,193,223,250,198,191,92,94,95,191,167,34,34,98,241,195,15,156,48,227,189,239,123,58,34,226,161,249,247,142,124,106,217,99,111,107,126,222,192,65,131,86,124,232,99,159,121,184,189,175,39,137,72,30,88,182,124,104,68,108,104,239,115,1,128,206,101,4,154,14,145,36,37,131,218,115,252,198,245,27,134,55,255,92,222,167,207,65,191,144,119,40,15,205,191,119,228,99,15,47,122,87,203,125,39,77,60,237,247,255,126,221,127,253,231,223,190,251,162,231,142,24,55,126,71,191,254,253,247,158,114,250,228,245,151,125,253,91,183,127,248,211,151,92,83,90,90,186,191,88,222,85,87,55,232,23,63,249,247,179,91,62,63,191,102,213,254,181,172,75,75,75,119,125,228,147,255,248,80,243,246,27,78,62,121,211,81,227,143,221,95,20,111,170,173,29,221,252,243,141,191,250,217,244,104,97,198,123,222,127,115,123,230,62,183,212,222,62,5,0,186,134,2,154,14,145,75,99,64,123,142,223,88,187,97,127,209,57,114,84,229,51,175,166,237,217,183,220,116,110,203,237,113,175,59,230,129,203,191,254,237,219,90,206,75,110,233,29,127,59,227,133,11,102,92,244,203,150,251,30,89,180,112,218,11,203,159,171,104,237,248,198,198,198,30,47,221,151,228,146,191,42,138,111,190,233,134,227,107,170,215,76,104,222,30,59,110,252,67,231,207,184,240,249,182,190,142,151,106,111,159,2,0,93,67,1,77,199,200,229,90,45,62,91,179,103,79,125,110,203,139,155,246,175,117,60,106,76,229,154,186,186,157,165,143,44,122,96,216,236,223,204,58,246,167,63,250,222,105,191,185,241,23,111,120,104,254,189,35,55,215,214,246,60,216,185,54,215,214,246,92,241,252,179,167,181,220,119,209,223,127,228,142,151,43,158,91,28,179,116,200,208,225,207,182,220,119,255,189,115,143,110,254,121,116,229,145,181,205,63,167,105,90,242,243,235,126,248,230,230,237,109,91,183,150,173,94,181,252,141,205,219,67,134,14,171,174,171,219,89,122,199,156,91,102,52,239,75,146,164,241,131,159,248,199,170,131,101,56,164,118,244,41,0,208,117,204,129,166,67,20,26,211,190,185,92,219,166,64,47,127,230,217,254,45,151,151,123,230,47,79,156,248,145,139,46,152,209,208,208,208,171,181,227,223,112,194,155,238,252,200,167,46,190,171,181,105,30,247,254,233,143,71,181,60,215,168,49,149,75,38,158,122,198,33,231,13,151,150,149,165,167,158,126,230,159,111,159,115,243,49,205,251,158,92,186,228,248,136,88,28,17,113,222,59,167,46,191,249,166,27,54,237,218,89,55,56,34,226,238,219,231,252,195,83,203,30,59,105,232,176,225,249,39,151,45,57,167,101,214,137,167,79,90,250,243,235,126,112,250,214,45,91,42,155,247,189,233,148,51,254,112,194,132,147,55,29,178,51,14,162,208,152,246,125,53,207,7,0,58,135,17,104,58,68,73,105,174,213,226,183,53,43,158,127,122,112,203,237,13,235,214,30,247,114,197,115,68,196,19,203,30,125,251,215,47,255,252,231,31,127,116,209,95,173,220,177,242,133,229,163,90,110,31,115,236,241,79,180,53,199,196,211,39,191,208,114,123,253,186,234,253,35,208,229,229,125,26,206,123,231,212,155,91,62,94,83,189,230,196,165,139,31,57,191,101,214,49,71,140,93,252,134,19,223,180,118,193,61,247,236,31,125,238,93,94,190,249,99,23,95,58,175,173,57,94,78,123,250,20,0,232,58,10,104,58,68,161,16,7,157,106,209,82,117,126,117,187,151,176,219,186,117,203,152,31,94,243,237,143,110,217,178,241,128,249,200,219,182,108,237,223,114,123,220,184,241,109,190,249,200,9,19,78,222,84,90,86,182,255,38,40,59,182,239,24,190,103,79,253,254,223,137,15,126,244,51,139,207,123,199,5,55,180,252,194,97,75,71,141,63,122,225,165,151,125,245,198,27,127,254,147,115,90,222,104,229,173,83,222,49,251,80,55,104,105,139,246,244,41,0,208,117,76,225,160,67,228,210,66,105,154,180,109,10,199,250,117,107,135,189,116,223,168,209,149,203,38,159,61,229,190,9,39,159,90,61,98,212,152,157,75,23,63,60,252,177,197,139,142,90,112,207,220,247,54,79,209,216,188,121,227,81,55,252,231,181,147,62,119,217,191,238,191,41,201,142,157,219,14,40,160,7,12,29,188,179,61,185,43,42,42,214,191,184,121,243,184,230,237,252,138,85,125,199,189,254,152,109,205,219,159,252,220,23,31,152,126,209,7,30,187,109,246,111,223,144,175,94,57,106,119,253,238,222,35,134,143,94,123,202,164,183,60,115,218,25,103,174,91,188,232,129,97,75,23,63,114,126,243,241,3,7,13,90,241,247,31,253,244,35,237,201,240,114,114,105,193,239,39,0,116,67,222,160,233,16,105,146,180,249,211,140,205,181,181,7,220,112,229,164,83,78,253,195,23,175,188,250,182,150,203,189,157,121,246,148,234,51,207,158,82,125,228,216,113,235,255,235,250,159,92,218,188,255,145,71,22,78,169,171,219,57,191,188,188,79,67,68,196,238,186,186,3,230,9,87,84,12,106,215,200,111,239,242,62,219,94,220,188,121,255,246,198,205,27,123,143,139,255,45,160,35,34,134,143,24,185,235,35,159,190,164,213,181,156,255,251,231,215,77,107,185,61,253,162,15,252,182,80,40,36,191,251,159,255,250,155,231,158,121,250,200,45,91,54,13,26,48,96,240,230,163,95,127,236,170,243,167,189,231,217,94,189,122,55,182,53,91,123,250,20,0,232,58,10,104,58,68,26,145,38,17,109,26,130,174,221,176,254,168,230,159,7,14,24,188,242,243,151,125,253,142,151,91,43,121,218,223,205,124,102,254,188,187,30,90,185,98,249,155,35,34,118,237,220,57,100,193,252,121,99,206,123,251,212,149,17,17,189,122,245,58,96,196,121,231,246,45,237,154,246,80,95,191,167,188,229,118,255,1,253,219,92,128,87,221,114,211,235,87,175,90,49,177,121,123,236,184,241,15,29,115,236,113,27,63,247,137,15,92,186,169,182,246,117,45,143,125,120,225,252,184,243,182,57,207,125,225,242,175,93,127,204,223,28,191,165,45,231,79,35,218,120,99,116,0,160,43,41,160,233,16,73,146,52,70,154,182,233,255,167,255,158,253,199,203,218,115,238,227,222,120,210,227,205,5,116,68,196,234,23,94,24,22,17,43,35,34,202,43,250,109,109,121,236,150,23,183,244,142,118,168,171,219,126,192,205,74,70,140,26,211,166,41,32,187,119,239,42,153,115,243,77,23,54,111,39,73,210,120,225,204,15,223,241,237,175,126,249,179,91,183,108,62,178,181,231,108,170,93,127,244,119,191,113,229,167,191,247,159,191,252,255,250,245,239,191,183,181,99,90,74,146,164,205,163,213,0,64,215,241,17,49,29,163,49,61,100,65,248,74,13,25,62,252,128,34,121,199,246,237,251,71,141,43,250,244,57,96,105,187,53,171,87,12,141,54,90,189,98,121,223,230,101,234,34,246,221,113,176,45,133,109,68,196,175,174,191,246,148,150,203,214,77,60,109,242,156,251,239,155,251,134,150,197,115,223,138,138,245,39,77,60,237,247,229,125,42,246,47,171,247,226,150,77,99,127,241,147,31,76,110,83,192,78,236,83,0,224,149,83,64,211,33,146,92,236,238,172,115,151,228,146,3,167,50,20,210,253,83,69,142,28,127,116,190,229,67,207,63,253,212,177,109,61,239,253,127,254,211,81,45,183,199,84,30,185,172,45,207,91,191,110,109,239,251,238,190,243,221,205,219,189,203,203,55,127,240,99,159,250,243,210,37,139,223,210,188,239,136,177,227,30,254,143,159,205,186,234,138,171,254,239,31,126,244,255,102,125,99,212,152,202,165,205,143,45,89,252,200,91,10,133,194,33,167,187,116,102,159,2,0,175,156,2,154,142,145,164,117,135,62,40,226,182,91,127,115,244,123,222,249,150,235,154,255,125,247,170,43,223,118,168,231,172,94,177,226,128,85,59,250,15,24,184,189,249,231,115,222,246,174,231,74,74,74,246,143,212,174,94,181,98,194,234,21,203,219,116,3,146,37,139,23,77,104,185,125,252,132,147,219,84,64,95,255,227,107,206,173,175,223,189,127,245,143,179,167,156,255,187,237,91,183,245,168,219,185,125,127,206,211,206,60,103,97,243,104,118,191,254,253,247,78,60,245,244,7,155,31,219,190,125,203,168,245,53,249,67,79,53,105,99,159,2,0,93,75,1,77,135,72,210,220,246,67,31,21,113,242,169,167,31,48,98,252,212,227,203,78,111,185,246,242,75,237,217,83,159,123,124,233,163,167,182,220,119,236,9,19,170,155,127,30,50,116,104,253,81,175,59,122,97,243,118,67,67,67,239,89,191,252,233,91,226,16,238,189,251,206,202,23,158,125,102,82,203,125,103,157,251,142,103,14,245,188,101,75,22,15,94,242,232,162,253,203,214,13,30,50,236,185,15,124,244,147,143,190,184,177,246,128,130,120,192,128,129,7,20,191,253,7,29,184,188,222,198,245,107,15,248,242,98,107,218,218,167,0,64,215,82,64,211,33,210,92,110,235,161,143,138,24,57,170,178,110,204,17,99,23,55,111,111,223,190,101,212,53,87,255,235,59,94,110,74,195,143,190,251,111,231,108,88,191,110,255,180,140,254,3,6,173,58,245,180,73,235,91,30,243,238,139,254,225,238,150,219,143,44,90,56,237,39,223,255,206,1,197,113,75,11,230,223,61,234,134,159,253,199,71,91,238,155,120,234,164,170,163,198,31,125,200,130,245,87,215,255,120,106,154,166,37,205,219,211,47,124,223,236,30,61,122,22,6,14,25,122,192,205,86,54,174,95,215,239,128,237,13,235,15,88,175,122,224,176,161,173,222,156,165,165,182,246,41,0,208,181,172,194,65,135,40,73,234,95,108,104,227,255,78,231,188,253,111,239,249,213,207,126,124,114,243,246,35,139,22,78,187,244,83,31,58,226,29,23,188,251,174,227,222,112,194,134,1,131,134,212,63,244,224,125,163,231,221,113,219,228,231,159,249,203,153,45,159,123,214,148,183,253,49,151,203,29,48,39,250,148,211,207,88,63,241,180,73,183,62,242,224,130,233,205,251,230,221,117,219,7,255,242,228,178,9,111,63,127,234,93,111,60,105,226,218,1,131,134,212,63,245,228,178,193,247,222,121,251,201,143,61,250,224,249,205,55,103,137,136,40,239,83,177,225,227,159,250,167,63,29,42,247,109,191,251,159,163,87,46,127,238,180,230,237,177,227,198,63,244,206,169,239,94,30,17,49,118,252,235,182,149,247,169,216,208,60,141,227,158,187,238,56,255,220,119,94,240,236,240,17,35,119,189,176,252,133,138,249,247,222,189,127,212,186,162,98,64,205,168,209,71,30,114,122,70,73,82,255,226,161,142,1,0,186,158,2,154,14,177,169,97,199,166,254,201,128,54,29,251,174,233,23,62,119,255,125,119,47,104,57,133,162,122,205,170,147,174,191,246,251,39,29,236,121,71,29,243,250,5,31,248,240,167,30,107,237,177,75,190,120,229,220,175,93,254,79,67,91,158,179,38,191,230,132,95,252,236,199,39,28,236,156,61,123,246,218,250,217,207,125,241,218,193,35,135,31,244,11,123,123,246,212,231,170,110,249,159,253,95,28,44,41,41,221,243,193,79,252,99,85,243,118,143,30,61,11,39,78,56,249,207,11,23,220,247,158,136,125,171,109,92,118,201,39,255,101,240,176,161,171,55,110,88,55,110,199,246,237,195,155,143,157,48,113,226,159,95,250,71,64,107,54,53,236,216,116,168,99,0,128,174,103,10,7,29,226,237,39,158,184,51,114,201,182,255,191,189,59,15,147,172,172,239,5,254,61,61,155,128,56,178,12,203,44,132,85,5,100,21,89,70,188,113,52,110,68,205,53,209,104,76,36,49,94,19,141,187,49,137,81,131,74,196,196,53,138,68,19,141,55,162,209,24,151,171,113,5,69,112,37,40,40,10,18,1,149,197,233,238,1,6,70,96,2,56,75,247,185,127,188,167,236,234,154,234,158,174,161,123,170,187,249,124,158,167,158,234,83,231,61,167,126,125,102,230,204,183,222,122,207,123,182,223,50,25,24,24,168,255,242,181,111,250,143,125,247,91,126,213,84,247,127,216,131,31,242,141,215,158,249,182,127,159,40,120,238,186,235,110,91,223,248,214,115,254,237,240,135,30,253,213,169,238,115,151,221,118,187,245,101,127,245,250,183,159,244,200,71,173,219,94,219,15,127,224,189,39,108,216,112,235,175,102,237,56,254,196,83,190,112,244,177,199,143,11,184,207,123,241,43,191,182,199,3,247,186,161,181,188,113,227,237,203,111,248,217,79,78,110,15,207,123,238,181,247,117,207,249,211,151,126,107,187,197,13,84,119,62,254,152,99,122,186,45,57,0,176,115,8,208,76,155,122,203,200,77,83,109,187,247,178,101,155,254,225,159,207,61,231,177,79,120,242,185,187,236,182,219,173,19,181,91,184,112,225,47,31,255,228,167,254,223,179,222,241,79,31,221,222,28,205,139,23,47,25,125,195,155,207,254,196,179,78,127,222,59,247,94,182,239,132,23,4,46,92,180,232,238,147,86,255,175,79,189,229,236,247,157,245,240,83,86,223,60,81,187,150,155,111,90,183,203,215,190,122,222,175,134,135,236,186,219,110,235,159,251,130,151,93,212,217,238,1,75,151,110,121,221,91,222,121,246,17,15,61,230,130,246,153,65,146,210,99,125,196,209,199,125,249,13,111,121,215,187,167,50,215,116,47,199,18,0,216,185,166,116,235,229,217,108,104,104,168,78,146,21,43,86,204,249,223,101,174,187,228,242,181,135,101,193,232,154,94,183,219,188,121,211,192,231,63,253,241,7,15,15,175,221,187,253,245,61,247,92,118,199,99,159,248,148,107,151,237,51,249,240,138,110,70,71,71,171,111,127,253,194,21,235,111,90,183,251,237,183,255,226,254,155,183,110,94,248,128,7,44,189,107,233,30,123,220,117,252,241,39,173,219,127,229,170,41,79,17,247,181,11,206,95,245,163,43,191,119,96,107,249,208,7,29,62,244,132,223,124,234,117,147,109,179,110,112,237,174,151,92,252,205,3,110,189,245,230,165,251,236,187,223,237,39,158,116,234,218,94,222,51,35,3,23,157,124,220,170,159,76,185,61,51,194,249,5,128,110,230,252,127,10,254,131,155,61,46,186,254,250,251,237,178,113,224,244,126,215,49,31,220,179,251,232,135,214,28,116,144,27,169,244,153,243,11,0,221,24,194,193,180,41,129,175,30,220,126,75,38,87,15,10,207,0,48,123,9,208,76,171,209,212,147,14,109,96,251,28,67,0,152,221,4,104,166,213,166,219,110,248,105,170,106,107,191,235,152,179,170,106,235,166,219,110,248,105,191,203,0,0,38,38,64,51,173,214,172,89,179,53,35,245,181,253,174,99,206,26,169,175,93,179,102,141,15,32,0,48,139,9,208,76,187,106,201,130,31,247,187,134,185,202,177,3,128,217,79,128,102,218,157,116,248,202,219,234,196,56,222,30,213,201,117,39,29,190,210,221,7,1,96,150,19,160,153,17,163,245,146,43,250,93,195,92,227,152,1,192,220,32,64,51,35,30,113,204,126,183,212,213,128,177,208,83,84,87,3,215,62,226,152,253,110,233,119,29,0,192,246,9,208,204,152,234,174,95,126,191,223,53,204,21,142,21,0,204,29,2,52,51,230,228,147,15,187,115,116,180,190,180,223,117,204,118,163,163,245,165,39,159,124,216,157,253,174,3,0,152,26,1,154,25,181,250,216,3,47,79,170,155,251,93,199,236,85,221,92,142,17,0,48,87,8,208,204,184,197,187,44,186,184,223,53,204,86,142,13,0,204,61,2,52,51,238,248,195,246,95,191,96,97,37,40,118,88,176,176,186,248,248,195,246,95,223,239,58,0,128,222,8,208,236,20,15,63,226,128,31,141,102,244,154,126,215,49,91,140,102,244,154,135,31,113,192,143,250,93,7,0,208,59,1,154,157,102,245,209,7,125,189,170,50,220,239,58,250,173,170,50,188,250,232,131,190,222,239,58,0,128,29,35,64,179,83,141,60,112,224,171,85,242,139,126,215,209,47,85,242,139,145,7,14,124,181,223,117,0,0,59,78,128,102,167,90,189,106,213,61,119,143,140,126,165,26,168,54,246,187,150,157,173,26,168,54,222,61,50,250,149,213,171,86,221,211,239,90,0,128,29,39,64,179,211,173,57,238,160,219,71,238,220,120,126,85,143,222,103,66,116,85,143,110,28,185,115,227,249,107,142,59,232,246,126,215,2,0,220,59,2,52,125,177,122,245,145,27,238,220,50,250,197,12,212,183,245,187,150,25,55,80,223,118,231,150,209,47,174,94,125,228,134,126,151,2,0,220,123,2,52,125,243,216,19,14,185,99,195,146,45,159,175,83,175,237,119,45,51,165,78,189,118,195,146,45,159,127,236,9,135,220,209,239,90,0,128,233,177,176,223,5,112,223,118,218,97,135,109,74,242,165,239,94,121,195,234,209,186,122,104,191,235,153,78,3,85,253,163,19,143,58,208,252,215,0,48,207,232,129,102,86,56,241,168,3,47,222,90,143,124,61,85,181,181,223,181,220,107,85,181,117,107,61,242,117,225,25,0,230,39,1,154,89,227,212,99,14,190,38,247,219,237,147,213,64,117,99,191,107,217,81,213,64,117,99,238,183,219,39,79,61,230,96,55,141,1,128,121,202,16,14,102,149,147,15,219,235,206,36,231,95,124,197,245,15,25,168,6,78,72,157,93,251,93,211,148,84,185,123,180,30,189,108,245,67,15,186,186,223,165,0,0,51,75,15,52,179,210,234,163,15,186,250,158,91,175,251,216,192,64,117,121,157,212,253,174,103,34,117,82,15,12,84,151,223,115,235,117,31,91,125,180,240,12,0,247,5,122,160,153,181,214,172,89,179,53,201,165,151,93,54,124,213,150,69,155,142,170,6,170,35,83,87,179,227,239,108,85,111,173,71,235,171,22,109,89,114,229,9,39,44,191,187,223,229,0,0,59,207,236,8,35,48,137,38,160,126,231,178,203,46,251,254,230,197,251,62,100,160,30,121,80,170,106,175,190,20,83,215,183,141,86,11,174,93,188,233,230,171,79,56,225,132,45,125,169,1,0,232,43,1,154,57,163,9,172,87,38,185,242,146,43,175,219,55,163,213,65,245,192,130,95,171,234,122,233,76,190,111,93,85,119,84,163,35,55,102,160,190,254,228,163,15,190,121,38,223,11,0,152,253,4,104,230,164,147,143,58,248,230,36,55,39,185,228,226,171,214,238,89,111,221,180,124,81,22,237,91,103,116,159,186,26,216,253,222,236,187,170,71,55,86,25,184,101,75,182,220,92,45,92,50,188,250,200,85,238,32,8,0,252,138,0,205,156,215,4,220,13,73,126,148,36,23,93,116,253,253,118,219,39,15,172,183,44,122,192,104,181,245,254,85,61,178,235,104,181,112,201,130,5,213,194,122,116,116,65,146,84,3,3,35,35,35,245,214,129,122,235,166,186,90,112,247,64,189,240,127,170,69,91,238,188,235,150,220,190,102,205,65,191,236,231,239,3,0,204,110,2,52,243,78,19,128,111,106,30,0,0,211,202,52,118,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,122,122,45,72,82,55,143,191,220,78,219,125,219,218,238,61,195,117,205,6,31,205,216,239,219,254,216,156,228,167,73,62,150,228,217,73,118,233,87,129,0,0,83,33,64,207,156,55,38,57,186,223,69,204,66,215,39,185,164,237,241,131,36,187,38,121,70,146,15,37,249,114,146,253,250,86,29,0,192,118,8,208,51,103,81,146,119,37,89,210,239,66,102,153,191,75,114,74,219,227,196,36,43,146,28,151,18,168,79,77,242,190,36,85,191,10,4,0,152,140,0,61,179,30,149,228,249,253,46,98,14,168,83,122,162,255,56,201,150,36,79,78,114,194,118,182,89,56,211,69,1,0,116,35,64,207,156,191,105,158,223,148,228,33,59,176,253,145,73,222,145,18,44,239,76,114,117,146,115,146,28,219,165,109,107,60,245,112,146,189,82,198,95,127,43,201,134,36,215,36,121,119,146,195,154,182,7,39,121,115,146,43,146,220,158,228,210,36,175,74,242,128,9,234,216,167,89,255,205,102,127,107,147,252,71,146,39,101,250,123,137,127,156,228,219,205,207,173,99,182,71,198,198,75,175,76,242,182,148,49,211,91,50,62,68,15,36,121,106,146,143,39,185,49,229,88,124,41,201,243,210,125,92,245,19,155,125,190,39,201,131,155,253,94,153,177,99,242,154,230,189,147,210,43,254,175,73,126,146,228,214,148,97,38,127,144,137,255,253,220,63,201,11,147,92,144,228,150,36,215,37,249,72,146,211,210,219,49,123,116,202,241,254,251,30,182,1,0,152,220,208,208,80,61,52,52,84,247,187,142,70,251,69,132,199,166,4,215,58,201,249,217,182,199,116,178,139,8,127,39,201,61,205,186,203,146,124,34,37,220,181,218,63,105,146,125,93,153,228,242,148,161,18,111,79,9,208,117,74,144,59,61,37,32,254,87,179,254,236,148,160,89,167,132,205,69,29,251,61,34,37,252,213,41,161,245,83,41,65,186,245,94,111,220,254,33,249,149,214,69,132,207,219,78,187,243,155,118,167,55,203,237,1,250,7,205,243,85,41,31,0,22,52,109,150,36,249,151,182,118,23,53,191,207,93,109,203,203,58,222,167,21,160,175,73,249,128,242,165,36,127,155,228,159,154,229,58,201,133,73,254,162,249,249,51,205,239,123,110,202,133,143,117,198,62,36,181,91,158,50,20,165,78,249,192,241,133,140,63,102,103,103,234,189,231,175,207,216,7,35,250,96,150,157,95,0,96,122,204,178,255,224,58,3,244,94,25,11,160,157,67,57,38,10,208,7,166,4,191,123,82,66,94,171,199,114,32,201,139,154,246,107,51,126,108,117,251,190,206,206,248,32,188,123,146,111,180,173,127,87,146,197,109,235,151,165,4,210,58,201,99,219,94,95,152,228,187,205,235,127,213,241,126,167,102,44,224,79,245,66,201,169,4,232,21,25,11,175,167,54,175,181,7,232,111,100,172,39,189,221,95,55,235,47,78,114,72,219,235,123,167,204,238,81,167,244,154,183,247,254,182,2,116,123,88,111,121,112,74,248,157,104,253,137,205,235,247,164,244,208,183,44,76,9,204,117,202,56,238,165,109,235,142,72,9,253,117,146,23,119,249,29,186,89,158,242,109,194,255,154,98,123,166,217,44,59,191,0,192,244,152,101,255,193,117,6,232,164,140,231,173,83,130,225,161,109,109,39,10,208,199,37,57,51,221,131,230,64,146,155,154,109,30,58,193,190,246,233,178,221,51,51,54,101,220,158,93,214,255,77,198,130,114,203,158,77,29,111,200,248,192,221,242,254,102,155,63,234,178,174,155,237,5,232,67,146,124,174,105,243,221,182,247,108,15,208,71,118,217,110,191,140,133,249,99,186,172,223,43,101,216,69,157,228,145,109,175,183,2,244,55,211,125,88,69,235,219,131,47,79,80,239,215,155,245,143,106,123,237,9,205,107,215,165,204,44,210,233,215,155,245,183,102,108,120,8,179,216,44,59,191,0,48,75,184,16,107,230,125,46,201,7,146,60,55,101,76,243,83,147,140,76,210,254,242,230,209,205,104,202,52,112,251,166,140,179,237,230,238,46,175,173,107,158,47,75,233,89,237,116,107,243,220,30,174,55,36,57,99,146,58,91,251,156,104,236,244,68,254,60,37,208,183,84,41,61,173,15,110,150,175,73,233,241,221,220,101,219,193,46,175,61,42,201,253,82,142,243,15,187,172,191,45,201,123,147,188,54,201,227,83,2,115,187,219,83,66,109,167,181,205,243,127,117,89,151,140,13,171,120,96,219,107,167,53,207,231,164,251,159,195,55,154,253,157,146,228,17,73,62,63,193,190,1,128,89,76,128,222,57,94,147,210,59,249,228,148,112,248,175,83,216,230,196,36,191,155,50,148,225,208,148,158,212,118,189,92,140,214,10,236,91,39,88,223,10,144,221,254,62,28,152,228,247,146,60,38,101,24,194,254,247,162,142,164,4,229,7,183,45,111,73,9,227,159,73,25,255,252,31,73,126,209,195,254,30,212,60,95,54,73,155,43,154,231,163,122,216,239,72,199,115,167,214,49,91,208,246,90,235,91,135,31,77,178,205,119,82,2,116,183,161,40,0,192,28,32,64,239,28,55,39,121,89,202,197,128,111,79,185,56,237,151,147,180,127,125,146,215,165,244,98,126,50,37,88,222,217,172,123,73,146,3,102,172,210,241,158,148,18,104,119,77,242,197,36,31,204,216,216,224,199,103,252,152,233,169,250,147,148,225,31,211,165,213,19,127,203,36,109,214,55,207,221,134,175,76,167,214,176,140,219,38,105,179,163,61,247,0,192,44,33,64,239,60,159,74,25,7,252,172,148,41,211,94,58,65,187,71,167,132,231,31,166,4,216,206,97,11,79,203,206,9,208,251,164,220,25,48,41,23,177,117,14,125,88,154,29,11,208,211,237,127,154,231,206,89,54,218,181,122,239,123,233,217,222,17,173,253,79,22,212,247,109,158,55,206,112,45,0,192,12,49,15,244,206,211,186,72,111,125,74,8,254,131,9,218,61,166,121,254,64,186,143,249,221,89,78,74,233,81,61,47,219,134,231,217,228,218,230,249,97,147,180,105,93,124,120,197,36,109,166,195,15,58,222,175,83,149,177,27,196,92,59,65,27,0,96,150,19,160,119,174,193,148,139,232,146,137,231,80,110,13,73,232,118,243,143,21,25,63,77,219,76,218,181,227,185,221,162,148,128,61,27,124,61,101,56,204,111,165,251,148,122,75,147,252,89,243,243,249,51,92,203,151,154,231,23,165,251,159,223,201,41,189,249,191,200,216,13,99,0,128,57,70,128,222,249,62,146,228,211,217,246,166,37,45,223,107,158,95,150,228,225,41,189,150,3,41,23,158,253,103,198,134,42,116,11,182,211,233,202,230,249,9,41,23,62,182,134,251,28,154,50,22,250,113,205,242,110,51,92,199,246,172,75,114,86,243,243,123,50,126,170,192,189,147,252,99,202,176,137,143,167,220,157,113,38,125,37,165,199,254,144,36,239,204,248,25,58,14,111,106,73,202,16,157,169,12,39,217,47,201,43,82,130,55,0,48,75,8,208,59,223,104,74,47,244,29,19,172,255,68,74,16,219,63,101,62,228,117,41,211,204,93,220,172,111,205,54,177,223,12,214,152,36,255,157,177,96,122,110,202,197,131,131,41,183,179,126,98,146,207,54,235,86,206,112,29,83,241,182,148,80,255,136,148,250,190,145,50,127,243,141,73,126,191,89,110,221,132,102,38,109,77,153,231,250,210,148,139,37,111,72,233,245,190,56,229,120,30,151,50,197,221,123,167,184,191,23,166,92,116,250,209,105,175,20,0,216,97,46,34,236,143,235,83,110,17,253,190,46,235,238,73,242,219,41,195,14,158,158,50,221,217,79,82,102,195,120,127,202,109,190,127,35,227,239,114,55,83,254,38,101,74,182,231,164,244,134,223,149,50,151,245,57,41,1,254,174,204,142,15,97,191,76,242,127,82,230,130,126,102,202,240,146,37,41,61,206,159,74,242,111,233,62,47,243,76,24,76,25,199,126,122,202,156,223,199,165,28,167,143,165,124,251,208,186,83,225,84,124,43,201,80,202,159,61,0,192,244,112,167,48,96,166,56,191,0,208,205,108,232,61,4,0,128,57,67,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,76,197,153,73,234,230,241,176,62,215,50,23,60,39,99,199,171,110,150,231,147,35,50,254,247,251,64,127,203,1,128,157,75,128,222,185,14,205,248,224,113,117,127,203,153,179,78,207,248,227,88,39,185,43,201,30,83,216,118,143,166,109,231,246,167,207,72,165,0,192,188,179,176,223,5,48,231,252,114,26,246,113,68,146,71,180,45,95,150,228,242,123,185,207,93,147,60,54,201,199,183,211,238,113,77,91,0,128,29,34,64,211,171,59,167,97,31,71,37,121,95,219,242,11,114,239,3,116,146,60,35,219,15,208,207,152,134,247,1,0,238,195,12,225,160,87,211,17,160,103,202,111,39,89,49,201,250,21,73,158,186,147,106,1,0,230,41,1,154,94,108,73,178,177,223,69,108,199,19,39,89,119,218,78,171,2,0,152,183,4,232,217,229,115,25,127,97,219,242,46,109,218,215,223,218,246,250,81,29,235,94,144,100,105,146,23,39,185,32,201,45,73,126,146,228,95,147,156,208,182,221,163,155,215,174,73,178,33,201,133,73,254,52,201,146,46,239,125,99,146,209,182,229,5,41,129,245,189,41,67,48,54,36,89,219,252,30,47,76,178,103,199,246,103,52,181,125,172,227,245,247,182,213,189,184,203,251,110,207,119,218,126,254,253,73,218,61,107,130,109,58,157,154,241,199,242,172,46,109,158,151,222,46,66,124,88,202,108,21,215,39,25,76,242,197,36,127,156,238,199,185,101,85,146,87,54,109,111,76,114,123,146,31,36,57,187,169,177,155,15,116,212,181,36,201,31,36,249,102,146,123,146,252,109,71,251,93,154,245,255,158,114,81,235,237,73,174,72,25,98,243,228,148,63,227,94,29,154,100,184,163,142,87,237,192,126,0,128,153,48,52,52,84,15,13,13,213,253,174,99,138,182,55,11,199,116,6,232,15,165,132,218,206,217,38,234,36,155,147,60,42,99,129,182,219,227,255,101,44,204,174,78,153,138,237,119,218,222,111,239,36,159,157,100,251,58,201,117,73,30,222,182,205,100,239,215,75,128,238,156,133,227,149,29,203,15,238,178,205,67,182,179,77,123,0,190,183,1,186,115,26,187,47,165,28,243,110,191,239,23,146,220,191,203,254,159,145,18,102,39,59,86,239,74,178,168,99,187,206,0,253,214,142,229,215,183,181,61,52,201,247,183,243,30,159,75,178,87,199,123,76,54,141,221,158,73,46,237,88,255,207,153,163,31,214,231,216,249,5,128,157,100,78,254,167,198,148,60,59,201,177,19,172,91,148,18,126,223,48,201,246,79,205,216,120,225,139,83,122,169,63,213,44,47,76,114,110,74,15,101,187,235,83,134,121,180,28,148,228,211,41,97,59,41,61,212,151,36,249,105,151,237,46,105,30,59,18,86,46,79,242,195,182,229,223,236,210,166,253,181,31,52,143,157,229,9,217,54,232,182,156,150,228,213,29,175,61,58,165,151,126,105,219,107,235,147,220,220,209,238,37,41,223,48,76,230,149,29,203,35,205,243,178,148,240,126,220,118,182,127,82,146,143,102,242,158,242,150,37,73,222,159,241,223,112,124,41,201,203,51,254,155,11,0,152,211,4,232,249,237,253,73,78,78,114,76,182,13,82,187,167,132,221,23,167,244,94,175,78,233,117,110,55,209,120,226,147,51,126,60,241,121,41,129,236,224,230,249,35,109,235,86,36,121,74,243,243,57,73,78,73,242,218,142,253,189,165,121,253,148,140,15,224,83,181,56,37,208,183,156,158,241,127,183,7,82,62,80,180,156,155,29,27,42,114,111,188,46,201,241,41,199,250,21,29,235,94,153,100,101,219,242,203,58,214,63,45,201,190,73,246,79,242,27,25,127,140,94,153,169,253,46,223,75,242,141,140,93,4,250,154,36,15,106,91,255,249,36,143,108,94,59,45,227,63,96,60,46,201,31,78,225,61,206,76,185,144,179,229,135,73,254,40,201,221,83,216,22,0,230,12,211,216,205,95,95,73,25,7,221,234,113,188,34,101,238,229,246,89,40,94,153,18,106,91,94,158,241,1,232,152,9,246,125,103,198,247,124,126,39,99,195,73,238,104,246,217,62,22,249,232,94,10,223,1,187,166,4,192,119,52,203,199,164,132,213,203,154,229,135,101,252,239,242,249,76,252,187,205,132,179,82,194,101,203,143,82,198,55,191,188,89,94,148,18,140,63,216,44,127,46,201,151,155,159,235,148,94,252,86,207,252,87,155,245,173,63,167,253,155,125,253,108,130,247,62,47,201,243,83,198,80,183,236,155,228,207,218,150,111,78,249,128,113,123,179,252,147,148,113,218,87,180,181,249,243,148,161,26,35,233,238,185,73,254,178,99,159,207,72,25,123,15,0,243,138,0,61,127,173,205,182,97,231,191,51,62,64,95,213,177,126,48,165,119,179,53,220,96,223,9,246,125,69,198,135,171,251,165,140,167,189,127,179,237,175,117,180,159,202,29,2,239,141,93,82,66,223,151,83,122,75,147,210,235,125,89,219,207,45,231,167,12,33,57,101,134,107,106,215,45,220,126,62,99,1,58,41,67,41,90,1,250,253,109,175,87,73,246,73,25,6,179,107,179,220,249,205,81,183,49,212,45,103,100,124,120,78,146,19,51,126,72,201,135,51,22,158,91,174,76,25,126,209,250,22,226,65,73,14,75,247,187,103,158,156,241,23,104,110,73,242,187,41,23,166,2,192,188,35,64,223,183,108,222,206,250,209,140,15,208,219,27,26,176,38,201,159,164,92,92,56,209,24,223,164,132,190,153,180,75,243,252,145,140,5,232,103,39,121,99,243,222,237,23,248,125,180,99,155,126,249,121,199,242,202,142,229,61,83,46,84,252,195,36,135,111,103,95,147,29,223,110,119,142,60,160,99,185,243,131,84,203,247,50,126,24,207,170,116,15,208,71,116,217,238,191,38,169,9,0,230,52,1,154,29,255,90,190,119,0,0,15,131,73,68,65,84,117,70,38,191,8,113,103,218,173,121,62,47,99,31,0,14,76,25,215,93,101,44,48,110,73,233,85,109,223,166,95,254,167,99,185,189,23,249,208,148,30,234,110,179,137,76,135,221,59,150,55,76,208,238,23,29,203,147,245,116,183,59,57,37,252,191,167,151,162,0,96,174,112,17,225,244,217,37,229,107,246,214,163,51,164,36,219,246,20,78,52,158,116,182,123,84,198,135,231,43,83,102,142,120,96,202,239,120,228,78,174,103,215,230,249,150,140,159,99,186,125,38,145,164,204,117,188,190,99,155,126,233,252,251,209,30,168,223,157,241,225,249,77,41,31,8,22,167,28,223,246,219,160,239,136,206,240,254,128,9,218,117,78,95,215,185,221,100,222,154,153,251,0,0,0,125,37,64,79,159,223,72,9,103,173,199,63,118,105,179,172,99,185,115,90,178,206,169,190,118,228,38,22,59,195,83,58,150,95,158,228,162,148,11,8,251,161,61,12,127,162,237,231,103,167,220,36,164,219,186,201,134,112,116,78,165,55,19,127,14,157,183,28,31,108,158,15,74,153,246,174,229,43,41,179,150,220,152,29,155,161,164,155,181,29,203,157,67,48,90,58,167,184,27,236,218,170,56,51,201,75,219,150,119,77,242,206,248,150,11,128,121,72,128,158,62,235,58,150,31,153,241,243,248,38,227,123,67,147,50,127,113,187,206,0,218,57,86,117,191,29,168,107,38,172,234,88,238,188,72,173,91,239,123,187,206,128,58,149,57,134,39,211,222,179,127,97,146,219,154,159,247,200,216,5,140,235,83,66,126,183,109,58,221,213,177,220,109,12,114,231,159,205,100,14,233,242,218,227,59,150,91,211,198,237,211,241,250,213,217,246,120,117,222,225,177,87,151,118,44,255,113,202,183,7,237,14,207,248,241,207,63,77,185,80,179,155,207,166,220,160,229,159,147,124,171,237,245,39,164,204,206,1,0,243,138,0,61,125,174,204,248,11,195,14,76,25,78,240,148,148,139,237,254,46,219,206,197,252,159,29,203,157,23,104,253,125,202,112,137,195,155,253,124,118,186,138,189,151,110,234,88,110,221,182,123,151,36,191,158,18,164,38,179,177,99,249,153,41,31,56,30,158,123,63,180,226,174,140,205,102,209,238,220,108,27,140,39,210,249,129,224,41,41,127,118,15,77,185,73,200,27,178,237,92,214,147,121,77,243,56,58,229,142,136,207,79,153,22,174,221,5,205,115,231,120,228,103,166,140,41,94,156,210,107,125,102,202,188,208,247,198,112,198,127,67,178,111,202,76,28,167,166,204,180,241,184,148,59,89,182,123,123,146,173,19,236,239,214,148,144,191,41,219,206,113,253,214,102,159,0,192,108,49,203,110,181,251,172,108,255,86,213,173,71,183,11,172,142,239,97,251,237,221,202,187,253,246,202,45,157,183,210,126,76,151,54,119,77,176,255,118,143,238,177,206,79,119,108,127,208,36,109,15,156,224,61,219,117,222,202,187,243,86,219,157,183,226,174,83,230,192,110,119,86,199,250,211,59,214,127,164,199,223,113,178,91,121,111,239,241,150,182,109,171,148,169,246,122,217,190,125,74,190,206,91,121,31,149,238,246,75,233,85,158,202,254,47,200,248,111,9,38,187,149,119,178,237,177,253,66,230,232,80,142,89,118,126,1,96,150,208,3,61,189,62,154,114,131,138,110,83,135,181,251,135,108,219,83,151,36,223,79,185,99,221,68,190,150,210,211,221,111,23,166,244,168,78,228,178,142,229,206,121,161,175,79,114,246,180,86,52,222,37,25,63,7,241,53,41,55,123,233,197,107,51,241,205,73,146,177,233,240,166,98,178,30,249,47,167,76,183,215,82,167,220,0,231,199,147,108,211,121,124,59,199,214,79,197,77,41,183,55,255,225,118,218,125,41,165,23,124,83,15,251,126,75,146,107,219,150,79,75,249,80,1,0,243,130,0,61,253,222,155,210,67,247,87,41,61,137,67,41,99,155,191,151,228,109,41,55,177,120,69,38,14,217,103,166,4,142,143,55,219,174,207,216,93,5,159,148,217,115,115,138,55,165,12,77,57,55,201,13,41,83,158,125,35,201,75,82,122,182,207,111,107,123,92,182,13,209,127,158,228,247,82,166,107,27,74,185,64,237,51,153,250,48,139,201,108,205,248,97,28,31,204,196,195,15,38,114,125,74,175,245,235,82,2,235,198,148,99,255,158,148,59,27,246,242,1,224,204,148,33,42,31,74,25,230,115,115,74,112,254,147,36,191,149,177,219,107,183,92,151,210,139,254,23,73,190,157,242,247,231,103,73,254,37,165,183,249,47,58,218,63,178,135,90,218,93,211,236,239,244,148,225,70,215,166,252,158,255,157,210,171,252,91,41,195,87,38,250,38,98,34,119,100,252,77,98,146,50,148,227,208,29,172,19,0,152,78,190,98,5,102,138,243,11,0,221,232,129,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,115,62,64,215,117,189,37,73,174,186,234,170,197,253,174,5,152,63,90,231,148,214,57,6,0,90,230,124,128,174,170,106,99,146,172,92,185,242,254,253,174,5,152,63,90,231,148,214,57,6,0,90,230,124,128,174,235,122,67,146,108,220,184,113,239,126,215,2,204,31,173,115,74,235,28,3,0,45,115,62,64,15,12,12,12,55,63,174,232,107,33,192,124,179,34,25,119,142,1,128,36,243,32,64,39,185,33,73,170,170,58,184,223,133,0,243,71,219,57,229,134,190,22,2,192,172,51,31,2,244,53,73,82,85,213,225,253,46,4,152,63,218,206,41,215,244,181,16,0,102,157,57,31,160,235,186,190,50,73,70,71,71,143,237,119,45,192,252,209,58,167,180,206,49,0,208,50,231,3,244,226,197,139,47,75,146,170,170,78,236,119,45,192,252,209,58,167,180,206,49,0,208,50,231,3,244,178,101,203,214,37,185,58,201,238,131,131,131,167,244,187,30,96,238,107,206,37,187,39,185,186,57,199,0,192,175,204,249,0,221,184,48,73,170,170,122,108,191,11,1,230,190,182,115,201,133,125,45,4,128,89,105,190,4,232,243,146,164,174,235,39,245,187,16,96,238,107,59,151,156,215,215,66,0,152,149,170,126,23,48,93,6,7,7,111,175,170,106,233,232,232,232,209,171,86,173,114,209,15,176,67,214,174,93,123,212,192,192,192,21,117,93,223,177,114,229,202,7,246,187,30,0,102,159,249,210,3,157,170,170,62,158,36,11,22,44,120,86,191,107,1,230,174,214,57,164,117,78,1,128,78,243,41,64,127,184,249,241,57,125,45,4,152,235,158,147,140,59,167,0,192,252,53,52,52,244,237,161,161,161,122,112,112,240,249,253,174,5,152,123,6,7,7,159,63,52,52,84,15,13,13,125,187,223,181,0,48,123,205,155,30,232,36,169,170,234,61,205,243,75,251,93,11,48,247,180,206,29,173,115,9,0,220,39,12,13,13,93,222,244,32,189,176,223,181,0,115,199,208,208,208,11,155,115,199,229,253,174,5,128,217,109,94,245,64,55,222,220,60,159,177,126,253,250,221,251,90,9,48,39,52,231,138,51,154,197,55,79,214,22,0,230,93,128,94,177,98,197,199,170,170,58,47,201,62,155,55,111,126,83,191,235,1,102,191,230,92,177,79,85,85,231,173,88,177,226,99,253,174,7,128,217,109,222,5,232,198,107,155,231,23,173,93,187,246,180,190,86,2,204,106,205,57,226,69,205,226,107,39,107,11,0,201,60,13,208,203,151,47,255,94,146,215,37,73,85,85,239,222,176,97,195,210,62,151,4,204,66,27,54,108,88,90,85,213,187,155,197,215,53,231,14,0,184,239,26,26,26,186,96,104,104,168,30,30,30,118,67,4,96,27,195,195,195,31,111,46,28,188,160,223,181,0,48,119,204,203,30,232,150,209,209,209,231,39,217,80,215,245,211,7,7,7,207,234,119,61,192,236,49,56,56,120,86,93,215,79,79,178,161,57,87,0,0,73,50,52,52,244,228,166,135,169,30,30,30,126,73,191,235,1,250,111,120,120,248,37,173,243,194,208,208,208,147,251,93,15,0,204,58,235,214,173,123,65,91,136,126,94,191,235,1,250,103,120,120,248,121,173,243,193,186,117,235,94,208,239,122,0,96,214,26,30,30,126,85,91,143,147,155,172,192,125,80,219,205,82,234,225,225,225,87,245,187,30,0,152,245,6,7,7,95,221,22,162,207,216,254,22,192,124,49,52,52,116,70,235,223,255,224,224,224,171,251,93,15,0,204,25,237,99,31,135,135,135,63,88,215,245,130,126,215,4,204,156,186,174,23,12,15,15,127,208,181,16,0,76,151,170,223,5,244,195,224,224,224,211,147,124,168,170,170,251,37,249,65,146,23,173,88,177,226,219,125,46,11,152,102,67,67,67,143,72,114,78,146,99,235,186,254,101,146,211,87,174,92,249,137,62,151,5,192,28,55,175,167,177,155,200,202,149,43,63,177,104,209,162,147,234,186,254,110,146,99,147,124,107,104,104,232,245,253,174,11,152,62,205,191,233,111,165,132,231,239,46,90,180,232,36,225,25,0,166,193,224,224,224,59,218,190,218,189,114,112,112,240,105,253,174,9,216,113,131,131,131,79,27,30,30,190,178,109,188,243,59,250,93,19,0,243,203,125,114,8,71,167,159,255,252,231,143,91,176,96,193,155,146,60,44,73,234,186,190,112,193,130,5,239,216,127,255,253,191,208,231,210,128,41,90,183,110,221,111,142,140,140,188,162,170,170,71,55,47,125,111,100,100,228,213,7,28,112,192,151,251,90,24,0,243,142,0,221,102,120,120,248,165,73,254,186,174,235,125,147,164,174,235,239,14,12,12,124,96,100,100,228,195,171,86,173,186,167,207,229,1,29,214,174,93,187,203,130,5,11,158,61,58,58,250,220,170,170,78,76,146,170,170,110,78,242,119,203,151,47,127,87,159,203,3,96,158,18,160,59,212,117,189,120,120,120,248,229,73,94,148,100,101,243,242,166,36,159,172,235,250,179,155,54,109,58,255,144,67,14,185,163,127,21,194,125,219,207,126,246,179,165,75,150,44,121,124,85,85,79,73,242,180,36,75,154,85,131,73,206,89,190,124,249,63,84,85,181,185,127,21,2,48,223,9,208,147,88,183,110,221,233,163,163,163,167,39,121,76,199,170,139,171,170,186,100,100,100,228,242,129,129,129,171,22,47,94,252,211,101,203,150,109,236,71,141,48,159,173,95,191,126,247,205,155,55,31,58,58,58,122,228,130,5,11,142,171,235,250,228,36,171,59,154,125,117,96,96,224,67,251,239,191,255,135,250,81,35,0,247,61,2,244,20,172,93,187,246,208,129,129,129,255,93,215,245,105,85,85,173,153,160,217,47,146,172,79,114,103,74,143,117,189,211,10,132,249,163,74,233,81,126,64,146,101,73,246,232,214,168,174,235,139,170,170,250,226,232,232,232,103,86,173,90,245,211,157,89,32,0,8,208,61,186,233,166,155,118,219,188,121,243,169,11,23,46,124,120,146,99,234,186,62,60,201,193,73,118,233,115,105,48,31,221,147,228,186,170,170,126,156,228,135,91,183,110,189,116,241,226,197,223,218,111,191,253,238,234,119,97,0,220,119,9,208,211,100,112,112,112,175,170,170,246,174,170,106,247,186,174,151,84,85,229,216,66,143,234,186,174,171,170,218,84,215,245,198,186,174,111,93,185,114,229,109,253,174,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,94,248,255,179,81,72,99,61,198,19,71,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":30848,"duration_micros":1877,"top":740.4705810546875,"left":390.0,"width":293.1728515625,"height":331.7647705078125,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,124,93,117,157,63,254,247,185,55,105,186,164,27,221,155,6,90,16,68,81,209,78,101,107,89,10,45,42,106,23,29,240,11,232,56,126,93,190,14,238,58,142,178,184,3,142,191,249,129,163,248,213,7,142,206,136,10,56,48,80,10,130,172,22,41,101,45,133,86,74,217,91,104,110,210,54,20,186,55,105,147,123,190,127,52,169,105,105,75,3,73,78,114,243,124,62,30,62,204,57,247,220,115,94,249,60,30,61,247,197,201,231,158,19,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,134,36,235,0,0,208,214,234,213,171,15,110,106,106,58,56,151,203,141,77,211,116,120,154,166,131,34,162,34,73,124,100,65,123,165,105,26,17,209,152,36,201,134,36,73,94,42,22,139,181,101,101,101,207,143,26,53,234,249,172,179,245,100,206,70,0,100,102,229,202,149,7,148,149,149,157,156,166,233,148,52,77,143,138,136,119,70,68,191,172,115,65,47,176,53,34,30,75,146,228,161,36,73,238,109,106,106,250,115,117,117,245,203,89,135,234,41,20,104,0,186,84,93,93,221,136,98,177,120,70,68,204,142,136,83,118,127,61,77,211,154,92,46,247,108,68,212,68,68,125,154,166,27,146,36,105,140,136,180,139,163,66,41,72,210,52,173,72,146,100,80,68,140,136,136,113,197,98,241,77,73,146,140,219,195,182,119,69,196,156,92,46,119,205,152,49,99,234,187,54,102,207,162,64,3,208,37,86,174,92,121,82,46,151,251,84,68,156,189,219,75,119,165,105,250,151,36,73,238,47,22,139,139,92,5,131,206,183,114,229,202,3,114,185,220,196,52,77,143,77,146,228,196,120,245,127,204,94,89,44,22,127,85,93,93,125,119,22,249,186,59,5,26,128,78,181,114,229,202,211,146,36,249,106,146,36,109,63,160,111,74,146,228,218,138,138,138,185,195,134,13,219,144,89,56,32,34,34,214,174,93,59,168,177,177,113,102,154,166,167,71,196,7,91,215,167,105,122,87,154,166,151,86,87,87,223,146,97,188,110,71,129,6,160,83,20,10,133,137,17,241,157,136,152,17,17,145,166,233,43,185,92,238,231,73,146,252,106,204,152,49,43,178,77,7,236,77,93,93,221,248,52,77,63,85,44,22,207,73,146,100,104,203,234,27,35,226,123,85,85,85,139,178,204,214,93,40,208,0,116,184,218,218,218,139,210,52,61,47,34,34,73,146,13,197,98,241,71,219,183,111,191,116,194,132,9,13,89,103,3,246,207,242,229,203,251,150,151,151,127,53,151,203,125,163,229,110,56,145,36,201,197,99,199,142,61,63,235,108,89,83,160,1,232,48,171,86,173,58,166,185,185,249,103,17,241,119,45,171,126,150,166,233,119,199,141,27,183,54,203,92,192,235,87,83,83,51,44,73,146,239,70,196,231,91,86,61,146,207,231,63,63,122,244,232,7,178,204,149,37,5,26,128,14,81,40,20,206,137,136,255,219,178,248,88,46,151,251,234,152,49,99,230,101,153,9,232,56,117,117,117,83,139,197,226,165,177,227,118,147,17,17,159,171,170,170,250,121,150,153,0,160,199,170,169,169,249,113,161,80,72,91,254,119,89,214,121,128,206,83,40,20,46,107,253,247,94,83,83,243,227,172,243,0,64,143,83,40,20,174,106,253,48,173,173,173,253,116,214,121,128,206,87,91,91,251,233,54,255,209,124,85,214,121,0,160,199,40,20,10,55,180,124,128,190,82,40,20,166,103,157,7,232,58,133,66,97,122,203,191,253,180,80,40,220,144,117,30,0,232,246,106,107,107,255,167,229,79,184,133,218,218,218,73,89,231,1,186,94,109,109,237,164,154,154,154,66,203,95,160,254,39,235,60,0,208,109,213,214,214,254,71,203,7,230,170,66,161,240,174,172,243,0,217,41,20,10,239,106,57,23,164,181,181,181,255,145,117,30,0,232,118,106,106,106,190,213,114,229,121,91,161,80,152,156,117,30,32,123,133,66,97,114,203,57,33,173,169,169,249,86,214,121,0,160,219,168,173,173,157,221,230,219,247,167,103,157,7,232,62,106,106,106,78,111,243,133,226,217,89,231,1,128,204,173,89,179,102,116,235,159,105,107,106,106,46,200,58,15,208,253,212,212,212,92,208,58,189,107,205,154,53,163,179,206,3,0,153,42,20,10,127,104,185,186,52,55,235,44,64,247,85,40,20,230,182,156,43,254,144,117,150,206,146,203,58,0,0,221,223,202,149,43,207,142,136,143,68,196,230,92,46,247,165,172,243,0,221,87,203,57,98,115,68,124,164,229,220,81,114,20,104,0,246,41,77,211,36,151,203,253,160,101,241,27,99,198,140,89,145,105,32,160,91,107,57,71,124,35,34,34,151,203,253,32,77,211,36,227,72,0,208,181,90,231,52,22,10,133,249,89,103,1,122,142,66,161,48,191,84,191,51,225,10,52,0,123,85,95,95,63,48,73,146,127,137,136,40,22,139,23,101,157,7,232,57,90,207,25,73,146,252,75,125,125,253,192,172,243,116,36,5,26,128,189,218,190,125,251,23,35,98,96,154,166,127,170,174,174,190,53,235,60,64,207,81,93,93,125,107,154,166,127,138,136,129,45,231,146,146,161,64,3,176,87,197,98,241,159,34,34,114,185,220,79,179,206,2,244,60,173,231,142,214,115,9,0,148,180,66,161,112,102,203,220,231,135,179,206,2,244,92,133,66,225,225,150,115,201,153,89,103,233,40,174,64,3,176,71,105,154,182,222,126,234,138,76,131,0,61,221,21,17,187,156,83,122,60,183,21,1,224,85,86,173,90,53,178,185,185,121,117,68,68,154,166,195,199,141,27,183,54,235,76,64,207,84,83,83,51,44,73,146,151,34,34,242,249,252,168,209,163,71,175,201,58,211,27,229,10,52,0,175,210,220,220,252,193,150,31,255,168,60,3,111,68,203,57,228,143,17,187,156,91,122,52,5,26,128,61,57,53,34,34,77,211,91,178,14,2,244,124,109,206,37,167,102,26,164,131,40,208,0,236,201,73,45,255,127,87,166,41,128,82,209,122,46,57,105,159,91,245,16,10,52,0,187,168,173,173,125,75,68,140,140,136,23,199,141,27,247,116,214,121,128,158,175,229,92,242,98,68,140,108,57,199,244,104,10,52,0,187,155,24,17,145,166,233,194,172,131,0,165,163,205,57,101,98,166,65,58,128,2,13,192,46,210,52,125,91,68,68,146,36,75,178,206,2,148,142,214,115,74,235,57,166,39,83,160,1,216,69,146,36,111,106,249,241,169,76,131,0,165,230,169,136,93,206,49,61,86,89,214,1,0,232,94,138,197,226,65,73,146,68,154,166,47,100,157,5,122,138,153,55,92,93,157,164,113,72,228,210,113,73,146,140,72,211,24,148,139,168,136,136,40,70,52,38,73,108,72,211,180,62,138,73,77,154,196,115,115,103,157,185,50,235,204,93,45,77,211,23,146,36,137,98,177,120,80,214,89,222,40,5,26,128,93,36,73,50,42,34,34,159,207,215,101,157,5,186,171,89,55,93,125,74,174,88,60,41,77,227,216,72,146,137,17,233,208,157,143,167,75,211,72,34,34,109,89,76,98,199,66,18,17,145,219,241,218,236,185,87,189,18,105,186,40,73,226,254,98,46,119,247,13,31,60,179,228,239,120,147,207,231,235,138,197,226,206,115,76,79,230,73,132,0,236,162,80,40,108,136,136,129,125,251,246,29,60,108,216,176,13,89,231,129,238,226,195,55,93,245,193,52,77,78,79,211,116,102,68,12,234,224,221,111,72,146,100,110,146,164,215,94,247,193,179,110,234,224,125,119,11,107,215,174,29,212,208,208,176,62,34,54,86,85,85,117,244,248,117,41,5,26,128,93,20,10,133,166,136,200,143,29,59,182,44,73,146,230,172,243,64,150,78,191,230,87,7,52,245,233,255,79,145,196,167,34,98,124,23,29,118,69,164,241,171,178,109,91,126,113,237,25,159,122,185,139,142,217,233,210,52,205,215,214,214,54,69,68,115,85,85,85,143,158,5,161,64,3,176,139,66,161,144,70,68,84,85,85,249,140,160,215,122,223,45,191,31,212,183,41,255,141,72,211,175,69,203,92,230,12,52,70,146,92,210,80,214,252,163,63,157,246,209,146,248,107,80,169,156,95,220,133,3,0,160,141,89,115,255,240,249,190,219,114,203,35,77,207,139,236,202,115,68,68,69,164,233,121,125,183,229,150,207,154,251,135,207,103,152,131,221,244,232,246,15,64,199,43,149,43,68,208,94,179,110,190,242,157,73,83,114,105,68,76,205,58,203,94,204,75,203,210,175,222,240,254,179,31,203,58,200,235,85,42,231,23,87,160,1,128,94,111,214,220,43,63,159,52,37,143,70,247,45,207,17,17,83,147,166,228,209,89,115,175,116,53,58,99,10,52,0,208,171,205,158,123,213,47,147,72,46,203,58,199,254,74,34,185,108,246,220,171,126,153,117,142,222,172,71,127,3,18,0,224,245,154,53,231,191,134,36,185,138,107,34,98,122,214,89,94,135,79,207,158,123,213,248,180,216,120,198,13,179,63,177,46,235,48,189,141,43,208,0,64,175,51,99,238,213,99,115,185,138,59,162,103,150,231,86,211,115,185,138,59,102,204,189,122,108,214,65,122,27,5,26,0,232,85,102,204,189,106,84,62,45,222,156,70,76,202,58,203,27,149,70,76,202,167,197,155,103,204,189,170,199,63,221,175,39,81,160,1,128,94,227,51,151,95,94,158,143,244,186,72,146,119,102,157,165,195,36,201,59,243,145,94,247,153,203,47,47,207,58,74,111,161,64,3,0,189,70,253,232,65,87,70,36,147,179,206,209,241,146,201,59,126,55,186,130,2,13,0,244,10,31,154,123,229,15,34,210,211,179,206,209,121,210,211,119,252,142,116,54,5,26,0,40,121,31,154,123,245,140,52,146,11,178,206,209,217,210,72,46,248,208,220,171,103,100,157,163,212,41,208,0,64,73,251,216,109,191,29,144,70,250,147,172,115,116,149,52,210,159,124,236,182,223,14,200,58,71,41,83,160,1,128,146,182,169,33,255,163,136,24,159,117,142,46,52,190,229,119,166,147,40,208,0,64,201,154,125,253,85,83,34,146,207,101,157,163,235,37,159,219,241,187,211,25,20,104,0,160,116,229,227,252,172,35,100,166,55,255,238,157,76,129,6,0,74,210,172,27,255,240,190,136,120,111,214,57,50,244,222,150,49,160,131,41,208,0,64,73,74,210,226,23,179,206,144,53,99,208,57,146,172,3,0,208,189,20,10,133,52,34,162,170,170,202,103,4,61,214,140,185,87,79,202,71,250,112,214,57,218,202,231,114,241,246,97,35,227,189,19,14,141,1,229,125,162,161,169,41,254,180,252,233,88,242,210,234,104,42,22,59,237,184,205,145,188,251,198,153,103,46,236,180,3,180,67,169,156,95,202,178,14,0,0,208,209,202,34,62,158,102,29,162,141,97,253,250,199,247,143,59,57,198,12,24,184,203,250,191,27,53,54,86,111,217,20,223,189,111,94,172,222,178,169,83,142,93,22,241,241,136,232,22,5,186,84,152,194,1,0,148,156,52,210,51,179,206,208,106,88,191,254,113,209,228,105,59,203,243,146,250,85,49,247,185,39,227,177,250,85,145,70,196,168,254,149,113,225,228,83,98,68,191,206,185,117,115,119,26,139,82,209,163,47,159,3,208,241,74,229,79,172,244,94,179,111,252,253,7,34,205,221,148,117,142,136,191,149,227,97,253,250,199,250,198,134,248,254,3,119,199,242,245,175,236,124,189,122,224,224,248,222,113,39,199,144,138,190,177,106,243,166,56,127,193,157,241,74,195,214,142,15,146,20,63,56,103,198,71,255,216,241,59,110,159,82,57,191,184,2,13,0,148,148,36,205,159,150,117,134,136,29,229,249,162,41,211,98,88,191,254,17,17,241,243,197,15,237,82,158,35,34,86,110,92,31,23,44,184,51,54,108,107,140,209,3,42,227,235,147,166,116,202,213,205,238,50,38,165,66,129,6,0,74,74,26,233,41,89,103,104,45,207,7,244,237,183,115,221,231,223,121,116,140,27,56,232,85,219,214,110,218,24,223,185,239,207,177,173,185,57,14,63,96,120,188,103,252,161,29,158,167,59,140,73,41,81,160,1,128,146,241,129,27,175,56,48,34,14,203,50,195,232,1,127,43,207,107,183,110,137,243,238,189,51,214,108,217,28,3,251,84,196,133,147,167,237,177,68,191,176,97,93,220,240,236,178,136,136,56,102,204,184,206,136,117,88,203,216,208,1,20,104,0,160,100,148,167,101,147,178,60,254,152,1,3,227,162,201,59,202,115,253,214,205,241,205,123,239,136,39,95,174,143,243,238,189,35,214,108,217,28,131,250,84,196,197,147,167,199,129,3,7,191,234,189,143,175,93,19,17,17,7,14,26,210,41,217,178,30,155,82,162,64,3,0,37,35,137,120,71,86,199,110,157,182,49,180,165,60,159,59,255,142,88,187,117,75,68,68,188,220,176,53,190,57,255,246,88,189,101,83,84,246,233,19,23,78,153,22,213,187,149,232,225,45,115,165,55,110,107,236,148,124,89,142,77,169,81,160,1,128,146,145,70,188,57,139,227,86,85,14,138,31,30,63,61,134,84,244,141,53,91,54,199,121,247,222,25,47,239,118,55,141,117,141,13,113,222,189,119,70,221,230,141,81,89,222,39,46,154,50,45,38,12,30,26,17,17,253,203,203,227,244,195,142,136,136,136,167,95,89,219,41,25,179,26,155,82,164,64,3,0,165,35,73,14,234,234,67,86,85,14,138,139,166,76,139,33,21,125,163,126,235,230,56,239,222,191,93,121,222,221,43,13,91,227,252,123,239,140,194,166,13,81,89,222,39,126,48,249,148,120,235,176,145,241,131,227,78,137,49,3,6,198,198,109,141,113,229,178,197,157,19,52,131,177,41,85,10,52,0,80,58,210,24,211,149,135,171,30,56,56,46,154,50,45,6,245,169,136,186,205,27,227,220,249,119,188,234,202,243,238,214,53,54,196,5,11,238,138,154,141,27,162,127,89,121,92,56,249,148,152,48,120,104,52,52,55,197,15,31,186,39,214,53,54,116,78,216,46,30,155,82,166,64,3,0,165,228,128,174,58,208,129,3,7,199,133,147,79,217,89,158,207,223,195,180,141,189,89,223,216,16,63,122,120,254,206,229,134,230,166,248,254,253,243,226,201,151,95,234,172,184,17,93,56,54,165,174,44,235,0,0,0,29,168,115,158,135,189,155,234,129,131,227,194,41,211,162,178,188,79,172,222,178,41,206,191,247,206,118,93,57,30,212,167,34,190,121,212,241,17,17,209,208,212,20,223,190,239,174,120,118,221,203,157,21,183,85,151,140,77,111,224,10,52,0,80,74,242,157,125,128,214,105,27,173,229,249,220,249,119,180,171,60,15,169,232,27,23,77,153,22,85,149,131,98,75,211,246,174,42,207,17,93,48,54,189,133,43,208,0,64,41,105,138,78,236,55,19,6,15,141,239,29,119,114,84,150,247,137,194,166,13,241,173,5,119,181,187,60,255,240,248,233,49,170,127,101,108,105,218,30,223,90,112,215,171,30,239,221,137,154,186,234,64,165,206,21,104,0,160,148,108,238,172,29,79,24,60,52,126,48,249,148,157,229,185,189,211,54,218,150,231,77,219,183,117,117,121,142,232,196,177,233,109,20,104,0,160,100,36,145,116,202,92,136,9,131,135,198,247,143,59,57,250,151,149,71,97,211,134,184,96,193,93,177,161,29,15,60,57,160,111,191,248,215,227,79,221,81,158,183,101,82,158,59,109,108,122,35,5,26,0,40,33,105,93,71,239,113,64,121,159,56,255,232,19,99,64,121,159,88,185,113,125,156,127,239,157,177,190,29,87,158,15,232,219,47,46,154,50,45,70,246,31,16,27,183,53,198,183,238,187,43,94,216,176,174,163,99,238,135,142,31,155,222,74,129,6,0,74,70,49,77,87,116,244,62,103,28,242,230,56,160,111,191,120,105,235,150,248,86,59,175,60,143,236,63,96,231,180,141,141,219,26,227,130,5,89,149,231,206,25,155,222,202,151,8,1,128,146,145,75,114,79,166,145,118,232,62,223,62,124,84,68,68,220,178,252,233,118,149,231,81,253,43,227,194,201,167,196,176,126,253,99,125,203,195,83,10,155,54,116,104,182,246,200,37,185,39,51,59,120,137,81,160,1,128,146,145,38,201,146,72,59,182,64,15,234,211,55,34,34,94,218,203,227,185,247,100,84,255,202,184,104,202,180,56,160,111,191,88,215,216,16,231,206,191,35,86,111,217,212,161,185,218,43,77,146,37,153,6,40,33,10,52,0,80,50,154,211,244,225,142,190,217,113,121,126,199,140,215,166,98,113,191,182,31,213,191,50,126,120,252,244,24,82,209,183,219,148,231,136,29,99,147,117,134,82,97,14,52,0,80,50,110,156,121,102,109,164,177,172,35,247,89,150,236,168,75,219,139,205,175,185,109,219,242,252,114,195,214,110,83,158,35,141,101,55,206,60,179,54,235,24,165,66,129,6,0,74,74,26,113,103,71,238,175,60,183,227,154,246,107,93,129,174,170,28,212,61,203,115,116,252,152,244,118,10,52,0,80,82,242,145,222,220,145,251,43,203,181,94,129,222,123,129,126,243,208,225,113,225,228,83,98,72,69,223,168,223,186,57,206,157,127,71,212,111,237,62,207,45,233,232,49,233,237,204,129,6,0,74,202,117,179,206,190,109,246,220,171,86,69,196,232,142,216,95,121,75,129,62,169,122,252,206,59,114,180,202,37,17,135,13,29,30,71,142,216,113,168,213,91,54,197,5,11,238,138,181,109,190,112,56,170,127,101,156,48,110,124,228,146,100,191,143,249,252,250,151,227,225,85,133,14,72,31,17,17,171,174,155,117,246,109,29,181,51,20,104,0,160,20,165,233,213,145,36,95,233,136,93,37,45,197,119,218,129,135,236,115,187,199,234,87,197,101,143,62,16,175,52,108,221,101,253,140,67,14,143,247,77,56,180,93,199,220,184,173,49,62,126,235,245,237,11,186,55,105,122,117,199,236,136,86,10,52,0,80,114,114,73,242,155,98,68,135,20,232,159,47,126,40,166,86,79,216,227,107,105,154,198,179,235,94,142,69,107,234,226,241,151,86,239,113,155,63,62,255,84,12,239,215,63,250,151,151,239,247,49,231,215,188,240,186,178,238,73,46,73,126,211,97,59,35,34,34,246,255,111,9,0,244,10,133,66,33,141,136,168,170,170,242,25,65,143,54,123,238,85,115,35,98,70,214,57,50,118,227,156,153,103,205,204,58,68,171,82,57,191,248,18,33,0,80,146,210,98,241,167,89,103,200,154,49,232,28,10,52,0,80,146,110,152,253,209,187,34,146,185,89,231,200,78,50,119,199,24,208,209,20,104,0,160,100,229,34,46,204,58,67,86,122,243,239,222,217,20,104,0,160,100,93,55,243,204,133,73,196,37,89,231,232,106,73,196,37,215,205,60,115,97,214,57,74,149,2,13,0,148,180,124,99,217,55,34,226,201,172,115,116,161,39,91,126,103,58,137,2,13,0,148,180,107,207,56,163,57,34,190,152,117,142,46,244,197,150,223,153,78,162,64,3,0,37,111,206,204,179,238,72,146,244,252,172,115,116,182,36,73,207,159,51,243,172,59,178,206,81,234,20,104,0,160,87,184,126,198,217,23,71,26,191,205,58,71,167,73,227,183,215,207,56,251,226,172,99,244,6,10,52,0,208,107,204,153,117,214,199,35,77,110,207,58,71,135,75,147,219,231,204,58,235,227,89,199,232,45,20,104,0,160,87,41,219,150,255,112,68,186,32,235,28,29,39,93,176,227,119,162,171,40,208,0,64,175,114,237,25,103,108,42,235,95,254,254,136,248,75,214,89,58,192,95,202,250,151,191,255,218,51,206,216,148,117,144,222,68,129,6,0,122,157,107,167,159,177,254,197,85,27,167,71,196,156,172,179,188,1,115,94,92,181,113,250,181,211,207,88,159,117,144,222,38,201,58,0,0,221,75,161,80,72,35,34,170,170,170,124,70,208,43,204,190,225,202,75,35,73,190,146,117,142,118,73,211,31,207,153,117,246,87,179,142,209,94,165,114,126,113,5,26,0,232,213,90,138,232,63,70,164,91,178,206,242,218,210,45,17,241,143,61,177,60,151,18,5,26,0,232,245,230,204,60,235,138,180,60,255,142,136,184,49,235,44,251,112,99,90,158,127,199,156,153,103,93,145,117,144,222,174,71,95,62,7,160,227,149,202,159,88,225,245,154,61,247,170,143,71,196,119,35,98,124,214,89,90,172,136,136,239,150,66,113,46,149,243,75,143,14,15,64,199,43,149,15,56,120,163,102,223,120,245,55,34,77,191,26,17,35,51,138,176,38,146,228,210,57,51,206,252,81,70,199,239,112,165,114,126,233,209,225,1,232,120,165,242,1,71,199,88,184,176,182,127,177,34,29,86,140,198,161,209,156,31,84,76,138,149,249,92,89,191,52,73,43,34,77,203,211,180,152,143,136,72,146,92,115,36,201,246,36,77,26,155,139,77,91,115,105,110,83,228,155,55,228,162,226,149,92,99,178,118,210,164,177,61,96,126,241,171,157,126,205,53,249,237,229,77,231,36,185,248,100,68,28,217,69,135,93,156,22,227,215,229,219,203,126,126,237,25,103,52,119,209,49,187,68,169,156,95,122,116,120,0,58,94,169,124,192,241,250,44,172,173,237,223,80,223,80,93,150,230,198,38,73,58,58,77,114,3,59,98,191,73,90,220,152,166,201,170,166,164,88,219,119,68,223,149,147,198,246,188,66,61,251,250,171,78,76,242,201,223,167,145,206,140,136,234,14,222,253,202,36,146,185,105,115,250,63,115,62,116,86,41,220,159,122,143,74,229,252,210,163,195,3,208,241,74,229,3,142,253,55,111,249,242,190,125,54,52,191,41,23,229,19,146,36,198,116,197,49,211,52,234,138,177,125,249,182,65,249,103,167,78,152,208,208,21,199,236,72,51,230,94,61,169,44,210,19,35,141,99,35,73,38,166,145,78,104,207,251,147,72,150,71,154,46,138,36,238,111,138,228,47,55,206,60,115,97,103,101,237,78,74,229,252,210,163,195,3,208,241,74,229,3,142,215,182,112,225,138,49,77,125,227,240,40,38,135,102,26,36,151,62,83,214,16,79,78,154,52,190,46,211,28,111,192,140,185,115,7,230,138,155,14,73,242,249,113,145,20,71,164,77,49,56,73,210,138,136,136,52,77,26,147,178,88,31,105,174,62,109,110,174,41,230,42,159,187,113,230,204,141,89,103,206,66,169,156,95,122,116,120,0,58,94,169,124,192,177,119,243,23,62,119,96,159,138,252,219,211,52,169,202,58,75,91,73,146,22,182,53,54,255,245,248,73,135,188,152,117,22,58,71,169,156,95,202,178,14,0,0,116,141,7,254,250,252,168,52,205,77,76,34,169,78,211,172,211,188,90,154,38,85,229,125,202,170,238,95,178,98,101,146,20,23,29,243,246,131,87,103,157,9,246,68,129,6,128,18,55,111,94,90,54,96,120,237,81,197,180,233,109,61,225,178,95,18,73,117,164,249,234,135,254,90,120,124,243,75,99,31,154,58,53,105,202,58,19,180,229,73,132,0,80,194,30,92,188,98,66,197,176,23,206,40,166,77,111,203,58,75,123,21,211,166,183,85,12,123,225,140,7,23,175,104,215,23,244,160,179,41,208,0,80,162,30,88,92,115,76,154,36,211,115,145,84,102,157,229,245,202,69,82,153,38,201,244,7,22,215,28,147,117,22,104,101,10,7,0,148,152,121,75,151,86,86,108,175,60,41,146,230,177,89,103,233,48,73,243,59,238,123,236,133,225,141,229,155,238,158,122,196,17,155,178,142,67,239,230,10,52,0,148,144,121,15,45,31,221,191,121,192,140,92,46,74,167,60,183,200,229,98,108,255,230,1,51,230,61,180,124,116,214,89,232,221,20,104,0,40,17,11,22,61,127,80,223,138,228,3,105,15,158,178,241,90,210,72,42,251,86,36,31,88,176,232,249,131,178,206,66,239,165,64,3,64,9,120,112,241,138,9,249,178,252,123,146,36,41,249,207,246,36,73,114,249,178,252,123,124,185,144,172,148,252,63,50,0,40,117,11,158,120,254,160,52,73,166,103,157,163,171,165,73,50,125,193,19,174,68,211,245,20,104,0,232,193,30,90,186,124,116,217,246,92,175,43,207,173,202,182,231,166,63,180,212,156,104,186,150,2,13,0,61,212,210,165,107,42,155,155,147,83,210,94,48,109,99,111,210,36,201,53,55,39,167,44,93,186,166,100,231,125,211,253,244,218,127,112,0,208,211,109,42,110,61,41,137,100,64,214,57,178,150,68,50,96,83,113,235,73,89,231,160,247,80,160,1,160,7,186,239,209,21,199,165,105,233,221,170,238,245,74,211,24,123,223,163,43,142,203,58,7,189,131,2,13,0,61,204,195,75,94,56,56,151,79,122,220,163,185,59,91,46,159,188,237,225,37,47,28,156,117,14,74,159,2,13,0,61,200,210,165,75,251,164,145,30,155,117,142,238,42,141,244,216,165,75,151,246,201,58,7,165,77,129,6,128,30,100,99,84,30,85,52,239,121,175,138,145,12,216,24,149,71,101,157,131,210,166,64,3,64,15,177,240,137,21,99,162,57,222,154,117,142,110,175,57,222,186,240,137,21,99,178,142,65,233,82,160,1,160,135,104,110,142,137,89,103,232,41,140,21,157,73,129,6,128,30,224,254,101,117,227,211,52,169,202,58,71,79,145,166,73,213,253,203,234,198,103,157,131,210,164,64,3,64,79,176,109,235,59,178,142,208,227,24,51,58,137,2,13,0,221,220,3,139,107,198,37,73,222,227,170,219,41,73,242,163,31,88,92,51,46,235,28,148,30,5,26,0,186,185,124,210,124,120,214,25,122,42,99,71,103,80,160,1,160,27,155,183,116,105,101,115,132,135,131,188,78,205,17,7,207,91,186,180,50,235,28,148,22,5,26,0,186,177,254,233,224,67,178,206,208,211,25,67,58,154,2,13,0,221,88,115,83,147,171,207,111,144,49,164,163,149,101,29,0,0,216,179,7,158,89,59,40,182,110,26,241,122,223,223,180,125,123,242,200,3,11,70,215,172,124,113,232,218,151,235,7,13,28,80,185,117,248,216,49,235,143,62,230,196,194,160,193,131,183,183,119,127,117,181,43,251,47,126,116,225,232,53,171,234,134,52,54,54,150,15,31,62,106,253,65,227,199,191,60,241,168,227,214,236,207,251,95,170,175,175,88,252,216,195,163,10,43,158,31,158,203,229,211,234,131,15,169,63,242,93,19,215,12,25,50,124,219,222,222,243,248,162,69,195,238,185,231,246,183,180,46,15,25,58,108,195,89,31,255,244,146,246,228,206,229,146,17,15,60,179,118,208,49,135,14,219,208,158,247,193,222,40,208,0,208,77,229,54,111,170,46,190,142,191,21,111,88,191,190,252,242,159,254,219,212,197,139,22,158,220,208,176,101,232,238,175,255,42,255,239,219,14,58,228,144,135,63,253,185,175,204,61,244,176,183,174,127,173,253,221,125,231,109,213,215,255,247,9,113,83,108,0,0,32,0,73,68,65,84,111,63,80,91,179,242,157,123,122,189,114,208,160,186,227,142,159,122,235,167,206,249,202,131,185,92,46,221,253,245,117,235,94,234,243,211,255,239,226,211,150,60,186,240,125,187,191,150,36,73,243,113,39,78,253,159,207,125,229,220,187,251,244,169,40,238,254,250,127,254,242,39,31,122,241,133,229,147,90,151,207,250,135,79,255,251,107,229,221,147,220,230,77,213,17,177,244,245,188,23,118,103,10,7,0,116,83,197,124,140,109,239,123,106,86,46,31,240,245,47,252,239,47,63,120,223,61,31,222,83,121,142,136,104,110,110,234,243,252,211,79,77,254,238,191,124,249,252,91,111,154,179,207,233,13,191,252,217,37,199,252,236,146,139,46,216,91,121,142,136,216,180,97,195,152,219,111,158,251,137,115,191,252,217,143,110,217,178,249,85,23,231,46,249,193,119,103,239,169,60,71,68,164,105,154,95,112,247,159,63,242,139,127,255,209,137,187,191,54,231,154,223,31,222,182,60,87,31,56,225,145,15,157,249,177,101,251,202,187,55,175,103,44,97,111,20,104,0,232,190,218,117,239,231,109,219,26,115,23,127,251,155,159,94,91,95,255,166,253,217,190,177,177,97,240,111,126,121,217,151,150,253,245,175,123,44,218,215,95,253,187,183,220,126,243,220,79,236,239,241,159,123,230,201,41,151,92,244,173,247,183,93,183,96,254,157,99,151,61,177,228,228,182,235,134,143,24,245,212,1,195,134,63,223,118,221,189,119,223,117,250,139,203,159,219,121,183,140,134,134,173,249,63,206,185,230,239,219,110,243,177,79,254,159,27,246,55,203,30,184,143,54,29,198,20,14,0,232,134,22,46,124,110,112,83,26,253,218,243,158,63,252,238,63,143,92,179,170,110,231,124,225,178,178,178,134,163,167,156,48,247,248,169,167,62,254,214,183,29,249,242,11,203,159,29,248,240,125,243,39,220,121,219,205,31,218,178,121,243,136,136,136,166,166,166,190,183,204,189,102,210,91,222,254,246,59,218,238,171,161,97,107,254,230,27,175,253,112,219,117,99,198,29,184,120,250,251,62,120,231,59,223,53,169,182,178,114,208,246,37,139,23,141,188,245,143,215,159,248,236,83,203,142,111,221,102,233,146,199,166,174,173,91,125,219,176,49,163,26,34,34,238,157,55,111,231,211,0,243,249,252,246,207,127,237,252,127,61,126,234,180,154,136,136,171,174,248,143,119,92,255,135,223,125,46,98,199,149,232,187,238,184,229,240,79,124,230,11,11,35,34,174,184,252,103,71,175,95,183,174,186,245,189,71,78,156,116,203,254,206,181,222,163,52,250,45,92,248,220,224,73,147,14,121,205,41,43,240,90,20,104,0,232,134,210,62,101,195,218,251,158,37,143,60,244,174,182,203,39,157,122,218,31,62,251,133,127,190,191,117,249,45,71,28,249,202,91,142,56,242,149,193,7,12,219,252,187,95,253,226,171,173,235,87,174,124,225,85,211,56,30,184,247,158,177,109,11,236,192,129,67,106,191,115,241,143,127,61,124,196,136,198,157,251,159,246,158,149,39,156,60,253,202,47,124,242,172,3,86,175,170,61,34,34,162,169,169,169,223,35,143,62,56,230,212,49,51,150,71,68,212,175,89,53,166,117,251,234,241,7,63,210,90,158,35,34,254,215,199,62,249,215,91,111,186,190,190,181,204,175,174,171,29,17,17,81,87,179,178,255,61,243,238,152,213,186,93,69,69,223,245,159,248,236,23,238,108,239,120,236,174,101,76,21,104,222,48,83,56,0,160,27,106,142,216,227,180,138,125,169,171,171,123,115,219,229,153,31,254,200,226,61,109,247,174,137,71,21,218,46,111,221,186,117,224,238,219,188,184,252,153,93,238,254,113,248,219,222,254,96,219,242,220,42,151,203,165,227,14,60,232,185,182,235,54,174,91,183,231,43,231,197,98,178,251,123,35,94,253,165,195,255,188,252,167,39,55,54,54,12,110,93,158,114,210,41,115,199,85,79,216,188,199,125,182,195,235,25,83,216,19,87,160,1,160,59,202,165,131,98,215,190,185,79,77,219,183,39,199,158,112,194,31,91,151,251,148,87,108,31,51,182,122,203,158,182,125,234,201,39,134,183,93,30,52,120,112,253,238,219,84,141,63,248,165,147,78,125,239,239,91,151,223,61,105,202,179,123,59,246,234,85,117,227,218,46,143,28,51,118,231,237,226,70,140,28,93,183,226,185,103,34,34,98,229,139,43,38,206,159,119,231,237,173,87,161,239,159,255,231,177,91,54,111,28,217,186,237,216,177,85,171,23,61,116,223,200,199,30,121,232,180,214,117,131,135,12,89,249,137,207,126,241,129,189,29,187,93,114,233,160,14,217,15,189,158,2,13,0,221,80,218,156,84,38,251,223,159,163,172,188,60,253,252,87,206,155,191,175,109,182,109,107,204,221,250,199,57,111,186,254,191,127,127,86,219,245,239,154,116,244,163,187,111,123,202,244,211,94,60,101,250,105,47,238,107,127,79,47,91,58,228,218,171,175,56,190,230,197,21,19,91,215,13,29,50,108,197,177,83,78,220,121,133,123,202,212,169,75,30,190,127,254,236,136,136,230,230,230,242,159,254,219,15,206,187,253,150,27,238,110,220,186,181,255,243,207,61,115,108,235,118,249,124,126,251,244,247,205,124,242,223,46,188,224,236,52,77,243,173,235,223,63,235,244,235,250,246,237,215,188,175,28,251,43,109,78,60,210,155,14,161,64,3,64,119,148,38,253,35,121,213,236,134,118,121,112,254,61,99,30,121,228,190,67,34,34,234,10,53,99,87,60,255,236,187,182,110,217,114,64,219,109,198,85,31,244,232,25,103,253,227,95,247,103,127,191,252,217,37,199,52,53,109,47,107,216,218,80,241,252,51,79,30,177,170,110,199,188,231,182,62,124,214,63,252,119,89,121,249,206,224,147,143,159,86,123,203,17,215,207,123,106,233,227,83,35,118,124,89,112,217,227,75,78,217,253,125,199,28,127,226,245,139,30,186,175,234,85,183,173,251,200,235,187,109,221,30,165,73,255,14,219,23,189,154,2,13,0,221,80,174,44,173,72,95,245,88,145,246,121,98,217,226,170,63,223,118,203,199,246,246,250,200,209,99,150,125,245,220,239,254,190,109,225,221,151,123,239,190,243,3,173,95,248,219,93,62,95,182,237,61,239,159,245,219,247,126,112,246,243,187,191,246,181,111,124,111,206,79,255,255,139,183,61,190,228,145,247,188,250,125,249,237,147,142,158,124,227,39,63,251,149,249,255,124,206,39,190,218,246,181,55,120,219,186,87,201,149,165,21,29,185,63,122,47,5,26,0,186,163,52,45,143,104,199,28,142,215,161,114,64,229,186,23,86,44,31,114,224,132,67,54,189,225,125,13,172,92,253,202,218,250,33,219,182,53,230,118,127,162,224,1,35,70,52,126,247,71,63,190,126,217,210,197,243,238,186,253,230,183,173,174,173,29,147,207,149,55,141,173,30,87,59,237,125,179,151,30,124,200,193,27,255,227,231,63,62,250,229,151,95,218,121,55,144,35,39,30,245,198,110,91,183,39,105,90,222,161,251,163,215,82,160,1,160,27,74,211,36,255,218,91,189,49,207,63,247,204,177,63,255,241,143,222,209,167,172,236,223,142,62,254,164,186,55,178,175,245,235,214,85,223,191,224,47,213,47,127,115,237,176,139,46,253,249,31,246,180,77,203,109,244,94,53,79,251,165,250,250,138,123,254,124,219,204,214,229,214,219,214,213,175,89,221,247,79,55,93,247,214,23,150,63,63,174,97,203,150,1,35,71,143,94,53,241,221,199,61,51,249,196,147,11,123,122,100,248,107,233,138,49,165,119,232,220,255,180,5,160,199,41,20,10,105,68,68,85,85,149,207,136,12,61,176,228,133,207,116,228,254,158,123,246,233,65,75,151,60,58,250,169,199,23,79,88,180,240,225,247,108,223,222,56,160,245,181,97,195,71,62,115,217,175,175,188,116,247,43,199,123,179,101,203,230,178,197,143,60,56,242,153,167,159,28,253,240,3,247,29,83,87,243,226,145,109,95,63,227,163,159,184,236,140,179,63,241,248,254,102,251,209,247,207,127,111,235,23,13,35,34,166,191,247,131,87,28,124,248,155,107,127,243,139,159,157,211,246,118,118,173,14,123,243,91,239,185,224,226,75,254,187,127,255,1,77,251,123,140,86,199,188,227,160,95,182,247,61,116,156,82,57,191,184,15,52,0,116,67,73,146,235,144,59,79,180,58,228,77,135,109,152,241,161,143,60,253,245,111,95,124,219,215,47,248,222,191,246,27,208,127,109,235,107,107,95,90,115,232,93,183,222,60,97,127,247,213,191,255,128,166,99,143,63,185,246,31,62,121,206,162,159,92,254,219,95,28,57,113,210,45,109,95,191,247,238,59,79,216,223,125,45,121,108,209,176,133,15,220,59,163,117,121,240,144,33,43,223,57,241,232,229,191,254,217,191,127,101,79,229,57,34,226,233,167,158,56,225,162,111,127,253,239,247,244,218,190,116,244,152,210,123,41,208,0,208,13,21,139,197,118,95,93,221,95,19,143,58,110,205,187,143,61,225,214,182,235,158,88,178,232,144,215,179,175,92,46,151,254,211,151,207,189,181,162,162,239,206,39,252,213,214,172,60,242,165,250,250,253,250,194,222,111,127,245,127,103,180,189,109,221,140,191,63,243,218,223,253,215,207,79,111,106,106,234,219,186,110,228,168,209,79,30,57,113,210,45,101,101,101,91,91,215,61,181,244,241,169,183,223,114,227,126,151,254,136,206,29,83,122,23,115,160,1,160,27,74,162,216,24,145,219,239,187,70,92,250,195,239,76,171,45,212,236,124,244,246,63,254,239,207,221,248,182,137,19,215,238,109,251,67,15,61,188,112,207,157,127,235,208,235,214,175,27,210,250,243,163,11,31,28,113,229,111,126,249,129,214,229,234,3,15,90,241,165,127,249,246,188,189,237,107,248,136,17,141,195,70,140,88,81,91,179,114,231,84,142,66,205,242,129,123,122,114,97,91,183,222,52,231,224,21,207,61,115,204,223,142,51,225,145,177,99,15,90,215,246,246,120,199,77,153,122,237,151,207,253,206,93,185,92,46,125,122,217,210,191,124,239,188,175,157,219,216,176,101,72,68,196,125,127,153,247,174,83,79,219,241,200,240,253,177,99,76,225,141,83,160,1,160,27,74,203,242,91,146,230,253,127,114,222,230,77,27,7,180,45,163,207,45,127,234,190,125,21,232,36,217,245,38,211,109,151,7,12,168,220,222,118,95,91,54,111,26,20,17,123,45,208,173,145,219,46,228,211,178,125,126,201,175,105,251,246,100,206,53,87,126,168,237,186,143,125,242,255,220,240,228,178,165,163,219,174,155,245,191,62,250,96,235,23,6,15,123,203,17,235,14,121,211,161,11,159,120,124,241,180,136,136,53,107,106,15,124,141,76,187,6,44,203,239,241,201,140,208,94,166,112,0,64,55,148,54,165,155,219,179,253,208,225,195,95,110,187,188,108,201,99,251,156,146,241,212,178,191,30,212,118,121,200,208,3,94,105,253,121,252,33,111,218,80,86,86,214,208,186,188,102,85,221,91,107,86,46,31,16,123,241,82,125,125,197,154,85,117,111,110,187,238,224,195,223,188,126,111,219,71,68,252,238,191,46,159,184,246,165,53,135,182,46,31,249,119,71,221,60,241,168,227,214,108,218,184,97,151,135,157,140,30,51,118,107,219,229,1,3,7,109,108,253,121,203,230,141,187,60,20,230,181,180,119,76,97,111,20,104,0,232,134,242,185,100,159,5,116,119,71,31,115,194,211,109,151,23,63,186,104,218,131,243,239,25,179,167,109,159,94,182,116,200,194,7,239,59,181,237,186,183,190,227,157,59,31,128,210,167,79,69,113,194,161,135,61,216,246,245,95,94,118,233,105,197,98,113,143,119,78,248,213,207,46,61,165,169,169,169,95,235,242,184,234,131,30,221,215,29,50,94,170,175,175,152,119,251,159,102,181,46,87,84,244,93,255,153,207,127,237,142,136,136,202,129,131,118,185,74,252,194,115,207,15,108,187,188,110,221,218,161,173,63,247,237,59,160,93,99,212,222,49,133,189,81,160,1,160,27,106,206,37,235,218,179,253,187,143,157,178,250,192,241,19,30,110,93,222,190,189,113,192,79,47,185,240,43,87,255,215,229,71,110,219,214,184,243,243,254,214,155,231,28,252,195,239,156,251,165,182,143,244,30,58,100,216,138,83,223,55,115,151,185,196,39,191,231,180,251,218,46,63,241,215,197,211,206,255,231,115,206,124,122,217,210,157,115,165,235,106,87,246,191,232,91,95,255,192,194,135,22,204,108,187,237,81,147,79,216,229,189,187,187,226,242,159,156,184,101,243,198,145,173,203,39,76,157,126,195,168,209,99,182,70,68,28,246,150,35,86,181,221,246,183,191,190,108,103,113,191,227,79,55,141,127,246,201,101,199,183,190,54,114,204,216,21,251,58,206,238,218,59,166,176,55,230,64,3,64,55,84,217,92,92,219,222,9,187,159,252,167,47,95,255,175,223,63,247,224,173,155,183,12,139,136,104,108,108,24,124,221,53,87,158,115,221,53,87,238,245,61,249,124,126,251,167,206,249,210,111,118,127,48,201,244,247,204,88,241,208,130,123,255,248,232,195,15,236,252,50,225,51,203,158,248,127,237,221,121,152,36,101,157,39,240,111,84,245,1,72,11,114,211,135,205,57,136,45,221,52,162,205,225,125,140,199,200,140,238,226,57,30,227,186,206,232,232,232,174,179,163,14,227,181,179,158,207,122,172,202,56,62,206,206,227,181,186,42,250,232,122,13,131,138,194,32,135,183,32,151,128,128,157,89,13,52,52,8,58,74,119,87,198,254,17,153,86,86,81,85,93,209,84,19,153,213,159,207,243,212,19,149,25,111,100,254,42,186,58,234,155,111,188,241,198,163,207,120,205,203,31,61,91,13,135,29,126,228,37,207,121,193,75,46,155,105,253,207,175,188,124,223,239,93,124,225,105,189,199,15,216,111,191,235,95,244,23,175,252,125,111,247,137,15,63,229,150,67,14,93,241,179,155,54,181,31,146,36,215,92,125,213,163,254,242,207,158,125,240,222,123,239,125,71,107,227,141,235,250,103,236,56,229,81,143,249,241,108,181,76,181,247,120,103,198,49,225,80,135,30,104,0,24,64,107,215,174,190,189,76,177,181,206,54,107,214,174,223,242,231,175,248,111,31,218,235,126,203,230,116,11,236,197,139,151,254,230,57,47,124,201,153,51,221,133,240,117,111,124,219,87,31,178,110,253,57,115,125,255,195,142,60,250,226,215,189,229,157,159,158,237,46,129,31,253,167,15,62,101,124,124,251,146,222,227,167,253,135,103,127,113,143,61,246,156,52,63,243,127,122,217,95,125,182,127,12,246,173,155,111,62,230,134,235,175,219,208,63,181,221,177,15,89,251,173,39,255,209,51,126,145,57,42,83,108,93,187,118,245,237,59,110,9,59,38,64,3,192,128,26,45,139,155,118,220,106,178,71,62,246,9,173,183,191,239,67,239,60,250,152,7,157,63,227,235,142,46,218,250,7,199,60,248,252,215,190,233,173,239,120,198,179,158,127,213,76,237,22,45,94,92,190,229,157,239,255,194,211,79,127,238,135,247,94,182,247,205,51,181,123,192,190,251,223,240,196,39,159,246,241,119,190,239,195,31,59,240,160,131,127,55,83,187,111,125,227,235,15,188,230,202,43,30,211,123,252,192,195,14,255,254,159,252,199,231,94,61,181,221,9,15,63,229,150,191,62,227,239,223,190,114,213,234,123,244,48,239,177,199,94,183,63,242,209,79,248,204,27,223,246,158,207,207,244,62,211,217,153,125,9,51,25,234,219,40,2,48,255,22,202,173,118,23,130,139,47,219,184,54,101,231,164,29,183,156,222,207,175,188,124,223,239,124,235,236,7,109,221,118,247,226,145,98,164,188,255,178,125,126,179,223,126,7,220,181,254,97,39,141,29,186,114,85,173,17,34,91,183,222,61,114,246,87,191,120,212,47,111,252,197,193,73,178,116,233,158,91,247,219,119,255,187,14,89,181,252,142,147,79,125,220,166,217,122,157,123,62,247,169,143,62,228,150,91,54,253,254,34,192,71,61,246,201,87,172,61,126,230,169,246,146,228,242,75,127,188,223,229,151,253,100,249,93,119,254,106,175,85,171,143,216,252,136,199,60,126,227,206,220,194,59,197,200,197,39,29,183,234,210,218,219,49,175,22,202,241,101,168,139,7,96,254,45,148,63,112,11,193,133,151,111,220,111,100,188,83,251,150,213,220,83,103,116,228,243,167,172,89,181,101,199,45,217,149,22,202,241,197,16,14,0,24,80,167,172,89,181,37,101,132,190,123,171,204,22,225,153,249,36,64,3,192,32,43,50,231,91,85,51,3,251,144,121,38,64,3,192,0,91,58,222,185,174,233,26,134,157,125,200,124,19,160,1,96,128,173,95,127,248,29,101,202,141,77,215,49,172,202,148,27,215,175,63,220,13,84,152,87,2,52,0,12,184,145,50,51,78,53,199,236,236,59,118,5,1,26,0,6,220,134,117,135,93,159,178,116,23,189,186,202,242,182,13,235,14,51,254,153,121,39,64,3,192,16,40,202,241,25,111,143,205,244,236,51,118,21,1,26,0,134,192,134,227,143,252,121,167,83,110,110,186,142,97,209,233,148,155,55,28,127,228,207,155,174,131,133,73,128,6,128,33,81,118,58,63,106,186,134,97,97,95,177,43,9,208,0,48,36,78,61,225,136,27,59,101,76,201,182,3,157,50,215,157,122,194,17,55,54,93,7,11,151,0,13,0,67,100,159,69,123,94,146,162,220,222,116,29,3,171,40,183,239,179,104,207,75,154,46,131,133,77,128,6,128,33,178,102,205,65,191,46,147,139,154,174,99,80,149,201,69,107,214,28,244,235,166,235,96,97,19,160,1,96,200,156,124,220,97,87,166,83,94,211,116,29,3,167,83,94,115,242,113,135,93,217,116,25,44,124,2,52,0,12,161,13,235,86,159,159,50,91,154,174,99,96,148,217,178,97,221,234,243,155,46,131,221,131,0,13,0,67,168,40,138,241,69,219,22,127,39,69,97,60,116,81,108,95,180,109,241,119,138,162,24,111,186,20,118,15,2,52,0,12,169,19,79,92,126,107,185,125,252,220,166,235,104,90,185,125,252,220,19,79,92,126,107,211,117,176,251,16,160,1,96,136,157,188,254,240,27,70,203,69,231,53,93,71,83,70,203,69,231,157,188,254,240,27,154,174,131,221,139,0,13,0,67,238,97,235,86,92,157,237,185,160,233,58,238,115,219,115,193,195,214,173,184,186,233,50,216,253,8,208,0,176,0,156,116,194,234,43,118,167,158,232,209,114,209,121,39,157,176,250,138,166,235,96,247,36,64,3,192,2,241,176,117,43,174,46,23,47,57,167,40,202,5,123,49,93,81,148,227,229,226,37,231,232,121,166,73,2,52,0,44,32,39,31,123,232,13,119,111,219,246,229,34,185,189,233,90,230,91,145,220,126,247,182,109,95,62,249,216,67,141,121,166,81,2,52,0,44,48,143,58,225,232,205,163,91,55,127,169,40,203,107,155,174,101,190,20,101,121,237,232,214,205,95,122,212,9,71,111,110,186,22,88,212,116,1,0,192,252,59,241,196,19,183,37,57,247,226,203,111,188,169,220,94,158,82,20,197,80,118,154,149,101,217,41,22,21,23,110,88,115,152,241,206,12,140,161,252,207,4,0,204,205,73,107,86,95,81,236,181,236,115,25,31,191,190,233,90,106,27,31,191,190,216,107,217,231,78,90,227,98,65,6,139,30,104,0,88,224,78,58,122,255,59,147,124,227,146,159,222,112,120,153,156,144,162,216,191,233,154,102,85,150,183,21,201,143,54,172,63,98,248,66,63,187,5,1,26,0,118,19,27,214,29,118,125,146,235,127,112,233,216,131,182,117,126,183,182,24,25,221,183,233,154,250,149,157,241,59,22,143,236,113,233,137,235,150,95,213,116,45,48,27,1,26,0,118,51,39,174,93,126,85,146,171,46,252,225,198,163,70,151,116,30,84,150,89,222,100,61,69,145,177,241,173,35,87,157,242,208,213,11,230,162,71,22,54,1,26,0,118,83,167,60,116,213,181,73,174,189,228,202,214,254,157,173,219,142,42,70,71,15,79,167,188,255,125,242,230,35,197,157,229,248,248,245,35,75,22,95,187,225,216,149,183,221,39,239,9,243,68,128,6,128,221,92,55,192,222,150,228,146,239,254,244,218,131,70,178,104,229,200,72,177,60,69,121,72,217,153,159,217,59,138,145,178,147,178,184,169,211,41,199,58,217,222,58,245,33,71,221,50,31,175,11,77,16,160,1,128,223,59,117,221,81,183,36,185,37,201,143,202,178,44,46,188,244,186,3,71,70,22,237,63,82,46,218,119,188,220,182,207,72,70,246,206,72,246,44,138,145,165,101,167,51,41,92,23,35,35,157,178,236,220,157,78,126,219,73,231,215,163,197,226,95,117,138,237,119,116,58,219,111,59,101,205,145,155,139,162,40,155,249,169,96,126,9,208,0,192,180,186,129,183,23,168,239,161,44,203,209,179,174,184,98,52,73,158,249,224,7,143,23,69,177,96,111,33,14,253,4,104,0,96,167,116,3,179,208,204,110,199,141,84,0,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,16,160,1,0,160,6,1,26,0,0,106,88,212,116,1,0,0,67,224,1,73,78,239,123,60,150,228,107,13,213,50,213,32,215,182,32,9,208,0,0,59,182,127,146,143,244,61,254,191,25,156,144,58,200,181,45,72,134,112,0,48,44,70,147,148,221,175,215,238,160,237,193,125,109,15,216,197,117,13,130,79,103,226,231,237,255,218,154,228,218,36,159,73,242,130,36,123,54,85,32,44,36,2,52,0,195,232,173,73,214,54,93,196,0,186,62,201,197,125,95,63,73,178,87,146,103,39,249,68,146,115,146,28,210,88,117,0,0,11,81,187,221,46,219,237,118,217,116,29,211,232,239,129,46,147,124,59,201,210,25,218,238,174,61,208,47,157,102,93,145,228,248,36,23,117,219,124,185,251,28,115,243,135,153,190,119,191,255,235,225,211,108,119,120,146,55,36,57,47,201,77,73,54,38,249,215,36,175,73,114,224,44,239,183,34,213,25,150,115,146,180,146,108,73,242,163,36,103,38,121,124,38,255,219,237,108,109,141,25,224,227,11,0,236,188,1,254,3,55,53,64,151,73,94,61,67,91,1,250,158,142,77,53,164,163,76,242,176,29,188,94,145,106,127,179,115,33,245,69,73,126,59,75,251,155,146,156,50,205,123,61,62,201,45,59,120,175,79,38,185,223,189,168,173,81,3,124,124,169,197,16,14,0,134,209,27,187,203,183,39,121,208,78,108,127,80,146,215,39,249,183,84,61,124,27,147,124,54,201,211,114,207,222,217,94,24,31,75,117,177,214,107,147,92,208,221,238,234,36,31,76,114,116,183,237,17,73,222,149,228,210,36,119,36,249,126,247,125,238,63,15,117,220,91,87,38,249,110,247,251,254,125,246,173,84,63,223,35,83,125,32,249,81,146,187,147,156,208,215,102,36,201,51,146,124,46,201,141,169,246,197,191,164,10,236,211,141,171,126,74,247,53,63,148,228,152,36,239,78,114,89,38,246,201,223,165,154,57,34,73,30,145,228,163,73,174,73,114,107,170,158,215,231,103,230,140,178,119,146,87,36,249,102,170,176,249,139,36,159,74,242,212,212,219,103,143,75,181,191,223,185,131,118,255,158,137,225,48,253,110,203,196,80,153,187,251,158,127,86,146,143,37,217,99,150,215,60,56,213,153,128,195,250,158,59,34,201,23,51,185,119,250,162,84,251,227,174,190,231,158,159,234,247,126,103,106,3,0,118,133,1,238,33,234,239,129,62,62,85,112,45,83,157,22,159,58,171,212,108,61,208,15,78,21,186,202,84,23,216,125,33,85,128,237,181,127,235,44,175,117,89,146,31,39,121,71,146,247,164,10,208,101,170,32,247,194,84,1,241,162,238,250,15,164,10,154,101,170,176,185,248,94,214,49,155,185,244,64,39,213,190,42,187,181,246,244,2,244,79,186,203,27,83,133,220,227,187,235,151,38,249,223,125,117,125,187,251,243,252,166,239,241,212,33,9,189,0,125,117,146,59,187,237,255,71,146,15,119,31,151,73,206,77,242,55,221,239,191,148,234,231,253,120,38,122,201,223,152,123,90,158,42,20,150,169,62,112,124,45,147,247,217,7,50,247,25,198,222,146,137,15,70,115,113,84,223,251,148,169,246,249,84,7,164,250,16,208,127,17,231,223,164,26,175,127,98,170,15,87,253,175,241,15,125,219,158,49,101,221,51,250,214,29,150,106,124,123,255,250,67,107,214,54,16,6,248,248,2,0,59,111,128,255,192,77,13,208,251,103,34,128,190,108,74,219,153,2,244,162,36,223,235,62,255,186,76,30,67,253,136,76,156,118,239,191,64,177,255,181,62,144,201,65,120,89,146,243,251,214,191,63,201,146,190,245,7,38,185,188,187,238,137,247,178,142,217,204,37,64,175,200,68,120,125,68,223,243,189,0,61,150,123,142,177,77,146,191,237,174,191,48,201,145,125,207,31,144,106,118,143,50,85,175,121,255,118,189,0,61,53,172,39,85,143,244,150,89,214,63,188,251,252,111,83,245,208,247,44,74,21,152,203,84,83,182,237,211,183,238,193,169,122,253,203,36,127,149,185,89,158,234,108,194,163,230,216,126,46,33,245,47,166,180,57,99,202,250,34,85,47,126,127,192,238,157,157,248,200,148,109,247,159,178,237,139,83,5,238,222,215,49,53,107,27,8,3,124,124,1,128,157,55,192,127,224,166,6,232,36,57,173,251,248,206,84,33,162,103,166,0,189,95,146,191,79,242,223,51,57,232,246,252,83,119,155,63,155,225,181,14,154,102,155,231,100,34,12,237,55,205,250,55,102,34,40,223,155,58,102,179,163,0,125,100,146,175,116,219,124,111,202,123,246,2,244,139,166,217,238,144,76,132,249,117,211,172,223,63,19,61,174,143,236,123,190,23,160,255,45,211,15,171,232,157,61,56,103,134,122,207,235,174,127,76,223,115,79,238,62,247,139,84,51,139,76,245,232,238,250,91,51,49,60,100,62,205,37,164,158,53,165,205,81,211,180,121,233,148,54,27,186,207,79,237,129,254,84,170,94,235,233,126,63,118,166,182,129,48,192,199,151,90,220,72,5,128,97,246,149,36,255,156,228,37,73,222,155,234,180,247,248,44,237,183,36,121,211,44,235,55,117,151,51,141,89,254,247,89,182,249,65,247,245,167,186,181,187,236,15,215,247,182,142,153,252,117,170,64,223,83,164,234,105,237,245,86,94,157,170,199,119,235,52,219,222,56,205,115,143,73,53,150,247,43,73,126,58,205,250,219,146,252,99,170,217,38,158,148,42,48,247,187,35,85,160,155,106,99,119,121,209,52,235,146,137,97,21,251,246,61,247,212,238,242,204,76,255,239,112,126,247,245,78,78,114,106,146,175,206,240,218,187,210,241,83,30,95,51,135,109,122,61,205,159,76,242,151,169,206,20,36,201,243,186,95,183,167,26,47,125,110,170,33,56,55,223,251,50,185,183,4,104,0,134,221,223,165,234,157,60,45,85,56,252,232,28,182,57,44,201,115,83,13,89,120,112,38,143,39,77,234,93,140,214,11,236,219,103,88,223,11,144,211,253,205,157,207,58,146,42,40,247,159,218,223,150,42,140,127,41,85,248,250,108,170,64,54,87,127,208,93,254,96,150,54,151,118,151,199,213,120,221,241,41,203,169,122,251,172,127,38,144,94,56,253,217,44,219,92,146,42,64,31,61,67,155,93,109,245,78,108,211,187,8,115,99,170,15,44,111,73,242,167,125,235,31,144,234,236,192,139,82,93,76,248,190,36,255,51,201,175,119,190,76,238,45,1,26,128,97,119,115,146,255,146,234,244,249,123,82,245,212,253,110,150,246,79,75,21,36,247,74,242,245,84,51,38,244,198,228,62,41,147,199,42,239,74,187,162,142,63,79,53,252,99,190,236,221,93,222,50,75,155,205,221,229,116,195,87,230,83,111,88,198,109,179,180,217,217,158,251,249,114,107,38,127,8,250,135,204,126,70,36,73,218,125,223,95,155,106,150,141,119,165,154,37,228,169,169,166,170,235,89,150,234,204,197,131,50,49,116,136,6,8,208,0,44,4,95,72,53,238,243,121,169,166,76,155,105,126,232,131,82,221,145,47,169,46,30,155,58,228,96,159,220,55,1,122,80,234,216,145,94,47,231,108,55,254,232,13,65,168,211,179,189,51,122,175,63,91,80,63,184,187,188,107,150,54,187,210,207,50,57,64,127,36,19,61,244,117,92,214,253,122,127,170,15,14,79,76,242,191,250,94,251,89,169,122,170,175,220,233,74,185,87,204,3,13,192,66,208,187,72,111,115,146,211,83,245,226,77,103,67,170,64,114,118,238,25,90,239,75,131,82,199,142,252,188,187,124,232,44,109,214,116,151,59,19,20,235,232,205,117,188,102,134,245,69,170,139,238,146,137,186,231,211,212,222,222,233,230,191,254,151,41,143,95,155,233,179,214,49,73,254,184,239,241,234,84,251,175,247,245,218,190,117,183,167,154,185,99,234,124,213,203,107,214,198,60,18,160,1,88,40,90,169,46,162,75,102,158,67,121,175,41,203,126,139,51,49,35,194,174,54,40,117,236,200,121,169,134,195,252,73,166,159,82,111,159,84,23,190,37,213,24,235,93,169,23,78,95,153,233,3,226,73,169,122,243,111,207,196,13,99,230,211,212,49,199,143,79,21,130,79,200,68,207,240,167,51,185,39,254,79,83,157,29,121,66,170,208,252,208,84,191,163,23,165,26,190,243,216,110,187,118,170,241,222,199,117,191,94,149,201,119,139,220,51,213,207,215,175,127,88,205,92,106,99,30,9,208,0,44,36,159,74,117,55,183,169,55,45,233,185,172,187,124,114,170,11,14,123,67,25,143,74,53,6,185,55,222,244,126,217,181,6,165,142,29,217,148,228,109,221,239,63,148,201,211,178,29,144,106,140,239,193,169,122,72,47,216,197,181,124,35,85,143,253,145,169,134,51,244,207,208,113,108,38,110,74,242,230,204,109,56,201,33,73,94,147,123,6,211,153,220,146,201,67,38,150,37,249,127,73,126,152,137,219,114,223,156,123,78,37,248,244,110,237,87,165,186,24,243,221,169,206,62,236,145,234,2,216,145,84,23,160,246,247,58,175,72,53,221,224,143,82,125,112,184,38,213,197,166,61,95,201,228,139,41,231,82,27,243,72,128,6,96,33,233,164,234,225,251,213,12,235,175,200,68,32,252,120,170,139,246,90,169,2,202,83,82,77,23,150,36,43,119,97,141,131,84,199,92,188,59,85,168,63,53,85,125,231,167,154,191,249,198,84,61,172,231,167,234,21,222,213,23,180,109,79,21,78,191,159,234,98,201,27,82,245,122,95,152,106,127,174,79,53,197,221,63,206,241,245,94,145,234,162,211,185,206,153,92,166,154,183,123,71,190,144,106,140,242,76,191,131,61,103,165,218,127,157,238,227,175,165,154,247,187,255,2,216,245,169,62,100,173,232,123,238,236,76,204,37,93,183,54,230,137,139,8,1,88,104,174,79,117,251,228,143,204,176,254,141,169,122,239,94,156,234,52,249,111,82,205,33,125,102,170,94,201,223,228,190,233,96,26,148,58,118,228,119,73,254,115,170,94,207,231,164,26,94,178,52,85,143,243,23,146,252,159,76,63,47,243,174,208,74,53,60,225,133,169,230,252,94,159,106,63,125,38,213,217,135,222,157,10,231,226,130,84,67,39,62,91,227,253,63,219,173,225,229,169,198,91,239,151,234,78,147,237,41,237,206,74,245,193,226,217,169,134,111,60,36,85,143,249,207,83,221,10,254,243,169,110,129,222,153,178,221,199,83,125,32,120,110,170,225,29,199,164,26,230,243,203,84,183,48,255,74,170,30,233,233,166,76,156,107,109,0,192,124,91,40,119,10,3,6,207,66,57,190,12,194,39,91,0,0,24,26,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,48,73,89,150,219,146,228,242,203,47,95,210,116,45,192,194,209,59,166,244,142,49,195,76,128,6,96,146,162,40,238,74,146,149,43,87,238,221,116,45,192,194,209,59,166,244,142,49,195,76,128,6,96,146,178,44,183,36,201,93,119,221,117,64,211,181,0,11,71,239,152,210,59,198,12,51,1,26,128,73,70,70,70,198,186,223,174,104,180,16,96,161,89,145,76,58,198,12,45,1,26,128,169,110,72,146,162,40,142,104,186,16,96,225,232,59,166,220,208,104,33,243,64,128,6,96,170,171,147,164,40,138,99,155,46,4,88,56,250,142,41,87,55,90,200,60,16,160,1,152,164,44,203,203,146,164,211,233,28,223,116,45,192,194,209,59,166,244,142,49,195,76,128,6,96,146,37,75,150,252,32,73,138,162,120,120,211,181,0,11,71,239,152,210,59,198,12,51,1,26,128,73,14,60,240,192,77,73,174,74,178,172,213,106,157,220,116,61,192,240,235,30,75,150,37,185,170,123,140,25,106,2,52,0,211,57,55,73,138,162,120,98,211,133,0,195,175,239,88,114,110,163,133,204,19,1,26,128,233,156,157,36,101,89,62,173,233,66,128,225,215,119,44,57,187,209,66,230,73,209,116,1,0,12,166,86,171,117,71,81,20,251,116,58,157,181,171,86,173,26,250,139,126,128,102,108,220,184,241,184,145,145,145,75,203,178,252,213,202,149,43,247,109,186,158,249,160,7,26,128,105,21,69,241,185,36,25,29,29,125,94,211,181,0,195,171,119,12,233,29,83,22,2,1,26,128,105,21,69,241,201,238,183,47,110,180,16,96,216,189,56,153,116,76,1,128,133,171,221,110,127,183,221,110,151,173,86,235,101,77,215,2,12,159,86,171,245,178,118,187,93,182,219,237,239,54,93,203,124,210,3,13,192,140,138,162,248,80,119,249,234,166,107,1,134,79,239,216,209,59,150,0,192,110,161,221,110,255,184,219,131,244,138,166,107,1,134,71,187,221,126,69,247,216,241,227,166,107,153,111,122,160,1,216,145,119,117,151,111,218,188,121,243,178,70,43,1,134,66,247,88,241,166,238,195,119,205,214,118,24,9,208,0,204,106,197,138,21,159,41,138,226,250,81,129,142,0,0,8,127,73,68,65,84,236,36,7,109,221,186,245,237,77,215,3,12,190,238,177,226,160,162,40,206,94,177,98,197,103,154,174,103,190,9,208,0,204,197,27,186,203,87,110,220,184,241,169,141,86,2,12,180,238,49,226,149,221,135,111,152,173,237,176,18,160,1,216,161,229,203,151,255,48,201,155,147,164,40,138,15,110,217,178,101,159,134,75,2,6,208,150,45,91,246,41,138,226,131,221,135,111,238,30,59,0,96,247,213,110,183,191,217,110,183,203,177,177,177,5,115,67,4,96,254,140,141,141,125,174,123,225,224,55,155,174,101,87,210,3,13,192,156,117,58,157,151,37,217,82,150,229,51,91,173,214,219,154,174,7,24,28,173,86,235,109,101,89,62,51,201,150,238,177,2,0,72,146,118,187,125,90,183,135,169,28,27,27,123,85,211,245,0,205,27,27,27,123,85,239,184,208,110,183,79,107,186,30,0,24,56,155,54,109,122,121,95,136,126,105,211,245,0,205,25,27,27,123,105,239,120,176,105,211,166,151,55,93,15,0,12,172,177,177,177,215,247,245,56,185,201,10,236,134,250,110,150,82,142,141,141,189,190,233,122,0,96,224,181,90,173,51,250,66,244,155,118,188,5,176,80,180,219,237,55,245,254,255,183,90,173,51,154,174,7,0,134,70,255,216,199,177,177,177,143,149,101,57,218,116,77,192,174,83,150,229,232,216,216,216,199,118,231,107,33,138,166,11,0,96,248,181,90,173,103,38,249,68,81,20,123,36,249,73,146,87,174,88,177,226,187,13,151,5,204,179,118,187,125,106,146,51,147,28,95,150,229,239,146,188,112,229,202,149,103,53,92,214,125,206,52,118,0,220,107,43,87,174,60,107,241,226,197,27,202,178,252,94,146,227,147,92,208,110,183,223,210,116,93,192,252,233,254,159,190,32,85,120,254,222,226,197,139,55,236,142,225,25,0,230,93,171,213,122,111,223,169,221,203,90,173,214,233,77,215,4,236,188,86,171,117,250,216,216,216,101,125,227,157,223,219,116,77,77,51,132,3,128,121,247,203,95,254,242,15,71,71,71,223,158,228,161,73,82,150,229,185,163,163,163,239,61,244,208,67,191,214,112,105,192,28,109,218,180,233,143,198,199,199,95,83,20,197,227,186,79,253,112,124,124,252,140,7,62,240,129,231,52,90,216,0,16,160,1,216,101,198,198,198,94,157,228,111,203,178,60,56,73,202,178,252,222,200,200,200,63,143,143,143,127,114,213,170,85,191,109,184,60,96,138,141,27,55,238,57,58,58,250,130,78,167,243,146,162,40,30,158,36,69,81,220,156,228,29,203,151,47,127,127,195,229,13,12,1,26,128,93,170,44,203,37,99,99,99,255,53,201,43,147,172,236,62,125,119,146,207,151,101,249,229,187,239,190,251,95,143,60,242,200,95,53,87,33,236,222,174,187,238,186,125,150,46,93,250,164,162,40,254,56,201,233,73,150,118,87,181,146,156,185,124,249,242,247,21,69,177,181,185,10,7,143,0,13,192,125,102,211,166,77,47,236,116,58,47,76,242,248,41,171,46,44,138,226,226,241,241,241,31,143,140,140,92,190,100,201,146,107,15,60,240,192,187,154,168,17,22,178,205,155,55,47,219,186,117,235,81,157,78,103,205,232,232,232,250,178,44,79,74,114,202,148,102,223,26,25,25,249,196,161,135,30,250,137,38,106,28,6,2,52,0,247,185,141,27,55,30,53,50,50,242,244,178,44,159,90,20,197,99,103,104,118,123,146,205,73,238,76,213,99,93,222,103,5,194,194,81,164,234,81,190,127,146,3,147,60,96,186,70,101,89,126,187,40,138,175,119,58,157,47,173,90,181,234,218,251,178,192,97,36,64,3,208,168,155,110,186,233,126,91,183,110,125,196,162,69,139,30,150,100,93,89,150,199,38,57,34,201,158,13,151,6,11,209,111,147,252,162,40,138,43,147,252,116,251,246,237,223,95,178,100,201,5,135,28,114,200,111,154,46,108,152,8,208,0,12,164,86,171,181,127,81,20,7,20,69,177,172,44,203,165,69,81,248,155,5,53,149,101,89,22,69,113,119,89,150,119,149,101,121,235,202,149,43,111,107,186,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,205,252,127,217,199,157,25,89,34,253,224,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":30850,"duration_micros":1524,"top":1132.2352294921875,"left":48.0,"width":283.130859375,"height":331.7647705078125,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,109,144,101,101,97,39,240,255,115,239,244,48,12,6,88,132,153,233,151,65,7,193,32,131,136,32,12,239,16,18,162,9,75,112,176,12,65,86,169,202,174,149,218,132,77,25,179,201,2,26,215,53,155,72,109,84,246,67,54,91,41,225,131,24,134,72,12,48,160,155,181,16,50,33,40,130,98,197,151,65,138,145,165,164,187,239,188,0,195,251,48,204,76,223,103,63,76,55,14,47,6,135,233,238,115,111,207,239,87,53,213,221,167,251,158,243,63,79,213,60,247,95,231,156,123,78,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,63,74,211,1,250,213,186,117,235,246,89,176,96,193,59,74,41,71,150,82,150,37,25,78,114,112,173,117,255,86,171,53,191,214,106,108,97,55,149,82,106,183,219,221,86,74,121,58,201,99,73,198,107,173,15,215,90,31,216,186,117,235,247,142,56,226,136,23,154,206,8,0,74,222,207,169,214,218,26,31,31,255,181,36,191,92,74,57,61,201,187,154,206,4,123,161,239,212,90,255,57,201,237,195,195,195,255,80,74,233,54,29,8,128,189,143,2,253,26,198,199,199,207,75,114,97,146,149,73,22,238,250,187,90,235,15,74,41,107,75,41,15,117,187,221,177,86,171,181,169,214,250,116,41,229,133,36,181,137,188,208,231,74,173,117,159,82,202,254,221,110,119,81,171,213,26,169,181,190,165,214,186,188,148,242,246,151,253,237,150,36,55,37,249,210,240,240,240,173,13,100,5,96,47,165,64,191,138,181,107,215,190,225,192,3,15,252,221,36,31,78,114,248,212,242,90,235,189,173,86,235,107,173,86,107,205,246,237,219,239,94,186,116,233,243,205,165,132,189,203,232,232,232,190,3,3,3,39,119,187,221,179,186,221,238,187,75,41,39,238,242,235,31,39,249,252,147,79,62,249,87,203,151,47,127,182,169,140,0,236,29,20,232,93,172,91,183,110,159,133,11,23,94,86,74,249,104,173,117,255,201,197,247,215,90,175,171,181,222,176,116,233,210,31,55,26,16,120,209,232,232,232,225,165,148,223,44,165,92,156,228,168,36,41,165,60,93,107,253,220,150,45,91,174,116,189,52,0,51,69,129,158,212,233,116,62,92,107,253,100,146,161,201,69,95,75,242,191,156,26,134,222,55,121,169,213,239,37,121,247,228,162,78,41,229,147,67,67,67,159,111,48,22,0,115,212,94,95,160,215,175,95,191,188,219,237,126,54,63,125,227,189,35,201,167,135,135,135,191,222,96,44,224,117,24,31,31,255,149,36,151,39,57,123,114,209,215,90,173,214,31,14,14,14,174,109,48,22,0,115,204,94,93,160,199,198,198,254,99,41,229,47,147,180,146,116,90,173,214,21,131,131,131,95,104,58,23,176,103,214,175,95,127,73,183,219,253,243,236,60,163,212,173,181,94,58,50,50,242,191,155,206,5,0,125,109,108,108,236,175,199,199,199,235,228,191,107,54,111,222,124,64,211,153,128,233,179,121,243,230,3,198,199,199,175,153,250,127,62,54,54,246,215,77,103,2,96,110,216,235,142,64,175,95,191,254,144,110,183,123,125,146,95,206,206,91,205,125,120,120,120,248,154,134,99,1,51,100,124,124,252,223,39,249,124,118,206,119,183,183,90,173,139,6,7,7,31,109,56,22,0,125,108,175,42,208,163,163,163,135,183,90,173,27,147,188,61,201,131,221,110,247,67,75,151,46,189,167,233,92,192,204,26,29,29,93,209,106,181,174,77,242,214,36,63,232,118,187,23,184,171,14,0,175,215,94,83,160,55,109,218,116,196,182,109,219,254,79,41,229,240,36,119,13,12,12,188,127,209,162,69,27,154,206,5,204,142,77,155,54,45,217,190,125,251,223,37,57,173,214,250,227,249,243,231,255,250,162,69,139,214,53,157,11,128,254,211,106,58,192,108,120,228,145,71,134,118,236,216,113,243,100,121,190,109,219,182,109,231,40,207,176,119,89,180,104,209,134,109,219,182,157,147,228,182,82,202,225,59,118,236,184,249,145,71,30,25,122,205,23,2,192,203,204,249,2,93,107,45,237,118,251,75,181,214,163,74,41,107,182,108,217,114,222,178,101,203,182,54,157,11,152,125,203,150,45,219,186,101,203,150,243,74,41,107,106,173,71,77,206,13,123,205,153,56,0,166,199,156,127,227,232,116,58,215,214,90,63,88,107,253,97,146,179,70,70,70,30,111,58,19,208,172,177,177,177,55,38,89,83,74,57,186,148,242,197,161,161,161,15,53,157,9,128,254,49,167,143,64,143,143,143,255,81,173,245,131,73,158,171,181,94,172,60,3,73,50,50,50,242,120,173,245,226,236,156,27,62,56,62,62,254,71,77,103,2,128,198,109,220,184,241,148,169,251,191,110,216,176,225,194,166,243,0,189,103,195,134,13,23,78,205,19,27,55,110,60,165,233,60,0,244,135,57,123,4,122,251,246,237,87,37,73,41,229,170,37,75,150,124,169,233,60,64,239,89,178,100,201,151,74,41,87,37,63,157,51,0,96,175,52,54,54,118,197,248,248,120,237,116,58,63,104,58,11,208,251,58,157,206,15,38,159,86,120,69,211,89,0,232,125,115,238,8,116,167,211,57,180,148,242,169,36,41,165,92,214,116,30,160,247,77,205,21,165,148,79,117,58,157,67,155,206,3,64,111,155,115,5,186,219,237,94,145,164,157,228,250,193,193,193,175,54,157,7,232,125,147,115,197,245,73,218,147,115,8,0,252,76,115,234,54,118,157,78,231,200,90,235,143,146,164,213,106,29,61,56,56,184,182,233,76,64,127,88,191,126,253,242,110,183,251,195,36,41,165,188,109,104,104,232,129,166,51,1,208,155,230,212,17,232,90,235,165,147,223,94,173,60,3,187,99,114,206,184,58,121,201,92,2,0,175,48,103,10,244,19,79,60,113,96,146,223,73,146,90,235,95,54,28,7,232,67,187,204,29,191,51,57,167,0,192,43,204,153,2,253,252,243,207,95,146,100,94,41,229,171,35,35,35,223,107,58,15,208,127,70,70,70,190,87,74,249,106,146,121,147,115,10,0,188,194,156,41,208,181,214,139,38,191,126,177,233,44,64,255,154,154,67,166,230,20,0,120,185,57,241,33,194,78,167,243,182,90,235,253,165,148,167,134,134,134,156,118,5,246,72,167,211,121,178,214,122,64,41,229,168,161,161,161,31,53,157,7,128,222,50,39,142,64,215,90,207,157,252,118,117,163,65,128,185,98,117,242,146,185,5,0,94,52,39,10,116,146,115,146,164,214,250,127,155,14,2,244,191,93,230,146,115,26,13,2,64,79,154,43,5,250,140,36,121,225,133,23,238,104,58,8,208,255,118,153,75,206,104,52,8,0,61,169,239,11,244,232,232,232,137,73,22,148,82,214,30,118,216,97,27,155,206,3,244,191,195,14,59,108,99,41,101,109,146,5,147,115,12,0,188,168,239,11,116,187,221,62,118,242,219,251,26,13,2,204,53,247,37,47,153,99,0,32,201,28,40,208,221,110,247,168,36,169,181,254,176,233,44,192,220,49,53,167,76,205,49,0,48,165,239,11,116,41,229,45,147,95,215,53,157,5,152,59,166,230,148,169,57,6,0,166,204,107,58,192,52,88,154,36,181,214,71,154,14,2,253,224,125,171,87,29,211,77,61,42,181,188,37,201,210,148,114,72,77,221,191,36,251,36,73,77,94,40,41,79,167,214,71,147,140,166,212,135,90,41,247,255,253,249,31,248,126,179,201,103,215,46,115,202,210,70,131,0,208,115,250,190,64,215,90,23,149,82,210,237,118,125,128,16,94,197,123,111,189,238,196,86,55,239,174,41,103,37,57,185,155,236,155,148,93,30,163,84,95,242,68,165,50,185,236,167,11,75,186,73,86,174,94,245,124,146,187,75,234,154,110,43,95,187,249,188,139,239,157,165,93,104,68,183,219,221,216,106,181,82,107,93,212,116,22,0,122,75,223,63,137,112,124,124,252,185,36,11,219,237,246,27,150,44,89,242,92,211,121,160,23,156,127,243,223,28,213,106,181,47,46,53,191,89,83,15,159,137,109,148,148,31,215,146,27,186,221,137,235,86,191,247,223,221,63,19,219,104,210,134,13,27,246,155,152,152,120,54,201,150,225,225,225,253,154,206,3,64,239,152,11,5,122,34,73,107,104,104,168,93,74,233,54,157,7,154,180,114,245,170,247,212,154,223,45,37,231,205,230,118,107,205,173,165,228,175,110,58,255,3,115,230,97,70,181,214,86,167,211,153,72,210,29,30,30,110,55,157,7,128,222,49,23,10,116,77,146,225,225,225,190,223,23,120,189,86,222,178,234,236,218,173,151,151,82,126,165,201,28,181,214,175,151,86,249,244,77,191,241,129,57,241,80,35,243,11,0,175,166,239,223,20,188,193,177,55,251,141,213,215,15,181,83,255,60,201,37,77,103,121,153,47,76,164,92,113,203,249,23,117,154,14,178,39,204,47,0,188,154,190,191,141,29,236,173,86,174,190,254,183,219,181,222,159,222,43,207,73,114,73,187,214,251,87,174,190,254,183,155,14,2,0,211,77,129,134,126,83,107,185,96,245,117,87,39,245,154,148,28,208,116,156,159,169,228,128,164,94,115,193,234,235,174,78,173,142,224,2,48,103,244,253,155,154,83,172,236,77,86,222,248,133,183,150,246,192,181,53,89,209,116,150,221,81,146,123,234,196,246,15,221,116,193,37,15,54,157,101,119,152,95,0,120,53,142,64,67,159,88,121,203,170,211,210,30,88,211,111,229,57,73,106,178,34,237,129,53,43,111,89,117,90,211,89,0,96,79,41,208,208,7,86,174,94,117,78,106,189,45,201,96,211,89,246,192,96,106,189,109,229,234,85,231,52,29,4,0,246,132,2,13,61,238,189,55,125,241,172,164,220,154,148,5,77,103,217,115,101,65,82,110,221,185,79,0,208,159,20,104,232,97,43,191,242,183,71,151,210,250,114,82,247,105,58,203,244,169,251,148,210,250,242,202,175,252,237,209,77,39,1,128,215,67,129,134,30,245,171,215,94,187,95,38,186,215,165,148,55,54,157,101,218,149,242,198,76,116,175,251,213,107,175,245,136,108,0,250,142,2,13,61,106,191,3,230,93,157,228,152,166,115,204,160,99,38,247,17,0,250,138,2,13,61,232,130,91,86,125,36,201,111,53,157,99,22,252,214,228,190,2,64,223,80,160,161,199,172,188,241,218,163,107,205,85,77,231,152,45,181,230,170,149,55,94,235,122,104,0,250,134,2,13,189,166,61,239,202,166,35,204,186,189,113,159,1,232,91,10,52,244,144,247,222,178,234,162,36,231,54,157,163,1,231,78,238,59,0,244,60,5,26,122,72,169,249,88,211,25,154,178,55,239,59,0,253,69,129,134,30,113,193,205,171,254,67,146,229,77,231,104,208,242,201,49,0,128,158,166,64,67,143,168,37,151,54,157,161,105,198,0,128,126,48,175,233,0,64,114,193,234,235,207,173,169,239,104,58,199,174,70,126,97,255,156,57,178,44,191,246,230,35,178,112,96,32,91,39,118,228,31,30,94,151,53,163,15,103,244,153,167,102,106,179,239,184,96,245,245,231,222,120,254,69,95,157,169,13,0,192,158,114,4,26,122,65,201,7,155,142,176,171,99,14,94,156,207,158,249,158,188,239,136,163,178,112,96,32,73,178,160,61,47,43,15,127,91,62,123,230,123,114,220,226,161,153,219,120,143,141,5,0,188,156,2,13,13,123,255,13,55,28,80,107,189,176,233,28,83,222,113,200,146,124,236,164,51,51,208,106,103,243,214,231,179,234,129,239,231,207,238,249,167,92,247,163,239,229,177,231,183,100,94,171,149,203,79,56,61,199,30,178,100,70,182,95,107,189,240,253,55,220,112,192,140,172,28,0,166,129,2,13,13,219,49,127,251,249,77,103,152,114,220,162,193,124,252,164,179,50,208,106,231,129,205,143,230,210,59,190,146,47,63,184,54,247,109,236,228,239,215,221,159,75,239,248,74,238,127,252,209,180,91,173,92,118,226,25,57,242,160,131,103,36,71,47,141,9,0,188,156,2,13,77,43,229,61,77,71,72,146,227,23,15,229,242,21,103,166,93,74,146,228,182,159,60,148,173,59,118,188,228,111,182,77,76,228,191,127,107,77,30,124,226,177,204,111,183,243,209,227,79,205,130,121,51,240,81,138,30,25,19,0,120,53,10,52,52,239,236,166,3,28,191,120,40,151,157,120,70,218,165,228,185,237,219,146,36,151,30,187,34,167,14,29,250,138,191,221,58,177,35,159,250,214,154,60,254,252,150,28,188,239,194,188,255,173,51,114,231,189,198,199,4,0,126,22,5,26,26,244,190,91,86,45,79,178,184,201,12,39,44,25,206,229,147,229,249,251,143,110,200,135,111,91,157,239,110,90,159,82,74,62,122,252,41,57,117,248,149,37,122,203,246,237,249,187,117,107,147,36,203,223,56,35,241,23,79,142,13,0,244,28,5,26,26,84,83,142,107,114,251,39,46,25,201,127,57,225,244,180,74,201,191,108,90,159,63,189,231,159,178,117,199,142,124,250,222,59,115,223,198,78,74,41,249,195,227,79,205,25,35,111,126,197,107,59,207,62,157,36,25,220,239,13,51,146,173,233,177,1,128,159,69,129,134,6,213,110,125,123,83,219,62,105,112,105,254,248,132,211,210,42,37,223,221,216,201,159,221,123,103,38,186,221,36,201,68,183,155,43,239,189,51,247,108,24,75,146,124,228,184,147,115,214,210,101,47,121,253,178,3,254,77,146,164,243,220,51,51,146,175,201,177,1,128,127,141,2,13,13,42,201,17,77,108,247,228,161,165,249,207,239,58,117,103,121,222,180,62,159,254,246,63,191,88,158,167,76,212,154,207,124,251,174,23,75,244,239,191,243,164,156,125,232,97,73,146,55,237,127,96,62,112,228,206,231,190,124,255,209,141,51,146,177,169,177,1,128,215,226,73,132,208,160,90,234,161,73,153,213,109,158,58,116,104,62,122,252,41,41,165,228,219,27,198,243,63,190,115,215,43,202,243,148,169,18,253,7,199,159,146,83,134,14,205,165,199,174,200,33,251,238,151,115,15,123,107,246,105,183,243,240,83,79,228,203,15,254,112,70,114,238,28,27,0,232,61,10,52,52,170,204,234,7,8,87,12,142,228,15,38,203,243,125,27,59,255,106,121,158,50,81,107,62,119,223,55,211,46,173,172,24,28,201,133,191,120,116,146,100,252,217,167,243,167,223,90,147,237,175,241,250,215,111,118,199,6,0,126,94,46,225,128,6,149,228,192,217,218,214,233,35,111,202,31,191,107,231,53,207,247,108,24,203,149,187,92,243,252,90,186,181,102,245,67,15,188,248,243,232,51,79,229,227,223,184,61,79,190,176,117,166,226,206,234,216,0,192,238,112,4,26,26,84,147,125,103,99,59,167,13,191,41,31,57,238,148,148,36,247,109,236,228,51,223,190,43,19,181,254,220,175,63,252,192,131,242,137,147,206,74,178,179,60,255,201,55,110,207,211,219,94,152,161,180,59,205,214,216,0,192,238,82,160,161,89,51,126,22,232,180,225,55,237,188,108,35,59,203,243,149,247,222,185,91,229,249,200,131,14,206,39,78,250,165,44,152,55,47,163,207,60,149,143,221,245,245,60,59,249,176,149,25,230,12,25,0,61,73,129,134,102,109,75,50,127,166,86,126,214,210,101,249,79,239,60,41,37,201,61,235,199,242,153,239,236,222,145,231,35,15,58,56,159,60,249,236,204,111,183,103,187,60,39,59,199,6,0,122,142,35,60,208,164,154,103,103,106,213,47,47,207,127,177,155,229,249,232,131,23,189,88,158,31,126,234,137,217,46,207,51,58,54,0,176,39,20,104,104,214,99,51,177,210,51,71,222,156,223,159,44,207,223,236,60,146,191,248,206,93,233,238,70,121,126,251,193,139,243,137,147,126,41,243,219,237,60,244,228,230,252,201,55,110,159,221,242,188,211,140,140,13,0,236,41,5,26,154,84,50,62,221,171,28,249,133,253,243,123,199,174,72,146,220,53,254,147,124,238,190,111,238,86,121,62,230,144,37,249,248,73,103,102,94,171,149,7,159,120,60,255,245,238,59,178,101,199,246,233,142,249,218,102,96,108,0,96,58,40,208,208,160,146,242,255,166,123,157,255,118,217,47,102,94,171,149,7,54,63,154,255,249,221,187,119,171,60,191,115,209,96,62,190,226,204,12,180,218,121,240,137,199,243,223,238,254,199,108,217,222,64,121,206,204,140,13,0,76,7,31,34,132,70,213,31,77,247,26,223,114,224,65,73,146,59,199,126,178,91,229,249,248,197,67,185,236,196,51,210,46,37,15,108,126,52,159,250,214,154,108,221,177,99,186,227,237,134,233,31,27,0,152,14,142,64,67,131,186,173,242,47,211,189,206,133,3,3,73,146,103,182,255,252,247,105,62,126,241,80,46,59,225,244,201,242,252,88,62,121,247,63,54,92,158,103,102,108,0,96,58,40,208,208,160,110,119,203,189,211,189,206,129,86,59,249,255,237,221,121,124,84,229,221,255,255,247,117,102,32,236,251,154,132,93,20,68,12,32,178,9,40,238,90,5,151,214,42,106,91,107,109,173,203,175,181,235,173,221,236,226,210,95,111,107,107,93,170,181,183,181,106,235,82,193,125,87,44,202,190,111,178,74,88,50,9,36,128,236,144,100,230,92,223,63,206,12,12,97,18,114,96,146,51,19,94,207,199,131,199,228,156,115,157,51,159,28,224,204,59,87,174,115,29,73,209,88,237,158,50,120,160,231,217,113,180,116,75,169,238,158,241,145,42,98,177,116,151,229,91,93,156,27,0,0,210,129,0,13,4,232,181,9,55,238,146,209,140,116,30,51,236,120,255,173,43,221,35,135,224,225,93,243,15,12,219,88,186,165,84,191,155,245,113,70,132,103,25,205,120,109,194,141,187,130,46,3,0,128,84,8,208,64,208,92,189,159,206,195,53,138,7,232,168,91,115,15,244,240,174,249,250,209,208,209,7,194,243,111,103,78,201,140,240,44,165,253,156,0,0,144,78,4,104,32,96,198,113,223,72,231,241,194,241,33,28,149,213,4,232,70,142,163,43,251,158,172,159,196,195,243,194,210,18,253,118,230,148,106,219,7,33,221,231,4,0,128,116,98,22,14,32,96,147,198,95,55,231,242,87,254,181,84,70,167,164,227,120,141,227,61,208,223,26,120,218,97,243,55,27,25,245,110,221,86,77,194,222,127,253,121,155,139,117,255,156,79,20,75,10,207,3,59,116,214,151,79,28,32,199,152,90,191,231,138,109,101,122,110,249,226,52,84,47,201,106,233,164,9,215,205,73,207,193,0,0,72,63,2,52,144,25,158,147,116,95,58,14,180,47,22,85,179,112,35,245,106,221,182,218,54,21,177,152,94,90,181,84,147,215,44,63,108,170,187,211,187,228,105,96,135,206,190,222,179,91,203,214,233,11,208,222,185,0,0,32,99,17,160,129,12,16,51,122,42,148,166,0,125,215,39,239,107,100,110,247,148,219,172,172,214,108,223,166,207,182,148,106,127,44,245,52,117,207,124,182,72,101,251,246,168,89,184,113,173,223,115,206,166,162,163,170,53,149,152,209,83,105,59,24,0,0,117,160,246,191,163,205,80,145,72,196,74,82,94,94,94,214,127,47,56,190,93,254,234,191,31,147,236,205,65,215,17,44,243,215,201,19,174,249,110,208,85,36,112,125,1,0,164,194,77,132,64,134,112,28,251,231,160,107,8,26,231,0,0,144,13,8,208,64,134,120,249,210,137,43,100,237,35,65,215,17,24,107,31,121,249,210,137,43,130,46,3,0,128,35,33,64,3,153,164,105,211,223,72,58,30,31,32,178,43,254,189,3,0,144,241,8,208,64,6,153,124,193,21,165,86,206,93,65,215,81,223,172,156,187,38,95,112,69,105,208,117,0,0,80,27,4,104,32,195,188,50,225,234,135,173,209,91,65,215,81,95,172,209,91,175,76,184,250,225,160,235,0,0,160,182,8,208,64,6,114,28,123,187,172,118,4,93,71,157,179,218,225,56,246,246,160,203,0,0,192,15,2,52,144,129,38,93,114,237,90,25,123,83,208,117,212,57,99,111,154,116,201,181,107,131,46,3,0,0,63,8,208,64,134,154,60,225,218,151,140,49,63,11,186,142,186,98,140,249,217,228,9,215,190,20,116,29,0,0,248,69,128,6,50,216,164,241,215,220,43,99,31,10,186,142,180,51,246,161,73,227,175,185,55,232,50,0,0,56,26,4,104,32,195,77,30,127,237,247,36,253,45,232,58,210,232,111,241,239,9,0,128,172,68,128,6,178,192,228,9,19,191,45,53,132,135,172,216,71,188,239,5,0,128,236,69,128,6,178,196,228,9,215,222,38,171,236,125,216,136,213,111,38,79,184,246,182,160,203,0,0,224,88,17,160,129,44,50,249,178,137,191,146,244,13,73,177,160,107,241,33,38,233,27,241,218,1,0,200,122,4,104,32,203,76,158,48,241,105,57,206,105,146,153,22,116,45,71,102,166,201,113,78,155,60,97,226,211,65,87,2,0,64,186,152,160,11,56,86,145,72,196,74,82,94,94,94,214,127,47,128,95,151,189,250,220,175,140,204,221,65,215,145,138,149,189,251,149,9,215,254,58,232,58,142,5,215,23,0,64,42,244,64,3,89,236,149,9,215,254,90,177,232,64,89,253,39,232,90,14,176,250,143,98,209,129,217,30,158,1,0,168,78,214,247,170,208,67,132,35,153,50,101,74,184,162,93,187,156,246,45,90,132,43,246,55,14,73,82,227,38,21,177,173,187,119,71,27,111,219,86,62,110,220,184,104,208,53,166,195,229,175,253,235,108,201,220,33,107,47,9,164,0,99,222,144,236,131,147,199,79,252,40,144,247,175,3,92,95,0,0,169,100,253,135,2,31,112,72,248,244,211,21,45,109,171,166,29,157,88,180,125,40,28,110,35,87,173,173,113,91,24,57,141,107,218,207,202,173,48,214,217,45,71,59,98,209,232,118,55,20,222,106,118,238,43,27,61,186,223,174,250,170,61,157,46,155,252,220,48,57,186,209,88,115,189,140,154,214,233,155,89,237,179,198,62,35,87,127,127,229,242,107,103,215,233,123,5,128,235,11,0,32,149,172,255,80,224,3,238,248,245,226,139,47,134,122,156,65,44,131,253,0,0,32,0,73,68,65,84,52,172,123,212,184,221,66,54,156,43,99,91,165,245,13,172,217,25,51,209,226,176,117,54,174,95,57,123,195,85,87,93,149,77,51,95,232,43,47,190,216,56,154,83,249,21,201,140,151,116,129,164,214,105,58,244,14,73,239,74,246,181,112,121,163,151,94,186,234,170,138,52,29,55,227,112,125,1,0,164,146,245,31,10,124,192,29,127,166,205,95,219,35,28,114,250,184,82,111,99,76,189,140,227,183,214,186,142,180,54,26,115,63,63,99,72,239,245,245,241,158,233,118,249,235,255,26,41,87,35,37,13,182,210,0,35,123,130,100,90,214,188,151,221,101,101,214,24,105,153,164,5,114,52,99,242,165,19,103,212,71,189,153,128,235,11,0,32,149,172,255,80,224,3,238,248,48,197,218,112,179,5,133,3,220,70,225,126,198,218,116,245,164,30,21,107,204,14,167,50,186,98,239,224,94,203,198,25,147,213,227,167,191,244,198,115,109,27,87,132,58,198,66,182,85,88,177,28,73,138,42,84,30,138,153,157,21,141,99,101,111,94,114,237,23,65,215,24,36,174,47,0,128,84,178,254,67,129,15,184,134,109,202,148,41,225,166,237,123,23,56,50,3,93,217,26,199,50,215,55,71,166,194,149,93,178,111,235,218,69,13,229,70,68,28,138,235,11,0,32,21,166,177,67,198,154,182,104,205,41,57,237,122,76,148,116,90,166,133,103,73,138,215,116,90,78,187,30,19,167,45,90,115,74,208,245,0,0,128,250,17,14,186,0,160,170,217,203,10,187,184,49,13,151,156,206,65,215,82,27,142,9,53,145,66,163,102,46,46,236,227,132,52,107,216,128,94,155,130,174,9,0,0,212,29,122,160,145,81,102,45,217,48,212,141,57,227,179,37,60,31,202,233,236,198,156,241,179,150,108,24,26,116,37,0,0,160,238,208,3,141,140,48,115,245,234,86,238,158,198,99,173,181,185,65,215,114,172,172,181,67,166,47,92,223,197,105,94,49,117,68,223,190,59,131,174,7,0,0,164,23,61,208,8,220,220,101,197,221,77,121,227,203,28,71,89,31,158,19,28,71,185,166,188,241,101,115,151,21,119,15,186,22,0,0,144,94,4,104,4,106,222,146,226,254,209,88,229,133,214,85,147,160,107,73,55,235,170,73,52,86,121,225,188,37,197,253,131,174,5,0,0,164,15,1,26,129,153,189,172,112,80,165,173,28,19,116,29,117,173,210,86,142,153,189,172,112,80,208,117,0,0,128,244,32,64,35,16,51,22,173,27,226,198,156,97,65,215,81,95,220,152,51,108,198,162,117,67,130,174,3,0,0,28,59,2,52,234,221,172,165,69,5,198,152,227,110,166,10,99,204,208,89,75,139,10,130,174,3,0,0,28,27,2,52,234,213,244,197,133,253,172,27,27,30,116,29,65,177,110,108,248,244,197,133,253,130,174,3,0,0,28,61,2,52,234,205,204,69,171,243,29,57,99,131,174,35,104,142,156,177,51,23,173,206,15,186,14,0,0,112,116,8,208,168,23,239,46,90,212,220,49,141,206,12,186,142,76,225,152,70,103,190,187,104,81,243,160,235,0,0,0,254,17,160,81,47,90,170,213,24,87,134,192,24,231,202,52,111,169,86,13,126,6,18,0,0,26,34,2,52,234,220,180,5,133,131,28,227,240,64,145,42,28,227,116,159,182,128,233,237,0,0,200,54,4,104,212,169,89,203,139,218,135,66,199,207,116,117,126,133,66,206,176,89,203,139,218,7,93,7,0,0,168,61,2,52,234,148,91,25,37,60,31,1,231,8,0,128,236,66,128,70,157,153,185,96,99,95,35,211,45,232,58,50,157,145,233,54,115,193,198,190,65,215,1,0,0,106,135,0,141,58,227,132,221,193,65,215,144,45,56,87,0,0,100,15,2,52,234,196,236,101,235,7,184,86,109,130,174,35,91,184,86,109,102,47,91,63,32,232,58,0,0,192,145,17,160,81,39,220,168,25,24,116,13,217,134,115,6,0,64,118,32,64,35,237,62,89,248,249,137,50,182,85,208,117,100,29,99,91,125,178,240,243,19,131,46,3,0,0,212,140,0,141,180,203,9,135,79,10,186,134,108,197,185,3,0,32,243,17,160,145,86,115,87,22,119,112,93,117,13,186,142,108,229,186,234,58,119,101,113,135,160,235,0,0,0,213,35,64,35,173,42,247,199,250,4,93,67,182,227,28,2,0,144,217,8,208,72,43,19,178,189,130,174,33,219,113,14,1,0,200,108,225,160,11,64,195,49,127,117,73,199,138,125,21,71,125,243,96,180,178,210,204,155,57,173,75,209,198,13,109,183,110,43,107,213,178,121,139,125,29,114,187,238,24,62,226,204,72,171,214,173,43,253,30,175,164,120,99,179,69,11,230,118,41,221,84,210,166,188,188,188,81,135,14,157,119,244,232,217,115,219,144,97,163,74,107,179,255,150,178,178,156,69,11,231,116,142,172,91,219,193,113,66,182,91,239,62,101,5,131,135,148,182,105,211,161,162,186,125,150,206,159,223,126,234,212,247,250,39,150,219,180,109,191,115,226,215,111,90,236,171,112,215,182,154,191,186,164,227,144,190,93,203,124,237,7,0,0,234,5,1,26,105,19,171,40,207,151,140,239,253,118,238,216,209,232,241,135,254,48,110,209,252,185,103,239,223,191,183,109,213,237,79,134,254,84,209,163,79,159,57,55,221,122,199,171,125,79,60,121,199,145,142,247,241,7,239,118,155,244,194,63,47,41,46,218,56,40,213,246,22,173,90,149,140,26,51,238,157,111,221,114,199,44,199,113,108,213,237,219,183,111,105,252,208,255,127,239,197,139,23,204,189,168,234,54,99,76,108,212,153,227,254,115,235,29,119,126,220,184,113,142,91,117,251,255,61,241,231,43,54,172,47,28,154,88,158,248,181,155,254,116,164,122,83,241,206,165,8,208,0,0,100,32,134,112,32,109,92,87,185,126,247,41,218,88,216,252,199,183,127,243,251,179,166,79,189,50,85,120,150,164,88,44,218,120,237,170,149,103,220,253,147,239,255,236,157,215,39,247,174,233,120,79,60,252,192,136,135,31,184,231,231,213,133,103,73,218,189,115,103,215,247,222,124,245,134,59,191,127,243,117,123,247,238,57,236,135,200,7,126,123,247,229,169,194,179,36,89,107,67,211,62,254,232,171,143,253,233,247,103,86,221,54,249,197,103,251,37,135,231,110,221,123,205,187,226,154,235,151,215,84,111,117,142,230,92,2,0,128,250,65,128,70,218,88,57,157,253,180,175,168,40,119,238,253,229,255,220,180,181,172,236,132,218,180,47,47,223,223,250,31,79,252,229,123,203,151,44,73,25,180,39,253,251,153,254,239,189,249,234,13,181,125,255,207,87,175,24,253,192,61,191,248,82,242,186,105,159,124,144,187,252,179,197,103,39,175,235,208,177,243,202,118,237,59,172,77,94,247,233,199,31,126,101,67,225,231,45,18,203,251,247,239,11,189,49,249,197,47,39,183,185,254,198,239,188,82,219,90,170,242,123,46,1,0,64,253,97,8,7,210,98,202,220,149,29,100,173,175,127,79,207,63,243,127,5,165,155,74,14,140,23,14,135,195,251,135,143,30,251,234,152,113,231,47,61,249,148,130,109,235,11,215,180,156,51,253,147,94,31,188,251,230,21,123,247,236,233,40,73,209,104,180,201,91,175,190,56,180,255,192,129,239,39,31,107,255,254,125,161,55,95,123,233,202,228,117,93,243,187,47,58,239,162,75,63,24,52,120,104,113,139,22,173,42,23,47,154,223,233,157,55,38,157,185,102,229,242,49,137,54,203,22,47,28,183,181,100,243,187,237,187,118,222,47,73,159,78,153,114,106,98,91,40,20,170,188,237,135,63,187,127,204,184,115,139,36,233,95,79,255,237,212,73,207,63,115,171,228,245,68,127,248,254,91,253,110,248,246,237,115,37,233,233,199,31,30,190,99,251,246,110,137,125,11,134,12,125,171,182,99,173,83,178,54,60,101,238,202,14,227,134,158,180,229,168,143,1,0,0,234,4,1,26,105,209,44,220,188,157,85,204,215,62,139,231,205,30,156,188,124,214,249,23,63,127,243,237,63,154,145,88,238,63,160,224,139,254,3,10,190,104,221,174,253,158,103,158,124,236,7,137,245,27,55,174,63,108,24,199,204,79,167,230,38,7,216,150,45,219,20,255,234,222,7,255,222,161,99,199,242,3,199,63,247,130,141,99,207,62,239,185,219,111,156,216,110,243,166,226,1,146,20,141,70,155,206,91,48,171,235,249,93,199,23,74,82,89,233,166,3,115,88,119,235,217,123,94,34,60,75,210,213,215,223,184,228,157,215,39,149,37,194,252,230,146,226,142,146,84,82,180,177,217,212,41,239,95,150,104,151,147,211,100,199,13,55,223,254,129,175,147,145,66,179,112,243,118,146,8,208,0,0,100,24,134,112,32,45,156,70,182,141,223,125,74,74,74,14,121,234,222,132,43,191,186,40,85,187,193,67,134,69,146,151,247,237,219,215,178,106,155,13,133,171,59,38,47,247,59,101,224,172,228,240,124,160,78,199,177,249,221,123,124,158,188,110,215,246,237,77,83,22,232,186,135,220,17,233,221,112,120,248,77,135,255,247,248,67,103,151,151,239,111,157,88,30,125,214,57,175,230,119,235,181,39,229,49,125,56,154,115,10,0,0,234,30,61,208,72,139,104,204,109,229,103,254,141,104,101,165,25,57,118,236,27,137,229,198,141,114,42,187,230,118,219,155,170,237,202,21,159,29,242,100,190,86,173,91,31,54,59,69,94,207,222,91,206,58,255,194,103,19,203,167,15,29,189,166,186,247,222,188,169,36,63,121,185,83,215,220,157,137,175,59,118,234,82,178,238,243,213,146,164,141,27,214,13,249,100,202,7,239,37,122,161,103,124,242,81,238,222,61,187,58,37,218,230,230,230,109,158,63,123,122,167,133,243,102,95,156,88,215,186,77,155,141,55,220,252,255,205,172,238,189,253,136,198,220,163,158,18,16,0,0,212,29,2,52,210,194,202,109,97,124,252,66,35,220,168,145,189,237,142,187,62,169,169,77,69,69,185,243,206,27,147,79,152,244,194,179,19,147,215,15,30,58,124,65,213,182,231,156,119,241,134,115,206,187,120,67,77,199,91,181,124,89,155,151,254,253,244,152,162,13,235,134,36,214,181,109,211,126,221,200,209,103,30,232,225,30,61,110,220,226,57,51,62,185,92,146,98,177,88,163,135,254,240,219,187,222,123,235,149,143,203,247,237,107,182,246,243,213,35,19,237,66,161,80,229,121,23,77,88,241,135,223,253,252,90,107,109,40,177,254,75,151,125,229,229,38,77,154,250,27,203,82,13,43,183,197,145,91,1,0,128,250,70,128,70,90,132,172,154,90,255,83,64,31,98,214,39,83,187,206,155,55,189,143,36,149,68,138,114,215,173,93,51,120,223,222,189,237,146,219,228,119,235,177,224,170,137,223,88,82,155,227,61,241,240,3,35,162,209,202,240,254,125,251,115,214,174,94,49,96,83,137,55,238,57,217,149,19,191,246,66,184,81,163,3,195,50,206,24,115,110,241,91,3,38,77,89,185,108,233,56,201,187,89,112,249,210,197,231,84,221,111,196,152,51,39,205,159,61,61,239,176,105,235,190,122,116,211,214,165,18,178,74,61,180,4,0,0,4,138,0,141,180,112,141,114,142,49,63,235,179,229,139,242,62,122,247,173,235,171,219,222,169,75,215,229,63,184,243,238,103,147,3,111,77,62,253,248,131,75,18,55,252,85,21,10,133,43,46,248,210,101,255,188,240,210,203,215,86,221,246,195,159,254,122,242,67,255,123,111,197,210,197,243,46,56,124,191,80,229,208,225,103,188,118,227,205,119,124,242,163,91,110,248,65,242,182,99,153,182,46,21,215,40,39,157,199,3,0,0,233,65,128,70,122,88,19,62,138,135,16,250,210,162,121,139,237,235,215,21,182,233,222,171,207,238,99,62,86,203,22,155,191,216,90,214,166,162,162,220,169,250,68,193,118,29,59,150,223,253,251,7,39,45,95,182,104,202,135,239,189,121,202,230,226,226,174,33,167,81,52,183,91,126,241,185,23,93,190,172,119,159,222,187,254,246,232,131,195,183,109,219,114,96,54,144,130,33,195,142,109,218,186,84,172,225,255,39,0,0,25,136,15,104,164,133,49,166,206,103,116,89,251,249,234,145,143,62,248,251,83,27,135,195,127,24,62,230,172,146,99,57,214,142,237,219,187,205,152,246,223,110,219,254,103,107,251,123,254,248,232,243,169,218,196,167,209,59,108,156,246,150,178,178,156,169,31,189,59,33,177,156,152,182,174,172,116,115,147,183,95,127,249,228,245,133,107,243,247,239,221,219,188,83,151,46,155,134,156,62,106,245,25,103,158,29,73,245,200,240,35,169,143,115,10,0,0,252,171,227,62,195,186,23,137,68,172,36,229,229,229,101,253,247,146,205,102,47,94,127,147,155,198,127,79,159,175,89,213,106,217,226,5,93,86,46,93,212,107,254,220,57,23,84,86,150,55,79,108,107,223,161,211,234,191,252,253,185,63,86,237,57,174,206,222,189,123,194,139,230,205,234,180,122,213,138,46,115,102,78,31,81,82,180,161,32,121,251,85,215,221,240,151,171,174,189,97,105,109,107,251,253,111,126,118,97,226,70,67,73,58,239,194,75,159,238,221,239,164,226,127,60,246,240,45,201,211,217,37,156,120,210,201,83,127,126,239,3,47,52,107,214,60,90,219,247,144,36,71,178,195,78,237,241,55,63,251,32,189,184,190,0,0,82,161,135,11,105,17,181,182,86,97,182,182,250,156,112,226,206,241,87,124,117,213,143,127,121,239,187,63,254,249,175,239,111,218,188,217,214,196,182,173,91,74,251,126,248,206,155,189,106,123,172,102,205,154,71,71,142,57,187,248,107,55,222,50,255,207,143,255,243,177,130,33,67,223,74,222,254,233,199,31,140,173,237,177,22,47,156,223,126,238,204,79,199,39,150,91,183,105,179,113,208,144,225,133,127,127,248,79,119,164,10,207,146,180,106,229,103,99,239,249,229,143,191,156,106,91,77,210,125,78,1,0,64,122,16,160,145,22,142,99,42,234,234,216,67,134,141,42,61,125,228,216,119,146,215,125,182,120,126,159,163,57,150,227,56,246,187,223,191,243,157,156,156,38,59,18,235,138,139,54,22,108,41,43,171,213,13,123,255,124,242,145,241,201,211,214,141,255,242,53,47,61,243,212,163,95,137,70,163,77,18,235,58,117,238,178,162,96,200,208,183,194,225,240,190,196,186,149,203,150,142,123,239,173,215,106,29,250,189,90,235,238,156,2,0,128,163,199,24,104,164,133,149,202,141,106,63,237,218,31,239,251,213,185,197,145,162,3,143,222,254,198,55,111,125,237,148,33,67,182,86,215,190,111,223,126,145,169,31,28,204,208,219,119,108,63,240,148,190,5,115,103,117,124,238,31,79,92,146,88,238,214,189,199,186,239,253,228,151,83,170,59,86,135,142,29,203,219,119,236,184,174,184,104,227,129,161,28,145,162,194,150,169,158,92,152,236,157,215,39,247,94,247,249,234,17,7,223,167,215,188,220,220,30,219,147,167,199,27,53,122,220,75,223,191,243,87,31,58,142,99,87,45,95,246,223,95,223,245,195,59,203,247,239,109,35,73,211,255,59,101,240,249,23,123,143,12,175,13,43,213,88,15,0,0,8,6,1,26,105,97,99,218,107,28,213,250,209,211,123,118,239,106,158,28,70,63,47,92,57,189,166,0,109,140,177,213,45,55,111,222,162,50,249,88,123,247,236,110,37,169,218,0,157,40,57,121,33,100,195,53,222,228,23,173,172,52,147,95,124,238,138,228,117,215,223,248,157,87,86,44,95,214,37,121,221,101,87,95,55,43,113,195,224,137,253,7,108,239,115,66,223,185,159,45,93,116,174,36,149,150,22,119,63,66,77,135,22,24,83,202,39,51,2,0,128,96,49,132,3,105,17,118,156,93,126,218,183,237,208,97,91,242,242,242,197,11,107,28,146,177,114,249,146,30,201,203,109,218,182,251,34,241,117,207,62,39,236,12,135,195,251,19,203,165,155,74,78,46,218,88,216,92,213,216,82,86,150,83,186,169,228,164,228,117,189,251,157,180,163,186,246,146,244,204,83,143,15,217,186,165,180,111,98,185,224,180,97,111,14,25,54,170,116,247,174,157,205,146,219,117,233,154,187,47,121,185,121,203,86,7,206,203,222,61,187,14,121,40,204,145,248,61,167,0,0,160,126,16,160,145,22,81,55,182,211,79,251,225,35,198,174,74,94,94,180,96,254,185,179,62,153,218,53,85,219,85,203,151,181,153,59,107,250,249,201,235,78,62,117,208,129,7,160,52,110,156,227,246,234,123,226,172,228,237,79,252,229,143,23,187,174,155,114,230,132,39,31,254,227,57,209,104,244,192,112,147,252,110,61,22,212,52,67,198,150,178,178,156,41,239,189,125,89,98,57,39,167,201,142,111,223,246,195,247,37,169,69,203,86,135,244,18,175,255,124,109,203,228,229,237,219,183,182,77,124,221,164,73,243,26,67,122,85,126,207,41,0,0,168,31,4,104,164,133,177,246,139,35,183,58,232,244,145,163,55,119,239,217,107,78,98,185,178,178,188,249,67,15,252,238,142,127,63,245,120,65,69,69,249,129,127,151,239,188,57,185,247,125,191,186,243,123,201,143,244,110,219,166,253,186,243,47,154,112,200,88,226,179,47,184,120,122,242,242,103,75,22,157,251,179,31,221,114,205,170,229,203,14,12,43,41,41,222,216,236,158,95,252,248,146,185,179,167,77,72,110,59,236,140,177,135,236,91,213,211,143,255,249,204,189,123,118,117,74,44,143,29,119,222,43,157,187,116,221,39,73,39,246,31,176,41,185,237,63,255,254,151,3,193,253,253,183,95,239,185,102,197,242,49,137,109,157,186,230,174,171,233,125,170,242,123,78,1,0,64,253,96,12,52,210,34,182,167,124,107,184,85,173,239,33,148,36,221,248,221,239,79,186,255,55,119,246,222,183,103,111,123,73,42,47,223,223,250,229,23,159,187,229,229,23,159,171,118,159,80,40,84,249,173,91,190,247,143,170,15,38,57,239,130,241,235,102,79,251,244,141,5,115,102,30,184,153,112,245,242,207,206,188,235,7,223,61,179,166,26,122,246,234,51,235,234,235,111,92,82,221,246,85,203,151,181,153,61,115,250,165,137,229,182,237,218,21,126,253,59,183,29,232,237,30,58,108,84,105,151,174,121,75,55,149,68,78,145,164,213,43,87,140,189,229,27,95,237,220,162,69,139,237,69,27,215,23,36,207,216,49,106,236,89,11,106,170,165,170,216,158,242,106,199,132,3,0,128,224,208,3,141,180,24,61,186,223,46,35,199,215,35,182,7,156,58,120,219,183,111,253,209,163,205,154,183,172,213,35,176,27,53,202,217,115,245,215,110,124,184,186,167,16,254,244,23,247,188,113,74,193,224,247,106,251,254,61,251,244,157,249,211,187,239,255,87,77,79,9,124,234,111,127,185,40,22,139,54,78,44,95,114,197,87,39,55,105,210,52,150,220,230,155,55,223,254,66,242,24,236,45,101,155,79,90,87,248,249,240,228,169,237,250,159,114,234,135,23,126,233,242,181,170,37,35,103,247,232,209,253,24,3,13,0,64,6,34,64,35,125,108,108,211,145,27,29,106,204,184,115,139,238,125,240,209,251,251,158,212,111,106,117,109,66,161,112,197,137,39,157,60,245,39,191,252,221,125,151,95,117,221,138,234,218,133,27,53,178,119,223,255,231,151,47,251,242,53,127,109,209,178,197,230,234,218,181,109,211,126,221,121,23,94,250,244,253,15,254,245,31,29,59,117,222,95,93,187,15,223,127,171,251,234,229,159,157,149,88,238,222,179,215,156,9,87,94,179,178,106,187,33,195,70,149,254,240,174,223,220,155,223,173,199,97,61,204,77,154,52,251,98,204,153,231,62,255,139,123,30,248,79,117,239,147,210,81,156,75,0,0,80,63,178,254,241,180,60,106,55,115,76,95,92,216,207,145,83,235,167,250,85,181,106,249,178,54,31,127,248,78,191,138,202,242,70,142,113,108,171,150,173,247,180,107,215,97,215,224,211,71,20,119,205,239,230,107,74,183,138,138,114,231,157,55,38,159,176,97,253,218,206,146,148,147,211,180,162,93,155,246,187,186,116,203,221,62,242,140,179,75,106,234,117,78,120,241,185,167,78,41,45,45,57,112,19,224,216,113,23,126,118,234,160,234,167,218,147,164,101,139,23,180,91,182,100,97,238,174,157,59,154,117,235,209,187,108,244,89,231,108,244,251,8,111,73,114,229,78,29,117,106,175,106,127,88,64,253,224,250,2,0,72,37,235,63,20,248,128,203,28,139,22,109,106,190,207,148,95,27,116,29,13,65,83,155,243,92,65,65,151,61,65,215,113,188,227,250,2,0,72,133,33,28,72,155,130,130,46,123,172,85,202,241,201,168,61,107,85,66,120,6,0,32,115,17,160,145,86,33,171,90,223,40,135,212,56,135,0,0,100,54,2,52,210,170,109,243,138,53,65,215,144,237,56,135,0,0,100,54,2,52,210,170,111,223,190,229,54,230,174,58,114,75,164,98,99,238,170,190,125,251,150,7,93,7,0,0,168,30,1,26,105,103,194,118,121,208,53,100,43,206,29,0,0,153,143,0,141,180,27,49,176,247,102,39,228,108,8,186,142,108,227,132,156,13,35,6,246,174,118,254,106,0,0,144,25,8,208,168,19,209,74,85,251,120,108,164,198,57,3,0,32,59,16,160,81,39,70,13,234,22,145,81,97,208,117,100,13,163,194,81,131,186,69,130,46,3,0,0,28,25,1,26,117,198,132,67,243,131,174,33,91,112,174,0,0,200,30,4,104,212,153,225,253,243,183,186,174,179,48,232,58,50,157,235,58,11,135,247,207,175,241,17,225,0,0,32,115,16,160,81,167,70,13,234,54,91,161,208,182,160,235,200,88,161,208,182,81,131,186,205,14,186,12,0,0,80,123,4,104,212,57,183,210,206,8,186,134,76,197,185,1,0,32,251,16,160,81,231,70,13,234,22,177,214,206,13,186,142,76,99,173,157,203,141,131,0,0,100,31,2,52,234,197,200,130,158,243,153,149,35,137,81,225,200,130,158,220,56,8,0,64,22,34,64,163,222,132,203,203,62,150,181,220,44,103,237,214,112,121,217,199,65,151,1,0,0,142,14,1,26,245,102,232,208,161,149,57,174,253,80,70,123,131,174,37,48,70,123,115,92,251,225,208,161,67,43,131,46,5,0,0,28,29,2,52,234,213,224,193,189,182,75,177,247,29,153,138,160,107,169,111,222,247,28,123,223,59,7,0,0,32,91,17,160,81,239,70,12,236,189,121,127,133,251,174,61,142,66,180,149,169,216,95,225,190,59,98,96,239,205,65,215,2,0,0,142,13,1,26,129,24,59,180,103,137,107,43,222,178,178,123,130,174,165,174,89,217,61,174,173,120,107,236,208,158,37,65,215,2,0,0,142,29,1,26,129,57,163,224,132,82,211,180,229,235,174,107,203,130,174,165,174,184,174,45,51,77,91,190,126,70,193,9,165,65,215,2,0,0,210,35,28,116,1,56,190,141,232,219,126,167,181,246,213,217,139,215,159,101,141,57,33,232,122,210,201,88,187,102,100,65,143,143,141,49,110,208,181,0,0,128,244,161,7,26,129,51,198,184,195,11,122,126,100,162,177,89,65,215,146,46,38,26,155,53,188,160,231,71,132,103,0,0,26,30,2,52,50,198,240,33,189,23,201,196,94,117,99,110,214,14,119,112,99,110,169,76,236,213,225,67,122,47,10,186,22,0,0,80,55,24,194,129,140,18,159,165,226,149,217,203,10,7,197,98,206,233,70,50,65,215,84,27,86,178,161,144,59,103,196,169,189,22,6,93,11,0,0,168,91,244,64,35,35,13,27,208,107,97,171,80,211,127,59,50,43,130,174,229,72,28,153,21,173,66,77,255,61,108,0,225,25,0,128,227,1,61,208,200,88,3,6,116,218,45,105,234,172,229,69,203,220,104,229,64,99,157,19,131,174,41,153,53,238,42,39,220,104,201,176,254,249,60,158,28,0,128,227,8,1,26,25,111,184,23,80,63,158,57,115,245,124,183,101,147,126,142,235,158,40,171,102,129,20,99,180,215,117,156,85,206,174,253,43,70,142,232,187,51,144,26,0,0,64,160,8,208,200,26,35,188,192,58,91,210,236,25,203,75,122,186,21,229,189,67,198,246,144,156,70,117,251,206,110,101,204,154,245,78,227,156,181,35,251,119,93,87,183,239,5,0,0,50,29,1,26,89,41,30,100,215,73,210,244,133,27,243,194,97,155,27,139,217,46,86,182,147,99,76,232,88,142,237,90,27,51,50,165,161,144,217,20,141,154,226,81,131,122,68,210,82,52,0,0,104,16,8,208,200,122,163,6,117,139,72,58,16,114,23,47,94,223,182,92,106,107,67,110,43,183,210,105,161,144,154,90,87,77,28,199,9,91,215,13,73,146,113,156,152,235,186,81,227,104,191,98,218,231,52,114,119,155,152,179,51,71,250,226,212,130,158,95,4,246,205,0,0,128,140,71,128,70,131,115,234,169,61,190,144,68,8,6,0,0,117,130,105,236,0,0,0,0,31,8,208,0,0,0,128,15,4,104,0,0,0,192,7,2,52,0,0,0,224,3,1,26,0,0,0,240,129,0,13,0,0,0,248,64,128,6,0,0,0,124,32,64,3,0,0,0,62,16,160,1,0,0,0,31,8,208,0,0,0,128,15,4,104,0,0,0,192,7,2,52,0,0,0,224,3,1,26,0,0,0,240,129,0,13,0,0,0,248,64,128,6,0,0,0,124,32,64,3,0,0,0,62,16,160,1,0,0,0,31,8,208,0,0,0,128,15,4,104,0,0,0,192,7,2,52,0,0,0,224,3,1,26,0,0,0,240,129,0,13,0,0,0,248,64,128,6,0,0,0,124,32,64,3,0,0,0,62,16,160,1,0,0,0,31,8,208,0,0,0,128,15,4,104,0,0,0,192,7,2,52,0,0,0,224,3,1,26,0,0,0,240,129,0,13,0,0,0,248,64,128,6,0,0,0,124,32,64,3,0,0,0,62,16,160,1,0,0,0,31,8,208,0,0,0,128,15,4,104,0,0,0,192,7,2,52,0,0,0,224,3,1,26,0,0,0,240,129,0,13,0,0,0,248,64,128,6,0,0,0,124,32,64,3,0,0,0,62,16,160,1,0,0,0,31,8,208,0,0,0,128,15,4,104,0,0,0,192,7,2,52,0,0,0,224,67,56,232,2,0,4,170,173,164,47,39,45,23,75,122,51,69,187,115,36,245,78,90,126,67,82,201,81,30,11,0,0,4,41,18,137,216,72,36,98,131,174,3,200,82,39,72,178,73,127,254,85,77,187,63,87,105,119,218,49,28,43,107,112,125,1,0,164,194,16,142,224,133,116,48,112,252,228,8,109,59,39,181,237,80,199,117,101,130,127,233,208,64,150,248,83,33,105,141,164,231,37,93,47,169,105,80,5,2,0,128,227,15,1,58,179,252,78,210,169,65,23,145,129,10,37,205,76,250,179,80,82,51,73,95,149,244,79,73,239,73,234,18,88,117,0,0,0,217,164,1,252,138,53,185,7,218,74,154,34,41,167,154,182,199,107,15,244,77,41,182,25,73,131,36,205,136,183,121,45,190,14,181,115,190,82,247,238,39,255,25,38,105,234,17,218,188,232,227,88,89,167,1,92,95,0,0,117,128,30,232,204,115,150,164,155,131,46,34,11,88,121,61,209,223,148,84,41,233,82,73,67,143,176,143,145,247,3,11,0,0,192,81,35,64,103,150,95,196,95,239,149,212,239,40,246,239,36,233,127,36,125,34,105,155,164,141,146,94,144,116,137,14,239,157,77,244,102,23,75,106,47,111,252,245,167,241,253,86,74,250,139,164,190,241,182,189,37,253,94,210,98,73,219,37,205,137,191,79,171,52,212,113,172,150,75,154,22,255,58,249,156,125,40,239,251,27,35,233,123,146,230,75,42,151,52,36,169,141,35,233,114,121,189,168,235,229,157,139,183,229,245,120,167,26,87,125,81,252,152,143,74,58,73,210,255,74,90,162,131,231,228,103,242,102,162,144,164,209,146,158,146,180,90,210,22,121,195,76,174,83,245,255,231,90,72,186,85,210,7,146,74,37,173,149,244,156,164,139,229,239,156,157,45,239,124,223,127,132,118,123,117,112,56,76,178,173,58,56,84,166,92,210,186,248,215,155,171,180,91,18,95,95,236,227,88,0,0,32,19,52,128,95,177,38,15,225,24,36,47,184,90,73,239,234,240,105,6,107,26,194,113,178,188,208,101,229,221,96,247,178,188,0,155,104,255,187,26,142,181,68,210,2,73,247,73,122,64,94,128,182,242,130,220,215,228,5,196,25,241,237,15,201,11,77,86,94,216,108,116,140,117,212,164,166,33,28,201,222,141,183,251,90,210,186,68,128,94,24,127,93,47,47,228,14,138,111,207,145,244,100,82,93,83,226,223,207,158,164,229,142,85,222,39,17,160,87,74,218,25,111,255,91,73,127,141,47,91,73,31,73,250,113,252,235,87,228,125,191,79,203,187,241,209,234,224,15,73,201,114,229,133,76,43,239,7,142,55,117,232,57,123,72,181,159,114,242,110,29,252,193,168,54,152,133,163,6,13,224,250,2,0,192,225,26,192,7,92,213,0,221,94,7,3,104,213,161,28,213,5,232,176,164,217,241,245,63,213,161,99,168,71,75,218,23,223,150,124,131,98,242,177,30,210,161,65,184,165,14,29,251,250,103,73,141,147,182,119,148,180,44,190,237,188,99,172,163,38,181,9,208,121,58,24,94,71,39,173,79,4,232,98,121,115,24,87,237,197,189,51,190,125,186,164,62,73,235,59,200,155,221,195,202,235,53,79,222,47,17,160,171,134,117,201,235,145,222,86,195,246,97,241,245,251,228,245,208,39,132,229,5,102,43,233,9,73,173,147,182,157,44,175,215,223,74,186,93,181,147,43,239,183,9,99,107,217,158,0,93,131,6,112,125,1,0,224,112,13,224,3,174,106,128,150,188,241,188,86,94,48,60,33,169,109,117,1,186,157,164,223,72,250,181,14,13,186,9,127,139,239,243,141,106,142,213,41,197,62,87,235,224,148,113,237,82,108,255,133,14,6,229,99,169,163,38,71,10,208,125,36,189,30,111,51,187,202,123,38,2,244,215,83,236,215,69,7,195,124,65,138,237,237,229,13,187,72,12,1,73,72,4,232,79,148,122,88,69,226,183,7,239,85,83,239,127,227,219,207,74,90,119,97,124,221,90,121,51,139,84,117,102,124,251,22,29,28,30,146,78,4,232,26,52,128,235,11,0,160,14,240,36,194,204,244,186,164,191,75,186,81,210,31,229,141,211,141,213,208,126,155,164,95,214,176,61,241,196,184,234,198,44,239,173,97,159,185,241,227,87,181,37,254,154,28,174,143,181,142,234,252,80,94,160,79,48,242,122,90,79,138,47,175,148,215,227,91,145,98,223,245,41,214,157,37,169,137,188,243,188,40,197,246,173,146,30,147,244,115,73,23,200,11,204,201,182,203,11,136,85,109,140,191,206,72,177,77,58,56,172,162,77,210,186,139,227,175,15,43,245,223,195,212,248,241,70,74,58,67,222,19,0,1,0,64,128,8,208,153,235,103,242,122,39,47,149,23,14,159,170,197,62,61,37,93,35,111,200,194,201,146,186,86,217,238,231,102,180,68,96,143,86,179,61,17,32,83,253,27,74,103,29,146,23,148,79,74,90,174,148,23,198,95,145,55,254,249,5,73,95,248,56,222,137,241,215,185,53,180,89,28,127,29,232,227,184,177,42,175,85,37,206,89,242,76,32,137,223,58,44,173,97,159,89,242,2,116,223,106,218,0,0,128,122,68,128,206,92,155,37,125,95,210,75,242,110,236,251,72,210,254,26,218,95,34,47,72,54,147,244,150,164,127,232,224,152,220,11,116,232,88,229,186,84,23,117,124,91,222,240,143,116,105,17,127,45,173,161,77,89,252,53,213,240,149,116,74,12,203,216,90,67,155,163,237,185,7,0,0,117,128,0,157,217,94,150,55,142,116,162,188,41,211,190,87,77,187,78,242,158,200,39,121,55,143,85,29,114,208,90,245,19,160,51,165,142,35,217,29,127,173,58,203,70,178,246,241,87,63,61,219,71,35,113,252,154,130,122,231,248,235,174,58,174,5,0,0,212,2,243,64,103,182,196,77,122,101,146,190,44,111,30,225,84,134,203,235,201,124,71,135,135,214,250,148,41,117,28,201,170,248,107,170,27,225,18,6,196,95,23,215,208,38,29,18,115,39,15,168,102,187,209,193,7,196,172,170,166,205,177,168,58,150,59,213,252,215,169,218,165,186,73,180,182,199,2,0,32,171,17,160,51,95,145,188,155,232,164,234,231,80,110,86,229,53,89,35,121,193,182,62,100,74,29,71,242,95,121,195,97,38,40,245,148,122,173,37,221,18,255,250,221,58,174,229,237,248,235,109,74,29,56,71,200,235,205,255,66,7,31,24,147,78,187,171,44,159,35,105,188,188,7,206,36,143,93,223,89,165,221,141,242,130,253,233,71,113,44,0,0,178,26,1,58,59,60,39,105,178,14,127,104,73,194,146,248,235,133,242,110,56,76,12,205,57,65,222,24,228,243,227,203,205,235,170,192,12,171,227,72,74,36,221,19,255,250,81,29,58,85,96,7,73,143,200,27,54,241,162,188,167,51,214,165,247,229,245,216,247,145,244,39,29,58,67,71,255,120,45,146,244,43,213,110,56,73,23,73,63,144,23,188,107,163,84,222,211,28,19,90,74,122,85,210,60,73,163,146,214,87,237,137,191,81,222,131,105,158,57,138,99,1,0,144,213,8,208,217,193,149,215,11,189,163,154,237,159,233,96,32,124,90,222,77,123,69,242,30,35,125,145,164,215,226,219,242,235,176,198,76,170,163,54,254,87,94,168,63,67,94,125,83,229,205,223,188,94,210,181,241,229,219,148,122,186,186,116,138,202,155,231,122,142,188,155,37,215,201,235,245,158,46,239,124,14,150,55,197,221,99,181,60,222,173,242,110,58,173,237,28,204,86,222,188,221,71,242,182,188,217,64,210,113,44,0,0,178,26,55,17,102,143,66,121,143,136,126,162,154,237,191,144,55,21,218,13,242,126,173,190,71,222,28,210,15,203,235,149,220,163,250,249,129,41,83,234,56,146,253,146,190,37,111,46,232,171,229,13,47,201,145,215,227,252,178,164,103,149,122,94,230,186,80,36,111,184,195,215,228,205,249,61,88,222,121,122,94,222,111,31,18,79,42,172,141,79,37,69,228,205,132,82,91,47,196,107,248,174,188,97,25,237,228,61,105,50,146,212,102,143,188,89,84,190,45,111,238,234,129,242,102,14,169,250,208,152,218,28,11,0,0,4,137,39,133,1,168,43,92,95,0,0,169,100,66,79,32,0,0,0,144,53,8,208,0,0,0,128,15,4,104,0,0,0,192,7,2,52,0,0,0,224,3,1,26,0,0,0,240,129,0,13,0,0,0,248,64,128,6,0,0,0,124,32,64,3,0,0,0,62,16,160,1,0,0,0,31,8,208,0,0,0,128,15,4,104,0,0,0,192,7,2,52,0,0,0,224,3,1,26,0,0,0,240,129,0,13,0,0,0,248,64,128,6,0,0,0,124,32,64,3,0,0,0,62,16,160,1,0,0,0,31,8,208,0,0,0,128,15,4,104,0,0,0,192,7,2,52,0,0,0,224,3,1,26,0,0,0,240,129,0,13,0,0,0,248,64,128,6,0,0,0,124,32,64,3,0,0,0,62,16,160,1,0,0,0,31,8,208,0,0,0,128,15,4,104,0,0,0,192,7,2,52,0,0,0,224,3,1,26,0,0,0,240,129,0,13,0,0,0,248,64,128,6,0,0,0,124,32,64,3,0,0,0,62,16,160,1,0,0,0,31,8,208,0,0,0,128,15,4,104,0,0,0,192,7,2,52,0,0,0,224,3,1,26,0,0,0,240,129,0,13,0,0,0,248,64,128,6,0,0,0,124,32,64,3,0,0,0,62,52,132,0,109,37,201,90,107,130,46,4,64,195,145,116,77,177,129,22,2,0,200,56,13,33,64,147,133,70,61,0,0,6,133,73,68,65,84,151,75,210,186,117,235,114,130,46,4,64,195,145,116,77,41,15,180,16,0,64,198,105,8,1,122,151,36,89,107,91,7,93,8,128,134,35,233,154,178,43,208,66,0,0,25,39,235,3,180,49,166,76,146,194,225,112,199,160,107,1,208,112,36,174,41,137,107,12,0,0,9,89,31,160,173,181,17,73,10,135,195,249,65,215,2,160,225,72,92,83,18,215,24,0,0,18,26,66,128,46,140,191,158,16,116,45,0,26,142,196,53,37,113,141,1,0,32,33,235,3,180,227,56,203,37,201,90,59,32,232,90,0,52,28,137,107,74,226,26,3,0,64,66,214,7,104,215,117,23,199,191,28,28,104,33,0,26,154,193,210,33,215,24,0,0,36,53,128,0,221,184,113,227,217,146,100,140,25,94,88,88,216,36,232,122,0,100,191,194,194,194,38,198,152,225,210,193,107,12,0,0,9,89,31,160,59,117,234,180,219,90,59,75,146,114,114,114,206,10,186,30,0,217,47,113,45,177,214,206,234,212,169,211,238,160,235,1,0,100,150,172,15,208,146,228,56,206,7,241,47,47,8,180,16,0,13,197,5,210,33,215,22,0,0,14,104,16,1,218,90,251,182,36,185,174,59,62,232,90,0,100,191,196,181,36,113,109,1,0,160,65,42,46,46,94,19,137,68,108,73,73,201,184,160,107,1,144,189,74,74,74,198,69,34,17,91,92,92,188,38,232,90,0,0,153,169,65,244,64,199,61,47,73,174,235,94,31,116,33,0,178,87,210,53,228,249,64,11,1,0,100,172,6,19,160,173,181,207,196,191,188,97,237,218,181,157,3,45,6,64,86,138,95,59,110,144,14,185,166,0,0,112,136,6,19,160,243,242,242,86,90,107,39,73,82,78,78,206,45,65,215,3,32,251,36,174,29,214,218,73,121,121,121,43,131,174,7,0,144,153,26,76,128,142,123,36,254,122,199,182,109,219,90,7,90,9,128,172,18,191,102,220,17,95,124,164,166,182,0,128,227,91,131,10,208,249,249,249,31,89,107,223,148,212,178,188,188,252,206,160,235,1,144,61,226,215,140,150,214,218,55,243,243,243,63,10,186,30,0,64,230,106,80,1,90,146,140,49,247,73,146,235,186,63,221,176,97,195,41,65,215,3,32,243,109,216,176,225,20,215,117,127,42,29,188,134,0,0,80,157,6,23,160,243,242,242,166,89,107,159,144,36,199,113,248,32,4,112,68,137,107,133,181,246,137,188,188,188,105,65,215,3,0,200,108,13,46,64,199,221,37,169,204,24,115,73,36,18,185,45,232,98,0,100,174,72,36,114,155,49,230,18,73,101,242,174,29,0,0,212,200,4,93,64,93,41,46,46,190,46,49,13,149,49,102,104,110,110,238,188,160,107,2,144,89,138,139,139,79,179,214,206,149,36,99,204,245,185,185,185,207,6,93,19,0,32,243,53,212,30,104,229,230,230,62,155,24,202,97,173,125,178,176,176,176,73,208,53,1,200,28,133,133,133,77,172,181,79,74,222,208,13,194,51,0,0,113,69,69,69,51,35,145,136,45,42,42,250,79,208,181,0,200,28,69,69,69,255,137,95,27,102,6,93,11,0,32,187,52,216,30,232,4,99,204,215,229,141,135,190,178,168,168,232,177,160,235,1,16,188,162,162,162,199,140,49,87,202,187,54,124,61,232,122,0,0,200,56,69,69,69,103,71,34,17,55,18,137,216,226,226,226,7,131,174,7,64,112,138,139,139,31,140,68,34,54,18,137,184,69,69,69,103,7,93,15,0,0,25,43,18,137,76,136,127,104,90,122,162,129,227,83,81,81,209,99,137,235,64,36,18,153,16,116,61,0,128,236,212,96,103,225,72,37,254,129,57,89,146,177,214,190,92,89,89,121,93,175,94,189,246,7,93,23,128,186,85,88,88,216,164,81,163,70,207,198,135,109,88,73,151,231,229,229,189,26,116,93,0,128,236,116,92,5,104,201,27,206,97,140,121,94,82,71,73,11,141,49,223,98,138,59,160,225,138,79,85,247,164,164,65,146,202,172,181,87,243,168,110,0,192,177,104,240,55,17,86,21,255,224,28,99,173,157,37,105,144,181,118,46,15,91,1,26,166,72,36,114,91,124,158,231,65,241,255,243,99,8,207,0,128,99,117,220,245,64,39,43,42,42,122,220,24,243,109,73,178,214,190,225,186,238,157,221,187,119,95,26,116,93,0,142,205,134,13,27,78,113,28,231,190,248,19,6,101,173,125,34,63,63,255,59,65,215,5,0,104,24,142,235,0,45,29,120,98,225,31,229,13,233,144,227,56,191,207,201,201,185,175,93,187,118,59,2,46,13,128,79,219,182,109,107,93,94,94,126,167,235,186,63,141,175,42,51,198,252,128,135,164,0,0,210,233,184,15,208,146,84,84,84,212,94,210,189,137,222,104,73,187,36,61,88,94,94,254,104,239,222,189,55,7,88,26,128,90,88,187,118,109,231,156,156,156,91,36,221,33,169,165,228,245,58,75,186,43,63,63,127,107,160,197,1,0,26,28,2,116,146,72,36,114,134,181,246,78,99,204,151,146,86,63,229,56,206,51,93,187,118,157,18,88,97,0,82,42,41,41,25,231,186,238,245,146,110,72,172,179,214,190,105,140,185,47,47,47,111,90,128,165,1,0,26,48,2,116,10,241,135,43,220,106,140,185,34,177,206,90,187,214,113,156,215,36,189,91,94,94,254,49,211,223,1,245,175,176,176,176,73,78,78,206,89,146,46,112,93,119,188,49,166,119,98,155,181,118,146,164,71,184,73,16,0,80,215,8,208,53,136,68,34,39,25,99,174,151,116,181,181,182,79,242,182,248,29,253,11,140,49,203,140,49,107,162,209,104,81,52,26,45,51,198,236,232,217,179,103,185,49,198,6,83,53,144,189,172,181,102,221,186,117,57,214,218,214,225,112,184,99,56,28,206,183,214,158,96,173,29,32,105,176,49,102,120,114,123,99,204,231,146,158,183,214,62,147,151,151,183,50,152,170,1,0,199,27,2,116,45,69,34,145,51,140,49,23,185,174,123,110,213,15,113,0,245,199,90,59,203,113,156,15,172,181,111,51,76,3,0,16,4,2,244,81,40,45,45,109,81,81,81,49,204,113,156,83,93,215,237,111,140,233,101,140,201,179,214,118,148,119,3,83,142,56,183,192,209,176,146,202,37,237,50,198,148,89,107,35,214,218,66,199,113,150,187,174,187,184,113,227,198,179,59,117,234,180,59,232,34,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,183,255,7,13,38,228,225,223,55,242,101,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":31106,"duration_micros":1325,"top":0.0,"left":0.0,"width":720.0,"height":184.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,148,157,103,125,31,240,223,157,125,145,70,35,141,52,90,71,210,140,246,197,178,44,25,175,64,88,156,146,4,8,16,155,4,240,9,5,18,76,201,105,146,146,208,36,52,77,78,78,210,132,54,37,80,74,139,131,89,74,32,181,73,176,33,77,194,161,80,176,141,33,216,194,178,54,107,179,182,209,106,173,179,106,164,217,239,237,31,178,197,220,101,150,87,150,52,26,233,243,57,199,127,220,247,222,247,62,207,220,251,106,252,157,231,125,158,223,147,58,125,182,51,19,0,0,192,152,20,141,119,7,0,0,96,34,17,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,184,174,3,244,23,31,122,40,190,244,249,207,143,119,55,0,0,184,142,148,140,119,7,174,148,47,62,244,80,252,193,239,126,244,226,227,15,124,240,131,227,216,27,0,0,174,23,169,211,103,59,51,227,221,137,203,45,55,60,71,68,124,230,175,31,140,119,221,127,255,56,245,8,24,201,11,109,103,226,111,118,109,139,238,129,254,248,133,133,75,226,103,231,55,221,80,237,223,168,118,181,158,142,175,236,222,22,61,3,3,241,214,198,101,241,134,134,133,227,221,37,128,49,185,238,70,160,11,133,231,165,203,150,197,93,175,126,245,56,245,8,174,190,189,237,45,241,213,221,207,71,123,111,79,220,62,107,110,220,191,236,166,49,159,59,152,201,196,99,251,118,198,211,199,143,198,236,234,201,241,27,107,110,141,73,165,101,87,176,183,17,255,107,215,214,104,237,233,142,136,136,71,247,239,138,117,245,179,163,174,162,242,138,182,121,45,181,63,86,109,61,221,241,208,142,205,209,220,217,22,233,204,200,99,31,37,69,69,49,169,180,44,230,84,79,138,85,211,234,227,174,217,13,81,93,90,58,106,27,207,183,156,138,135,95,120,62,58,250,122,99,74,89,121,188,107,233,234,184,121,250,204,203,245,35,100,249,242,238,109,209,246,210,231,254,247,251,118,196,205,51,102,94,147,159,59,64,174,235,106,14,116,161,240,188,120,201,146,120,248,209,175,199,252,5,11,198,169,87,112,245,125,105,231,150,56,113,190,43,122,6,7,226,7,199,14,197,182,150,147,99,58,111,48,147,137,207,111,223,20,223,59,210,28,231,6,250,99,95,71,107,124,235,224,222,43,218,215,222,244,224,197,240,26,17,145,201,100,226,228,249,115,87,180,205,107,169,253,36,190,121,96,119,236,239,104,29,53,60,71,68,12,164,211,209,222,219,19,59,91,207,196,215,247,237,140,143,253,248,251,241,248,209,131,49,218,153,143,31,57,16,45,61,221,49,144,78,71,75,79,119,60,113,180,249,242,116,62,71,111,122,240,98,120,142,136,72,95,195,159,59,64,174,235,38,64,23,10,207,139,22,47,142,135,31,253,122,44,88,232,182,32,55,142,222,244,96,180,12,9,38,17,17,47,158,235,26,245,188,116,38,19,159,223,177,41,54,157,62,158,117,252,108,95,239,101,237,95,174,76,161,48,56,134,128,120,189,180,159,196,241,243,163,127,143,195,233,25,28,136,175,237,217,30,159,217,186,33,6,210,233,97,95,215,59,152,253,92,255,8,175,125,37,38,210,231,14,144,235,186,8,208,133,194,115,99,83,83,60,242,216,163,209,216,100,46,35,55,150,66,193,164,96,88,25,34,157,201,196,23,118,108,142,77,167,178,195,115,69,113,73,252,252,130,197,151,181,127,92,186,244,101,200,151,219,91,78,199,231,182,63,55,236,53,209,56,165,54,235,241,162,154,169,175,188,81,128,235,204,132,159,3,93,40,60,47,108,108,140,175,125,227,49,225,25,198,32,147,201,196,23,119,110,137,141,167,94,204,58,94,89,92,18,191,181,246,246,152,59,169,102,156,122,198,104,230,84,79,142,95,93,158,63,191,61,19,17,157,189,189,113,176,179,61,126,124,226,104,116,230,220,69,216,122,230,100,124,239,72,115,193,197,146,247,45,90,17,107,234,102,70,71,95,111,76,45,47,143,197,181,117,87,170,251,0,19,214,132,14,208,195,133,231,71,30,123,52,154,22,45,26,167,94,193,196,113,33,60,111,142,103,79,102,135,231,170,146,210,248,237,181,183,71,99,77,237,48,103,114,45,152,90,81,17,139,166,76,27,246,249,117,245,179,227,231,27,151,196,223,236,220,154,55,53,231,31,155,95,136,87,205,156,19,181,229,21,89,199,83,169,84,44,155,42,52,3,140,100,194,6,232,66,225,121,254,130,5,241,200,99,143,198,226,37,75,198,169,87,48,113,100,50,153,248,210,174,45,241,147,156,240,92,93,82,26,255,110,237,29,177,160,102,202,216,222,39,34,14,116,182,197,225,206,142,56,215,223,23,85,37,101,49,163,170,42,86,76,173,139,146,162,226,43,208,243,236,182,15,119,118,196,225,174,142,232,236,235,141,84,68,212,148,149,199,252,201,181,209,48,185,38,82,87,180,245,136,147,231,207,197,254,142,214,104,235,237,137,226,162,84,212,149,87,198,178,169,211,163,166,172,252,226,107,186,250,251,226,153,227,199,162,170,172,36,110,159,57,47,138,83,87,186,87,217,42,139,75,226,129,213,235,226,211,91,54,196,174,182,51,23,143,247,14,14,198,19,71,15,198,59,22,45,127,69,239,63,144,78,199,11,109,45,113,170,251,92,116,245,247,69,117,73,89,204,174,158,20,75,106,167,69,73,209,248,206,18,188,26,215,71,87,127,95,236,108,61,19,103,186,207,69,42,21,81,91,86,25,75,166,78,139,233,21,85,151,225,221,129,107,213,132,12,208,133,194,115,195,252,249,194,51,140,81,38,34,190,188,123,107,108,56,113,44,235,248,164,210,178,248,200,218,219,163,97,242,232,225,121,48,157,142,239,29,109,142,239,31,105,142,246,222,158,188,231,203,139,139,227,206,89,13,241,139,77,75,47,123,25,188,129,244,96,124,231,240,254,248,193,177,195,5,219,142,136,152,86,81,25,175,155,183,32,238,153,215,116,217,131,220,222,246,214,248,198,254,93,177,191,163,45,239,185,84,42,21,107,234,234,227,29,139,150,199,244,138,234,248,243,103,127,120,113,81,231,246,150,211,241,192,170,117,151,181,47,99,81,148,74,197,175,174,88,19,127,252,204,147,89,11,8,159,62,113,52,222,214,180,44,138,134,132,250,115,3,253,241,133,237,207,197,222,142,214,88,50,101,90,252,250,234,245,81,93,146,95,254,238,252,64,127,124,235,224,222,120,234,232,161,232,77,15,230,61,95,94,84,28,183,207,154,23,111,105,92,146,55,202,125,41,206,245,247,199,87,119,111,139,29,173,167,98,229,212,25,241,107,171,214,69,89,113,225,239,245,114,95,31,143,236,217,30,79,31,63,26,211,42,42,227,215,86,174,141,134,201,83,162,119,112,48,190,125,104,95,124,239,200,254,232,203,89,120,153,138,136,91,234,103,199,251,87,172,141,242,226,43,251,71,36,48,62,38,92,128,30,41,60,47,93,182,108,156,122,5,19,71,38,34,190,188,115,75,60,125,226,104,214,241,201,101,229,241,59,99,156,243,124,170,251,92,124,118,219,198,120,241,220,217,97,95,211,59,56,24,79,30,59,24,27,79,189,24,31,90,189,46,150,77,157,254,74,187,30,17,17,199,207,117,197,67,219,159,139,99,35,180,29,17,209,218,211,29,223,216,183,59,158,59,117,60,30,88,181,62,102,84,94,158,17,193,199,143,30,140,175,239,221,17,131,195,44,194,203,100,50,177,245,204,201,216,209,122,58,214,215,207,206,170,136,178,229,244,201,200,68,92,241,145,241,66,166,87,84,197,186,25,179,178,238,56,180,247,246,196,193,179,237,209,52,100,161,224,119,15,237,143,29,173,23,70,170,119,180,158,137,239,30,218,159,55,74,125,166,231,124,124,114,211,51,113,166,231,252,176,237,245,166,7,227,169,23,15,93,252,254,87,76,155,113,201,125,63,219,215,27,159,220,178,33,142,117,117,70,68,196,230,51,39,226,255,29,217,31,111,94,152,63,96,114,185,175,143,29,173,103,226,137,163,7,35,34,226,197,115,103,227,225,61,219,227,195,55,221,26,159,26,210,159,92,153,136,216,116,234,120,116,15,12,196,111,221,124,219,85,191,235,0,92,121,19,170,10,71,161,240,60,175,97,94,60,252,232,215,99,217,242,87,118,27,18,110,4,153,136,248,202,174,173,121,225,185,166,172,60,126,247,150,59,198,20,158,79,119,159,143,191,124,238,199,35,134,231,161,186,250,251,226,211,91,127,18,219,207,156,186,148,46,103,57,212,217,17,127,241,236,15,71,13,71,185,231,252,167,103,159,74,116,206,112,190,123,232,64,124,109,207,246,97,195,243,80,3,233,116,222,8,255,64,122,112,76,53,156,175,148,181,51,102,229,29,107,238,104,207,122,124,170,251,252,136,143,211,153,76,252,143,173,207,142,24,158,135,58,63,208,31,159,221,182,113,216,145,224,209,180,245,116,199,95,110,250,113,94,88,45,20,73,175,196,245,113,42,167,116,224,225,174,206,248,175,5,250,83,200,174,214,211,241,76,206,191,53,224,250,48,97,70,160,11,133,231,57,115,231,198,195,143,62,26,203,87,172,24,167,94,193,196,145,137,136,175,238,218,22,255,114,252,72,214,241,218,242,138,248,157,91,238,136,89,85,147,70,125,143,193,116,58,30,124,126,99,94,85,135,169,21,149,209,84,51,53,38,151,150,197,249,129,190,216,219,209,150,181,73,198,64,58,29,159,223,177,41,254,240,182,215,68,125,101,245,37,245,191,171,191,47,254,122,251,198,130,211,5,154,106,106,99,86,245,228,136,200,196,139,231,206,198,193,206,142,172,231,187,7,6,226,193,109,27,227,15,95,245,154,168,44,185,180,95,123,71,187,58,227,31,154,119,231,29,47,47,42,142,101,83,167,199,212,138,138,56,219,215,23,251,58,90,243,62,159,107,69,99,129,146,116,71,186,178,63,171,76,206,86,43,185,143,55,157,62,158,245,199,83,113,42,21,111,109,92,26,107,166,207,140,138,146,146,104,237,233,142,77,167,143,199,83,199,142,196,192,75,223,85,111,122,48,118,183,181,196,29,179,230,38,234,239,233,238,243,241,201,205,79,231,213,53,111,170,169,141,123,26,178,23,138,95,169,235,35,247,207,157,254,193,193,139,27,190,212,150,87,196,146,218,186,168,46,41,141,214,158,238,216,217,118,58,175,198,246,147,199,14,198,221,179,27,18,252,212,192,68,48,33,2,116,161,240,28,17,209,210,210,18,239,120,243,91,174,104,219,207,239,121,33,74,199,176,253,45,92,235,254,247,238,231,227,71,199,15,231,29,191,115,86,195,152,194,115,196,133,233,11,71,135,140,188,21,167,82,241,203,75,86,197,235,230,46,136,212,144,219,212,153,76,38,126,240,226,161,248,251,189,59,47,6,138,238,193,129,120,116,239,174,248,141,53,183,94,82,255,31,217,179,35,47,72,45,168,153,18,239,95,177,54,230,84,79,206,58,126,228,108,71,124,105,215,214,172,81,194,83,221,231,226,235,251,118,198,123,151,175,185,164,246,255,118,247,182,188,112,244,218,57,11,226,151,22,47,143,170,33,115,132,95,158,27,254,15,251,119,143,105,164,250,106,170,171,168,140,210,226,226,232,31,252,105,200,60,219,215,151,232,61,14,119,102,143,188,174,171,159,19,191,48,100,42,197,244,138,170,88,90,91,23,175,153,61,63,62,181,101,67,116,246,245,70,69,113,73,52,77,73,86,209,229,197,115,103,227,191,109,217,144,55,114,189,178,110,70,124,248,166,91,163,44,103,222,242,213,188,62,82,17,241,246,69,203,227,77,243,23,101,205,31,63,211,115,62,254,106,83,118,224,63,114,182,51,122,211,131,81,126,133,23,212,2,87,215,53,31,160,135,11,207,17,17,189,61,61,209,219,115,105,183,5,225,70,242,205,253,249,35,167,47,123,252,200,129,184,115,246,220,49,133,232,239,31,61,144,245,248,45,141,75,226,245,243,242,119,250,76,165,82,241,186,185,11,163,170,164,44,190,176,99,211,197,227,91,206,156,136,227,231,186,98,118,245,216,2,251,203,206,244,156,207,171,83,189,160,102,74,252,254,186,187,11,46,0,107,152,60,37,62,182,254,213,241,241,141,217,183,243,159,62,126,52,222,214,184,52,166,36,92,212,118,168,179,35,14,116,102,79,117,120,221,220,133,241,158,101,171,243,94,91,92,84,20,111,154,191,40,170,75,74,227,43,187,183,37,106,231,106,168,44,46,201,10,208,231,7,250,19,157,63,144,201,30,225,29,110,74,202,220,73,53,241,39,183,255,76,236,105,107,137,5,53,181,81,87,81,57,230,54,142,156,237,136,79,109,217,16,93,253,217,225,254,246,89,115,227,125,43,214,230,205,41,190,218,215,199,27,26,26,11,110,48,52,189,162,42,222,214,180,60,190,180,115,243,197,99,233,76,38,142,118,117,218,144,6,174,51,215,252,28,232,107,108,0,7,174,59,189,233,193,248,220,246,77,35,110,239,28,113,33,68,182,14,249,131,181,188,168,56,238,153,63,114,189,245,219,102,206,201,11,35,185,245,136,199,98,227,169,227,121,59,231,189,111,197,218,17,171,39,148,21,23,197,251,86,172,205,58,54,152,73,199,166,211,39,18,183,191,173,229,100,214,227,73,165,101,113,223,226,149,35,158,243,234,57,243,99,209,148,107,47,52,229,6,222,209,118,169,204,149,251,135,214,230,211,199,227,59,135,243,43,81,68,92,248,156,214,213,207,78,20,158,247,119,180,197,95,109,126,38,47,60,191,177,161,49,62,176,242,150,130,11,242,174,246,245,241,166,17,174,251,213,117,249,139,37,207,245,39,27,229,7,174,125,215,252,8,244,175,127,232,129,136,136,248,216,71,243,71,161,203,43,42,98,210,164,100,35,89,64,190,99,93,157,241,119,123,119,196,253,203,242,119,181,123,89,243,217,236,146,109,189,233,193,248,205,39,191,157,184,173,195,103,59,70,127,81,142,131,57,163,191,77,53,181,49,55,231,182,124,33,11,106,166,196,188,73,53,89,211,78,154,59,219,226,245,145,63,106,62,146,35,103,179,167,45,172,175,159,61,108,9,181,161,238,154,221,80,176,212,221,120,234,206,25,113,46,47,78,246,191,129,87,205,156,27,223,220,191,59,206,189,244,62,233,76,38,30,219,183,43,190,213,188,55,86,76,155,30,107,166,207,140,53,117,245,49,121,72,45,236,177,122,161,189,37,30,63,210,156,53,143,57,21,17,239,88,188,34,126,110,132,208,122,53,175,143,202,146,146,17,203,242,77,42,45,139,146,162,162,172,63,72,187,251,7,70,237,11,48,177,92,243,1,58,98,248,16,93,87,87,23,95,251,198,99,177,98,229,200,35,65,192,5,245,149,213,241,209,117,119,198,15,95,60,28,255,212,188,39,235,185,31,28,59,20,203,167,214,197,250,250,57,5,207,109,235,185,60,11,227,46,101,129,93,71,206,84,173,57,213,99,223,94,124,78,245,164,172,128,212,214,155,188,253,206,190,236,246,103,143,33,156,69,68,204,153,52,182,215,93,45,109,61,221,121,243,178,147,214,104,174,44,41,137,15,174,94,31,15,62,255,108,244,14,153,10,210,51,56,16,155,79,159,136,205,167,79,68,42,149,138,166,201,181,113,207,252,198,88,87,63,103,204,101,251,190,125,104,95,222,177,117,245,115,70,12,207,17,87,247,250,24,203,230,64,69,57,63,240,181,54,23,30,120,229,174,249,41,28,47,251,245,15,61,16,31,255,196,39,178,142,189,120,236,88,188,231,190,251,226,133,221,195,207,239,4,46,152,85,53,41,126,111,253,93,81,91,94,17,111,89,184,164,96,93,230,175,236,222,54,108,121,178,190,244,229,25,69,155,63,134,77,90,114,245,231,204,187,45,47,25,251,130,172,138,226,236,69,192,3,5,170,52,140,222,126,118,0,170,24,227,168,109,101,194,209,221,43,109,111,123,254,104,248,172,132,243,209,35,34,86,78,155,30,127,116,219,107,227,174,217,243,10,78,147,200,100,50,177,191,179,45,62,183,125,83,252,233,79,158,186,88,181,226,82,108,61,115,34,118,182,158,25,241,53,227,125,125,0,55,158,107,235,183,251,40,10,141,68,31,61,114,52,222,125,239,125,241,200,99,143,170,5,13,35,248,247,235,238,188,120,91,61,149,74,197,7,87,221,18,127,250,147,167,178,70,132,187,7,6,226,243,207,111,138,223,187,245,238,188,185,166,101,69,249,191,46,214,213,207,30,115,251,197,169,162,104,152,92,19,247,204,107,76,220,247,202,156,144,211,150,160,166,112,91,111,118,101,134,202,75,168,170,147,27,152,219,115,222,115,56,237,215,216,34,231,231,91,79,230,29,91,90,91,119,73,239,85,95,89,29,239,91,177,54,222,222,180,60,158,59,117,60,158,111,57,25,123,218,91,243,230,210,31,235,234,140,79,110,121,38,254,248,85,175,141,234,75,248,236,7,210,233,120,112,219,179,241,145,117,119,100,109,248,50,212,120,95,31,192,141,103,66,5,232,136,194,33,250,200,225,195,241,238,123,239,139,191,251,230,55,98,201,210,165,227,213,53,184,102,253,171,249,77,121,115,82,107,202,202,227,253,43,111,137,255,190,117,67,214,2,172,230,179,237,241,141,253,187,226,157,57,139,228,234,171,178,119,106,43,43,46,138,247,46,95,147,85,194,237,74,153,93,61,57,94,104,111,185,248,120,79,91,75,12,164,211,163,110,193,220,155,30,140,125,237,173,89,199,102,93,66,29,234,153,85,213,177,119,72,251,59,90,207,100,149,110,27,206,182,2,129,117,188,180,244,116,199,198,147,217,11,56,107,202,202,163,177,38,89,121,185,92,181,229,21,241,198,134,198,120,99,67,99,244,12,14,196,142,150,83,241,47,39,142,102,109,156,211,214,211,29,143,31,109,142,183,54,142,254,251,121,74,121,69,116,246,245,102,93,147,189,233,193,248,204,150,159,196,71,215,223,85,112,110,243,120,95,31,192,141,103,194,76,225,24,170,208,116,142,35,135,15,199,187,126,233,222,216,183,119,239,56,245,10,174,93,213,165,101,5,143,175,154,54,189,224,252,210,239,29,62,144,183,115,96,238,72,101,223,96,58,254,239,193,252,57,171,87,194,242,105,217,109,119,245,247,197,227,71,14,142,122,222,247,14,239,143,238,193,236,169,39,171,166,213,39,110,127,241,148,105,89,143,247,117,180,198,190,142,214,97,94,125,65,71,111,79,108,56,126,108,196,215,92,45,233,76,38,190,250,194,182,24,204,100,143,14,223,54,115,78,86,29,227,177,232,232,237,137,167,142,29,42,184,115,95,69,113,73,172,175,159,19,191,181,230,182,248,149,37,171,178,158,219,221,214,146,247,250,66,254,240,214,87,199,95,220,249,134,152,150,83,185,227,220,64,127,124,122,203,134,130,83,140,198,251,250,0,110,60,19,50,64,71,20,14,209,135,15,29,138,119,223,123,159,16,13,9,188,173,105,89,44,202,9,136,153,136,248,210,174,45,89,155,88,204,168,172,138,166,156,209,202,239,28,222,31,79,30,27,57,168,52,119,182,199,63,54,239,137,45,103,146,151,143,123,217,154,186,153,81,147,51,130,254,15,205,187,71,124,207,141,39,95,140,127,110,206,254,93,80,87,81,25,43,166,229,207,253,30,205,218,25,51,163,188,248,167,243,106,51,153,76,124,113,199,230,97,231,246,158,31,232,143,207,109,223,116,177,82,197,120,26,72,167,227,203,187,182,196,206,150,211,89,199,75,139,139,71,44,199,86,72,103,95,111,252,217,179,63,140,191,125,225,249,248,243,103,127,24,63,206,217,213,114,168,87,205,204,94,140,58,150,82,110,15,172,90,23,181,229,21,81,87,81,25,31,89,123,71,222,119,222,222,219,19,159,220,244,76,222,66,212,241,190,62,128,27,207,132,13,208,17,133,67,244,193,230,230,120,207,125,239,140,3,251,247,143,83,175,96,98,41,74,165,226,129,85,183,196,164,156,81,234,174,254,190,248,194,142,205,89,183,210,127,177,113,89,214,107,50,17,241,240,11,219,227,211,91,158,137,77,167,143,71,107,79,79,244,14,14,70,91,79,119,108,57,115,34,254,231,182,103,227,227,27,127,20,255,220,188,39,62,187,109,99,108,190,132,26,204,17,17,37,69,69,241,142,69,217,107,28,46,204,141,221,24,95,220,185,57,118,183,157,137,206,190,222,232,236,235,141,157,173,103,226,115,219,55,197,67,59,54,229,85,63,184,119,241,138,196,35,174,17,17,85,37,165,113,79,67,83,214,177,150,158,238,248,248,198,31,197,255,57,176,39,142,117,117,198,185,129,254,56,113,190,43,158,56,122,48,254,236,39,79,141,58,66,125,57,116,246,245,197,254,142,214,188,255,246,117,180,198,243,45,167,226,159,154,247,196,31,61,243,68,60,115,34,127,36,252,205,11,22,39,222,80,102,111,123,203,197,240,122,33,152,111,141,135,95,216,94,112,51,150,29,57,129,125,106,249,232,101,237,134,78,7,154,89,85,29,31,89,123,123,222,117,121,166,231,124,124,106,203,134,172,63,78,198,251,250,0,110,60,19,110,14,116,174,66,115,162,155,15,28,136,247,220,247,206,120,228,177,71,163,177,169,105,184,83,129,151,76,173,168,140,127,189,226,230,248,236,182,103,99,104,164,216,211,222,18,79,28,61,20,111,104,184,80,23,119,101,221,140,120,221,220,133,121,163,206,59,90,207,196,142,81,42,37,68,68,28,62,219,25,183,204,152,117,73,125,188,123,118,67,236,107,111,141,127,25,50,234,153,137,136,13,39,142,197,134,2,1,49,215,27,26,22,198,173,195,148,232,27,139,183,52,46,141,237,173,167,226,80,231,79,235,88,159,31,232,143,111,29,220,19,223,58,184,103,132,51,175,156,35,103,59,226,191,60,247,227,196,231,173,172,155,17,63,87,96,39,189,209,44,154,50,45,42,138,75,162,103,200,180,135,39,143,29,140,31,29,63,18,203,166,78,139,25,21,213,145,74,69,156,236,62,23,187,114,174,135,245,51,147,127,246,115,39,213,196,111,223,124,123,124,114,243,211,89,83,45,142,117,117,198,131,219,54,198,239,174,187,243,98,137,188,241,190,62,128,27,203,132,30,129,126,89,161,145,232,253,251,246,197,187,239,189,47,154,15,28,24,230,44,184,62,165,10,140,160,21,58,150,235,230,233,51,227,13,13,249,21,50,182,231,44,132,123,215,210,85,113,215,236,121,137,251,53,169,180,44,238,158,147,127,94,170,80,149,224,97,250,123,255,178,155,46,41,228,220,57,107,94,188,115,241,170,130,207,141,181,253,226,84,42,62,180,122,125,204,172,26,251,34,179,66,35,188,175,100,124,51,183,190,240,165,88,53,109,122,124,248,166,91,135,29,105,205,253,60,134,62,174,45,175,136,127,179,122,125,148,22,103,151,137,27,72,15,198,142,150,211,241,228,177,131,241,196,209,131,177,179,229,116,214,157,139,155,167,207,140,187,103,207,31,177,157,11,7,243,143,45,168,153,18,255,246,230,219,242,54,174,217,211,222,18,7,58,179,203,242,93,153,235,99,228,199,5,207,201,228,126,134,192,245,230,186,8,208,17,195,135,232,247,220,247,206,56,116,112,244,197,36,112,189,40,47,42,142,169,57,11,176,230,140,177,214,239,125,139,86,68,227,228,236,121,206,185,91,55,23,165,82,241,190,21,107,227,189,43,214,228,221,94,47,36,21,23,2,212,127,124,213,107,99,122,69,85,222,243,229,197,197,89,155,121,164,82,169,97,67,106,73,81,81,60,176,122,93,220,191,236,166,49,213,98,174,42,41,141,15,172,188,37,222,191,114,109,193,45,160,147,182,63,189,162,42,62,118,235,171,99,245,244,145,23,154,21,167,138,226,205,11,151,198,239,175,191,43,43,168,214,85,84,190,162,41,2,185,223,69,18,165,197,197,241,182,166,165,241,155,55,223,30,229,35,108,6,50,35,231,59,170,175,204,126,188,178,110,70,252,193,186,187,98,65,205,232,245,188,139,83,169,120,253,188,133,241,225,155,110,205,11,145,73,62,247,37,181,211,226,195,55,221,150,181,137,73,42,149,138,234,156,10,48,87,226,250,152,153,83,149,99,70,101,254,53,156,107,122,206,207,81,95,173,178,7,92,111,138,127,239,63,124,236,79,198,187,19,151,203,186,91,215,199,180,186,186,248,254,119,191,123,241,88,107,107,107,60,249,248,227,241,179,111,122,83,76,169,125,101,229,154,96,162,152,83,93,19,251,219,91,35,157,201,196,107,230,206,207,155,191,59,156,162,84,42,110,154,94,31,7,58,219,226,252,64,127,172,171,159,19,191,178,100,85,193,114,96,243,39,79,137,55,54,44,140,25,149,213,81,148,42,138,129,76,58,6,94,218,208,162,186,180,44,26,38,213,196,29,179,230,197,253,203,111,138,55,54,52,70,101,201,240,129,102,110,245,228,216,219,209,26,197,169,162,184,119,209,138,88,57,109,198,136,253,92,88,83,27,63,51,111,65,76,41,171,136,76,42,162,63,157,142,129,76,58,138,82,169,168,41,43,143,197,181,83,227,141,13,77,241,254,149,107,99,225,24,202,180,37,105,191,180,168,56,110,159,57,247,165,202,28,153,232,25,24,140,190,244,96,20,23,21,69,125,101,117,220,54,107,78,124,96,229,218,88,95,63,59,170,74,74,163,178,164,52,14,118,182,71,77,89,121,188,119,249,154,152,241,10,202,164,45,152,92,27,7,59,219,163,163,175,55,70,219,219,174,164,168,40,38,151,149,199,162,41,181,241,154,185,11,226,3,43,110,142,213,117,51,71,189,27,49,127,242,148,56,220,213,25,29,125,189,177,108,234,244,248,229,37,171,162,44,103,196,121,74,121,69,188,118,206,130,88,62,117,122,212,148,150,71,38,147,137,76,68,12,100,210,81,81,92,18,179,170,39,199,157,179,230,197,123,87,220,28,119,204,154,55,108,155,115,38,213,196,190,246,150,40,138,84,188,189,105,121,172,174,27,254,115,175,175,172,138,133,53,83,99,95,123,75,148,20,21,199,175,44,89,57,236,247,116,57,175,143,25,85,213,113,182,175,47,78,156,239,138,25,85,85,241,171,203,110,30,117,247,198,121,147,38,199,222,151,254,253,221,211,208,20,119,207,110,24,241,245,192,196,147,58,125,182,243,186,219,99,244,11,159,123,40,111,219,239,207,252,245,131,241,174,251,239,31,167,30,1,0,112,189,184,110,166,112,12,149,59,157,227,63,255,213,39,132,103,0,0,46,139,9,95,133,99,56,47,87,231,72,165,34,126,237,129,7,198,185,55,0,0,92,47,174,203,41,28,0,0,112,165,92,151,83,56,0,0,224,74,17,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,16,160,1,0,32,1,1,26,0,0,18,40,233,234,234,26,239,62,0,0,192,132,97,4,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,95,123,234,0,0,9,105,73,68,65,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,255,183,7,135,4,0,0,0,0,130,254,191,118,134,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,1,163,208,109,142,198,72,126,228,0,0,0,0,73,69,78,68,174,66,96,130]}],"frame_width":720,"frame_height":1512} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/flutter_jank_metrics_03.json b/FrontEnd/flutter_pos_ecommerce/flutter_jank_metrics_03.json new file mode 100644 index 0000000..ebb3ffd --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/flutter_jank_metrics_03.json @@ -0,0 +1 @@ +{"type":"RenderFrameWithRasterStats","snapshots":[{"layer_unique_id":37797,"duration_micros":23284,"top":0.0,"left":0.0,"width":720.0,"height":1512.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,28,235,73,68,65,84,120,156,236,214,193,13,128,32,0,192,64,100,255,137,49,70,86,160,47,99,114,55,65,159,189,214,115,191,3,0,0,56,50,191,14,0,0,128,63,49,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,0,4,6,26,0,0,2,3,13,0,0,129,129,6,0,128,192,64,3,0,64,96,160,1,0,32,48,208,0,0,16,24,104,0,0,8,12,52,0,176,219,173,99,1,0,0,0,128,65,254,214,99,216,95,20,1,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,2,13,0,0,131,64,3,0,192,32,208,0,0,48,8,52,0,0,12,1,154,40,15,193,76,245,230,194,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":37138,"duration_micros":833,"top":227.05599975585938,"left":38.26599884033203,"width":654.7078857421875,"height":39.264007568359375,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,125,156,93,87,93,47,254,207,218,51,211,164,165,5,138,77,155,204,156,121,72,41,150,139,2,133,34,202,253,33,210,203,85,228,161,15,169,151,10,173,32,160,128,34,8,138,138,136,136,87,121,16,80,64,158,68,212,11,2,77,177,189,182,73,17,84,184,82,228,225,42,212,138,120,69,69,74,155,100,38,147,134,22,74,91,74,211,204,156,189,126,127,204,67,206,153,204,36,211,135,52,13,190,223,175,215,188,146,179,247,218,107,175,179,102,207,57,107,175,253,93,107,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,71,42,135,187,0,220,187,140,141,141,125,79,219,230,191,238,219,50,240,185,169,169,107,255,249,240,149,136,78,167,243,160,164,121,252,194,235,82,234,23,38,39,39,255,225,112,150,9,0,254,51,27,60,220,5,88,173,209,225,137,231,212,166,237,41,111,251,209,169,169,169,157,119,38,175,78,103,252,252,164,222,103,49,167,118,224,83,211,211,215,126,249,174,151,242,200,215,182,229,225,169,121,207,194,235,154,250,236,36,135,173,1,189,255,239,189,95,105,155,111,149,180,55,180,205,192,238,147,78,122,192,191,93,117,213,85,51,247,100,249,238,9,109,219,60,184,41,165,231,119,146,159,79,162,1,13,0,135,201,17,211,128,174,165,190,41,181,124,215,226,134,50,240,166,36,191,114,71,243,25,30,30,127,68,106,46,236,237,124,111,154,246,220,36,26,208,203,104,14,243,83,138,253,126,239,251,239,79,77,73,106,155,221,215,221,112,75,103,120,252,67,67,179,205,171,174,253,218,181,187,239,201,114,222,195,60,57,2,128,195,168,57,220,5,184,211,106,94,186,97,195,198,241,59,122,216,64,41,191,186,204,230,35,183,30,232,117,92,74,158,183,119,168,253,251,177,177,177,239,57,220,133,1,0,190,51,29,201,13,199,161,129,129,246,69,119,228,128,225,225,241,71,212,212,243,14,85,129,86,210,25,30,123,117,103,100,188,118,70,198,235,200,200,248,117,247,244,249,255,179,41,201,68,219,45,31,28,27,27,59,254,112,151,5,0,248,206,115,196,132,112,44,171,230,37,27,54,108,124,199,174,93,215,110,95,77,242,129,82,126,181,166,30,234,82,237,175,52,195,153,63,111,57,178,111,90,14,183,93,83,59,183,15,247,110,56,229,1,167,220,119,207,49,123,78,74,154,39,165,150,215,36,57,110,126,215,105,117,182,252,84,146,223,189,199,75,9,192,138,54,109,189,240,214,164,28,179,119,160,62,224,35,79,189,224,198,131,165,63,107,235,159,28,55,144,163,63,149,100,125,41,205,83,46,61,235,233,255,184,47,175,205,255,156,228,161,181,173,223,191,101,211,5,159,63,148,229,134,94,71,122,99,110,104,160,212,23,174,38,225,200,200,196,105,7,232,125,110,239,198,50,45,163,142,30,218,252,255,243,186,250,27,87,223,60,53,53,245,149,169,169,29,111,43,181,60,179,119,95,45,121,94,142,252,107,28,224,63,181,193,172,121,88,146,211,146,172,111,107,125,242,225,46,15,36,71,122,15,116,146,148,250,43,27,54,108,124,215,193,123,161,219,151,220,149,177,87,163,163,163,195,181,14,60,168,214,246,196,82,202,81,77,91,191,54,155,102,114,122,122,219,191,47,151,126,120,120,236,204,166,201,250,36,73,77,111,60,238,218,78,103,236,121,125,111,161,91,255,125,114,215,228,167,87,58,247,240,240,201,99,165,116,79,105,106,57,41,73,218,82,119,55,77,187,125,114,114,242,171,119,244,125,156,112,194,169,199,173,89,115,251,247,52,53,235,219,210,222,183,105,154,221,221,110,182,79,79,111,251,114,178,127,247,124,155,246,96,55,23,101,120,120,226,212,193,180,163,109,83,78,172,181,206,148,210,236,46,165,251,149,201,201,201,233,59,90,190,187,98,114,122,219,229,157,145,241,255,72,242,221,243,155,190,123,227,137,27,215,45,55,160,240,244,211,79,31,154,158,190,225,161,3,3,89,95,107,61,161,169,205,205,109,201,117,183,223,190,230,75,55,220,240,229,91,86,58,71,167,211,57,37,25,88,156,82,110,96,32,31,217,190,125,251,174,117,235,214,29,59,52,116,204,195,74,169,15,44,165,124,187,116,219,175,117,75,247,223,166,167,167,111,88,38,143,7,37,131,15,172,181,93,55,80,115,93,219,180,219,166,166,166,190,178,234,55,218,150,197,223,73,167,211,121,80,41,131,39,183,109,123,82,41,229,214,166,173,187,187,165,251,111,59,119,238,252,250,170,243,75,50,54,54,118,124,219,14,140,214,218,142,38,245,1,77,211,124,45,233,238,156,156,156,252,247,36,179,189,105,79,62,249,228,251,237,221,59,219,119,51,58,56,216,124,96,219,182,109,123,14,116,142,117,235,214,29,187,102,205,209,207,88,120,93,218,102,118,114,122,219,251,210,127,221,149,137,137,137,147,186,221,238,104,173,205,88,105,203,80,109,114,93,211,180,59,118,236,216,113,205,74,121,159,112,194,169,199,173,93,123,219,211,23,94,119,187,229,170,93,187,182,255,99,146,102,100,100,227,67,7,106,247,196,110,201,241,165,148,161,169,169,237,23,222,213,58,232,53,58,60,241,244,218,180,199,37,73,173,217,181,115,231,142,191,72,146,78,167,51,82,235,192,169,165,212,225,210,54,183,116,83,119,108,216,112,194,191,124,39,206,20,3,135,210,9,215,221,250,249,235,215,223,247,146,36,195,105,243,193,195,93,158,115,183,94,116,77,77,253,174,203,206,62,255,126,135,187,44,28,62,71,126,3,58,201,192,64,251,115,57,192,140,28,99,235,199,30,210,166,60,251,0,89,172,216,75,217,233,76,124,127,169,121,89,109,235,211,146,154,146,146,212,164,45,37,77,106,70,70,198,63,211,212,242,142,201,233,109,23,167,167,33,48,80,154,103,214,90,159,182,76,150,199,165,238,155,146,44,73,218,166,188,54,201,126,13,232,78,103,252,201,181,150,23,148,116,207,74,230,102,156,72,230,110,3,106,219,164,51,60,254,87,37,237,31,76,78,79,94,126,128,247,150,36,153,88,63,49,49,51,80,127,185,100,207,179,147,28,83,75,82,82,82,219,154,166,36,157,145,241,171,83,234,27,107,173,183,151,85,222,104,116,58,227,231,167,230,197,73,253,129,118,190,94,230,234,167,166,214,38,35,35,99,127,86,202,192,155,167,166,174,189,167,30,171,213,148,92,149,186,216,128,78,119,109,247,132,36,139,13,232,78,167,115,116,218,230,197,187,119,223,240,51,3,77,54,46,148,185,150,154,146,100,237,154,61,55,141,140,140,255,73,173,131,111,157,158,254,234,228,126,39,168,205,131,75,242,71,11,175,219,153,230,137,157,225,137,151,164,212,23,39,57,38,243,245,80,155,38,77,154,91,58,195,227,191,54,53,189,253,157,73,234,232,240,196,217,109,169,175,74,205,233,11,215,82,91,146,212,129,116,70,38,174,76,201,111,76,77,109,251,171,213,188,209,209,209,209,71,213,90,126,61,181,156,93,107,255,117,89,50,56,211,233,140,127,160,109,155,55,30,108,122,198,13,27,198,31,57,80,242,235,109,55,155,146,118,254,55,63,119,93,36,77,58,35,227,187,82,235,31,206,116,111,255,221,221,187,119,223,154,36,215,92,115,205,77,157,145,241,31,79,242,132,197,122,222,155,175,37,217,122,160,115,29,117,212,209,155,122,175,253,218,212,223,205,190,191,153,50,58,60,113,118,77,125,229,236,76,125,212,194,159,100,45,117,238,125,117,75,58,157,241,127,77,242,186,169,169,237,155,179,228,102,239,232,163,191,125,92,109,155,197,188,155,166,252,226,248,134,241,219,102,155,124,160,164,61,125,174,94,146,212,242,255,146,244,53,160,239,76,29,244,106,75,253,165,82,203,233,73,82,74,182,12,15,111,252,74,83,218,63,72,205,25,243,231,76,45,53,77,146,235,174,187,97,119,103,120,236,205,247,189,255,177,111,253,215,127,253,215,189,7,170,47,96,206,123,94,240,130,153,36,247,248,248,165,149,212,212,117,57,228,79,174,185,183,251,206,120,188,125,144,25,57,234,192,29,159,238,46,73,58,157,241,77,169,245,211,53,203,54,132,147,36,37,121,108,45,245,67,157,145,137,119,159,114,202,41,107,238,204,121,178,164,49,48,60,60,124,76,103,120,252,109,169,249,72,73,61,107,197,163,74,126,180,150,102,107,167,51,254,246,78,167,115,244,74,201,70,70,54,62,124,102,160,94,81,146,23,38,57,102,133,100,167,164,150,247,148,148,55,175,162,188,131,35,35,227,175,153,155,14,48,63,176,114,241,202,143,167,182,159,27,29,158,120,206,42,242,92,141,131,223,240,213,156,212,251,178,109,219,219,23,254,223,233,116,30,144,52,91,82,202,27,82,179,113,133,28,238,87,146,95,108,202,236,223,117,58,19,223,127,208,211,149,118,115,74,125,121,150,175,215,227,82,242,246,206,240,248,47,117,134,199,126,165,150,186,165,36,167,175,144,211,247,165,214,191,236,12,143,255,212,193,206,153,82,158,85,219,230,202,212,114,246,10,41,134,82,243,220,166,180,87,140,142,142,126,223,74,217,140,140,140,159,49,208,228,179,41,217,116,128,179,109,72,41,191,57,52,176,230,163,167,159,126,250,208,190,50,228,93,125,165,111,218,131,133,82,13,148,148,190,191,195,166,169,239,91,248,127,167,51,246,43,181,212,203,82,242,168,21,115,168,121,72,106,62,56,50,50,254,219,7,57,87,74,169,143,235,54,249,216,202,245,61,231,46,213,193,114,69,172,57,173,41,237,21,73,206,88,182,92,201,73,41,229,13,55,223,116,235,69,249,14,233,192,128,255,76,158,125,197,123,215,38,57,246,112,151,131,195,239,72,250,0,95,188,219,171,201,238,82,235,187,82,202,255,156,223,180,16,11,253,242,165,7,205,247,62,255,100,239,177,73,249,253,146,250,186,158,100,251,133,46,140,140,140,159,145,154,75,87,95,188,250,252,61,123,246,94,147,228,13,171,63,102,121,77,115,212,203,83,235,139,87,127,234,188,168,102,96,87,146,215,45,221,181,97,195,198,241,146,246,227,73,214,173,50,183,21,231,92,94,208,25,30,251,181,36,175,92,117,241,74,253,95,163,163,27,191,58,57,121,237,167,86,123,204,10,14,216,99,55,62,62,190,161,59,219,223,160,159,153,153,217,149,36,15,121,200,67,142,186,249,230,111,93,148,90,126,100,149,231,26,73,173,255,123,227,137,27,31,117,144,57,165,15,90,95,41,121,227,170,195,135,74,222,49,60,188,241,51,7,238,57,174,43,54,138,151,216,80,219,230,175,71,71,71,191,119,105,56,205,250,245,167,172,43,153,185,36,201,218,213,149,171,60,238,186,235,174,127,78,50,183,200,206,218,181,67,31,185,237,182,153,109,37,153,152,43,82,249,145,78,103,227,195,86,90,181,114,108,120,236,191,181,201,247,46,102,151,242,225,29,59,182,127,41,73,134,135,199,254,123,106,249,157,85,190,167,148,228,149,157,206,198,139,15,184,66,102,205,57,7,203,231,174,214,193,10,101,155,88,85,94,201,185,157,206,216,115,166,166,118,252,209,193,147,2,231,108,189,112,123,73,25,75,183,57,245,178,115,159,254,31,203,165,57,247,35,23,142,215,110,121,117,106,126,52,201,241,73,182,165,230,131,55,222,111,195,27,62,121,198,25,203,134,97,109,218,186,249,135,75,201,139,107,205,99,146,28,151,154,235,210,228,227,165,169,175,191,244,169,23,44,134,141,157,123,249,135,30,89,107,123,213,77,55,47,30,122,223,77,91,55,239,107,59,212,188,226,178,115,206,95,213,231,216,227,175,184,98,240,248,155,119,253,66,146,103,38,57,37,201,173,73,249,114,169,121,235,165,231,60,227,127,175,116,220,217,91,62,248,208,166,52,191,148,154,31,74,201,73,53,245,107,37,229,179,105,154,55,92,118,230,211,191,184,204,123,251,231,36,15,221,51,116,255,181,71,237,253,230,143,52,201,43,82,114,90,146,153,164,126,182,182,121,213,150,77,23,92,149,36,231,92,190,249,188,210,230,165,41,245,225,73,185,45,201,149,37,237,107,46,61,251,39,62,219,155,231,179,175,120,239,218,155,110,94,115,91,146,238,101,103,159,191,108,27,242,220,203,55,191,180,214,188,37,37,127,124,217,89,231,63,111,233,254,213,214,249,189,221,17,219,3,61,211,29,122,119,146,125,177,170,165,254,194,114,189,208,237,96,121,89,255,150,242,134,36,75,71,253,246,181,110,38,38,38,214,151,228,253,253,9,202,251,107,242,223,134,102,154,245,109,157,185,79,74,243,240,164,252,126,95,46,181,252,206,240,240,198,83,147,100,114,231,182,243,166,118,110,47,83,59,183,151,36,189,241,168,215,47,108,95,248,217,185,115,251,171,22,118,142,142,142,126,95,106,253,141,254,115,215,63,76,41,143,111,6,234,3,154,129,250,128,210,52,63,84,147,63,88,242,6,94,59,50,50,113,218,146,247,53,56,48,208,125,79,150,52,158,107,242,218,148,230,225,41,221,99,186,109,51,81,83,127,50,171,92,72,166,211,153,120,124,207,141,203,194,185,127,163,166,60,102,102,118,207,177,109,157,89,215,212,250,131,53,229,227,125,7,182,237,187,39,38,38,86,215,80,89,217,138,215,235,216,216,216,241,221,153,188,41,61,61,193,37,245,221,11,143,220,111,254,230,183,94,186,164,241,252,245,82,243,83,41,221,135,173,61,122,104,109,74,183,147,146,255,145,254,122,232,236,29,106,251,126,23,43,152,73,205,139,107,6,78,109,235,204,125,74,211,62,186,38,87,45,151,112,238,230,175,60,99,176,91,54,238,185,125,237,125,107,242,132,148,92,219,147,100,109,147,238,143,175,226,156,73,242,31,37,229,57,205,64,125,224,224,80,57,186,25,168,223,91,146,87,37,233,141,177,61,190,182,205,126,55,117,3,3,51,47,73,79,227,191,38,159,73,201,83,6,187,101,227,237,123,191,125,92,74,121,124,73,121,127,255,81,229,21,153,191,233,190,250,234,171,111,79,202,219,250,118,183,245,252,149,10,218,150,242,243,125,57,213,246,237,139,255,47,253,141,231,154,250,190,166,214,31,108,235,204,186,182,206,172,43,181,61,59,117,201,202,139,237,234,167,176,172,169,127,150,90,127,51,165,62,63,165,46,158,235,174,214,193,129,207,153,171,218,90,207,170,153,29,157,153,221,115,108,105,218,71,39,249,100,127,162,242,178,28,193,159,193,112,111,82,74,249,158,58,91,254,33,53,207,74,114,251,252,207,131,83,242,154,227,111,190,110,217,70,233,166,45,23,190,41,201,199,106,205,153,243,155,190,90,74,78,72,205,79,215,110,185,234,220,203,63,244,200,133,180,179,117,230,214,164,94,89,147,47,204,111,234,38,245,202,133,159,210,148,85,175,140,252,128,91,118,93,154,228,141,73,254,75,146,169,36,183,37,245,255,171,165,94,114,238,214,11,95,181,220,49,231,92,126,225,179,155,210,92,153,228,89,41,185,127,146,109,37,101,93,146,103,164,109,63,183,105,235,133,23,172,116,190,163,103,110,124,69,83,114,121,74,78,43,41,215,37,185,79,82,158,84,154,242,153,115,47,255,224,15,156,187,117,243,27,74,205,159,165,228,244,204,237,63,54,201,143,214,218,92,177,105,235,230,31,93,237,251,90,141,59,82,231,247,118,71,82,15,116,159,221,187,191,250,181,78,103,226,45,61,141,205,253,122,161,199,214,143,61,164,173,121,110,207,97,55,174,89,211,252,175,219,111,111,159,145,3,152,157,109,159,150,148,206,194,235,154,188,118,106,231,182,223,72,127,204,211,63,39,121,105,167,51,113,93,106,125,253,194,198,129,210,158,151,228,160,143,152,87,210,182,229,133,189,173,249,146,188,101,114,231,142,151,165,191,151,252,83,73,62,213,25,30,159,77,201,139,123,210,254,108,146,23,44,188,30,30,30,127,116,106,250,122,92,155,90,127,112,199,244,142,207,244,108,218,158,228,253,35,35,35,31,41,117,224,210,148,242,184,3,22,112,73,207,120,169,237,217,75,98,176,111,77,242,153,36,79,238,140,140,95,158,228,73,153,43,252,127,105,247,182,63,152,164,191,97,125,199,28,179,116,0,102,218,28,159,166,140,182,221,252,88,74,54,244,236,185,165,91,7,222,154,204,13,94,75,255,2,58,83,109,109,254,251,146,94,222,157,73,254,124,124,124,252,255,118,103,115,101,146,145,36,41,201,243,214,175,63,229,55,175,187,238,234,235,87,42,84,77,125,209,206,233,29,189,189,146,87,14,15,111,188,160,148,118,191,1,166,77,211,156,183,164,39,254,19,157,206,196,115,147,122,197,226,150,82,206,77,242,91,43,157,111,190,92,159,157,233,14,109,90,82,174,47,37,249,210,232,232,232,95,215,182,249,100,246,221,76,252,196,200,200,198,223,221,185,243,218,47,246,28,255,63,250,242,43,221,231,76,77,77,93,189,111,203,245,127,155,228,51,157,206,248,125,23,122,115,75,50,49,60,60,254,232,233,233,237,255,55,73,106,221,251,129,82,134,222,144,100,46,172,161,212,23,158,242,128,83,94,119,245,55,174,190,185,55,239,78,167,243,208,212,60,181,231,108,255,111,199,244,246,79,36,115,177,249,179,169,189,97,22,255,178,115,231,142,231,165,127,208,222,229,35,35,35,159,45,25,252,167,36,157,249,55,112,193,186,117,235,126,241,250,235,175,255,214,1,42,233,95,155,217,250,180,29,215,237,248,215,229,119,223,245,58,88,193,174,163,102,154,167,44,121,114,113,229,201,39,159,124,206,222,219,187,255,178,248,30,146,83,59,157,206,247,76,77,77,253,191,3,228,5,172,70,201,155,147,124,177,12,212,231,46,244,98,158,179,117,243,79,148,228,143,147,122,246,185,91,47,122,202,165,103,63,227,35,11,201,207,185,252,67,79,74,109,127,169,36,183,182,37,63,185,229,172,243,255,60,73,206,252,240,135,143,25,172,183,252,126,106,126,186,173,237,31,39,121,100,146,92,126,246,51,191,156,228,209,79,251,232,197,235,102,103,102,191,150,228,214,203,206,190,224,209,119,180,152,231,92,118,209,19,106,173,103,38,153,174,109,243,184,45,155,158,254,213,36,57,231,195,31,250,145,210,182,91,106,202,111,158,251,231,31,124,239,165,63,246,19,83,251,142,185,240,209,165,150,63,74,178,39,53,63,123,227,253,54,124,224,147,103,156,49,251,180,139,47,30,232,174,157,125,113,173,249,157,164,252,201,166,191,248,208,23,47,123,234,211,255,101,233,57,107,202,111,36,185,112,240,246,193,159,187,228,188,243,110,58,243,195,155,79,24,108,115,105,146,31,172,181,185,36,73,39,181,126,172,91,202,179,46,63,251,252,221,207,190,226,189,107,191,121,211,81,127,82,74,57,63,201,31,164,214,147,83,202,93,158,3,248,142,214,249,189,221,145,212,251,177,88,214,133,185,148,75,233,254,97,146,125,35,255,75,253,133,209,209,209,197,121,130,219,193,242,139,189,25,148,228,181,215,92,115,205,77,7,57,79,73,45,207,239,121,189,243,126,247,187,207,111,101,133,1,3,107,215,14,190,165,183,12,53,89,241,46,240,96,230,30,41,247,15,118,156,233,14,189,62,203,132,152,36,201,208,108,243,218,254,45,245,249,35,35,35,139,61,106,77,74,127,252,116,173,47,95,210,120,94,180,115,231,206,175,183,25,120,254,114,251,22,140,143,143,111,72,114,238,98,118,169,239,59,192,0,198,217,110,155,95,239,221,208,45,229,137,7,202,127,21,238,151,90,222,211,247,51,23,207,252,162,164,175,241,156,82,203,51,23,26,200,107,135,238,243,132,204,61,206,155,223,151,87,175,20,34,177,125,251,246,93,53,165,247,6,104,104,112,112,102,197,155,138,154,236,62,250,232,163,254,116,233,246,249,252,63,218,87,166,148,15,47,23,198,50,53,181,237,111,147,244,206,168,242,240,117,235,214,29,48,198,174,77,243,115,43,53,234,39,39,39,175,172,169,191,208,187,173,73,187,120,45,108,60,113,227,73,73,78,237,121,19,255,208,223,112,92,212,173,181,246,133,49,149,82,79,89,248,255,244,244,244,13,41,249,195,158,221,199,221,190,118,246,199,150,102,82,235,64,223,53,93,106,222,146,164,155,36,179,131,245,191,244,165,157,27,136,184,223,163,214,157,59,119,126,189,164,254,69,207,166,99,142,30,56,122,108,153,50,47,106,218,250,210,149,26,207,119,87,29,44,167,212,188,102,185,176,159,107,174,185,230,166,212,218,23,178,209,182,205,106,67,62,128,3,169,185,233,214,181,179,79,233,13,1,216,114,246,249,31,44,41,127,154,36,109,109,251,111,152,107,247,172,36,55,39,245,13,11,13,185,36,249,240,153,103,126,251,198,227,54,252,108,146,221,37,121,196,143,125,120,243,131,239,206,98,54,77,93,120,82,252,137,133,198,115,146,108,57,243,233,31,43,169,191,151,154,207,181,67,131,15,237,43,107,41,111,72,50,152,212,231,94,118,206,249,239,93,8,71,185,228,188,243,186,151,158,117,254,91,51,247,228,113,77,109,187,125,223,185,139,106,190,52,120,251,224,79,94,114,222,121,55,205,189,199,243,111,168,109,243,156,204,125,14,119,146,236,26,220,59,244,99,151,159,125,254,238,36,121,223,25,207,217,243,237,163,187,207,207,220,211,243,137,115,63,124,225,65,199,3,173,198,225,170,243,67,229,136,237,129,78,146,201,201,201,233,145,145,241,223,43,251,226,113,135,106,119,224,231,147,252,234,124,239,115,239,128,172,27,107,233,190,247,96,121,110,60,113,227,137,51,105,191,183,103,211,158,91,110,250,246,31,141,142,44,255,61,119,251,109,179,201,92,40,201,66,120,194,169,235,214,173,59,246,128,61,99,43,56,170,217,123,90,219,31,77,242,129,3,245,124,94,251,181,107,119,119,134,199,47,76,217,215,104,47,101,232,161,89,120,84,92,234,227,123,211,15,182,205,197,7,58,255,244,244,181,95,30,29,153,248,112,77,61,115,185,253,221,110,121,120,111,91,190,164,156,58,58,50,177,95,227,177,199,218,218,151,190,167,193,114,136,212,100,219,64,173,207,220,49,189,125,241,70,161,54,121,68,255,68,105,229,156,209,145,137,31,90,57,143,58,210,251,186,212,149,227,90,75,202,135,230,194,25,150,45,203,191,151,100,113,206,210,54,249,200,114,233,146,212,148,250,47,169,229,129,11,27,6,7,143,253,174,100,197,107,232,19,189,189,201,203,102,88,103,47,45,101,104,177,113,91,231,6,181,253,118,50,119,221,100,62,108,233,244,211,79,31,186,238,186,175,159,62,58,60,241,244,148,58,82,83,70,75,207,205,198,210,186,104,106,57,177,239,117,183,190,175,109,202,98,56,69,45,245,37,73,22,167,166,27,30,30,62,97,126,240,234,130,175,223,182,119,205,226,227,212,169,169,237,127,185,80,150,137,137,137,251,207,206,230,180,145,145,177,103,38,101,180,73,29,77,154,197,144,156,154,250,240,190,247,88,234,129,226,207,111,58,234,152,163,86,140,185,191,59,235,96,169,110,154,191,89,121,111,255,99,222,129,185,71,176,192,93,247,71,31,123,226,179,246,155,37,39,115,159,187,207,111,74,249,238,222,141,151,157,125,193,207,102,238,169,237,126,62,121,198,25,179,155,182,94,248,143,73,121,82,91,235,169,73,150,157,174,246,206,104,75,38,231,251,114,159,116,238,229,31,252,190,75,207,250,137,43,23,246,93,122,246,5,175,202,92,99,120,209,166,75,223,127,98,74,30,87,82,174,189,244,236,243,47,89,46,207,218,222,254,71,165,89,243,134,178,47,44,162,79,41,121,223,37,231,157,215,237,221,182,101,211,211,191,186,105,235,230,175,36,121,112,77,254,236,146,243,206,235,251,190,249,216,19,159,117,235,166,173,23,125,38,169,103,215,182,124,119,146,191,191,51,239,183,215,225,170,243,67,229,136,110,64,39,73,211,180,239,170,109,243,178,44,52,96,75,125,201,232,232,232,219,218,110,121,105,95,194,154,215,79,237,156,250,198,193,242,107,7,218,7,44,217,244,192,154,250,192,101,19,175,224,152,230,152,117,73,238,112,3,186,109,114,82,95,67,175,230,224,211,191,53,245,202,212,178,175,1,221,206,207,61,61,167,239,46,110,219,117,219,86,177,98,99,251,47,73,89,252,35,108,210,44,246,252,215,218,174,91,50,197,221,99,106,234,99,14,158,231,162,7,221,129,180,171,53,149,228,234,148,124,181,109,235,214,110,247,246,79,236,92,50,213,88,169,237,250,218,83,238,149,110,16,86,210,38,195,43,238,44,237,174,21,119,213,186,59,101,223,121,75,169,95,91,249,44,101,170,239,85,169,43,206,170,82,82,87,30,60,55,111,122,122,250,134,145,145,241,125,131,252,146,71,101,126,6,196,133,52,157,206,196,227,119,95,247,245,183,149,212,135,214,197,98,30,100,173,206,146,190,153,102,118,236,218,113,213,200,200,196,199,75,234,15,207,111,122,248,232,134,209,199,46,204,107,94,202,81,63,145,212,125,177,239,181,190,125,153,121,182,203,232,240,248,207,206,206,212,223,76,178,120,141,213,254,226,238,95,148,82,14,20,83,255,143,43,221,216,244,186,59,234,96,169,166,153,89,241,166,183,164,220,208,155,123,109,234,125,14,86,70,96,21,202,242,227,78,218,182,221,81,154,146,154,44,253,110,207,211,62,122,241,186,153,153,217,151,151,228,71,147,140,103,185,217,53,218,220,173,115,61,127,243,184,13,151,30,127,243,174,191,202,92,140,241,231,54,109,217,124,101,74,254,182,54,205,255,185,255,177,183,125,234,125,103,60,167,111,62,253,50,48,240,224,154,52,53,117,227,166,173,155,47,58,64,214,183,39,229,152,77,151,190,255,196,203,206,125,86,223,119,77,219,52,43,133,137,77,39,121,112,73,89,118,127,173,117,231,220,87,88,115,240,193,242,171,116,56,234,252,80,57,226,27,208,147,147,147,211,163,35,227,111,174,201,175,205,111,90,155,182,185,56,37,255,95,79,178,27,211,116,255,100,53,249,181,131,237,177,105,239,90,100,75,93,83,203,193,83,45,119,242,114,255,222,246,105,73,57,232,98,24,181,230,27,125,39,43,115,61,103,167,156,114,202,154,61,183,205,244,94,132,59,115,160,214,200,190,252,190,217,91,134,182,231,152,166,150,251,222,201,119,182,96,224,46,29,61,55,0,243,128,189,127,203,107,142,95,197,91,95,249,232,212,149,47,136,182,44,215,227,145,36,41,165,204,246,119,124,151,111,175,152,79,45,179,171,45,99,45,205,205,7,79,149,148,100,87,246,53,160,143,155,152,152,184,223,182,109,219,190,153,36,35,35,227,143,73,173,127,153,213,206,64,113,0,77,205,187,106,201,66,3,58,117,160,121,118,146,79,207,95,131,125,161,36,109,6,247,123,10,212,233,140,189,168,214,188,109,233,246,131,57,96,133,213,124,243,96,199,223,157,117,208,107,237,218,181,43,94,19,221,180,109,211,247,7,118,215,227,10,129,164,182,117,217,14,178,90,234,222,249,155,242,190,239,159,179,182,126,224,212,217,153,217,191,45,201,73,153,235,240,250,167,164,244,124,110,212,71,37,89,159,82,238,218,183,222,18,243,177,203,103,207,30,213,125,94,74,125,222,252,212,157,143,46,109,251,203,55,221,188,230,91,155,182,108,126,109,223,108,30,181,249,174,236,251,152,120,250,114,121,246,42,107,6,246,239,124,153,237,174,244,121,184,55,73,106,169,203,134,182,150,178,56,32,253,174,126,119,39,57,124,117,126,168,28,169,13,232,190,24,201,110,29,124,119,83,102,23,26,208,169,233,107,60,39,181,254,206,65,122,159,23,227,155,187,221,193,155,155,210,23,238,252,209,148,186,229,142,20,238,219,223,62,122,197,30,168,3,106,114,99,127,168,65,238,127,176,67,74,45,247,235,235,20,174,115,51,140,92,125,245,213,183,119,70,198,111,74,22,239,228,70,50,247,251,94,113,69,181,121,199,247,190,104,122,102,40,169,77,190,185,164,124,239,200,42,122,67,23,147,183,205,138,43,252,29,74,109,234,215,251,254,26,107,126,37,77,61,104,3,107,81,25,88,121,134,146,230,128,183,20,253,167,173,7,104,136,207,175,133,178,96,168,30,40,223,186,95,79,202,10,122,67,79,102,182,109,219,182,80,255,3,37,121,115,246,111,56,126,46,37,159,78,234,190,41,162,218,242,208,222,129,170,203,89,115,204,224,95,246,79,105,151,231,142,142,142,190,234,182,219,246,62,182,164,44,198,41,151,212,63,157,158,190,102,71,239,177,35,35,35,157,212,242,123,75,178,220,147,154,79,38,245,239,210,100,95,15,127,45,103,37,251,6,35,14,174,122,110,192,101,221,173,117,208,107,118,118,118,245,229,106,14,112,77,0,135,204,64,154,183,100,174,33,119,217,224,237,131,207,90,26,194,176,105,203,230,207,165,244,61,209,189,219,92,114,222,121,123,147,188,51,201,59,159,118,241,197,15,152,93,187,247,191,38,205,217,169,121,118,74,94,127,238,150,205,55,94,122,206,249,115,33,120,165,253,250,220,2,93,245,111,46,59,231,130,255,126,40,202,115,71,220,122,253,125,218,172,153,77,146,230,105,23,95,60,176,52,52,36,73,82,235,253,151,251,120,62,156,117,126,40,28,169,13,232,190,114,79,79,127,117,178,51,60,241,198,148,186,220,130,41,55,166,105,255,248,32,249,245,124,137,221,254,245,133,73,5,146,164,164,94,63,121,15,205,213,218,182,117,119,211,115,227,85,107,255,0,171,229,148,82,191,183,55,60,33,3,165,119,190,223,47,36,89,140,131,30,27,27,59,117,199,142,29,95,58,80,126,181,148,199,246,94,246,189,75,121,151,182,185,190,246,222,92,180,249,167,169,233,29,171,234,217,63,156,154,100,87,95,100,76,105,62,182,115,234,192,49,196,247,106,53,143,61,88,146,225,225,7,142,38,179,189,3,43,191,148,249,129,123,157,206,196,163,82,107,239,124,217,59,106,6,126,120,231,206,107,246,155,91,117,116,120,252,133,75,186,72,247,107,240,93,125,245,213,183,119,58,99,111,73,237,153,214,177,219,156,159,146,190,133,94,186,53,251,253,29,149,58,120,78,74,122,23,39,249,203,102,160,94,176,99,199,142,165,83,77,102,100,100,236,9,171,93,37,243,96,238,238,58,0,142,56,115,227,96,6,154,223,88,218,144,123,210,71,63,120,223,204,228,33,135,226,164,103,109,253,192,41,3,221,161,230,198,227,79,186,230,147,103,156,49,123,201,121,231,125,35,201,95,36,249,139,77,91,46,250,114,74,125,83,157,235,105,254,195,36,169,221,238,191,103,96,176,77,41,167,61,254,138,43,6,87,154,207,250,158,114,201,121,231,237,221,180,117,243,109,73,142,238,222,103,166,147,185,153,188,250,212,148,135,173,112,248,97,169,243,67,229,136,252,34,168,203,204,136,49,216,246,207,139,188,168,148,55,78,77,29,52,246,121,241,251,113,122,122,250,235,73,185,114,223,142,114,254,250,245,167,172,56,208,103,227,137,27,79,26,29,153,248,211,133,159,21,86,73,235,45,239,138,23,127,219,30,213,223,168,43,249,153,222,89,69,150,26,25,25,233,212,148,23,244,108,154,41,165,187,24,203,84,147,190,9,208,219,182,57,96,236,239,216,250,177,135,148,172,220,56,107,134,218,254,56,169,146,243,115,128,94,192,177,225,177,199,246,214,205,232,240,196,65,31,63,29,10,109,242,143,189,175,123,103,164,88,78,167,51,254,211,189,229,30,30,30,127,196,161,45,225,29,118,218,134,13,227,7,156,230,167,148,238,83,122,95,215,100,113,96,91,173,237,216,146,196,239,91,174,225,152,100,176,150,60,107,201,182,101,103,163,25,218,59,240,103,233,153,127,186,150,252,118,223,181,84,202,167,167,167,119,236,55,245,91,41,57,185,127,67,222,190,124,227,121,164,83,210,191,242,226,170,99,94,150,113,40,234,0,56,66,212,90,146,50,215,17,87,247,15,79,88,59,219,188,44,43,173,54,248,173,220,182,144,44,7,124,82,184,188,129,12,108,201,64,251,229,227,111,218,245,204,165,251,74,201,191,205,255,119,113,240,244,124,60,243,167,147,124,215,253,111,158,254,153,229,242,60,247,242,205,47,221,180,101,243,215,207,217,178,249,14,135,194,221,73,87,39,73,157,105,158,186,116,199,89,91,63,112,74,230,226,155,251,221,149,58,191,151,58,34,27,208,101,153,114,111,187,110,219,182,58,247,72,182,215,45,201,236,138,171,134,245,103,185,168,150,90,123,103,150,24,26,28,156,249,157,44,31,3,84,246,14,181,175,174,169,207,90,248,41,53,203,173,90,215,59,242,254,132,172,208,232,156,159,113,227,3,189,231,174,181,188,107,185,37,194,59,157,206,209,37,131,253,239,173,150,63,232,109,124,212,185,248,206,158,253,245,245,99,195,99,203,54,144,135,135,135,79,104,7,155,119,47,183,111,193,246,237,219,119,149,148,222,153,60,254,91,167,51,246,211,203,165,93,183,110,221,177,109,202,91,220,83,206,130,0,0,24,5,73,68,65,84,122,235,166,54,229,176,172,48,84,74,247,19,233,89,204,166,38,175,90,169,81,60,60,60,241,224,212,188,171,167,220,79,153,153,249,246,87,238,177,194,174,210,64,147,119,14,15,15,159,176,220,190,78,103,227,163,75,106,95,88,68,211,182,91,23,255,95,155,190,191,159,82,235,113,203,229,51,58,60,254,252,36,171,154,190,232,218,175,93,187,187,164,190,179,103,83,95,104,68,157,91,56,101,191,6,111,173,101,160,255,245,178,131,234,154,82,6,223,184,52,207,187,18,194,113,40,234,0,56,66,204,205,105,60,55,171,68,91,95,243,180,139,47,158,107,184,213,90,206,185,252,194,159,74,155,87,36,185,110,185,67,47,57,239,188,111,165,230,27,73,142,58,123,235,69,251,53,32,15,166,38,23,206,149,33,175,223,116,249,230,197,239,227,179,182,254,201,113,53,245,23,231,211,244,47,28,213,228,21,73,102,75,202,239,110,218,114,209,207,61,254,138,43,6,23,202,123,238,229,23,61,179,214,188,62,37,199,14,52,125,211,138,30,58,37,151,205,253,91,95,125,206,101,23,45,62,229,62,247,242,15,61,114,32,3,31,73,239,34,119,139,199,220,249,58,191,183,58,82,67,56,150,93,210,121,112,54,239,232,14,102,113,238,231,154,252,206,206,131,247,62,167,180,165,47,134,103,111,119,240,146,161,193,217,95,73,50,54,159,209,115,59,195,227,107,211,116,95,189,48,87,236,186,117,235,142,61,234,168,251,188,184,164,246,78,201,114,253,208,108,179,223,52,51,37,229,43,53,139,115,63,14,117,134,199,127,174,150,217,45,59,119,238,156,218,47,109,211,190,189,182,205,190,59,211,90,206,190,237,182,189,239,30,29,29,125,229,194,114,204,27,54,108,28,79,219,190,46,101,110,145,146,121,123,154,182,237,251,227,153,158,222,241,185,206,240,216,95,167,103,254,229,182,148,79,143,140,140,191,182,148,230,226,100,230,43,221,238,208,137,77,211,253,161,146,242,107,153,155,58,230,192,117,85,219,183,215,82,206,235,41,223,123,70,71,198,215,215,210,125,231,66,79,255,232,232,232,112,237,54,111,156,31,28,49,95,133,229,227,59,167,174,189,114,153,44,15,185,169,169,169,219,70,71,198,95,87,147,133,70,229,80,83,242,55,157,206,248,139,214,174,29,250,243,133,217,26,70,71,71,191,175,182,245,61,233,139,225,169,111,186,51,83,18,222,3,126,160,41,67,159,29,29,153,120,125,25,104,63,213,52,205,116,187,167,61,185,14,148,77,181,182,175,78,250,194,34,174,152,220,53,249,119,139,175,6,186,215,244,14,148,173,201,25,163,195,19,231,12,28,149,191,218,182,109,219,158,147,78,58,233,62,67,67,107,206,175,53,189,13,226,36,253,131,74,151,234,214,242,254,166,228,165,203,236,218,85,74,251,23,203,108,79,73,253,114,111,134,77,154,103,141,142,142,110,159,156,156,252,135,36,117,98,98,98,253,236,222,250,107,169,217,111,241,163,187,210,3,125,168,234,0,88,189,161,110,185,104,211,214,139,102,150,219,87,107,123,195,150,115,46,120,206,161,58,119,109,235,47,151,166,124,50,169,79,237,174,153,189,110,211,214,205,87,231,242,139,54,36,229,196,164,254,77,74,185,50,53,191,186,236,177,201,135,74,242,194,166,100,235,166,173,155,183,39,185,165,182,229,231,183,108,122,198,39,151,75,223,107,232,246,193,223,155,89,51,251,67,37,121,98,106,62,189,105,203,230,237,41,249,102,82,31,148,185,158,231,169,161,129,193,215,245,30,115,217,153,231,255,221,166,173,23,189,32,169,127,144,82,223,113,252,205,187,126,123,211,214,205,83,185,252,162,225,154,124,87,106,102,106,201,115,255,252,172,243,15,24,162,121,119,185,117,205,236,27,239,179,103,240,199,147,156,90,154,122,197,166,173,155,119,39,217,91,107,59,154,228,154,82,243,202,90,246,15,217,187,43,117,126,111,116,68,246,64,215,21,26,254,219,119,111,191,182,212,114,206,252,146,189,207,175,117,102,53,189,207,169,75,6,242,236,222,253,213,175,213,164,111,241,135,148,156,159,58,240,149,206,200,120,237,140,140,215,53,71,29,115,75,73,237,187,200,219,90,127,106,185,5,20,106,105,63,189,36,175,183,151,12,78,46,228,213,27,218,48,57,57,121,101,106,255,128,165,146,242,236,218,54,59,23,210,15,52,237,182,249,240,137,125,105,106,121,238,50,139,70,204,118,235,192,11,146,244,13,106,44,201,43,83,219,47,166,14,124,123,160,105,183,205,79,52,191,170,57,154,119,76,239,248,76,74,121,69,223,251,75,126,43,117,224,235,11,229,171,109,179,179,119,110,234,154,236,30,234,230,249,57,140,13,143,201,157,219,223,150,164,183,71,254,248,212,92,184,231,182,153,61,61,229,254,124,146,125,203,161,151,242,233,181,107,143,122,235,61,93,214,59,224,187,107,234,123,219,110,249,234,236,76,189,173,29,40,95,170,201,107,210,223,120,190,177,52,109,223,202,126,243,141,211,207,245,164,57,173,150,122,217,236,76,189,173,51,50,94,135,6,215,126,43,181,44,251,183,211,28,160,215,119,122,122,251,23,210,95,199,73,146,154,242,166,169,169,169,219,150,57,36,181,233,110,77,223,66,68,245,204,218,54,159,239,140,140,183,157,145,241,58,59,83,119,221,145,1,124,171,117,168,234,0,88,189,146,60,49,169,79,93,238,167,148,242,35,7,207,225,206,219,178,233,130,207,167,105,30,147,228,178,154,124,59,201,169,37,229,230,148,252,214,158,163,142,127,74,173,89,113,182,163,238,192,113,191,92,82,222,145,185,30,211,241,36,15,45,3,237,170,166,94,187,228,188,243,246,158,246,133,255,120,114,169,249,153,146,252,223,249,201,2,30,92,210,236,78,234,59,7,135,6,31,121,201,153,231,237,183,44,248,101,103,63,227,127,213,182,126,127,146,11,107,234,45,153,251,206,158,73,242,161,166,228,81,91,206,62,255,131,119,188,22,238,156,143,61,241,89,183,214,246,246,31,168,53,111,79,205,246,100,110,194,131,90,243,174,217,38,223,95,203,254,113,209,201,93,171,243,123,163,35,230,139,160,51,50,126,67,146,133,185,8,239,228,116,102,115,70,70,38,126,166,164,238,139,153,46,249,31,83,83,219,255,124,105,186,78,103,124,83,106,54,103,21,211,92,149,154,23,77,78,111,223,175,183,42,153,95,174,120,160,254,219,74,249,148,90,158,49,57,189,237,67,189,155,70,71,198,127,161,167,199,244,32,231,46,207,157,156,222,182,226,34,49,195,195,227,143,104,74,46,207,190,37,132,15,228,115,233,121,100,93,83,127,114,231,206,29,239,95,146,102,112,116,100,252,127,246,76,29,120,32,183,148,166,125,194,228,228,228,157,234,125,190,59,127,239,99,99,99,199,215,110,243,167,171,156,7,250,11,179,221,161,39,46,93,200,102,100,100,236,169,37,229,195,139,27,74,253,249,169,169,29,111,95,46,131,209,145,241,151,213,228,119,247,165,205,147,231,23,14,217,79,103,120,226,247,83,234,207,47,188,30,104,243,144,237,187,182,255,91,146,12,15,143,157,217,148,178,210,138,143,43,170,201,238,166,105,207,92,174,238,59,157,141,15,75,109,255,33,253,141,237,229,124,57,61,55,87,37,249,245,201,157,219,95,187,82,226,78,103,226,241,169,61,203,146,39,25,28,42,27,182,109,219,182,226,163,185,209,145,137,103,215,212,131,46,114,180,180,44,109,173,63,60,61,189,227,255,36,243,79,61,218,102,223,151,78,205,101,83,211,219,207,221,63,139,222,178,222,61,117,48,50,50,254,15,37,89,92,142,124,112,168,28,189,109,219,182,61,89,198,126,191,203,82,95,50,53,181,227,158,138,91,4,224,110,114,164,246,64,223,221,131,120,150,237,25,157,154,218,126,89,74,121,252,146,184,223,165,118,149,90,54,173,212,120,78,230,226,179,75,45,207,72,178,220,32,165,229,206,95,39,119,110,127,115,74,158,92,83,62,190,226,153,75,182,164,148,51,14,212,120,78,230,122,6,7,102,243,184,131,188,143,61,169,245,229,109,93,126,149,160,37,102,39,119,110,127,101,169,229,252,222,1,151,203,248,251,102,160,62,230,206,54,158,151,186,171,191,247,29,59,118,220,184,230,232,193,167,165,214,151,39,217,177,82,186,154,250,190,102,160,62,225,64,171,64,30,78,165,109,31,87,83,127,50,75,158,44,244,39,202,150,82,186,143,93,169,238,167,166,174,253,231,166,91,79,43,41,239,79,207,224,191,254,44,234,91,83,186,75,99,197,15,248,153,81,218,108,92,146,201,59,14,212,120,78,146,201,157,219,254,52,37,79,78,114,197,10,73,110,42,41,47,108,107,158,219,187,241,128,49,208,229,224,79,59,14,85,29,12,14,14,222,145,39,45,194,65,0,142,64,71,76,15,244,232,240,196,115,106,211,14,38,73,169,205,204,228,206,109,239,187,179,121,13,15,143,63,162,105,234,98,124,110,219,14,124,106,122,250,218,149,231,250,205,124,15,87,29,248,238,210,102,125,109,218,249,1,71,205,87,218,118,239,231,167,167,167,87,94,32,163,199,233,167,159,62,180,123,247,13,63,156,165,75,3,207,230,179,203,132,95,44,234,116,58,167,180,109,51,209,52,229,196,210,150,182,45,117,119,173,131,87,79,79,127,117,114,53,231,237,181,97,195,248,35,7,6,234,233,189,219,106,45,211,221,238,208,231,175,187,238,234,235,231,150,83,110,159,182,111,111,251,247,83,83,83,43,173,98,148,36,101,124,195,248,131,219,210,140,182,165,187,190,148,172,73,91,218,166,214,127,218,177,107,199,23,115,240,121,167,15,232,238,252,189,247,58,253,244,211,135,174,159,190,254,97,221,38,27,154,218,172,155,63,199,109,243,239,247,234,149,142,235,116,58,15,74,154,197,65,19,165,212,47,204,135,3,44,147,118,227,163,147,238,195,123,210,126,98,114,114,242,171,203,165,29,25,25,123,66,239,140,20,109,59,123,217,244,244,244,13,203,157,115,112,176,249,240,182,109,219,174,59,229,1,167,220,119,239,218,189,223,223,54,101,60,233,29,13,62,240,197,169,169,107,15,190,138,229,188,147,79,62,249,126,123,246,204,126,239,64,154,209,185,107,187,124,163,148,246,239,230,99,238,75,239,64,209,182,45,95,154,158,222,190,223,108,26,11,39,238,140,76,124,33,169,15,93,76,95,243,200,249,208,142,85,153,88,63,49,49,51,208,62,48,201,72,41,89,147,52,255,177,103,207,154,127,188,225,134,47,223,50,49,49,177,126,118,182,93,124,122,48,48,83,254,207,246,221,219,175,77,146,19,78,56,245,184,181,107,111,91,12,133,42,109,221,61,57,61,185,234,94,251,187,82,7,163,195,19,79,223,247,153,144,76,77,237,120,111,86,184,238,239,200,245,3,192,189,215,17,211,128,6,238,221,70,70,198,207,40,201,39,22,94,215,148,143,239,220,185,237,144,198,49,2,192,225,112,68,134,112,0,247,62,165,102,201,148,134,173,216,94,0,190,35,105,64,3,119,217,134,13,27,199,151,204,12,243,31,235,215,175,251,235,195,86,32,0,56,132,52,160,129,187,108,160,116,251,166,125,172,41,111,185,234,170,171,150,29,152,7,0,71,58,13,104,224,46,57,225,132,83,143,75,41,189,115,53,223,50,48,208,254,217,97,43,16,0,28,98,26,208,192,93,178,102,205,109,231,100,223,92,221,169,201,219,122,151,148,7,128,239,52,71,234,82,222,192,189,68,83,155,91,106,211,62,127,225,117,109,135,254,234,112,150,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,246,224,144,0,0,0,0,64,208,255,215,70,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,0,224,127,201,73,0,224,60,187,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":37143,"duration_micros":1137,"top":310.0,"left":40.0,"width":640.0,"height":192.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,156,93,117,125,255,241,247,247,156,187,204,190,100,102,146,204,220,59,75,146,9,59,1,4,4,41,42,45,104,75,69,65,220,106,177,84,171,162,45,208,31,105,5,235,130,141,117,171,88,27,127,173,248,67,90,170,181,88,181,10,8,162,88,168,11,21,68,129,0,1,18,18,200,50,203,189,55,51,73,102,95,238,122,206,247,247,199,44,185,147,89,50,51,153,201,100,121,61,31,143,225,145,243,61,231,158,243,153,59,19,242,185,223,243,57,159,175,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,118,152,165,14,96,177,36,18,221,175,149,99,94,47,163,115,173,181,39,27,163,58,107,85,42,201,89,234,216,0,0,0,142,51,190,49,26,176,86,9,99,204,118,89,109,146,111,31,173,171,91,246,171,165,14,108,49,28,87,9,116,251,222,189,205,142,13,124,80,210,31,203,42,186,212,241,0,0,0,156,208,140,98,146,254,211,55,185,127,169,95,190,124,199,82,135,179,80,142,139,4,186,179,115,112,69,214,207,252,173,49,250,243,188,225,109,146,125,88,50,79,184,210,150,112,216,180,87,84,84,244,27,99,252,37,11,20,0,0,224,56,100,173,117,122,123,123,203,210,105,91,239,73,167,75,246,53,146,121,163,164,83,14,28,163,255,23,116,66,159,94,177,162,164,115,9,67,93,16,199,124,2,29,239,232,122,191,49,230,203,214,170,92,146,100,204,55,141,103,239,170,171,91,246,216,18,135,6,0,0,112,66,75,36,186,47,182,174,121,191,172,125,175,36,25,163,62,107,237,95,71,86,86,221,181,212,177,157,176,98,123,186,191,22,239,232,182,241,142,110,155,232,236,185,167,163,163,251,204,165,142,9,0,0,0,19,117,116,116,159,153,232,236,185,103,44,111,139,237,233,254,218,82,199,116,66,74,116,246,220,55,254,67,72,116,127,104,169,227,1,0,0,192,204,98,137,238,15,229,77,126,222,183,212,241,156,80,242,146,231,120,34,209,125,241,82,199,3,0,0,128,217,73,36,186,47,142,119,116,199,73,162,143,160,188,178,141,56,37,27,0,0,0,199,158,142,142,238,51,199,146,104,202,57,22,89,188,163,235,253,227,211,254,204,60,3,0,0,28,179,70,103,162,237,200,87,215,251,151,58,158,227,82,103,231,224,138,68,103,119,47,53,207,0,0,0,199,135,177,154,232,68,103,119,111,103,231,224,138,165,142,231,184,51,86,186,145,232,236,185,103,169,99,1,0,0,192,194,24,235,206,113,44,149,114,28,19,125,160,219,247,238,109,118,252,192,43,146,228,74,235,86,174,92,246,194,82,199,4,0,0,128,195,215,209,209,125,166,39,61,47,73,190,147,91,123,44,172,88,232,44,117,0,179,49,186,60,183,100,204,55,73,158,1,0,0,142,31,43,87,46,123,65,198,124,83,202,203,249,142,114,199,68,2,45,233,143,37,201,120,150,85,107,0,0,0,142,51,121,57,222,31,47,105,32,199,139,68,162,251,181,163,79,104,190,180,212,177,0,0,0,96,113,196,59,186,95,26,237,180,246,218,165,142,229,80,142,254,25,104,199,188,126,228,15,246,225,165,13,4,0,0,0,139,103,52,215,27,207,253,142,94,71,127,2,109,116,238,232,31,158,88,218,64,0,0,0,176,120,70,115,189,241,220,239,232,117,212,39,208,214,218,147,37,201,149,182,44,117,44,0,0,0,88,28,99,185,222,88,238,119,52,59,234,19,104,99,84,39,73,225,176,105,95,234,88,0,0,0,176,56,198,114,189,177,220,239,104,118,212,39,208,214,170,84,146,42,42,42,250,151,58,22,0,0,0,44,142,177,92,111,44,247,59,154,29,245,9,180,70,99,52,198,248,75,29,8,0,0,0,22,71,94,174,119,212,231,167,71,125,128,0,0,0,192,209,132,4,26,0,0,0,152,3,18,104,0,0,0,96,14,72,160,1,0,0,128,57,32,129,6,0,0,0,230,128,4,26,0,0,0,152,3,18,104,0,0,0,96,14,72,160,1,0,0,128,57,32,129,6,0,0,0,230,128,4,26,0,0,0,152,3,18,104,0,0,0,96,14,72,160,1,0,0,128,57,32,129,6,0,0,0,230,128,4,26,0,0,0,152,3,18,104,0,0,0,96,14,72,160,1,0,0,128,57,32,129,6,0,0,0,230,128,4,26,0,0,0,152,3,18,104,0,0,0,96,14,72,160,1,0,0,128,57,32,129,6,0,0,0,230,128,4,26,0,0,0,152,3,18,104,0,0,0,96,14,72,160,1,0,0,128,57,32,129,6,0,0,0,230,128,4,26,0,0,0,152,3,18,104,0,0,0,96,14,72,160,1,0,0,128,57,32,129,6,0,0,0,230,128,4,26,0,0,0,152,3,18,104,0,0,0,96,14,72,160,1,0,0,128,57,32,129,6,0,0,0,230,128,4,26,0,0,0,152,3,18,104,0,0,0,96,14,72,160,1,0,0,128,57,32,129,6,0,0,0,230,128,4,26,0,0,0,152,131,192,82,7,0,0,199,171,186,186,85,39,187,178,103,123,178,47,39,18,173,155,37,249,75,29,211,82,107,106,106,170,200,229,116,211,248,128,111,219,99,137,214,187,150,48,36,0,152,51,18,104,0,51,138,70,163,103,74,206,133,51,29,99,124,103,208,55,182,211,24,175,61,22,139,237,144,100,167,59,182,190,110,213,27,173,227,53,78,183,223,90,165,140,113,246,249,190,237,116,28,111,91,44,22,75,78,119,108,99,99,99,173,231,153,15,29,136,67,219,218,19,45,223,61,196,183,36,73,138,70,163,133,146,243,158,252,177,116,58,249,157,125,251,246,13,206,230,245,99,234,234,26,46,115,28,173,58,48,226,255,38,22,139,189,16,137,52,92,103,228,127,221,106,228,86,95,36,210,248,143,241,120,235,95,207,229,220,199,35,207,243,138,100,157,191,29,31,48,186,87,18,9,52,128,99,10,9,52,128,25,89,235,156,99,100,238,156,241,24,99,101,36,201,186,138,70,27,119,75,246,43,101,101,37,119,108,221,186,53,51,197,177,111,147,53,215,77,119,174,145,243,88,57,70,146,117,179,145,72,195,189,190,239,126,116,207,158,221,173,147,14,206,168,66,142,205,75,198,236,29,146,102,149,64,199,98,177,100,180,174,241,106,25,253,193,216,88,65,176,160,83,210,3,179,121,253,168,128,227,152,59,101,243,18,104,163,181,35,127,112,222,158,255,57,194,72,55,74,250,168,164,220,28,206,15,0,56,10,81,3,13,96,97,89,173,146,53,255,183,175,111,248,193,234,234,147,75,15,243,108,65,35,243,46,215,241,159,168,173,109,124,213,130,196,151,207,209,221,249,155,86,206,59,231,242,242,104,180,233,226,9,201,179,244,179,209,25,120,57,242,19,249,199,26,105,135,72,158,1,224,184,64,2,13,96,81,24,217,55,20,134,211,95,93,160,211,213,186,142,190,183,114,101,115,205,2,157,79,146,20,10,185,15,74,202,142,15,24,93,83,87,87,87,61,235,19,248,246,234,252,77,99,205,120,41,130,47,231,142,9,231,182,230,211,135,17,234,184,149,43,155,107,162,145,70,59,254,21,109,120,207,161,95,5,0,88,72,36,208,0,230,198,232,154,88,188,213,228,125,57,57,47,184,92,198,185,64,86,255,156,127,168,149,189,182,177,182,241,212,153,78,231,91,231,148,252,243,21,36,131,229,86,238,201,86,230,175,36,13,231,29,218,28,116,179,211,150,126,204,199,174,93,187,250,100,245,205,252,49,99,2,127,56,155,215,214,212,212,148,200,232,218,188,161,225,96,129,243,147,177,141,120,188,229,55,50,222,42,43,115,142,113,252,230,246,68,203,247,22,34,230,144,50,19,62,68,216,209,234,25,0,192,145,67,13,52,128,195,101,59,58,118,236,147,180,79,210,83,209,186,198,101,50,186,102,108,167,111,204,133,146,94,154,237,201,118,116,239,232,151,212,47,233,229,250,186,166,221,214,216,251,198,207,37,125,64,210,23,181,128,165,16,142,236,247,125,153,15,142,109,155,145,216,191,117,168,215,133,195,69,111,148,85,249,216,182,149,254,125,215,174,93,125,249,199,196,98,177,184,164,248,66,197,42,73,54,232,86,203,63,225,155,121,0,192,146,34,129,62,66,34,111,253,218,180,93,9,128,197,16,191,239,47,22,107,102,114,166,243,90,57,122,72,246,64,2,45,99,35,243,189,80,123,162,229,254,250,72,227,75,86,58,117,244,194,77,117,117,171,235,18,137,93,109,243,61,231,193,74,42,74,30,237,239,27,138,73,138,74,146,172,121,99,125,125,253,154,246,246,246,157,51,189,206,90,251,78,51,241,173,248,126,254,70,52,26,109,150,156,223,29,219,54,198,62,215,222,222,254,84,222,254,181,146,115,73,222,254,31,183,183,183,39,162,209,104,161,49,230,12,107,157,106,73,203,36,19,55,198,123,217,90,243,166,145,235,250,235,242,175,99,140,121,125,52,218,80,144,63,54,214,77,100,164,101,156,255,142,188,163,227,177,88,235,79,52,141,72,164,225,82,99,180,122,108,59,152,113,31,216,189,119,119,231,52,135,155,166,166,166,21,158,231,213,91,235,52,24,223,4,173,163,14,199,241,219,218,218,218,118,77,119,13,0,56,30,144,64,3,88,80,198,247,7,172,57,80,29,230,203,28,162,45,156,157,49,33,183,86,207,202,104,188,12,36,96,115,53,146,22,44,129,222,186,117,107,38,26,109,250,55,89,251,169,3,23,53,127,40,77,44,71,201,215,216,216,88,235,229,244,174,188,161,88,60,222,250,171,137,71,185,107,101,53,222,189,196,183,206,95,73,26,79,160,125,223,57,197,49,7,186,155,120,190,46,174,175,171,63,207,183,206,157,178,90,49,126,26,171,219,172,19,24,150,245,167,238,132,98,245,126,201,188,63,127,168,168,168,232,65,73,131,74,169,66,110,94,7,21,171,111,75,154,54,129,54,214,121,139,100,255,114,108,59,27,210,111,37,29,156,64,155,250,186,166,43,173,236,39,114,89,123,222,88,37,160,53,86,178,146,239,25,69,163,141,91,37,125,62,22,107,253,79,205,208,210,16,0,142,85,212,64,3,152,171,25,19,34,223,56,175,62,104,100,199,76,199,7,237,140,9,180,242,147,103,73,242,93,191,111,186,67,231,203,247,237,15,39,12,140,180,217,155,54,46,47,171,9,117,210,70,186,67,135,40,43,113,102,254,160,32,215,56,215,89,227,220,111,148,151,60,207,147,49,102,186,159,209,156,238,74,76,85,95,29,141,54,220,98,141,189,79,70,231,77,255,66,157,38,171,187,35,145,198,207,204,229,122,0,112,172,32,129,6,48,87,211,38,97,245,117,245,111,49,210,39,242,134,226,214,230,126,62,211,201,178,198,153,182,160,55,26,93,245,106,73,231,228,31,174,5,174,41,150,164,68,162,245,57,43,109,202,27,58,163,174,174,241,236,233,142,183,70,239,205,223,54,238,65,9,248,60,88,217,107,15,125,212,210,170,171,107,184,76,214,252,253,108,143,55,210,39,162,209,85,235,14,125,36,0,28,91,40,225,0,48,55,190,46,137,70,27,138,242,135,140,53,43,172,177,231,89,107,174,156,112,172,209,141,137,120,98,88,243,16,141,54,93,34,235,127,101,226,168,249,218,76,43,19,30,6,235,200,220,101,101,207,29,27,112,100,223,44,233,217,131,15,108,172,109,60,213,147,46,30,143,72,122,188,173,173,109,203,2,198,210,37,171,123,37,187,67,142,122,100,204,43,177,216,238,39,53,250,193,37,18,105,184,214,200,252,251,120,224,178,215,198,227,109,255,177,128,215,159,150,49,19,147,103,43,251,77,215,234,174,156,114,219,36,201,149,123,145,149,115,235,132,217,105,223,191,65,210,130,118,79,1,128,165,70,2,13,96,110,140,62,32,107,62,144,63,100,165,73,165,204,86,246,67,241,88,219,125,58,4,215,248,239,136,70,27,14,212,217,250,90,45,99,254,64,214,30,60,3,156,242,173,238,152,119,220,135,138,35,168,251,114,89,125,109,124,192,152,15,74,250,188,14,42,205,240,140,125,243,132,73,248,188,222,207,11,224,7,142,107,175,107,107,107,235,89,192,115,46,136,166,149,77,77,185,188,15,24,146,94,140,199,219,62,168,137,239,207,3,145,72,228,113,163,192,115,26,123,40,211,232,154,154,154,154,191,154,235,18,233,0,112,52,163,132,3,192,194,51,218,109,140,153,85,175,53,43,125,70,214,220,57,254,101,204,223,72,154,84,62,97,172,121,119,34,209,178,109,193,99,29,213,210,210,210,33,233,7,121,67,209,104,180,233,119,14,58,204,145,153,176,12,121,214,83,230,71,11,20,66,54,155,11,92,127,52,38,207,146,148,11,216,9,181,232,86,186,95,83,212,125,199,227,241,46,35,251,96,222,80,81,161,91,216,176,216,241,1,192,145,196,12,52,128,57,177,210,99,70,218,61,97,208,216,21,178,230,28,73,53,163,7,173,146,244,47,209,104,67,85,44,214,246,197,195,185,158,145,249,47,207,234,111,23,51,121,206,187,216,119,101,245,246,241,77,235,95,37,233,209,177,237,72,164,241,2,73,107,242,98,251,78,34,145,216,191,64,215,254,65,103,231,206,189,11,114,174,69,16,139,181,62,164,209,169,247,145,246,120,58,59,18,105,248,19,201,212,59,178,245,146,51,94,214,99,101,207,202,127,173,53,182,234,8,135,11,0,139,138,4,26,192,156,24,163,59,98,177,214,111,79,177,43,80,95,215,244,118,107,236,63,74,170,149,36,89,243,247,13,117,13,143,183,37,218,30,155,254,132,246,126,89,211,63,114,188,74,100,244,214,177,93,86,218,20,10,59,215,181,31,180,64,201,98,73,167,135,255,59,28,42,234,147,70,22,72,177,50,239,139,70,163,31,31,171,187,54,214,92,165,188,6,23,214,216,239,46,212,181,141,213,66,214,81,47,22,83,95,215,248,231,185,172,221,32,169,102,172,15,246,72,179,142,233,155,179,24,99,10,166,221,9,0,199,32,74,56,0,204,213,116,153,82,174,61,209,242,93,25,221,152,63,232,203,124,120,166,147,185,158,249,88,44,222,122,109,44,222,122,109,44,209,250,54,229,61,184,103,164,115,51,41,239,79,14,63,228,217,25,169,211,53,249,75,123,151,251,190,115,153,36,69,163,209,66,25,251,190,252,195,37,239,151,11,117,109,107,236,192,66,157,107,177,68,163,13,55,88,163,219,53,118,167,97,150,114,244,130,6,112,156,97,6,26,192,28,217,25,63,120,175,88,81,253,64,103,199,254,172,164,160,36,141,46,235,253,94,205,110,249,109,107,101,63,111,100,14,172,234,103,244,209,154,154,154,111,30,169,135,208,140,239,221,99,29,231,255,140,109,59,198,188,67,210,143,36,247,18,229,37,142,86,186,51,190,56,29,65,22,211,204,137,172,99,139,243,143,48,230,192,86,36,18,137,202,154,47,31,244,138,148,172,126,41,217,39,228,104,207,129,171,152,183,72,186,98,108,51,48,199,254,211,192,241,224,195,235,63,17,9,186,230,10,223,56,231,24,217,136,140,34,178,26,89,153,213,40,46,171,184,149,137,59,214,127,54,235,217,7,239,216,248,185,5,111,209,137,197,67,2,125,148,114,140,81,81,97,80,229,197,161,57,191,214,90,41,231,249,74,103,61,165,210,57,101,114,190,172,61,244,4,80,40,224,170,162,52,172,96,96,126,55,38,124,223,42,147,243,149,202,228,148,74,231,228,249,135,190,166,49,70,197,5,1,149,151,132,39,237,243,60,171,129,100,70,67,201,236,156,99,9,24,95,69,38,167,160,241,36,73,195,54,168,148,31,80,129,147,83,161,201,201,200,202,202,104,192,15,41,59,115,62,136,73,166,93,164,67,146,180,105,211,166,108,52,210,184,73,210,133,99,99,171,150,175,170,154,97,73,232,9,10,11,67,63,74,37,179,59,36,53,143,14,69,195,225,194,119,75,250,151,249,70,60,23,237,123,218,159,136,70,26,119,234,64,173,243,31,213,213,213,253,213,193,75,119,251,190,238,61,18,241,28,14,227,155,164,220,252,146,19,179,124,198,23,248,118,173,204,212,185,174,177,129,171,100,70,63,20,141,120,200,113,237,53,83,61,244,24,137,52,92,106,200,153,113,2,90,191,126,195,178,108,192,187,206,74,87,27,233,124,43,105,252,115,104,254,255,57,173,150,75,58,199,200,202,26,163,64,192,232,250,155,111,125,202,72,247,6,115,238,157,27,55,110,232,94,130,240,49,7,36,208,71,169,130,144,171,223,57,163,78,239,190,236,180,57,191,54,155,243,213,51,144,82,108,95,191,118,198,251,212,210,209,167,61,93,131,234,31,202,40,231,77,223,24,161,174,186,88,127,122,249,25,90,85,91,49,175,152,135,146,57,237,237,29,212,174,68,175,118,38,250,212,217,61,164,238,254,148,122,6,82,211,190,38,28,116,117,193,105,117,250,147,223,63,125,210,190,174,129,148,126,242,235,157,250,217,166,214,57,199,82,237,38,245,250,146,54,173,9,141,148,206,254,98,176,94,155,146,43,117,78,97,167,206,47,220,163,98,39,167,33,63,160,31,246,175,85,107,166,124,206,231,95,12,174,172,194,206,200,36,173,149,81,198,58,242,142,194,228,222,218,67,6,21,208,65,93,52,6,237,224,208,108,207,191,99,199,142,116,52,218,112,155,108,254,18,212,230,163,209,104,244,238,69,234,1,125,176,156,172,189,83,198,140,61,252,24,116,156,192,31,203,154,107,198,195,145,54,237,217,211,58,169,71,244,17,50,225,3,204,76,221,78,178,161,108,191,172,123,224,88,217,211,164,169,11,150,155,86,54,53,229,140,125,221,116,231,50,70,171,39,94,88,255,60,117,242,28,137,26,77,236,7,78,9,7,142,119,235,215,175,47,204,5,139,111,200,90,239,227,146,42,230,243,241,209,72,231,75,58,63,27,240,62,122,195,205,183,126,46,152,27,188,125,227,198,141,199,218,93,174,19,6,9,244,81,202,113,140,86,46,43,214,101,231,53,30,246,185,118,198,123,245,208,111,118,233,23,207,182,233,229,246,30,245,15,165,167,156,29,14,135,2,58,247,228,149,122,213,73,135,189,146,176,36,233,249,157,251,244,63,79,183,232,167,191,221,173,29,177,94,101,114,222,164,99,28,99,180,188,178,104,202,239,115,79,215,144,182,238,158,95,131,131,138,64,74,23,21,37,116,97,81,66,146,20,203,150,232,185,212,114,157,20,234,214,229,165,187,85,233,166,212,227,21,232,241,161,168,90,117,116,36,208,53,129,33,93,92,60,114,7,175,215,11,235,133,84,141,58,115,197,75,28,213,100,135,106,79,87,95,215,120,173,149,242,31,26,123,110,174,229,23,233,116,242,59,161,80,209,103,242,150,181,94,99,173,243,14,73,223,154,99,184,243,226,203,189,223,145,127,160,123,136,53,255,119,226,17,230,95,181,68,73,161,99,109,159,205,155,37,182,214,148,76,119,108,44,22,75,70,34,141,143,153,3,11,191,68,162,209,198,203,99,177,214,159,28,124,90,207,245,55,204,84,105,97,173,113,39,60,64,105,237,84,191,156,142,49,129,219,100,39,252,252,41,225,192,113,237,198,143,124,234,77,25,99,191,110,198,202,51,102,52,118,59,120,154,91,61,35,42,36,125,41,27,40,249,63,215,223,252,201,15,221,254,165,207,30,252,247,21,71,129,163,111,122,11,11,110,77,164,66,55,188,237,85,250,226,135,95,175,247,188,241,52,213,175,40,147,235,44,254,191,103,235,214,212,104,253,59,207,215,93,127,115,185,126,247,220,6,45,43,43,92,244,107,30,202,144,31,210,222,92,145,58,114,197,218,155,43,82,58,111,118,110,169,173,14,245,233,230,154,39,117,115,205,147,186,166,226,37,213,5,142,157,117,39,154,151,53,151,53,172,108,56,45,18,105,252,172,53,154,176,176,136,177,115,47,189,216,183,111,223,160,177,154,80,111,235,200,252,77,115,115,243,228,90,159,69,144,72,236,222,46,233,23,211,237,119,28,239,129,35,17,199,84,172,19,232,200,223,54,178,127,84,95,95,127,254,116,239,141,177,118,98,159,106,171,111,69,163,141,111,91,177,98,205,114,73,106,108,108,172,141,70,154,254,159,149,249,211,153,174,107,100,183,231,111,59,114,174,173,175,175,63,95,7,90,219,173,140,214,53,126,69,86,239,62,248,181,204,64,227,120,117,195,205,183,222,98,141,255,35,163,41,147,231,148,164,31,26,233,125,214,234,66,199,113,26,171,139,3,5,213,197,129,2,199,113,26,173,213,133,178,230,207,36,253,112,244,216,131,69,141,244,224,141,183,124,242,230,69,253,38,48,47,204,64,159,64,154,163,149,186,254,234,115,84,81,90,160,127,251,241,243,138,31,129,103,178,140,145,234,151,151,234,246,245,151,233,171,247,62,171,187,30,124,94,3,195,153,5,189,70,192,248,42,114,178,10,200,87,218,6,148,178,211,255,90,111,78,213,104,200,15,42,236,228,148,242,3,218,51,58,195,27,52,254,120,157,154,47,35,207,58,114,100,85,230,166,149,180,1,165,253,192,132,12,160,208,201,169,200,100,229,201,40,99,93,13,251,193,41,174,118,128,145,20,118,114,42,118,178,178,86,35,113,250,1,121,26,169,20,117,141,175,96,222,196,174,145,85,192,248,10,25,79,190,140,114,71,83,41,135,213,221,209,72,227,221,249,67,41,101,37,77,89,245,186,195,4,236,119,230,117,25,147,251,55,163,192,223,105,116,54,219,74,167,166,135,115,87,73,250,222,124,206,55,87,70,230,91,86,246,119,167,24,255,126,123,123,123,226,72,196,48,21,223,79,191,232,152,224,176,164,177,190,203,151,88,223,121,50,149,204,42,26,105,148,149,90,226,241,214,85,227,47,112,252,123,101,221,207,74,227,245,203,85,178,250,65,48,144,83,52,210,40,47,39,77,159,223,102,199,119,88,199,187,95,214,253,178,198,127,30,246,205,242,157,55,71,35,35,119,143,114,89,203,60,51,78,24,239,221,176,161,160,100,200,251,23,73,239,153,226,23,63,38,107,62,149,41,113,190,119,231,134,13,195,211,156,162,109,244,235,183,146,190,113,221,134,13,69,161,65,255,93,50,246,239,52,182,138,167,36,201,24,107,117,219,13,55,223,186,110,176,216,253,224,55,55,108,152,190,38,18,71,20,9,244,9,166,164,48,164,183,95,114,178,98,123,251,245,253,95,108,215,224,60,30,208,155,143,130,80,64,31,190,242,108,237,237,25,210,247,126,190,93,222,12,181,216,179,21,48,190,170,221,164,154,195,61,90,19,234,81,145,147,85,183,87,168,29,233,74,5,166,121,206,109,216,15,106,200,15,202,26,169,207,11,43,59,58,3,125,78,97,167,170,2,35,165,102,177,76,169,246,229,138,212,16,236,215,217,133,157,122,42,89,171,23,83,53,202,90,71,37,78,70,171,66,125,90,19,238,81,52,56,160,180,31,80,183,87,160,157,153,74,237,76,87,104,192,159,248,208,167,145,85,133,155,86,125,112,64,171,194,189,106,8,246,201,179,142,246,231,138,212,158,45,211,238,76,185,6,253,160,214,132,122,117,86,225,129,53,52,74,221,140,206,41,234,84,117,48,169,206,108,177,182,166,170,102,252,96,112,148,234,147,113,174,105,107,219,61,175,149,245,226,241,120,87,125,164,97,163,149,249,216,216,152,53,246,111,36,221,163,217,117,244,56,44,158,205,60,232,152,224,129,110,34,7,98,152,215,7,130,133,146,72,36,134,163,209,198,175,201,234,35,179,57,62,22,139,237,168,175,107,252,240,193,119,6,166,177,89,210,89,83,237,136,197,98,241,250,72,211,159,91,217,111,204,226,60,219,37,157,60,155,248,128,99,81,241,80,238,95,165,3,207,69,140,74,25,99,63,21,200,14,125,117,174,181,203,163,137,246,55,214,175,95,255,221,108,160,228,70,73,159,214,196,82,184,247,148,12,121,146,116,196,218,122,98,102,199,220,191,200,144,210,89,79,221,253,73,165,50,83,215,20,135,130,142,138,10,130,42,46,8,42,224,78,158,185,172,42,43,208,149,175,93,171,45,187,187,244,228,75,123,38,237,159,202,192,112,70,61,3,169,25,59,107,148,20,6,85,90,24,82,65,120,234,95,171,226,130,160,110,124,219,185,122,122,91,135,94,110,31,203,169,230,119,103,215,53,86,171,67,189,186,170,236,21,93,82,220,62,158,252,74,210,238,76,185,158,75,174,80,169,51,121,166,251,188,194,14,253,105,229,139,170,11,14,106,103,166,66,159,223,123,161,250,188,26,93,91,249,162,206,47,28,185,51,254,208,192,106,237,207,21,234,13,165,45,90,30,24,86,106,127,80,219,211,85,90,230,38,117,73,73,155,222,93,190,77,43,131,67,202,235,240,165,238,92,161,190,221,123,154,30,232,111,86,255,104,18,237,200,42,18,28,208,229,165,187,116,89,105,171,26,131,253,19,98,233,247,194,250,159,193,70,109,74,174,208,197,197,113,93,94,186,107,124,95,52,56,160,247,87,190,32,73,250,245,112,68,27,247,157,167,182,108,217,188,222,171,37,97,116,151,239,7,62,157,136,239,108,63,212,161,89,227,76,255,105,202,177,119,201,63,144,64,75,58,187,190,174,254,15,219,19,237,139,94,66,145,72,36,246,215,71,26,254,243,160,210,134,158,116,122,248,145,249,156,207,63,68,247,18,205,233,47,131,247,5,35,167,102,170,178,139,252,214,115,99,218,19,173,255,214,80,215,208,238,27,231,115,146,61,127,138,19,246,24,107,254,66,146,157,105,113,152,246,120,203,191,71,163,141,157,178,186,89,210,164,217,121,73,125,70,230,99,158,181,155,29,163,199,199,6,169,129,198,241,228,250,91,62,249,81,99,39,38,207,86,138,187,190,174,252,167,47,127,118,211,225,156,123,52,241,190,237,134,91,62,241,115,89,231,126,73,117,121,187,223,115,227,45,159,124,254,159,111,251,236,151,14,231,26,88,24,36,208,199,160,206,238,33,221,251,232,203,122,37,54,121,98,47,24,112,84,86,28,86,109,85,177,78,107,170,214,186,53,53,170,44,157,188,8,216,186,213,53,58,165,97,153,158,219,177,87,153,236,228,68,252,96,155,119,236,213,131,79,236,212,192,208,244,229,23,245,203,75,213,176,162,92,23,156,182,82,107,34,149,147,246,27,35,85,151,23,234,221,151,157,170,79,127,227,215,99,163,135,188,246,84,234,2,3,122,123,249,118,253,97,233,46,5,141,175,156,117,52,224,135,148,177,174,86,6,134,244,7,165,187,53,69,30,49,43,77,193,62,93,88,148,80,185,155,150,51,122,142,144,201,233,157,21,219,244,142,242,237,10,27,79,195,126,80,157,185,34,249,50,138,4,6,181,44,144,212,95,84,61,35,79,70,223,239,59,89,158,117,84,238,166,117,109,229,22,189,165,108,135,36,201,147,209,128,23,86,206,26,149,185,25,149,185,105,253,94,73,171,2,198,215,176,31,208,144,31,84,177,51,114,71,192,179,70,105,27,80,214,58,26,242,131,242,151,48,255,48,198,127,86,114,174,155,205,177,214,58,25,199,241,30,153,169,196,193,88,115,143,117,252,167,199,183,149,153,246,73,209,246,246,246,157,209,104,227,213,146,173,30,27,243,229,28,248,133,13,169,87,158,249,244,248,182,111,22,116,185,111,227,234,75,214,183,143,231,141,196,102,255,64,164,247,138,204,129,247,205,49,254,115,249,123,29,199,223,150,255,190,26,99,103,221,213,35,22,139,117,75,122,111,93,221,154,91,93,121,151,89,199,31,255,127,185,181,74,79,245,154,182,68,219,35,146,30,137,70,163,205,198,15,174,150,177,117,214,248,65,227,59,3,193,2,231,161,93,187,118,245,69,34,171,79,50,38,55,30,83,54,27,62,184,245,160,29,93,210,251,161,166,149,77,77,89,215,95,35,41,98,140,194,146,243,114,42,21,126,102,255,254,237,3,77,77,77,43,115,57,255,192,247,150,51,59,198,254,236,186,238,112,206,42,239,103,102,15,249,33,11,56,90,220,248,145,79,189,201,90,255,11,19,6,141,158,13,102,188,55,125,229,43,159,159,221,140,212,44,124,245,182,207,61,125,195,45,27,206,151,188,7,101,117,206,216,184,181,250,226,245,55,127,114,11,15,22,46,61,18,232,99,80,239,96,74,143,191,16,215,19,91,102,46,195,60,169,190,82,31,190,242,108,189,233,162,53,42,46,152,88,163,27,10,186,90,91,95,169,234,178,2,37,186,14,221,97,172,165,163,79,63,253,205,110,237,239,59,244,93,169,43,46,90,163,191,120,235,217,90,183,102,114,203,217,130,80,64,191,247,170,70,125,241,219,79,42,149,153,223,93,248,144,241,116,65,209,30,189,161,164,85,65,227,107,200,15,234,165,116,149,54,13,175,208,128,31,214,218,112,143,206,43,220,163,218,224,172,59,167,77,112,106,65,151,36,41,158,45,81,175,87,160,142,92,177,78,13,119,233,138,210,157,10,27,79,105,223,213,127,15,52,233,215,195,17,121,50,186,180,184,85,191,95,218,162,128,241,245,190,202,23,244,228,240,74,181,102,203,245,234,162,61,122,75,217,14,89,141,148,142,60,155,92,161,173,233,42,165,252,128,78,10,119,107,109,184,71,187,50,21,122,160,191,89,213,129,164,74,157,172,222,88,186,91,146,212,235,21,232,169,228,74,197,179,165,106,203,150,78,42,13,57,146,98,177,216,11,146,94,88,168,243,181,39,118,63,60,183,235,183,222,55,221,190,214,214,214,61,146,54,28,118,80,211,104,107,107,219,34,205,111,137,237,88,44,182,67,210,142,25,246,191,34,233,149,121,134,38,73,74,36,118,182,75,154,77,73,197,172,226,138,199,119,189,44,233,229,217,156,167,165,163,165,69,82,203,148,251,90,90,58,52,77,223,238,150,150,150,94,45,226,207,12,88,44,235,215,175,47,204,24,251,117,147,215,65,195,74,241,133,78,158,199,124,245,182,13,137,27,110,217,112,133,228,61,165,241,153,104,99,140,244,245,245,235,215,159,68,139,187,165,69,2,125,28,123,185,189,71,247,63,182,67,205,209,202,41,91,211,213,85,151,170,188,100,118,9,244,92,60,248,235,157,234,234,75,234,142,143,188,81,85,229,19,59,111,24,35,149,22,133,180,170,182,92,47,181,118,205,235,252,203,3,195,58,20,229,4,7,0,0,32,0,73,68,65,84,37,220,165,162,209,217,218,237,233,101,250,151,238,179,244,92,114,36,97,47,117,50,227,179,197,149,238,252,158,183,120,57,189,76,247,245,175,213,142,116,165,118,103,202,181,190,250,105,21,141,246,104,126,49,93,173,175,119,159,173,30,111,100,102,127,75,170,90,107,195,189,58,41,220,173,98,39,171,139,139,227,218,211,87,162,183,150,141,228,70,57,235,232,249,84,141,254,126,223,5,218,151,43,26,143,241,156,194,78,117,100,75,244,114,102,100,182,62,237,187,227,9,116,103,174,88,63,236,91,171,103,83,11,211,82,16,0,112,120,178,129,146,27,15,234,182,145,114,125,93,185,24,201,243,152,145,36,250,19,87,202,58,191,210,129,154,232,104,54,80,114,189,164,127,88,172,235,226,208,142,162,71,251,177,24,182,183,117,79,89,234,33,73,149,101,5,42,42,152,185,123,196,124,253,102,75,66,191,218,28,155,114,95,48,224,104,109,116,172,196,99,238,101,22,203,220,164,162,193,145,187,232,41,27,208,139,169,106,109,75,47,27,223,63,224,135,244,66,170,70,177,108,233,156,207,45,73,253,94,72,223,234,57,93,63,238,95,163,231,83,53,26,240,67,90,19,238,85,96,180,75,70,175,87,160,139,138,227,250,253,210,221,250,253,210,221,186,160,104,143,186,70,147,105,35,171,181,161,30,149,56,217,241,153,236,148,13,232,231,131,141,227,201,243,88,140,255,59,84,63,158,60,3,0,142,94,215,127,236,99,85,146,62,158,63,102,140,253,212,63,125,249,51,135,85,243,60,27,95,189,237,115,79,75,250,219,131,134,63,177,126,253,134,101,83,29,143,35,131,25,232,227,92,58,235,77,185,128,137,36,101,178,185,25,87,38,60,28,86,210,51,175,116,232,170,215,173,157,180,207,113,140,74,138,198,18,247,185,215,246,186,198,142,183,124,27,246,3,218,239,21,41,229,79,252,85,238,247,67,26,58,68,107,185,233,236,200,84,106,107,186,106,66,143,232,50,231,64,61,244,165,37,173,186,180,100,234,213,17,141,145,86,4,135,84,238,164,84,96,70,102,172,179,214,81,107,230,24,122,0,16,0,48,145,231,94,39,77,88,117,43,22,200,14,125,245,72,93,62,152,27,252,231,209,238,28,99,45,238,42,178,1,239,58,73,127,127,164,98,192,68,36,208,199,185,210,162,144,74,11,167,174,159,221,211,53,164,254,161,41,159,55,90,16,102,154,133,150,140,36,215,153,255,205,143,156,117,148,25,237,139,92,236,100,181,204,77,42,104,124,101,243,122,37,23,155,172,10,157,249,213,88,119,230,138,148,57,104,129,149,164,29,233,3,109,36,181,100,202,181,51,83,49,229,131,125,86,82,60,91,170,164,13,42,107,29,5,141,175,128,172,106,131,67,218,76,247,78,0,56,54,89,243,182,252,77,35,221,122,36,107,144,55,110,220,152,188,225,35,159,250,148,140,253,183,241,144,164,171,69,2,189,100,72,160,143,99,161,128,171,211,155,170,180,186,174,98,210,190,116,214,211,182,214,46,237,235,93,156,191,255,70,210,41,13,85,83,238,243,124,171,158,129,249,103,147,253,163,171,9,74,82,216,120,58,53,220,165,211,11,246,107,75,170,90,89,235,168,194,77,233,236,130,125,138,4,6,230,117,254,140,117,101,237,196,228,120,91,106,153,234,131,3,10,25,79,251,188,34,221,217,125,214,120,13,180,36,149,187,105,85,187,73,237,204,84,200,202,200,179,70,187,50,21,58,57,220,173,2,39,167,215,21,183,107,107,170,106,188,21,93,161,147,83,115,168,71,253,126,72,173,153,201,75,137,187,198,87,200,241,228,200,202,53,86,190,53,242,232,4,6,0,71,220,141,183,108,136,90,235,157,155,55,148,74,23,187,255,117,164,227,200,148,56,223,11,13,121,95,211,104,45,180,145,206,255,240,250,79,68,238,216,248,185,248,145,142,5,36,208,199,164,146,130,144,206,88,93,45,119,138,30,207,249,42,75,11,244,230,139,214,232,164,250,201,117,182,219,219,186,244,252,206,125,26,76,46,236,170,128,99,154,163,149,122,205,233,117,83,238,203,121,190,90,59,251,70,183,230,94,3,189,63,87,164,237,233,101,186,184,56,174,18,39,163,51,11,246,235,154,138,45,122,108,40,170,1,63,164,213,161,62,93,86,210,162,234,192,194,125,56,120,120,112,149,46,40,218,163,170,64,82,235,10,246,234,245,197,237,218,150,174,210,160,31,84,181,155,212,233,5,251,20,13,14,234,158,190,147,181,41,185,66,65,227,235,199,3,171,181,58,212,171,144,241,116,81,81,92,73,63,160,39,134,235,100,101,20,9,14,234,130,162,132,218,50,101,250,94,223,41,106,201,148,143,175,56,24,48,190,170,220,164,46,41,110,215,202,192,144,250,188,176,54,167,150,79,72,216,1,0,71,134,111,115,111,62,104,157,213,135,102,88,97,112,209,220,185,97,195,240,13,55,223,250,83,73,87,141,141,5,93,115,133,164,175,31,233,88,64,2,125,76,90,89,85,172,63,190,236,52,13,165,103,94,69,176,164,32,164,149,85,197,42,8,77,252,49,183,117,246,235,158,71,95,214,246,182,238,69,137,239,140,85,213,250,179,43,206,84,83,237,228,153,85,223,183,218,215,59,172,150,142,177,69,69,230,62,171,58,228,7,181,41,185,82,103,14,239,211,197,197,113,21,57,89,93,84,148,208,153,5,251,149,246,93,149,185,25,25,89,165,173,171,176,57,116,143,235,217,120,38,185,66,15,13,174,214,85,101,175,168,196,201,232,79,42,182,40,150,45,85,159,31,82,52,56,168,104,112,64,190,140,124,25,109,74,174,80,206,58,122,116,176,65,167,133,187,116,105,73,171,10,157,156,46,47,221,165,87,23,237,145,47,163,101,110,74,33,227,169,62,216,175,109,233,101,106,201,148,43,99,93,245,122,97,85,7,146,170,14,36,245,230,178,29,250,125,235,234,233,228,74,237,202,84,144,64,3,192,18,112,100,94,149,63,213,99,141,185,127,201,130,177,230,1,25,59,158,64,251,198,57,103,166,195,177,120,72,160,143,65,69,5,65,173,157,98,86,121,182,126,245,124,76,15,63,213,162,238,254,217,151,81,84,148,20,104,77,164,98,82,91,186,124,165,133,33,213,86,151,232,173,175,93,171,215,157,29,157,242,152,116,214,211,47,159,109,159,113,65,150,217,216,149,41,215,189,253,39,201,151,209,57,5,123,85,21,72,170,210,77,201,115,140,226,185,82,237,72,87,168,49,212,175,53,161,222,195,186,206,152,140,117,245,159,61,167,201,179,70,23,21,37,212,28,238,209,169,110,87,222,126,71,155,83,43,244,212,240,74,73,35,243,234,123,115,69,186,171,103,157,146,54,160,115,11,59,213,16,236,215,242,192,240,248,254,94,47,172,103,146,43,181,59,51,82,98,211,153,43,210,99,195,81,93,86,210,162,18,39,171,160,241,229,89,71,253,94,104,194,3,141,0,128,35,199,78,92,13,80,214,179,91,151,46,22,187,53,127,218,201,200,70,166,61,24,139,138,4,250,4,84,91,85,172,250,154,82,237,235,25,158,114,57,240,169,172,91,93,163,15,95,121,246,140,171,22,150,149,132,213,176,188,76,141,43,167,238,56,97,173,213,222,158,97,221,243,232,172,214,105,152,81,214,186,218,156,28,41,107,120,174,96,175,234,131,253,10,59,158,6,252,144,94,73,87,42,150,45,213,170,80,159,26,70,151,207,126,49,85,163,156,117,245,114,186,82,247,244,157,164,50,55,163,110,175,96,188,181,220,195,3,171,180,53,53,178,216,221,214,116,149,134,237,228,191,26,221,94,129,254,163,231,116,109,73,85,235,172,130,189,170,14,36,101,36,13,250,33,117,121,5,122,114,184,86,47,164,106,198,143,247,101,212,158,41,213,191,118,159,165,205,133,123,116,90,184,75,229,110,122,100,69,66,63,164,120,182,68,79,15,215,106,231,120,2,93,172,255,234,61,89,241,108,137,170,221,164,28,51,146,100,63,159,170,81,159,31,62,236,247,12,0,48,31,182,46,255,110,169,235,186,139,214,247,249,80,92,215,217,227,251,121,221,179,140,72,160,151,8,9,244,9,232,117,103,213,203,247,172,190,246,195,231,244,236,43,157,202,230,14,221,202,174,97,101,153,26,166,73,140,103,171,111,48,173,255,248,239,45,11,86,58,146,177,174,118,164,43,181,35,93,169,66,39,55,186,196,118,96,188,131,198,150,84,245,164,215,108,77,87,107,107,122,242,248,3,253,205,179,186,230,224,104,255,230,223,12,215,169,202,77,202,152,145,158,206,3,222,212,157,78,172,140,246,231,10,245,211,129,213,122,116,168,65,21,110,74,158,53,26,240,195,26,62,168,245,94,206,58,218,153,169,212,238,76,133,194,198,147,99,70,202,80,114,150,118,237,0,176,116,76,94,146,106,109,186,55,113,240,18,247,71,204,178,66,211,177,127,200,90,141,173,134,104,73,160,151,10,9,244,9,40,224,58,186,120,93,84,189,67,105,117,15,164,180,99,154,133,86,22,82,255,80,90,223,249,217,75,186,251,145,131,239,124,205,253,33,194,169,36,253,128,146,121,191,206,101,78,70,171,66,189,170,116,71,218,244,237,204,148,43,158,45,157,178,245,220,92,156,87,216,161,98,39,43,35,169,35,87,172,237,233,101,179,250,14,236,232,127,79,10,141,188,215,89,235,168,61,91,58,222,149,35,159,47,163,164,13,44,212,91,3,0,0,22,24,9,244,49,104,56,157,211,158,253,131,26,158,225,33,194,128,227,168,188,36,172,170,178,66,133,67,147,235,103,11,194,1,93,122,110,163,158,218,214,161,196,254,65,13,167,102,126,32,113,190,172,164,174,190,164,190,253,240,22,221,253,240,86,13,14,31,92,251,188,56,173,217,170,3,195,186,188,116,183,206,44,216,39,73,250,110,223,41,218,155,43,62,236,90,226,171,202,94,81,83,168,79,70,210,99,67,81,189,146,174,156,117,123,185,10,55,173,15,46,219,44,105,100,214,250,161,129,85,227,9,180,35,171,50,55,173,21,129,145,101,213,147,54,160,189,185,226,73,11,196,0,0,142,52,27,151,204,104,125,158,49,225,138,186,21,146,166,94,106,119,145,117,39,237,202,241,217,103,73,50,162,133,221,18,225,95,231,99,80,103,215,144,190,251,179,151,180,109,134,82,136,128,235,168,180,40,164,230,72,133,94,119,86,189,78,109,170,82,56,56,49,121,172,44,45,208,165,175,106,212,51,219,59,245,82,107,215,52,103,154,191,100,58,167,223,110,77,232,145,167,91,245,163,199,119,204,233,161,197,195,21,114,60,213,6,7,213,28,30,153,241,173,116,83,114,140,47,29,102,2,29,9,14,104,77,184,87,142,236,72,237,178,177,146,157,93,2,29,52,222,120,60,125,94,88,85,238,129,247,195,53,86,39,135,187,245,71,21,47,73,146,90,51,229,122,160,191,89,187,50,147,123,120,3,0,142,36,147,144,116,246,216,150,231,121,181,90,162,4,218,243,252,218,9,107,148,89,18,232,165,66,2,125,12,26,72,166,245,220,43,123,245,196,150,196,33,143,173,40,41,208,139,187,246,235,131,111,94,167,243,79,173,157,180,255,213,167,214,106,117,93,133,94,110,159,185,46,57,147,245,148,202,228,228,143,150,21,132,131,174,10,66,1,77,179,216,160,190,247,179,109,218,188,115,175,94,216,185,79,91,90,186,102,124,248,240,68,49,228,7,245,240,96,147,36,41,233,7,181,59,123,160,205,159,35,171,26,55,169,139,138,70,126,166,21,78,70,143,14,214,47,73,156,0,128,3,140,148,200,175,168,51,174,57,77,210,83,75,17,139,99,116,234,132,150,122,50,36,208,75,132,4,250,56,215,59,152,210,47,159,109,211,154,72,133,214,68,42,181,172,108,98,47,225,138,210,176,86,215,149,171,164,104,234,135,224,198,60,189,189,67,63,253,205,110,13,140,46,188,178,186,182,92,127,246,166,117,42,46,12,78,121,252,190,222,97,125,235,167,91,102,17,225,225,21,250,186,178,170,9,12,171,46,56,160,2,227,169,207,15,169,61,51,251,135,29,131,198,215,50,55,169,200,232,235,135,252,160,18,185,18,117,123,133,242,102,57,179,28,13,246,107,69,96,88,97,227,169,215,11,43,150,43,83,255,20,15,21,14,250,33,61,216,191,70,33,227,41,99,93,197,179,165,146,164,128,241,181,44,144,84,117,224,64,95,254,128,241,84,21,72,170,62,216,175,148,13,168,199,43,224,97,66,0,88,2,190,236,51,249,11,169,24,223,190,69,210,191,47,69,44,86,186,50,127,219,177,254,179,75,17,7,72,160,79,8,195,233,156,54,239,216,171,221,29,189,90,86,182,114,210,254,229,149,69,42,46,152,58,17,30,179,43,209,171,7,30,223,161,253,125,35,171,251,85,151,23,106,117,164,82,111,56,191,81,161,192,228,178,136,183,92,220,172,255,221,28,211,175,95,60,212,135,227,249,215,64,87,185,73,189,166,40,161,11,138,19,90,17,24,82,200,248,26,246,131,122,33,85,173,68,182,68,174,153,185,187,72,93,96,80,151,150,182,234,148,112,151,150,7,134,21,52,190,82,126,64,93,94,129,30,27,138,234,127,135,234,53,228,207,252,190,92,84,20,215,155,203,118,170,210,77,41,104,124,13,121,65,117,120,197,122,120,160,73,191,29,158,184,18,99,177,201,234,210,146,86,85,186,41,245,123,97,253,247,224,42,197,178,165,42,115,50,250,189,226,86,93,86,218,58,126,236,202,192,144,222,94,190,93,3,126,72,219,210,85,122,160,191,121,188,229,30,0,224,200,177,158,125,208,184,230,107,227,3,70,127,176,126,253,250,194,141,27,55,46,220,114,183,179,112,221,134,13,69,26,242,254,32,127,44,235,217,7,143,100,12,56,128,4,250,4,209,59,152,158,118,241,146,128,227,200,153,174,22,99,26,251,251,146,250,215,31,109,214,25,171,170,213,176,162,84,230,160,215,55,172,40,211,245,87,159,163,173,173,93,234,29,88,248,218,231,114,55,173,75,75,90,245,142,138,237,138,4,7,228,230,205,100,55,135,122,212,153,43,210,50,119,250,235,214,5,6,245,174,138,109,186,172,164,69,203,2,41,57,7,205,132,55,143,46,193,253,200,96,147,134,167,73,162,215,132,123,213,20,234,211,73,225,238,9,31,3,124,25,53,4,251,101,36,253,38,47,137,46,112,114,122,77,81,92,203,3,73,237,207,21,234,249,209,158,209,5,78,78,107,195,189,90,27,58,208,13,165,204,205,232,156,194,189,146,164,128,177,122,100,160,105,182,111,13,0,96,1,125,237,31,63,215,126,253,205,183,110,50,210,185,163,67,69,185,64,201,187,36,125,243,72,198,17,26,244,223,37,163,241,219,200,86,122,234,142,141,159,163,132,99,137,112,79,248,4,81,24,14,168,32,188,176,159,151,158,219,177,87,119,220,255,172,122,6,82,83,22,98,92,112,90,173,222,119,249,25,11,122,205,49,39,135,187,117,69,217,78,53,4,251,229,202,170,207,11,235,183,195,181,250,217,96,163,186,188,66,53,134,250,85,29,152,122,114,160,200,201,234,13,165,45,186,180,164,85,213,129,164,250,188,176,30,30,104,210,221,61,167,235,215,67,17,13,251,65,53,133,250,116,77,229,86,157,22,238,82,112,154,153,236,198,96,159,26,67,125,122,106,184,86,247,247,55,235,249,228,72,66,236,200,234,244,240,126,93,91,249,162,202,70,219,232,205,36,227,187,138,101,75,21,27,45,233,144,70,234,165,95,73,87,106,115,114,185,90,50,229,202,242,87,21,0,150,142,177,247,228,111,90,233,51,235,215,175,159,126,105,222,5,182,126,253,250,66,25,251,119,19,66,146,238,61,82,215,199,100,204,64,159,0,130,1,71,167,52,86,169,97,249,212,181,193,131,201,140,50,57,79,197,154,185,92,225,96,217,156,175,251,31,219,161,147,234,151,233,61,111,60,93,193,192,196,36,175,32,20,208,187,47,59,85,47,238,222,175,71,158,106,153,119,252,7,171,112,211,58,187,96,175,86,143,46,211,221,150,45,211,67,253,171,245,196,112,157,210,214,85,36,56,168,43,203,94,209,107,138,18,10,76,145,252,174,10,245,233,194,162,132,150,185,73,13,249,65,253,160,247,100,253,124,168,65,125,94,88,213,129,164,62,92,245,156,206,43,236,80,99,176,95,23,22,37,180,61,189,76,89,59,185,166,57,104,124,125,171,251,76,61,54,84,175,62,63,164,106,55,169,43,202,118,234,45,101,59,228,26,171,83,194,221,58,175,176,67,63,31,108,156,241,251,233,247,67,250,249,96,131,130,198,211,123,43,95,148,52,178,12,248,189,125,39,233,149,76,165,6,253,144,122,114,5,51,158,3,0,176,136,92,239,78,229,2,31,149,52,246,244,119,52,27,40,185,94,210,63,28,137,203,231,130,197,55,200,42,154,55,212,27,204,185,119,30,137,107,99,106,76,107,157,0,214,173,89,174,203,206,109,212,242,202,169,107,104,19,221,67,26,152,212,159,121,118,250,135,50,186,235,193,231,181,181,101,191,124,59,121,30,186,182,170,88,55,189,227,92,173,137,44,92,59,182,154,192,144,154,195,61,10,26,95,57,235,104,83,114,133,126,216,191,86,47,165,171,180,43,83,161,39,134,235,244,243,161,6,197,179,37,83,190,254,180,112,151,234,130,131,114,141,85,71,174,88,173,163,189,152,203,220,180,50,214,209,142,116,229,120,255,229,87,23,237,81,161,147,155,242,60,173,153,50,221,215,127,146,182,166,171,20,207,150,234,249,212,114,221,221,115,154,90,71,31,98,12,26,95,175,46,236,56,228,247,51,246,64,97,254,195,143,73,63,168,221,153,114,189,144,170,209,238,76,185,82,83,44,45,14,0,56,50,110,255,194,23,186,172,177,95,56,104,248,211,215,223,252,241,87,45,246,181,255,242,175,111,61,215,90,51,113,246,217,216,207,111,220,184,97,97,150,245,197,188,240,175,242,49,200,117,28,149,20,133,84,85,62,253,221,163,160,107,180,114,89,177,206,63,181,86,151,158,219,164,179,154,107,20,112,39,127,94,106,237,236,87,203,158,62,165,50,243,111,51,215,210,209,175,127,250,193,51,250,242,13,151,168,162,100,226,76,169,49,70,167,175,170,214,245,87,191,74,159,184,243,127,149,76,79,157,140,206,69,177,201,169,194,25,41,141,24,240,67,106,201,148,171,219,59,112,221,156,117,212,158,41,211,62,175,72,141,234,159,244,250,218,192,160,74,157,145,15,12,213,110,82,215,84,110,157,176,96,73,133,155,26,79,154,155,66,125,10,153,169,223,155,103,83,43,212,237,29,248,25,88,73,137,92,169,90,50,229,106,12,245,203,149,175,134,208,228,235,31,79,162,209,85,175,150,188,179,198,182,3,57,231,145,150,142,150,133,187,221,0,0,71,137,80,118,232,159,178,129,146,191,148,52,246,112,75,145,228,62,112,211,77,31,63,255,43,95,249,252,158,197,184,230,77,55,125,188,54,235,232,126,163,9,181,207,241,96,118,232,171,139,113,61,204,30,9,244,49,168,97,69,153,110,122,199,185,234,27,154,190,190,214,113,140,138,11,130,170,173,42,81,117,121,225,148,201,179,36,61,254,66,76,59,227,189,178,83,204,30,207,197,163,207,181,235,219,255,189,85,31,126,235,57,114,157,137,15,20,6,92,71,151,157,219,168,39,94,179,70,223,255,229,246,195,186,142,36,25,99,229,154,145,120,93,99,39,60,64,56,27,65,227,141,191,166,220,77,171,124,134,58,229,176,241,100,166,57,191,153,238,178,121,223,254,241,190,26,183,181,246,179,70,230,13,99,219,158,107,63,37,233,51,75,24,18,0,44,138,141,27,55,38,175,191,249,147,31,50,210,3,99,171,1,26,41,146,11,58,15,222,116,211,199,175,88,232,36,250,166,155,62,94,155,11,185,63,54,86,145,3,163,214,58,214,249,208,145,238,0,130,201,72,160,143,65,165,69,33,157,213,188,252,176,207,243,114,123,143,126,246,116,155,58,186,134,14,251,92,169,76,78,223,120,232,69,173,170,171,208,229,23,174,158,180,192,74,69,73,88,31,120,243,58,109,107,235,214,11,187,246,29,214,181,134,253,160,122,188,176,164,145,214,112,13,161,126,85,185,73,117,229,205,6,47,15,12,79,219,133,163,199,43,84,210,6,84,160,156,246,100,139,245,221,190,83,213,158,157,190,119,244,254,105,218,199,157,83,212,169,98,147,85,127,94,125,244,50,55,169,250,224,128,164,145,110,28,93,185,35,246,140,201,17,23,141,70,155,101,237,27,242,199,172,209,251,36,125,65,210,225,223,106,0,128,163,204,237,95,250,236,131,215,223,242,201,143,25,171,191,63,48,106,94,149,13,186,79,93,127,243,199,223,114,251,151,62,255,204,66,92,231,47,255,250,214,115,179,142,238,159,152,60,75,146,249,155,127,254,135,191,251,241,66,92,3,135,135,26,232,19,212,224,112,70,63,121,98,167,158,121,185,83,153,220,194,172,18,216,209,61,164,127,186,231,25,237,235,29,158,180,207,113,140,78,170,95,166,245,239,60,111,210,98,46,115,213,231,133,181,55,87,44,73,114,141,175,243,10,59,116,73,73,187,10,157,156,130,198,215,89,5,123,245,198,146,22,213,5,7,167,124,253,150,116,245,120,79,229,114,55,163,34,39,167,173,169,42,61,62,20,209,227,67,17,181,101,74,213,28,234,209,158,108,177,126,51,92,167,228,52,245,199,117,129,65,189,167,114,139,170,70,187,125,148,56,89,189,183,242,69,69,71,19,232,172,117,181,57,53,191,15,58,5,78,78,149,129,148,138,156,172,170,3,195,211,150,145,44,37,99,221,183,76,26,180,90,21,141,54,93,188,4,225,96,14,86,174,108,174,137,70,26,237,248,87,180,225,61,75,29,19,112,172,184,253,182,207,126,209,202,126,59,127,204,72,17,35,247,87,55,220,124,235,71,14,167,59,199,250,245,235,11,111,188,229,147,55,251,142,30,51,58,56,121,214,221,95,253,210,103,110,155,239,185,177,176,152,129,62,1,237,233,26,210,247,127,177,77,63,120,244,101,117,247,47,236,93,160,109,173,93,218,248,95,79,235,11,31,122,221,164,125,193,128,163,215,156,81,167,247,191,105,157,190,244,157,39,231,125,141,46,175,80,207,165,106,116,97,81,92,145,224,160,106,3,131,250,147,138,45,186,184,40,166,180,117,85,27,28,84,125,112,64,5,102,234,73,208,23,83,213,218,156,170,81,36,56,160,98,39,171,171,203,94,86,115,168,71,177,108,137,138,157,156,154,67,61,106,8,245,235,220,194,78,253,195,190,243,213,158,45,149,157,98,193,151,128,241,117,101,217,43,58,167,176,83,123,178,197,90,17,24,86,115,120,164,127,180,149,81,103,174,72,191,24,108,152,213,247,148,181,142,122,253,176,210,214,85,216,120,170,11,14,234,131,203,158,215,59,203,183,107,115,170,70,119,247,156,174,140,157,188,96,205,18,114,172,244,190,41,247,248,122,171,164,95,30,217,112,48,23,33,101,106,252,188,223,105,59,213,47,56,128,105,13,21,7,62,80,60,148,147,145,185,38,111,184,72,210,151,178,129,146,255,115,227,205,183,222,26,200,13,126,111,182,165,22,215,109,216,80,20,30,242,222,153,149,62,115,80,183,13,73,146,149,253,246,80,113,224,131,11,21,63,14,31,9,244,9,36,147,245,244,228,75,123,244,159,255,243,146,126,253,98,92,61,253,41,121,254,194,86,233,230,60,95,247,255,234,21,253,206,153,17,93,113,209,154,73,251,75,10,131,186,234,181,107,245,244,182,14,253,226,217,182,121,93,35,107,29,61,61,92,171,159,6,251,245,71,21,47,169,216,201,170,54,56,168,229,129,33,249,50,35,221,53,178,197,26,246,131,170,9,76,158,13,31,242,131,186,191,191,89,117,129,65,189,186,104,143,106,2,195,186,184,120,36,249,14,200,170,192,201,201,145,85,149,155,84,200,120,50,154,186,150,57,158,45,81,165,155,214,186,130,125,58,37,220,61,62,75,108,37,197,179,197,250,202,254,243,38,60,220,56,19,95,70,61,94,129,98,217,82,173,9,245,170,192,228,198,219,244,117,121,5,114,166,45,184,94,26,209,232,170,243,100,253,169,155,124,27,251,167,53,53,53,159,216,183,111,223,212,183,0,176,228,108,208,173,150,63,243,74,157,0,166,247,205,13,27,82,146,222,115,253,45,159,124,193,88,125,65,19,11,23,163,86,250,70,54,80,114,251,13,31,185,245,167,214,49,15,88,207,110,117,93,119,79,186,55,209,41,73,225,138,186,21,158,231,213,26,215,156,102,172,189,82,67,222,229,54,239,65,193,3,172,181,70,31,187,253,182,207,126,241,200,124,103,152,45,18,232,227,220,80,50,171,93,123,122,245,194,206,253,122,106,219,30,109,222,177,79,237,123,251,23,164,27,198,116,250,135,51,250,252,127,60,161,51,86,85,171,169,182,124,194,62,99,140,234,170,75,244,129,43,206,212,230,157,251,148,154,103,28,61,94,88,247,244,157,164,182,108,153,46,43,105,209,186,130,125,42,119,211,234,205,21,232,87,195,81,109,79,47,211,25,225,253,106,14,143,172,238,183,47,87,36,207,30,168,88,218,157,169,208,198,253,231,233,194,162,61,186,172,164,69,167,20,116,169,108,180,51,71,107,182,76,79,14,213,233,145,193,70,197,178,165,202,159,169,75,228,74,228,164,71,166,235,158,28,174,213,11,233,106,93,89,186,67,191,83,60,178,24,212,160,31,212,227,67,245,250,241,192,42,61,147,156,184,108,122,206,58,106,203,150,171,199,43,84,175,23,86,175,63,241,255,149,173,153,50,125,171,231,12,189,179,124,155,154,195,61,114,229,43,158,45,213,11,201,229,71,219,236,179,140,245,174,154,97,210,178,60,28,46,122,131,164,251,230,114,206,250,250,250,53,190,239,52,56,214,172,176,142,205,74,206,43,190,159,222,145,72,36,38,127,10,58,68,120,209,104,244,12,99,2,117,190,239,47,55,198,217,103,173,179,107,229,202,202,221,155,54,109,202,206,229,68,205,205,205,225,116,58,189,78,158,106,125,227,86,58,214,235,145,171,61,174,235,190,208,210,210,50,237,82,151,77,77,77,21,185,156,255,142,188,144,226,177,88,235,79,166,59,62,18,105,184,212,24,173,30,219,14,102,220,7,118,239,221,221,57,182,93,95,215,244,71,214,241,75,37,201,90,237,137,199,219,30,148,164,104,52,26,177,214,61,217,24,91,103,124,103,192,147,109,171,173,173,126,113,170,239,179,190,190,190,206,90,243,166,145,115,248,235,242,247,25,99,94,31,141,54,76,248,133,76,167,147,223,225,67,16,48,179,219,111,251,236,23,175,191,249,147,91,140,244,117,29,232,206,49,166,72,70,87,27,107,175,54,142,100,173,167,80,249,114,43,73,214,122,198,113,36,205,240,0,191,149,226,142,117,62,244,213,47,81,243,124,52,58,234,111,219,197,59,186,255,127,123,247,30,28,231,117,222,7,248,61,223,2,188,68,138,69,235,70,18,187,32,32,74,142,18,41,178,171,42,117,235,137,92,59,211,196,145,108,39,245,165,51,142,157,177,236,84,227,75,148,137,91,91,105,19,199,141,45,53,110,148,102,98,183,73,99,41,81,34,167,145,19,217,147,250,166,200,137,103,154,105,99,71,105,60,177,45,95,85,218,170,104,138,0,118,151,128,72,129,164,72,137,36,176,251,157,254,65,92,118,65,0,196,74,36,65,80,207,51,195,225,126,103,207,158,61,11,138,212,15,7,231,123,79,142,136,168,110,185,240,172,159,235,114,170,175,189,179,167,37,196,254,190,34,182,15,108,138,23,255,208,150,147,119,94,224,233,163,173,56,116,100,42,166,91,101,60,249,212,177,56,120,248,88,28,58,50,29,135,158,154,138,35,83,173,37,43,110,108,58,127,67,252,179,171,183,198,37,155,78,220,190,245,104,125,127,124,227,209,189,113,116,106,229,129,247,101,47,26,140,109,91,190,255,196,39,114,196,83,71,167,227,239,31,110,198,190,131,71,98,120,235,5,241,146,171,183,158,208,237,240,145,233,120,120,215,190,120,180,190,255,196,49,102,108,72,173,184,176,239,104,156,95,76,69,95,42,99,58,87,226,64,123,125,28,41,251,226,252,98,58,54,204,148,163,155,108,109,136,67,229,250,19,86,146,207,43,166,227,194,202,145,56,175,152,142,231,247,29,139,167,203,190,56,212,94,23,7,219,235,227,64,123,67,180,23,252,21,25,232,63,60,183,210,124,168,189,46,14,149,235,226,226,190,35,177,105,230,134,197,118,46,226,64,123,125,76,182,55,198,116,238,190,197,160,63,149,177,181,239,112,20,41,71,59,23,177,191,189,62,14,151,243,55,32,166,136,216,88,76,199,37,149,35,241,125,197,241,252,115,44,87,98,178,189,49,158,108,175,235,10,242,43,209,248,204,45,167,229,239,76,173,86,219,24,185,50,18,17,151,204,52,213,83,81,190,46,151,197,220,190,156,28,241,137,70,99,228,141,43,27,111,248,134,156,227,61,41,186,111,72,156,49,157,34,127,52,229,248,211,209,230,232,255,137,229,11,155,244,13,86,135,223,150,35,223,18,17,139,173,142,239,77,17,191,219,42,139,143,237,217,243,216,200,114,115,26,24,24,184,56,165,254,127,147,34,110,142,136,19,255,227,140,216,155,35,238,110,181,250,126,119,98,226,123,143,47,124,114,120,203,240,112,171,146,31,155,107,200,241,103,245,230,200,146,251,140,107,3,195,191,19,41,191,107,174,33,21,47,170,215,31,251,214,236,101,181,58,244,213,185,99,132,83,124,182,44,139,95,41,82,121,87,68,252,216,194,177,114,196,68,202,249,195,207,219,116,254,127,221,177,99,199,92,129,247,90,237,178,23,71,46,255,97,185,207,221,169,210,23,3,35,35,35,167,165,52,23,156,107,222,253,238,119,111,156,234,63,239,93,41,167,247,198,252,97,43,207,212,193,136,248,141,254,214,225,255,246,92,172,182,177,86,114,223,89,61,185,136,181,243,133,60,153,94,3,116,138,136,190,190,34,214,245,245,190,242,88,150,57,90,101,142,156,115,180,103,126,95,137,34,165,88,191,174,18,197,194,18,26,113,124,107,198,84,171,189,220,55,203,39,88,215,87,57,225,116,194,89,57,34,166,91,237,152,110,149,209,87,41,98,125,255,137,159,51,231,28,83,173,50,90,237,51,243,163,230,190,84,70,59,23,231,76,233,185,211,23,160,135,111,136,156,63,63,123,157,35,62,216,104,140,188,191,54,48,244,229,72,241,35,179,237,43,8,96,169,90,29,254,183,41,242,135,87,244,198,41,221,94,175,239,190,109,177,167,54,111,222,124,94,127,101,195,221,145,226,77,43,25,170,200,249,21,163,205,209,191,94,236,185,129,129,109,63,90,164,116,95,68,156,116,3,123,142,216,157,115,252,108,179,57,242,247,157,237,139,4,232,251,234,205,145,159,61,97,128,25,11,3,116,142,226,31,53,26,143,125,115,246,186,51,64,231,136,221,41,98,125,44,30,236,59,125,186,222,24,121,67,204,84,68,233,53,64,247,245,167,173,187,119,239,62,249,73,64,192,156,95,120,239,123,47,138,118,229,237,145,211,235,231,190,233,93,161,28,241,80,164,252,169,168,180,239,254,200,29,119,60,113,186,230,120,182,91,43,185,207,22,142,179,212,241,128,89,198,116,235,204,237,83,44,115,62,165,91,59,166,90,237,21,85,248,104,181,207,92,72,94,118,30,89,81,154,149,201,255,170,243,170,40,202,191,136,136,28,69,190,55,114,154,11,208,237,233,120,101,68,220,179,212,40,131,3,67,183,228,149,134,231,136,136,156,63,80,171,13,61,90,175,143,252,217,130,103,42,125,125,235,239,137,136,55,172,116,168,50,165,143,111,219,178,237,159,143,142,143,238,232,108,31,24,184,124,176,72,173,251,35,226,162,149,140,147,34,134,35,197,167,135,134,134,174,61,83,171,181,41,98,120,133,93,95,87,171,109,251,185,122,125,244,15,79,235,132,128,57,51,193,247,142,136,184,227,150,247,188,111,48,85,210,171,139,72,255,56,71,12,68,228,129,136,52,83,89,35,55,34,82,51,69,52,203,200,95,43,82,223,3,191,247,91,183,213,87,115,238,244,70,128,6,86,108,120,120,120,83,107,58,223,212,209,244,240,216,216,216,67,199,31,150,159,143,152,255,73,66,78,241,214,88,34,64,15,14,14,254,72,46,163,235,36,173,28,113,103,81,150,159,168,172,175,124,187,213,106,21,41,245,255,112,206,229,59,35,199,27,59,58,125,100,251,246,237,159,219,181,107,215,193,217,166,106,117,248,109,41,114,103,120,158,78,17,191,210,42,227,11,149,74,251,59,41,165,231,71,187,242,79,34,229,127,151,35,126,116,166,207,69,101,37,253,118,68,188,178,115,14,149,212,254,80,238,14,207,163,57,242,127,168,180,227,161,178,175,124,172,104,21,151,149,125,233,218,156,227,131,179,65,54,69,108,46,91,233,55,35,226,45,39,249,242,157,82,57,226,161,156,243,237,41,181,191,222,106,181,246,175,91,183,238,170,92,22,191,21,17,47,159,239,148,110,141,227,127,6,101,189,254,216,151,99,230,167,142,213,234,182,155,82,164,63,153,31,43,223,212,104,140,126,236,76,206,31,206,117,119,126,248,63,141,69,196,93,171,61,15,78,15,1,26,88,177,86,43,191,42,34,250,103,175,83,142,63,137,136,50,34,162,94,175,239,172,213,134,31,140,156,95,26,17,145,34,174,31,218,58,244,67,35,123,70,190,115,194,64,101,229,23,59,183,51,167,136,255,82,111,140,188,103,65,175,191,141,136,7,107,3,195,123,59,182,55,92,48,125,180,188,49,34,62,17,17,49,60,60,188,161,53,157,223,223,249,162,28,249,77,245,198,232,39,59,154,142,68,196,253,23,95,124,229,255,222,184,254,232,231,59,66,244,141,181,90,237,5,245,122,253,209,136,136,90,237,178,23,230,220,121,227,95,28,141,212,254,23,141,122,125,103,71,219,142,136,216,49,48,112,217,87,83,42,191,219,241,158,55,109,219,178,237,63,47,92,209,62,141,246,172,155,46,94,213,121,163,97,68,124,101,251,246,237,175,153,58,214,126,56,98,174,12,214,149,181,90,237,234,122,189,254,237,51,52,47,128,231,4,63,179,6,86,44,231,212,181,202,218,142,244,185,206,235,84,198,31,119,61,159,242,79,45,28,99,120,120,120,75,142,174,85,236,233,233,118,255,29,75,189,101,81,150,127,208,217,80,166,249,21,233,86,43,255,88,116,239,5,254,155,70,99,244,83,139,13,180,111,223,35,135,202,200,119,119,127,158,190,87,119,92,189,174,235,179,68,252,70,189,59,60,207,105,54,31,123,36,82,186,189,179,173,93,73,175,89,226,51,156,114,41,199,7,23,132,231,136,136,216,181,107,215,193,200,185,107,203,70,89,22,43,221,242,1,192,10,9,208,192,138,108,219,182,109,123,87,165,140,148,30,108,54,119,127,183,179,79,59,166,30,232,122,81,74,111,143,5,255,206,180,219,241,162,5,67,127,98,124,124,231,146,231,187,143,142,143,126,55,71,186,118,246,87,74,233,215,230,158,44,243,139,187,223,47,127,60,150,169,212,177,241,200,186,207,118,142,213,215,202,159,157,31,171,236,170,104,81,70,122,224,132,1,58,159,47,243,253,221,111,157,79,60,61,232,52,105,71,241,191,150,126,54,53,58,175,42,145,46,89,170,39,0,207,140,45,28,192,138,148,101,188,122,65,203,9,123,102,155,205,230,190,193,234,240,255,200,145,103,183,66,92,94,173,14,253,211,70,99,228,75,179,125,114,46,47,233,42,0,148,227,100,199,82,150,141,198,238,111,44,246,68,74,177,165,59,45,87,190,185,88,191,89,59,39,119,62,25,17,139,142,21,41,93,219,121,217,104,236,94,118,219,195,186,117,233,59,173,233,249,119,53,8,92,79,0,0,21,161,73,68,65,84,207,41,93,185,92,255,83,169,40,166,151,252,134,35,69,218,151,59,190,135,200,69,62,239,140,76,10,224,57,68,128,6,86,34,229,156,110,234,170,41,148,211,107,107,213,161,151,46,236,152,115,190,172,51,31,167,156,254,101,68,204,5,232,40,211,166,174,231,35,237,123,230,211,42,46,234,94,112,158,94,186,104,248,50,174,186,234,170,117,79,30,124,170,179,104,121,61,34,150,45,33,179,123,247,238,163,181,234,208,222,152,169,135,61,115,83,97,229,100,175,59,21,54,108,216,240,212,82,207,181,163,44,139,206,47,112,121,150,29,99,9,112,14,16,160,129,147,218,186,117,232,218,69,106,154,222,184,104,231,133,149,59,83,254,215,3,3,3,255,113,246,68,193,20,233,137,238,21,210,114,145,211,118,86,38,167,252,120,103,126,46,203,202,249,207,100,156,29,59,118,76,213,170,67,141,136,152,41,49,21,181,56,254,239,227,114,117,29,43,49,127,152,76,228,136,137,88,58,60,47,31,98,139,124,94,103,143,148,150,239,223,106,181,86,94,31,181,80,159,17,224,84,19,160,129,147,42,138,120,237,179,120,249,37,69,209,255,242,136,248,171,136,136,118,148,123,187,86,72,35,189,112,241,151,205,191,125,181,58,60,215,39,165,84,206,158,210,151,114,236,233,76,154,149,72,87,70,196,215,151,26,232,138,11,175,120,222,145,141,173,185,35,179,43,149,242,201,209,209,209,93,51,151,255,47,230,3,116,212,106,181,225,165,110,34,140,136,24,218,58,244,3,157,105,57,69,124,109,238,113,153,142,68,165,107,123,199,165,203,125,192,40,243,11,98,145,3,140,0,56,59,9,208,192,178,102,182,55,220,212,213,152,242,219,151,123,77,202,105,56,71,252,106,71,211,235,99,38,64,71,180,190,209,81,9,47,34,199,27,47,190,248,202,95,221,183,239,145,67,139,141,181,109,203,182,31,44,35,207,133,226,148,227,129,136,248,233,136,136,40,210,87,163,236,92,186,141,55,197,76,137,187,197,28,217,56,245,154,174,250,199,237,116,107,68,28,63,204,37,231,47,70,74,29,55,18,246,189,57,34,62,176,212,88,101,145,223,220,189,151,59,127,97,246,225,244,186,233,39,35,207,215,196,78,145,175,138,227,157,79,88,89,30,222,50,60,220,74,103,238,6,196,25,93,243,72,41,173,254,73,70,0,107,136,0,125,198,204,255,79,27,214,146,195,7,14,191,44,82,154,63,214,58,197,61,39,59,221,174,86,171,109,140,92,249,133,136,184,32,34,34,114,188,121,96,96,224,151,155,205,230,190,153,27,13,239,237,40,101,119,209,250,245,71,127,57,34,126,45,78,12,152,41,87,226,93,93,45,57,238,155,123,152,91,127,27,81,217,19,51,165,236,114,228,159,170,86,135,94,213,104,140,252,229,194,57,93,114,201,37,231,167,72,93,181,166,115,106,63,48,255,184,184,63,69,158,63,42,60,231,247,215,106,195,127,83,175,239,254,66,44,48,56,56,252,147,185,204,239,237,106,44,202,79,207,62,172,215,235,71,170,213,161,191,75,17,215,207,52,85,107,181,161,27,235,245,145,191,90,48,84,209,174,148,183,157,184,239,229,244,42,114,62,152,59,86,188,115,78,207,104,235,11,192,115,149,0,125,134,52,62,243,243,111,93,237,57,192,51,145,83,188,126,65,211,162,117,150,59,205,4,200,63,74,17,183,206,52,245,23,69,223,13,17,241,167,17,17,81,180,127,47,202,98,110,85,59,69,188,111,176,186,173,22,69,254,245,177,177,177,239,69,68,12,109,30,186,172,221,31,239,203,57,110,238,24,122,255,209,233,167,62,215,249,62,131,213,225,95,207,145,239,236,24,235,115,131,213,161,95,74,149,252,209,209,209,209,253,17,81,12,14,14,94,151,115,229,67,145,243,92,9,189,28,233,47,26,51,135,168,68,68,52,26,187,191,89,171,13,125,188,251,228,195,252,217,193,129,193,155,198,154,99,127,25,17,237,235,174,187,174,127,124,124,239,107,114,153,239,237,252,188,41,242,31,140,45,216,238,145,114,126,32,82,186,126,126,172,184,183,86,27,122,199,244,116,223,131,19,19,223,123,124,104,104,104,107,187,149,110,203,145,207,232,9,134,17,17,185,232,27,143,60,191,232,156,34,255,204,224,224,224,215,214,175,95,255,173,157,59,119,30,59,211,243,1,88,107,220,92,2,44,105,120,120,120,83,142,244,230,142,166,131,17,237,19,86,100,23,83,148,101,87,157,228,156,231,3,243,216,216,216,87,34,199,47,118,61,31,233,45,185,44,118,214,170,67,185,86,29,202,237,190,216,21,221,225,57,114,228,119,238,221,187,247,112,103,219,88,99,247,221,17,241,201,238,126,241,219,101,59,77,206,140,213,206,101,241,229,217,19,18,103,60,145,115,250,247,11,166,156,203,114,250,93,17,209,25,132,47,200,169,184,191,86,29,106,213,170,67,121,98,124,223,84,138,244,231,17,177,161,163,207,63,28,157,58,242,75,139,124,1,62,29,17,211,29,45,23,69,142,79,246,247,181,38,106,213,161,220,110,69,51,98,169,173,48,211,167,181,114,70,89,30,123,56,34,158,238,104,122,121,46,139,47,31,61,50,125,180,86,29,202,213,234,208,99,167,243,253,1,214,58,1,26,88,82,123,42,110,136,136,239,155,189,206,17,127,84,175,215,143,172,228,181,99,123,198,190,20,199,203,193,69,68,68,138,252,19,131,131,131,151,207,94,215,155,35,31,233,88,161,62,185,148,110,111,52,70,255,124,177,105,30,155,122,250,231,58,183,118,172,96,172,215,55,155,143,61,178,176,185,217,108,238,43,42,249,39,99,153,27,17,23,248,66,42,202,215,45,12,245,17,199,143,54,79,57,222,185,194,113,150,173,95,125,170,53,155,205,167,35,197,157,39,239,9,192,98,4,104,96,73,185,200,111,232,188,174,228,142,147,251,78,174,149,34,22,28,157,157,94,217,121,57,214,24,249,112,164,116,99,142,244,215,203,140,243,165,84,164,27,234,245,221,183,47,213,97,239,222,189,135,235,205,145,183,164,72,183,68,196,195,203,140,245,177,74,25,87,213,235,187,191,184,84,135,209,209,209,93,145,218,63,30,57,255,102,68,60,177,68,183,70,228,124,219,209,99,27,126,122,108,108,172,185,212,88,99,205,145,143,22,57,191,34,34,125,101,137,46,251,83,78,111,76,57,45,117,148,249,162,250,250,250,122,89,161,94,162,111,251,142,20,121,209,123,51,78,86,70,15,224,185,238,172,175,155,212,24,159,204,17,17,213,45,23,158,245,115,133,115,201,21,87,92,177,254,232,209,169,174,234,27,245,250,232,31,199,242,181,145,187,12,111,25,30,110,245,149,115,199,127,167,178,216,59,214,220,189,104,8,31,28,28,188,188,44,139,161,34,167,205,185,200,69,68,122,162,104,151,123,71,247,140,126,179,151,247,140,136,84,171,213,126,56,162,175,154,115,121,105,68,28,205,57,38,251,115,106,140,236,25,249,78,15,227,28,191,25,50,250,175,73,101,107,75,153,42,207,143,40,159,168,148,177,231,252,231,159,255,237,29,59,118,76,245,56,214,21,169,236,223,30,41,15,228,84,246,167,178,56,212,191,161,248,252,174,93,187,14,86,171,219,127,32,165,214,203,102,251,78,79,247,223,63,49,241,189,199,103,175,7,7,134,127,166,179,94,246,114,127,14,181,90,237,5,17,197,203,231,190,24,41,127,125,108,108,236,171,75,205,107,96,224,242,193,74,180,127,60,23,229,220,61,49,57,199,177,70,99,244,222,165,94,3,112,186,200,125,167,72,99,124,50,207,126,49,1,0,56,119,173,149,220,103,11,7,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,2,52,0,0,244,64,128,6,0,128,30,8,208,0,0,208,3,1,26,0,0,122,32,64,3,0,64,15,4,104,0,0,232,129,0,13,0,0,61,16,160,1,0,160,7,107,33,64,151,17,17,57,231,181,48,87,0,0,158,129,142,172,87,174,234,68,86,224,172,15,165,41,197,161,136,136,3,7,14,60,111,181,231,2,0,192,233,49,155,245,102,179,223,217,236,172,15,208,57,71,51,34,226,216,177,60,184,218,115,1,0,224,244,152,205,122,179,217,239,108,118,214,7,232,148,210,35,17,17,237,136,171,87,123,46,0,0,156,30,179,89,111,54,251,157,205,206,250,0,29,57,30,154,121,240,146,213,157,8,0,0,167,207,76,214,155,203,126,103,175,179,63,64,151,249,139,199,31,164,87,172,238,68,0,0,56,125,102,178,222,92,246,227,89,105,76,76,142,53,198,39,115,179,57,121,253,106,207,5,0,128,83,171,217,156,188,190,49,62,153,27,19,147,99,171,61,151,149,56,251,87,160,143,187,47,34,34,87,210,205,171,61,17,0,0,78,173,142,140,119,223,170,78,100,133,210,106,79,96,37,198,30,127,252,138,162,236,123,52,34,162,18,241,194,45,91,46,252,246,106,207,9,0,128,103,111,124,124,242,154,118,196,183,34,34,202,162,245,130,193,75,47,221,185,218,115,58,153,53,177,2,61,120,233,165,59,115,142,187,34,34,202,148,110,91,237,249,0,0,112,106,204,102,187,156,227,174,181,16,158,215,148,137,137,195,155,155,19,147,7,26,227,147,185,222,156,124,199,106,207,7,0,128,103,167,222,156,124,71,99,124,50,55,39,38,15,76,76,28,222,188,218,243,89,169,53,177,2,29,17,177,121,243,249,19,57,231,91,35,34,82,17,191,239,134,66,0,128,181,171,217,156,188,62,21,241,251,17,17,57,231,91,55,111,62,127,98,181,231,116,206,170,239,153,188,179,49,62,153,27,227,147,141,241,241,201,107,86,123,62,0,0,244,102,124,124,242,154,198,248,100,163,49,62,153,235,123,38,239,92,237,249,60,39,52,39,246,127,102,54,68,91,137,6,0,88,59,102,74,214,53,142,111,221,216,255,153,213,158,207,115,74,71,136,182,39,26,0,96,13,152,221,243,44,60,175,162,142,237,28,185,57,177,255,83,182,116,0,0,156,125,198,199,39,175,105,78,236,255,212,220,226,231,26,223,182,177,38,234,64,47,167,49,254,196,205,41,165,15,229,28,23,68,68,68,74,255,61,181,243,61,3,3,23,254,221,42,79,13,0,224,57,173,217,156,188,62,87,210,205,145,243,91,35,34,82,138,131,57,231,91,171,91,46,186,103,181,231,246,108,172,249,0,29,113,188,196,221,116,57,245,129,148,226,231,59,154,191,27,145,255,103,68,250,82,37,226,255,174,95,159,198,54,109,218,244,100,74,169,92,181,137,2,0,156,131,114,206,197,129,3,7,158,119,236,88,30,108,71,92,29,145,95,18,145,94,17,17,63,56,223,39,238,234,47,214,221,126,46,84,219,56,39,2,244,172,177,199,31,191,162,200,125,111,139,136,55,69,142,218,106,207,7,0,224,57,45,69,61,34,238,43,83,235,15,207,165,67,82,206,169,0,221,169,217,156,124,105,20,233,101,145,226,186,156,243,149,41,197,64,206,241,253,177,134,106,95,3,0,172,17,101,74,113,40,231,104,166,148,30,137,28,15,69,153,191,56,48,112,225,131,171,61,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,59,254,63,161,5,32,226,43,81,58,16,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":37181,"duration_micros":1329,"top":530.0,"left":40.0,"width":640.0,"height":238.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,127,116,165,215,89,31,250,239,62,154,177,199,14,182,39,142,39,182,165,51,146,108,6,2,38,105,108,92,10,44,2,177,233,13,16,192,177,39,33,129,4,72,20,66,66,105,105,99,10,244,94,46,189,181,13,183,183,191,104,155,64,10,52,132,90,129,155,164,36,56,99,199,37,252,234,173,29,72,218,82,98,28,8,152,95,198,214,204,72,154,153,216,76,108,199,191,165,115,246,253,67,210,204,145,70,210,72,163,35,157,51,51,159,207,90,90,107,222,253,190,103,191,143,70,107,52,207,217,231,121,159,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,102,40,189,14,96,179,76,79,31,253,250,52,202,43,83,114,109,173,245,37,165,100,176,214,92,144,164,209,235,216,0,0,206,48,237,82,242,133,90,51,93,74,249,139,212,220,151,118,253,196,224,224,197,191,215,235,192,54,195,25,149,64,31,252,220,231,246,52,234,182,183,39,121,83,106,154,189,142,7,0,224,172,86,50,153,228,131,237,50,251,139,187,95,252,226,7,123,29,78,183,156,17,9,244,145,35,79,94,58,211,126,254,150,82,242,131,29,195,127,158,212,223,78,202,255,24,72,254,244,220,115,203,193,157,59,119,62,81,74,105,247,44,80,0,128,51,80,173,181,241,216,99,143,93,248,220,115,117,119,43,249,138,164,126,109,82,190,41,201,151,29,191,38,63,191,189,113,206,109,151,94,250,69,71,122,24,106,87,156,246,9,244,212,225,191,121,91,41,229,223,214,154,139,146,36,165,140,151,86,253,165,193,193,139,63,217,227,208,0,0,206,106,211,211,71,95,81,7,202,219,82,235,88,146,148,146,199,107,173,63,50,116,217,139,126,169,215,177,157,181,38,15,29,253,185,169,195,71,235,212,225,163,117,250,200,231,239,56,124,248,232,203,122,29,19,0,0,139,29,62,124,244,101,211,71,62,127,199,66,222,54,121,232,232,207,245,58,166,179,210,244,145,207,239,59,246,67,152,62,250,3,189,142,7,0,128,213,77,78,31,253,129,142,197,207,125,189,142,231,172,210,145,60,79,77,79,31,125,69,175,227,1,0,96,109,166,167,143,190,98,234,240,209,41,73,244,22,234,40,219,152,82,178,1,0,112,250,57,124,248,232,203,22,146,104,229,28,155,108,234,240,223,188,237,216,178,191,149,103,0,128,211,214,252,74,116,157,251,250,155,183,245,58,158,51,210,145,35,79,94,58,125,228,232,99,106,158,1,0,206,12,11,53,209,211,71,142,62,118,228,200,147,151,246,58,158,51,206,66,233,198,244,145,207,223,209,235,88,0,0,232,142,133,238,28,167,83,41,199,105,209,7,250,224,231,62,183,167,209,222,246,87,73,50,144,252,173,203,46,187,248,179,189,142,9,0,128,141,59,124,248,232,203,90,201,31,39,73,187,49,251,37,167,195,142,133,141,94,7,176,22,243,219,115,39,165,140,75,158,1,0,206,28,151,93,118,241,103,83,202,120,210,145,243,245,185,211,34,129,78,242,166,36,41,173,106,215,26,0,128,51,76,71,142,247,166,158,6,114,166,152,158,62,250,245,243,79,104,254,89,175,99,1,0,96,115,76,29,62,250,103,243,157,214,190,190,215,177,156,76,255,175,64,55,202,43,231,254,80,127,187,183,129,0,0,176,121,230,115,189,99,185,95,255,234,255,4,186,228,218,249,63,252,143,222,6,2,0,192,230,153,207,245,142,229,126,253,171,239,19,232,90,235,75,146,100,32,249,211,94,199,2,0,192,230,88,200,245,22,114,191,126,214,247,9,116,41,25,76,146,115,207,45,7,123,29,11,0,0,155,99,33,215,91,200,253,250,89,223,39,208,181,230,130,36,217,185,115,231,19,189,142,5,0,128,205,177,144,235,45,228,126,253,172,239,19,232,204,199,88,74,105,247,58,16,0,0,54,71,71,174,215,247,249,105,223,7,8,0,0,253,68,2,13,0,0,235,32,129,6,0,128,117,144,64,3,0,192,58,72,160,1,0,96,29,36,208,0,0,176,14,18,104,0,0,88,7,9,52,0,0,172,131,4,26,0,0,214,65,2,13,0,0,235,32,129,6,0,128,117,144,64,3,0,192,58,72,160,1,0,96,29,36,208,0,0,176,14,18,104,0,0,88,7,9,52,0,0,172,131,4,26,0,0,214,65,2,13,0,0,235,32,129,6,0,128,117,144,64,3,0,192,58,72,160,1,0,96,29,36,208,0,0,176,14,18,104,0,0,88,7,9,52,0,0,172,131,4,26,0,0,214,65,2,13,0,0,235,32,129,6,0,128,117,144,64,3,0,192,58,72,160,1,0,96,29,36,208,0,0,176,14,18,104,0,0,88,7,9,52,0,0,172,131,4,26,0,0,214,65,2,13,0,0,235,32,129,6,0,128,117,144,64,3,0,192,58,72,160,1,0,96,29,36,208,0,0,176,14,18,104,0,0,88,135,109,189,14,0,216,90,187,7,71,223,90,27,237,21,255,237,151,118,105,37,237,71,51,144,67,207,60,115,254,159,63,250,232,95,124,225,84,239,53,60,60,252,194,86,171,49,210,168,25,77,114,94,106,107,178,108,47,83,231,156,115,206,212,131,15,62,248,220,169,206,59,56,248,197,187,27,141,153,111,89,56,174,181,241,217,169,169,137,255,121,170,243,1,192,122,72,160,225,44,83,75,253,55,169,229,69,43,159,79,146,70,210,78,118,156,251,108,154,67,35,191,214,24,168,183,30,56,112,224,79,215,50,255,200,200,200,229,173,153,124,107,82,223,220,110,149,111,40,169,243,115,38,41,141,212,86,242,236,51,51,105,54,71,222,83,74,251,253,7,15,30,252,244,122,191,135,70,102,222,152,90,254,85,71,212,159,76,242,245,235,157,7,0,78,133,18,14,224,100,190,163,221,42,247,239,30,28,189,233,36,215,149,102,115,228,251,91,179,153,78,201,251,82,202,55,172,122,117,205,15,213,118,227,15,154,67,35,31,31,30,30,126,225,58,226,217,150,82,222,182,232,198,201,43,70,46,31,249,242,117,204,1,0,167,76,2,13,172,197,246,90,234,135,135,134,174,120,249,114,39,155,205,230,121,187,135,134,127,62,53,191,120,10,115,191,186,182,26,239,31,28,28,60,127,45,23,15,15,14,127,77,146,47,93,58,222,42,245,134,83,184,55,0,172,155,4,26,206,110,83,147,83,251,75,231,215,142,243,182,239,72,105,125,73,74,253,222,148,60,208,113,237,246,70,90,63,184,220,36,181,14,252,112,77,249,129,37,195,159,73,205,247,215,12,188,228,156,115,7,118,238,56,111,251,142,118,29,24,73,201,183,37,229,179,139,94,159,122,195,64,57,231,231,175,189,246,218,237,39,11,184,221,40,55,46,123,98,110,85,122,224,100,175,7,128,141,42,39,191,164,183,166,14,31,173,73,50,116,217,197,125,31,43,156,14,154,67,35,143,38,89,168,129,158,154,156,218,223,92,233,218,203,47,31,249,202,129,70,238,235,24,122,124,114,106,255,11,147,212,133,129,193,193,145,107,26,37,127,184,232,133,53,63,187,227,252,237,63,182,210,131,130,131,131,131,231,15,148,115,126,190,166,190,121,209,137,82,94,61,57,57,241,155,43,198,222,108,158,151,58,112,40,201,69,203,157,111,215,124,221,244,244,254,255,190,210,235,1,232,111,167,75,222,103,5,26,206,110,171,254,14,56,116,104,255,253,53,57,210,49,116,209,208,208,208,197,139,39,168,255,162,243,184,164,254,194,228,244,254,119,174,214,101,99,122,122,250,233,90,102,255,94,146,123,22,159,169,127,119,181,120,74,187,188,42,43,36,207,73,210,104,228,100,117,218,0,176,97,18,104,96,53,181,36,135,58,7,182,111,223,254,212,194,159,135,135,135,175,76,41,223,220,113,250,145,109,51,3,183,166,99,133,122,37,147,147,147,207,164,148,127,189,232,102,53,223,145,85,202,48,106,105,188,190,243,184,213,206,181,73,30,57,126,65,222,209,108,54,207,59,217,189,1,96,35,36,208,112,118,107,175,118,114,100,100,228,242,36,87,31,27,168,249,244,196,196,196,179,199,14,103,203,171,59,175,175,201,127,124,248,115,15,119,174,88,175,106,199,142,109,247,164,212,119,44,124,149,82,255,159,93,187,118,45,155,0,15,14,14,94,146,228,123,58,99,57,116,104,255,31,150,212,247,117,92,118,81,173,3,223,184,214,251,3,192,169,208,7,26,206,110,43,190,137,110,54,155,23,183,102,243,158,197,87,215,247,118,30,214,228,107,23,29,215,186,98,253,242,114,230,203,60,214,212,185,99,160,156,243,237,181,99,97,187,36,227,73,210,78,227,99,37,245,199,143,133,152,250,250,36,191,190,158,56,0,96,61,36,208,112,118,59,191,217,28,126,123,231,64,105,151,237,41,217,83,107,94,151,100,248,248,137,242,123,237,246,204,7,22,189,186,228,202,206,195,109,219,22,117,237,232,170,118,234,219,58,159,40,153,173,141,255,146,36,83,83,19,255,171,57,52,242,96,146,61,73,82,83,222,52,56,56,248,163,211,211,211,143,110,86,44,0,156,221,36,208,112,118,187,40,181,44,94,85,94,230,185,231,154,124,50,117,230,77,211,211,211,79,119,12,151,36,47,237,56,158,57,112,224,192,99,155,17,228,224,224,21,47,41,105,191,162,99,232,227,135,14,61,188,127,254,207,237,148,242,75,169,199,30,102,220,94,202,182,87,39,249,149,205,136,5,0,212,64,3,39,213,72,57,84,235,142,69,169,245,174,93,187,94,144,228,130,133,227,146,60,152,53,60,60,120,42,6,210,94,188,73,74,169,31,90,124,197,236,146,146,141,198,247,110,70,28,0,144,72,160,225,108,247,108,230,86,106,143,125,213,228,63,39,249,163,206,139,106,234,235,75,153,253,221,102,179,57,180,48,246,200,35,143,60,149,100,230,248,53,217,147,205,233,45,223,168,37,127,175,227,120,166,221,158,93,84,107,61,57,57,249,217,212,124,122,225,184,164,190,170,217,108,238,217,132,88,0,64,9,7,156,229,62,63,57,181,255,205,203,157,24,28,188,114,120,160,204,254,100,77,121,75,146,148,100,180,212,109,63,159,228,198,204,173,52,215,36,127,146,228,154,249,151,108,223,115,241,158,11,30,60,250,224,19,221,12,112,104,104,244,239,36,245,139,59,134,126,117,133,250,230,247,39,249,219,199,15,27,223,150,228,221,221,140,5,0,18,9,52,156,237,86,108,99,55,61,253,208,129,209,209,209,191,55,59,83,191,44,201,87,39,115,91,110,15,14,142,92,61,61,189,255,254,36,73,201,254,212,99,9,116,158,61,127,246,203,115,52,191,223,205,0,75,109,223,152,210,185,176,93,94,210,28,26,249,229,19,46,172,217,181,248,184,124,127,146,159,201,38,149,149,0,112,246,146,64,195,89,172,158,228,119,192,196,196,196,179,67,67,163,183,151,212,175,94,24,27,40,229,107,146,220,159,36,165,157,79,213,178,104,247,191,111,77,214,158,64,239,217,179,231,220,103,159,125,126,209,10,248,142,167,207,249,213,133,85,236,185,173,187,203,219,150,68,253,85,73,190,234,132,201,78,44,30,121,233,240,229,195,95,121,224,208,129,251,78,56,3,0,27,160,6,26,206,98,229,36,27,169,36,73,41,245,64,231,113,59,245,242,99,127,46,3,31,91,116,113,173,63,120,197,139,175,184,116,173,247,127,246,217,217,175,77,45,239,237,248,250,145,7,143,62,248,212,241,43,6,174,79,150,172,44,175,67,171,81,108,237,13,64,215,89,129,134,179,219,26,126,7,212,102,231,242,110,163,230,88,141,243,212,212,67,127,217,28,28,254,173,142,237,188,119,205,110,111,221,150,228,7,115,242,210,137,146,90,223,182,120,32,239,77,210,234,24,122,221,226,87,148,159,76,218,147,43,70,90,27,141,146,250,11,29,243,189,249,170,171,174,250,169,7,30,120,224,249,147,196,2,0,107,38,129,134,179,219,236,106,39,71,71,71,119,206,206,212,31,236,28,107,165,254,197,162,139,26,3,255,36,181,189,144,64,167,166,252,64,115,104,244,217,29,231,109,251,223,231,119,26,60,193,37,151,188,228,130,29,231,62,247,83,73,253,158,206,241,129,86,249,232,194,159,7,7,7,47,73,77,103,59,186,201,11,47,60,255,159,159,44,25,30,26,26,185,174,36,223,53,127,56,252,228,99,79,190,50,201,239,172,246,26,0,88,15,9,52,176,212,64,179,217,188,172,214,129,171,103,103,234,191,204,226,205,82,30,153,153,121,230,158,206,139,39,39,31,254,227,221,67,35,63,82,147,127,123,124,180,190,243,217,103,102,94,217,28,28,121,79,45,3,191,119,238,185,57,146,36,51,207,204,252,173,118,99,224,21,37,207,254,112,150,148,102,148,154,31,155,56,60,49,113,236,120,110,51,148,237,199,102,76,110,95,203,74,114,41,249,181,212,99,9,116,106,201,107,35,129,6,160,139,36,208,112,118,187,188,57,52,114,98,169,69,93,190,161,115,169,185,237,145,71,30,121,114,233,248,193,169,253,239,110,14,14,95,144,82,110,237,24,190,58,37,239,43,105,229,249,133,117,232,70,35,101,185,202,142,146,95,58,56,181,255,223,45,30,108,124,111,103,21,72,163,209,190,123,13,223,79,158,123,238,233,223,58,247,156,243,159,78,114,254,220,183,82,222,60,58,58,250,227,19,19,19,155,178,75,34,0,103,31,15,17,2,107,82,83,199,15,78,239,255,133,21,78,183,38,167,15,220,150,146,239,62,133,137,127,243,185,231,158,190,57,29,15,52,54,155,205,61,37,245,85,29,87,253,201,193,131,7,215,212,77,227,145,71,30,121,178,164,118,110,227,125,254,204,76,251,155,214,29,23,0,172,64,2,13,172,174,228,225,148,124,247,212,212,129,239,203,226,7,252,78,48,57,185,255,131,237,186,109,56,181,222,154,228,241,147,76,252,7,53,245,134,201,233,253,223,118,226,170,118,227,219,22,135,144,219,179,134,142,33,199,174,175,185,99,241,235,203,119,174,245,181,0,112,50,74,56,224,44,83,106,249,177,218,104,175,233,223,126,105,15,236,63,56,245,240,127,203,73,30,54,236,52,61,253,215,7,147,220,54,60,60,252,51,179,179,229,203,27,141,92,148,228,133,181,150,237,141,154,199,219,165,62,81,107,62,63,61,61,241,217,149,231,45,7,83,234,59,22,142,218,181,245,27,107,189,127,146,180,27,237,79,38,141,119,116,142,93,117,213,85,231,232,198,1,192,89,97,234,240,209,58,117,248,168,157,196,0,0,206,112,167,75,222,167,132,3,0,0,214,65,2,13,0,0,235,32,129,6,0,128,117,240,16,97,191,27,219,55,154,180,199,182,230,102,245,51,201,192,99,73,62,147,241,189,167,71,207,220,177,125,59,147,236,76,146,140,239,157,88,230,252,253,73,238,77,242,238,101,207,159,210,61,239,184,245,228,23,117,75,227,222,140,239,189,119,235,238,7,0,156,140,4,186,239,213,91,147,198,91,182,252,182,99,251,238,77,169,227,169,229,19,93,75,60,79,61,150,209,164,125,93,82,174,78,202,72,146,209,249,175,157,75,174,75,146,207,204,127,189,63,105,188,50,105,95,157,228,234,36,55,101,108,223,120,198,247,222,182,177,88,238,24,75,26,183,108,104,142,117,105,39,115,111,0,0,128,62,177,220,102,99,125,101,225,73,204,161,203,46,238,251,88,187,110,108,223,104,146,135,123,29,70,146,119,37,185,109,203,86,165,231,86,149,175,78,234,77,73,185,49,115,201,114,183,76,164,212,91,115,251,107,223,127,10,113,141,38,185,167,203,241,156,68,251,182,140,191,110,11,87,188,1,160,119,78,151,188,79,13,116,95,171,253,146,56,221,156,228,254,249,4,114,243,140,237,187,46,99,31,125,87,230,222,52,220,147,148,119,166,251,201,234,104,106,25,207,216,190,135,243,214,143,174,115,101,191,241,150,77,136,231,100,247,28,217,218,251,1,0,39,35,129,238,87,99,251,70,147,178,245,165,27,43,27,205,92,18,125,117,215,103,30,219,119,93,198,246,221,147,227,73,243,206,147,189,164,11,214,151,72,207,149,145,244,203,27,26,0,160,135,36,208,125,171,111,86,159,59,237,76,114,79,215,86,162,23,37,206,185,174,43,115,174,223,241,68,122,108,223,42,49,244,229,207,3,0,232,1,9,116,63,234,191,213,231,78,59,147,220,190,161,25,198,246,141,246,65,226,188,212,92,125,243,91,63,118,227,9,103,122,251,243,216,226,146,17,0,224,100,36,208,125,169,239,87,59,175,91,125,181,118,21,99,119,189,51,201,253,233,159,196,185,211,68,106,235,19,39,14,247,253,207,3,0,216,66,218,216,245,155,185,242,136,126,93,125,238,80,111,202,122,218,171,205,117,214,184,61,105,223,180,105,33,109,84,105,220,154,219,111,92,220,105,100,238,141,66,47,127,30,91,81,15,14,0,172,131,21,232,254,179,177,242,136,45,83,78,44,117,88,201,220,155,130,251,147,244,111,242,156,76,228,246,27,151,107,109,215,235,159,135,4,26,0,250,140,21,232,126,50,183,218,217,143,165,13,203,25,205,216,190,157,39,237,13,61,215,181,227,158,244,123,34,88,26,39,150,105,140,221,49,22,53,200,0,156,130,215,127,236,195,195,179,237,214,77,53,237,107,74,50,152,82,46,79,114,249,252,233,67,169,245,80,77,166,75,26,247,111,107,12,220,249,145,215,188,225,64,47,227,101,125,36,208,253,101,11,119,184,235,138,209,204,237,250,183,188,211,37,121,78,238,93,126,245,121,43,119,28,4,224,116,119,195,221,31,188,100,123,187,254,80,59,229,53,179,117,246,154,148,164,44,191,103,221,37,41,229,101,115,103,234,216,108,157,125,247,77,119,125,240,254,70,234,199,102,26,229,61,119,223,240,166,71,183,52,112,214,77,2,221,47,230,86,59,79,151,213,231,5,43,39,198,167,79,242,156,36,111,61,97,164,127,86,159,251,33,6,0,86,113,195,221,119,159,191,189,253,196,143,212,118,126,180,166,92,120,42,91,232,149,228,154,154,114,205,182,118,126,248,166,187,62,244,111,90,141,47,250,119,119,223,112,195,211,93,15,150,174,80,3,221,55,206,160,213,206,227,91,94,159,14,201,243,120,198,247,78,44,26,25,219,183,243,140,250,121,0,176,105,94,123,231,135,246,110,107,127,225,193,154,242,147,73,46,236,194,148,23,150,212,159,218,214,254,194,95,221,116,247,7,251,249,217,161,179,154,4,186,31,244,207,106,231,122,157,88,190,113,122,37,207,73,114,219,137,67,141,205,216,66,252,212,205,117,48,1,160,207,236,189,243,131,255,172,150,122,71,142,215,54,119,211,96,105,231,163,175,189,235,3,255,215,38,204,205,6,41,225,232,11,93,95,237,28,95,229,220,213,243,95,27,53,177,194,3,132,247,164,159,146,207,85,213,119,103,252,181,75,87,159,71,147,246,205,61,10,104,37,59,147,172,254,176,38,0,91,102,236,158,219,119,60,254,196,185,239,79,242,134,77,190,85,169,41,63,185,247,174,15,190,244,162,11,159,123,203,248,245,111,125,118,147,239,199,26,73,160,123,173,251,171,207,143,101,124,239,137,53,189,139,238,185,239,230,36,255,126,131,247,57,177,7,244,216,93,183,36,237,211,36,121,206,68,82,222,117,226,112,227,45,73,251,177,44,78,88,79,151,239,169,167,118,237,218,245,69,231,156,115,222,87,55,106,125,65,43,173,255,62,61,61,237,33,152,36,67,67,163,55,151,114,252,19,153,201,201,9,27,243,192,105,238,241,39,118,252,114,82,95,191,133,183,124,195,227,79,156,155,36,223,185,133,247,100,21,167,82,231,190,165,166,14,31,173,73,50,116,217,197,125,31,235,41,25,219,119,93,210,120,121,50,251,194,185,129,198,141,217,216,10,241,189,25,223,123,253,26,238,123,255,6,239,115,125,198,247,30,79,162,231,90,240,221,179,129,249,214,98,34,201,189,73,125,60,169,29,9,110,217,153,148,151,103,46,209,93,91,178,91,26,99,43,244,125,94,108,236,142,177,164,209,235,94,208,87,156,80,167,125,10,154,205,145,215,37,245,226,227,35,237,123,38,39,39,31,92,207,28,195,151,13,95,213,222,150,175,91,56,46,237,129,253,7,167,31,254,237,209,209,209,157,179,51,245,15,146,236,153,63,245,116,74,235,229,235,157,255,76,212,28,26,253,95,73,253,170,133,227,109,219,203,121,19,19,19,86,145,224,52,117,211,93,31,186,165,244,104,135,218,146,250,207,62,122,227,119,255,84,47,238,189,85,78,151,188,207,10,116,175,205,37,161,157,137,232,218,55,40,89,86,251,174,53,94,56,145,83,79,160,239,93,148,60,207,217,172,36,243,222,36,239,158,191,231,201,203,24,230,106,176,175,203,92,75,192,149,146,233,149,54,77,89,198,134,203,107,238,205,198,187,171,140,102,238,231,181,33,165,157,43,106,41,255,230,216,64,109,252,203,36,63,190,158,57,218,3,141,119,166,214,119,28,31,169,223,149,36,51,51,245,154,114,60,121,78,146,243,147,198,245,73,206,250,4,26,56,115,188,246,206,15,237,173,169,61,123,200,188,166,220,118,211,221,31,252,236,157,55,188,233,206,94,197,192,28,15,17,246,147,185,228,111,131,245,201,141,149,251,50,47,182,145,178,132,31,94,116,52,118,215,106,201,234,41,170,239,78,242,194,140,239,189,62,227,123,239,92,83,242,156,36,227,123,39,50,190,119,60,227,123,175,72,114,125,150,123,208,113,185,77,83,150,179,241,242,154,137,164,253,137,13,188,190,171,90,105,220,189,104,160,148,183,53,155,205,243,214,250,250,209,209,209,157,73,253,158,142,161,167,183,239,104,252,230,220,84,141,191,57,241,21,229,232,169,69,10,208,127,190,233,183,126,249,5,181,212,255,144,222,126,122,95,74,59,255,225,134,187,239,62,191,135,49,16,9,116,159,105,117,227,225,190,147,39,208,27,74,212,235,187,51,190,247,248,61,230,30,186,235,230,71,89,19,73,174,207,248,107,111,94,115,210,188,146,241,189,247,102,124,239,53,153,235,243,188,176,130,187,117,171,207,107,77,212,79,58,207,192,69,221,152,102,122,250,225,191,40,201,167,58,134,118,149,178,237,27,214,250,250,214,243,249,150,36,199,127,105,151,220,254,208,67,15,61,158,36,147,147,15,255,113,73,249,200,194,169,154,220,151,180,62,222,133,176,211,28,28,190,165,57,52,82,155,67,35,117,104,104,228,112,55,230,4,88,175,23,60,179,237,71,178,57,221,54,214,107,112,160,253,228,63,238,117,16,103,59,9,116,95,105,108,180,223,227,218,202,28,78,189,118,107,34,41,75,94,219,213,58,176,123,147,92,179,76,121,200,198,140,239,29,207,241,213,232,213,31,176,92,176,241,213,231,199,82,187,180,250,92,103,94,216,149,121,146,180,83,223,187,104,234,86,125,221,154,195,104,180,191,107,241,72,249,181,206,163,131,83,19,111,170,41,215,212,148,107,102,103,159,125,229,228,228,228,51,27,137,245,248,109,26,131,199,254,232,119,22,208,3,175,255,248,135,119,165,228,71,123,29,199,130,146,250,99,55,220,253,193,75,122,29,199,217,76,13,116,95,41,47,223,216,235,235,31,173,122,122,174,159,240,45,73,222,114,10,147,207,175,12,119,36,232,115,43,217,167,50,215,114,238,204,248,222,189,93,154,235,68,115,15,225,93,179,246,23,108,184,246,249,206,140,239,157,200,216,29,27,156,166,187,106,157,253,120,41,219,103,146,108,79,146,148,124,247,232,232,232,63,153,152,152,88,245,141,215,224,224,149,195,169,173,206,250,252,191,158,156,156,248,228,146,203,102,167,166,38,214,90,66,180,14,117,119,247,231,4,88,187,217,217,217,31,74,114,65,175,227,232,112,225,246,118,253,161,36,186,250,244,136,4,186,95,116,165,254,185,62,54,223,13,99,137,246,104,82,174,206,92,178,123,42,155,114,44,36,207,75,30,100,171,183,118,169,20,108,34,107,93,25,222,10,221,105,45,184,204,6,45,167,172,107,27,169,76,79,79,63,58,52,52,252,129,146,50,54,63,116,254,204,76,251,155,146,124,120,181,215,13,164,245,237,181,115,160,148,247,37,153,237,28,218,61,56,250,157,181,209,62,182,11,215,165,151,238,26,191,239,190,251,102,146,228,146,75,94,114,193,142,29,207,28,91,193,110,181,202,125,135,14,237,255,195,36,141,161,161,43,94,54,80,91,47,110,149,188,176,148,178,125,114,114,255,7,6,7,135,111,104,52,114,89,146,164,230,43,58,110,179,163,217,28,126,251,162,80,90,245,207,15,30,58,248,123,73,210,108,14,127,79,146,99,117,221,147,147,7,222,151,100,81,232,11,150,118,20,169,117,224,127,77,77,61,188,226,155,208,225,225,225,23,182,219,3,187,107,109,239,78,234,197,141,70,227,115,73,107,234,224,193,131,127,190,244,239,2,56,195,212,108,240,1,255,238,107,167,188,38,18,232,158,145,64,247,141,246,117,27,255,116,186,113,75,230,86,152,151,142,111,100,210,21,146,231,36,41,175,220,200,196,29,174,223,112,189,115,87,117,161,243,70,23,218,206,117,232,234,78,132,165,148,15,167,102,236,216,113,202,119,102,245,4,186,180,75,190,175,243,173,82,99,182,253,177,165,23,213,82,111,78,45,95,179,112,124,232,208,161,15,36,153,73,146,243,206,123,250,130,218,110,28,43,31,105,52,202,63,30,185,124,228,153,217,70,126,165,164,125,109,187,148,185,183,98,181,124,54,201,7,6,74,227,123,107,93,182,199,234,5,169,101,81,25,74,187,81,254,121,146,223,155,15,226,159,38,121,73,199,233,247,173,244,77,213,70,227,101,169,199,75,90,74,109,127,127,146,19,18,232,203,47,31,249,202,129,146,127,218,110,101,111,210,158,127,203,88,82,219,53,73,35,205,161,145,67,169,245,63,206,180,158,251,233,35,71,142,60,181,210,253,128,211,211,107,127,253,3,35,117,54,27,252,132,184,251,74,114,205,235,63,246,225,225,143,188,230,13,7,122,29,203,217,72,61,97,223,40,27,109,117,182,25,22,106,146,79,76,6,187,182,1,76,251,182,46,39,155,27,211,141,142,34,165,209,185,19,100,255,124,111,199,180,238,77,242,72,199,192,107,71,70,70,86,124,48,166,217,188,226,101,37,185,118,225,184,36,159,58,112,248,192,3,39,189,75,171,181,226,199,19,165,212,111,104,53,242,219,157,243,110,192,178,43,204,11,183,90,243,44,141,19,175,29,26,26,185,126,160,145,79,165,100,181,242,162,203,83,202,173,219,7,206,253,248,181,215,94,187,125,205,247,3,78,15,173,178,121,229,133,27,52,219,110,109,244,217,41,78,145,4,186,111,116,109,53,183,27,30,75,242,195,243,45,228,86,88,25,110,116,163,246,121,34,105,172,182,237,248,214,154,235,40,50,118,242,11,87,181,142,46,31,107,213,24,233,230,108,147,147,147,207,212,100,209,42,110,171,85,191,125,165,235,75,109,47,250,232,178,157,242,139,27,14,162,230,166,36,205,13,207,179,137,46,187,108,207,174,146,124,36,201,142,53,189,160,148,111,56,124,248,145,254,41,69,2,186,162,214,245,60,63,179,181,106,218,125,27,219,153,78,9,71,63,24,219,119,117,250,103,187,232,241,204,37,207,43,151,84,204,61,140,216,141,21,243,110,151,58,108,80,227,45,27,222,138,188,91,173,235,54,89,163,209,190,179,182,27,63,177,112,92,107,121,115,146,229,18,227,109,53,233,216,56,37,51,181,62,255,235,221,140,165,166,254,106,169,249,179,52,50,157,228,169,36,57,56,53,241,134,133,243,205,161,145,71,147,188,104,254,240,145,201,169,253,47,238,230,253,87,50,48,48,243,206,142,251,166,38,159,44,37,255,98,219,108,121,224,169,214,83,143,158,123,238,11,174,45,53,223,87,83,223,124,252,85,229,199,147,252,167,168,137,134,51,70,77,6,251,117,75,188,146,12,158,252,42,54,131,4,186,47,180,175,238,163,15,3,174,75,169,55,38,89,101,21,181,117,93,50,208,141,123,117,121,165,118,3,186,179,250,156,174,181,174,219,100,7,15,30,188,175,217,28,121,32,53,87,37,73,73,94,49,114,249,200,151,239,63,180,255,207,58,175,107,54,71,191,46,181,30,95,41,46,249,149,233,169,233,71,187,18,68,201,3,141,217,250,250,181,148,131,244,66,73,190,99,209,113,105,189,117,241,214,228,143,124,34,201,39,155,205,145,11,231,87,212,83,146,209,193,193,145,191,51,61,189,255,191,111,105,176,192,166,41,53,151,245,116,235,148,213,148,210,15,125,169,207,74,125,147,181,157,221,26,253,244,116,239,104,106,25,207,216,190,219,231,87,154,151,209,232,198,234,243,99,93,239,247,188,33,141,183,100,227,159,2,140,111,206,138,122,237,90,31,232,206,73,211,206,207,119,14,180,74,189,97,153,171,150,212,254,29,223,44,101,163,26,237,122,115,191,38,207,87,188,248,138,75,211,249,48,98,205,167,23,39,207,199,180,106,173,31,237,28,40,165,238,89,230,58,224,116,85,250,98,243,148,149,244,115,108,103,52,43,208,253,161,27,59,16,118,219,88,146,171,51,182,111,153,58,232,141,246,171,78,178,150,29,19,183,74,183,86,159,187,219,186,174,67,233,202,78,132,75,181,51,240,177,70,90,63,123,252,54,229,237,73,126,58,73,59,73,118,237,218,245,69,73,237,252,123,153,188,240,194,243,255,91,151,110,255,248,57,231,159,80,12,142,84,0,0,32,0,73,68,65,84,243,187,93,154,171,235,30,254,220,195,71,50,255,0,226,181,215,94,187,253,240,225,191,185,118,247,224,232,119,165,212,161,154,178,187,36,199,222,212,212,212,161,206,215,54,106,217,146,18,19,0,122,71,2,221,107,253,85,255,188,212,213,153,107,139,247,195,75,198,187,176,2,125,146,77,95,182,84,23,106,159,251,174,158,251,228,166,167,31,58,208,108,14,223,149,90,22,62,1,217,211,108,142,126,213,228,228,196,239,39,201,142,237,47,248,223,106,234,177,228,189,38,183,63,240,192,3,207,119,233,246,127,248,224,131,15,62,215,165,185,54,77,179,57,122,221,145,195,127,243,51,37,245,101,245,216,71,184,117,213,182,31,41,57,119,243,35,3,182,76,205,161,148,227,207,67,244,153,67,189,14,224,108,165,132,163,247,250,177,125,93,167,155,23,109,206,50,183,225,75,23,212,254,232,251,220,173,213,231,178,169,221,68,54,237,13,86,173,249,96,231,113,169,245,53,199,206,53,234,27,150,92,187,175,123,55,78,127,252,252,87,49,52,52,242,181,169,245,55,146,250,178,94,199,2,244,78,45,57,220,235,24,86,84,171,4,186,71,172,64,247,222,70,219,215,61,54,255,181,146,110,36,95,111,201,92,79,232,110,205,215,71,186,178,250,188,9,173,235,182,198,185,231,110,251,173,231,159,107,61,157,228,252,36,169,201,219,175,186,234,170,219,30,123,236,177,11,83,243,198,133,235,106,114,223,244,244,254,254,41,187,89,187,149,23,139,203,241,29,11,147,164,180,231,74,87,230,13,148,228,223,229,196,22,118,191,159,146,223,75,234,95,30,27,105,151,151,165,228,31,118,33,86,160,15,149,100,186,215,49,172,164,246,113,108,103,58,9,116,239,109,112,5,186,125,91,198,95,247,174,21,79,143,237,27,157,223,114,123,35,125,155,111,202,177,173,182,91,59,187,211,129,163,187,189,141,79,201,220,234,115,55,218,206,221,187,252,22,234,73,82,251,177,190,253,152,135,30,122,232,241,102,115,228,63,165,230,135,230,135,118,61,249,216,147,175,28,200,246,221,139,51,207,242,139,89,125,195,146,126,241,249,206,131,209,209,209,139,38,38,38,86,120,131,89,119,175,52,73,179,57,250,183,83,235,215,116,12,29,168,25,120,213,212,212,67,127,185,244,218,221,131,35,127,127,201,95,140,79,246,224,12,82,74,238,175,53,111,62,249,149,91,175,164,113,127,175,99,56,91,249,69,223,75,115,73,215,6,183,105,110,172,222,201,98,124,239,68,198,95,59,150,212,119,111,224,38,59,231,107,181,147,148,110,109,43,221,7,165,43,181,91,61,155,199,146,220,179,252,87,121,103,23,230,223,228,85,255,114,71,231,81,171,148,189,237,146,69,27,130,108,223,158,187,54,55,134,85,117,174,12,175,222,95,121,201,71,173,245,185,186,210,19,234,219,106,242,134,21,206,165,214,246,240,226,121,203,248,114,201,115,146,109,181,156,240,31,107,123,153,235,128,211,84,187,85,238,236,117,12,43,217,214,24,232,219,216,206,116,18,232,222,218,232,234,228,99,25,223,187,198,143,213,203,173,89,189,212,227,36,218,221,94,73,29,93,185,77,222,22,24,219,55,186,193,85,249,51,198,228,228,196,39,147,252,245,194,113,73,126,176,36,175,200,241,129,15,77,76,76,244,178,6,112,170,227,207,151,100,181,237,185,219,117,209,106,204,108,35,111,90,238,178,102,115,248,173,73,94,186,210,52,141,218,88,244,187,177,212,122,193,114,215,237,30,28,121,71,146,175,94,49,30,224,180,119,231,222,55,78,36,233,163,7,223,231,212,228,254,143,188,230,13,7,122,29,199,217,74,2,221,91,27,236,255,92,215,190,105,199,92,43,186,141,212,176,110,194,42,104,251,230,238,207,185,86,93,91,125,62,19,204,214,185,221,243,150,213,110,215,15,109,101,48,75,149,148,191,234,56,220,222,28,28,249,7,67,67,67,203,111,3,222,104,44,250,55,81,146,127,218,28,28,249,177,193,193,43,135,147,52,6,7,7,207,111,54,135,255,81,106,121,239,178,175,95,48,208,122,168,243,176,38,215,239,30,28,189,105,116,116,116,71,146,92,122,233,165,47,104,54,135,223,94,75,254,195,210,151,182,79,143,82,23,96,61,74,79,63,133,91,86,35,245,99,189,142,225,108,38,129,238,173,141,149,49,148,129,238,117,69,88,179,110,118,207,104,188,179,39,171,208,167,227,234,115,215,186,159,44,175,209,104,175,244,139,248,241,70,163,253,95,55,243,222,39,83,75,251,247,22,13,148,252,108,201,182,131,205,161,145,218,28,26,169,187,7,71,191,107,225,212,142,29,219,254,103,106,62,189,228,250,127,221,40,173,253,205,161,145,86,163,108,127,42,181,172,80,206,84,142,37,190,7,15,30,252,116,146,223,239,56,121,117,45,117,223,236,76,125,166,57,52,82,183,111,219,241,228,74,73,120,99,181,21,114,224,180,180,109,219,182,247,36,249,66,175,227,232,240,196,76,163,188,167,215,65,156,205,36,208,189,178,226,67,103,235,80,219,107,255,72,105,46,1,235,66,221,241,64,55,123,29,239,76,242,239,187,56,223,26,89,125,94,234,224,193,131,127,82,146,79,157,112,162,228,189,147,147,147,207,244,32,164,99,182,205,54,238,78,242,236,90,174,125,240,193,7,159,107,39,239,72,242,244,26,46,95,237,223,79,77,105,188,35,201,204,26,230,249,139,181,196,6,156,190,62,242,173,111,120,164,166,252,219,94,199,177,160,164,254,244,221,55,188,233,209,94,199,113,54,147,64,247,76,189,105,131,19,76,172,189,254,57,233,98,210,216,237,205,66,198,50,182,239,150,46,207,57,63,243,190,157,25,219,247,206,37,99,167,223,234,243,22,169,53,183,159,56,186,248,1,195,245,24,24,24,88,173,133,220,154,203,28,38,14,79,76,148,90,222,152,100,185,135,248,146,37,37,19,211,211,251,239,79,105,93,157,228,163,43,92,159,154,252,223,3,237,227,109,250,150,51,57,249,240,31,55,90,245,234,146,242,203,89,33,145,46,169,239,74,105,93,179,100,216,239,85,56,3,61,189,99,230,167,147,190,232,9,125,104,166,113,97,223,36,243,103,43,109,236,122,102,195,219,97,175,222,125,163,211,216,93,183,36,237,141,38,141,115,165,27,227,123,31,203,216,190,137,116,183,38,250,214,140,237,75,198,247,118,103,43,236,185,178,144,119,38,185,57,165,177,164,206,186,222,122,154,126,194,62,154,238,191,121,89,164,150,217,59,75,25,232,72,254,74,157,156,156,248,131,181,190,190,212,242,174,218,104,95,184,112,124,249,101,151,207,76,79,207,181,40,125,230,153,243,191,176,99,199,51,239,56,118,109,187,30,89,79,108,7,167,39,238,188,246,218,107,127,253,200,145,71,95,149,37,91,103,151,86,253,236,210,235,39,39,39,255,42,201,235,46,189,244,139,95,188,125,123,235,203,147,218,76,234,249,165,93,90,173,12,252,215,233,233,135,14,236,185,120,207,133,173,243,159,63,22,83,45,141,251,150,206,115,224,240,129,7,146,188,229,202,43,175,252,71,207,62,59,251,210,129,52,118,215,70,251,130,164,28,45,165,253,63,14,30,60,56,157,164,52,155,195,199,230,105,181,203,159,118,206,81,147,15,150,82,62,190,112,60,49,49,177,166,213,116,160,191,252,246,55,191,249,169,189,119,125,224,31,36,229,215,210,187,255,72,106,169,229,31,220,125,195,13,107,249,148,141,77,212,247,153,196,212,225,163,53,73,134,46,187,184,239,99,93,179,185,4,239,243,39,189,110,53,165,49,182,234,230,29,115,247,88,216,138,187,27,45,227,174,207,248,222,123,231,231,222,151,185,222,208,221,54,49,127,159,83,75,20,231,90,237,221,152,228,230,204,149,135,76,100,124,239,21,29,231,71,147,60,188,241,48,123,226,248,223,63,0,61,115,211,93,31,186,165,244,170,20,176,230,150,125,55,189,233,39,123,114,239,45,114,186,228,125,86,160,123,99,227,45,225,106,251,230,140,237,91,105,11,234,157,153,91,177,236,222,3,122,139,147,183,79,100,115,18,232,185,4,119,108,223,189,41,117,60,181,220,53,223,61,100,101,115,73,241,141,243,241,44,126,163,80,26,75,126,193,157,182,171,207,73,25,184,168,215,33,0,144,220,121,227,27,111,219,123,215,135,190,34,169,175,223,226,91,127,248,76,79,158,79,39,18,232,158,168,55,117,33,145,219,194,29,238,234,210,246,61,227,217,220,135,255,174,75,45,115,201,240,216,190,207,36,153,72,234,254,227,29,64,202,206,164,140,100,46,97,94,233,77,194,68,106,251,120,75,179,185,68,251,244,173,125,174,51,47,236,117,8,0,204,185,232,194,103,223,252,248,19,59,178,117,73,116,249,200,69,23,62,123,250,254,31,118,6,146,64,247,68,121,101,175,35,88,151,178,109,241,195,101,115,117,208,247,102,107,118,19,188,122,238,171,100,157,111,58,238,93,92,10,114,26,175,62,3,208,87,198,175,127,235,179,73,222,48,95,206,113,75,54,239,63,152,90,83,110,187,243,198,55,118,231,25,33,186,198,211,226,91,237,120,109,242,233,98,34,183,191,102,185,6,242,253,254,143,249,120,124,58,111,0,176,9,230,18,219,250,29,217,156,238,28,135,74,45,175,147,60,247,39,9,244,150,107,109,197,170,109,247,156,80,71,60,111,174,38,122,83,187,66,108,192,248,137,171,207,167,189,77,221,72,5,128,83,179,239,198,239,254,232,83,59,102,247,212,148,91,211,157,205,86,190,144,154,91,158,218,49,251,37,31,189,233,141,61,216,48,141,181,80,194,177,229,26,155,241,240,221,102,25,95,181,211,71,242,214,36,247,108,85,48,235,176,100,245,185,107,181,207,139,187,122,172,197,216,29,99,73,99,153,254,202,0,156,41,126,251,155,223,252,84,146,219,94,255,241,15,255,220,236,236,236,15,165,230,198,36,235,109,87,251,71,41,185,107,219,182,109,239,249,200,183,190,225,145,77,8,147,46,146,64,111,185,13,247,127,222,42,19,73,126,120,213,43,198,247,222,187,133,181,208,107,181,204,234,115,151,74,211,86,90,141,223,18,101,235,183,60,7,96,93,230,19,223,91,146,220,114,211,190,15,141,54,6,234,77,181,230,154,154,12,150,154,203,82,114,121,146,164,230,80,45,57,92,146,233,82,114,127,6,234,190,143,126,219,119,239,239,105,240,172,139,4,122,43,205,173,134,158,14,245,207,11,253,152,87,111,33,55,103,97,21,186,95,74,12,54,107,245,57,139,186,122,108,185,162,141,29,192,105,228,206,189,111,156,72,242,174,94,199,193,230,80,3,189,165,218,253,180,82,187,146,245,109,102,50,119,221,91,55,53,162,181,219,204,218,231,241,83,222,224,5,0,56,163,72,160,183,84,233,247,4,250,212,118,2,156,123,160,176,31,146,232,227,245,218,221,239,188,177,90,45,248,22,168,250,64,3,64,159,144,64,111,169,126,238,255,92,223,157,228,154,83,94,101,29,223,59,158,222,38,209,247,46,222,45,177,171,171,207,159,233,253,54,218,74,56,0,160,95,72,160,183,202,92,61,110,191,212,9,119,154,95,117,126,237,205,107,172,121,94,217,92,18,125,69,122,209,222,174,52,198,143,253,185,219,171,207,165,161,134,13,0,56,70,2,189,101,250,174,254,249,51,41,141,177,140,239,189,162,171,171,171,115,43,216,215,39,117,43,75,30,38,22,183,219,235,234,234,243,196,73,90,249,109,21,93,56,0,160,79,232,194,177,101,26,55,246,58,130,36,143,205,37,182,229,206,77,45,73,152,75,162,199,50,182,239,93,73,254,125,54,187,205,93,103,123,185,110,119,222,72,122,92,186,113,140,4,26,0,250,132,4,122,235,236,204,214,149,54,60,54,255,53,145,212,199,147,250,153,164,113,239,150,119,145,24,223,251,153,36,215,103,108,223,117,73,29,219,164,237,180,151,172,16,55,222,146,180,187,249,125,110,112,11,213,198,252,207,97,195,116,0,1,128,62,209,165,29,38,54,207,212,225,163,53,73,134,46,187,184,239,99,229,36,198,246,237,76,114,83,82,175,155,223,80,230,84,123,98,79,36,185,55,105,124,38,105,127,98,62,81,7,0,78,115,167,75,222,215,215,193,37,167,207,95,36,167,96,46,161,190,58,105,207,63,96,89,118,46,223,109,162,62,158,12,60,156,180,247,103,174,219,198,198,30,118,4,0,250,210,233,146,247,41,225,160,119,230,18,225,126,169,49,6,0,88,19,93,56,0,0,96,29,36,208,0,0,176,14,74,56,128,5,219,154,205,225,142,221,36,203,209,201,201,253,119,244,46,28,0,232,79,18,104,32,73,210,108,142,190,34,181,190,183,115,236,178,203,246,188,248,240,225,7,31,233,85,76,0,208,143,148,112,0,115,218,245,181,75,135,6,6,158,255,150,94,132,2,0,253,204,10,52,144,93,187,118,125,81,74,222,118,226,153,198,247,38,249,149,45,15,136,117,217,189,123,244,155,107,187,254,230,194,113,187,150,47,159,158,158,248,243,94,198,4,112,38,179,2,13,228,220,115,207,255,166,36,231,47,29,47,169,175,106,54,155,123,122,16,18,235,208,110,183,47,237,60,222,94,107,95,247,79,5,56,221,73,160,129,148,90,190,107,165,115,181,110,251,246,173,140,133,245,43,181,92,122,242,171,0,232,22,37,28,112,150,27,25,25,185,188,53,91,95,191,210,249,146,250,182,36,63,147,164,189,142,105,75,179,217,124,105,41,219,6,219,237,246,139,75,105,60,82,107,227,161,203,46,123,225,195,247,221,119,223,204,122,226,27,29,29,221,209,106,181,94,214,106,149,203,74,201,206,129,154,135,91,165,53,49,53,53,53,149,164,174,103,174,102,179,121,113,163,221,184,170,221,40,151,214,90,95,80,74,227,115,201,236,212,228,228,228,159,172,54,215,224,224,232,151,53,26,237,175,95,56,110,183,203,167,167,167,247,223,191,210,245,67,67,195,111,46,37,231,206,29,149,58,57,185,255,125,29,49,124,73,210,184,110,225,184,148,250,235,7,15,30,156,222,179,103,207,185,79,63,61,115,213,64,202,72,187,180,47,72,202,100,163,209,254,139,131,7,15,78,47,119,143,225,203,135,175,109,15,228,43,147,36,53,215,119,158,107,55,242,29,205,230,240,225,99,247,104,55,190,112,112,122,226,63,175,252,55,3,192,122,72,160,225,44,215,106,213,111,79,142,127,226,95,82,222,154,228,250,154,250,230,249,161,151,238,222,189,251,218,131,7,15,254,193,26,166,219,182,123,104,244,237,53,245,239,167,230,165,181,214,148,148,164,214,148,180,114,228,240,163,143,236,30,26,249,153,217,118,227,87,14,29,122,120,255,106,19,13,15,15,191,176,213,42,63,50,51,83,191,191,164,113,105,99,62,196,118,73,74,182,165,57,52,242,39,41,245,103,182,109,107,124,100,98,98,98,213,237,221,135,135,135,191,162,61,91,110,78,205,91,218,37,219,83,115,44,174,100,32,205,161,145,207,148,148,247,94,112,209,249,191,244,192,3,15,60,191,244,245,141,70,253,138,212,114,172,67,73,41,245,7,146,172,152,64,151,82,110,77,205,21,243,135,51,73,142,37,208,237,118,227,203,26,165,99,174,118,190,190,57,56,252,61,207,62,51,243,163,141,146,93,53,243,127,103,73,106,187,145,230,208,200,111,164,52,254,143,201,201,135,255,184,243,30,237,82,190,54,53,63,187,220,253,107,242,147,233,168,226,168,37,127,144,68,2,13,208,37,74,56,224,44,87,107,249,129,206,227,86,125,254,191,164,182,22,245,127,110,183,27,55,158,108,158,75,47,189,244,5,205,193,145,247,215,212,159,75,242,210,21,46,219,85,147,159,26,104,180,39,134,7,135,95,181,210,92,151,95,126,197,72,171,85,126,167,36,63,81,146,149,202,19,94,154,90,222,59,51,83,239,31,28,188,114,120,165,185,154,205,225,183,183,91,229,254,148,124,127,146,237,43,92,118,117,77,253,185,39,30,127,234,55,7,7,191,120,247,74,115,29,215,88,79,141,241,74,247,76,146,180,75,249,217,148,242,175,146,236,90,225,146,87,167,182,63,61,60,56,252,138,117,220,115,137,186,158,79,15,0,56,9,9,52,156,197,118,239,222,253,210,146,92,187,112,92,82,62,60,61,61,253,104,109,212,223,73,242,248,241,241,188,227,170,171,174,58,103,149,169,6,182,109,59,247,151,82,242,166,181,222,187,93,202,135,134,47,27,190,106,233,248,224,224,224,37,3,141,246,111,117,198,181,154,146,140,54,74,235,63,95,121,229,149,23,45,61,215,108,142,188,122,126,229,120,213,36,182,195,245,141,204,252,98,182,246,211,185,171,215,112,205,246,118,41,183,47,247,61,2,176,245,36,208,112,22,107,183,27,175,233,60,174,165,126,56,73,38,39,39,159,73,45,239,239,56,181,235,201,199,158,124,229,74,243,12,13,141,190,189,164,124,103,199,208,76,73,126,164,213,206,181,41,173,243,75,163,61,84,106,185,169,36,159,234,184,230,69,237,129,242,211,75,166,42,141,108,127,119,146,151,28,31,201,195,41,249,158,129,118,174,218,113,222,246,29,41,173,47,45,41,127,63,201,129,142,215,125,237,204,115,173,239,239,156,104,120,120,248,133,169,249,133,69,179,215,250,187,237,90,95,51,48,155,43,219,117,230,5,165,209,254,170,146,252,232,226,8,202,55,55,155,35,99,43,125,175,155,166,214,91,219,53,95,153,210,58,191,93,183,13,167,230,31,102,174,252,99,193,158,231,158,155,253,166,133,131,201,233,253,239,153,156,218,95,38,167,246,151,164,44,218,0,103,160,157,171,22,206,205,127,125,205,86,125,27,0,103,3,53,208,112,246,218,86,146,239,235,56,126,250,185,231,158,254,173,133,131,90,234,157,37,249,71,199,143,243,186,36,191,179,116,146,209,209,209,29,179,51,245,159,117,142,213,212,55,77,78,29,248,181,142,161,103,146,220,117,201,37,47,249,111,231,157,251,236,111,212,228,235,230,199,95,221,108,54,191,100,114,114,242,175,146,100,104,104,244,229,73,237,92,197,126,122,96,38,127,119,255,145,253,15,119,140,253,85,146,191,26,26,186,242,255,43,105,253,73,230,87,151,107,242,246,36,239,78,50,155,36,117,182,236,77,73,71,105,71,249,131,52,90,223,50,61,57,249,76,199,92,159,78,242,233,221,131,163,83,181,212,15,117,124,3,183,92,117,213,85,191,188,92,61,244,102,168,41,255,231,212,244,254,127,209,49,116,48,201,123,154,131,35,73,57,94,231,92,74,249,150,36,31,217,138,152,0,88,153,21,104,56,75,237,190,124,247,215,38,249,226,133,227,146,250,203,143,60,242,200,147,11,199,23,93,244,130,79,37,153,92,56,174,41,223,59,58,58,186,115,233,60,179,179,245,250,36,151,119,12,221,51,53,117,224,142,165,215,37,201,163,143,254,197,23,218,89,188,93,120,103,155,188,82,178,183,243,92,73,254,229,146,228,249,152,169,169,135,254,50,41,183,119,12,189,100,112,112,248,171,143,189,180,44,122,115,144,70,109,255,196,228,226,228,249,152,131,211,19,31,174,201,39,59,134,154,143,63,254,228,215,47,119,237,38,248,194,236,236,51,63,179,220,137,118,102,22,61,248,87,107,94,190,53,33,1,176,26,9,52,156,173,26,101,241,214,221,117,96,95,231,225,3,15,60,240,124,77,58,203,56,206,111,61,159,111,62,97,158,118,253,59,139,142,231,86,114,87,108,9,119,222,51,231,220,89,83,174,89,248,218,54,91,239,60,22,66,173,223,184,104,234,148,187,87,251,22,74,163,117,91,231,92,237,246,57,127,153,36,131,131,131,47,234,88,229,78,146,71,206,57,255,156,223,93,101,170,118,82,23,237,184,88,234,218,106,176,55,170,38,255,239,145,35,71,158,90,238,220,244,244,244,223,36,121,250,88,76,201,151,166,179,101,10,0,61,161,132,3,206,66,187,118,237,250,162,58,215,174,110,193,35,23,236,60,239,222,44,233,56,92,74,227,99,169,237,159,88,56,174,141,250,93,73,126,117,241,53,185,108,113,182,60,240,71,171,221,251,193,163,15,62,145,228,51,203,157,43,89,188,194,58,53,53,241,217,213,230,154,239,145,188,76,159,228,115,46,89,146,195,127,226,193,7,31,124,110,181,185,146,178,228,94,165,185,250,245,221,209,72,166,86,57,93,51,87,178,178,240,247,114,193,158,61,123,206,57,249,247,2,192,102,146,64,195,89,104,199,246,29,223,88,147,206,142,14,207,60,241,248,83,239,107,14,141,44,190,176,221,30,88,180,222,89,115,211,224,224,23,239,158,158,254,235,131,199,7,27,47,90,156,172,206,124,254,84,98,218,179,103,207,185,207,62,51,115,193,241,91,101,34,73,235,84,230,106,52,202,133,115,61,158,231,149,28,57,217,107,182,181,243,88,171,227,51,185,90,86,108,43,215,85,181,212,39,86,61,159,204,90,114,6,232,47,18,104,56,11,213,52,190,115,201,208,112,146,239,61,225,194,101,50,183,82,90,223,150,28,239,110,81,75,253,92,103,254,220,110,15,124,209,169,196,244,224,131,15,62,215,28,26,153,74,50,52,127,235,209,204,149,153,173,187,135,113,187,157,199,59,59,53,215,154,23,157,236,53,173,129,197,73,119,169,121,100,149,59,172,182,3,98,73,205,37,29,199,207,158,228,214,235,202,143,103,103,229,211,0,189,38,129,134,179,204,232,232,232,101,179,51,117,205,253,154,151,42,169,111,73,71,2,93,106,14,117,102,147,3,41,47,201,42,187,244,237,185,120,207,133,207,156,55,123,229,177,235,7,218,79,28,56,112,224,161,249,195,191,204,124,2,157,36,205,102,243,139,23,58,116,44,103,247,238,221,131,237,246,192,139,23,142,103,103,7,166,143,28,249,235,207,53,26,51,143,164,14,116,196,156,107,50,247,251,110,118,165,185,106,109,127,105,89,156,203,118,172,178,31,175,67,78,146,82,26,23,175,52,207,224,224,224,139,146,92,176,210,121,0,78,127,30,34,132,179,76,235,249,188,186,243,184,164,252,114,74,125,199,106,95,53,185,175,227,37,95,211,108,54,95,118,236,168,81,62,157,197,19,174,154,156,63,115,222,243,55,149,212,251,23,190,106,171,220,116,252,181,229,255,111,239,238,98,35,189,206,58,128,63,103,198,155,45,109,218,164,139,246,35,158,25,219,137,210,134,108,216,74,165,2,26,186,85,185,128,8,9,149,94,84,72,208,27,160,11,68,173,42,33,17,196,5,8,5,154,222,1,151,77,42,32,148,10,145,43,66,91,90,74,196,135,68,160,40,162,36,64,105,9,141,18,136,63,102,102,199,73,51,235,38,161,233,238,122,222,135,139,181,189,99,39,222,236,219,172,51,246,250,247,187,242,156,121,231,188,143,231,194,250,251,232,121,207,217,242,160,95,227,39,46,53,87,86,205,187,199,231,58,216,60,255,246,136,136,110,183,59,220,178,231,244,45,237,246,236,182,39,31,30,63,126,252,154,18,229,35,155,111,93,190,178,113,159,140,77,71,133,151,172,230,182,155,171,209,56,176,237,126,217,59,165,108,89,17,63,95,26,78,30,4,216,65,86,160,97,159,169,74,126,120,211,58,107,99,244,187,221,165,165,175,95,234,51,157,214,220,84,70,94,60,177,48,155,31,136,136,175,69,68,100,174,254,99,68,243,116,172,109,101,151,145,239,111,181,102,127,178,215,91,248,171,173,243,28,62,124,248,218,18,229,87,199,199,178,140,54,118,218,200,140,207,149,136,187,199,222,252,173,185,99,115,95,152,31,204,207,111,157,107,230,216,204,241,42,114,252,65,200,167,22,251,139,143,92,252,104,126,38,178,108,236,196,145,25,247,182,219,237,147,221,110,247,101,15,237,61,255,252,183,127,35,34,110,31,27,122,162,219,157,255,231,139,159,61,255,100,41,23,15,51,204,40,31,234,116,58,31,95,123,136,241,98,77,51,51,111,205,81,220,115,169,254,142,157,144,25,103,98,83,203,74,245,166,215,185,4,128,125,197,10,52,236,35,179,55,204,222,90,34,78,110,12,100,60,186,244,42,225,57,34,98,181,42,95,26,127,157,17,119,198,218,63,224,221,110,247,165,18,229,158,241,247,75,196,23,59,173,217,187,102,102,102,222,186,54,212,232,116,58,63,120,240,224,155,190,20,99,59,109,100,148,191,28,111,209,232,245,230,191,26,25,15,140,77,117,120,181,153,15,119,166,231,62,48,55,55,247,134,136,11,7,183,116,166,59,63,85,53,203,95,199,216,17,221,25,229,147,49,246,208,97,230,232,47,162,196,198,30,210,37,98,46,178,249,231,55,220,48,251,3,235,99,55,221,116,211,117,157,214,236,111,70,230,197,208,126,225,226,123,98,172,221,163,223,239,127,51,50,30,26,187,226,205,89,53,190,56,61,61,243,158,195,135,15,95,27,17,209,110,223,248,142,170,106,124,62,35,110,221,230,107,220,65,101,211,63,5,141,70,156,154,158,190,241,150,240,55,30,96,71,248,227,10,251,200,168,228,251,199,95,151,136,79,111,119,237,184,211,167,159,94,136,136,241,16,221,238,116,110,252,145,245,23,75,189,249,63,136,136,241,147,7,35,35,126,175,26,149,97,187,53,155,237,214,236,40,171,198,87,34,115,252,112,146,231,50,203,175,111,185,85,86,113,254,87,34,226,127,198,198,102,178,228,231,86,207,231,75,237,214,108,174,158,207,151,178,52,62,31,49,126,202,96,60,114,238,220,255,253,209,248,68,189,94,239,185,136,242,179,91,230,127,119,179,17,143,173,213,148,231,206,142,86,50,226,19,155,174,40,241,201,110,119,225,207,182,126,7,89,242,254,45,67,239,108,148,242,229,131,215,188,241,133,118,107,54,35,171,175,110,249,253,214,237,120,59,69,150,205,109,52,37,226,163,141,82,125,163,221,154,29,181,91,179,217,158,158,125,197,131,90,0,248,238,8,208,176,127,52,162,148,95,30,31,88,205,198,203,218,44,182,147,145,155,79,197,171,114,252,32,150,209,217,115,223,254,133,45,171,199,151,86,202,7,251,253,167,159,216,58,220,239,247,191,217,104,230,29,91,250,174,47,81,87,204,71,25,253,244,248,41,138,235,186,221,249,127,201,200,31,139,136,111,93,230,92,247,78,77,149,95,123,165,247,122,189,197,7,163,196,31,95,198,52,47,68,196,83,151,115,191,43,229,186,235,222,248,111,17,229,95,95,207,123,2,236,103,2,52,236,19,173,214,236,15,199,166,163,187,203,23,214,86,150,47,203,104,116,205,67,155,71,242,195,235,237,11,17,17,207,62,251,236,139,221,254,194,207,149,40,31,141,136,75,181,133,252,105,179,138,227,221,238,252,195,219,93,176,184,184,248,191,205,102,254,120,70,124,34,99,219,61,156,191,19,165,124,124,52,58,240,67,175,212,215,188,174,215,91,252,251,70,51,223,83,34,63,179,221,53,145,241,104,201,56,213,235,45,124,108,126,126,126,187,109,231,178,219,93,184,179,100,124,44,182,63,252,228,235,25,141,247,70,110,110,121,121,21,181,90,166,167,166,166,94,118,253,227,143,63,126,46,74,249,197,136,248,135,87,254,84,121,189,219,178,1,174,106,187,126,63,209,222,96,152,17,17,173,99,135,118,125,173,176,155,181,90,115,239,46,165,218,216,61,163,148,252,143,165,165,165,90,171,150,237,246,236,7,35,114,99,11,183,170,58,240,208,230,67,85,54,148,118,187,253,253,17,83,173,204,234,72,68,124,39,51,134,7,178,244,22,78,47,252,119,157,123,206,205,205,189,97,52,26,157,136,81,220,16,165,121,232,194,193,35,229,185,82,70,79,110,125,136,239,213,28,59,118,243,225,3,7,70,183,86,213,232,72,68,124,79,35,155,203,101,106,212,91,92,92,124,60,234,5,217,169,86,235,198,219,50,71,51,141,70,57,26,145,37,162,116,187,221,133,191,141,136,213,118,123,238,125,17,213,219,35,34,162,42,85,183,191,176,209,254,209,110,183,223,22,209,248,209,245,215,165,228,191,47,45,45,61,250,242,91,92,208,153,158,251,153,108,84,27,219,226,117,187,139,159,142,237,183,227,43,157,78,231,93,153,229,157,227,131,85,21,79,247,251,139,127,87,227,247,3,152,8,185,239,10,233,13,134,185,254,101,2,0,112,245,218,43,185,79,11,7,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,2,52,0,0,212,32,64,3,0,64,13,123,33,64,87,17,17,153,185,23,106,5,0,224,187,48,150,245,170,137,22,114,25,118,125,40,45,37,94,136,136,88,89,89,121,203,164,107,1,0,96,103,172,103,189,245,236,183,155,237,250,0,157,25,253,136,136,179,103,179,51,233,90,0,0,216,25,235,89,111,61,251,237,102,187,62,64,151,82,158,136,136,24,69,220,54,233,90,0,0,216,25,235,89,111,61,251,237,102,187,62,64,71,198,99,107,63,220,62,217,66,0,0,216,57,107,89,111,35,251,237,94,187,63,64,87,249,240,133,31,202,29,147,45,4,0,128,157,179,150,245,54,178,31,175,73,111,121,184,212,27,12,179,223,31,158,156,116,45,0,0,92,89,253,254,240,100,111,48,204,222,242,112,105,210,181,92,142,221,191,2,125,193,3,17,17,217,44,167,38,93,8,0,0,87,214,88,198,123,96,162,133,92,166,50,233,2,46,199,210,51,207,220,220,168,166,158,140,136,104,70,188,227,216,177,67,95,155,116,77,0,0,188,118,131,193,240,196,40,226,63,35,34,170,198,234,219,58,71,142,60,53,233,154,94,205,158,88,129,238,28,57,242,84,102,220,23,17,81,149,242,219,147,174,7,0,128,43,99,61,219,101,198,125,123,33,60,239,41,203,203,47,30,237,47,15,87,122,131,97,118,251,195,59,39,93,15,0,0,175,77,183,63,188,179,55,24,102,127,121,184,178,188,252,226,209,73,215,115,185,246,196,10,116,68,196,209,163,215,46,103,230,93,17,17,165,17,159,242,64,33,0,192,222,213,239,15,79,150,70,124,42,34,34,51,239,58,122,244,218,229,73,215,116,213,234,158,30,222,219,27,12,179,55,24,246,6,131,225,137,73,215,3,0,64,61,131,193,240,68,111,48,236,245,6,195,236,158,30,222,59,233,122,246,133,254,242,153,207,174,135,104,43,209,0,0,123,199,218,150,117,189,11,173,27,103,62,59,233,122,246,149,177,16,173,39,26,0,96,15,88,239,121,22,158,39,104,172,157,35,251,203,103,30,212,210,1,0,176,251,12,6,195,19,253,229,51,15,110,44,126,238,241,182,141,61,177,15,244,165,244,6,207,157,42,165,252,126,102,92,23,17,17,165,252,73,25,229,253,211,211,135,190,60,225,210,0,0,246,181,126,127,120,50,155,229,84,100,254,124,68,68,41,241,173,204,188,171,117,236,123,239,159,116,109,175,197,158,15,208,17,23,182,184,59,95,157,187,187,148,248,200,216,240,55,34,242,111,34,202,35,205,136,255,58,120,176,44,93,127,253,245,207,151,82,170,137,21,10,0,112,21,202,204,198,202,202,202,91,206,158,205,206,40,226,182,136,188,61,162,220,17,17,223,119,241,154,184,239,64,227,154,223,185,26,118,219,184,42,2,244,186,165,103,158,185,185,145,83,191,20,17,31,138,140,246,164,235,1,0,216,215,74,116,35,226,129,170,172,254,225,213,116,72,202,85,21,160,199,245,251,195,247,70,163,188,47,74,188,43,51,111,41,37,166,51,227,205,177,135,246,190,6,0,216,35,170,82,226,133,204,232,151,82,158,136,140,199,162,202,135,167,167,15,253,211,164,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,142,90,60,0,0,5,16,73,68,65,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,9,255,15,98,72,151,186,24,87,176,32,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":37149,"duration_micros":1360,"top":855.0,"left":40.0,"width":640.0,"height":2.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,16,190,73,68,65,84,120,156,236,214,177,13,0,16,20,64,65,44,37,81,26,92,41,49,21,35,232,124,197,221,4,175,124,41,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,193,114,116,192,205,88,115,71,55,0,0,240,78,175,237,235,71,45,209,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,246,224,128,4,0,0,0,64,208,255,215,253,8,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,10,134,140,4,4,168,244,130,235,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":37152,"duration_micros":882,"top":891.0560302734375,"left":38.26599884033203,"width":367.9646911621094,"height":39.26397705078125,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,123,152,101,87,93,39,252,239,218,167,250,22,8,32,164,233,78,157,83,151,38,13,145,160,2,70,28,47,192,235,43,34,202,168,32,226,200,43,55,101,20,20,65,46,138,160,248,8,202,188,14,55,65,4,4,130,188,200,221,121,85,70,194,11,232,128,138,51,40,224,24,241,242,78,134,96,147,84,87,157,170,164,73,184,9,164,187,83,117,246,154,63,186,46,231,84,215,165,147,116,167,167,147,207,231,121,234,121,122,239,189,246,218,171,206,94,187,107,157,181,215,250,173,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,44,43,103,187,0,103,203,248,248,129,139,59,169,15,24,164,126,102,97,225,240,63,38,105,207,118,153,182,114,193,5,23,159,191,123,247,209,199,173,108,151,182,30,153,91,152,187,252,108,150,137,59,166,137,137,3,15,173,117,112,241,218,158,246,131,253,126,127,254,236,149,8,0,110,91,99,103,187,0,167,106,98,124,250,39,107,211,110,90,222,210,54,95,105,75,253,92,103,80,175,155,189,110,246,170,36,131,205,210,118,187,147,79,45,105,223,84,147,52,73,186,221,169,87,205,207,31,254,133,51,80,236,211,102,207,158,27,207,175,109,115,217,202,118,45,229,189,73,52,160,111,67,227,227,227,23,52,205,216,15,111,149,166,214,124,177,148,230,134,100,105,190,223,239,31,74,82,111,163,226,221,118,218,246,17,73,249,149,149,205,154,177,111,79,162,1,13,192,29,198,57,211,128,174,165,190,34,181,220,99,139,227,41,73,218,78,73,175,59,245,249,212,242,123,139,131,163,47,57,114,228,200,215,78,78,221,60,118,184,93,83,146,103,38,121,126,146,165,211,95,242,51,164,222,113,223,30,156,45,99,237,216,61,219,82,46,219,42,77,73,146,90,147,116,210,235,78,245,75,242,166,93,123,118,188,226,208,161,67,199,111,147,66,2,0,103,92,115,182,11,112,134,220,35,165,62,127,108,108,247,159,142,143,143,95,176,254,96,147,118,97,120,187,36,135,114,46,53,158,57,87,244,106,242,146,99,55,222,244,190,123,221,235,94,119,61,219,133,1,0,78,143,219,107,3,58,73,82,146,7,151,50,246,186,36,157,225,253,109,154,55,38,89,92,221,81,203,175,223,198,69,227,142,164,148,71,220,116,211,224,85,185,3,207,57,0,128,219,147,115,181,1,125,109,127,254,112,25,250,105,218,186,184,183,166,121,64,82,94,51,156,176,164,252,216,248,248,228,255,57,188,111,126,126,230,19,41,131,3,53,229,129,165,105,15,206,45,204,252,167,219,182,248,220,30,212,228,13,27,213,195,148,230,254,37,245,183,215,37,126,202,196,133,19,15,62,75,69,5,0,78,163,115,102,12,244,54,234,194,194,194,13,73,110,72,242,236,222,248,244,241,148,250,75,43,7,59,37,143,77,242,145,225,19,150,163,6,152,248,196,233,52,92,15,159,179,92,15,159,191,122,176,233,252,72,146,255,118,214,74,7,0,156,22,183,151,6,244,136,206,160,190,113,48,150,213,6,116,77,249,206,225,227,189,94,239,96,210,172,246,74,151,82,255,97,110,110,238,191,15,29,191,119,210,124,215,208,241,15,204,205,205,45,28,60,120,112,215,141,55,46,94,210,73,153,106,75,123,126,82,250,77,211,94,53,55,55,55,50,166,122,43,7,15,30,220,245,181,175,45,222,111,172,180,189,182,148,187,54,105,238,92,75,187,148,148,13,163,53,140,45,149,143,204,92,55,51,115,210,129,178,113,116,135,137,241,137,31,170,77,217,55,188,175,214,193,123,231,231,231,63,191,62,237,244,244,244,238,155,110,202,116,210,246,74,201,120,173,249,226,88,205,66,219,105,175,236,247,251,71,79,229,247,57,17,94,239,107,211,73,167,87,107,221,155,228,11,165,52,215,239,222,61,246,15,55,99,226,92,153,158,158,222,55,24,12,38,106,109,38,75,91,118,212,38,215,53,77,59,59,59,59,123,245,102,39,157,201,251,116,58,148,206,224,205,181,109,158,191,182,167,126,235,102,105,47,184,224,226,243,119,237,58,126,191,166,102,127,91,218,187,148,82,110,24,12,114,221,181,215,30,254,167,108,49,62,127,226,194,137,135,212,78,179,26,82,174,223,63,252,150,36,117,98,98,98,188,12,202,253,6,37,23,54,181,126,169,54,157,35,99,99,249,199,153,153,153,99,235,178,24,235,118,167,191,161,169,153,170,77,189,83,82,230,119,220,84,62,125,205,231,174,57,114,202,191,231,90,93,108,186,221,233,111,170,181,157,40,165,185,123,173,237,23,58,157,122,93,167,211,249,231,13,174,187,101,150,55,167,62,140,143,31,184,184,105,6,15,29,58,253,11,253,254,225,63,222,238,34,235,255,31,72,74,191,223,63,252,161,117,201,198,166,247,79,247,110,106,218,110,211,228,64,82,142,214,154,133,193,96,199,161,235,174,59,116,253,22,121,111,88,55,123,189,222,158,82,202,55,212,218,92,144,228,238,73,153,239,247,103,62,122,107,63,131,21,235,195,93,14,6,229,138,107,175,61,252,247,73,202,248,248,244,197,77,83,15,212,90,247,150,210,124,174,109,51,179,176,48,115,85,110,143,145,98,0,206,176,115,178,1,93,183,25,122,114,248,200,225,153,94,119,106,120,215,55,228,196,56,232,229,208,118,157,123,167,102,53,154,66,91,155,231,38,89,109,64,183,109,243,245,205,80,180,133,210,230,33,189,241,201,39,28,59,186,248,139,77,201,222,154,154,178,60,156,181,182,77,122,221,169,15,165,52,47,232,247,175,249,167,205,202,180,119,239,222,59,239,222,121,222,47,31,59,186,248,179,157,38,95,87,211,164,36,169,169,73,221,124,104,236,77,77,251,240,36,39,55,160,55,208,235,77,61,190,214,188,115,248,207,97,77,125,218,250,198,115,175,215,235,214,218,121,206,210,98,253,249,166,100,199,202,208,220,82,146,182,36,169,157,27,123,189,169,247,36,131,23,109,22,223,119,255,254,131,123,199,198,22,127,45,245,216,51,82,79,12,49,95,249,76,82,107,142,29,93,252,76,175,55,245,235,253,254,225,247,100,243,63,208,101,98,124,250,81,53,245,133,75,139,245,91,86,110,107,45,53,169,73,59,40,233,245,166,174,76,242,155,253,254,225,119,175,207,231,76,220,167,211,105,110,110,110,163,122,56,98,124,252,162,137,38,75,207,75,57,246,164,36,119,173,101,249,115,172,73,167,73,122,221,169,207,150,154,55,14,178,248,187,11,11,11,55,174,63,191,109,154,71,148,154,23,174,229,119,224,191,117,74,253,141,218,214,127,119,34,175,164,150,146,212,154,165,197,124,102,98,226,192,79,207,205,93,243,95,47,185,228,146,157,95,249,242,215,158,89,147,231,36,181,91,79,84,198,36,53,139,59,106,122,189,169,63,169,181,243,252,249,249,171,63,115,42,191,107,183,59,249,216,164,188,160,164,94,90,202,137,204,74,41,169,109,201,82,91,175,239,118,167,46,219,181,171,243,138,171,175,190,250,203,91,100,115,11,235,195,241,207,167,238,120,125,146,29,67,159,235,228,194,194,103,231,182,42,115,169,205,47,214,148,167,173,237,200,143,172,157,63,126,94,41,59,159,150,212,231,47,165,238,107,150,239,201,137,100,201,88,103,49,189,238,212,135,74,211,190,104,248,203,247,138,245,117,115,208,230,193,19,227,19,223,210,214,230,178,212,172,125,193,173,121,121,146,225,6,244,173,122,38,214,135,187,236,116,234,179,187,221,201,241,146,242,202,164,94,156,186,82,191,106,154,146,76,116,167,254,103,155,250,107,243,243,179,127,180,213,103,5,192,168,115,114,12,116,217,166,220,189,94,111,124,120,187,158,104,128,110,26,23,186,217,170,5,155,164,45,229,181,41,229,101,73,246,110,146,228,251,83,219,191,155,28,159,220,112,140,235,189,238,117,175,187,238,218,121,222,71,106,242,43,73,190,110,171,107,157,178,117,97,236,198,199,39,191,39,53,239,92,151,228,87,230,231,103,47,27,77,119,209,68,106,231,79,75,242,11,25,106,112,172,115,94,106,254,125,106,231,83,147,147,147,247,90,127,240,224,193,131,187,198,58,139,239,73,205,51,182,40,225,125,82,243,174,110,119,250,89,155,37,232,245,38,127,169,150,250,159,83,242,45,155,230,82,115,73,106,222,217,237,78,189,100,139,107,37,185,245,247,233,230,106,82,183,172,135,147,147,147,119,25,217,81,114,195,186,227,247,107,154,165,191,74,201,51,147,108,22,165,227,162,90,242,138,166,217,249,167,19,19,19,227,155,164,89,43,83,105,255,186,166,254,187,77,14,223,167,182,237,95,117,187,83,223,253,175,95,254,218,31,215,228,149,73,186,27,166,172,121,116,201,224,239,46,188,112,234,155,183,187,102,106,94,91,82,254,176,36,151,110,146,98,111,73,94,120,211,177,165,203,167,167,167,247,111,150,205,45,173,15,11,11,11,55,164,100,100,238,67,147,165,199,157,124,242,154,241,241,139,38,70,26,207,201,236,238,221,59,62,112,162,28,189,61,157,178,243,173,37,245,85,37,217,183,73,22,73,242,253,181,109,254,182,219,157,252,129,173,174,149,36,157,210,60,181,150,230,125,219,228,119,218,159,137,212,242,19,37,229,253,73,46,222,240,112,114,223,146,242,135,221,238,244,179,183,205,11,128,85,231,100,3,58,219,133,156,107,59,35,139,93,148,228,239,110,229,245,30,112,10,105,118,180,165,188,117,163,112,101,55,29,31,188,54,201,191,57,213,139,213,228,138,146,242,246,146,242,246,90,203,23,182,75,223,237,78,125,123,83,202,251,70,51,169,47,157,159,159,121,233,186,164,77,83,150,222,154,13,122,66,55,177,183,29,156,28,161,228,216,177,197,39,38,121,216,169,100,80,82,95,221,237,78,127,219,250,253,39,26,252,101,125,249,182,200,39,47,236,245,14,124,211,54,201,110,213,125,186,185,218,148,77,191,148,37,73,219,150,145,223,187,214,242,207,43,255,158,152,152,24,111,7,229,195,169,57,112,74,23,171,245,33,105,59,111,204,186,136,50,27,216,52,86,250,138,146,252,121,146,109,27,125,73,206,239,52,249,189,94,175,183,103,155,194,61,232,20,242,74,74,121,232,210,98,125,87,54,120,243,117,235,235,195,224,237,235,18,60,231,224,193,131,187,54,59,191,83,150,158,60,154,190,254,214,202,144,163,82,59,207,221,226,75,200,6,101,41,175,222,187,119,239,157,183,74,83,83,159,180,93,62,103,241,153,88,121,78,79,41,45,0,231,110,3,122,179,101,183,199,186,221,201,39,166,228,21,195,59,107,234,31,158,150,171,214,250,226,182,230,155,83,6,231,181,117,108,50,53,207,204,112,56,188,228,224,241,227,75,223,59,124,202,228,254,201,75,146,60,113,173,44,57,82,83,159,220,214,177,201,177,29,101,79,74,115,255,148,188,101,248,156,82,115,253,220,252,204,147,231,230,103,158,188,60,126,113,83,147,147,147,247,43,201,7,146,156,183,150,65,94,223,95,152,125,97,214,189,222,29,31,159,252,183,25,109,248,94,95,83,159,212,105,115,201,137,223,41,223,92,146,95,93,119,137,39,44,255,14,67,159,67,158,190,174,188,207,107,6,245,126,41,131,243,6,109,46,173,201,27,70,142,151,250,35,89,167,148,209,134,66,77,253,253,166,214,135,180,117,113,111,91,23,247,150,218,62,42,117,221,23,159,182,221,170,199,123,40,179,155,127,159,110,161,77,223,92,244,122,189,131,169,249,143,35,137,75,187,82,15,59,181,109,222,156,228,194,161,195,159,44,181,252,112,105,218,131,187,247,236,216,157,50,184,79,77,121,110,146,213,33,15,53,245,7,123,189,169,31,219,174,80,53,153,169,169,63,90,154,182,59,182,163,124,93,169,237,163,146,156,52,6,126,217,71,107,242,221,59,119,117,238,182,99,177,217,95,83,126,34,201,240,120,229,7,150,118,199,67,182,187,230,137,235,150,15,167,228,145,139,75,99,251,142,29,223,125,151,154,124,199,250,186,157,228,187,123,189,201,159,92,127,238,173,173,15,253,126,255,159,151,123,90,87,92,120,252,198,165,239,219,168,156,23,92,112,241,249,53,25,238,113,61,214,182,75,239,78,146,110,183,219,171,201,139,70,11,87,95,48,104,115,233,226,210,177,59,167,12,238,189,252,25,13,127,158,7,119,238,220,243,152,141,174,181,129,207,167,230,205,169,245,249,41,245,169,105,178,58,230,250,204,62,19,121,87,105,219,135,238,220,213,185,219,137,136,69,249,129,148,92,51,156,164,73,251,228,205,78,7,96,212,57,57,6,58,201,157,123,189,201,159,94,217,168,181,105,154,180,15,168,41,63,144,164,183,46,237,39,107,93,250,255,110,237,5,107,202,175,204,47,28,30,110,16,205,37,121,93,111,124,42,41,121,237,202,206,82,202,247,37,89,109,176,183,77,249,246,225,124,154,90,158,53,183,112,120,56,108,222,63,37,121,90,111,124,242,222,41,229,196,68,168,146,239,155,156,156,252,186,217,217,217,47,110,90,160,146,58,189,127,122,122,105,80,63,152,225,97,33,53,111,238,207,31,126,118,54,248,146,81,74,249,174,145,237,90,158,217,31,45,203,167,146,124,106,162,59,117,108,249,245,126,146,100,208,105,190,55,201,149,73,114,233,165,151,238,56,114,221,13,15,28,58,231,170,185,133,195,175,28,218,254,251,125,251,246,61,111,108,108,247,99,86,95,87,215,60,46,201,47,103,249,205,193,244,254,233,233,165,212,225,215,253,255,255,252,252,236,79,103,244,205,194,229,221,110,247,175,75,198,254,33,43,247,180,228,241,123,247,238,125,238,245,215,95,255,213,205,62,150,91,122,159,110,137,146,220,119,184,30,38,73,169,101,127,45,153,78,205,83,214,37,255,68,219,46,189,55,73,186,221,233,7,37,245,145,67,101,254,240,174,93,205,143,174,27,31,252,47,73,94,221,235,77,127,42,181,254,229,234,222,182,62,45,201,187,183,46,89,243,232,249,249,107,254,113,104,199,229,189,222,212,207,167,230,93,235,18,94,219,214,197,31,93,142,28,146,156,104,172,191,173,215,155,220,63,220,19,90,83,31,150,228,191,108,121,201,146,215,239,223,119,143,231,92,113,197,21,195,95,84,62,158,228,227,221,238,244,127,47,169,111,92,205,175,150,151,76,79,79,191,99,101,98,225,233,170,15,181,212,55,164,230,7,87,175,211,180,79,79,50,250,102,38,201,158,157,199,31,91,135,122,234,107,242,187,43,159,65,41,99,255,38,117,104,104,83,45,191,211,159,63,252,178,161,211,15,37,57,52,57,62,249,217,182,148,213,136,42,165,228,49,73,70,123,193,79,246,71,77,167,62,117,163,231,250,12,63,19,151,239,191,240,30,63,185,238,222,124,160,215,155,190,33,169,159,24,74,247,248,36,207,139,69,165,0,182,117,174,246,64,223,53,181,92,182,242,83,82,223,88,83,126,38,39,55,158,103,219,218,60,121,163,201,87,55,211,87,150,150,142,254,206,70,7,218,44,254,193,240,118,173,185,255,240,118,41,35,189,140,25,164,252,195,6,217,12,74,41,31,27,217,49,24,219,108,28,239,138,251,45,117,234,251,147,76,174,94,59,249,131,187,220,237,78,207,200,38,127,0,75,50,210,152,79,103,176,97,72,181,166,205,7,215,157,119,223,149,127,95,113,197,21,131,140,246,230,94,220,235,77,253,120,134,234,210,145,35,71,190,214,212,246,169,41,117,229,231,55,246,237,219,183,250,58,125,105,172,222,119,232,252,212,19,141,156,147,202,60,63,63,255,249,146,58,252,229,231,188,61,157,61,147,235,211,13,185,197,247,233,22,250,174,225,122,152,90,46,171,201,111,108,208,120,158,79,25,60,113,165,30,150,154,71,15,31,44,165,252,226,102,147,235,250,253,153,143,166,14,53,152,75,121,232,244,254,233,233,77,75,84,242,255,172,107,60,39,73,142,29,219,253,254,245,251,106,202,203,135,26,207,67,218,247,142,150,47,247,61,57,205,136,207,30,63,126,227,11,214,53,208,86,205,207,207,188,105,184,241,94,146,125,237,77,237,106,175,246,233,170,15,251,246,93,240,145,36,107,147,30,107,249,222,94,175,247,141,235,178,233,212,82,159,59,188,163,148,193,239,15,109,141,12,137,168,165,253,240,70,191,211,236,194,236,95,103,56,12,102,45,219,141,171,95,92,92,26,251,185,205,190,20,159,193,103,34,77,51,248,15,27,221,155,126,127,230,147,37,249,235,161,93,123,39,38,38,238,185,229,111,1,64,146,115,183,7,122,59,199,82,203,107,210,44,189,124,97,254,240,182,99,136,183,83,147,119,30,57,114,228,107,27,29,91,88,88,248,124,175,59,117,99,150,135,80,148,228,62,89,14,126,144,36,109,202,87,135,35,206,117,58,75,119,217,40,159,164,222,99,120,68,64,173,101,187,48,114,235,39,5,125,112,105,233,216,79,93,121,229,225,155,54,59,161,63,127,248,59,86,254,221,235,29,248,166,12,202,131,38,198,167,186,53,101,178,148,118,127,210,148,19,101,206,238,209,209,31,117,120,242,90,91,82,223,93,83,214,94,247,214,188,171,215,157,122,81,74,46,47,109,249,251,218,228,234,93,187,199,254,108,179,48,118,203,161,194,74,146,76,79,79,223,109,105,41,15,232,118,39,159,152,148,137,38,117,34,105,206,91,203,186,142,52,116,107,169,155,142,241,189,53,247,233,12,250,139,65,219,60,229,218,107,15,31,94,217,81,74,125,240,240,69,75,173,191,48,209,221,188,77,92,83,239,55,188,61,40,131,137,108,18,153,165,214,250,103,27,237,191,225,134,171,190,210,235,78,93,149,161,122,211,182,245,191,110,148,118,247,238,221,179,199,142,14,47,212,89,47,218,180,112,73,106,202,91,182,234,1,77,146,38,245,109,237,137,30,206,229,60,203,183,38,249,112,114,250,234,195,21,87,92,177,216,237,78,191,186,164,174,13,33,106,199,30,159,228,5,43,155,19,19,211,223,83,219,186,58,7,160,164,188,127,174,223,95,29,155,222,239,207,188,40,203,67,56,198,199,47,154,104,154,193,253,122,189,169,159,170,53,147,165,100,188,212,178,218,59,93,83,119,14,21,229,30,123,247,238,189,243,166,159,67,201,31,29,57,242,217,207,109,246,249,156,169,103,34,73,127,110,110,238,138,205,15,215,67,25,10,243,89,235,216,5,73,110,211,112,143,0,231,162,115,181,1,125,44,195,175,223,107,157,90,29,254,144,36,53,239,232,47,204,188,96,131,243,110,145,102,235,5,87,106,78,188,110,95,249,163,118,254,193,131,7,119,174,53,30,235,191,12,39,110,219,242,244,94,175,247,244,225,56,203,221,238,129,251,215,180,195,81,3,250,23,94,120,183,235,22,78,253,207,216,103,119,238,234,252,120,127,126,227,198,227,176,201,201,201,123,181,131,242,186,212,246,251,215,98,143,212,229,160,30,155,182,37,239,52,188,49,168,99,191,214,52,131,135,174,155,0,119,159,212,252,226,74,184,173,99,71,23,231,123,189,201,215,238,190,113,231,27,14,125,225,208,191,110,144,103,153,24,159,250,217,165,197,250,226,36,123,87,195,205,109,211,166,45,165,236,222,236,216,173,187,79,167,205,103,82,235,53,181,148,255,81,107,125,239,194,194,236,39,179,174,39,177,38,95,63,186,189,253,4,179,97,237,186,56,223,195,74,105,54,109,164,165,230,154,148,181,6,116,41,157,13,122,159,147,67,135,14,29,239,117,167,250,89,121,163,83,183,139,28,211,30,218,250,120,210,54,237,53,43,225,14,147,164,150,172,143,238,114,90,234,67,167,211,254,167,118,80,94,158,228,252,19,9,234,211,15,222,253,224,111,174,212,193,218,214,209,49,195,77,94,191,62,207,189,123,247,222,121,231,206,243,94,92,178,244,11,195,161,235,82,151,195,78,110,98,231,206,157,187,146,108,216,128,46,53,255,99,211,19,135,146,157,238,103,34,39,234,252,102,115,70,82,107,115,221,112,8,250,90,235,121,155,165,5,96,205,185,218,128,254,74,127,254,240,106,163,227,192,61,15,236,91,220,209,206,101,37,44,91,201,79,247,122,7,126,175,223,191,230,111,79,199,197,106,169,27,53,0,215,142,39,75,155,205,38,219,179,103,199,71,142,29,93,252,84,146,7,158,40,90,249,137,212,206,119,244,198,167,255,115,154,118,190,214,124,115,73,251,248,12,133,148,43,53,47,221,236,117,248,38,46,90,158,20,183,229,152,222,3,247,60,176,111,113,208,126,48,155,132,180,58,85,11,11,87,207,78,76,76,60,60,181,243,234,154,250,131,155,36,235,166,150,151,30,219,179,248,99,227,227,23,61,106,125,76,222,94,111,242,25,181,102,195,225,22,91,89,218,162,37,113,107,238,211,45,81,82,223,52,55,63,251,51,55,231,156,229,49,228,219,70,202,216,246,210,155,219,244,205,69,41,101,113,184,1,216,182,205,86,111,57,78,249,139,69,41,101,203,222,231,36,217,113,211,142,175,44,238,88,107,199,213,90,38,134,143,159,174,250,48,59,59,251,197,222,248,244,27,134,86,34,61,255,248,238,165,31,73,242,214,94,239,192,55,165,182,67,209,71,202,63,207,205,205,140,172,80,154,100,108,215,206,243,222,150,228,84,39,5,158,146,90,234,87,182,75,115,38,158,137,36,155,207,163,72,82,74,29,140,188,13,217,100,129,38,0,70,157,171,13,232,17,215,124,238,154,35,19,221,169,215,157,88,20,226,132,90,219,231,36,249,191,78,211,37,110,86,187,107,105,105,173,157,118,232,208,161,227,147,251,39,159,208,118,202,223,100,45,214,239,125,82,234,243,83,203,73,25,215,148,203,247,93,120,143,203,230,22,14,231,230,40,41,111,239,118,167,250,243,243,135,63,190,105,185,118,12,158,149,148,245,141,231,67,73,249,139,82,235,63,214,166,46,38,73,105,203,93,235,186,72,38,235,205,205,205,125,54,201,15,77,142,79,62,184,150,60,50,41,15,173,201,119,110,144,244,129,77,89,250,253,36,143,200,114,79,108,183,219,237,165,150,223,90,151,238,88,106,62,154,212,143,167,201,181,171,123,107,249,161,12,133,92,27,219,250,94,220,226,251,116,91,57,49,204,96,234,200,202,4,203,154,204,148,82,127,243,230,228,81,210,110,52,142,62,73,82,235,230,159,65,93,23,239,124,79,59,216,124,14,68,73,51,212,148,218,242,255,137,210,150,109,67,2,46,238,92,188,203,112,15,116,169,117,117,21,191,211,93,31,154,182,125,91,219,41,107,43,145,150,250,172,36,191,159,90,71,199,166,215,250,154,172,139,15,63,49,62,241,200,122,114,227,249,250,154,250,23,73,243,137,82,218,161,183,60,229,151,79,57,12,225,54,206,216,51,177,69,125,216,48,249,205,76,15,112,71,117,187,104,64,39,201,160,54,111,106,74,187,218,128,46,201,227,186,221,233,151,205,207,207,108,218,216,184,141,140,13,58,229,231,202,230,11,101,12,41,175,89,90,58,250,194,83,236,125,254,243,148,250,213,212,242,168,229,237,221,37,249,227,94,175,247,208,126,191,127,210,43,245,94,175,183,167,214,242,156,225,125,165,182,143,154,91,152,123,127,214,245,96,77,76,76,60,40,237,80,219,170,214,77,99,15,207,46,204,126,44,201,199,146,213,177,155,247,175,181,62,188,156,248,50,179,242,58,248,187,39,199,39,191,109,57,109,74,29,123,116,202,200,34,46,31,106,58,245,241,27,77,176,234,118,39,31,118,242,215,140,115,91,169,245,170,148,19,195,48,74,114,167,187,220,229,206,111,187,242,202,43,55,29,187,254,191,187,154,246,254,73,254,96,171,52,165,29,187,164,142,172,86,95,103,87,143,157,230,250,48,123,221,236,149,19,221,233,247,15,189,29,185,255,196,248,244,143,213,212,225,133,83,62,127,236,166,221,255,239,201,5,237,60,97,228,113,168,245,197,187,207,219,249,210,245,67,125,46,185,228,146,157,255,250,229,175,141,52,120,107,221,122,65,166,173,220,209,159,9,128,115,205,185,26,133,227,36,11,11,215,92,149,228,29,195,251,74,169,207,60,75,197,73,114,226,117,253,68,119,242,181,37,35,113,147,63,91,83,158,155,146,63,73,114,168,38,191,91,106,249,241,182,118,166,250,243,51,207,222,108,18,220,6,190,156,180,79,73,57,17,94,110,217,133,169,157,63,26,31,31,191,96,125,226,166,105,46,76,50,60,86,242,19,115,11,115,151,103,163,215,191,109,51,18,37,34,101,109,193,144,222,248,212,59,123,221,169,186,250,51,180,144,195,204,204,204,151,250,253,153,191,154,159,63,252,171,37,249,181,225,44,6,67,99,94,203,250,241,175,37,175,221,184,161,208,237,149,172,126,65,72,178,237,235,234,115,66,45,101,120,242,222,222,175,126,233,171,255,199,22,201,155,137,238,212,171,38,186,211,111,91,249,217,110,209,142,219,90,45,229,113,219,46,36,210,212,209,248,213,77,89,141,103,124,70,234,67,45,175,27,78,163,190,91,0,0,15,77,73,68,65,84,221,172,111,205,112,253,47,229,117,55,220,112,213,73,195,42,214,79,208,219,177,212,121,227,70,227,228,191,244,165,175,62,34,43,227,172,87,179,44,183,184,110,222,209,159,9,128,115,205,237,166,1,157,36,41,101,116,66,80,205,83,122,189,222,189,207,82,105,114,221,117,215,63,110,57,188,222,176,171,74,169,159,78,6,191,212,116,234,183,206,207,31,126,198,220,194,204,123,22,22,174,158,221,48,147,45,244,251,253,47,180,109,243,152,140,46,234,112,255,82,118,190,123,122,122,122,100,98,81,219,182,35,247,122,185,71,252,164,110,172,137,137,137,7,45,47,57,190,153,145,16,105,181,182,27,174,216,118,242,120,228,102,109,202,98,45,35,61,218,181,214,59,229,100,77,41,99,47,207,104,163,127,187,33,28,231,132,166,105,47,31,222,174,165,188,102,114,114,114,195,137,122,189,222,212,227,106,242,156,154,250,164,229,201,134,187,183,139,120,113,91,43,201,244,238,157,123,94,121,233,165,151,110,184,52,252,196,248,212,207,165,142,12,167,58,182,115,103,103,117,236,241,153,168,15,115,11,215,252,69,178,182,242,227,250,243,154,166,221,56,102,243,104,47,112,218,210,158,52,169,110,124,124,252,130,166,148,87,174,223,127,107,220,209,159,9,128,115,205,237,170,1,221,239,207,124,50,89,91,217,43,73,106,237,60,123,147,228,103,92,173,249,210,6,187,31,153,154,15,166,118,62,211,14,202,23,122,221,169,47,247,186,83,31,239,245,166,222,210,235,77,62,97,163,222,227,141,51,63,241,71,115,97,225,154,171,82,202,99,135,15,149,212,135,47,221,84,95,155,209,251,59,159,161,9,69,109,114,247,94,111,242,25,189,94,239,238,203,187,198,38,199,39,31,94,107,51,188,176,202,218,213,86,254,81,50,18,175,186,36,47,156,232,78,189,112,104,105,236,210,237,78,125,123,106,89,183,162,97,253,204,218,57,245,170,225,35,77,154,39,77,76,76,60,40,107,97,188,246,247,198,167,126,123,93,163,43,201,237,163,183,109,110,110,238,239,83,234,234,2,31,53,185,239,96,80,62,60,49,113,224,161,89,107,12,141,245,122,83,63,156,154,55,15,159,91,203,232,42,143,255,187,168,41,79,59,114,221,13,31,234,245,166,190,127,223,190,139,238,121,193,5,23,159,223,237,78,127,91,111,124,234,205,181,100,164,55,56,165,188,108,56,238,245,25,170,15,75,53,237,235,54,57,246,142,217,217,217,171,55,252,61,106,29,158,120,188,216,142,229,153,189,94,239,224,202,142,94,175,247,141,165,236,124,119,78,132,65,92,247,107,221,138,30,232,59,248,51,1,112,174,185,93,53,160,147,164,212,230,183,71,182,147,167,111,185,240,196,25,180,176,48,251,254,146,242,244,109,146,157,159,228,219,82,243,148,212,242,142,166,236,184,114,98,124,250,209,219,156,51,162,223,159,249,104,78,76,148,90,83,242,83,189,222,244,175,173,165,233,31,173,89,107,200,148,100,95,106,249,157,212,206,231,151,135,99,44,182,165,252,151,77,38,69,173,246,112,205,207,31,254,248,73,141,186,228,63,220,116,124,240,165,229,124,218,146,252,77,70,23,120,185,98,126,254,240,218,138,103,205,224,125,25,90,46,186,166,254,96,109,155,191,237,117,167,218,94,119,170,46,45,214,107,83,114,86,135,223,156,97,131,177,177,230,103,146,244,87,118,148,228,210,218,182,127,181,242,25,244,186,83,139,169,121,111,134,150,104,175,201,111,245,251,51,31,61,27,5,62,69,15,75,205,7,119,140,45,29,217,189,235,216,191,150,212,143,167,228,167,134,19,212,228,99,201,210,203,70,246,157,161,250,208,233,228,15,51,180,20,250,138,182,214,55,109,118,78,41,101,184,103,122,71,77,158,147,218,249,151,149,33,75,169,157,127,42,169,15,223,232,220,91,51,6,218,51,1,112,110,185,221,53,160,231,22,174,249,243,156,88,146,122,213,98,231,44,142,133,174,107,127,20,79,209,222,90,234,123,198,199,167,191,126,251,164,107,250,253,217,215,38,229,178,209,107,215,23,77,140,79,175,198,151,222,181,171,243,91,73,78,101,82,229,23,179,85,76,229,102,240,172,212,252,233,169,148,171,38,51,181,54,143,207,80,47,89,191,223,159,47,41,63,123,42,231,39,185,106,251,36,231,158,153,153,153,235,154,65,125,68,134,87,206,219,66,73,121,251,252,252,225,211,22,219,252,44,249,203,29,59,202,143,14,199,64,79,206,92,125,152,157,157,253,98,234,104,132,147,154,124,108,97,97,246,111,54,59,167,223,63,252,161,148,188,229,116,151,101,59,158,9,128,115,203,185,218,128,222,112,169,234,101,131,154,250,31,135,119,148,228,185,221,110,119,253,50,223,171,218,108,251,234,245,102,189,34,29,27,27,171,73,178,127,255,193,189,181,212,225,153,250,253,82,203,15,215,148,7,174,252,52,181,126,111,106,158,153,209,134,212,238,82,234,207,111,121,145,50,26,126,43,73,77,89,122,118,146,63,31,217,89,234,219,199,199,167,190,35,73,174,190,250,234,47,183,117,241,225,53,249,191,51,58,110,122,216,135,82,6,223,154,82,255,110,45,147,209,40,28,253,126,255,104,154,193,99,82,202,175,111,89,198,90,255,172,105,218,239,92,158,224,57,98,110,126,230,109,41,121,100,146,191,220,228,236,47,151,148,167,183,235,150,197,222,102,188,231,45,186,79,183,194,173,58,127,246,186,217,43,219,58,246,61,169,229,119,178,65,79,233,218,85,234,243,231,230,103,254,125,182,174,247,103,205,210,96,199,61,75,178,101,40,190,154,188,234,216,241,221,143,154,153,153,185,110,163,227,103,168,62,36,205,104,216,198,166,150,215,103,235,251,86,119,239,222,241,115,203,115,23,54,252,114,83,146,255,89,147,135,213,148,55,142,156,184,117,15,244,182,117,229,140,124,6,226,58,3,156,17,231,76,24,187,82,203,243,106,211,142,37,73,173,205,150,33,191,246,236,217,121,249,177,99,55,61,117,120,95,109,199,246,102,245,149,249,224,95,82,154,213,227,77,25,141,171,219,52,237,167,147,181,227,165,212,145,30,237,245,154,90,94,89,155,118,117,70,254,161,67,135,6,73,178,163,89,122,88,205,208,42,110,37,207,158,155,159,249,147,13,178,248,240,248,248,69,239,107,202,210,167,179,246,202,254,49,25,138,222,113,244,232,121,95,217,189,251,232,106,153,218,54,39,53,68,250,253,254,209,137,137,137,39,213,90,254,237,72,249,74,57,144,228,19,73,218,133,133,133,27,146,252,234,193,131,7,95,114,252,248,241,111,172,181,153,72,234,5,73,142,118,6,229,138,195,215,30,254,116,146,218,235,77,93,150,82,63,144,36,117,131,197,24,150,123,17,95,188,127,255,193,215,143,141,45,62,120,57,143,19,191,230,255,106,239,110,90,227,170,194,0,0,191,231,78,76,160,154,46,180,52,201,100,210,76,48,80,84,164,32,150,174,4,55,46,253,1,110,212,127,224,82,65,193,46,197,133,136,224,66,139,11,113,233,170,43,209,46,84,68,119,42,102,49,197,47,194,196,177,105,109,168,72,161,196,100,230,30,23,73,51,147,208,25,50,49,105,72,120,158,221,61,188,135,123,102,206,153,203,203,220,243,81,22,237,50,197,143,127,94,107,254,20,253,19,135,188,121,124,241,103,245,201,122,125,189,82,62,26,17,211,41,197,88,68,241,203,234,234,216,15,43,43,63,223,174,215,235,147,237,118,217,237,139,118,218,218,162,111,191,250,105,183,218,69,251,175,34,141,116,239,87,222,251,56,237,97,108,30,48,243,202,169,83,103,223,24,27,251,247,137,148,114,53,34,30,142,200,41,34,221,90,95,31,249,102,208,17,208,69,81,124,145,115,167,123,76,120,116,254,232,23,155,114,250,40,247,44,96,188,147,238,244,93,140,152,115,190,184,209,23,17,41,23,219,183,85,44,138,207,35,119,182,62,251,245,235,191,173,68,196,235,51,51,51,239,71,167,114,62,23,229,233,173,216,50,149,101,84,174,236,98,145,236,255,30,15,59,77,77,205,205,70,46,123,147,205,229,92,180,47,247,139,191,107,115,215,141,15,34,226,195,51,147,103,30,43,71,210,108,42,99,42,34,34,42,229,194,248,248,248,66,163,209,88,171,86,103,255,78,69,238,121,142,20,91,59,232,12,59,54,247,235,59,216,249,156,72,101,190,49,240,142,59,250,114,208,248,1,160,203,234,237,3,84,171,213,47,70,206,111,110,21,164,226,92,171,181,184,208,55,126,122,246,203,136,120,182,27,223,57,177,243,117,55,176,59,181,90,253,181,200,61,111,163,114,126,181,117,109,233,237,67,108,18,0,199,196,81,157,194,113,68,148,183,122,175,82,153,31,239,23,57,119,122,110,34,34,158,236,41,250,93,242,12,123,83,173,86,79,68,222,54,13,106,189,242,64,250,164,111,5,0,24,194,145,153,194,113,20,21,101,92,45,123,254,227,207,41,191,51,83,173,167,118,78,223,45,47,47,54,35,54,14,91,185,185,124,243,194,90,42,223,77,17,143,116,131,243,167,247,189,193,112,76,84,98,244,249,28,121,234,238,117,142,184,212,108,54,151,7,213,1,128,221,50,133,227,96,21,181,90,253,171,200,249,153,33,235,253,19,169,115,190,213,106,253,122,32,173,130,227,45,213,106,245,175,123,127,119,69,153,159,94,90,94,250,254,48,27,5,192,241,97,10,199,193,42,43,235,249,165,20,113,117,136,58,171,145,226,5,201,51,236,205,244,116,253,66,111,242,156,35,93,145,60,3,176,159,36,208,7,172,121,163,185,152,83,231,185,200,249,173,136,184,61,48,56,229,203,57,42,231,54,87,226,3,123,80,68,249,242,246,146,242,189,195,105,9,0,199,149,41,28,247,209,196,196,196,131,163,197,232,83,185,82,156,221,216,166,108,67,42,83,167,19,197,183,247,218,47,25,216,189,249,249,249,177,213,213,181,23,123,203,78,158,124,232,227,70,163,49,112,235,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,241,31,219,9,24,243,164,137,52,234,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":37155,"duration_micros":730,"top":960.9240112304688,"left":38.513999938964844,"width":652.7440795898438,"height":34.35601806640625,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,156,101,87,93,32,240,223,185,175,122,11,36,33,107,119,215,187,85,245,186,83,24,12,59,141,131,40,40,168,140,136,66,4,68,137,16,54,1,151,25,12,3,14,139,108,142,44,10,178,14,32,40,32,40,16,152,81,65,20,69,80,81,1,5,113,97,139,141,98,72,87,215,214,29,58,192,36,144,244,82,245,238,111,254,168,87,85,175,42,85,213,213,73,37,221,137,223,239,231,147,79,234,158,119,238,185,231,222,174,87,247,119,207,61,75,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,103,87,78,118,5,88,212,110,15,63,33,162,58,123,110,43,191,56,53,181,255,227,39,183,70,39,166,174,235,59,103,14,252,232,252,246,177,99,215,191,253,208,161,67,223,62,153,117,234,183,99,199,232,121,3,3,51,15,172,186,185,127,252,192,248,191,68,68,158,236,58,1,0,183,61,3,39,187,2,199,51,52,52,116,183,204,114,255,155,178,111,211,196,190,233,233,241,191,220,232,58,221,82,74,148,39,69,228,131,35,34,34,243,87,34,98,221,1,116,187,221,121,98,41,205,230,21,203,109,170,217,172,242,96,85,229,248,248,248,248,151,35,162,217,144,10,47,83,53,85,167,41,249,186,133,237,234,140,203,35,78,141,0,122,215,249,187,182,207,180,102,254,53,50,206,105,170,18,117,61,252,244,201,201,241,183,157,236,122,1,176,186,227,220,219,174,203,42,14,118,187,101,236,192,129,125,251,111,237,186,173,166,221,110,159,19,209,250,209,82,98,203,124,28,178,103,207,158,77,87,95,125,232,73,55,165,188,217,217,205,127,116,240,224,149,135,214,147,119,207,158,61,155,14,77,29,186,115,86,213,221,179,202,99,85,55,199,239,120,214,29,191,180,119,239,222,99,39,114,204,193,193,193,211,74,217,124,143,42,187,231,71,105,157,157,37,175,43,221,230,80,183,116,191,60,61,61,125,205,137,158,67,93,215,163,153,213,72,149,213,121,77,105,54,149,82,29,202,44,7,166,166,246,125,49,110,163,141,89,167,124,0,157,89,238,21,89,126,251,166,236,91,85,241,166,136,184,205,4,208,55,71,137,124,121,100,105,175,244,89,150,140,200,136,166,91,162,221,30,25,171,50,94,58,49,189,255,157,113,27,253,165,189,41,102,54,55,123,34,227,156,190,164,159,136,8,1,52,192,41,108,61,247,182,86,149,81,183,71,62,157,17,47,60,153,111,110,135,134,134,238,150,221,214,227,35,242,178,136,216,26,185,24,135,28,56,112,96,83,85,54,221,164,88,102,243,230,99,127,31,17,107,6,208,187,119,239,62,243,232,209,230,41,7,15,94,243,220,210,42,219,35,122,247,253,170,196,117,215,94,127,160,221,30,121,251,166,77,229,181,99,99,99,255,111,173,114,206,61,247,194,211,183,110,61,252,228,200,242,236,136,28,206,82,197,124,89,89,85,81,69,117,67,187,61,242,218,170,106,222,50,49,49,49,125,188,186,215,117,231,126,37,227,89,153,249,147,37,230,254,205,74,148,136,204,40,145,81,15,14,127,162,68,190,102,98,122,226,143,79,232,162,156,2,170,147,93,129,219,130,193,193,11,134,234,122,248,105,115,255,141,60,242,100,215,231,230,40,17,157,44,241,142,186,221,121,93,68,180,78,118,125,110,45,165,52,227,75,18,178,250,242,73,170,10,0,27,239,254,37,226,175,234,122,228,113,183,246,129,119,239,222,125,102,221,30,249,147,108,170,47,69,201,231,70,196,214,133,15,155,185,134,170,170,170,110,122,131,213,177,181,27,187,118,236,24,61,239,216,209,238,167,74,228,107,75,196,246,21,178,236,44,17,47,154,157,201,143,119,58,157,59,173,86,206,224,224,5,67,91,183,28,249,104,100,121,67,68,12,175,146,237,180,18,241,194,204,234,83,237,246,174,123,174,85,175,118,187,243,179,145,249,153,140,252,201,85,51,149,242,125,89,170,15,213,131,157,87,238,217,179,103,211,90,229,157,106,78,249,22,232,82,242,243,25,241,244,27,165,103,245,240,140,124,120,111,243,43,81,242,213,203,243,52,77,236,219,152,58,204,222,163,175,21,252,35,17,241,193,141,40,247,22,244,238,40,249,201,190,237,109,209,148,187,69,137,167,45,38,229,101,117,61,114,197,228,228,254,183,223,234,181,59,9,38,38,38,174,168,235,145,199,71,198,15,71,198,255,107,226,216,203,78,118,157,0,56,33,75,239,109,77,236,44,165,186,111,95,44,16,145,241,198,193,193,11,62,49,61,253,213,137,91,171,82,71,142,148,51,170,18,63,182,242,167,37,35,34,182,110,221,218,28,57,60,243,238,117,22,121,143,136,184,103,68,68,70,92,221,12,52,171,198,50,231,158,123,225,233,155,90,71,62,152,17,119,235,75,190,33,163,252,101,137,60,63,34,190,187,47,253,222,179,199,242,85,177,66,76,213,233,116,238,52,59,51,251,241,136,24,93,246,209,120,68,124,54,34,238,181,228,179,140,93,37,154,79,214,117,125,159,201,201,201,43,151,151,215,110,15,63,189,68,190,117,89,242,76,100,126,186,148,234,218,140,252,193,136,56,109,225,147,146,207,57,120,240,154,86,68,252,210,106,231,122,170,57,229,3,232,137,137,137,43,34,226,138,229,233,117,221,169,35,99,254,75,51,125,75,246,103,173,178,156,159,229,148,239,237,176,248,54,161,228,39,87,186,30,117,189,235,237,145,205,223,198,252,211,113,198,83,35,226,63,69,0,29,17,49,57,185,255,189,17,241,222,147,93,15,0,214,237,184,247,182,161,193,206,99,179,228,251,122,155,103,149,50,123,105,68,188,226,86,170,223,162,140,63,143,200,191,142,82,46,137,185,128,115,193,149,87,94,121,52,34,158,176,142,82,74,61,56,242,217,249,41,30,170,136,55,78,76,78,30,94,45,243,150,45,71,159,154,17,223,187,88,133,242,203,219,14,15,188,249,202,111,92,121,93,68,196,232,217,163,103,28,222,54,251,148,18,189,241,73,37,158,86,215,187,222,52,57,185,239,139,253,229,116,103,242,25,209,23,32,103,148,63,206,204,95,153,158,222,255,249,232,117,247,28,28,236,220,165,148,230,185,115,227,181,34,34,226,244,204,214,75,35,226,146,254,178,58,157,206,142,217,153,252,245,190,164,153,200,248,249,205,91,91,127,112,213,85,87,93,27,17,81,215,245,182,136,214,195,34,227,109,17,113,214,92,213,226,217,237,118,231,61,83,83,99,159,95,199,117,58,233,78,249,0,122,131,181,6,7,71,238,209,138,102,168,41,229,204,86,198,193,153,108,125,101,165,193,7,115,255,184,213,227,35,34,34,227,135,250,62,26,170,235,225,190,150,220,114,67,47,48,91,174,12,13,13,237,236,118,171,78,85,197,174,210,52,223,234,70,53,49,61,189,255,75,17,49,187,177,167,21,145,17,213,252,148,42,153,43,207,174,50,57,185,239,179,67,237,145,151,103,196,75,123,73,247,59,247,220,11,79,191,230,154,127,255,214,74,249,219,237,246,57,85,181,249,174,209,205,193,166,52,77,43,99,122,243,145,205,95,156,255,98,222,12,39,124,109,234,122,228,209,17,217,155,161,164,249,235,201,201,201,43,207,61,247,194,211,79,219,124,248,158,221,18,187,35,202,215,75,233,254,251,74,79,194,243,199,172,235,225,167,206,111,84,179,241,119,227,7,199,247,174,148,177,211,233,108,109,142,52,187,187,173,178,171,148,184,83,68,153,26,24,136,127,27,27,27,59,120,243,78,27,128,141,54,49,61,246,254,161,246,240,67,51,202,19,35,34,74,196,99,162,23,64,47,185,151,71,196,204,204,209,203,175,190,250,234,235,47,186,232,162,205,223,254,198,183,71,187,173,184,107,204,221,66,39,51,143,125,113,122,122,250,134,19,61,254,230,205,221,67,223,254,246,214,51,230,239,165,117,61,252,61,145,165,23,64,231,9,205,118,86,215,157,239,139,204,251,206,111,207,54,213,123,86,203,219,110,183,207,41,145,47,90,72,200,124,201,212,244,254,95,235,207,211,187,95,191,190,110,143,60,49,122,65,125,105,154,7,68,196,66,0,61,56,120,193,80,198,236,175,246,237,246,103,165,204,62,118,106,106,105,224,62,61,61,246,111,17,241,180,186,30,105,34,227,41,17,17,37,226,177,237,118,231,13,83,83,99,159,89,168,243,177,230,178,40,229,172,133,29,75,121,196,228,212,216,159,247,151,53,57,247,80,240,135,59,119,142,236,107,85,241,207,11,89,231,206,231,209,171,157,243,169,228,63,75,0,93,218,237,225,199,151,40,207,142,136,123,102,84,81,34,162,41,17,173,210,68,187,61,242,254,86,43,95,54,62,62,254,175,243,59,100,230,105,37,230,186,109,228,210,238,71,119,91,50,168,177,196,222,88,214,170,185,115,231,200,125,90,85,252,70,54,241,3,85,137,185,206,247,165,138,42,34,234,246,200,100,137,242,138,137,169,177,183,198,6,14,226,43,125,51,107,148,178,122,185,221,204,47,84,101,241,251,124,199,59,30,189,195,53,215,196,146,0,186,221,110,159,83,202,192,115,35,227,231,178,105,78,143,18,81,162,68,83,34,142,108,155,249,122,187,221,121,205,182,109,3,175,237,61,81,159,144,155,124,109,50,126,33,162,252,192,220,9,182,30,87,15,14,255,76,148,35,207,108,162,108,93,56,155,108,69,61,56,252,137,170,137,159,95,49,56,238,251,119,203,170,92,18,17,75,242,204,141,58,222,244,204,217,153,124,65,180,202,105,37,230,107,145,49,59,19,81,215,195,31,26,152,173,158,57,118,112,108,236,68,207,27,128,155,100,33,78,89,173,113,104,238,179,242,79,81,226,137,189,205,123,197,220,24,159,110,85,85,91,155,238,226,223,254,45,101,203,223,213,245,240,67,174,187,246,250,23,68,171,156,183,88,96,70,41,155,14,213,245,240,107,6,6,170,55,140,141,141,29,89,111,5,123,121,23,242,151,172,170,133,184,161,58,193,233,130,51,159,186,248,115,188,119,173,217,69,74,105,253,72,100,204,7,170,95,137,170,249,141,85,243,86,213,101,153,221,11,35,34,154,40,95,237,255,172,21,221,31,234,191,225,54,25,47,156,158,90,181,213,123,182,219,173,126,181,85,53,151,70,68,175,207,114,254,88,68,124,38,98,110,22,144,171,15,94,243,196,133,220,37,222,55,57,185,52,120,238,119,224,192,254,127,169,7,135,127,61,74,121,94,47,233,81,157,78,103,199,109,161,193,234,118,31,64,143,142,142,110,57,114,120,246,127,71,228,141,250,252,204,43,17,143,109,186,229,71,135,134,58,143,153,152,24,251,232,205,57,94,93,143,252,72,100,124,40,22,126,177,110,156,37,35,127,179,30,236,116,38,167,199,158,123,115,142,117,83,180,162,12,245,125,81,190,53,54,54,182,100,58,154,186,174,71,35,91,31,140,92,210,159,170,223,57,37,242,21,71,15,207,222,127,244,236,209,199,159,72,107,244,134,93,155,140,183,70,41,167,175,248,89,41,223,215,180,226,239,71,118,142,220,127,255,129,253,253,3,5,215,252,35,182,125,251,246,59,148,178,249,242,18,249,136,213,143,91,46,158,109,229,125,235,186,126,208,26,45,221,0,220,218,170,172,214,211,216,219,180,202,71,34,87,29,32,119,94,100,249,245,238,76,124,239,238,221,187,47,157,239,110,112,107,25,28,220,61,28,209,93,104,45,207,18,191,179,230,14,77,249,190,249,59,91,137,252,195,137,201,201,195,195,59,134,47,202,170,186,71,86,241,157,153,121,94,68,249,74,41,229,227,19,19,251,62,17,17,159,88,169,152,172,154,139,251,174,221,199,167,167,247,127,110,173,195,30,56,176,111,127,221,238,188,115,62,174,42,37,126,58,34,94,20,17,121,224,192,53,223,85,149,216,185,80,118,230,59,142,119,222,85,19,239,110,90,49,31,64,71,247,88,124,127,68,252,159,227,237,119,178,221,238,103,225,56,124,120,230,69,55,10,158,75,236,43,81,254,36,250,158,24,35,226,244,108,242,143,6,7,71,238,29,17,81,74,185,33,74,62,61,74,62,61,34,254,172,47,223,21,11,233,115,159,45,244,179,234,116,58,59,34,227,221,209,31,32,102,126,180,68,60,187,68,249,189,136,88,124,53,84,242,57,195,131,195,15,217,184,51,61,254,220,206,187,206,223,181,61,75,60,107,177,110,229,157,209,215,101,98,244,236,209,51,50,91,239,143,254,193,8,153,159,200,136,23,148,136,23,71,230,194,151,47,35,31,126,100,219,204,155,98,157,191,67,27,124,109,250,131,231,175,244,254,45,251,95,187,157,217,84,241,182,245,214,45,34,98,243,192,214,255,177,44,120,62,20,37,94,29,37,159,23,81,190,212,151,222,142,108,253,86,88,132,8,224,214,176,112,143,90,235,237,106,68,233,31,44,247,249,136,232,174,146,177,63,120,254,122,100,124,48,34,38,251,51,100,228,195,143,29,109,254,215,9,215,244,102,170,170,230,41,125,155,95,152,154,218,255,183,107,100,31,136,18,143,154,223,200,18,123,235,193,145,15,52,173,242,175,89,242,125,145,249,226,18,241,243,37,242,117,145,205,23,234,122,228,242,186,174,87,154,14,176,68,150,31,94,220,202,15,173,171,178,37,63,182,240,115,198,174,78,167,179,61,34,162,138,248,206,190,92,71,74,105,254,254,120,69,141,31,28,255,114,239,109,126,68,68,52,37,87,107,192,59,165,220,174,91,160,235,186,115,191,200,124,193,66,66,137,189,77,19,143,159,158,218,255,133,136,104,234,186,222,86,114,224,167,50,242,157,189,28,91,171,18,239,136,136,251,246,250,231,188,45,34,162,221,30,25,41,17,15,235,229,153,88,109,192,98,119,38,30,25,209,55,215,112,137,167,77,78,141,191,35,122,29,1,218,237,221,47,47,209,253,171,136,168,35,34,186,115,79,109,127,177,129,167,60,39,203,3,235,186,239,111,68,83,182,148,146,119,155,137,230,210,88,28,245,250,245,38,226,45,253,187,29,221,54,243,140,18,177,167,183,249,173,40,229,33,147,83,251,255,161,47,203,175,213,245,240,179,35,203,252,224,128,75,235,186,115,249,90,175,103,230,109,192,181,89,30,176,78,85,77,94,60,191,162,224,220,28,152,221,87,148,136,95,136,185,66,191,183,174,119,221,109,249,64,137,149,204,189,165,152,121,206,66,66,198,63,109,154,173,126,108,223,215,246,93,221,75,121,213,80,123,228,101,25,241,203,189,237,31,168,235,93,119,95,79,217,0,220,162,74,187,221,121,66,100,46,14,100,203,133,1,133,171,249,247,82,53,151,78,76,76,124,46,230,2,244,50,52,52,116,215,104,170,183,46,14,200,203,203,134,134,134,222,59,49,49,241,143,183,84,197,251,157,123,238,133,167,71,30,249,239,11,9,37,223,28,171,63,4,68,93,215,219,151,172,109,144,229,69,81,226,59,86,61,64,198,37,17,173,7,13,239,24,254,161,254,46,142,157,78,231,204,217,153,92,152,118,175,52,213,248,202,5,44,85,74,51,158,185,216,70,213,28,105,206,142,136,131,81,149,243,34,231,159,115,202,127,76,174,49,0,178,191,118,37,203,21,25,121,81,68,68,201,21,167,226,59,229,220,206,91,160,179,191,35,250,84,211,12,60,180,247,106,162,137,152,235,196,62,49,53,246,174,94,75,242,188,123,215,117,231,187,110,210,209,50,239,211,183,241,209,222,20,113,11,79,204,83,83,87,125,37,74,190,106,113,143,242,35,55,229,56,235,112,105,100,249,237,133,255,74,188,49,163,252,108,204,7,207,37,246,150,170,121,104,111,64,192,188,129,140,120,242,66,205,50,158,63,57,57,246,15,203,202,157,157,156,28,127,85,239,137,189,151,175,249,241,245,84,104,3,174,77,46,219,120,204,248,129,241,127,158,79,191,234,170,171,174,29,24,136,37,83,211,149,166,185,111,172,195,209,163,71,239,28,253,173,218,85,249,159,125,193,243,92,141,75,247,101,17,253,125,197,155,187,175,167,108,0,110,150,197,183,171,115,141,67,79,91,248,111,112,248,197,117,123,228,195,37,242,93,125,249,199,91,155,202,194,116,113,77,211,220,232,109,97,147,113,73,47,48,158,111,221,206,137,137,137,43,186,57,112,73,68,124,115,225,112,89,61,102,195,207,102,21,219,182,28,125,116,44,54,50,29,169,170,248,131,181,242,103,110,190,195,178,164,249,224,249,134,18,229,255,150,136,103,71,137,55,69,89,50,157,239,206,166,85,189,107,251,246,237,11,251,230,225,60,171,191,144,172,98,205,133,86,22,143,159,223,92,146,80,197,217,17,17,37,243,252,197,76,205,113,23,90,233,43,111,241,158,219,215,5,228,84,118,187,110,129,142,140,39,45,254,24,239,90,125,94,200,230,61,17,173,87,70,111,42,149,104,154,239,143,136,229,193,227,113,53,81,94,83,34,222,28,17,81,181,154,217,225,225,225,187,54,77,53,84,154,216,153,85,182,34,34,50,227,46,243,223,230,18,177,189,211,233,108,61,145,193,10,27,34,227,162,38,171,75,58,157,206,21,243,199,30,30,30,190,176,233,198,5,11,231,82,226,204,186,30,121,234,74,187,151,44,179,243,3,36,114,233,107,179,85,109,192,181,233,251,35,88,254,113,106,106,236,211,203,143,177,127,255,254,3,117,123,228,138,232,117,65,201,42,207,91,79,221,90,173,214,228,76,19,247,142,136,104,154,172,90,173,217,235,218,237,206,119,87,25,157,172,242,142,125,89,175,139,133,64,59,207,185,113,73,0,220,130,46,141,44,151,46,108,45,11,141,51,98,172,170,154,199,236,223,63,113,96,181,2,74,148,223,159,158,30,91,177,143,239,244,244,87,39,134,218,195,111,205,40,207,239,21,248,164,136,120,126,172,209,18,188,65,90,25,125,221,43,75,188,105,124,124,252,155,107,228,143,136,220,118,227,164,252,232,108,179,249,210,101,203,126,95,54,52,56,242,172,44,209,27,96,152,223,181,105,211,150,71,70,196,123,34,34,74,233,45,231,184,80,68,179,222,5,214,150,92,253,108,181,170,136,136,102,110,126,134,94,142,178,254,133,81,170,232,239,160,115,155,88,228,237,118,27,64,239,222,189,251,204,99,71,187,11,1,84,41,177,106,167,248,201,201,201,195,237,118,231,147,243,125,96,179,148,145,155,114,204,233,233,177,127,219,117,254,174,237,51,3,249,203,217,84,191,56,31,98,102,111,182,137,136,27,247,67,152,157,157,61,45,150,246,197,222,8,75,38,155,47,77,217,28,37,71,51,202,163,162,215,255,171,68,60,107,246,88,115,117,68,188,42,34,162,219,45,231,247,215,173,68,188,124,181,222,102,203,102,37,185,103,204,253,30,173,57,53,223,70,94,155,18,205,223,173,118,156,18,101,95,70,175,255,84,83,157,189,86,157,230,245,150,54,253,252,208,224,208,35,74,171,250,181,200,214,69,101,89,221,150,203,44,119,92,249,19,0,110,101,223,138,18,111,157,157,25,120,245,213,87,127,245,107,107,230,204,252,155,53,63,46,229,83,125,127,247,207,219,117,254,174,115,151,189,145,220,112,237,246,240,131,34,114,225,173,102,230,234,83,215,205,107,117,187,51,77,107,217,93,179,106,61,231,224,244,149,203,151,252,110,38,166,247,191,190,221,30,185,184,68,60,96,238,0,229,41,209,11,160,171,211,170,111,198,209,197,231,131,82,202,170,43,21,46,181,233,172,254,151,3,165,116,191,62,247,255,60,212,55,32,113,197,37,216,87,82,178,108,95,136,45,50,166,214,187,223,201,116,187,13,160,123,43,3,45,168,154,92,115,182,136,146,121,245,226,196,229,101,93,45,151,203,117,58,157,29,51,51,205,159,71,111,5,161,147,102,149,201,230,71,71,71,159,119,228,240,236,43,35,242,178,185,124,229,149,187,206,223,245,187,251,190,182,239,234,42,203,25,55,99,177,152,227,238,184,145,215,38,115,245,87,76,25,185,56,181,94,181,254,249,55,135,6,71,254,91,150,120,211,198,77,44,8,192,6,232,239,106,250,158,40,115,131,217,51,203,112,137,120,97,47,253,244,146,101,223,74,193,115,102,150,165,55,130,242,141,181,15,87,190,222,127,75,59,58,144,103,69,196,45,26,64,71,244,173,18,92,242,99,83,147,251,190,112,188,29,186,173,238,117,165,47,132,203,136,79,77,173,62,46,103,182,148,252,189,200,242,128,222,246,131,47,186,232,162,205,123,247,238,61,118,213,85,87,93,87,183,71,102,162,55,192,63,51,46,92,95,149,187,223,209,223,236,181,216,165,163,124,189,47,211,133,157,78,231,78,189,70,170,181,84,25,249,61,11,101,149,91,252,122,111,136,219,109,0,125,218,145,114,237,145,190,23,28,77,85,206,88,115,135,42,207,159,127,106,202,146,107,63,193,174,98,102,38,127,169,244,7,136,37,63,86,50,254,57,162,154,200,210,204,206,37,197,158,94,127,228,141,118,220,254,236,87,94,121,229,209,193,193,193,151,85,101,211,101,243,105,179,3,249,224,136,120,127,86,113,237,146,224,49,227,25,81,229,58,230,121,46,25,235,120,189,117,179,175,77,102,43,230,255,12,86,213,234,129,113,70,171,239,59,189,174,0,186,179,163,211,153,45,249,166,190,164,67,25,241,251,165,228,120,68,44,252,177,205,44,47,45,113,219,24,220,0,112,59,177,56,15,116,228,39,167,22,27,135,90,117,123,228,33,17,113,191,222,103,47,24,61,123,244,189,203,167,86,205,204,210,31,65,55,37,206,92,235,96,85,211,156,209,244,237,176,105,83,222,162,83,217,205,77,29,91,126,106,126,187,52,213,91,214,202,63,111,106,106,106,170,221,30,185,122,254,158,84,50,190,188,246,30,101,201,76,35,215,93,119,221,29,99,238,254,150,81,242,207,34,203,197,17,17,165,148,135,198,186,86,113,44,15,158,255,41,35,198,38,39,230,186,205,52,77,236,237,191,67,119,143,149,255,18,17,31,187,209,238,125,234,186,190,107,228,98,107,117,149,75,102,190,58,101,221,110,3,232,43,191,113,229,117,117,123,228,218,136,185,47,75,201,220,19,17,127,184,82,222,186,174,183,69,150,7,45,166,228,42,125,165,215,212,42,17,207,238,219,126,247,228,228,248,141,150,237,236,205,232,113,210,76,79,79,95,83,183,71,14,69,68,175,149,61,235,136,136,82,186,215,244,143,168,173,6,242,175,251,23,150,233,183,115,231,174,145,170,154,27,120,80,202,236,245,235,56,236,41,125,109,102,7,154,135,244,207,31,154,81,254,235,242,165,68,123,75,147,46,76,198,95,153,198,14,224,100,234,150,108,94,145,165,154,159,118,173,125,228,180,99,79,142,111,196,27,250,51,85,85,213,244,55,14,85,209,220,63,34,126,107,181,66,155,136,251,247,111,239,223,191,127,121,151,136,13,149,217,122,210,194,42,194,17,99,91,79,27,248,200,122,119,45,115,129,233,92,159,240,170,220,101,237,227,228,80,89,188,109,93,59,57,57,185,216,199,186,41,127,18,37,46,238,101,124,224,224,224,200,189,215,154,11,122,112,112,247,112,100,247,167,251,146,222,19,189,102,251,59,221,233,14,255,116,221,181,215,31,136,152,27,8,216,148,230,201,113,156,0,186,100,117,73,127,251,221,192,108,89,179,155,205,169,226,118,62,11,71,89,152,136,59,163,60,97,112,112,240,220,149,243,181,30,21,177,248,84,90,186,185,124,222,194,190,81,192,185,226,53,107,183,219,75,250,13,101,228,95,46,207,179,99,199,232,121,37,226,231,214,81,241,91,76,93,215,103,199,66,240,188,56,226,118,203,150,45,255,17,177,216,239,40,187,241,140,85,138,104,181,170,230,125,37,242,115,37,242,115,37,91,63,121,188,99,158,234,215,166,100,57,191,111,243,91,203,131,231,136,136,238,76,46,25,80,217,172,163,219,10,0,183,156,137,233,137,63,141,254,1,255,89,94,48,60,60,124,214,234,123,68,100,148,39,238,220,57,114,159,149,62,27,28,188,96,40,74,121,230,252,118,137,242,251,113,156,241,61,55,199,240,240,240,89,37,226,23,23,142,151,241,155,39,178,194,111,201,178,184,70,69,230,3,87,59,175,100,243,160,129,0,0,14,135,73,68,65,84,209,209,209,45,37,202,194,44,91,25,249,193,232,187,135,53,49,176,36,192,173,74,188,108,110,9,244,21,13,84,85,247,37,17,177,117,49,169,252,233,252,79,123,247,238,61,86,34,222,185,240,73,196,99,235,186,243,208,213,206,97,231,206,145,251,44,12,218,156,243,129,91,186,207,249,70,185,93,7,208,85,54,239,238,219,108,87,213,192,219,59,59,58,157,254,44,67,131,157,139,51,227,53,139,73,229,31,39,14,76,44,9,160,171,232,235,115,91,202,5,177,66,203,253,212,212,212,181,17,113,237,98,182,114,247,209,209,209,45,243,219,187,206,223,181,125,160,58,246,238,232,159,11,249,86,182,103,207,158,77,17,173,231,45,77,173,190,24,49,215,189,35,163,188,121,62,53,163,252,108,93,15,95,214,233,116,22,190,36,117,93,111,27,106,143,60,63,250,158,208,75,235,184,243,109,158,242,215,102,121,127,171,225,29,195,23,245,111,183,219,195,79,200,136,23,247,167,105,129,6,56,233,186,101,113,93,130,136,136,243,154,217,190,254,196,17,81,85,213,141,26,59,90,85,92,94,215,245,146,169,72,59,59,58,157,86,153,125,95,68,44,6,224,217,61,238,96,190,155,163,105,226,39,162,111,10,213,210,106,222,187,82,190,61,123,246,108,26,26,236,252,84,221,238,188,190,174,71,30,55,127,255,220,180,181,250,72,68,44,204,219,220,170,226,242,118,123,228,193,209,119,127,170,235,186,125,228,240,204,219,34,98,97,198,172,204,88,114,156,233,233,175,78,68,198,115,250,146,30,150,57,240,254,249,133,229,230,13,14,118,238,210,110,15,191,45,50,22,23,124,41,241,59,83,83,99,159,233,207,215,205,153,215,101,127,191,241,204,143,212,245,240,211,118,239,222,189,208,80,89,215,245,182,186,30,121,116,171,138,37,235,72,84,173,92,114,175,61,149,221,110,187,112,68,68,140,79,143,127,170,30,236,188,42,74,206,253,98,204,45,197,252,195,245,224,200,7,74,41,179,77,228,238,140,124,64,95,36,116,67,169,186,79,137,101,125,122,179,196,88,95,123,227,104,93,119,62,30,153,99,17,17,25,229,95,166,166,198,94,31,17,179,145,229,119,163,228,220,211,100,198,47,29,57,114,236,206,117,61,242,225,104,202,221,103,74,243,184,136,114,163,0,113,165,47,247,77,180,124,174,204,133,205,146,213,64,19,121,193,215,14,94,243,176,232,91,37,168,55,232,96,97,146,248,99,199,174,127,227,150,205,167,61,34,230,191,104,89,94,63,59,147,79,109,183,59,151,71,228,105,37,227,209,217,191,202,80,230,75,198,199,199,175,90,71,221,78,246,181,57,142,238,223,244,205,154,115,122,211,42,127,83,15,14,191,58,170,56,18,89,126,60,34,30,188,124,15,45,208,0,39,223,196,244,216,135,235,246,200,231,35,226,94,17,17,81,202,243,118,236,24,125,231,178,169,220,150,187,48,178,245,197,186,61,242,129,136,184,62,74,12,204,102,254,68,244,175,148,27,241,225,94,11,247,45,165,21,89,61,163,111,26,170,119,76,76,76,172,56,111,242,193,131,135,30,89,74,121,127,68,68,100,196,209,195,179,155,34,226,93,87,93,117,213,181,67,131,157,231,101,201,203,123,89,47,44,17,31,111,183,59,127,81,69,28,200,200,42,50,46,142,254,117,14,50,222,62,61,61,254,87,203,143,113,116,230,134,183,108,221,124,218,147,231,239,241,37,242,17,165,196,35,234,246,200,120,68,124,54,34,238,21,145,163,203,218,142,190,89,74,243,162,229,101,77,79,79,95,211,110,119,158,27,253,243,115,103,249,237,99,71,187,111,174,7,135,63,93,74,117,109,102,254,96,44,46,236,214,187,6,229,87,199,199,247,175,216,117,244,84,116,187,14,160,35,34,6,54,199,75,102,103,227,156,200,248,153,94,210,214,40,255,191,189,251,11,145,235,170,227,0,254,59,119,118,147,160,22,84,92,173,179,147,221,36,4,95,180,81,200,147,149,8,98,43,40,214,190,20,131,5,159,36,213,183,42,136,90,75,95,172,173,20,125,176,5,223,68,106,81,90,244,201,82,80,65,20,20,74,33,8,54,40,169,154,166,243,231,206,108,194,110,91,72,194,230,223,238,61,62,204,254,153,221,157,217,108,77,210,102,147,207,231,109,239,157,115,247,220,97,119,238,153,115,207,253,125,227,254,28,121,253,20,226,155,57,226,190,178,211,249,231,250,99,20,69,254,75,181,152,86,214,244,68,206,135,34,226,80,68,68,74,249,242,242,235,170,168,253,36,197,194,151,82,68,127,150,187,191,40,255,222,24,172,110,145,226,181,200,177,119,165,205,144,34,239,215,192,154,90,153,203,231,186,110,196,119,182,182,152,191,62,184,121,118,118,246,220,244,135,166,239,95,24,139,223,14,36,18,126,44,69,126,60,214,181,79,145,158,169,237,72,3,193,39,155,187,129,222,155,13,202,178,60,177,123,114,250,145,28,241,232,210,166,137,72,233,137,13,67,228,117,253,3,224,29,183,16,41,30,141,188,242,140,211,251,198,107,151,191,17,171,159,231,155,233,71,97,111,156,14,249,71,81,203,15,198,117,172,255,188,187,190,247,179,121,32,144,171,168,214,132,193,172,145,114,236,25,28,176,228,180,122,29,234,244,154,207,238,158,156,222,151,99,53,72,44,69,190,123,232,12,79,202,191,219,177,115,236,219,49,228,140,103,103,103,207,77,77,77,125,49,47,22,207,69,228,193,48,185,169,88,27,127,222,239,67,191,230,246,151,71,13,250,187,221,230,51,141,198,212,123,35,167,159,14,108,30,143,148,62,157,135,205,63,229,244,212,216,120,252,104,216,177,110,84,219,121,9,199,150,102,0,155,205,230,133,178,108,29,137,20,71,82,140,120,74,53,199,175,171,156,238,236,118,91,127,30,182,187,221,110,191,153,170,234,240,96,86,251,48,189,222,171,157,177,42,190,16,17,255,25,250,130,20,207,214,106,203,49,161,75,191,58,111,189,212,218,53,114,54,34,61,185,88,21,119,12,198,121,46,107,157,110,189,86,171,229,187,35,167,39,98,77,242,222,170,28,241,195,78,183,249,181,183,18,0,115,213,239,77,74,213,134,54,195,143,243,127,205,12,119,186,173,199,7,63,128,214,121,61,71,190,39,231,88,254,150,31,197,246,254,223,1,216,46,86,214,32,167,17,159,239,101,217,122,62,98,53,235,33,71,124,127,207,158,61,183,15,61,90,138,251,162,31,42,50,236,250,53,19,57,127,247,226,165,249,67,91,188,187,58,212,86,238,80,230,168,6,158,249,73,71,219,189,246,200,124,131,34,199,154,25,227,170,170,214,172,89,238,116,91,143,229,200,247,140,26,163,228,136,211,145,210,67,187,118,237,56,124,242,228,201,145,85,69,218,237,246,201,93,231,199,238,138,148,31,140,129,165,33,235,204,231,136,199,138,162,250,212,21,98,206,115,89,182,159,204,145,62,153,34,253,102,244,171,242,95,83,174,238,45,123,205,111,190,237,161,114,87,105,219,206,64,23,85,245,167,170,232,63,244,150,115,92,33,177,39,242,82,116,244,211,83,31,158,250,120,78,197,238,42,85,183,213,114,156,90,136,241,87,70,39,20,174,234,204,116,254,22,17,7,234,245,189,251,139,162,250,232,106,18,93,177,166,109,107,166,117,188,209,104,124,34,162,246,153,136,60,185,212,191,139,99,85,58,218,154,105,189,210,104,52,118,69,42,86,162,195,83,164,249,149,78,70,126,58,162,120,126,105,199,168,122,142,195,79,48,210,195,41,85,59,134,239,77,57,85,105,46,229,170,83,236,44,254,117,165,63,210,165,4,164,239,77,78,78,254,56,165,241,59,34,114,61,34,191,59,231,184,152,82,245,98,183,44,79,12,107,87,21,85,51,231,177,111,173,252,92,157,153,31,220,127,149,239,205,207,82,234,15,96,139,42,143,44,215,147,114,245,203,92,164,165,53,85,197,127,55,59,207,245,221,239,118,91,143,212,235,123,127,85,139,124,103,46,170,177,136,136,148,138,246,249,243,59,95,156,155,251,247,217,201,201,233,215,35,229,86,68,196,98,149,182,205,109,38,128,237,42,71,122,104,249,218,150,115,49,106,192,182,144,138,234,129,156,211,202,154,221,203,151,211,237,17,113,170,127,39,115,53,216,46,165,116,174,211,105,126,103,98,98,226,7,227,227,239,58,80,20,177,55,34,46,244,203,188,45,28,43,187,229,249,171,237,115,145,227,23,185,200,47,68,68,84,213,154,40,237,136,136,152,152,152,120,79,20,249,247,17,177,84,113,35,29,139,77,6,221,237,153,246,223,167,234,83,159,171,138,216,19,145,186,189,238,198,193,118,183,219,126,225,224,193,131,127,60,125,122,238,174,229,234,90,253,177,81,81,230,124,233,88,183,219,155,223,120,228,141,78,188,113,226,76,188,17,79,213,235,245,159,167,180,227,64,145,23,63,24,169,246,254,156,242,153,180,88,205,46,166,197,227,189,94,111,110,43,199,234,247,171,249,82,68,28,110,52,26,15,231,92,76,23,185,152,232,95,95,139,185,156,227,84,183,215,122,121,179,115,191,145,121,16,138,91,69,209,152,156,94,185,29,151,114,250,74,167,215,124,238,157,236,16,0,215,87,189,94,255,64,145,198,87,215,67,167,244,249,178,108,254,97,147,38,176,37,110,67,115,75,216,183,111,223,109,107,183,44,110,233,219,56,0,192,122,219,118,9,7,92,201,254,253,251,119,46,149,239,137,75,23,23,63,50,184,111,33,23,229,240,86,0,0,155,51,128,230,166,117,225,194,133,34,162,246,213,33,187,94,154,153,105,189,252,182,119,8,0,184,41,88,194,193,45,38,29,77,69,117,36,174,99,121,34,0,110,12,41,165,109,249,128,26,55,62,51,208,220,180,202,178,188,220,104,76,61,16,17,145,170,124,58,23,249,120,89,150,175,198,96,232,12,0,55,173,148,210,124,68,94,173,238,148,170,183,82,157,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,22,254,7,224,155,190,221,25,52,24,220,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":37158,"duration_micros":747,"top":1010.9240112304688,"left":38.513999938964844,"width":652.7440795898438,"height":34.35601806640625,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,123,152,164,87,89,32,240,247,124,213,51,153,140,6,114,35,147,169,170,174,174,73,70,130,17,33,33,32,160,160,2,178,6,84,112,65,32,174,139,49,172,32,222,30,120,4,23,220,136,136,8,168,220,30,214,11,32,40,160,40,42,226,133,172,151,69,22,92,64,97,17,4,21,163,196,97,166,47,85,61,9,147,0,9,50,183,238,250,222,253,163,187,186,171,123,186,123,122,38,147,76,38,254,126,207,51,79,250,156,58,223,249,78,85,87,186,222,58,223,123,206,23,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,93,161,113,186,7,112,119,186,252,242,203,183,110,219,246,213,223,116,206,57,247,125,224,182,109,91,247,31,60,120,240,232,233,30,211,25,162,180,219,187,30,116,206,57,247,249,230,115,207,189,207,151,238,184,227,142,47,159,230,126,0,0,78,155,114,186,7,176,25,173,86,235,130,82,26,79,89,239,241,204,56,28,17,179,91,6,213,231,38,111,158,156,92,191,159,206,219,74,148,31,88,44,126,112,219,217,91,158,176,103,207,158,35,167,122,188,247,36,227,227,227,15,204,44,143,28,150,123,189,233,183,70,68,174,213,182,213,234,124,79,41,113,222,176,92,213,241,47,211,179,211,31,25,111,78,60,43,75,252,198,98,245,116,148,193,227,122,189,222,158,19,30,203,41,234,7,128,123,159,86,171,123,109,41,245,214,181,30,43,117,117,71,86,113,243,96,80,38,247,239,223,55,117,119,143,109,61,221,110,119,219,252,124,62,49,34,47,200,140,35,253,254,244,111,109,246,216,11,47,188,236,156,109,219,14,93,51,44,215,117,249,231,217,217,169,191,61,201,161,84,205,230,196,131,171,42,46,206,204,11,171,172,142,214,37,15,108,25,148,189,27,197,69,235,105,54,155,219,75,217,250,160,42,7,23,69,105,156,159,37,239,40,131,250,192,160,12,254,101,118,118,246,214,19,237,175,221,110,239,206,172,38,170,172,238,87,151,122,75,41,213,129,204,178,191,223,223,247,143,177,78,76,114,79,55,118,186,7,176,25,153,91,47,44,81,255,250,122,143,15,191,5,204,55,50,218,173,137,143,85,153,63,57,61,59,253,145,85,205,198,74,148,239,27,41,63,230,232,191,31,189,52,34,110,60,213,227,189,39,201,172,30,28,25,163,175,221,91,215,106,55,222,156,248,145,140,248,213,145,183,241,7,198,182,45,124,105,169,75,60,126,228,155,86,39,179,250,198,136,56,225,192,247,84,245,3,192,189,79,137,124,69,100,105,173,245,88,150,140,200,136,70,149,209,110,77,124,52,35,126,186,223,159,250,192,221,61,198,161,139,47,222,125,191,70,99,254,251,230,231,242,5,17,209,142,40,81,34,166,35,98,211,1,244,182,173,71,174,143,44,47,26,150,75,137,235,35,226,68,3,232,210,106,117,158,90,162,188,32,34,30,17,185,48,146,44,25,37,22,226,162,241,86,231,29,131,44,111,152,157,157,250,212,241,58,91,12,234,175,139,44,47,136,200,78,150,42,34,22,94,251,172,170,168,162,58,216,106,77,188,174,170,234,55,206,204,204,204,30,175,191,118,187,251,240,146,241,19,153,249,244,18,177,56,174,18,145,25,37,50,218,205,206,135,74,228,107,103,102,103,222,123,130,207,251,180,171,78,247,0,238,2,143,168,75,249,240,120,179,251,189,171,234,231,35,226,19,35,229,3,213,182,234,184,191,252,51,93,102,30,247,119,220,110,79,60,53,75,252,234,114,77,249,187,140,249,167,239,221,187,247,246,136,136,82,202,77,43,251,140,207,157,204,88,78,85,63,0,252,135,246,200,18,241,127,218,237,137,239,59,126,211,83,175,221,238,254,236,88,99,174,95,34,95,31,17,237,97,125,70,212,155,237,163,211,236,60,42,74,190,104,180,174,58,193,152,172,221,110,159,61,222,234,188,177,68,121,119,68,60,98,189,118,25,229,218,170,196,223,143,55,187,215,172,215,38,34,162,217,188,116,124,219,89,135,255,119,100,121,67,68,116,214,105,182,189,68,252,116,102,245,145,86,107,215,131,55,234,175,213,234,254,80,100,126,44,35,159,190,110,163,82,190,57,75,245,167,237,102,247,23,175,186,234,170,45,27,245,119,79,115,70,204,64,175,150,17,47,47,37,103,150,107,170,11,50,227,145,37,242,73,75,109,74,254,110,171,181,235,198,126,127,223,63,44,53,43,131,107,35,26,47,142,140,45,85,230,175,79,78,78,125,233,110,29,248,61,80,187,221,253,214,200,124,215,72,213,103,27,99,249,228,169,169,254,109,195,138,173,91,171,215,205,29,25,156,147,17,23,102,148,191,157,157,157,250,155,147,57,215,169,234,7,128,123,189,223,142,146,31,94,42,213,177,179,148,234,161,25,249,93,75,117,25,191,220,108,94,250,161,217,217,207,205,172,213,193,93,38,227,41,17,113,76,176,87,202,230,82,17,46,185,228,146,251,30,61,50,88,235,106,240,137,165,50,212,141,183,100,137,213,95,34,190,152,81,62,92,69,94,144,17,223,180,162,243,146,239,106,183,39,230,122,189,169,247,172,238,170,219,237,158,59,63,55,255,129,136,216,189,234,161,233,136,248,120,68,92,177,226,177,140,93,37,234,15,183,219,237,135,172,149,138,217,106,117,158,83,34,223,180,170,122,46,50,63,90,74,117,123,70,62,46,34,182,47,61,82,242,191,223,124,243,173,141,136,120,225,113,159,247,61,196,153,25,64,103,252,113,191,63,189,250,82,68,25,111,117,159,155,145,191,182,92,85,63,53,34,150,2,232,94,175,247,111,17,241,223,238,150,65,158,1,218,237,246,215,71,230,123,99,249,15,193,116,169,234,239,152,154,154,217,63,218,110,113,38,250,39,238,236,249,78,85,63,0,220,43,45,207,192,150,252,112,175,55,253,150,213,13,198,155,221,107,178,44,77,250,156,87,202,252,51,35,226,149,119,211,248,150,149,184,49,51,254,34,34,219,37,202,51,78,228,208,163,71,234,151,69,196,101,119,230,244,157,102,231,241,245,202,224,249,166,42,243,199,238,183,243,126,127,253,201,79,126,114,46,98,33,205,100,172,58,122,93,148,242,139,35,237,94,189,251,252,221,127,181,231,11,123,238,24,237,111,48,151,63,30,35,1,114,70,121,111,102,254,236,236,236,212,167,99,49,176,111,54,187,15,40,165,126,209,200,90,178,115,50,27,47,143,136,21,87,252,187,221,238,197,243,115,249,11,35,85,115,145,241,195,91,183,53,254,112,120,101,187,221,110,159,29,209,120,98,100,188,37,98,97,237,85,137,120,65,171,213,125,103,191,63,249,233,59,243,218,220,93,206,144,0,58,55,179,216,49,103,250,147,111,106,183,38,158,22,17,143,137,136,40,17,15,29,109,208,105,118,30,85,87,241,181,11,165,242,133,181,190,133,45,26,107,183,219,221,204,106,34,34,154,85,85,125,190,174,171,125,253,254,222,155,86,55,28,111,118,175,201,170,62,39,34,34,51,190,212,239,79,191,123,163,65,142,239,28,127,116,54,202,3,34,34,162,46,117,111,118,234,109,49,114,217,167,211,233,156,55,55,87,118,85,85,94,26,17,25,81,250,71,143,30,252,167,3,7,14,252,251,38,94,131,77,235,94,220,237,206,103,254,175,136,56,103,177,234,64,213,200,39,78,79,207,28,147,86,49,62,62,126,105,102,121,236,176,60,54,86,253,246,228,228,228,225,136,136,86,107,226,145,165,228,3,35,150,23,29,238,222,189,251,172,195,135,231,175,168,235,250,162,70,169,46,168,99,238,134,126,191,127,219,70,253,76,236,152,216,53,216,18,143,139,136,200,204,59,250,253,233,63,136,136,70,103,103,231,138,186,81,46,139,136,195,17,165,191,109,219,216,167,87,45,252,44,19,59,39,30,80,151,250,107,34,26,95,21,141,193,158,70,163,241,79,195,126,1,184,247,152,153,157,252,189,241,86,231,234,140,114,109,68,68,137,120,90,140,4,208,237,246,196,83,35,242,252,136,136,82,242,3,51,51,51,159,139,136,210,233,116,118,213,117,185,44,34,206,207,140,217,173,115,213,141,251,62,191,239,150,147,26,68,153,127,66,175,215,235,71,68,180,90,221,231,71,228,51,34,22,211,122,143,99,188,185,235,63,101,212,207,91,175,231,77,142,160,26,148,242,170,97,227,140,184,37,179,241,248,222,236,222,233,233,217,233,165,70,55,223,188,231,64,68,252,82,171,213,249,82,137,242,230,197,198,187,14,111,63,122,109,124,33,126,121,216,174,217,188,116,60,99,254,231,70,250,255,243,82,230,175,233,247,123,135,70,79,58,59,59,249,175,17,241,236,118,123,162,142,140,103,45,14,248,154,86,171,251,134,126,127,242,99,195,118,243,71,235,231,69,41,75,27,18,68,41,79,234,245,39,255,114,180,175,94,175,119,40,34,222,179,115,231,196,190,70,21,159,92,126,1,242,37,17,241,212,77,190,14,167,213,25,18,64,47,174,30,56,190,44,17,31,205,197,0,58,34,206,31,125,176,174,170,111,139,204,151,70,68,100,148,191,138,136,213,1,116,105,183,39,254,115,100,188,42,50,238,191,244,230,172,51,74,12,162,221,156,248,68,84,229,39,123,189,201,191,30,57,101,59,178,188,58,98,225,157,223,189,184,187,107,189,21,175,187,119,239,62,235,240,161,185,183,70,198,253,23,7,251,218,88,12,158,199,199,199,155,57,168,94,86,15,226,7,27,213,176,183,5,103,109,221,126,112,188,213,249,245,195,71,15,189,228,84,4,210,59,118,92,122,209,124,99,240,222,88,206,113,250,114,169,234,239,152,158,158,249,231,181,218,103,54,190,38,50,71,23,34,190,59,34,134,1,234,99,34,203,43,34,34,234,42,94,211,106,117,206,58,116,104,238,173,37,162,91,149,18,25,25,153,91,31,16,17,183,109,212,79,54,114,119,100,121,203,194,51,47,159,109,183,39,230,75,198,207,215,17,95,187,252,171,207,56,124,104,238,83,227,227,187,158,63,51,179,239,67,205,230,196,149,85,137,55,14,34,30,190,48,113,145,17,117,21,115,117,222,50,222,156,120,249,204,236,212,175,197,25,186,186,23,224,63,160,165,152,100,163,96,52,179,124,34,74,92,187,88,188,34,22,182,228,29,44,60,24,63,18,177,48,81,147,81,190,103,188,217,253,250,44,249,51,245,32,174,28,30,95,34,98,110,75,29,237,246,196,175,148,82,191,106,51,139,225,70,13,131,231,136,136,42,178,26,126,200,148,227,228,48,183,90,173,11,234,168,223,92,150,218,231,171,34,226,252,140,242,67,39,114,254,118,187,253,117,145,113,213,176,92,74,190,164,223,223,59,189,94,251,126,127,250,55,219,173,137,31,136,136,133,29,185,234,242,253,17,203,1,116,35,6,223,54,250,65,89,103,252,244,236,170,224,121,196,252,96,80,253,92,163,170,159,25,75,87,175,243,59,35,226,99,17,17,87,93,117,213,150,91,110,190,245,218,165,214,37,222,213,235,173,12,158,71,237,223,63,245,247,237,102,231,23,162,148,23,47,86,61,165,219,237,94,60,57,57,121,243,122,199,220,83,220,235,22,17,214,145,151,14,127,46,81,62,187,234,225,13,191,221,181,219,221,151,70,198,123,34,22,2,220,99,148,120,104,100,126,112,188,57,190,148,107,93,109,137,223,137,136,185,97,121,126,172,94,247,82,206,145,131,243,79,24,237,187,148,234,183,34,34,58,157,206,37,89,87,31,140,18,63,184,206,161,219,51,202,243,207,218,186,253,189,11,151,61,54,111,117,78,214,37,151,92,114,159,45,91,6,127,24,145,95,191,88,53,23,165,124,215,204,204,204,223,173,223,203,166,174,0,68,100,124,119,137,242,254,18,209,61,209,126,230,87,6,186,151,69,198,123,50,134,87,11,86,184,50,235,250,253,237,118,247,197,85,137,191,141,136,135,175,110,80,34,118,100,137,95,105,181,186,47,94,227,120,0,206,100,213,241,23,199,71,68,68,198,235,178,228,31,71,44,7,207,171,30,255,177,172,171,15,118,46,238,92,126,10,71,183,129,198,107,70,62,31,63,115,232,200,217,175,58,153,94,50,199,30,55,90,222,118,112,235,239,31,231,144,249,28,205,71,46,241,208,118,187,189,156,174,81,213,79,30,105,251,129,227,237,214,177,176,141,96,121,219,82,119,37,254,75,44,198,87,251,247,223,250,176,136,216,185,60,214,252,141,99,123,88,169,170,227,183,71,203,131,163,241,45,199,59,230,158,224,140,12,160,75,41,107,206,42,54,155,19,223,184,34,23,41,227,207,55,219,103,167,217,121,252,112,118,122,249,240,124,123,137,120,65,100,172,248,246,148,165,122,251,174,139,118,237,136,136,152,154,154,218,95,98,228,13,146,229,121,187,119,239,62,107,173,115,212,37,95,176,244,28,162,220,208,235,237,251,199,136,24,27,12,170,55,197,202,160,253,31,50,226,250,140,120,109,68,244,70,234,31,83,178,113,130,57,196,43,95,171,35,71,234,223,138,204,71,47,63,90,158,214,235,77,254,223,19,235,115,93,171,23,31,156,10,95,204,40,239,141,136,219,70,234,182,68,230,171,34,98,219,82,77,230,135,34,87,236,178,18,37,242,149,227,227,227,43,210,120,0,184,199,154,31,254,176,241,130,188,50,186,227,196,167,99,56,251,124,172,209,157,36,230,74,148,27,34,202,63,173,106,115,255,186,81,189,253,68,39,167,78,84,171,213,249,206,145,220,225,200,40,207,190,245,214,207,158,212,205,196,170,168,175,88,42,100,252,241,234,124,230,181,108,25,84,31,90,89,211,24,198,28,37,178,124,251,82,117,201,63,221,212,32,74,190,111,100,12,187,186,221,238,142,133,177,173,152,248,58,92,74,125,220,109,249,166,111,158,254,151,40,203,91,10,215,139,105,161,247,116,103,100,0,29,145,79,105,183,59,207,30,254,27,111,78,188,112,188,213,253,131,170,196,210,174,14,37,226,111,14,207,125,229,207,54,219,99,93,149,235,70,138,183,151,170,254,134,126,127,250,186,153,254,212,235,122,179,83,79,168,115,121,135,143,136,56,111,126,172,254,142,165,209,148,234,237,35,143,237,92,156,105,94,97,124,124,252,97,37,226,81,203,199,228,27,23,235,175,40,145,143,95,170,143,120,227,182,179,183,60,188,223,159,122,101,191,63,245,194,109,135,182,124,221,104,0,159,17,207,93,47,64,223,140,209,157,74,34,98,127,86,101,223,201,246,21,17,81,173,53,171,159,249,179,141,58,46,143,50,216,222,235,79,149,217,217,125,171,175,4,108,78,201,231,109,59,123,203,206,126,127,242,201,71,142,30,236,70,174,185,135,245,199,162,12,190,166,55,59,253,45,189,217,169,135,101,148,71,198,114,122,73,68,93,214,189,1,15,0,103,148,210,106,117,175,141,28,89,180,182,114,23,169,181,204,101,228,211,162,12,238,59,211,159,124,82,175,63,249,160,140,249,241,18,249,230,229,38,249,176,82,55,158,117,215,12,121,241,102,112,81,70,103,128,95,61,154,51,124,162,234,168,154,203,165,242,111,155,57,102,242,230,201,209,201,184,200,204,11,35,34,186,221,238,125,99,100,50,170,212,213,186,169,32,163,74,169,87,180,171,15,215,11,41,179,85,185,223,232,216,22,115,157,143,39,75,150,207,44,29,149,177,99,51,99,56,221,206,144,28,232,149,74,196,75,70,179,1,22,126,204,209,6,127,82,53,226,71,14,244,55,157,47,92,69,198,19,151,59,204,87,174,78,105,152,157,157,190,161,221,154,248,163,136,24,222,92,228,161,17,241,155,17,17,189,222,228,199,91,173,137,143,12,3,228,140,250,185,17,241,39,43,206,80,151,209,255,57,111,218,177,227,194,247,247,122,83,17,117,227,129,35,99,255,114,163,145,215,143,46,146,219,243,133,61,119,180,90,221,151,149,200,171,23,171,218,7,15,14,186,17,113,114,65,233,74,59,35,235,215,71,196,183,199,200,55,255,59,35,35,174,239,207,78,223,233,21,209,37,242,29,51,189,233,255,57,44,31,56,112,224,223,91,173,75,94,93,98,176,34,205,165,206,114,221,108,127,121,11,157,126,127,242,99,227,173,206,155,50,202,243,23,198,83,174,142,136,255,113,103,199,3,192,93,110,121,31,229,44,143,110,183,59,163,143,236,140,82,30,30,145,79,28,105,63,221,216,82,86,92,254,143,213,147,58,37,127,180,223,155,254,195,209,170,126,191,223,139,136,31,107,55,59,95,27,165,124,243,194,233,226,217,17,113,23,173,155,105,188,38,34,134,55,136,185,233,240,225,109,47,191,51,189,149,200,137,229,82,125,219,250,45,87,152,207,136,201,97,10,73,21,11,129,110,30,202,243,70,35,193,172,98,83,219,251,102,230,23,87,84,84,11,107,206,74,230,69,203,203,150,234,77,231,150,103,230,45,177,156,28,190,115,195,198,247,16,103,100,0,125,92,25,87,215,115,229,234,136,120,219,113,219,46,168,50,202,183,14,11,99,25,71,154,205,137,43,27,81,143,103,85,93,180,212,170,206,175,138,178,240,27,46,177,226,27,82,70,228,27,34,202,194,12,115,41,223,62,62,62,254,192,153,153,153,207,68,68,76,76,76,236,28,204,47,111,159,151,145,175,29,110,51,83,199,220,251,35,182,92,25,17,81,215,89,69,169,47,104,183,187,15,206,172,199,75,41,11,51,205,117,125,254,240,188,11,221,231,242,234,214,59,239,177,227,205,238,51,103,102,39,55,251,90,109,104,235,92,117,220,124,167,181,140,69,148,21,59,208,103,227,119,87,183,233,247,247,254,91,187,53,49,23,195,133,11,37,223,55,219,159,250,215,99,123,171,254,97,228,111,224,3,99,225,15,170,197,132,0,103,142,103,70,150,103,46,149,86,93,235,204,136,201,170,170,159,182,122,219,213,85,110,159,155,59,114,204,103,201,162,249,18,249,218,140,133,0,58,34,30,220,233,116,46,159,158,158,94,115,49,253,201,106,183,39,158,18,25,35,169,27,241,220,147,77,221,24,42,17,131,225,7,90,150,178,233,56,110,116,145,99,230,194,207,11,41,177,203,31,143,153,117,99,243,221,45,203,198,194,246,7,117,68,189,244,64,41,155,191,49,74,21,163,73,59,155,29,195,105,117,70,6,208,171,111,164,146,89,125,117,201,188,60,22,18,217,183,71,196,182,44,249,155,237,118,119,223,202,29,51,214,53,223,239,79,126,186,221,222,245,160,168,235,95,28,84,113,245,194,158,14,213,202,176,171,172,120,191,156,59,90,56,251,236,173,55,28,62,52,183,63,134,201,243,117,245,189,17,113,125,68,196,96,144,223,31,177,244,70,250,114,163,17,75,91,221,245,251,253,94,183,219,189,117,110,46,158,219,168,226,103,34,27,231,69,12,111,117,185,230,121,35,179,254,234,77,60,167,97,235,178,226,125,94,242,79,183,110,29,187,246,232,145,250,175,34,242,97,11,45,242,213,221,110,247,47,78,193,170,215,155,78,122,91,160,85,170,65,189,214,101,169,140,136,207,196,226,130,144,146,203,91,223,172,104,84,242,243,35,191,183,45,59,118,236,216,126,203,45,183,124,229,84,140,11,128,211,234,203,81,226,77,243,115,99,175,185,229,150,207,125,126,163,134,25,249,151,27,253,237,111,108,109,124,124,126,110,249,195,162,174,75,39,34,78,89,0,189,235,162,93,59,230,178,94,74,221,40,17,175,239,245,167,62,120,103,251,205,146,51,145,101,152,107,124,193,38,15,27,139,145,156,240,44,229,243,17,17,213,246,234,139,113,100,57,133,188,148,114,238,177,135,174,101,203,121,163,23,12,74,25,220,182,240,223,60,48,146,33,176,230,109,217,215,82,178,236,200,225,7,119,70,127,227,214,247,12,103,104,14,116,249,163,94,111,250,45,195,127,253,254,228,235,123,179,83,207,206,152,239,68,196,71,135,173,50,243,229,177,201,125,21,91,173,238,35,34,235,143,68,137,171,143,223,250,88,123,246,236,57,18,25,175,95,58,119,196,143,239,62,127,247,125,218,237,246,217,145,101,105,207,199,18,241,203,211,211,211,75,151,62,174,186,234,170,45,243,71,243,55,22,111,9,122,42,103,150,135,103,28,253,10,48,119,228,200,161,255,186,119,239,222,219,171,172,71,23,35,94,48,63,159,175,56,217,19,140,252,188,217,75,73,199,88,181,11,71,28,41,91,214,75,191,89,74,111,201,18,183,175,51,164,21,147,217,117,93,111,234,61,0,192,105,53,26,147,188,51,74,62,39,74,62,39,35,126,126,164,254,156,146,101,223,6,193,243,200,4,104,57,176,209,201,198,198,198,86,166,33,68,110,54,24,221,140,50,183,181,126,125,68,12,115,130,111,58,116,100,219,75,55,58,96,211,29,103,181,52,217,85,22,182,241,59,174,102,179,187,106,145,255,66,234,199,222,189,123,239,136,145,157,196,50,55,123,131,151,193,138,221,202,150,83,58,202,104,28,112,89,183,219,221,76,64,94,101,228,55,46,245,85,226,148,76,196,221,213,206,204,25,232,92,123,59,180,126,191,127,91,167,217,121,105,93,202,251,34,34,74,196,163,218,237,246,238,197,59,16,174,107,113,223,194,95,139,229,155,138,204,69,196,239,71,230,158,168,98,57,135,39,203,51,34,226,113,107,116,17,17,17,141,45,241,206,193,124,188,34,22,82,12,206,57,188,253,232,147,74,61,54,200,146,203,91,186,148,193,138,84,137,91,110,185,245,73,139,51,231,67,159,46,17,31,204,140,189,81,229,145,133,231,91,93,88,34,79,42,175,56,51,171,178,252,247,100,203,129,3,7,190,18,17,49,61,59,253,145,241,86,231,29,195,205,232,35,227,89,205,102,231,93,179,179,211,239,63,193,83,148,145,31,234,141,26,110,228,152,20,142,245,100,140,45,159,177,90,39,48,94,249,254,200,60,191,68,108,248,119,20,128,211,111,121,31,232,200,15,247,151,239,68,216,104,183,38,30,31,139,219,150,102,228,245,187,207,223,253,59,107,238,62,145,89,45,93,181,173,87,222,11,98,181,131,7,15,158,83,141,100,25,100,150,47,110,208,252,132,140,55,187,79,207,204,209,59,244,29,220,118,214,225,95,109,183,38,86,180,203,145,173,88,51,226,169,237,214,196,253,35,34,234,204,119,207,206,78,223,176,86,223,117,196,167,74,196,247,47,22,31,219,237,118,207,157,156,156,220,48,119,185,17,241,200,149,23,212,235,97,250,99,70,201,63,143,44,79,94,168,47,87,199,166,238,236,88,134,247,219,136,140,152,236,205,44,164,210,212,117,220,56,250,201,60,56,90,190,33,34,222,119,204,225,35,22,247,181,94,154,173,174,242,152,157,82,238,145,206,200,0,122,35,131,50,54,85,70,118,180,41,131,114,113,68,108,24,64,223,124,243,109,95,87,70,247,137,44,249,163,107,220,66,180,180,91,221,103,143,76,148,30,19,188,77,77,77,237,111,181,38,222,90,34,126,56,34,34,234,242,188,186,228,82,2,70,70,252,94,127,245,61,227,51,70,247,95,188,233,200,209,131,143,94,125,179,148,102,179,243,93,165,156,250,73,212,106,172,252,212,96,62,190,51,22,47,1,85,165,252,74,187,221,190,114,147,171,102,1,224,238,48,40,89,191,50,75,53,220,98,173,117,120,251,209,235,226,11,241,134,99,90,150,50,18,0,196,163,186,221,238,182,245,238,76,219,136,179,30,146,35,243,62,85,85,159,178,153,207,186,228,119,175,250,212,190,34,142,63,91,188,212,166,81,170,143,174,215,168,148,242,129,200,229,112,120,110,46,158,17,17,111,94,175,125,68,140,238,174,30,170,0,0,14,16,73,68,65,84,101,201,231,140,244,240,119,189,209,88,164,46,55,68,89,140,69,50,31,221,108,78,92,185,209,94,208,205,230,37,157,200,193,232,196,223,59,99,49,56,58,247,220,175,250,196,29,183,127,101,41,157,181,46,245,117,113,156,0,186,100,245,189,163,193,253,216,124,217,76,234,237,105,119,134,166,112,172,175,145,243,43,190,222,213,213,216,113,247,71,108,100,125,191,209,114,53,191,188,29,222,80,167,217,249,182,97,206,240,162,53,23,165,149,82,222,177,92,136,135,150,88,190,91,80,68,174,181,13,91,123,228,232,191,94,227,78,131,85,85,22,118,148,56,213,166,166,166,246,71,137,209,155,141,92,150,57,118,151,156,11,0,78,214,204,236,204,159,69,196,255,91,170,200,114,125,167,211,57,94,218,99,103,110,110,121,1,223,42,99,25,131,235,71,202,95,62,124,248,240,26,139,210,79,214,38,111,64,182,238,225,235,31,223,235,237,251,204,202,251,30,228,203,154,205,75,58,235,181,111,181,58,207,138,136,229,189,179,75,189,98,231,146,58,198,86,4,184,85,137,159,223,96,95,236,177,170,26,188,52,70,239,195,16,101,105,203,224,27,111,188,241,104,25,217,192,161,68,92,211,110,119,215,77,141,221,185,115,226,33,25,229,167,70,170,254,232,84,173,165,186,171,221,171,2,232,110,183,123,238,160,148,159,25,169,250,98,230,145,227,238,145,56,40,141,21,185,84,89,85,15,30,45,239,220,57,241,144,186,148,213,193,239,154,111,238,94,111,242,227,17,177,214,183,167,79,245,251,211,199,212,151,40,51,203,165,188,127,187,221,94,186,228,180,123,247,238,179,198,91,19,175,137,136,199,30,239,57,156,172,255,223,222,253,135,72,126,158,5,0,127,222,239,236,238,37,193,210,196,94,188,235,204,247,102,54,231,145,72,132,248,131,254,83,132,18,104,16,127,212,22,73,107,64,180,144,66,131,226,143,138,72,170,21,161,81,164,10,86,147,104,20,141,180,198,63,74,208,106,53,164,13,210,80,106,91,168,148,94,141,72,155,70,183,151,189,153,221,225,142,91,19,146,214,220,237,237,206,247,241,143,253,53,183,157,217,219,146,171,151,77,63,31,88,216,121,231,157,119,222,153,221,97,222,121,231,121,159,231,200,145,195,143,100,196,231,118,230,147,247,117,58,199,39,87,98,4,128,171,99,84,178,252,193,216,229,27,155,245,120,247,132,126,151,108,110,149,200,7,235,186,119,103,140,189,103,31,62,124,203,107,142,117,186,127,182,149,194,110,227,86,249,208,132,13,172,151,99,59,134,123,175,159,18,241,244,206,100,243,159,183,218,215,115,163,52,118,167,115,252,230,186,238,190,183,174,231,223,63,86,49,177,41,173,106,172,48,91,28,169,202,232,147,199,218,55,253,104,140,69,22,180,219,237,195,117,187,123,111,137,178,179,59,93,226,43,171,171,231,47,9,37,29,14,191,54,136,140,123,199,154,126,34,115,230,209,118,187,119,73,5,199,118,123,254,251,58,157,238,195,145,177,147,150,183,196,135,118,231,180,30,229,218,159,100,140,197,49,103,62,81,215,221,119,31,63,126,252,181,91,77,117,93,95,91,215,189,59,91,213,165,133,234,170,86,142,175,225,94,209,14,100,8,71,41,241,211,117,221,29,175,48,119,93,102,185,101,125,45,127,182,68,188,118,172,227,159,14,151,135,47,93,110,188,229,229,103,191,92,119,122,207,68,108,4,207,103,201,143,116,58,189,55,68,228,51,165,148,219,35,227,237,177,93,243,125,219,180,180,104,153,145,15,149,177,180,120,27,157,243,254,152,84,45,41,227,137,40,219,177,76,183,71,182,158,60,214,153,127,56,34,95,119,225,252,218,207,199,132,178,226,123,87,104,250,214,156,60,121,114,173,221,238,253,106,41,241,165,205,166,217,146,163,7,34,226,39,227,101,196,52,3,192,149,52,24,46,62,94,119,122,79,197,86,40,68,41,191,121,244,232,137,15,159,57,179,176,215,33,151,217,200,248,104,221,233,125,58,34,54,55,172,46,220,145,81,118,206,38,69,156,157,91,111,221,127,37,231,186,188,220,127,124,63,253,234,78,239,174,216,172,222,87,178,124,113,176,124,122,60,124,180,148,50,250,88,100,185,53,34,163,105,149,187,79,156,56,113,243,194,194,194,234,96,240,236,103,234,186,247,161,177,197,236,205,89,154,127,169,59,189,231,51,202,103,75,228,141,17,241,198,9,119,249,27,147,62,40,172,174,189,244,23,215,204,93,119,119,110,205,37,242,173,165,196,91,235,78,175,31,17,95,136,136,31,140,200,19,187,246,14,159,47,165,249,157,221,99,13,135,195,149,78,103,254,189,17,185,83,100,46,203,95,93,92,29,61,84,183,187,159,47,165,122,33,51,223,28,27,89,211,198,31,237,239,246,251,167,175,104,26,193,111,167,131,185,128,222,85,72,101,179,109,183,207,95,184,112,232,143,246,57,228,122,147,249,203,85,41,159,28,27,239,215,99,60,149,220,70,227,179,145,113,211,101,231,87,154,143,71,182,254,45,118,190,50,121,254,218,243,115,255,52,169,239,161,235,102,62,118,225,252,218,227,17,241,150,205,166,31,202,200,63,223,213,237,127,98,227,219,130,27,34,34,50,247,151,89,100,191,134,195,211,255,222,233,244,254,120,227,49,71,68,137,31,59,214,158,191,107,48,92,188,92,133,39,0,248,255,178,30,37,126,47,50,254,97,243,242,13,179,173,181,95,136,136,253,20,38,185,125,74,251,11,85,86,239,124,37,134,13,28,62,124,203,119,69,94,184,117,172,169,59,122,113,116,125,108,238,238,174,174,190,244,158,107,230,174,109,109,39,3,216,112,195,174,138,195,219,74,148,187,7,75,139,79,76,186,238,220,185,115,223,232,118,187,111,201,81,245,232,174,112,213,110,92,90,18,61,34,182,243,112,255,204,96,48,152,88,44,101,121,121,241,111,235,186,123,125,100,25,255,96,50,27,165,188,41,39,237,1,102,121,112,102,54,62,48,105,172,87,170,87,85,8,71,196,198,31,53,50,238,157,59,212,250,241,9,201,202,167,238,220,14,135,253,39,75,54,111,139,241,50,208,151,220,176,188,47,51,126,101,172,105,234,115,87,85,213,53,17,241,253,59,55,206,251,167,213,170,95,88,88,88,157,59,212,250,185,61,234,207,63,85,141,242,77,17,101,59,224,127,102,159,169,249,34,34,74,217,103,114,139,92,251,64,68,108,39,164,207,146,15,180,219,237,195,155,163,236,181,227,253,45,236,134,239,57,14,0,223,217,182,43,226,78,251,166,117,105,233,244,99,17,177,125,192,45,35,222,55,63,63,127,116,226,104,165,220,23,27,135,231,38,229,21,94,139,44,15,54,217,186,109,48,124,118,207,67,110,123,105,94,230,251,90,238,145,128,106,101,229,153,175,103,196,163,99,77,159,24,95,232,159,59,119,238,27,131,229,254,187,50,242,29,17,49,181,52,120,137,124,164,201,248,225,193,242,226,223,76,235,19,17,209,239,247,79,93,115,126,230,142,40,249,158,136,152,86,210,251,165,140,248,253,170,106,126,100,119,197,230,93,114,105,169,255,64,70,121,99,137,242,119,211,123,229,103,74,54,111,91,26,46,254,218,180,195,158,175,84,7,98,7,186,148,139,43,81,90,247,76,189,190,169,214,179,202,51,213,122,158,238,159,233,127,53,166,132,30,84,77,243,100,83,109,188,144,74,196,115,187,175,31,12,7,143,29,57,242,189,189,185,214,232,205,89,109,20,43,41,77,245,98,180,70,159,93,26,12,134,243,71,231,231,215,103,154,123,34,34,50,99,106,186,155,166,137,183,199,78,74,188,104,98,102,207,127,218,83,167,78,189,16,17,119,214,245,252,27,34,154,219,54,31,85,70,148,255,60,114,228,117,95,58,121,242,228,90,93,247,254,48,34,55,74,101,174,151,133,61,134,187,244,49,87,249,84,211,196,248,115,55,241,197,62,28,14,87,218,237,238,59,170,42,182,63,237,206,52,51,189,136,88,41,101,244,223,25,101,252,4,239,246,63,249,40,227,83,85,149,103,35,34,154,156,150,151,121,243,86,123,140,83,70,101,33,102,119,78,9,103,126,125,98,232,77,137,242,193,44,205,107,54,250,76,78,117,83,74,243,95,227,247,115,253,245,163,139,43,43,123,205,12,128,171,45,163,252,86,41,205,92,68,68,102,53,109,113,182,94,170,230,158,204,178,29,159,187,182,86,142,70,196,86,110,228,157,13,166,166,201,165,97,255,225,136,248,240,235,95,223,187,173,213,138,155,34,226,80,68,25,174,175,207,124,249,50,161,31,251,82,85,163,207,101,150,173,117,193,234,229,250,239,86,74,254,101,68,254,125,68,196,168,41,223,20,190,48,59,91,126,113,253,98,62,25,85,86,179,23,91,143,77,24,162,89,94,238,127,52,34,254,177,221,238,253,64,85,197,209,204,60,92,101,117,177,41,121,110,118,84,78,45,158,57,189,184,223,249,44,60,183,240,98,60,23,15,182,219,237,191,46,101,238,182,42,71,223,19,165,245,221,89,242,197,50,106,206,141,202,232,233,225,112,184,239,119,212,205,248,232,187,234,186,254,237,204,170,87,101,117,99,86,205,76,68,181,146,25,103,150,135,167,255,35,14,104,165,96,5,38,174,188,86,221,233,125,37,54,99,151,75,228,35,131,229,254,180,83,192,0,192,21,82,183,187,255,186,125,56,176,148,251,150,150,22,223,127,149,167,196,171,212,171,46,132,227,106,59,118,108,254,142,24,59,248,87,50,38,165,174,3,0,224,128,178,128,190,210,154,248,165,237,223,51,190,216,31,246,191,41,167,52,0,0,7,151,5,244,21,212,61,218,189,53,35,127,106,235,114,137,242,193,56,160,177,61,0,0,76,102,1,125,5,53,85,245,206,177,139,203,23,71,231,39,214,177,7,0,190,13,246,153,121,10,94,174,3,145,133,227,128,40,165,196,87,183,234,205,103,150,175,157,61,123,246,127,175,246,164,0,224,59,69,70,62,84,74,124,36,34,162,106,242,233,203,245,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,18,255,7,15,109,235,43,103,181,162,112,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":37161,"duration_micros":752,"top":1073.0,"left":40.0,"width":640.0,"height":2.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,16,192,73,68,65,84,120,156,236,214,177,9,0,33,16,0,65,181,41,193,208,194,13,31,190,42,45,193,204,19,153,169,96,195,77,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,39,229,232,128,157,241,127,51,186,1,0,128,115,122,109,87,63,106,137,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,123,112,72,0,0,0,0,32,232,255,107,103,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,23,29,178,4,4,230,52,46,164,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":37164,"duration_micros":873,"top":1140.9239501953125,"left":38.513999938964844,"width":652.7440795898438,"height":34.3560791015625,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,125,144,94,87,125,31,240,239,185,207,174,44,27,140,193,24,100,239,115,159,221,71,178,130,27,106,108,192,97,82,18,134,6,66,82,8,111,37,9,20,24,218,80,138,73,200,192,240,150,2,3,56,5,10,73,112,136,9,20,18,94,76,72,32,77,154,78,210,64,94,161,36,110,74,50,13,205,52,41,96,99,94,42,208,106,119,159,149,108,171,153,130,137,36,107,119,239,233,31,251,162,71,178,100,173,133,176,132,249,124,102,52,163,123,238,185,231,254,206,35,237,115,127,247,220,115,238,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,233,202,153,14,128,35,250,253,233,127,149,52,23,174,110,213,207,141,70,123,110,56,179,17,125,235,77,77,93,58,40,101,233,209,189,149,220,52,183,111,238,230,245,242,182,109,207,77,154,231,173,111,151,82,111,152,159,159,255,202,153,137,18,0,224,136,137,51,29,192,201,12,6,131,203,107,45,143,62,149,99,187,46,187,23,23,231,254,236,116,199,244,173,82,82,158,159,212,199,37,73,106,125,99,146,147,38,208,83,83,83,23,53,205,196,51,78,229,124,181,230,142,209,104,238,195,167,114,236,233,208,182,219,175,72,93,254,108,82,210,245,146,126,127,250,169,163,209,220,31,173,198,86,207,43,41,239,223,136,53,205,147,146,72,160,1,238,229,166,167,166,127,168,107,50,60,222,190,90,115,168,87,179,111,57,205,252,226,226,236,151,146,212,123,56,188,187,180,109,219,182,251,76,76,156,251,176,166,102,166,43,93,151,52,243,203,203,7,111,188,229,150,91,254,225,100,199,246,251,253,7,38,189,39,151,146,115,78,53,127,185,234,170,171,38,111,27,221,246,93,181,105,30,86,155,122,184,89,169,115,247,125,192,125,111,188,249,230,155,15,223,157,118,166,166,166,206,43,101,203,21,77,93,121,112,74,239,194,90,234,215,203,74,119,219,74,89,249,194,226,226,226,254,187,27,87,219,182,59,107,109,102,154,218,60,168,43,221,100,41,205,109,181,150,189,163,209,238,207,229,44,251,55,220,172,179,62,129,174,181,60,60,245,72,34,117,119,52,77,222,157,228,219,38,129,62,53,91,46,74,173,167,244,249,148,100,46,201,25,75,160,75,173,223,95,143,218,46,79,75,178,158,64,151,226,249,8,192,119,156,149,82,254,121,169,249,233,227,237,43,73,186,146,52,169,233,247,103,102,155,148,107,231,71,179,239,79,178,114,207,70,121,180,126,191,223,150,58,241,234,148,60,63,169,231,215,146,148,148,36,53,147,19,91,111,31,244,103,174,159,88,106,222,182,251,214,221,183,28,123,236,96,48,184,188,174,244,158,151,212,151,37,217,154,122,247,243,151,29,59,118,92,112,199,29,221,11,246,237,219,255,154,210,43,219,146,154,212,164,107,74,190,254,181,127,216,219,239,207,92,63,57,89,174,155,157,157,253,127,119,213,206,69,23,93,118,254,214,173,7,255,117,106,121,85,82,167,107,105,178,222,86,109,154,52,105,14,244,251,51,215,53,77,247,171,243,243,243,139,39,139,171,109,135,223,91,106,94,89,107,125,86,73,82,75,93,253,92,106,77,73,77,59,53,253,169,146,250,75,243,139,243,127,176,217,190,158,45,154,51,29,192,183,131,169,169,75,7,109,59,125,245,234,159,153,83,26,237,229,206,106,169,179,71,111,151,47,156,169,88,0,248,246,82,146,97,77,253,149,65,127,250,221,103,50,142,182,109,119,150,76,124,38,37,47,77,114,254,113,170,156,95,147,87,44,77,118,127,51,188,120,184,49,178,190,99,199,142,11,218,254,204,31,214,174,185,49,165,190,38,201,214,141,35,186,205,143,202,94,124,241,206,7,29,190,99,229,175,74,234,117,37,217,118,156,42,151,148,228,154,229,165,122,195,112,56,188,255,137,218,153,154,186,116,176,245,156,67,159,72,45,239,76,50,125,130,106,231,149,228,13,181,54,127,213,239,111,191,242,174,226,234,247,135,63,153,90,63,93,83,159,117,194,74,165,60,182,150,230,99,237,212,240,109,87,93,117,213,228,93,181,119,182,57,235,71,160,75,169,159,169,201,139,238,84,94,155,167,214,212,167,174,109,126,57,165,190,253,216,58,93,151,221,167,39,134,229,43,198,70,193,255,52,201,239,159,142,118,79,143,195,251,83,38,238,244,249,164,54,255,120,237,110,118,117,51,229,21,165,116,71,61,66,170,53,119,220,3,1,158,208,194,194,158,143,247,251,195,87,150,212,71,148,212,133,174,46,189,239,76,198,3,192,89,231,211,41,245,215,54,182,186,60,32,77,121,72,106,254,205,122,81,77,249,169,126,127,230,143,70,163,61,127,124,6,226,107,106,237,125,168,36,15,28,43,59,148,90,255,123,74,57,39,201,247,39,89,79,12,167,87,122,121,87,146,167,37,201,161,67,229,126,77,201,83,142,223,108,217,84,2,125,209,69,151,157,63,217,59,244,251,53,185,124,172,248,64,77,249,179,146,250,224,36,255,100,172,252,17,203,135,235,181,57,78,78,53,28,14,239,191,188,180,124,67,146,157,199,236,154,75,242,55,73,30,126,212,190,154,237,37,221,95,182,109,251,200,133,133,133,93,199,182,215,239,79,191,168,164,190,247,152,226,165,212,250,215,165,52,95,171,169,63,152,228,188,177,238,190,122,223,190,253,189,36,63,179,153,126,159,13,206,250,4,122,126,126,254,166,36,55,29,91,222,182,195,54,53,235,9,244,226,194,194,220,7,190,85,49,52,181,60,184,110,238,255,242,61,110,109,46,210,157,250,222,182,51,79,74,205,203,142,148,44,125,100,97,97,244,127,239,193,208,54,163,142,70,179,239,56,211,65,0,112,86,25,159,192,183,235,120,215,247,193,96,240,203,181,107,110,72,242,160,36,41,181,190,58,201,61,158,64,15,6,219,31,83,187,238,49,27,5,37,239,233,186,165,55,174,207,19,190,232,162,203,206,223,186,229,208,91,215,70,167,83,83,159,58,53,117,233,96,113,241,43,243,27,199,212,124,60,169,255,45,165,60,39,171,137,234,166,157,115,206,29,47,172,171,73,250,90,83,229,117,231,30,156,120,207,174,191,223,245,245,36,217,121,225,206,251,29,60,119,249,5,37,245,29,107,241,93,221,182,219,223,189,176,176,251,115,227,237,172,44,213,151,102,44,65,174,41,127,80,107,125,227,226,226,158,207,100,109,142,242,212,212,240,31,149,210,189,102,117,189,86,146,228,252,90,123,255,62,201,115,198,219,26,14,135,23,47,47,213,95,24,43,90,74,205,139,183,108,237,253,238,87,191,250,213,175,37,235,47,10,232,253,72,106,62,144,228,1,171,161,229,85,253,254,240,55,71,163,217,207,220,157,207,224,76,57,235,19,232,211,172,55,53,53,115,69,47,221,160,43,229,130,94,205,190,165,218,251,242,222,189,187,247,28,91,241,168,183,64,212,60,97,108,215,160,109,167,175,62,178,89,14,44,44,236,249,143,199,57,87,25,12,6,151,172,172,52,195,166,201,246,210,117,183,175,164,153,95,92,220,115,99,146,229,211,219,173,211,99,56,28,110,237,14,117,59,86,122,101,123,41,185,127,82,70,19,19,249,226,236,236,236,190,205,28,223,239,247,31,88,202,228,229,73,109,75,151,115,186,82,38,75,169,199,153,151,86,118,45,44,204,254,197,182,109,219,238,51,57,121,206,115,215,75,39,150,155,79,206,238,155,157,77,146,166,105,142,122,128,85,202,234,86,219,182,23,214,218,187,50,169,109,211,52,183,118,221,210,231,71,163,209,194,102,226,155,158,158,126,192,210,82,217,222,52,245,210,36,53,41,163,195,135,15,220,120,219,109,183,125,227,248,253,153,121,116,41,245,242,36,41,43,245,139,243,123,231,255,242,170,171,174,154,188,245,214,91,175,204,74,111,103,109,234,82,173,229,43,163,209,236,77,57,75,255,77,1,238,141,230,231,231,111,26,76,205,188,182,150,124,48,73,82,202,99,251,253,126,187,126,61,104,219,153,31,75,234,133,171,187,54,222,226,84,166,167,167,183,119,93,185,44,201,133,181,102,113,203,82,115,243,241,230,37,111,86,173,245,251,198,54,247,110,221,58,249,170,93,187,246,108,60,221,221,191,255,75,183,247,251,195,95,43,169,47,93,47,107,154,149,169,36,243,91,182,172,220,246,141,111,108,189,223,254,253,95,186,125,53,230,233,239,75,45,107,9,116,61,233,42,160,126,191,255,192,146,122,205,88,48,255,110,180,184,231,231,199,235,172,37,210,191,220,246,103,126,34,107,201,121,89,77,248,55,18,232,169,169,75,7,53,203,111,30,59,236,79,74,89,126,246,104,180,112,112,188,173,197,197,217,47,38,185,186,109,103,186,212,188,32,73,74,242,236,126,127,248,206,209,104,246,211,235,245,150,15,119,47,75,41,15,216,56,176,148,167,45,140,102,63,62,222,214,194,194,194,193,36,191,119,201,37,51,187,123,77,254,118,163,234,106,127,126,236,100,125,63,27,124,167,36,208,165,223,159,126,94,73,121,85,146,43,107,154,141,133,8,189,210,165,223,159,249,79,189,94,125,203,220,220,220,231,215,15,24,127,11,68,61,122,42,210,229,71,45,106,44,185,57,201,81,9,244,37,151,204,60,178,215,228,23,107,151,199,55,171,107,8,82,75,147,38,73,219,159,89,40,41,63,55,63,154,125,111,206,146,149,167,171,171,109,39,95,190,188,84,95,159,94,57,175,36,107,145,213,44,47,37,109,59,253,177,137,229,230,229,235,201,237,157,143,191,116,208,100,249,154,36,207,79,173,147,201,234,143,126,89,91,120,112,172,154,122,93,146,191,72,238,123,159,212,229,141,207,114,169,87,31,159,100,61,129,174,221,88,234,221,117,221,5,109,59,243,31,82,243,146,213,111,149,146,218,213,148,76,100,208,31,254,231,222,100,94,118,162,68,127,48,24,76,213,149,230,77,221,74,94,216,107,86,143,93,119,206,150,243,14,12,250,211,239,63,116,248,224,53,199,73,164,31,151,90,222,186,218,159,230,218,193,212,112,231,45,251,246,191,53,105,46,73,89,237,91,73,77,219,159,249,74,169,221,43,191,29,23,65,0,156,109,154,212,166,174,127,79,215,19,191,110,183,54,229,243,169,71,46,50,77,211,92,146,100,97,237,184,159,78,202,227,215,154,248,241,193,212,240,97,181,212,159,237,86,242,136,245,250,37,201,210,100,151,182,157,121,119,41,221,207,111,102,81,220,157,117,7,74,154,15,39,73,45,221,223,237,218,181,235,78,83,35,155,102,101,178,118,227,75,206,202,193,36,153,157,157,61,148,228,208,70,105,109,154,141,124,163,57,249,107,134,75,233,61,41,53,235,137,234,151,211,116,191,120,194,186,77,243,178,90,87,46,75,146,46,229,168,55,90,245,178,242,132,241,75,117,87,243,134,197,99,146,231,49,203,43,43,205,155,123,77,247,47,179,49,53,165,62,37,201,167,147,213,183,128,220,178,111,255,79,28,57,113,126,123,97,225,232,228,121,220,222,189,123,254,174,157,154,254,133,148,242,218,181,162,31,29,14,135,23,111,118,224,238,76,186,215,39,208,59,119,238,60,231,208,193,229,119,37,245,206,243,132,215,148,228,217,221,74,121,242,96,48,124,230,252,252,236,39,190,153,243,173,77,157,248,88,142,204,121,186,83,149,154,250,43,237,212,112,184,176,56,251,154,111,230,92,167,195,182,109,219,238,83,202,150,223,42,169,79,59,97,165,90,158,190,220,171,223,211,182,237,15,28,59,215,105,251,131,183,111,91,42,203,255,51,201,37,155,61,103,147,218,36,201,121,181,43,75,155,60,166,164,252,70,234,216,2,139,241,240,82,159,181,188,148,43,167,166,166,30,115,236,235,117,166,167,167,119,116,43,229,79,83,242,144,19,52,125,94,77,121,249,57,91,206,187,178,109,219,39,175,221,21,31,39,128,250,226,122,252,197,33,73,114,105,45,205,199,250,253,233,103,142,70,115,191,187,201,46,1,240,77,168,53,155,123,89,83,205,117,181,212,19,45,138,75,106,94,82,107,243,195,211,23,79,63,99,252,247,17,108,198,194,194,220,187,238,106,255,142,29,59,46,56,124,120,249,245,99,69,163,133,133,221,119,235,28,39,212,149,199,174,167,217,37,245,247,230,23,22,14,78,95,60,253,208,218,52,87,212,38,223,93,107,125,80,82,190,92,74,185,97,126,126,247,167,146,124,234,120,205,212,166,123,250,216,128,247,13,139,139,123,254,247,93,157,118,239,222,221,123,218,254,240,67,235,121,85,41,121,110,146,107,146,212,189,123,247,63,170,41,71,242,129,90,235,7,79,214,141,166,203,71,186,94,214,19,232,172,28,206,63,77,242,59,39,59,238,76,187,215,191,133,227,224,193,165,107,238,148,60,151,236,46,41,127,152,177,59,191,36,231,215,174,126,116,106,106,230,17,73,82,74,57,144,82,95,148,82,95,148,228,79,198,234,221,180,81,190,186,239,231,214,119,12,135,195,139,83,243,145,140,39,207,181,126,162,36,175,42,41,31,78,114,224,72,12,245,213,211,83,211,63,116,250,122,122,106,182,76,108,125,197,49,201,243,109,41,121,123,74,125,109,82,110,28,43,239,167,246,222,151,99,126,249,206,210,100,125,115,198,147,231,154,143,215,148,87,164,228,237,73,142,158,115,93,203,219,82,234,139,186,148,83,25,169,221,72,158,107,242,183,41,245,191,38,25,207,191,47,107,178,229,154,99,142,153,88,89,105,222,155,28,149,60,127,182,38,175,175,201,47,101,125,164,98,213,227,74,237,189,242,46,206,63,158,60,223,150,146,143,38,217,59,94,161,164,92,223,182,109,127,51,157,1,224,248,186,148,110,99,163,220,213,147,218,238,138,163,182,186,110,239,9,42,142,39,207,75,171,215,255,163,174,111,73,242,144,174,215,252,250,234,244,205,83,55,152,218,254,195,109,59,243,194,118,106,230,37,109,59,243,238,195,119,172,124,37,181,60,125,163,66,169,111,202,233,153,242,55,145,146,31,93,223,168,37,55,183,83,51,255,165,235,149,207,215,82,127,59,181,254,108,73,94,92,82,223,145,218,125,182,109,103,126,235,4,215,167,146,90,254,217,88,124,31,219,212,217,87,175,193,107,39,207,246,225,112,184,45,73,154,228,187,199,106,29,42,165,251,31,39,107,106,110,223,220,23,214,158,230,39,73,186,181,169,147,103,187,123,245,8,116,219,14,191,55,181,30,185,243,43,185,185,235,242,188,197,209,158,207,38,233,218,182,61,183,212,137,127,81,83,63,180,86,99,107,179,58,159,234,123,214,70,34,63,144,36,253,254,204,76,73,126,100,173,206,252,137,22,44,174,44,229,25,25,95,137,91,114,245,194,104,238,131,89,155,200,208,239,239,120,107,201,202,159,39,105,147,100,101,245,174,237,147,167,177,203,119,203,234,232,252,210,171,55,10,106,254,215,228,114,243,148,177,249,96,215,14,250,51,111,169,201,235,214,182,31,223,182,219,31,182,190,248,96,48,24,76,213,238,200,205,73,73,126,102,126,113,207,117,217,232,111,255,157,37,19,127,157,181,254,214,146,175,141,54,185,216,179,235,186,146,244,142,45,254,243,137,149,242,194,245,169,36,219,31,188,125,219,210,100,119,125,178,182,138,185,212,23,110,219,182,237,117,235,47,172,31,12,6,15,175,93,221,184,73,169,201,175,158,123,238,228,43,214,31,177,237,188,112,231,155,15,109,93,250,157,148,60,113,109,255,79,237,220,185,243,237,235,251,155,227,44,131,174,169,207,28,141,230,62,154,213,47,192,137,126,127,250,5,37,101,253,237,33,23,164,235,61,49,201,73,239,184,1,56,117,253,254,240,225,37,245,218,245,237,154,242,201,147,172,135,89,170,169,207,45,165,251,227,249,181,39,141,253,126,191,109,210,123,67,77,249,201,181,86,30,85,186,222,11,146,188,231,84,227,170,233,126,60,53,87,175,189,2,122,220,237,165,230,205,243,163,185,235,79,181,237,113,109,219,110,75,29,203,55,106,185,230,46,158,180,38,53,207,73,122,63,48,125,241,244,19,198,71,217,135,195,225,5,203,75,117,99,128,170,116,205,220,102,206,95,74,55,87,235,145,49,216,238,80,119,97,146,125,105,202,131,142,76,171,41,255,231,132,79,117,143,137,174,212,114,83,77,125,104,146,148,122,220,87,241,157,117,238,229,35,208,117,124,34,250,168,235,38,158,184,246,104,162,75,86,39,177,207,143,102,127,125,109,36,121,221,35,218,118,248,168,83,58,91,173,143,28,219,248,196,194,194,158,235,51,246,35,52,26,125,245,203,41,71,126,224,147,242,164,83,57,207,233,114,199,29,119,124,87,198,71,86,155,242,111,143,89,76,81,107,89,121,75,146,219,143,20,117,15,91,255,219,202,74,115,212,111,138,58,116,248,192,251,114,84,127,71,11,169,101,99,126,120,73,29,191,51,189,75,77,211,28,155,187,46,44,45,79,60,119,124,30,246,238,91,119,223,82,154,102,124,206,215,121,91,182,108,121,232,145,80,123,227,119,177,183,247,122,245,245,227,243,211,118,253,253,174,175,215,82,222,52,86,167,61,112,96,101,163,79,221,177,95,127,165,190,124,109,138,198,250,232,193,242,104,52,247,129,146,252,255,246,238,61,74,146,171,60,12,248,119,171,103,119,37,25,5,100,64,43,77,247,244,180,150,141,33,34,22,143,117,98,130,5,70,22,182,57,142,65,113,176,193,132,151,33,86,226,24,31,76,48,118,98,59,198,22,24,19,114,192,128,14,36,231,0,177,197,195,70,199,47,14,49,49,193,193,128,3,182,130,177,108,242,146,0,47,210,206,244,244,172,20,189,162,5,239,107,166,235,203,31,51,211,93,211,243,216,209,106,209,74,242,239,247,135,52,85,115,171,250,78,75,221,117,235,214,119,191,239,79,214,154,100,201,203,3,128,251,163,249,221,187,127,92,135,161,123,245,76,123,246,181,51,237,222,251,75,228,95,70,196,35,215,26,149,18,111,154,56,199,250,232,142,146,175,26,12,230,127,167,57,160,27,12,6,11,253,193,252,79,68,230,40,180,33,75,92,189,225,216,51,227,252,140,120,97,183,219,189,244,212,77,79,45,115,247,55,77,236,90,27,60,31,45,81,126,171,68,252,84,148,120,87,148,117,233,124,47,174,91,213,117,123,247,238,29,29,155,199,242,130,230,73,178,138,109,11,173,140,95,63,239,89,183,163,138,149,5,155,153,23,142,27,213,59,142,41,207,204,241,216,163,236,60,36,244,108,122,88,207,64,71,198,143,140,127,140,235,214,165,141,89,167,254,80,68,235,45,177,154,74,37,234,250,59,35,226,243,247,245,229,234,40,111,43,171,119,174,85,171,94,238,118,187,79,172,235,106,166,212,113,113,86,217,138,136,200,140,39,172,125,50,75,196,222,94,175,119,206,234,66,130,7,92,171,213,90,88,170,87,22,84,212,117,86,173,214,242,145,118,187,247,180,42,163,151,85,62,162,209,244,72,140,6,218,57,186,227,45,19,143,214,206,61,247,220,13,113,223,165,212,117,99,49,200,142,111,216,38,103,160,51,226,253,183,223,254,213,255,59,217,110,56,60,113,83,85,154,17,51,213,99,70,231,136,165,79,70,236,26,253,125,81,234,71,119,58,189,39,101,214,51,101,37,63,103,68,93,127,115,51,138,174,148,241,151,201,228,12,244,174,147,173,235,55,233,106,102,137,63,141,92,73,35,84,74,76,239,244,111,4,224,148,158,22,89,70,185,140,179,241,207,85,75,25,249,163,131,133,185,63,222,230,28,247,46,45,157,248,205,45,126,183,92,34,223,150,81,158,185,186,253,164,110,183,123,105,51,169,192,125,81,90,229,119,51,235,47,100,86,143,136,168,191,189,68,121,118,172,61,153,46,241,109,245,176,124,162,215,235,253,221,83,85,4,60,181,220,24,106,146,249,137,229,122,247,75,111,187,237,224,29,141,189,63,57,51,61,251,218,44,177,58,217,148,127,111,215,174,61,63,16,17,31,138,136,40,165,172,91,237,159,89,111,120,244,187,133,117,55,25,217,90,89,162,95,175,228,103,88,109,81,118,94,24,165,90,23,172,179,211,62,156,85,15,219,1,244,190,125,251,30,121,242,196,240,177,107,219,165,196,150,65,241,11,11,11,199,218,237,222,103,215,98,129,179,148,217,211,121,205,197,197,67,95,186,228,194,75,246,46,77,229,207,101,93,189,122,237,131,158,141,71,57,147,183,181,203,203,203,231,197,250,88,236,7,204,234,7,248,139,51,211,51,207,43,173,234,205,145,173,75,203,68,127,39,101,150,209,192,186,170,234,185,230,202,226,225,176,122,121,68,188,115,237,232,213,212,56,47,27,29,91,202,105,125,33,69,108,253,223,111,113,113,241,174,78,123,252,159,171,212,229,111,173,253,60,24,12,22,122,189,222,157,75,75,241,99,173,42,94,31,217,186,96,101,73,119,25,255,125,19,75,80,50,235,71,196,230,14,110,149,234,168,100,220,54,122,187,178,122,72,220,57,3,60,212,101,196,245,165,84,111,30,76,228,52,222,216,46,255,203,90,104,223,102,90,187,91,127,182,188,52,190,232,213,117,233,70,196,105,93,175,38,19,17,172,228,129,62,246,218,40,229,151,86,119,181,151,79,230,75,34,226,126,85,79,108,13,135,75,117,107,98,68,81,181,126,230,182,197,117,131,231,136,136,186,191,56,247,142,118,123,246,170,18,177,242,132,52,203,43,99,117,0,93,157,87,221,19,39,198,41,175,74,41,91,86,42,92,111,215,5,171,15,243,87,143,27,222,181,242,239,188,163,177,32,113,199,107,130,74,150,189,163,12,36,25,131,157,30,119,54,61,108,67,56,142,31,31,15,164,34,34,170,58,143,108,215,190,52,30,31,84,81,30,187,93,219,173,244,122,189,139,150,118,213,159,136,146,175,62,157,227,207,134,153,233,217,87,101,169,62,26,25,247,249,177,82,191,223,95,140,18,163,10,81,37,242,237,157,233,217,63,104,183,123,175,47,114,175,122,0,0,17,51,73,68,65,84,153,105,207,254,106,85,150,255,50,26,31,160,82,150,127,251,116,251,89,74,217,52,87,115,172,12,133,155,55,32,163,79,238,129,3,7,118,45,159,204,255,184,154,64,254,130,13,71,222,7,25,177,101,74,157,204,56,217,216,250,70,60,250,3,248,155,164,249,61,250,249,181,69,251,25,229,95,68,99,241,120,21,165,154,44,8,178,217,57,74,41,147,131,202,117,166,166,166,214,135,35,52,158,180,222,95,119,222,249,229,175,45,44,206,95,179,174,42,95,85,182,46,109,189,67,195,214,112,221,152,38,35,62,183,205,123,177,92,74,126,160,177,125,197,165,151,94,186,59,34,226,150,91,110,57,18,141,247,52,51,30,191,195,30,172,139,183,30,135,116,148,102,242,128,199,111,87,58,188,161,202,24,231,211,206,18,167,157,151,251,129,244,176,157,129,62,239,120,185,247,120,227,1,71,93,173,31,80,111,80,229,133,107,99,159,44,185,33,84,96,39,150,150,242,117,37,98,92,27,190,228,31,150,140,27,35,170,126,150,122,121,101,87,28,24,47,88,56,187,122,23,245,122,203,37,155,119,193,119,100,196,111,151,146,243,17,113,247,218,206,204,242,198,18,91,5,245,15,95,31,209,122,229,104,179,196,115,74,228,115,38,39,176,75,198,79,247,7,27,203,125,110,165,174,235,170,42,141,16,142,109,114,129,70,108,158,222,238,246,219,239,124,94,172,44,212,92,243,197,18,241,233,204,184,37,170,60,177,114,222,234,49,37,242,87,54,59,62,26,55,152,213,118,49,113,85,86,163,113,115,121,248,222,148,2,60,16,38,242,64,31,92,24,140,23,159,207,180,103,103,214,22,182,103,228,11,58,157,222,175,46,44,28,218,24,114,153,89,141,158,48,214,43,241,185,91,57,122,244,232,249,235,67,1,203,61,219,52,31,233,116,122,223,94,50,126,124,109,123,215,158,234,213,107,149,246,54,118,167,252,249,232,42,146,249,180,136,77,150,25,222,7,131,193,96,208,110,207,222,190,118,109,46,25,55,111,127,68,89,183,192,242,200,145,35,143,136,149,235,124,70,201,63,88,203,20,82,74,121,78,52,178,139,109,115,190,43,214,126,202,136,67,11,253,254,225,136,136,186,142,155,170,198,213,114,120,178,252,253,136,248,195,13,135,55,116,58,157,39,70,142,39,219,170,220,144,33,229,65,233,97,59,128,62,120,247,193,35,157,246,236,189,177,186,200,160,100,30,136,136,223,221,172,109,167,211,57,55,178,60,107,188,39,183,136,149,222,86,171,68,252,84,99,251,131,11,11,243,47,155,108,180,154,209,227,65,97,121,170,254,238,230,132,105,70,249,158,201,18,154,171,37,57,71,197,78,38,6,146,165,100,245,170,237,190,1,74,196,205,117,228,191,93,88,156,255,224,25,235,248,78,101,92,213,216,250,202,137,147,71,159,49,89,44,101,122,186,251,220,178,179,76,162,0,156,109,85,253,238,168,171,215,198,218,196,73,230,191,137,136,231,110,104,87,74,35,46,33,46,223,110,189,81,43,246,60,53,27,225,8,85,85,239,104,6,180,148,97,157,89,141,174,243,203,71,151,223,18,17,155,14,160,75,52,75,190,156,145,176,205,44,43,3,211,151,70,68,68,85,158,176,109,227,204,153,50,190,124,223,187,176,176,48,190,73,168,203,239,71,89,189,94,102,62,99,122,122,246,41,219,229,130,158,158,222,215,141,28,54,39,167,62,20,171,55,3,143,122,212,55,253,249,145,123,255,250,112,172,166,183,173,75,253,138,56,197,0,186,100,245,162,230,56,98,106,185,124,102,187,246,15,22,15,243,217,178,50,74,196,157,81,94,54,61,61,253,152,205,219,181,254,113,52,87,243,14,115,50,111,225,248,147,213,204,219,210,208,110,183,215,61,166,200,200,79,78,182,185,232,162,253,143,45,17,63,182,131,142,63,32,74,150,11,27,155,95,219,172,254,252,112,41,127,180,185,221,200,76,81,218,237,217,55,102,148,159,109,156,240,159,69,41,87,68,137,151,148,172,175,138,50,188,172,63,152,123,226,96,48,255,129,56,59,85,23,59,227,31,203,103,54,169,52,88,85,165,188,230,1,237,17,0,167,173,223,239,47,70,150,119,54,118,125,127,119,186,123,170,236,71,221,165,165,113,82,129,9,83,25,195,102,161,147,175,29,63,126,252,75,59,236,206,186,88,221,186,138,31,218,170,97,70,92,217,216,188,49,206,192,53,177,100,25,215,168,200,124,198,197,23,207,62,117,179,118,251,247,239,223,83,162,188,98,220,151,252,72,243,245,235,152,90,55,192,173,74,252,242,54,249,176,167,170,106,248,139,177,238,201,111,249,207,107,63,221,116,211,77,39,75,196,175,143,126,19,241,195,157,78,239,57,91,253,13,23,95,60,251,212,117,227,136,136,223,187,63,165,213,31,72,15,235,1,116,149,117,115,214,179,93,85,83,239,235,93,212,107,166,94,171,102,166,123,87,101,198,219,198,187,202,23,250,135,251,235,6,208,85,52,210,186,148,242,184,216,100,230,126,48,24,220,27,141,59,207,82,202,183,238,223,191,127,207,218,246,37,23,94,178,119,170,58,249,193,104,230,137,62,203,38,227,140,186,23,173,79,175,211,110,119,95,150,17,175,111,238,91,155,129,238,118,187,143,42,17,205,47,157,136,136,127,24,145,47,205,140,191,83,151,214,116,169,203,37,211,211,179,79,238,118,187,247,43,254,248,116,149,40,141,39,9,249,45,157,78,103,244,24,111,255,254,253,123,102,218,179,111,141,136,239,58,11,93,3,224,52,149,214,240,218,104,196,237,214,227,5,122,77,235,6,168,37,242,218,78,103,246,249,209,120,138,250,152,199,60,254,252,153,118,247,93,81,70,25,56,34,50,223,189,201,100,203,166,250,253,254,225,200,28,47,26,44,229,151,58,157,238,213,251,246,237,123,100,179,221,204,116,239,69,205,112,194,146,113,159,42,214,30,56,112,96,215,204,116,239,133,157,118,239,29,157,206,236,139,215,198,22,187,206,169,62,30,17,163,188,205,173,42,126,179,221,158,189,162,249,55,118,58,157,246,241,99,75,239,141,136,113,38,147,140,223,104,156,62,22,23,191,218,143,140,159,105,236,250,190,204,169,235,215,10,203,173,153,158,238,61,161,221,238,190,55,50,154,97,155,191,54,24,28,250,239,205,118,195,92,122,123,70,99,124,145,249,241,201,247,165,211,233,156,219,233,204,62,191,85,197,186,50,223,85,43,215,141,57,30,204,30,182,33,28,17,17,243,139,243,159,235,76,247,254,93,148,92,249,31,99,165,36,245,247,118,166,103,127,175,148,178,92,71,238,203,200,203,27,15,240,143,150,106,248,202,136,24,54,207,147,37,14,53,62,138,251,59,157,222,167,34,243,80,68,68,70,249,139,193,224,208,59,34,98,57,178,188,127,180,128,48,227,117,199,143,159,252,219,157,206,236,199,162,46,223,186,84,234,23,71,148,13,131,231,77,242,29,63,128,134,159,105,100,139,57,191,110,149,207,116,166,187,111,141,42,142,71,150,127,20,17,87,76,30,177,54,3,61,63,63,255,255,58,157,217,183,70,198,235,70,191,92,139,161,90,217,136,44,85,84,17,81,15,75,116,58,179,239,58,231,232,174,159,63,120,247,193,109,23,115,158,81,25,31,143,18,107,143,215,158,21,217,250,228,76,187,247,222,136,124,244,241,99,75,47,141,216,152,116,126,50,53,31,0,15,46,253,126,127,177,211,153,125,71,100,252,244,234,174,43,219,237,217,239,26,12,230,62,181,205,97,187,34,227,119,58,237,217,207,68,196,234,228,202,241,103,103,148,113,217,233,136,219,119,47,183,222,113,31,186,146,89,202,53,101,101,34,102,37,136,58,203,123,78,158,24,190,167,211,158,253,163,18,101,16,145,143,203,200,239,104,28,243,149,172,134,31,190,15,175,17,183,221,118,199,15,148,82,174,95,235,228,137,99,203,187,34,226,186,91,110,185,229,222,153,233,222,191,206,146,107,41,250,30,95,34,62,213,110,247,254,107,21,113,56,35,171,213,80,198,113,189,135,140,247,45,46,206,255,209,228,107,156,88,58,250,31,206,217,125,222,43,114,181,146,96,137,124,94,41,241,188,78,123,118,62,34,254,44,34,158,28,145,251,39,150,3,221,83,74,61,89,1,56,22,23,23,239,108,183,123,255,42,34,175,27,191,110,121,207,201,19,195,119,119,166,187,55,148,82,221,155,153,87,70,196,121,235,14,44,229,13,243,243,115,167,157,173,235,129,246,176,30,64,71,68,76,237,142,95,92,94,142,71,71,198,63,93,221,117,78,148,248,39,25,27,86,165,221,147,17,63,184,208,239,255,239,201,115,84,85,126,186,30,150,81,76,79,100,62,35,34,158,17,17,81,74,142,239,130,163,245,214,18,203,207,43,17,43,179,220,43,3,202,171,214,101,19,46,113,107,100,92,50,58,166,174,207,90,0,238,194,194,194,193,153,246,236,47,100,196,27,87,119,61,54,74,121,203,134,33,228,68,159,87,229,112,88,189,171,85,213,47,142,216,65,210,243,140,159,56,118,238,201,71,68,196,43,78,217,246,12,217,115,222,212,71,142,31,91,250,88,172,85,42,140,120,74,70,254,251,137,102,119,197,202,147,152,11,34,78,185,88,17,128,7,129,225,176,122,119,171,170,95,19,107,3,215,136,107,34,226,211,113,234,208,136,103,109,177,255,222,42,171,151,221,215,240,129,193,96,238,134,153,233,222,15,101,201,235,99,253,130,246,43,115,99,87,230,75,85,63,191,223,95,184,123,242,23,219,41,25,189,230,149,41,203,248,122,220,95,60,244,225,153,246,236,190,140,248,229,81,251,200,239,222,244,77,40,249,209,221,123,166,94,23,155,188,71,119,220,113,199,215,187,221,238,247,231,176,186,62,34,155,197,228,186,177,190,20,250,74,31,34,14,85,85,253,130,126,191,191,105,177,148,193,224,208,7,58,157,238,163,34,75,243,134,100,87,148,242,204,77,222,151,136,44,215,78,237,138,55,111,118,174,7,171,135,114,8,199,142,102,10,15,29,58,116,124,97,97,238,234,40,113,117,137,45,86,169,102,252,70,157,229,233,91,221,189,206,207,207,223,83,234,250,133,205,90,237,155,89,92,252,106,127,170,142,239,139,136,175,108,218,160,196,135,91,173,104,222,137,70,230,55,42,237,217,134,42,212,155,234,15,230,126,165,249,193,155,112,87,70,62,55,51,70,9,232,171,198,255,51,83,85,190,33,214,6,207,165,124,54,35,158,158,145,47,95,77,55,244,47,35,227,125,17,113,120,212,163,40,63,50,123,241,236,168,26,225,209,178,245,236,251,74,114,247,29,91,218,108,231,193,131,7,79,236,222,211,122,73,148,252,232,22,199,125,177,26,230,51,35,202,40,59,200,212,250,219,235,157,246,193,172,53,192,25,82,71,105,36,24,222,252,251,245,240,225,91,231,50,226,218,113,179,184,188,211,233,125,239,166,39,44,229,154,213,138,195,155,229,23,94,138,44,215,214,217,186,172,191,120,235,182,139,221,182,210,95,60,244,209,86,29,79,45,81,182,75,213,122,67,148,225,149,253,77,38,233,214,108,168,126,187,170,202,88,55,99,92,215,245,186,126,246,7,115,111,202,200,231,110,53,70,201,136,219,163,148,159,61,231,156,221,47,220,42,75,72,68,196,252,252,252,45,231,28,155,122,118,148,252,201,104,132,134,76,56,154,17,111,170,170,250,59,250,253,254,23,182,58,87,68,228,194,194,252,59,51,202,63,40,81,126,107,235,86,249,223,74,214,87,45,44,30,122,205,217,42,42,119,186,30,178,51,208,85,93,127,178,174,86,62,12,153,113,170,148,51,185,90,86,251,186,238,197,221,39,101,169,102,234,82,159,223,202,184,109,57,118,125,105,235,10,133,99,253,195,253,207,70,196,101,211,211,151,236,175,170,250,137,227,60,145,213,186,99,231,14,207,221,220,233,116,158,28,209,186,34,34,219,171,253,59,49,85,151,47,204,29,158,251,82,167,211,57,39,74,53,42,29,94,162,28,29,117,50,242,186,136,234,63,173,254,98,219,196,240,167,82,202,240,175,50,202,166,175,51,161,30,12,230,126,97,122,250,146,15,181,34,159,158,85,61,181,114,124,53,127,236,216,158,63,189,243,206,47,127,173,221,158,189,43,74,206,69,68,12,235,149,98,40,171,133,106,198,69,82,178,190,102,48,152,191,33,34,110,104,158,124,239,222,199,93,184,107,106,121,116,71,63,108,197,83,98,116,35,243,245,191,142,178,103,212,199,93,203,213,168,228,104,41,229,104,196,184,196,122,41,245,95,109,253,199,198,143,175,229,95,46,195,92,247,190,173,126,89,60,191,211,233,125,91,68,125,217,234,1,25,81,254,215,222,189,143,254,139,27,111,188,113,169,211,153,125,75,68,174,148,33,93,30,15,166,135,25,159,170,170,149,252,224,117,110,190,178,122,165,111,121,67,70,172,246,117,203,247,25,128,29,104,101,126,164,174,214,138,103,173,79,191,214,84,202,240,237,17,213,151,155,187,54,253,185,174,115,97,113,254,189,17,241,235,23,95,60,123,89,171,21,151,68,196,158,136,178,184,188,60,245,127,38,42,247,157,150,185,195,115,55,71,196,11,186,221,238,5,203,203,113,105,43,170,153,172,234,243,87,250,217,250,114,191,127,235,231,162,153,144,96,19,85,198,175,101,149,31,91,233,242,184,4,247,252,225,249,27,187,211,221,239,169,171,232,69,148,193,226,96,254,79,38,143,29,12,230,63,118,224,192,129,79,220,126,251,157,207,142,200,78,196,218,216,168,90,200,60,249,63,7,131,197,29,93,155,14,222,125,240,72,220,29,215,78,79,79,191,175,148,221,151,85,57,188,48,74,235,155,179,228,145,50,172,239,24,150,225,205,139,139,139,119,238,244,125,89,141,143,126,97,167,211,249,249,204,106,182,202,234,177,43,227,140,234,206,204,184,109,176,56,247,63,226,33,58,9,229,113,53,167,101,122,186,247,132,170,228,120,70,191,12,191,101,97,97,97,179,65,110,233,116,102,191,58,10,1,41,113,245,234,205,12,0,124,67,116,166,187,127,60,90,28,88,202,53,11,11,135,54,91,104,8,167,237,161,28,194,193,89,52,53,181,62,79,102,201,214,15,111,214,174,221,238,253,243,102,252,116,41,213,230,225,45,0,0,15,17,15,217,16,14,206,174,249,249,249,123,102,218,221,247,103,148,151,71,68,100,196,27,58,237,217,43,50,202,239,151,146,95,139,200,82,178,186,60,35,155,197,100,62,223,239,223,58,153,99,27,0,224,33,197,0,154,211,87,229,207,69,93,93,218,88,177,123,69,137,188,98,37,154,169,68,115,165,109,137,184,185,90,142,23,69,196,242,89,232,41,0,192,25,35,132,131,211,214,239,247,23,163,44,63,39,35,222,20,91,151,38,61,30,81,222,51,204,165,103,206,221,62,119,235,22,109,0,224,204,41,101,219,5,123,112,127,89,68,200,25,177,111,223,190,71,158,56,49,188,188,148,156,94,217,83,238,138,168,22,78,156,248,250,77,59,173,234,4,0,103,66,187,221,253,193,82,86,242,251,87,117,220,60,191,56,255,185,179,221,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,191,177,254,63,178,22,39,115,195,2,35,4,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":37723,"duration_micros":1215,"top":1214.0,"left":32.66666793823242,"width":654.6666259765625,"height":115.3333740234375,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,105,112,156,245,125,7,240,223,179,135,180,58,44,203,178,44,217,150,111,91,54,216,14,224,67,96,108,48,193,6,226,48,37,41,201,100,154,163,45,148,210,9,137,83,18,142,169,135,116,50,165,47,194,148,134,92,164,33,201,36,37,97,166,78,105,211,54,109,50,184,132,22,104,72,24,174,0,129,144,128,57,132,49,248,192,54,198,135,44,219,58,118,251,2,177,88,177,101,240,129,87,43,125,62,51,26,237,179,251,60,207,126,119,87,47,190,207,95,255,231,217,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,164,164,212,1,6,153,228,128,223,222,27,0,96,184,43,244,253,196,1,191,135,189,225,94,18,83,203,190,243,247,83,43,114,181,103,166,42,43,79,73,82,201,172,72,82,147,34,73,198,38,73,50,50,34,114,225,61,2,0,134,159,66,68,236,43,20,10,59,163,80,216,28,133,252,250,66,190,176,54,191,127,255,147,93,251,58,30,184,231,147,127,245,98,68,228,75,29,178,84,134,99,57,76,45,191,245,230,101,21,213,53,31,72,167,51,23,68,42,153,85,234,64,0,0,101,37,95,88,219,219,219,115,87,87,231,158,159,220,125,217,149,247,196,48,43,211,195,166,64,47,184,254,154,198,49,173,179,174,200,84,84,254,177,210,12,0,112,156,228,11,107,123,186,246,255,211,214,231,214,126,251,209,235,191,188,173,212,113,78,132,33,95,160,23,92,127,77,99,211,172,147,87,165,43,42,86,70,68,85,169,243,0,0,12,81,123,123,187,186,190,185,101,237,211,55,14,245,34,61,148,11,116,122,197,109,223,185,58,83,147,251,124,36,73,125,169,195,0,0,12,11,133,194,142,158,61,251,110,184,243,146,79,126,37,34,122,75,29,231,221,48,36,11,244,242,111,222,212,86,217,56,250,166,84,38,189,180,212,89,0,0,134,163,124,79,239,125,251,183,189,118,237,221,43,175,125,164,212,89,142,183,161,86,160,83,23,220,246,237,149,21,181,213,95,143,161,247,218,0,0,202,77,161,171,163,243,179,119,93,114,197,55,99,8,157,104,56,148,74,102,250,253,255,252,189,175,165,43,42,62,83,234,32,0,0,188,165,183,171,235,31,254,251,99,151,127,46,134,200,148,142,161,82,160,179,23,222,126,235,234,84,54,243,145,82,7,1,0,224,96,249,238,158,31,173,249,232,101,159,136,136,238,82,103,57,86,67,161,64,103,47,252,151,91,255,61,149,201,92,84,234,32,0,0,12,44,223,211,243,211,53,127,116,217,135,163,204,75,116,170,212,1,142,81,230,194,219,111,93,173,60,3,0,12,126,169,76,230,162,11,111,191,117,117,68,100,74,157,229,88,148,115,129,78,175,88,253,221,175,153,182,1,0,80,62,82,217,204,71,86,172,254,238,215,34,34,93,234,44,71,171,92,11,116,114,193,15,190,181,50,147,171,92,89,234,32,0,0,28,153,76,174,114,229,5,63,248,214,202,40,211,233,196,229,24,58,89,118,243,141,109,213,45,227,30,140,242,204,15,0,64,68,161,115,195,166,69,247,92,185,234,145,136,40,148,58,204,145,40,199,17,232,76,174,105,204,77,161,60,3,0,148,179,164,175,211,149,221,124,232,114,43,208,169,247,125,255,150,171,83,217,204,217,165,14,2,0,192,177,73,101,51,103,191,239,251,183,92,29,101,214,73,203,105,242,118,50,247,179,151,55,141,110,157,113,123,36,73,174,212,97,0,0,56,118,233,138,236,194,138,113,141,223,223,242,208,99,157,165,206,242,78,149,83,219,79,77,88,216,182,42,146,164,190,212,65,0,0,56,78,146,164,126,194,194,182,85,81,70,189,180,92,130,38,179,63,125,233,152,116,85,238,83,165,14,2,0,192,241,149,174,202,125,106,246,167,47,29,19,101,114,142,91,185,20,232,212,132,182,182,43,18,83,55,0,0,134,156,36,73,114,19,218,218,174,136,50,233,166,229,16,50,137,136,76,182,166,250,227,165,14,2,0,192,187,163,175,235,101,162,12,70,161,203,162,64,47,253,250,13,203,147,116,186,181,212,65,0,0,120,119,36,233,116,235,210,175,223,176,60,20,232,227,34,85,53,170,225,162,82,135,0,0,224,221,213,215,249,6,125,63,29,236,1,147,136,200,102,114,149,203,75,29,4,0,128,119,87,95,231,203,198,32,31,133,30,244,5,186,237,11,87,77,51,125,3,0,96,232,75,210,233,214,182,47,92,53,45,20,232,99,146,26,209,60,238,204,82,135,0,0,224,196,232,235,126,131,186,163,14,230,112,73,68,36,217,17,35,230,150,58,8,0,0,39,70,95,247,75,98,16,143,66,15,230,2,29,17,145,78,101,210,51,75,29,2,0,128,19,163,175,251,165,75,157,227,112,6,115,129,78,34,34,149,164,211,19,75,29,4,0,128,19,163,175,251,165,194,8,244,81,73,34,34,29,233,116,83,169,131,0,0,112,130,188,209,253,210,161,64,31,181,84,146,36,117,165,14,1,0,192,137,209,215,253,6,117,71,29,204,225,146,136,72,146,36,169,44,117,16,0,0,78,140,190,238,231,36,194,99,48,168,223,60,0,0,142,187,65,223,255,202,161,64,3,0,48,188,12,234,14,56,216,11,52,0,0,12,42,10,52,0,0,28,1,5,26,0,0,142,64,166,212,1,0,120,119,92,220,58,59,46,123,207,130,136,136,216,177,127,95,252,201,29,63,42,113,34,128,161,65,129,134,33,230,139,103,159,31,167,140,25,59,224,227,133,136,232,236,238,142,221,93,251,227,217,237,219,226,158,245,237,241,232,171,27,78,92,192,97,96,197,212,153,177,104,252,132,152,92,55,42,70,84,84,68,42,73,98,119,87,87,108,236,216,21,15,111,122,37,214,180,63,27,251,123,123,74,29,19,128,163,164,64,195,48,147,68,68,77,54,27,53,217,108,140,173,169,141,179,39,76,142,123,95,126,49,190,241,216,3,209,147,207,151,58,94,89,155,58,114,84,252,229,252,51,163,117,212,232,131,30,107,200,85,69,67,174,42,230,54,54,199,251,166,180,198,45,191,126,40,158,220,186,185,4,41,1,56,86,10,52,12,97,219,247,237,141,173,157,123,250,221,151,74,146,24,149,203,197,232,170,154,55,191,173,40,150,77,154,22,61,249,124,124,227,177,7,74,19,116,8,24,83,93,19,215,45,58,39,198,213,140,40,222,215,91,40,196,235,251,246,70,18,17,245,185,170,72,39,111,92,149,169,101,68,93,172,58,99,105,92,127,255,221,241,220,235,175,149,40,49,0,71,75,129,134,33,236,137,45,155,226,43,191,186,255,144,143,205,107,30,31,159,58,245,244,24,87,251,70,225,59,111,242,244,184,163,125,109,180,239,216,126,34,35,14,25,31,59,233,148,126,229,249,255,94,126,49,126,248,187,39,98,211,158,221,17,241,70,105,254,248,201,167,198,210,9,83,34,34,162,174,162,50,46,123,207,130,184,238,190,187,74,146,23,128,163,231,42,28,48,76,61,254,234,198,248,187,135,238,139,174,222,222,136,120,99,100,122,217,164,105,37,78,85,190,22,141,159,88,188,253,232,171,27,226,203,143,252,178,88,158,35,34,54,236,222,21,95,122,248,23,241,224,198,151,139,247,205,105,108,62,228,116,15,0,6,55,5,26,134,177,246,157,219,227,133,29,111,77,33,104,170,174,41,97,154,242,213,84,93,27,35,42,42,139,203,15,109,124,101,192,117,255,235,249,167,139,183,147,136,152,94,175,64,3,148,27,83,56,96,152,219,211,221,93,188,157,78,14,127,76,189,116,194,148,88,58,113,74,76,175,111,136,186,138,92,68,68,236,234,218,31,47,239,218,17,191,220,240,82,220,181,238,249,131,182,249,155,197,203,98,225,216,150,136,136,216,210,217,17,127,126,231,143,223,54,211,229,167,44,140,15,206,56,185,184,255,203,239,252,113,236,237,121,43,103,69,58,29,23,77,63,41,22,52,183,196,164,186,145,81,147,173,136,174,222,222,216,213,119,101,145,255,93,255,66,60,254,234,198,1,247,255,143,43,46,142,166,234,218,136,136,248,236,221,119,68,251,206,237,209,144,171,138,15,204,56,57,230,53,143,139,113,53,35,226,174,117,207,199,247,158,252,213,219,102,141,136,24,89,89,217,111,57,95,40,12,184,238,51,219,183,198,119,159,124,164,184,124,224,1,204,161,156,60,186,41,222,63,181,53,78,106,24,19,163,171,170,35,147,74,69,103,79,119,108,236,216,21,143,108,222,16,63,125,254,233,126,159,225,145,186,184,117,118,252,217,123,22,20,191,51,247,222,245,237,3,78,251,57,169,97,76,172,152,218,26,39,141,30,19,13,185,170,200,166,210,209,209,221,21,91,58,59,138,87,23,217,221,181,255,144,219,94,119,198,57,177,184,101,82,68,68,220,246,219,199,227,223,214,62,21,153,84,42,46,156,54,51,22,143,159,28,147,234,70,198,203,187,119,198,170,159,255,236,160,109,143,229,243,158,56,98,100,220,114,254,7,34,34,98,107,231,158,184,236,206,255,136,136,136,243,167,204,136,243,38,79,143,150,218,186,168,201,86,68,71,119,87,188,178,123,103,220,179,190,61,254,231,16,127,199,191,175,190,50,23,31,108,157,29,11,154,199,71,99,85,117,84,103,43,162,179,187,171,223,129,212,129,122,242,249,184,248,63,87,191,237,126,129,242,160,64,195,48,215,120,192,168,243,246,125,157,135,92,103,116,85,117,92,189,112,201,33,47,143,215,88,85,29,141,85,213,49,175,121,124,44,157,48,53,190,250,232,253,241,218,222,183,246,179,166,253,217,98,129,110,170,174,141,115,39,77,139,123,215,183,15,152,39,147,74,197,217,125,243,132,35,34,238,223,240,82,191,242,60,183,177,57,174,156,127,102,113,238,246,129,219,85,247,93,89,228,172,9,147,99,77,251,179,241,157,39,30,126,155,87,31,209,80,85,21,163,114,227,227,202,5,139,163,33,87,85,188,63,149,36,135,217,170,191,141,29,187,162,59,223,27,217,84,58,34,34,206,24,63,49,126,182,238,185,67,174,219,147,207,199,79,158,127,230,29,237,247,210,185,243,227,15,91,103,23,79,62,124,83,109,182,34,102,142,106,140,153,163,26,99,217,196,105,241,229,95,253,50,214,110,223,246,142,243,190,105,233,196,41,241,167,115,230,21,203,243,175,183,108,138,155,7,56,145,244,211,243,206,136,243,39,207,136,76,170,255,65,86,125,101,46,234,43,115,49,115,84,99,44,159,52,61,110,126,236,129,120,106,219,171,135,125,222,186,138,202,104,174,169,141,85,167,47,237,55,133,229,80,7,112,199,243,243,206,101,50,81,153,206,196,231,22,46,142,179,90,38,31,242,117,204,109,108,142,211,154,198,197,151,30,254,197,128,251,153,215,60,62,174,156,191,40,26,171,250,255,199,102,160,242,12,12,61,166,112,192,48,118,238,164,105,49,185,174,190,184,124,255,134,245,7,173,83,153,206,196,245,75,150,247,43,207,221,249,222,216,210,217,17,155,247,116,68,119,190,183,120,255,169,77,99,227,115,11,22,247,219,254,145,205,175,196,186,157,175,23,151,207,159,60,227,176,153,206,155,60,163,88,100,123,242,249,184,227,133,181,197,199,102,53,52,198,95,159,249,222,126,101,106,111,79,119,108,236,216,29,91,59,247,196,155,227,190,169,36,137,63,152,62,43,62,49,251,212,195,62,87,196,27,151,158,187,246,244,179,251,149,231,35,181,167,187,59,126,187,109,75,113,185,109,108,75,92,119,198,57,209,82,91,119,212,251,188,122,225,146,248,240,204,57,197,242,156,47,20,98,75,103,71,172,219,249,122,236,58,96,148,119,92,237,136,248,219,37,231,29,241,92,234,83,198,140,141,149,167,45,42,22,226,246,29,219,227,198,135,238,59,228,165,12,175,90,184,36,222,63,117,102,113,221,66,161,16,219,247,237,141,13,29,187,250,141,126,143,171,29,17,215,180,157,21,163,171,170,15,251,220,117,21,149,241,249,51,206,121,219,204,199,251,243,174,76,103,226,47,78,93,88,44,207,61,249,124,236,216,191,239,160,107,114,47,157,48,101,192,125,181,212,214,197,213,11,151,20,203,115,161,80,136,141,29,187,99,237,246,109,177,169,99,247,65,235,63,251,250,182,120,106,219,171,111,123,80,1,148,23,35,208,48,204,212,87,230,98,106,125,67,44,105,153,20,231,78,156,86,28,125,124,104,211,43,241,235,45,155,14,90,255,163,39,159,18,83,250,74,118,33,34,238,124,241,217,248,215,103,126,19,219,250,70,153,71,87,85,199,165,115,231,199,123,39,78,141,136,136,211,154,198,29,52,202,124,207,250,246,226,55,226,205,105,108,138,105,245,13,3,94,237,99,249,228,183,78,100,124,98,235,230,120,105,215,142,226,242,37,115,230,71,109,182,34,34,34,246,245,244,196,234,167,159,136,53,237,107,139,39,66,78,171,111,136,207,204,91,84,44,102,31,106,157,19,119,190,248,92,191,17,241,223,247,161,153,115,162,54,91,17,133,136,120,105,231,235,177,165,115,79,236,220,191,47,158,121,109,235,128,219,28,202,109,79,61,30,211,207,106,40,142,66,46,110,153,20,11,199,182,196,111,182,109,142,7,55,190,28,191,120,101,221,59,158,106,177,98,234,204,120,239,1,39,116,62,176,113,125,252,240,119,79,196,186,3,222,139,115,39,77,139,75,230,204,139,209,85,213,81,147,205,198,149,243,207,140,171,238,93,243,142,174,229,61,177,110,100,92,211,118,86,84,103,179,17,17,177,105,207,238,248,226,131,63,143,142,238,174,131,214,93,208,220,18,231,254,127,123,119,30,29,231,89,159,125,252,154,125,180,75,150,44,89,146,181,218,242,110,199,242,38,219,241,18,7,103,5,74,57,44,13,156,19,82,74,232,18,218,151,243,54,180,41,80,202,91,160,133,150,82,150,227,134,150,166,16,90,154,132,166,64,67,210,56,16,226,196,187,29,239,155,228,85,150,44,107,151,108,109,35,89,26,205,204,251,199,204,60,51,35,207,200,138,35,75,51,210,247,115,206,156,140,102,30,141,110,205,163,28,95,115,63,191,251,119,7,206,173,36,157,108,111,209,179,167,143,26,237,247,236,22,139,62,48,119,161,62,190,240,46,89,205,102,229,36,37,235,99,11,151,105,219,209,3,49,127,126,85,65,145,113,30,219,250,251,212,212,215,171,206,129,126,53,246,245,68,28,55,222,231,219,110,177,232,190,146,185,26,242,120,244,179,243,103,244,203,139,53,234,115,15,201,110,177,232,193,178,10,61,186,168,82,78,171,255,159,197,247,207,89,168,159,159,175,142,184,250,33,73,191,93,177,72,153,14,167,49,246,239,30,217,31,209,207,123,101,94,161,254,239,170,245,202,8,28,115,186,189,85,63,58,125,52,230,123,1,32,49,17,160,129,41,108,75,113,185,182,140,161,179,198,193,230,6,125,231,240,190,168,207,173,14,148,95,72,210,190,198,122,61,125,236,96,196,243,157,3,253,250,214,161,61,42,78,207,80,121,198,12,73,210,221,133,37,17,1,250,213,218,243,250,208,188,197,202,112,56,101,54,153,244,222,242,249,81,123,78,47,204,206,213,252,25,51,141,175,127,117,57,84,6,145,233,112,106,81,78,174,241,245,79,170,143,71,44,200,147,2,179,168,111,239,210,182,247,188,95,78,171,85,118,139,69,91,138,203,245,223,231,78,199,252,221,83,109,118,181,247,187,244,221,163,251,116,162,237,246,55,54,185,216,213,169,191,222,183,67,159,169,92,171,178,140,44,73,254,192,182,50,175,80,43,243,10,245,169,165,171,116,178,189,69,59,27,46,107,215,213,186,81,95,235,163,243,151,24,31,108,118,92,169,213,183,163,212,36,191,121,165,86,245,221,93,250,250,166,251,149,108,179,169,52,35,75,155,139,202,244,70,253,165,81,95,59,211,225,212,231,171,54,27,51,238,221,131,55,244,141,131,187,212,214,223,23,245,248,141,179,75,100,10,204,130,55,187,122,245,215,251,118,24,1,86,146,134,60,30,189,120,238,180,242,82,82,245,64,105,133,36,127,136,28,77,106,160,134,249,223,78,29,209,171,181,231,162,30,115,167,206,183,201,100,210,247,142,238,215,206,134,203,17,191,195,47,47,158,149,219,227,213,19,149,85,146,252,155,13,109,152,93,114,83,61,244,226,236,208,152,158,61,125,236,166,205,112,142,180,54,234,191,206,157,210,167,151,173,150,36,45,29,101,87,80,0,137,139,0,13,76,115,175,93,190,160,103,78,30,142,185,181,244,207,206,159,49,46,221,143,54,43,123,180,181,217,8,208,5,35,234,85,7,61,195,218,211,88,175,247,150,207,151,36,173,43,40,210,15,79,29,190,105,70,246,225,242,121,70,112,108,232,233,214,254,166,80,73,137,197,108,214,63,29,11,205,106,238,106,136,30,66,91,93,125,186,112,189,83,75,103,230,73,146,138,211,50,98,142,89,242,111,118,242,143,135,247,142,203,37,246,115,215,58,244,127,222,120,69,15,149,205,211,189,37,229,170,200,202,49,74,48,156,86,171,214,228,207,214,154,252,217,250,200,130,165,122,190,250,132,246,53,221,92,50,179,174,160,88,51,3,117,233,46,183,91,63,24,165,174,183,182,251,154,14,52,55,24,237,7,55,20,150,140,26,160,237,22,139,62,191,118,179,138,2,239,201,141,225,97,125,235,240,222,81,123,127,239,190,90,175,51,157,254,242,148,22,87,111,68,120,14,183,183,241,138,17,160,115,146,146,149,225,112,170,123,240,70,204,215,253,175,115,167,98,134,103,233,206,157,239,19,109,205,17,225,57,220,246,203,231,245,200,194,101,198,135,139,224,223,115,184,180,176,5,163,53,157,109,55,61,47,73,181,93,161,146,165,145,11,76,1,76,13,4,104,96,10,107,232,233,214,197,17,93,30,204,38,147,210,237,14,205,201,202,86,186,221,161,7,203,42,180,106,86,129,190,123,100,127,212,18,142,240,153,228,36,171,77,27,10,75,148,157,148,172,52,187,35,98,161,93,81,88,112,73,143,178,152,234,229,75,103,117,127,233,92,217,204,22,165,217,29,122,160,108,158,126,126,254,140,241,124,134,195,169,53,179,102,27,95,239,104,136,92,104,216,57,208,31,49,27,152,147,148,172,13,185,37,202,116,56,149,108,179,43,124,153,93,138,221,22,26,75,224,82,122,44,103,59,219,199,189,62,117,251,229,243,218,126,249,188,10,83,211,181,185,168,76,43,242,10,84,145,149,109,188,95,165,233,153,250,243,170,77,122,225,236,73,189,80,115,50,226,123,239,202,13,205,88,90,205,38,221,31,8,165,177,216,194,22,245,229,165,164,142,122,236,159,174,186,91,139,2,51,168,195,94,175,182,29,59,48,106,183,18,201,63,163,26,110,121,110,190,102,167,165,43,205,238,48,22,77,74,254,250,226,112,5,169,233,49,3,180,203,237,214,47,46,84,143,250,115,239,212,249,62,212,18,187,197,160,228,239,215,29,12,208,209,254,142,123,135,6,141,18,142,138,172,28,117,12,220,252,33,40,124,93,65,247,96,244,174,36,0,18,27,1,26,152,194,46,118,117,198,108,73,150,100,181,233,147,75,87,232,161,178,121,202,73,74,209,83,85,155,244,133,93,191,214,229,176,5,127,65,133,105,233,122,116,209,114,173,204,43,52,106,68,71,99,49,223,188,62,185,177,183,71,199,219,154,181,58,16,146,183,20,149,69,4,232,135,202,231,25,53,185,125,238,33,109,143,49,59,89,153,87,160,143,45,88,170,121,51,102,222,212,157,34,26,91,148,177,132,139,246,251,142,151,198,190,30,61,87,115,66,207,213,156,80,81,122,134,62,56,119,145,182,20,151,203,106,54,203,98,50,233,145,5,203,212,208,211,173,189,141,245,198,247,100,57,66,139,25,29,22,171,81,59,62,22,209,2,95,80,166,195,169,187,195,58,79,252,244,236,169,152,51,177,35,165,216,108,250,157,5,203,116,111,113,185,81,219,123,43,118,75,236,247,189,177,175,59,230,76,246,72,227,125,190,155,251,162,151,170,4,245,135,213,60,71,251,91,175,238,108,51,62,44,62,182,164,82,237,253,174,136,15,169,11,179,115,245,145,249,75,140,175,207,176,120,16,152,146,8,208,192,52,53,48,236,214,211,199,14,106,134,51,89,85,249,179,149,106,179,235,209,197,149,250,202,190,29,17,199,45,204,206,213,23,215,110,30,115,112,26,205,171,181,231,141,0,93,154,145,165,149,121,5,58,18,152,1,189,103,118,104,161,218,222,198,250,168,11,238,30,42,155,167,63,88,190,102,76,65,106,172,250,220,19,51,67,216,208,211,173,239,29,221,175,67,45,141,250,220,234,13,178,91,44,178,4,186,71,132,7,232,84,187,253,182,127,70,236,238,211,254,206,41,253,110,183,113,30,43,243,242,245,243,11,103,110,25,100,51,28,78,125,121,253,189,227,186,99,98,255,24,23,83,222,137,243,29,171,79,117,72,232,93,140,246,99,95,186,80,163,117,5,197,74,183,59,84,152,154,174,111,222,243,160,174,244,118,169,119,112,72,25,14,135,138,211,51,141,192,217,110,11,0,0,18,75,73,68,65,84,43,13,215,110,12,232,151,151,198,214,178,16,64,98,33,64,3,211,220,91,13,181,170,202,247,135,218,229,185,179,148,100,181,69,116,30,120,162,178,202,8,93,55,134,135,245,106,237,57,237,111,106,208,213,222,238,136,174,13,143,45,174,212,135,195,102,222,162,57,220,210,168,203,221,215,141,69,118,15,148,85,232,72,107,147,54,20,150,168,48,205,223,242,205,227,243,69,180,174,11,202,79,77,211,227,203,86,25,97,170,99,192,165,151,46,158,213,177,214,38,181,184,250,34,106,184,255,102,227,125,81,123,86,71,227,25,101,211,147,177,42,73,207,148,221,226,47,103,232,25,26,84,171,43,246,44,231,254,166,43,218,125,181,78,239,41,153,35,73,154,147,25,89,103,27,30,46,223,168,191,164,239,28,137,190,184,243,157,114,185,221,250,167,99,7,244,212,154,77,178,154,205,90,148,157,171,63,174,92,27,243,10,69,208,239,46,89,97,132,103,159,164,221,87,235,180,163,190,86,117,61,215,35,186,93,44,207,205,215,87,55,108,29,211,88,60,190,91,119,10,185,83,231,251,221,106,232,237,214,47,46,84,235,177,197,149,146,252,253,168,163,213,74,119,12,184,244,237,195,251,212,222,239,154,144,113,1,152,88,4,104,96,154,11,255,7,222,102,182,168,56,61,195,216,148,99,69,94,129,209,194,78,146,126,124,230,168,94,137,18,110,37,169,32,109,108,61,143,223,168,191,164,199,151,173,146,228,239,214,144,155,156,170,251,74,67,189,161,79,181,183,68,45,171,120,160,180,194,8,169,110,175,71,95,217,247,102,204,242,139,89,41,105,81,31,191,83,158,90,179,73,69,233,254,203,250,71,91,155,244,229,189,111,140,122,252,165,174,107,70,128,78,178,218,148,102,119,24,51,163,215,7,7,140,227,102,142,243,214,234,7,154,26,244,211,179,167,140,30,199,91,138,203,213,236,234,213,243,35,234,176,195,173,43,40,54,238,239,190,90,23,115,131,145,224,135,162,241,18,175,231,123,254,140,28,125,176,98,81,196,99,125,238,33,227,131,103,71,191,75,71,91,155,244,139,11,213,234,26,101,17,37,128,196,70,128,6,166,185,145,11,207,6,135,67,51,123,69,35,58,26,196,218,65,48,201,106,211,210,156,188,49,253,188,215,46,95,208,135,231,47,81,166,195,41,187,197,162,71,22,44,141,152,61,140,181,131,223,172,176,113,54,247,245,198,12,83,149,121,5,202,29,231,224,121,43,29,3,46,35,64,207,205,202,150,195,98,141,217,213,68,146,82,108,161,50,141,33,143,39,162,172,224,116,71,171,30,42,155,39,201,191,117,118,78,82,178,209,115,59,154,247,205,153,47,103,96,1,223,169,142,214,91,238,72,248,194,217,147,42,203,200,50,182,213,254,157,5,203,212,226,234,139,122,110,253,219,92,135,22,232,157,136,178,200,52,104,117,216,2,208,241,16,143,231,187,52,61,83,95,88,123,143,81,107,254,147,234,227,250,233,217,83,19,242,179,1,196,23,118,34,4,166,185,173,197,115,140,251,55,134,135,35,54,235,24,121,169,189,56,61,250,44,227,239,46,89,49,230,109,140,7,61,195,218,115,53,84,243,187,181,52,180,61,116,99,111,79,196,115,225,194,75,45,210,29,206,155,182,148,150,252,109,218,30,93,180,124,76,227,24,79,39,195,22,138,165,219,29,250,228,210,21,49,143,117,88,172,218,56,59,180,152,239,106,111,119,196,243,187,26,234,116,237,134,127,22,218,110,177,232,15,151,87,197,124,173,7,74,43,244,7,119,173,209,99,75,86,232,19,139,43,229,241,142,173,28,229,59,71,246,25,187,67,90,76,38,253,225,93,107,180,36,202,7,160,33,111,100,125,116,172,29,6,55,23,149,105,201,204,177,125,128,26,171,120,60,223,35,183,123,159,225,76,82,85,126,209,187,218,197,18,64,98,34,64,3,211,84,121,230,12,253,213,250,123,85,153,87,96,60,246,246,136,22,95,103,59,59,34,22,166,125,106,233,202,136,178,2,135,197,170,79,47,91,173,135,202,231,201,247,14,106,137,95,185,116,214,216,2,60,124,157,214,200,214,117,225,46,135,245,42,206,116,56,245,196,242,42,227,18,191,228,159,73,255,210,186,45,170,200,202,126,71,99,25,15,255,123,233,156,218,194,74,97,30,46,159,175,63,91,189,49,162,252,69,146,150,228,228,233,107,27,183,170,56,236,241,215,235,35,55,234,144,20,209,157,164,42,127,182,190,188,254,222,136,18,9,171,217,172,15,86,44,210,239,223,181,218,120,236,237,150,171,55,181,44,140,101,96,216,173,127,56,180,199,216,18,60,217,102,211,147,171,239,86,254,136,82,136,246,126,151,58,6,34,127,175,145,65,251,193,178,10,125,166,178,74,38,105,92,223,247,120,60,223,213,157,109,17,255,63,60,92,62,95,127,185,238,30,253,248,225,15,235,133,247,63,162,127,125,224,131,250,198,166,7,244,217,149,235,35,74,95,0,76,61,148,112,0,83,88,101,94,129,190,115,239,123,35,30,51,155,76,202,116,56,149,233,112,26,59,204,73,254,142,1,207,213,156,136,56,246,98,87,167,78,180,53,107,121,110,190,36,127,253,231,211,91,127,75,87,122,187,228,241,250,140,126,192,146,244,90,221,69,61,88,54,122,207,226,160,198,62,255,76,243,186,130,98,163,85,152,203,61,164,237,181,231,99,126,207,175,234,46,234,183,230,46,84,86,96,182,239,190,210,185,90,147,63,91,141,125,61,178,153,45,198,66,62,143,207,167,55,175,212,106,107,201,156,152,175,53,222,6,134,221,250,214,161,61,250,171,245,91,148,18,232,81,188,169,168,84,27,103,151,232,250,224,13,245,187,135,148,106,119,24,253,131,131,14,52,53,68,173,41,127,233,98,141,22,100,207,212,134,64,219,185,85,179,10,181,34,175,64,237,253,46,13,121,60,202,74,74,50,182,184,150,164,22,87,159,254,229,196,161,119,52,230,250,158,46,61,125,236,160,62,183,122,67,96,11,238,20,253,121,213,70,125,97,215,235,17,139,72,119,212,215,234,163,11,150,74,242,7,217,175,109,188,79,13,61,93,114,185,221,154,153,156,98,148,79,156,104,107,81,65,106,218,184,213,109,199,227,249,126,230,228,97,93,237,237,214,103,42,215,222,244,92,138,205,166,20,155,77,179,82,82,181,56,39,87,91,75,230,168,182,235,154,182,29,59,96,108,123,14,96,234,96,6,26,152,194,50,29,78,205,201,156,17,113,43,203,200,82,150,51,41,34,60,55,244,118,235,239,223,222,165,198,222,158,155,94,99,219,177,3,106,232,9,149,25,56,173,86,205,203,202,209,194,236,153,70,120,222,217,112,89,207,156,60,60,106,27,181,145,254,241,240,222,136,5,115,251,155,26,70,109,49,214,59,52,168,109,199,14,68,28,147,225,112,106,81,118,174,42,178,178,101,183,88,52,236,245,234,217,211,71,117,170,253,246,183,228,190,93,213,157,109,250,202,190,55,35,118,245,51,153,76,154,225,76,210,236,180,140,136,240,236,245,249,244,122,221,197,81,59,96,252,221,193,93,122,233,98,141,188,129,217,85,179,201,164,188,148,84,21,165,103,68,132,231,11,215,59,245,255,246,189,113,91,221,30,246,54,214,235,197,176,109,175,231,102,102,235,201,213,119,71,28,243,31,213,199,35,119,132,52,153,84,154,145,165,197,57,185,70,120,174,237,186,166,239,29,221,31,209,149,229,221,138,199,243,29,220,42,60,92,93,79,151,78,181,251,107,207,107,187,175,69,44,28,44,207,156,161,191,168,218,52,46,45,32,1,196,23,102,160,129,105,40,184,112,173,177,175,71,135,90,26,245,106,237,185,152,253,128,91,93,125,122,242,173,237,250,240,188,197,90,149,239,239,154,145,100,181,169,111,104,80,77,125,61,122,189,254,146,177,99,92,191,219,29,177,232,108,52,91,138,203,141,146,1,111,140,214,117,35,189,221,124,85,79,237,252,149,62,80,177,80,203,114,102,41,203,153,36,139,217,164,238,193,65,93,234,186,166,151,47,213,232,68,91,139,86,132,149,165,76,164,234,206,54,125,118,199,255,234,61,37,115,84,149,63,91,101,25,51,148,102,119,200,105,181,170,223,61,164,158,193,65,85,119,182,233,205,134,90,157,106,191,245,6,27,207,156,60,172,3,77,13,122,168,124,158,230,103,229,104,70,82,146,76,50,201,229,30,210,149,192,86,231,47,191,203,62,195,207,213,156,80,105,70,166,81,114,80,149,95,164,79,45,93,169,127,59,117,196,56,230,111,15,236,212,131,101,243,180,185,168,84,69,105,25,74,177,217,53,232,25,86,251,64,191,246,55,94,209,75,23,171,229,114,187,213,55,52,126,1,90,138,191,243,253,209,249,75,141,157,28,207,93,235,208,23,119,191,30,117,177,232,125,165,115,245,196,242,42,89,205,102,229,38,167,234,254,210,185,17,31,84,0,36,190,241,235,78,63,254,172,146,210,223,247,179,127,231,218,23,48,5,125,125,211,253,70,61,237,201,246,22,125,113,247,235,147,60,34,96,116,255,124,223,7,140,126,229,223,56,184,43,98,3,156,145,158,170,218,100,148,224,236,109,172,215,55,14,238,154,144,49,2,83,197,43,31,250,68,182,164,30,73,177,91,26,77,34,74,56,0,76,184,249,51,114,180,56,48,147,39,197,110,93,7,196,147,240,46,36,117,183,216,2,62,188,164,198,110,225,98,47,48,213,16,160,1,76,184,247,150,207,55,106,176,155,251,122,181,171,161,110,146,71,4,220,154,43,172,198,123,229,172,209,203,70,230,101,229,24,247,219,251,99,239,76,9,32,49,17,160,1,76,168,76,135,83,107,11,138,140,175,223,28,165,117,29,16,79,106,187,67,11,68,63,190,112,121,212,174,51,41,54,155,254,100,197,58,45,206,241,95,97,241,73,122,139,15,136,192,148,195,117,37,0,19,234,125,115,22,40,201,234,95,104,216,239,118,235,213,81,90,215,1,241,228,197,115,103,180,108,230,44,57,44,86,165,216,108,250,76,229,90,125,108,225,93,106,236,237,209,13,143,91,41,54,187,74,210,179,34,22,210,238,168,191,164,154,206,182,73,28,53,128,59,129,0,13,96,66,221,83,84,102,220,63,208,220,160,238,176,182,95,64,60,171,233,108,211,55,223,222,163,39,42,171,140,221,7,103,56,147,162,238,68,232,243,249,180,227,74,173,158,62,126,112,162,135,9,96,2,16,160,1,76,152,247,148,204,81,94,74,170,36,127,192,120,181,246,214,173,235,128,120,114,176,185,65,39,219,91,244,254,185,11,180,52,39,79,179,211,252,125,185,109,22,139,6,134,221,234,29,28,212,185,235,29,122,235,74,173,142,180,54,77,246,112,1,220,33,137,208,198,174,67,241,61,78,0,0,0,140,31,223,43,31,250,68,142,104,99,119,251,124,62,95,236,173,201,0,0,0,48,165,36,66,246,139,247,0,237,243,121,189,189,147,61,8,0,0,0,76,140,64,246,243,77,246,56,70,19,239,1,218,235,27,246,180,79,246,32,0,0,0,48,49,2,217,207,59,217,227,24,77,188,7,104,159,207,51,124,117,178,7,1,0,0,128,137,17,200,126,204,64,223,38,159,36,239,240,141,193,75,147,61,16,0,0,0,76,140,64,246,243,42,142,67,116,60,7,104,73,242,13,94,187,94,61,217,131,0,0,0,192,196,8,100,191,184,13,207,82,124,7,104,159,36,111,231,217,179,135,38,123,32,0,0,0,152,24,129,236,199,12,244,109,242,73,242,86,255,232,133,203,222,33,119,237,100,15,6,0,0,0,119,150,119,200,93,91,253,163,23,46,139,0,253,174,120,37,13,13,246,244,236,158,236,129,0,0,0,224,206,10,100,190,33,209,133,227,182,249,2,55,79,119,253,149,215,38,123,48,0,0,0,184,179,2,153,207,163,80,14,140,75,241,190,69,182,89,146,83,82,198,195,207,63,179,215,108,183,151,77,246,128,0,0,0,48,254,188,67,67,151,95,253,216,227,119,75,234,150,116,67,113,60,11,29,207,51,208,82,96,6,90,210,160,171,181,253,127,38,123,48,0,0,0,184,51,2,89,111,80,161,25,232,184,149,40,1,218,93,243,252,139,207,250,124,222,184,223,27,29,0,0,0,239,140,207,231,29,172,121,254,197,103,37,185,69,128,30,23,94,73,195,109,7,143,182,244,183,182,255,100,178,7,3,0,0,128,241,213,223,218,254,147,182,131,71,91,36,13,43,142,75,55,130,18,33,64,251,228,127,51,7,79,63,251,159,219,124,30,79,239,100,15,8,0,0,0,227,195,231,241,244,158,126,246,63,183,201,95,190,49,172,56,159,125,150,18,39,64,123,37,185,219,15,29,111,238,169,107,248,254,100,15,8,0,0,0,227,163,167,174,225,251,237,135,142,55,203,95,190,17,215,253,159,131,226,189,11,71,144,73,146,77,82,146,164,172,251,127,252,253,23,237,169,41,171,38,121,76,0,0,0,120,23,134,250,92,135,127,253,216,31,125,68,210,117,73,3,242,135,232,184,15,208,137,48,3,45,133,22,19,14,73,114,53,237,220,243,183,74,128,55,23,0,0,0,49,249,2,153,206,37,127,198,139,251,197,131,65,150,201,30,192,237,104,59,118,170,35,103,217,146,193,164,153,217,27,39,123,44,0,0,0,120,231,174,213,92,248,250,145,111,109,251,31,69,6,232,132,144,144,1,90,146,26,118,236,170,46,220,184,46,215,158,150,186,116,178,199,2,0,0,128,177,115,53,181,60,191,251,207,190,244,15,146,122,229,223,52,37,33,22,15,6,37,90,128,142,120,99,235,182,191,126,176,120,235,61,243,173,201,73,115,38,107,64,0,0,0,24,187,27,157,215,127,189,227,137,39,159,146,212,163,80,221,115,220,183,174,11,151,104,1,58,40,24,164,189,181,47,191,182,179,228,129,45,75,172,78,103,233,164,142,8,0,0,0,163,26,236,234,218,249,155,79,127,246,79,36,117,73,234,151,191,117,93,66,133,103,41,177,3,116,240,230,173,253,229,246,29,69,91,55,207,179,49,19,13,0,0,16,151,6,58,175,189,30,22,158,93,74,144,109,187,163,73,212,0,29,100,132,232,203,47,191,246,102,193,198,181,217,246,180,180,37,147,61,40,0,0,0,132,244,53,53,191,240,230,19,159,251,188,164,110,37,120,120,150,18,59,64,27,225,57,120,171,219,254,155,253,51,22,45,232,79,206,155,185,94,137,211,227,26,0,0,96,170,242,117,156,170,249,230,158,167,190,252,109,133,194,115,112,209,96,194,149,110,4,37,114,128,150,110,14,209,158,171,111,237,57,109,182,152,15,164,20,22,150,91,157,142,252,201,29,30,0,0,192,244,52,216,221,123,172,238,149,215,158,60,190,237,7,47,203,191,96,48,56,243,156,208,225,89,154,58,179,180,102,249,63,12,56,228,223,173,48,69,82,250,250,175,254,229,239,101,205,159,243,123,38,139,37,109,82,71,7,0,0,48,77,248,60,158,222,235,231,46,253,112,223,151,190,246,67,133,130,243,128,66,101,27,9,29,158,165,169,19,160,37,255,239,98,145,100,151,63,72,39,75,74,201,92,48,55,255,174,223,255,228,227,169,197,133,31,49,153,204,142,73,29,33,0,0,192,20,229,243,121,7,251,174,52,190,120,226,7,63,122,166,235,236,197,102,249,131,115,176,211,70,66,237,52,120,43,83,41,64,75,254,223,199,44,201,42,127,144,118,202,63,35,157,156,185,96,238,172,197,159,248,248,35,233,197,179,31,178,36,57,139,39,115,144,0,0,0,83,133,103,224,198,149,158,43,87,183,159,249,247,231,94,232,58,123,177,69,254,208,60,32,127,173,243,144,66,37,27,83,34,60,75,83,47,64,7,5,75,58,194,131,116,48,76,39,45,126,252,209,245,57,75,22,109,78,206,201,174,34,76,3,0,0,188,51,158,129,27,87,250,59,58,15,118,156,174,222,121,230,153,255,216,39,127,96,14,134,230,240,224,60,37,74,54,70,154,170,1,90,10,205,70,7,131,180,77,254,210,142,224,205,46,201,89,180,117,99,81,222,242,187,150,39,231,207,170,176,167,165,150,88,146,156,121,102,155,45,219,108,181,164,152,76,102,187,166,246,123,4,0,0,16,141,207,231,243,14,121,135,61,46,175,219,221,233,25,184,209,58,212,219,87,223,223,220,114,161,245,248,137,227,13,191,217,221,160,80,80,30,12,187,185,21,25,156,167,204,172,115,184,233,16,14,131,65,58,88,218,17,12,211,54,249,67,180,109,196,227,230,176,27,0,0,192,116,230,13,187,5,195,241,112,224,254,80,224,191,225,143,7,143,157,146,193,57,104,58,4,232,32,147,34,103,165,195,111,214,176,251,193,240,28,60,30,0,0,96,58,186,169,93,112,224,54,28,118,63,120,243,134,29,63,229,77,215,128,24,30,166,195,103,168,195,131,51,1,26,0,0,76,103,190,17,183,240,217,104,159,166,89,104,14,71,64,12,189,7,166,17,247,1,0,0,16,10,200,190,17,247,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,4,240,255,1,105,100,138,183,132,183,236,45,0,0,0,0,73,69,78,68,174,66,96,130]},{"layer_unique_id":37798,"duration_micros":1506,"top":0.0,"left":0.0,"width":720.0,"height":184.0,"snapshot":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,208,0,0,5,232,8,6,0,0,0,148,217,252,210,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,32,0,73,68,65,84,120,156,236,221,121,144,156,101,126,216,241,95,207,125,75,35,141,164,209,173,209,53,66,72,28,2,9,180,236,46,71,216,101,97,228,178,157,74,156,181,115,20,21,187,156,176,11,38,107,103,19,59,142,109,85,229,112,197,94,219,73,1,155,138,107,215,164,214,78,173,179,216,9,181,97,164,101,97,119,193,136,203,11,66,128,16,72,26,221,247,49,26,105,238,187,243,135,172,65,61,221,115,188,32,49,154,225,243,249,175,223,126,251,157,167,27,213,240,157,183,159,247,121,83,233,116,58,29,0,0,192,184,228,77,244,0,0,0,96,50,17,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,96,74,7,244,19,79,60,17,223,252,230,55,39,122,24,0,0,76,33,5,19,61,128,171,229,137,39,158,136,135,31,126,120,232,241,87,190,242,149,9,28,13,0,0,83,69,42,157,78,167,39,122,16,87,218,240,120,142,136,120,242,201,39,227,193,7,31,156,160,17,1,0,48,85,76,185,51,208,185,226,249,186,235,174,139,59,239,188,115,130,70,4,92,238,255,237,219,29,79,237,217,25,237,125,189,163,238,87,152,151,31,243,42,42,227,179,243,23,69,195,210,250,40,201,159,114,191,174,0,152,164,166,212,25,232,92,241,92,95,95,31,91,182,108,137,165,75,151,78,208,168,128,75,78,116,180,197,195,63,110,140,164,191,118,230,148,85,196,239,220,126,87,204,171,168,188,74,35,3,128,241,155,50,23,17,230,138,231,149,43,87,198,51,207,60,35,158,225,26,113,180,173,53,113,60,71,68,156,234,108,143,127,183,237,185,56,214,222,122,21,70,197,100,48,152,78,199,99,111,189,22,191,180,229,169,248,205,151,126,24,103,187,58,39,122,72,192,167,216,148,8,232,92,241,188,124,249,242,104,108,108,140,229,203,151,79,208,168,128,225,210,241,209,191,240,106,237,237,137,199,223,122,253,35,5,56,147,223,11,71,15,196,79,142,28,136,238,254,254,216,211,210,28,255,235,253,183,39,122,72,192,167,216,164,159,84,152,43,158,151,45,91,22,91,182,108,17,207,112,141,43,202,207,143,205,27,239,206,249,220,185,238,174,248,139,247,223,142,147,29,237,67,219,118,183,156,141,31,29,217,31,247,46,90,246,73,13,145,107,196,209,182,204,111,31,78,116,180,77,208,72,0,38,121,64,143,20,207,141,141,141,177,98,197,138,9,26,21,48,94,51,75,202,98,213,140,89,35,62,95,95,93,19,95,123,97,107,198,5,135,63,60,216,36,160,63,133,6,135,125,243,48,252,49,192,39,105,210,6,116,174,120,174,171,171,139,198,198,198,168,175,175,159,160,81,1,87,210,204,210,178,248,153,101,245,241,221,15,222,29,218,182,239,252,185,232,236,235,139,178,194,194,17,95,151,142,136,189,45,103,99,223,249,150,104,235,237,137,210,130,194,152,95,81,25,171,107,102,103,172,230,113,168,245,124,108,63,125,60,150,84,85,199,205,179,231,94,205,183,50,110,231,186,187,98,199,153,19,209,220,213,25,133,121,249,49,183,188,50,214,212,204,142,242,194,162,156,251,119,244,245,198,246,211,39,226,116,103,123,68,164,98,78,89,121,172,173,153,19,211,138,75,18,255,236,11,61,221,241,94,243,233,56,213,217,30,131,233,116,84,151,148,70,125,117,77,204,175,168,250,152,239,234,162,221,45,103,99,111,75,115,116,244,245,69,89,65,97,44,170,154,22,107,102,206,142,252,188,41,49,155,16,248,20,153,148,1,157,43,158,151,44,89,34,158,97,10,186,109,238,194,140,128,78,71,196,241,142,214,88,62,125,102,206,253,127,116,120,127,124,111,247,206,56,211,213,145,245,92,73,126,65,220,189,168,46,126,177,254,134,56,211,213,17,255,246,165,31,70,255,224,96,68,68,252,234,13,183,198,151,150,100,127,115,245,167,239,188,17,47,30,61,24,53,165,101,241,107,55,223,30,203,166,207,24,117,188,127,189,247,189,120,186,233,131,40,43,40,140,135,110,92,31,55,229,8,243,111,189,251,102,252,228,200,129,168,41,45,139,127,181,110,99,212,77,171,142,246,190,222,248,223,187,223,141,103,15,54,13,141,233,242,113,255,66,253,154,248,185,229,215,13,109,235,25,24,136,239,126,240,78,252,224,224,222,232,29,24,200,216,63,63,149,23,63,179,172,62,254,217,234,155,70,29,235,37,7,46,180,196,95,238,126,55,222,60,117,60,231,153,221,186,105,213,241,229,250,181,177,190,118,254,168,199,217,127,161,37,254,219,246,87,163,185,171,51,238,90,88,23,191,178,246,150,136,136,216,213,124,38,190,179,235,173,216,211,210,156,245,154,233,197,37,241,47,111,92,31,27,106,23,100,61,247,87,123,222,139,167,155,222,143,206,254,190,172,231,154,206,159,139,191,255,253,239,70,196,197,169,64,247,44,92,26,191,122,195,173,227,122,191,0,31,87,254,230,205,155,55,79,244,32,146,24,45,158,87,175,94,61,65,163,2,198,227,88,123,107,108,59,118,120,232,113,101,81,113,52,44,93,57,234,107,242,82,169,120,186,233,253,140,109,119,204,91,28,115,202,43,50,182,13,12,14,198,227,59,94,143,167,246,236,204,25,92,17,17,253,233,193,104,58,127,46,94,56,122,48,14,183,93,136,227,237,31,206,163,237,27,24,136,187,22,214,101,236,255,214,233,19,241,103,59,183,71,255,224,96,180,246,246,196,161,214,243,113,239,226,145,167,143,28,109,107,141,63,248,233,182,232,27,28,136,206,254,190,120,251,204,201,248,217,203,162,55,34,98,199,153,147,241,173,119,223,28,58,230,225,182,243,113,227,172,185,241,219,219,158,143,237,167,79,228,12,216,254,244,96,188,125,230,100,204,42,45,143,186,105,213,113,161,167,59,126,239,149,31,199,107,39,142,198,64,142,253,211,145,142,15,206,157,141,222,129,193,184,113,86,237,136,227,141,136,120,106,207,206,248,175,219,95,141,163,237,173,35,94,226,121,190,167,59,182,29,59,20,199,219,219,226,214,218,249,145,159,74,229,220,239,15,223,216,22,251,47,180,68,223,224,96,236,61,223,28,245,51,102,197,246,211,199,227,143,222,124,37,154,71,88,53,163,123,160,63,94,59,113,52,86,76,159,25,181,229,31,46,83,216,220,213,25,191,255,183,127,19,125,195,254,152,200,101,32,157,142,166,243,231,226,250,153,179,99,118,89,197,152,251,3,124,92,147,234,123,179,92,241,188,104,209,162,120,230,153,103,196,51,76,81,231,186,187,178,182,149,21,102,127,121,246,7,111,108,139,23,142,28,24,215,49,91,186,187,226,173,211,39,50,182,245,12,59,139,27,17,25,23,48,70,68,156,238,204,62,171,157,249,124,230,254,231,123,186,163,187,191,63,99,219,137,246,204,139,223,246,95,104,137,223,121,249,71,227,186,40,238,219,59,183,15,133,229,254,11,45,99,238,255,116,211,174,140,63,18,134,251,159,239,189,21,223,253,224,221,156,17,158,203,75,199,14,197,127,120,245,39,49,48,66,212,14,255,188,254,124,215,142,248,214,187,111,142,185,114,74,255,224,96,252,143,119,222,200,218,47,233,44,231,241,196,54,192,149,48,105,166,112,228,138,231,5,11,22,68,99,99,99,92,127,253,245,19,52,42,224,106,123,253,196,209,140,199,169,136,152,87,158,57,39,119,235,129,189,241,211,147,199,178,94,59,179,180,44,86,86,207,140,202,194,226,56,219,213,17,59,155,79,103,77,119,24,205,240,101,247,198,10,186,92,207,103,31,35,243,113,239,192,64,156,250,187,240,158,83,86,17,171,102,212,68,113,126,65,28,110,59,31,31,156,59,155,177,111,87,127,95,252,214,182,231,134,214,64,158,81,82,26,215,207,156,29,165,5,133,113,162,163,45,118,158,61,149,113,244,116,68,252,224,224,222,248,231,107,214,101,141,235,229,99,135,227,251,251,62,200,216,150,159,74,69,253,140,154,152,87,81,21,249,169,84,28,107,107,141,247,207,157,201,8,236,157,205,167,227,219,59,183,231,156,46,49,252,253,31,248,187,200,79,165,82,177,122,198,172,152,87,81,121,241,236,116,75,115,214,154,222,167,58,219,227,141,83,199,135,166,137,204,44,45,139,127,184,114,77,60,221,180,107,204,48,206,75,165,226,51,243,22,197,77,99,156,109,7,184,82,38,69,64,231,138,231,136,136,179,103,207,198,61,247,220,115,85,127,246,177,99,199,162,112,148,139,149,128,171,231,92,119,87,60,179,127,119,198,182,21,213,51,51,46,32,108,239,237,141,63,223,181,35,99,159,130,188,188,120,240,250,155,227,190,37,43,50,166,27,180,245,246,196,159,237,220,30,47,30,61,120,117,7,158,80,126,42,21,191,188,246,150,184,111,201,138,184,124,114,196,171,199,143,196,55,222,124,57,227,204,236,165,120,254,114,253,218,248,7,43,175,143,188,203,222,223,187,103,79,197,127,124,237,197,232,27,252,240,143,132,221,195,34,60,34,162,111,112,32,190,189,243,205,140,109,43,171,103,198,215,110,249,76,204,25,54,5,226,100,71,123,60,190,227,181,216,213,124,102,104,219,179,135,154,226,11,139,151,69,221,180,234,49,223,219,162,202,105,241,245,245,159,205,184,16,49,29,17,127,249,193,187,241,212,158,157,25,251,238,106,62,157,49,207,250,23,87,173,141,127,84,191,38,122,6,250,227,59,187,118,196,179,7,155,134,158,91,80,89,21,255,229,115,95,140,136,136,162,188,124,23,34,2,159,168,107,62,160,71,138,231,136,136,238,238,238,232,238,238,254,132,71,4,92,41,23,122,186,71,156,138,208,220,213,25,223,217,181,35,99,9,187,136,136,47,46,206,92,223,253,249,195,251,162,123,32,115,154,196,163,235,54,198,29,243,22,101,29,179,178,168,56,30,93,183,49,34,226,154,138,232,159,95,177,58,231,5,140,27,231,45,140,91,142,204,139,55,78,101,158,93,191,119,209,178,248,133,250,53,89,251,175,173,153,19,119,46,92,18,207,31,218,55,180,237,80,219,249,172,253,94,60,114,48,206,247,124,248,187,115,90,113,73,252,251,219,238,138,138,162,236,149,62,106,203,43,98,243,198,123,226,235,127,243,108,28,106,189,120,172,116,58,29,255,103,239,174,248,141,91,239,24,245,125,149,21,20,198,239,110,188,59,102,148,148,102,108,79,69,196,151,87,173,141,151,143,31,202,152,98,114,233,248,151,203,75,165,162,180,160,48,138,243,51,255,119,85,146,95,16,165,5,78,110,0,19,227,154,15,104,119,29,131,169,171,179,191,47,254,245,139,63,24,247,254,171,102,212,196,221,195,46,244,219,126,234,120,198,227,117,115,230,229,140,231,203,253,202,218,91,226,245,19,71,179,194,123,162,60,80,55,242,133,148,107,107,230,100,5,244,253,117,35,175,115,127,67,205,156,140,128,238,29,24,136,158,129,129,40,206,207,31,218,246,250,201,204,105,49,95,92,188,60,103,60,95,82,144,151,23,247,45,89,30,127,250,206,27,67,219,182,159,62,17,253,131,131,81,48,202,153,223,207,204,91,148,21,207,151,164,34,226,134,154,218,140,128,110,27,246,199,18,192,181,234,154,15,232,75,103,159,31,121,228,145,172,231,74,74,74,162,178,178,50,107,59,48,245,76,43,46,137,71,110,190,61,82,195,86,128,56,56,236,172,229,221,11,50,3,59,151,242,194,162,88,95,59,63,94,58,118,232,138,142,241,163,40,43,44,140,233,163,172,217,156,43,64,23,84,78,27,113,255,234,28,251,119,246,245,70,113,254,135,219,135,159,245,127,106,207,206,172,233,20,99,233,234,239,139,99,237,173,177,184,106,250,136,251,44,168,28,125,253,232,234,146,204,247,221,217,151,123,245,20,128,107,205,53,31,208,17,35,71,116,77,77,77,108,221,186,53,214,172,201,254,42,19,152,58,230,148,85,196,239,110,188,43,230,150,103,254,193,220,63,56,152,53,197,99,81,213,200,113,153,181,95,246,117,135,159,184,194,188,252,81,159,207,203,203,94,50,174,112,148,179,190,185,150,152,187,252,34,192,116,58,29,45,57,86,54,249,40,206,247,116,199,226,81,158,31,237,236,116,196,197,245,170,47,231,238,130,192,100,49,105,174,186,120,248,225,135,227,177,199,30,203,216,118,244,232,209,104,104,104,136,93,187,118,77,208,168,128,171,165,48,47,47,22,87,77,143,95,90,117,67,252,201,221,247,103,197,115,68,100,92,44,119,201,120,231,197,126,90,231,207,94,169,105,43,197,249,249,177,112,148,51,225,0,83,217,164,56,3,125,73,174,51,209,135,15,31,142,134,134,6,55,82,129,73,104,110,121,101,60,241,247,54,125,228,215,151,20,20,70,94,42,149,113,230,242,108,87,103,212,148,150,141,249,218,230,174,43,115,22,118,178,41,206,47,136,84,100,46,57,87,83,90,22,43,170,115,223,217,49,151,138,194,162,248,226,226,229,35,206,111,6,152,234,38,85,64,71,228,142,232,131,7,15,70,67,67,67,108,221,186,53,86,173,90,53,81,67,3,62,97,169,184,56,189,227,242,155,144,188,117,250,68,172,154,81,51,230,107,119,156,57,49,230,62,195,245,141,177,134,244,100,152,195,155,151,74,69,77,105,121,198,173,206,63,191,96,73,252,147,235,110,156,192,81,1,76,46,147,102,10,199,229,114,77,231,56,120,240,96,60,240,192,3,177,123,247,238,17,94,5,76,69,195,99,249,249,195,251,162,189,119,244,213,28,182,159,62,49,116,147,143,209,20,13,155,159,220,217,223,55,234,252,225,125,23,206,141,121,204,107,193,117,51,103,101,60,126,238,208,190,156,119,124,4,32,183,73,25,208,17,185,35,250,192,129,3,209,208,208,32,162,225,83,228,206,5,75,50,30,183,116,119,197,31,189,249,114,214,45,180,47,57,220,118,33,158,216,241,250,184,142,157,107,69,139,198,3,123,114,238,123,190,167,123,220,183,18,159,104,195,63,179,182,222,158,248,207,175,191,56,106,68,119,247,247,199,179,7,155,226,175,246,188,23,23,122,62,249,245,247,135,95,26,233,114,67,96,34,77,186,41,28,151,203,53,157,99,223,190,125,177,105,211,166,216,178,101,75,172,88,49,242,90,169,192,212,112,195,172,218,88,61,115,86,198,157,242,222,62,115,50,126,227,197,31,196,207,45,191,46,214,212,204,142,202,162,226,56,211,217,17,47,31,63,28,91,15,236,141,174,254,241,77,181,88,58,173,58,82,169,84,198,122,244,255,119,239,174,104,238,234,140,251,150,172,136,121,21,149,209,63,56,24,187,154,79,199,95,188,255,118,180,246,246,92,241,247,119,53,220,60,123,110,172,154,81,147,113,171,240,253,23,90,226,107,47,108,141,251,235,86,196,109,181,11,98,118,89,121,164,35,226,76,103,71,108,63,125,60,26,247,239,25,186,249,202,43,199,15,199,31,223,117,255,39,58,230,146,97,23,125,30,107,111,141,243,61,221,49,189,184,36,218,251,122,163,52,191,192,221,8,129,79,204,164,14,232,136,220,17,221,212,212,20,155,54,109,138,198,198,198,88,190,124,249,72,47,5,166,136,95,187,121,99,252,250,139,91,51,230,32,159,232,104,139,255,254,246,223,126,172,227,86,151,148,198,218,154,57,241,206,153,147,67,219,210,113,241,46,134,215,210,157,12,63,138,135,111,186,61,126,243,165,31,102,44,3,216,214,219,19,223,219,189,51,190,183,123,244,53,161,143,180,181,198,96,58,157,113,27,241,171,109,214,176,11,67,187,251,251,227,161,231,191,31,85,69,37,113,182,171,35,22,85,77,143,111,220,249,165,156,203,248,1,92,105,83,226,207,245,92,211,57,246,236,217,19,13,13,13,209,212,212,52,65,163,2,134,75,13,251,34,254,74,181,206,236,178,242,248,245,91,238,24,247,210,116,169,184,120,99,150,241,140,229,151,215,172,139,162,252,209,215,106,78,34,235,51,24,115,255,228,63,97,60,199,152,87,81,25,191,125,251,157,81,85,84,156,248,39,52,44,93,153,51,158,135,111,25,254,94,179,246,79,240,230,110,153,51,47,107,93,233,158,129,129,56,211,213,17,233,184,120,27,240,227,237,173,227,63,32,192,199,48,37,2,58,98,228,136,222,180,105,83,236,223,191,127,130,70,5,92,110,94,69,230,90,206,181,101,21,87,236,216,235,102,207,141,223,255,220,23,178,126,198,112,85,69,197,241,245,245,159,141,7,175,191,57,115,44,57,214,153,142,136,88,88,57,45,254,205,173,159,141,178,194,209,227,124,245,204,217,241,232,186,141,89,219,11,134,93,136,56,183,60,243,61,215,150,143,254,25,12,95,255,122,206,24,159,89,109,121,69,70,220,150,22,20,198,244,17,150,155,171,175,174,137,111,220,249,165,88,95,59,127,212,99,94,82,85,84,28,95,185,113,67,214,103,55,210,216,230,142,241,223,98,248,103,62,252,179,185,220,180,226,146,81,87,10,153,81,82,26,179,202,202,71,253,121,0,87,74,254,230,205,155,55,79,244,32,174,148,13,27,54,12,221,157,240,146,230,230,230,120,238,185,231,226,129,7,30,136,234,234,234,9,28,29,112,233,108,231,129,11,45,81,91,94,25,15,221,180,33,235,76,240,199,49,173,184,36,238,91,178,34,230,150,87,68,127,122,48,186,7,250,163,111,96,48,74,10,10,162,174,170,58,238,175,91,25,143,174,187,61,150,78,155,17,139,42,167,197,233,174,142,56,217,209,30,203,166,207,136,127,113,195,250,17,35,121,110,69,101,124,126,193,146,200,75,165,162,163,191,55,122,7,6,34,149,74,197,140,146,210,88,59,107,78,252,227,235,110,136,127,186,250,166,216,119,254,92,252,244,228,135,183,55,44,200,203,139,47,215,175,205,56,86,109,121,101,92,232,233,137,99,237,109,81,91,94,17,15,221,184,97,212,245,148,167,23,151,68,58,34,14,180,182,196,140,146,178,120,232,198,13,49,103,148,208,44,41,40,136,138,162,162,216,123,254,92,84,20,22,197,67,55,174,143,69,163,220,240,164,172,176,48,62,55,127,113,220,54,119,97,148,22,20,70,58,29,209,59,56,16,3,131,233,40,202,207,139,154,210,242,184,121,246,220,248,249,21,171,227,171,55,221,54,234,122,209,117,211,170,227,253,115,103,162,111,112,48,238,93,180,44,26,150,174,28,113,223,136,139,183,36,111,238,234,140,19,29,109,177,160,162,106,204,127,15,245,51,106,98,73,85,117,92,232,237,137,158,129,129,24,72,15,70,85,81,113,108,156,183,48,30,93,183,241,138,254,91,2,24,77,42,157,158,122,247,78,125,252,241,199,179,110,251,253,228,147,79,198,131,15,62,56,65,35,2,62,13,254,248,205,87,98,219,177,67,67,143,231,87,84,197,99,247,52,76,224,136,0,184,26,166,204,20,142,203,13,159,206,241,248,227,143,139,103,224,99,105,27,99,133,141,247,207,157,137,87,143,31,201,216,86,63,142,27,186,0,48,249,76,250,85,56,70,114,105,117,142,84,42,21,95,253,234,87,39,120,52,192,100,213,55,56,16,191,247,202,143,227,131,115,103,99,78,89,69,220,189,176,46,110,173,157,31,179,74,203,162,111,112,48,78,119,182,199,79,79,30,139,198,3,123,98,32,61,152,241,218,187,22,212,77,208,168,1,184,154,166,228,20,14,128,43,229,249,195,251,226,155,59,146,47,135,183,190,118,126,252,214,134,207,95,133,17,1,48,209,166,228,20,14,128,43,165,109,140,219,130,231,178,184,106,122,60,114,211,237,87,97,52,0,92,11,4,52,192,40,190,176,104,89,212,77,27,223,10,62,121,169,84,220,189,176,46,254,211,29,247,70,69,81,209,85,30,25,0,19,197,20,14,128,49,12,164,211,177,237,216,161,120,227,212,177,56,210,122,33,90,123,123,162,189,175,55,10,243,242,163,170,168,56,230,150,87,196,77,179,231,198,134,218,5,99,174,235,12,192,228,39,160,1,0,32,1,83,56,0,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,1,1,13,0,0,9,8,104,0,0,72,64,64,3,0,64,2,2,26,0,0,18,16,208,0,0,144,128,128,6,0,128,4,4,52,0,0,36,32,160,1,0,32,129,130,182,182,182,137,30,3,0,0,76,26,206,64,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,255,111,15,14,9,0,0,0,0,4,253,127,237,12,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,225,184,51,0,0,3,80,73,68,65,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,46,202,255,4,252,154,91,58,239,0,0,0,0,73,69,78,68,174,66,96,130]}],"frame_width":720,"frame_height":1512} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/ios/.gitignore b/FrontEnd/flutter_pos_ecommerce/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Flutter/AppFrameworkInfo.plist b/FrontEnd/flutter_pos_ecommerce/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..9625e10 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 11.0 + + diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Flutter/Debug.xcconfig b/FrontEnd/flutter_pos_ecommerce/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Flutter/Release.xcconfig b/FrontEnd/flutter_pos_ecommerce/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.pbxproj b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c968979 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,614 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807E294A63A400263BE5 /* Frameworks */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1430; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPosEcommerce; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPosEcommerce.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPosEcommerce.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPosEcommerce.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPosEcommerce; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPosEcommerce; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..87131a0 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcworkspace/contents.xcworkspacedata b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/AppDelegate.swift b/FrontEnd/flutter_pos_ecommerce/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..70693e4 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..dc9ada4 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..7353c41 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..797d452 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..6ed2d93 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..4cd7b00 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..fe73094 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..321773c Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..797d452 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..502f463 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..0ec3034 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..0ec3034 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..e9f5fea Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..84ac32a Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..8953cba Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..0467bf1 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Base.lproj/LaunchScreen.storyboard b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Base.lproj/Main.storyboard b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Info.plist b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Info.plist new file mode 100644 index 0000000..5f78fe0 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Flutter Pos Ecommerce + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + flutter_pos_ecommerce + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/FrontEnd/flutter_pos_ecommerce/ios/Runner/Runner-Bridging-Header.h b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/FrontEnd/flutter_pos_ecommerce/ios/RunnerTests/RunnerTests.swift b/FrontEnd/flutter_pos_ecommerce/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/channel_datasorces.dart b/FrontEnd/flutter_pos_ecommerce/lib/channel_datasorces.dart new file mode 100644 index 0000000..2040b5b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/channel_datasorces.dart @@ -0,0 +1,26 @@ +import 'dart:convert'; +import 'package:flutter_pos_ecommerce/core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:http/http.dart' as http; + +Future createNewChannel() async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.post( + Uri.parse('${GlobalVariable.baseUrl}/api/send-message'), // Ganti dengan URL endpoint Anda + headers: { + 'Authorization': 'Bearer ${authData?.accessToken}', + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }, + body: { + + }, + ); + + if (response.statusCode == 201) { + final jsonResponse = json.decode(response.body); + return jsonResponse['channel_id']; // Channel ID diperoleh dari respons API + } else { + throw Exception('Failed to create new channel'); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/chat_screen.dart b/FrontEnd/flutter_pos_ecommerce/lib/chat_screen.dart new file mode 100644 index 0000000..94baf80 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/chat_screen.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'web_socket_service.dart'; + +class ChatScreen extends StatefulWidget { + final String channelId; + + ChatScreen({required this.channelId}); + + @override + _ChatScreenState createState() => _ChatScreenState(); +} + +class _ChatScreenState extends State { + final WebSocketService _webSocketService = WebSocketService(); + final TextEditingController _controller = TextEditingController(); + + @override + void initState() { + super.initState(); + _connect(); + } + + void _connect() async { + final authData = await AuthLocalDatasource().getAuthData(); + final token = authData?.accessToken; + if (token != null) { + _webSocketService.connect(widget.channelId); + } + } + + void _sendMessage() { + if (_controller.text.isNotEmpty) { + _webSocketService.sendMessage(widget.channelId, _controller.text); + _controller.clear(); + } + } + + @override + void dispose() { + _webSocketService.disconnect(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Chat')), + body: Column( + children: [ + Expanded( + child: StreamBuilder( + stream: _webSocketService.channel.stream, + builder: (context, snapshot) { + if (snapshot.hasData) { + // Tangani pesan masuk + } + return ListView(); + }, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Expanded( + child: TextField( + controller: _controller, + decoration: InputDecoration(hintText: 'Enter message'), + ), + ), + IconButton( + icon: Icon(Icons.send), + onPressed: _sendMessage, + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/assets/assets.gen.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/assets/assets.gen.dart new file mode 100644 index 0000000..f1ac87d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/assets/assets.gen.dart @@ -0,0 +1,460 @@ +/// GENERATED CODE - DO NOT MODIFY BY HAND +/// ***************************************************** +/// FlutterGen +/// ***************************************************** + +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use + +import 'package:flutter/widgets.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter/services.dart'; + +class $AssetsIconsGen { + const $AssetsIconsGen(); + + /// File path: assets/icons/all_categories.svg + SvgGenImage get allCategories => + const SvgGenImage('assets/icons/all_categories.svg'); + + /// File path: assets/icons/bag.svg + SvgGenImage get bag => const SvgGenImage('assets/icons/bag.svg'); + + /// File path: assets/icons/calendar.svg + SvgGenImage get calendar => const SvgGenImage('assets/icons/calendar.svg'); + + /// File path: assets/icons/cart.svg + SvgGenImage get cart => const SvgGenImage('assets/icons/cart.svg'); + + /// File path: assets/icons/cash.svg + SvgGenImage get cash => const SvgGenImage('assets/icons/cash.svg'); + + /// File path: assets/icons/clock.svg + SvgGenImage get clock => const SvgGenImage('assets/icons/clock.svg'); + + /// File path: assets/icons/copy.svg + SvgGenImage get copy => const SvgGenImage('assets/icons/copy.svg'); + + /// File path: assets/icons/creditcard.svg + SvgGenImage get creditcard => + const SvgGenImage('assets/icons/creditcard.svg'); + + /// File path: assets/icons/dashboard.svg + SvgGenImage get dashboard => const SvgGenImage('assets/icons/dashboard.svg'); + + /// File path: assets/icons/debit.svg + SvgGenImage get debit => const SvgGenImage('assets/icons/debit.svg'); + + /// File path: assets/icons/delete.svg + SvgGenImage get delete => const SvgGenImage('assets/icons/delete.svg'); + + /// File path: assets/icons/done.svg + SvgGenImage get done => const SvgGenImage('assets/icons/done.svg'); + + /// File path: assets/icons/drink.svg + SvgGenImage get drink => const SvgGenImage('assets/icons/drink.svg'); + + /// File path: assets/icons/edit.svg + SvgGenImage get edit => const SvgGenImage('assets/icons/edit.svg'); + + /// File path: assets/icons/email.svg + SvgGenImage get email => const SvgGenImage('assets/icons/email.svg'); + + /// File path: assets/icons/food.svg + SvgGenImage get food => const SvgGenImage('assets/icons/food.svg'); + + /// File path: assets/icons/history.svg + SvgGenImage get history => const SvgGenImage('assets/icons/history.svg'); + + /// File path: assets/icons/home.svg + SvgGenImage get home => const SvgGenImage('assets/icons/home.svg'); + + /// File path: assets/icons/home_pos.svg + SvgGenImage get homePos => const SvgGenImage('assets/icons/home_pos.svg'); + + /// File path: assets/icons/image.svg + SvgGenImage get image => const SvgGenImage('assets/icons/image.svg'); + + /// File path: assets/icons/location.svg + SvgGenImage get location => const SvgGenImage('assets/icons/location.svg'); + + /// File path: assets/icons/notification.svg + SvgGenImage get notification => + const SvgGenImage('assets/icons/notification.svg'); + + /// File path: assets/icons/order.svg + SvgGenImage get order => const SvgGenImage('assets/icons/order.svg'); + + /// File path: assets/icons/orders.svg + SvgGenImage get orders => const SvgGenImage('assets/icons/orders.svg'); + + /// File path: assets/icons/password.svg + SvgGenImage get password => const SvgGenImage('assets/icons/password.svg'); + + /// File path: assets/icons/payments.svg + SvgGenImage get payments => const SvgGenImage('assets/icons/payments.svg'); + + /// File path: assets/icons/person.svg + SvgGenImage get person => const SvgGenImage('assets/icons/person.svg'); + + /// File path: assets/icons/print.svg + SvgGenImage get print => const SvgGenImage('assets/icons/print.svg'); + + /// File path: assets/icons/qr_code.svg + SvgGenImage get qrCode => const SvgGenImage('assets/icons/qr_code.svg'); + + /// File path: assets/icons/report.svg + SvgGenImage get report => const SvgGenImage('assets/icons/report.svg'); + + /// File path: assets/icons/search.svg + SvgGenImage get search => const SvgGenImage('assets/icons/search.svg'); + + /// File path: assets/icons/shield-done.svg + SvgGenImage get shieldDone => + const SvgGenImage('assets/icons/shield-done.svg'); + + /// File path: assets/icons/snack.svg + SvgGenImage get snack => const SvgGenImage('assets/icons/snack.svg'); + + /// File path: assets/icons/user.svg + SvgGenImage get user => const SvgGenImage('assets/icons/user.svg'); + + /// List of all assets + List get values => [ + allCategories, + bag, + calendar, + cart, + cash, + clock, + copy, + creditcard, + dashboard, + debit, + delete, + done, + drink, + edit, + email, + food, + history, + home, + homePos, + image, + location, + notification, + order, + orders, + password, + payments, + person, + print, + qrCode, + report, + search, + shieldDone, + snack, + user + ]; +} + +class $AssetsImagesGen { + const $AssetsImagesGen(); + + $AssetsImagesBanksGen get banks => const $AssetsImagesBanksGen(); + + /// File path: assets/images/banner1.png + AssetGenImage get banner1 => const AssetGenImage('assets/images/banner1.png'); + + /// File path: assets/images/banner2.png + AssetGenImage get banner2 => const AssetGenImage('assets/images/banner2.png'); + + $AssetsImagesCategoriesGen get categories => + const $AssetsImagesCategoriesGen(); + + /// File path: assets/images/f1.jpeg + AssetGenImage get f1 => const AssetGenImage('assets/images/f1.jpeg'); + + /// File path: assets/images/f2.jpeg + AssetGenImage get f2 => const AssetGenImage('assets/images/f2.jpeg'); + + /// File path: assets/images/f3.jpeg + AssetGenImage get f3 => const AssetGenImage('assets/images/f3.jpeg'); + + /// File path: assets/images/f4.jpeg + AssetGenImage get f4 => const AssetGenImage('assets/images/f4.jpeg'); + + /// File path: assets/images/f5.jpeg + AssetGenImage get f5 => const AssetGenImage('assets/images/f5.jpeg'); + + /// File path: assets/images/f6.jpeg + AssetGenImage get f6 => const AssetGenImage('assets/images/f6.jpeg'); + + /// File path: assets/images/f7.jpeg + AssetGenImage get f7 => const AssetGenImage('assets/images/f7.jpeg'); + + /// File path: assets/images/f8.jpeg + AssetGenImage get f8 => const AssetGenImage('assets/images/f8.jpeg'); + + /// File path: assets/images/google.png + AssetGenImage get google => const AssetGenImage('assets/images/google.png'); + + /// File path: assets/images/img_friend4.png + AssetGenImage get imgFriend4 => + const AssetGenImage('assets/images/img_friend4.png'); + + /// File path: assets/images/img_logo.png + AssetGenImage get imgLogo => + const AssetGenImage('assets/images/img_logo.png'); + + /// File path: assets/images/manage_printer.png + AssetGenImage get managePrinter => + const AssetGenImage('assets/images/manage_printer.png'); + + /// File path: assets/images/manage_product.png + AssetGenImage get manageProduct => + const AssetGenImage('assets/images/manage_product.png'); + + /// File path: assets/images/oops.png + AssetGenImage get oops => const AssetGenImage('assets/images/oops.png'); + + /// File path: assets/images/process-order.png + AssetGenImage get processOrder => + const AssetGenImage('assets/images/process-order.png'); + + $AssetsImagesProductsGen get products => const $AssetsImagesProductsGen(); + + /// List of all assets + List get values => [ + banner1, + banner2, + f1, + f2, + f3, + f4, + f5, + f6, + f7, + f8, + google, + imgFriend4, + imgLogo, + managePrinter, + manageProduct, + oops, + processOrder + ]; +} + +class $AssetsImagesBanksGen { + const $AssetsImagesBanksGen(); + + /// File path: assets/images/banks/BCA.png + AssetGenImage get bca => const AssetGenImage('assets/images/banks/BCA.png'); + + /// File path: assets/images/banks/BRI Direct Debit.png + AssetGenImage get bRIDirectDebit => + const AssetGenImage('assets/images/banks/BRI Direct Debit.png'); + + /// File path: assets/images/banks/Mandiri.png + AssetGenImage get mandiri => + const AssetGenImage('assets/images/banks/Mandiri.png'); + + /// List of all assets + List get values => [bca, bRIDirectDebit, mandiri]; +} + +class $AssetsImagesCategoriesGen { + const $AssetsImagesCategoriesGen(); + + /// File path: assets/images/categories/menu-bestseller.png + AssetGenImage get menuBestseller => + const AssetGenImage('assets/images/categories/menu-bestseller.png'); + + /// File path: assets/images/categories/menu-flashsale.png + AssetGenImage get menuFlashsale => + const AssetGenImage('assets/images/categories/menu-flashsale.png'); + + /// File path: assets/images/categories/menu-more.png + AssetGenImage get menuMore => + const AssetGenImage('assets/images/categories/menu-more.png'); + + /// File path: assets/images/categories/menu-toprated.png + AssetGenImage get menuToprated => + const AssetGenImage('assets/images/categories/menu-toprated.png'); + + /// List of all assets + List get values => + [menuBestseller, menuFlashsale, menuMore, menuToprated]; +} + +class $AssetsImagesProductsGen { + const $AssetsImagesProductsGen(); + + /// File path: assets/images/products/earphone.png + AssetGenImage get earphone => + const AssetGenImage('assets/images/products/earphone.png'); + + /// File path: assets/images/products/keyboard.png + AssetGenImage get keyboard => + const AssetGenImage('assets/images/products/keyboard.png'); + + /// File path: assets/images/products/lampu.png + AssetGenImage get lampu => + const AssetGenImage('assets/images/products/lampu.png'); + + /// File path: assets/images/products/mac.png + AssetGenImage get mac => + const AssetGenImage('assets/images/products/mac.png'); + + /// File path: assets/images/products/mac2.png + AssetGenImage get mac2 => + const AssetGenImage('assets/images/products/mac2.png'); + + /// File path: assets/images/products/sepatu.png + AssetGenImage get sepatu => + const AssetGenImage('assets/images/products/sepatu.png'); + + /// File path: assets/images/products/sepatu2.png + AssetGenImage get sepatu2 => + const AssetGenImage('assets/images/products/sepatu2.png'); + + /// List of all assets + List get values => + [earphone, keyboard, lampu, mac, mac2, sepatu, sepatu2]; +} + +class Assets { + Assets._(); + + static const $AssetsIconsGen icons = $AssetsIconsGen(); + static const $AssetsImagesGen images = $AssetsImagesGen(); +} + +class AssetGenImage { + const AssetGenImage(this._assetName); + + final String _assetName; + + Image image({ + Key? key, + AssetBundle? bundle, + ImageFrameBuilder? frameBuilder, + ImageErrorWidgetBuilder? errorBuilder, + String? semanticLabel, + bool excludeFromSemantics = false, + double? scale, + double? width, + double? height, + Color? color, + Animation? opacity, + BlendMode? colorBlendMode, + BoxFit? fit, + AlignmentGeometry alignment = Alignment.center, + ImageRepeat repeat = ImageRepeat.noRepeat, + Rect? centerSlice, + bool matchTextDirection = false, + bool gaplessPlayback = false, + bool isAntiAlias = false, + String? package, + FilterQuality filterQuality = FilterQuality.low, + int? cacheWidth, + int? cacheHeight, + }) { + return Image.asset( + _assetName, + key: key, + bundle: bundle, + frameBuilder: frameBuilder, + errorBuilder: errorBuilder, + semanticLabel: semanticLabel, + excludeFromSemantics: excludeFromSemantics, + scale: scale, + width: width, + height: height, + color: color, + opacity: opacity, + colorBlendMode: colorBlendMode, + fit: fit, + alignment: alignment, + repeat: repeat, + centerSlice: centerSlice, + matchTextDirection: matchTextDirection, + gaplessPlayback: gaplessPlayback, + isAntiAlias: isAntiAlias, + package: package, + filterQuality: filterQuality, + cacheWidth: cacheWidth, + cacheHeight: cacheHeight, + ); + } + + ImageProvider provider({ + AssetBundle? bundle, + String? package, + }) { + return AssetImage( + _assetName, + bundle: bundle, + package: package, + ); + } + + String get path => _assetName; + + String get keyName => _assetName; +} + +class SvgGenImage { + const SvgGenImage(this._assetName); + + final String _assetName; + + SvgPicture svg({ + Key? key, + bool matchTextDirection = false, + AssetBundle? bundle, + String? package, + double? width, + double? height, + BoxFit fit = BoxFit.contain, + AlignmentGeometry alignment = Alignment.center, + bool allowDrawingOutsideViewBox = false, + WidgetBuilder? placeholderBuilder, + String? semanticsLabel, + bool excludeFromSemantics = false, + SvgTheme theme = const SvgTheme(), + ColorFilter? colorFilter, + Clip clipBehavior = Clip.hardEdge, + @deprecated Color? color, + @deprecated BlendMode colorBlendMode = BlendMode.srcIn, + @deprecated bool cacheColorFilter = false, + }) { + return SvgPicture.asset( + _assetName, + key: key, + matchTextDirection: matchTextDirection, + bundle: bundle, + package: package, + width: width, + height: height, + fit: fit, + alignment: alignment, + allowDrawingOutsideViewBox: allowDrawingOutsideViewBox, + placeholderBuilder: placeholderBuilder, + semanticsLabel: semanticsLabel, + excludeFromSemantics: excludeFromSemantics, + theme: theme, + colorFilter: colorFilter, + color: color, + colorBlendMode: colorBlendMode, + clipBehavior: clipBehavior, + cacheColorFilter: cacheColorFilter, + ); + } + + String get path => _assetName; + + String get keyName => _assetName; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/buttons.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/buttons.dart new file mode 100644 index 0000000..35f2769 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/buttons.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; + +import '../constants/colors.dart'; + + +enum ButtonStyle { filled, outlined } + +class Button extends StatelessWidget { + const Button.filled({ + super.key, + required this.onPressed, + required this.label, + this.style = ButtonStyle.filled, + this.color = AppColors.primary, + this.textColor = Colors.white, + this.width = double.infinity, + this.height = 50.0, + this.borderRadius = 16.0, + this.icon, + this.disabled = false, + this.fontSize = 16.0, + }); + + const Button.outlined({ + super.key, + required this.onPressed, + required this.label, + this.style = ButtonStyle.outlined, + this.color = AppColors.white, + this.textColor = AppColors.black, + this.width = double.infinity, + this.height = 50.0, + this.borderRadius = 16.0, + this.icon, + this.disabled = false, + this.fontSize = 16.0, + }); + + final Function() onPressed; + final String label; + final ButtonStyle style; + final Color color; + final Color textColor; + final double width; + final double height; + final double borderRadius; + final Widget? icon; + final bool disabled; + final double fontSize; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: height, + width: width, + child: style == ButtonStyle.filled + ? ElevatedButton( + onPressed: disabled ? null : onPressed, + style: ElevatedButton.styleFrom( + backgroundColor: color, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(borderRadius), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + icon ?? const SizedBox.shrink(), + if (icon != null) const SizedBox(width: 10.0), + Text( + label, + style: TextStyle( + color: textColor, + fontSize: fontSize, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ) + : OutlinedButton( + onPressed: disabled ? null : onPressed, + style: OutlinedButton.styleFrom( + backgroundColor: color, + side: const BorderSide(color: AppColors.primary), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(borderRadius), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + icon ?? const SizedBox.shrink(), + if (icon != null) const SizedBox(width: 10.0), + Text( + label, + style: TextStyle( + color: textColor, + fontSize: fontSize, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/components.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/components.dart new file mode 100644 index 0000000..c61a10a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/components.dart @@ -0,0 +1,6 @@ +export 'buttons.dart'; +export 'custom_dropdown.dart'; +export 'custom_text_field.dart'; +export 'pin_input.dart'; +export 'search_input.dart'; +export 'spaces.dart'; diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_date_picker.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_date_picker.dart new file mode 100644 index 0000000..30ab998 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_date_picker.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_pos_ecommerce/core/assets/assets.gen.dart'; +import 'package:flutter_pos_ecommerce/core/constants/colors.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/date_time_ext2.dart'; + +class CustomDatePicker extends StatefulWidget { + final void Function(DateTime selectedDate)? onDateSelected; + final DateTime initialDate; + final Widget? prefix; + + const CustomDatePicker({ + super.key, + required this.initialDate, + this.onDateSelected, + this.prefix, + }); + + @override + State createState() => _CustomDatePickerState(); +} + +class _CustomDatePickerState extends State { + late DateTime selectedDate; + + @override + void initState() { + selectedDate = widget.initialDate; + super.initState(); + } + + Future _selectDate(BuildContext context) async { + final DateTime? picked = await showDatePicker( + context: context, + initialDate: selectedDate, + firstDate: DateTime(2000), + lastDate: DateTime(2101), + ); + if (picked != null && picked != selectedDate) { + setState(() { + selectedDate = picked; + }); + if (widget.onDateSelected != null) { + widget.onDateSelected!(picked); + } + } + } + + @override + Widget build(BuildContext context) { + final isMobile = MediaQuery.of(context).size.width < 600; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: isMobile ? double.infinity : 800, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible( + child: GestureDetector( + onTap: () => _selectDate(context), + child: AbsorbPointer( + child: TextFormField( + style: const TextStyle( + color: AppColors.black, + fontWeight: FontWeight.bold, + ), + readOnly: true, + controller: TextEditingController( + text: selectedDate.toFormattedDate2(), + ), + decoration: InputDecoration( + suffixIcon: Padding( + padding: isMobile + ? const EdgeInsets.all(8.0) + : const EdgeInsets.all(16.0), + child: Assets.icons.calendar.svg(), + ), + prefix: widget.prefix, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(6.0), + borderSide: const BorderSide(color: AppColors.stroke), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(6.0), + borderSide: const BorderSide(color: AppColors.stroke), + ), + ), + ), + ), + ), + ), + ], + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_dropdown copy.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_dropdown copy.dart new file mode 100644 index 0000000..f746521 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_dropdown copy.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +import 'spaces.dart'; + +class CustomDropdown extends StatelessWidget { + final T? value; + final List items; + final String label; + final Function(T? value)? onChanged; + + const CustomDropdown({ + super.key, + required this.value, + required this.items, + required this.label, + this.onChanged, + }); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w700, + ), + ), + const SpaceHeight(12.0), + DropdownButtonFormField( + value: value, + onChanged: onChanged, + items: items.map((T item) { + return DropdownMenuItem( + value: item, + child: Text(item.toString()), + ); + }).toList(), + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(16.0), + borderSide: const BorderSide(color: Colors.grey), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(16.0), + borderSide: const BorderSide(color: Colors.grey), + ), + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_dropdown.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_dropdown.dart new file mode 100644 index 0000000..25843dd --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_dropdown.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +import 'spaces.dart'; + +class CustomDropdown extends StatelessWidget { + final T? value; + final List items; + final String label; + final Function(T? value)? onChanged; + + const CustomDropdown({ + super.key, + required this.value, + required this.items, + required this.label, + this.onChanged, + }); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w700, + ), + ), + const SpaceHeight(12.0), + DropdownButtonFormField( + value: value, + onChanged: onChanged, + items: items.map((T item) { + return DropdownMenuItem( + value: item, + child: Text(item.toString()), + ); + }).toList(), + decoration: const InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(5.0)), + borderSide: BorderSide(color: Colors.grey), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(5.0)), + borderSide: BorderSide(color: Colors.grey), + ), + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_text_field.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_text_field.dart new file mode 100644 index 0000000..bf608ea --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/custom_text_field.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; + +import 'spaces.dart'; + +class CustomTextField extends StatelessWidget { + final TextEditingController controller; + final String label; + final Function(String value)? onChanged; + final bool obscureText; + final TextInputType? keyboardType; + final bool showLabel; + final Widget? suffixIcon; + final bool readOnly; +final Widget? prefixIcon; + + const CustomTextField({ + super.key, + required this.controller, + required this.label, + this.onChanged, + this.obscureText = false, + this.keyboardType, + this.showLabel = true, + this.suffixIcon, + this.prefixIcon, + this.readOnly = false, + }); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (showLabel) ...[ + Text( + label, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w700, + ), + ), + const SpaceHeight(12.0), + ], + TextFormField( + controller: controller, + onChanged: onChanged, + obscureText: obscureText, + keyboardType: keyboardType, + readOnly: readOnly, + decoration: InputDecoration( + prefixIcon: prefixIcon, + suffixIcon: suffixIcon, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(5.0)), + borderSide: BorderSide(color: Colors.grey), + ), + enabledBorder: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(5.0)), + borderSide: BorderSide(color: Colors.grey), + ), + hintText: label, + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/dashed_line.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/dashed_line.dart new file mode 100644 index 0000000..c2af56f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/dashed_line.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +class DashedLine extends StatelessWidget { + const DashedLine({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + children: List.generate( + 400 ~/ 10, + (index) => Expanded( + child: Container( + color: index % 2 == 1 ? Colors.transparent : Colors.grey, + height: 1, + ), + ), + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/image_picker_widget.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/image_picker_widget.dart new file mode 100644 index 0000000..798411c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/image_picker_widget.dart @@ -0,0 +1,104 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; + +import '../assets/assets.gen.dart'; +import '../constants/colors.dart'; +import 'buttons.dart'; +import 'spaces.dart'; + +class ImagePickerWidget extends StatefulWidget { + final String label; + final void Function(XFile? file) onChanged; + final bool showLabel; + + const ImagePickerWidget({ + super.key, + required this.label, + required this.onChanged, + this.showLabel = true, + }); + + @override + State createState() => _ImagePickerWidgetState(); +} + +class _ImagePickerWidgetState extends State { + String? imagePath; + + Future _pickImage() async { + final pickedFile = await ImagePicker().pickImage( + source: ImageSource.gallery, + ); + + setState(() { + if (pickedFile != null) { + imagePath = pickedFile.path; + widget.onChanged(pickedFile); + } else { + debugPrint('No image selected.'); + widget.onChanged(null); + } + }); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (widget.showLabel) ...[ + Text( + widget.label, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w700, + ), + ), + const SpaceHeight(12.0), + ], + Container( + padding: const EdgeInsets.all(6.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.0), + border: Border.all(color: AppColors.primary), + ), + child: Row( + children: [ + SizedBox( + width: 80.0, + height: 80.0, + child: ClipRRect( + borderRadius: BorderRadius.circular(10.0), + child: imagePath != null + ? Image.file( + File(imagePath!), + fit: BoxFit.cover, + ) + : Container( + padding: const EdgeInsets.all(16.0), + color: AppColors.black.withOpacity(0.05), + child: Assets.icons.image.svg(), + ), + ), + ), + const Spacer(), + Padding( + padding: const EdgeInsets.only(right: 4.0), + child: Button.filled( + height: 30.0, + width: 127.0, + onPressed: _pickImage, + label: 'Choose Photo', + fontSize: 10.0, + borderRadius: 5.0, + ), + ), + ], + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/menu_button.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/menu_button.dart new file mode 100644 index 0000000..85ec2a7 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/menu_button.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/build_context_ext.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +import '../constants/colors.dart'; +import 'spaces.dart'; + +class MenuButton extends StatelessWidget { + final String iconPath; + final String label; + final bool isActive; + final VoidCallback onPressed; + final bool isImage; + final double size; + + const MenuButton({ + super.key, + this.iconPath = '', + required this.label, + this.isActive = false, + required this.onPressed, + this.isImage = false, + this.size = 90, + }); + + @override + Widget build(BuildContext context) { + return Flexible( + child: InkWell( + onTap: onPressed, + borderRadius: const BorderRadius.all(Radius.circular(6.0)), + child: Container( + width: context.deviceWidth, + padding: const EdgeInsets.all(4.0), + decoration: BoxDecoration( + color: isActive ? AppColors.primary : AppColors.white, + borderRadius: const BorderRadius.all(Radius.circular(6.0)), + boxShadow: [ + BoxShadow( + offset: const Offset(0, 4), + blurRadius: 20.0, + blurStyle: BlurStyle.outer, + spreadRadius: 0, + color: AppColors.black.withOpacity(0.1), + ), + ], + ), + child: Column( + children: [ + isImage + ? Image.asset(iconPath, + width: size, height: size, fit: BoxFit.contain) + : SvgPicture.asset( + iconPath, + colorFilter: ColorFilter.mode( + isActive ? AppColors.white : AppColors.primary, + BlendMode.srcIn, + ), + ), + const SpaceHeight(10.0), + Text( + label, + textAlign: TextAlign.center, + style: TextStyle( + color: isActive ? AppColors.white : AppColors.primary, + fontSize: 12, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/pin_input.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/pin_input.dart new file mode 100644 index 0000000..5471199 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/pin_input.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +class PinInput extends StatefulWidget { + final void Function(int value) onDone; + const PinInput({super.key, required this.onDone}); + + @override + State createState() => _PinInputState(); +} + +class _PinInputState extends State { + final List _focusNodes = []; + final List _controllers = []; + + @override + void initState() { + super.initState(); + for (int i = 0; i < 4; i++) { + _focusNodes.add(FocusNode()); + _controllers.add(TextEditingController()); + } + } + + @override + void dispose() { + for (final node in _focusNodes) { + node.dispose(); + } + for (final controller in _controllers) { + controller.dispose(); + } + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: List.generate( + 4, + (index) => SizedBox( + width: 50, + child: TextFormField( + controller: _controllers[index], + focusNode: _focusNodes[index], + keyboardType: TextInputType.number, + maxLength: 1, + textAlign: TextAlign.center, + decoration: const InputDecoration( + counterText: '', + border: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(5.0)), + borderSide: BorderSide(color: Colors.grey), + ), + ), + onChanged: (value) { + if (value.isNotEmpty && index < 3) { + _focusNodes[index].unfocus(); + FocusScope.of(context).requestFocus(_focusNodes[index + 1]); + } else if (value.isEmpty && index != 0) { + _focusNodes[index].unfocus(); + FocusScope.of(context).requestFocus(_focusNodes[index - 1]); + _controllers[index - 1].selection = TextSelection( + baseOffset: 0, + extentOffset: _controllers[index - 1].text.length, + ); + } + + if (index == 3) { + final code1 = _controllers[0].text; + final code2 = _controllers[1].text; + final code3 = _controllers[2].text; + final code4 = _controllers[3].text; + final allCode = code1 + code2 + code3 + code4; + final pin = int.parse(allCode); + if (allCode.length == 4) { + widget.onDone(pin); + } + } + }, + ), + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/search_input.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/search_input.dart new file mode 100644 index 0000000..210b11f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/search_input.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; + +import '../constants/colors.dart'; + + +class SearchInput extends StatelessWidget { + final TextEditingController controller; + final Function(String value)? onChanged; + final VoidCallback? onTap; + + const SearchInput({ + super.key, + required this.controller, + this.onChanged, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: AppColors.white, + borderRadius: BorderRadius.circular(10.0), + ), + child: TextFormField( + onTap: onTap, + readOnly: onTap != null, + controller: controller, + onChanged: onChanged, + decoration: InputDecoration( + hintText: 'Cari Produk di sini', + suffixIcon: const Icon(Icons.search), + contentPadding: const EdgeInsets.all(16.0), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10.0), + borderSide: const BorderSide(color: AppColors.light), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10.0), + borderSide: const BorderSide(color: AppColors.light), + ), + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/search_input_pos.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/search_input_pos.dart new file mode 100644 index 0000000..75626b0 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/search_input_pos.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import '../constants/colors.dart'; + +class SearchInput extends StatelessWidget { + final TextEditingController controller; + final Function(String value)? onChanged; + final VoidCallback? onTap; + final String hintText; + + const SearchInput({ + super.key, + required this.controller, + this.onChanged, + this.onTap, + this.hintText = 'Cari di sini', + }); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: AppColors.white, + borderRadius: BorderRadius.circular(8.0), + ), + child: TextFormField( + onTap: onTap, + readOnly: onTap != null, + controller: controller, + onChanged: onChanged, + decoration: InputDecoration( + hintText: hintText, + prefixIcon: const Icon( + Icons.search, + color: AppColors.primary, + ), + contentPadding: const EdgeInsets.all(16.0), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8.0), + borderSide: const BorderSide(color: Colors.grey), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8.0), + borderSide: const BorderSide(color: Colors.grey), + ), + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/components/spaces.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/components/spaces.dart new file mode 100644 index 0000000..7975925 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/components/spaces.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class SpaceHeight extends StatelessWidget { + final double height; + const SpaceHeight(this.height, {super.key}); + + @override + Widget build(BuildContext context) => SizedBox(height: height); +} + +class SpaceWidth extends StatelessWidget { + final double width; + const SpaceWidth(this.width, {super.key}); + + @override + Widget build(BuildContext context) => SizedBox(width: width); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/constants/colors.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/constants/colors.dart new file mode 100644 index 0000000..fdc99d6 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/constants/colors.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +class AppColors { + /// primary = #51B1A6 + static const Color primary = Color(0xff51B1A6); + + /// grey = #6C757D + static const Color grey = Color(0xff6C757D); + + /// light = #E4E7EE + static const Color light = Color(0xffE4E7EE); + + /// black = #000000 + static const Color black = Color(0xff000000); + + /// white = #FFFFFF + static const Color white = Color(0xffFFFFFF); + + /// red = #D34459 + static const Color red = Color(0xffD34459); + + /// stroke = #E5E8EE + static const Color stroke = Color(0xffE5E8EE); + + /// bgLogin = #EDEDED + static const Color bgLogin = Color(0xffEDEDED); + + static const Color disabled = Color(0xffC8D1E1); + + static const Color card = Color(0xffE5E5E5); + + static const Color blueLight = Color(0xffC7D0EB); + + static const Color green = Color(0xff50C474); + + static const Color subtitle = Color(0xff7890CD); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/constants/formatting.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/constants/formatting.dart new file mode 100644 index 0000000..8073229 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/constants/formatting.dart @@ -0,0 +1,20 @@ +import 'package:intl/intl.dart'; + +String utcToLocal( + String value, { + bool hasTime = true, +}) { + try { + DateTime parsed = parseDateTime(value); + + return hasTime + ? DateFormat.yMd().add_jms().format(parsed) + : DateFormat.yMd().format(parsed); + } catch (_) { + return 'Invalid DateTime'; + } +} + +DateTime parseDateTime(String value) { + return DateFormat("yyyy-MM-ddTHH:mm:ssZ").parseUTC(value).toLocal(); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/constants/global_variable.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/constants/global_variable.dart new file mode 100644 index 0000000..840b337 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/constants/global_variable.dart @@ -0,0 +1,8 @@ +class GlobalVariable { + static const String baseUrl = 'http://192.168.43.65:8000'; + static String baseUrlImage = '$baseUrl/storage/'; + static String uploadBaseUrlImage = + '$baseUrl/storage/data/user/0/com.example.flutter_pos_ecommerce/cache/'; + static String baseUrlImageCategories = '$baseUrl/storage/'; + static String rajaOngkirKey = '605b5ffe8851b1b8ce0ef3639d2e673c'; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/core.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/core.dart new file mode 100644 index 0000000..b65a51a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/core.dart @@ -0,0 +1,4 @@ +export 'assets/assets.gen.dart'; +// export 'configs/router/app_router.dart'; +export 'constants/colors.dart'; +export 'extensions/int_ext.dart'; diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/build_context_ext copy.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/build_context_ext copy.dart new file mode 100644 index 0000000..313c912 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/build_context_ext copy.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +extension BuildContextExt on BuildContext { + double get deviceHeight => MediaQuery.of(this).size.height; + + double get deviceWidth => MediaQuery.of(this).size.width; +} + +extension NavigatorExt on BuildContext { + void pop([T? result]) { + Navigator.pop(this, result); + } + + void popToRoot() { + Navigator.popUntil(this, (route) => route.isFirst); + } + + Future push(Widget widget, [String? name]) async { + return Navigator.push( + this, + MaterialPageRoute( + builder: (context) => widget, + settings: RouteSettings(name: name), + ), + ); + } + + Future pushReplacement( + Widget widget) async { + return Navigator.pushReplacement( + this, + MaterialPageRoute(builder: (context) => widget), + ); + } + + Future pushAndRemoveUntil( + Widget widget, bool Function(Route route) predicate) async { + return Navigator.pushAndRemoveUntil( + this, + MaterialPageRoute(builder: (context) => widget), + predicate, + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/build_context_ext.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/build_context_ext.dart new file mode 100644 index 0000000..313c912 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/build_context_ext.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +extension BuildContextExt on BuildContext { + double get deviceHeight => MediaQuery.of(this).size.height; + + double get deviceWidth => MediaQuery.of(this).size.width; +} + +extension NavigatorExt on BuildContext { + void pop([T? result]) { + Navigator.pop(this, result); + } + + void popToRoot() { + Navigator.popUntil(this, (route) => route.isFirst); + } + + Future push(Widget widget, [String? name]) async { + return Navigator.push( + this, + MaterialPageRoute( + builder: (context) => widget, + settings: RouteSettings(name: name), + ), + ); + } + + Future pushReplacement( + Widget widget) async { + return Navigator.pushReplacement( + this, + MaterialPageRoute(builder: (context) => widget), + ); + } + + Future pushAndRemoveUntil( + Widget widget, bool Function(Route route) predicate) async { + return Navigator.pushAndRemoveUntil( + this, + MaterialPageRoute(builder: (context) => widget), + predicate, + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/date_time_ext.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/date_time_ext.dart new file mode 100644 index 0000000..279db9c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/date_time_ext.dart @@ -0,0 +1,25 @@ +extension DateTimeExt on DateTime { + String toFormattedTime() { + final List monthNames = [ + 'Januari', + 'Februari', + 'Maret', + 'April', + 'Mei', + 'Juni', + 'Juli', + 'Agustus', + 'September', + 'Oktober', + 'November', + 'Desember' + ]; + + final int hour12 = hour % 12; + final String monthName = monthNames[month - 1]; + + return '$day $monthName, ${hour12.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}'; + } + + +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/date_time_ext2.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/date_time_ext2.dart new file mode 100644 index 0000000..ebf8b60 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/date_time_ext2.dart @@ -0,0 +1,50 @@ +const List _dayNames = [ + 'Minggu', + 'Senin', + 'Selasa', + 'Rabu', + 'Kamis', + 'Jumat', + 'Sabtu' +]; + +const List _monthNames = [ + 'Januari', + 'Februari', + 'Maret', + 'April', + 'Mei', + 'Juni', + 'Juli', + 'Agustus', + 'September', + 'Oktober', + 'November', + 'Desember' +]; + +extension DateTimeExt on DateTime { + String toFormattedTime() { + final int hour12 = hour % 12; + final String monthName = _monthNames[month - 1]; + + return '$day $monthName, ${hour12.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}'; + } + + String toFormattedDate() { + String dayName = _dayNames[weekday - 1]; + String day = this.day.toString(); + String month = _monthNames[this.month - 1]; + String year = this.year.toString(); + + return '$dayName, $day $month $year'; + } + + String toFormattedDate2() { + String day = this.day.toString(); + String month = _monthNames[this.month - 1]; + String year = this.year.toString(); + + return '$day $month $year'; + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/int_ext.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/int_ext.dart new file mode 100644 index 0000000..df5882f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/int_ext.dart @@ -0,0 +1,9 @@ +import 'package:intl/intl.dart'; + +extension IntegerExt on num { + String get currencyFormatRp => NumberFormat.currency( + locale: 'id', + symbol: 'Rp ', + decimalDigits: 0, + ).format(this); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/string_ext.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/string_ext.dart new file mode 100644 index 0000000..516ef37 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/extensions/string_ext.dart @@ -0,0 +1,7 @@ +extension StringExt on String { + int get toIntegerFromText { + final cleanedText = replaceAll(RegExp(r'[^0-9]'), ''); + final parsedValue = int.tryParse(cleanedText) ?? 0; + return parsedValue; + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/router/app_router.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/router/app_router.dart new file mode 100644 index 0000000..1308f00 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/router/app_router.dart @@ -0,0 +1,279 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/orders/pages/metode_pembayaran_page.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/pages/dashboard_page.dart'; +import 'package:go_router/go_router.dart'; + +import '../../module/ecommerce/presentation/address/models/address_model.dart'; +import '../../module/ecommerce/presentation/address/pages/add_address_page.dart'; +import '../../module/ecommerce/presentation/address/pages/address_page.dart'; +import '../../module/ecommerce/presentation/address/pages/edit_address_page.dart'; +import '../../module/ecommerce/presentation/auth/pages/login_page.dart'; +import '../../module/ecommerce/presentation/auth/pages/register_page.dart'; +import '../../module/ecommerce/presentation/home/pages/dashboard_page.dart'; +import '../../module/ecommerce/presentation/home/pages/detail_product_page.dart'; +import '../../module/ecommerce/presentation/intro/splash_page.dart'; +import '../../module/ecommerce/presentation/orders/pages/cart_page.dart'; +import '../../module/ecommerce/presentation/orders/pages/history_order_page.dart'; +import '../../module/ecommerce/presentation/orders/pages/order_detail_page.dart'; +import '../../module/ecommerce/presentation/orders/pages/payment_detail_page.dart'; +import '../../module/ecommerce/presentation/orders/pages/payment_witing_page.dart'; +import '../../module/ecommerce/presentation/orders/pages/shipping_detail_page.dart'; +import '../../module/ecommerce/presentation/orders/pages/tracking_order_page.dart'; + +// import '../../../ui/address/models/address_model.dart'; +// import '../../../ui/address/pages/add_address_page.dart'; +// import '../../../ui/address/pages/address_page.dart'; +// import '../../../ui/address/pages/edit_address_page.dart'; +// import '../../../ui/auth/pages/login_page.dart'; +// import '../../../ui/auth/pages/register_page.dart'; +// import '../../../ui/auth/pages/verification_page.dart'; +// import '../../../ui/home/models/product_model.dart'; +// import '../../../ui/home/pages/product_detail_page.dart'; +// import '../../../ui/home/pages/root_page.dart'; +// import '../../../ui/intro/splash_page.dart'; +// import '../../../ui/orders/pages/cart_page.dart'; +// import '../../../ui/orders/pages/order_detail_page.dart'; +// import '../../../ui/orders/pages/payment_detail_page.dart'; +// import '../../../ui/orders/pages/shipping_detail_page.dart'; +// import '../../../ui/orders/pages/tracking_order_page.dart'; + +part 'route_constants.dart'; +part 'enums/root_tab.dart'; +part 'models/path_parameters.dart'; + +class AppRouter { + final router = GoRouter( + initialLocation: RouteConstants.splashPath, + routes: [ + GoRoute( + name: RouteConstants.splash, + path: RouteConstants.splashPath, + builder: (context, state) => const SplashPage(), + ), + GoRoute( + name: RouteConstants.dashboardPos, + path: RouteConstants.dashboardPosPath, + builder: (context, state) => const DashboardPosPage(), + ), + GoRoute( + name: RouteConstants.login, + path: RouteConstants.loginPath, + builder: (context, state) => const LoginPage(), + routes: [ + // GoRoute( + // name: RouteConstants.verification, + // path: RouteConstants.verificationPath, + // builder: (context, state) => const VerificationPage(), + // ), + GoRoute( + name: RouteConstants.register, + path: RouteConstants.registerPath, + builder: (context, state) => const RegisterPage(), + ), + ], + ), + GoRoute( + name: RouteConstants.root, + path: RouteConstants.rootPath, + builder: (context, state) { + final tab = int.tryParse(state.pathParameters['root_tab'] ?? '') ?? 0; + return DashboardPage( + key: state.pageKey, + currentTab: tab, + ); + }, + routes: [ + GoRoute( + name: RouteConstants.orderList, + path: RouteConstants.orderListPath, + builder: (context, state) => const HistoryOrderPage(), + ), + GoRoute( + name: RouteConstants.metodePembayaran, + path: RouteConstants.metodePembayaran, + builder: (context, state) => const BankTransferPage(), + ), + GoRoute( + name: RouteConstants.productDetail, + path: RouteConstants.productDetailPath, + builder: (context, state) { + // final arg = state.extra as Product; + final args = state.extra as int; + return DetailProductPage( + productId: args, + // detailProduct: arg, + ); + }, + ), + GoRoute( + name: RouteConstants.cart, + path: RouteConstants.cartPath, + builder: (context, state) => const CartPage(), + routes: [ + GoRoute( + name: RouteConstants.orderDetail, + path: RouteConstants.orderDetailPath, + builder: (context, state) => const OrderDetailPage(), + routes: [ + GoRoute( + name: RouteConstants.paymentDetail, + path: RouteConstants.paymentDetailPath, + builder: (context, state) => const PaymentDetailPage(), + routes: [ + GoRoute( + name: RouteConstants.paymentWaiting, + path: RouteConstants.paymentWaitingPath, + builder: (context, state) { + final args = state.extra as int; + + return PaymentWaitingPage(orderId: args); + }, + ), + GoRoute( + name: RouteConstants.trackingOrder, + path: RouteConstants.trackingOrderPath, + builder: (context, state) { + final args = state.extra as int; + return TrackingOrderPage(orderId: args); + }, + routes: [ + GoRoute( + name: RouteConstants.shippingDetail, + path: RouteConstants.shippingDetailPath, + builder: (context, state) { + final args = state.extra as String; + return ShippingDetailPage(resi: args); + }, + ), + ], + ), + ], + ), + ], + // routes: [ + // GoRoute( + // name: RouteConstants.paymentDetail, + // path: RouteConstants.paymentDetailPath, + // builder: (context, state) => const PaymentDetailPage(), + // routes: [ + // GoRoute( + // name: RouteConstants.trackingOrder, + // path: RouteConstants.trackingOrderPath, + // builder: (context, state) => const TrackingOrderPage(), + // routes: [ + // GoRoute( + // name: RouteConstants.shippingDetail, + // path: RouteConstants.shippingDetailPath, + // builder: (context, state) => + // const ShippingDetailPage(), + // ), + // ], + // ), + // ], + // ), + // ], + ), + ], + ), + GoRoute( + name: RouteConstants.address, + path: RouteConstants.addressPath, + builder: (context, state) => const AddressPage(), + routes: [ + GoRoute( + name: RouteConstants.addAddress, + path: RouteConstants.addAddressPath, + builder: (context, state) => const AddAddressPage(), + ), + GoRoute( + name: RouteConstants.editAddress, + path: RouteConstants.editAddressPath, + builder: (context, state) { + final args = state.extra as AddressModel; + return EditAddressPage(data: args); + }, + ), + ], + ), + ], + ), + + // routes: [ + // GoRoute( + // name: RouteConstants.productDetail, + // path: RouteConstants.productDetailPath, + // builder: (context, state) { + // final args = state.extra as ProductModel; + // return ProductDetailPage(data: args); + // }, + // ), + // GoRoute( + // name: RouteConstants.cart, + // path: RouteConstants.cartPath, + // builder: (context, state) => const CartPage(), + // ), + // GoRoute( + // name: RouteConstants.address, + // path: RouteConstants.addressPath, + // builder: (context, state) => const AddressPage(), + // routes: [ + // GoRoute( + // name: RouteConstants.addAddress, + // path: RouteConstants.addAddressPath, + // builder: (context, state) => const AddAddressPage(), + // ), + // GoRoute( + // name: RouteConstants.editAddress, + // path: RouteConstants.editAddressPath, + // builder: (context, state) { + // final args = state.extra as AddressModel; + // return EditAddressPage(data: args); + // }, + // ), + // GoRoute( + // name: RouteConstants.orderDetail, + // path: RouteConstants.orderDetailPath, + // builder: (context, state) => const OrderDetailPage(), + // routes: [ + // GoRoute( + // name: RouteConstants.paymentDetail, + // path: RouteConstants.paymentDetailPath, + // builder: (context, state) => const PaymentDetailPage(), + // routes: [ + // GoRoute( + // name: RouteConstants.trackingOrder, + // path: RouteConstants.trackingOrderPath, + // builder: (context, state) => const TrackingOrderPage(), + // routes: [ + // GoRoute( + // name: RouteConstants.shippingDetail, + // path: RouteConstants.shippingDetailPath, + // builder: (context, state) => + // const ShippingDetailPage(), + // ), + // ], + // ), + // ], + // ), + // ], + // ), + // ], + // ), + // ], + // ), + ], + errorPageBuilder: (context, state) { + return MaterialPage( + key: state.pageKey, + child: Scaffold( + body: Center( + child: Text( + state.error.toString(), + textAlign: TextAlign.center, + ), + ), + ), + ); + }, + ); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/router/enums/root_tab.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/router/enums/root_tab.dart new file mode 100644 index 0000000..1e3d300 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/router/enums/root_tab.dart @@ -0,0 +1,18 @@ +part of '../app_router.dart'; + +enum RootTab { + home('0'), + explore('1'), + order('2'), + account('3'); + + final String value; + const RootTab(this.value); + + factory RootTab.fromIndex(int index) { + return values.firstWhere( + (value) => value.value == '$index', + orElse: () => RootTab.home, + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/router/models/path_parameters.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/router/models/path_parameters.dart new file mode 100644 index 0000000..6f9c3f6 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/router/models/path_parameters.dart @@ -0,0 +1,15 @@ +part of '../app_router.dart'; + +class PathParameters { + final RootTab rootTab; + + PathParameters({ + this.rootTab = RootTab.home, + }); + + Map toMap() { + return { + 'root_tab': rootTab.value, + }; + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/core/router/route_constants.dart b/FrontEnd/flutter_pos_ecommerce/lib/core/router/route_constants.dart new file mode 100644 index 0000000..1179d25 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/core/router/route_constants.dart @@ -0,0 +1,73 @@ +part of 'app_router.dart'; + +class RouteConstants { + /// route for page [SplashPage] + static const String splash = 'splash'; + static const String splashPath = '/splash'; + + static const String dashboardPos = 'dashboardPos'; + static const String dashboardPosPath = '/dashboardPos'; + + /// route for page [LoginPage] + static const String login = 'login'; + static const String loginPath = '/login'; + + /// route for page [RegisterPage] + static const String register = 'register'; + static const String registerPath = 'register'; + + /// route for page [VerificationPage] + static const String verification = 'verification'; + static const String verificationPath = 'verification'; + + /// route for page [DashboardPage] + static const String root = 'root'; + static const String rootPath = '/:root_tab'; + + /// route for page [ProductDetailPage] + static const String productDetail = 'product_detail'; + static const String productDetailPath = 'product_detail'; + + /// route for page [CartPage] + static const String cart = 'cart'; + static const String cartPath = 'cart'; + + /// route for page [AddressPage] + static const String address = 'address'; + static const String addressPath = 'address'; + + /// route for page [AddAddressPage] + static const String addAddress = 'add-address'; + static const String addAddressPath = 'add-address'; + + /// route for page [EditAddressPage] + static const String editAddress = 'edit-address'; + static const String editAddressPath = 'edit-address'; + + /// route for page [OrderDetailPage] + static const String orderDetail = 'order_detail'; + static const String orderDetailPath = 'order_detail'; + + /// route for page [PaymentDetailPage] + static const String paymentDetail = 'payment_detail'; + static const String paymentDetailPath = 'payment_detail'; + + /// route for page [TrackingOrderPage] + static const String trackingOrder = 'tracking_order'; + static const String trackingOrderPath = 'tracking_order'; + + /// route for page [ShippingDetailPage] + static const String shippingDetail = 'shipping_detail'; + static const String shippingDetailPath = 'shipping_detail'; + + /// route for page [PaymentWaitingPage] + static const String paymentWaiting = 'payment_waiting'; + static const String paymentWaitingPath = 'payment_waiting'; + + /// route for page [OrderPage] + static const String orderList = 'order_list'; + static const String orderListPath = 'order_list'; + + // + static const String metodePembayaran = 'metodePembayaran'; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/firebase_options.dart b/FrontEnd/flutter_pos_ecommerce/lib/firebase_options.dart new file mode 100644 index 0000000..e917130 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/firebase_options.dart @@ -0,0 +1,86 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + return macos; + case TargetPlatform.windows: + return windows; + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions web = FirebaseOptions( + apiKey: 'AIzaSyCq4AiUzCgl-z6_QIoN_ZM-3pO4CCkJiSs', + appId: '1:262926188813:web:7ec9d28470b7b2360ab044', + messagingSenderId: '262926188813', + projectId: 'chat-app-20117', + authDomain: 'chat-app-20117.firebaseapp.com', + storageBucket: 'chat-app-20117.appspot.com', + ); + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyAbCNqoxcUko5hGM0Ss9AyN86n-W46yU80', + appId: '1:262926188813:android:840cd3bd354a95190ab044', + messagingSenderId: '262926188813', + projectId: 'chat-app-20117', + storageBucket: 'chat-app-20117.appspot.com', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyD3Tlue7A3y5_RrLHbpT17Vmia9ileUWgE', + appId: '1:262926188813:ios:1a927ccd8013e3ac0ab044', + messagingSenderId: '262926188813', + projectId: 'chat-app-20117', + storageBucket: 'chat-app-20117.appspot.com', + iosBundleId: 'com.example.flutterPosEcommerce', + ); + + static const FirebaseOptions macos = FirebaseOptions( + apiKey: 'AIzaSyD3Tlue7A3y5_RrLHbpT17Vmia9ileUWgE', + appId: '1:262926188813:ios:1a927ccd8013e3ac0ab044', + messagingSenderId: '262926188813', + projectId: 'chat-app-20117', + storageBucket: 'chat-app-20117.appspot.com', + iosBundleId: 'com.example.flutterPosEcommerce', + ); + + static const FirebaseOptions windows = FirebaseOptions( + apiKey: 'AIzaSyCq4AiUzCgl-z6_QIoN_ZM-3pO4CCkJiSs', + appId: '1:262926188813:web:e4c1abc6a4507a380ab044', + messagingSenderId: '262926188813', + projectId: 'chat-app-20117', + authDomain: 'chat-app-20117.firebaseapp.com', + storageBucket: 'chat-app-20117.appspot.com', + ); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/main.dart b/FrontEnd/flutter_pos_ecommerce/lib/main.dart new file mode 100644 index 0000000..0a9f4e6 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/main.dart @@ -0,0 +1,201 @@ +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/firebase_options.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/address_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/category_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/discount_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/firebase_messaging_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/order_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/rajaongkir_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/address/bloc/add_address/add_address_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/address/bloc/address/address_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/address/bloc/city/city_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/address/bloc/province/province_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/auth/bloc/login/login_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/auth/bloc/logout/logout_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/auth/bloc/register/register_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/benih/benih_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/category/category_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/detail_product/detail_product_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/pestisida/pestisida_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/pupuk/pupuk_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/orders/bloc/cost/cost_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/orders/bloc/history_order/history_order_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/orders/bloc/order/order_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/orders/bloc/status_order/status_order_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/orders/bloc/tracking/tracking_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/history/bloc/bloc/history_pos_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/local_product/local_product_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/order/bloc/order_pos/order_pos_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/report/bloc/transaction_report/transaction_report_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/bloc/add_discount/add_discount_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/bloc/discount/discount_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/bloc/profile/profile_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/bloc/sync_order/sync_order_bloc.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'firebase_options.dart'; + +import 'core/constants/colors.dart'; +import 'core/router/app_router.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + await FirebaseMessagingRemoteDatasource().initialize(); + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + final appRouter = AppRouter(); + final router = appRouter.router; + return MultiBlocProvider( + providers: [ + BlocProvider( + create: (context) => CategoryBloc(CategoryRemoteDatasource()), + ), + BlocProvider( + create: (context) => AllProductBloc(ProductRemoteDatasource()) + ..add(const AllProductEvent.getAllProducts()), + ), + BlocProvider( + create: (context) => BenihBloc(ProductRemoteDatasource()), + ), + BlocProvider( + create: (context) => PupukBloc(ProductRemoteDatasource()), + ), + BlocProvider( + create: (context) => PestisidaBloc(ProductRemoteDatasource()), + ), + BlocProvider( + create: (context) => AlatPertanianBloc(ProductRemoteDatasource()), + ), + BlocProvider( + create: (context) => CheckoutBloc(), + ), + BlocProvider( + create: (context) => LoginBloc(AuthRemoteDatasource()), + ), + BlocProvider( + create: (context) => ProfileBloc(AuthRemoteDatasource()), + ), + BlocProvider( + create: (context) => RegisterBloc(AuthRemoteDatasource()), + ), + BlocProvider( + create: (context) => LogoutBloc(AuthRemoteDatasource()), + ), + BlocProvider( + create: (context) => AddressBloc(AddressRemoteDatasource()), + ), + BlocProvider( + create: (context) => AddAddressBloc(AddressRemoteDatasource()), + ), + BlocProvider( + create: (context) => ProvinceBloc(RajaongkirRemoteDatasource()), + ), + BlocProvider( + create: (context) => CityBloc(RajaongkirRemoteDatasource()), + ), + BlocProvider( + create: (context) => SubdistrictBloc(RajaongkirRemoteDatasource()), + ), + BlocProvider( + create: (context) => CostBloc(RajaongkirRemoteDatasource()), + ), + BlocProvider( + create: (context) => OrderBloc(OrderRemoteDatasource()), + ), + BlocProvider( + create: (context) => StatusOrderBloc(OrderRemoteDatasource()), + ), + BlocProvider( + create: (context) => HistoryOrderBloc(OrderRemoteDatasource()), + ), + BlocProvider( + create: (context) => OrderDetailBloc(OrderRemoteDatasource()), + ), + BlocProvider( + create: (context) => TrackingBloc(RajaongkirRemoteDatasource()), + ), + BlocProvider( + create: (context) => DetailProductBloc(ProductRemoteDatasource()), + ), + BlocProvider( + create: (context) => + LocalProductBloc(ProductLocalDatasource.instance), + ), + BlocProvider( + create: (context) => CheckoutPosBloc(), + ), + BlocProvider( + create: (context) => OrderPosBloc(), + ), + BlocProvider( + create: (context) => SyncOrderBloc( + OrderRemoteDatasource(), + ), + ), + BlocProvider( + create: (context) => HistoryPosBloc(), + ), + BlocProvider( + create: (context) => DiscountBloc(DiscountRemoteDatasource()), + ), + BlocProvider( + create: (context) => AddDiscountBloc(DiscountRemoteDatasource()), + ), + BlocProvider( + create: (context) => + TransactionReportBloc(ProductLocalDatasource.instance), + ), + ], + child: MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: AppColors.primary), + textTheme: GoogleFonts.dmSansTextTheme( + Theme.of(context).textTheme, + ), + appBarTheme: AppBarTheme( + color: AppColors.white, + titleTextStyle: GoogleFonts.quicksand( + color: AppColors.primary, + fontSize: 18.0, + fontWeight: FontWeight.w700, + ), + iconTheme: const IconThemeData( + color: AppColors.black, + ), + centerTitle: true, + shape: Border( + bottom: BorderSide( + color: AppColors.black.withOpacity(0.05), + ), + ), + ), + ), + routerDelegate: router.routerDelegate, + routeInformationParser: router.routeInformationParser, + routeInformationProvider: router.routeInformationProvider, + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/app_response.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/app_response.dart new file mode 100644 index 0000000..34f2330 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/app_response.dart @@ -0,0 +1,71 @@ +import 'package:equatable/equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'app_response.g.dart'; + +@JsonSerializable(explicitToJson: true, genericArgumentFactories: true) +class AppResponse extends Equatable { + /// The boolean indicates the AppResponse is success or failed + final bool success; + + /// The message of AppResponse description + final String message; + + /// The AppResponse data + final T? data; + + /// StatusCode added by response status code (Not from server) + final int statusCode; + + /// statusMessage added by http response (Not from server) + final String statusMessage; + + const AppResponse._({ + required this.success, + required this.message, + required this.statusCode, + required this.statusMessage, + this.data, + }); + + factory AppResponse({ + required bool success, + required String message, + int? statusCode, + String? statusMessage, + T? data, + }) { + return AppResponse._( + success: success, + message: message, + statusCode: statusCode ?? 200, + statusMessage: statusMessage ?? "The request has succeeded.", + data: data, + ); + } + + @override + List get props { + return [ + success, + message, + data ?? "", + ]; + } + + factory AppResponse.fromJson( + Map json, + T Function(Object? json) fromJsonT, + ) { + return _$AppResponseFromJson(json, fromJsonT); + } + + Map toJson( + Object? Function(T? value) toJsonT, + ) { + return _$AppResponseToJson(this, toJsonT); + } + + @override + bool get stringify => true; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/app_response.g.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/app_response.g.dart new file mode 100644 index 0000000..8475451 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/app_response.g.dart @@ -0,0 +1,43 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'app_response.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +AppResponse _$AppResponseFromJson( + Map json, + T Function(Object? json) fromJsonT, +) => + AppResponse( + success: json['success'] as bool, + message: json['message'] as String, + statusCode: (json['statusCode'] as num?)?.toInt(), + statusMessage: json['statusMessage'] as String?, + data: _$nullableGenericFromJson(json['data'], fromJsonT), + ); + +Map _$AppResponseToJson( + AppResponse instance, + Object? Function(T value) toJsonT, +) => + { + 'success': instance.success, + 'message': instance.message, + 'data': _$nullableGenericToJson(instance.data, toJsonT), + 'statusCode': instance.statusCode, + 'statusMessage': instance.statusMessage, + }; + +T? _$nullableGenericFromJson( + Object? input, + T Function(Object? json) fromJson, +) => + input == null ? null : fromJson(input); + +Object? _$nullableGenericToJson( + T? input, + Object? Function(T value) toJson, +) => + input == null ? null : toJson(input); diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_message_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_message_model.dart new file mode 100644 index 0000000..eac3f2e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_message_model.dart @@ -0,0 +1,33 @@ +import 'package:flutter_pos_ecommerce/core/constants/formatting.dart'; +import 'package:flutter_pos_ecommerce/module/chats/models/user_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:dash_chat_2/dash_chat_2.dart'; + +part 'chat_message_model.freezed.dart'; +part 'chat_message_model.g.dart'; + +@freezed +class ChatMessageEntity with _$ChatMessageEntity { + const ChatMessageEntity._(); + + factory ChatMessageEntity({ + required int id, + @JsonKey(name: "chat_id") required int chatId, + @JsonKey(name: "user_id") required int userId, + required String message, + @JsonKey(name: "created_at") required String createdAt, + @JsonKey(name: "updated_at") required String updatedAt, + required UserEntity user, + }) = _ChatMessageEntity; + + factory ChatMessageEntity.fromJson(Map json) => + _$ChatMessageEntityFromJson(json); + + ChatMessage get toChatMessage { + return ChatMessage( + user: user.toChatUser, + text: message, + createdAt: parseDateTime(createdAt), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_message_model.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_message_model.freezed.dart new file mode 100644 index 0000000..2509f31 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_message_model.freezed.dart @@ -0,0 +1,306 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'chat_message_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +ChatMessageEntity _$ChatMessageEntityFromJson(Map json) { + return _ChatMessageEntity.fromJson(json); +} + +/// @nodoc +mixin _$ChatMessageEntity { + int get id => throw _privateConstructorUsedError; + @JsonKey(name: "chat_id") + int get chatId => throw _privateConstructorUsedError; + @JsonKey(name: "user_id") + int get userId => throw _privateConstructorUsedError; + String get message => throw _privateConstructorUsedError; + @JsonKey(name: "created_at") + String get createdAt => throw _privateConstructorUsedError; + @JsonKey(name: "updated_at") + String get updatedAt => throw _privateConstructorUsedError; + UserEntity get user => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $ChatMessageEntityCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ChatMessageEntityCopyWith<$Res> { + factory $ChatMessageEntityCopyWith( + ChatMessageEntity value, $Res Function(ChatMessageEntity) then) = + _$ChatMessageEntityCopyWithImpl<$Res, ChatMessageEntity>; + @useResult + $Res call( + {int id, + @JsonKey(name: "chat_id") int chatId, + @JsonKey(name: "user_id") int userId, + String message, + @JsonKey(name: "created_at") String createdAt, + @JsonKey(name: "updated_at") String updatedAt, + UserEntity user}); + + $UserEntityCopyWith<$Res> get user; +} + +/// @nodoc +class _$ChatMessageEntityCopyWithImpl<$Res, $Val extends ChatMessageEntity> + implements $ChatMessageEntityCopyWith<$Res> { + _$ChatMessageEntityCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? chatId = null, + Object? userId = null, + Object? message = null, + Object? createdAt = null, + Object? updatedAt = null, + Object? user = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + chatId: null == chatId + ? _value.chatId + : chatId // ignore: cast_nullable_to_non_nullable + as int, + userId: null == userId + ? _value.userId + : userId // ignore: cast_nullable_to_non_nullable + as int, + message: null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + createdAt: null == createdAt + ? _value.createdAt + : createdAt // ignore: cast_nullable_to_non_nullable + as String, + updatedAt: null == updatedAt + ? _value.updatedAt + : updatedAt // ignore: cast_nullable_to_non_nullable + as String, + user: null == user + ? _value.user + : user // ignore: cast_nullable_to_non_nullable + as UserEntity, + ) as $Val); + } + + @override + @pragma('vm:prefer-inline') + $UserEntityCopyWith<$Res> get user { + return $UserEntityCopyWith<$Res>(_value.user, (value) { + return _then(_value.copyWith(user: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$ChatMessageEntityImplCopyWith<$Res> + implements $ChatMessageEntityCopyWith<$Res> { + factory _$$ChatMessageEntityImplCopyWith(_$ChatMessageEntityImpl value, + $Res Function(_$ChatMessageEntityImpl) then) = + __$$ChatMessageEntityImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int id, + @JsonKey(name: "chat_id") int chatId, + @JsonKey(name: "user_id") int userId, + String message, + @JsonKey(name: "created_at") String createdAt, + @JsonKey(name: "updated_at") String updatedAt, + UserEntity user}); + + @override + $UserEntityCopyWith<$Res> get user; +} + +/// @nodoc +class __$$ChatMessageEntityImplCopyWithImpl<$Res> + extends _$ChatMessageEntityCopyWithImpl<$Res, _$ChatMessageEntityImpl> + implements _$$ChatMessageEntityImplCopyWith<$Res> { + __$$ChatMessageEntityImplCopyWithImpl(_$ChatMessageEntityImpl _value, + $Res Function(_$ChatMessageEntityImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? chatId = null, + Object? userId = null, + Object? message = null, + Object? createdAt = null, + Object? updatedAt = null, + Object? user = null, + }) { + return _then(_$ChatMessageEntityImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + chatId: null == chatId + ? _value.chatId + : chatId // ignore: cast_nullable_to_non_nullable + as int, + userId: null == userId + ? _value.userId + : userId // ignore: cast_nullable_to_non_nullable + as int, + message: null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + createdAt: null == createdAt + ? _value.createdAt + : createdAt // ignore: cast_nullable_to_non_nullable + as String, + updatedAt: null == updatedAt + ? _value.updatedAt + : updatedAt // ignore: cast_nullable_to_non_nullable + as String, + user: null == user + ? _value.user + : user // ignore: cast_nullable_to_non_nullable + as UserEntity, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ChatMessageEntityImpl extends _ChatMessageEntity { + _$ChatMessageEntityImpl( + {required this.id, + @JsonKey(name: "chat_id") required this.chatId, + @JsonKey(name: "user_id") required this.userId, + required this.message, + @JsonKey(name: "created_at") required this.createdAt, + @JsonKey(name: "updated_at") required this.updatedAt, + required this.user}) + : super._(); + + factory _$ChatMessageEntityImpl.fromJson(Map json) => + _$$ChatMessageEntityImplFromJson(json); + + @override + final int id; + @override + @JsonKey(name: "chat_id") + final int chatId; + @override + @JsonKey(name: "user_id") + final int userId; + @override + final String message; + @override + @JsonKey(name: "created_at") + final String createdAt; + @override + @JsonKey(name: "updated_at") + final String updatedAt; + @override + final UserEntity user; + + @override + String toString() { + return 'ChatMessageEntity(id: $id, chatId: $chatId, userId: $userId, message: $message, createdAt: $createdAt, updatedAt: $updatedAt, user: $user)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ChatMessageEntityImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.chatId, chatId) || other.chatId == chatId) && + (identical(other.userId, userId) || other.userId == userId) && + (identical(other.message, message) || other.message == message) && + (identical(other.createdAt, createdAt) || + other.createdAt == createdAt) && + (identical(other.updatedAt, updatedAt) || + other.updatedAt == updatedAt) && + (identical(other.user, user) || other.user == user)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash( + runtimeType, id, chatId, userId, message, createdAt, updatedAt, user); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ChatMessageEntityImplCopyWith<_$ChatMessageEntityImpl> get copyWith => + __$$ChatMessageEntityImplCopyWithImpl<_$ChatMessageEntityImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$ChatMessageEntityImplToJson( + this, + ); + } +} + +abstract class _ChatMessageEntity extends ChatMessageEntity { + factory _ChatMessageEntity( + {required final int id, + @JsonKey(name: "chat_id") required final int chatId, + @JsonKey(name: "user_id") required final int userId, + required final String message, + @JsonKey(name: "created_at") required final String createdAt, + @JsonKey(name: "updated_at") required final String updatedAt, + required final UserEntity user}) = _$ChatMessageEntityImpl; + _ChatMessageEntity._() : super._(); + + factory _ChatMessageEntity.fromJson(Map json) = + _$ChatMessageEntityImpl.fromJson; + + @override + int get id; + @override + @JsonKey(name: "chat_id") + int get chatId; + @override + @JsonKey(name: "user_id") + int get userId; + @override + String get message; + @override + @JsonKey(name: "created_at") + String get createdAt; + @override + @JsonKey(name: "updated_at") + String get updatedAt; + @override + UserEntity get user; + @override + @JsonKey(ignore: true) + _$$ChatMessageEntityImplCopyWith<_$ChatMessageEntityImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_message_model.g.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_message_model.g.dart new file mode 100644 index 0000000..f1cd676 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_message_model.g.dart @@ -0,0 +1,31 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'chat_message_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$ChatMessageEntityImpl _$$ChatMessageEntityImplFromJson( + Map json) => + _$ChatMessageEntityImpl( + id: (json['id'] as num).toInt(), + chatId: (json['chat_id'] as num).toInt(), + userId: (json['user_id'] as num).toInt(), + message: json['message'] as String, + createdAt: json['created_at'] as String, + updatedAt: json['updated_at'] as String, + user: UserEntity.fromJson(json['user'] as Map), + ); + +Map _$$ChatMessageEntityImplToJson( + _$ChatMessageEntityImpl instance) => + { + 'id': instance.id, + 'chat_id': instance.chatId, + 'user_id': instance.userId, + 'message': instance.message, + 'created_at': instance.createdAt, + 'updated_at': instance.updatedAt, + 'user': instance.user, + }; diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_model.dart new file mode 100644 index 0000000..bd51d19 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_model.dart @@ -0,0 +1,22 @@ +import 'package:flutter_pos_ecommerce/module/chats/models/chat_message_model.dart'; +import 'package:flutter_pos_ecommerce/module/chats/models/chat_participant_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'chat_model.freezed.dart'; +part 'chat_model.g.dart'; + +@freezed +class ChatEntity with _$ChatEntity { + factory ChatEntity({ + required int id, + String? name, + @JsonKey(name: "is_private") required int isPrivate, + @JsonKey(name: "created_at") required String createdAt, + @JsonKey(name: "updated_at") required String updatedAt, + @JsonKey(name: "last_message") ChatMessageEntity? lastMessage, + required List participants, + }) = _ChatEntity; + + factory ChatEntity.fromJson(Map json) => + _$ChatEntityFromJson(json); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_model.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_model.freezed.dart new file mode 100644 index 0000000..0eda433 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_model.freezed.dart @@ -0,0 +1,325 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'chat_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +ChatEntity _$ChatEntityFromJson(Map json) { + return _ChatEntity.fromJson(json); +} + +/// @nodoc +mixin _$ChatEntity { + int get id => throw _privateConstructorUsedError; + String? get name => throw _privateConstructorUsedError; + @JsonKey(name: "is_private") + int get isPrivate => throw _privateConstructorUsedError; + @JsonKey(name: "created_at") + String get createdAt => throw _privateConstructorUsedError; + @JsonKey(name: "updated_at") + String get updatedAt => throw _privateConstructorUsedError; + @JsonKey(name: "last_message") + ChatMessageEntity? get lastMessage => throw _privateConstructorUsedError; + List get participants => + throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $ChatEntityCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ChatEntityCopyWith<$Res> { + factory $ChatEntityCopyWith( + ChatEntity value, $Res Function(ChatEntity) then) = + _$ChatEntityCopyWithImpl<$Res, ChatEntity>; + @useResult + $Res call( + {int id, + String? name, + @JsonKey(name: "is_private") int isPrivate, + @JsonKey(name: "created_at") String createdAt, + @JsonKey(name: "updated_at") String updatedAt, + @JsonKey(name: "last_message") ChatMessageEntity? lastMessage, + List participants}); + + $ChatMessageEntityCopyWith<$Res>? get lastMessage; +} + +/// @nodoc +class _$ChatEntityCopyWithImpl<$Res, $Val extends ChatEntity> + implements $ChatEntityCopyWith<$Res> { + _$ChatEntityCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = freezed, + Object? isPrivate = null, + Object? createdAt = null, + Object? updatedAt = null, + Object? lastMessage = freezed, + Object? participants = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + isPrivate: null == isPrivate + ? _value.isPrivate + : isPrivate // ignore: cast_nullable_to_non_nullable + as int, + createdAt: null == createdAt + ? _value.createdAt + : createdAt // ignore: cast_nullable_to_non_nullable + as String, + updatedAt: null == updatedAt + ? _value.updatedAt + : updatedAt // ignore: cast_nullable_to_non_nullable + as String, + lastMessage: freezed == lastMessage + ? _value.lastMessage + : lastMessage // ignore: cast_nullable_to_non_nullable + as ChatMessageEntity?, + participants: null == participants + ? _value.participants + : participants // ignore: cast_nullable_to_non_nullable + as List, + ) as $Val); + } + + @override + @pragma('vm:prefer-inline') + $ChatMessageEntityCopyWith<$Res>? get lastMessage { + if (_value.lastMessage == null) { + return null; + } + + return $ChatMessageEntityCopyWith<$Res>(_value.lastMessage!, (value) { + return _then(_value.copyWith(lastMessage: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$ChatEntityImplCopyWith<$Res> + implements $ChatEntityCopyWith<$Res> { + factory _$$ChatEntityImplCopyWith( + _$ChatEntityImpl value, $Res Function(_$ChatEntityImpl) then) = + __$$ChatEntityImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int id, + String? name, + @JsonKey(name: "is_private") int isPrivate, + @JsonKey(name: "created_at") String createdAt, + @JsonKey(name: "updated_at") String updatedAt, + @JsonKey(name: "last_message") ChatMessageEntity? lastMessage, + List participants}); + + @override + $ChatMessageEntityCopyWith<$Res>? get lastMessage; +} + +/// @nodoc +class __$$ChatEntityImplCopyWithImpl<$Res> + extends _$ChatEntityCopyWithImpl<$Res, _$ChatEntityImpl> + implements _$$ChatEntityImplCopyWith<$Res> { + __$$ChatEntityImplCopyWithImpl( + _$ChatEntityImpl _value, $Res Function(_$ChatEntityImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = freezed, + Object? isPrivate = null, + Object? createdAt = null, + Object? updatedAt = null, + Object? lastMessage = freezed, + Object? participants = null, + }) { + return _then(_$ChatEntityImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + isPrivate: null == isPrivate + ? _value.isPrivate + : isPrivate // ignore: cast_nullable_to_non_nullable + as int, + createdAt: null == createdAt + ? _value.createdAt + : createdAt // ignore: cast_nullable_to_non_nullable + as String, + updatedAt: null == updatedAt + ? _value.updatedAt + : updatedAt // ignore: cast_nullable_to_non_nullable + as String, + lastMessage: freezed == lastMessage + ? _value.lastMessage + : lastMessage // ignore: cast_nullable_to_non_nullable + as ChatMessageEntity?, + participants: null == participants + ? _value._participants + : participants // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ChatEntityImpl implements _ChatEntity { + _$ChatEntityImpl( + {required this.id, + this.name, + @JsonKey(name: "is_private") required this.isPrivate, + @JsonKey(name: "created_at") required this.createdAt, + @JsonKey(name: "updated_at") required this.updatedAt, + @JsonKey(name: "last_message") this.lastMessage, + required final List participants}) + : _participants = participants; + + factory _$ChatEntityImpl.fromJson(Map json) => + _$$ChatEntityImplFromJson(json); + + @override + final int id; + @override + final String? name; + @override + @JsonKey(name: "is_private") + final int isPrivate; + @override + @JsonKey(name: "created_at") + final String createdAt; + @override + @JsonKey(name: "updated_at") + final String updatedAt; + @override + @JsonKey(name: "last_message") + final ChatMessageEntity? lastMessage; + final List _participants; + @override + List get participants { + if (_participants is EqualUnmodifiableListView) return _participants; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_participants); + } + + @override + String toString() { + return 'ChatEntity(id: $id, name: $name, isPrivate: $isPrivate, createdAt: $createdAt, updatedAt: $updatedAt, lastMessage: $lastMessage, participants: $participants)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ChatEntityImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.isPrivate, isPrivate) || + other.isPrivate == isPrivate) && + (identical(other.createdAt, createdAt) || + other.createdAt == createdAt) && + (identical(other.updatedAt, updatedAt) || + other.updatedAt == updatedAt) && + (identical(other.lastMessage, lastMessage) || + other.lastMessage == lastMessage) && + const DeepCollectionEquality() + .equals(other._participants, _participants)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash( + runtimeType, + id, + name, + isPrivate, + createdAt, + updatedAt, + lastMessage, + const DeepCollectionEquality().hash(_participants)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ChatEntityImplCopyWith<_$ChatEntityImpl> get copyWith => + __$$ChatEntityImplCopyWithImpl<_$ChatEntityImpl>(this, _$identity); + + @override + Map toJson() { + return _$$ChatEntityImplToJson( + this, + ); + } +} + +abstract class _ChatEntity implements ChatEntity { + factory _ChatEntity( + {required final int id, + final String? name, + @JsonKey(name: "is_private") required final int isPrivate, + @JsonKey(name: "created_at") required final String createdAt, + @JsonKey(name: "updated_at") required final String updatedAt, + @JsonKey(name: "last_message") final ChatMessageEntity? lastMessage, + required final List participants}) = + _$ChatEntityImpl; + + factory _ChatEntity.fromJson(Map json) = + _$ChatEntityImpl.fromJson; + + @override + int get id; + @override + String? get name; + @override + @JsonKey(name: "is_private") + int get isPrivate; + @override + @JsonKey(name: "created_at") + String get createdAt; + @override + @JsonKey(name: "updated_at") + String get updatedAt; + @override + @JsonKey(name: "last_message") + ChatMessageEntity? get lastMessage; + @override + List get participants; + @override + @JsonKey(ignore: true) + _$$ChatEntityImplCopyWith<_$ChatEntityImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_model.g.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_model.g.dart new file mode 100644 index 0000000..4d16343 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_model.g.dart @@ -0,0 +1,34 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'chat_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$ChatEntityImpl _$$ChatEntityImplFromJson(Map json) => + _$ChatEntityImpl( + id: (json['id'] as num).toInt(), + name: json['name'] as String?, + isPrivate: (json['is_private'] as num).toInt(), + createdAt: json['created_at'] as String, + updatedAt: json['updated_at'] as String, + lastMessage: json['last_message'] == null + ? null + : ChatMessageEntity.fromJson( + json['last_message'] as Map), + participants: (json['participants'] as List) + .map((e) => ChatParticipantEntity.fromJson(e as Map)) + .toList(), + ); + +Map _$$ChatEntityImplToJson(_$ChatEntityImpl instance) => + { + 'id': instance.id, + 'name': instance.name, + 'is_private': instance.isPrivate, + 'created_at': instance.createdAt, + 'updated_at': instance.updatedAt, + 'last_message': instance.lastMessage, + 'participants': instance.participants, + }; diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_participant_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_participant_model.dart new file mode 100644 index 0000000..c6a1b71 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_participant_model.dart @@ -0,0 +1,18 @@ +import 'package:flutter_pos_ecommerce/module/chats/models/user_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'chat_participant_model.freezed.dart'; +part 'chat_participant_model.g.dart'; + +@freezed +class ChatParticipantEntity with _$ChatParticipantEntity { + factory ChatParticipantEntity({ + required int id, + @JsonKey(name: "chat_id") required int chatId, + @JsonKey(name: "user_id") required int userId, + required UserEntity user, + }) = _ChatParticipantEntity; + + factory ChatParticipantEntity.fromJson(Map json) => + _$ChatParticipantEntityFromJson(json); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_participant_model.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_participant_model.freezed.dart new file mode 100644 index 0000000..ea94694 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_participant_model.freezed.dart @@ -0,0 +1,239 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'chat_participant_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +ChatParticipantEntity _$ChatParticipantEntityFromJson( + Map json) { + return _ChatParticipantEntity.fromJson(json); +} + +/// @nodoc +mixin _$ChatParticipantEntity { + int get id => throw _privateConstructorUsedError; + @JsonKey(name: "chat_id") + int get chatId => throw _privateConstructorUsedError; + @JsonKey(name: "user_id") + int get userId => throw _privateConstructorUsedError; + UserEntity get user => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $ChatParticipantEntityCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ChatParticipantEntityCopyWith<$Res> { + factory $ChatParticipantEntityCopyWith(ChatParticipantEntity value, + $Res Function(ChatParticipantEntity) then) = + _$ChatParticipantEntityCopyWithImpl<$Res, ChatParticipantEntity>; + @useResult + $Res call( + {int id, + @JsonKey(name: "chat_id") int chatId, + @JsonKey(name: "user_id") int userId, + UserEntity user}); + + $UserEntityCopyWith<$Res> get user; +} + +/// @nodoc +class _$ChatParticipantEntityCopyWithImpl<$Res, + $Val extends ChatParticipantEntity> + implements $ChatParticipantEntityCopyWith<$Res> { + _$ChatParticipantEntityCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? chatId = null, + Object? userId = null, + Object? user = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + chatId: null == chatId + ? _value.chatId + : chatId // ignore: cast_nullable_to_non_nullable + as int, + userId: null == userId + ? _value.userId + : userId // ignore: cast_nullable_to_non_nullable + as int, + user: null == user + ? _value.user + : user // ignore: cast_nullable_to_non_nullable + as UserEntity, + ) as $Val); + } + + @override + @pragma('vm:prefer-inline') + $UserEntityCopyWith<$Res> get user { + return $UserEntityCopyWith<$Res>(_value.user, (value) { + return _then(_value.copyWith(user: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$ChatParticipantEntityImplCopyWith<$Res> + implements $ChatParticipantEntityCopyWith<$Res> { + factory _$$ChatParticipantEntityImplCopyWith( + _$ChatParticipantEntityImpl value, + $Res Function(_$ChatParticipantEntityImpl) then) = + __$$ChatParticipantEntityImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int id, + @JsonKey(name: "chat_id") int chatId, + @JsonKey(name: "user_id") int userId, + UserEntity user}); + + @override + $UserEntityCopyWith<$Res> get user; +} + +/// @nodoc +class __$$ChatParticipantEntityImplCopyWithImpl<$Res> + extends _$ChatParticipantEntityCopyWithImpl<$Res, + _$ChatParticipantEntityImpl> + implements _$$ChatParticipantEntityImplCopyWith<$Res> { + __$$ChatParticipantEntityImplCopyWithImpl(_$ChatParticipantEntityImpl _value, + $Res Function(_$ChatParticipantEntityImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? chatId = null, + Object? userId = null, + Object? user = null, + }) { + return _then(_$ChatParticipantEntityImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + chatId: null == chatId + ? _value.chatId + : chatId // ignore: cast_nullable_to_non_nullable + as int, + userId: null == userId + ? _value.userId + : userId // ignore: cast_nullable_to_non_nullable + as int, + user: null == user + ? _value.user + : user // ignore: cast_nullable_to_non_nullable + as UserEntity, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ChatParticipantEntityImpl implements _ChatParticipantEntity { + _$ChatParticipantEntityImpl( + {required this.id, + @JsonKey(name: "chat_id") required this.chatId, + @JsonKey(name: "user_id") required this.userId, + required this.user}); + + factory _$ChatParticipantEntityImpl.fromJson(Map json) => + _$$ChatParticipantEntityImplFromJson(json); + + @override + final int id; + @override + @JsonKey(name: "chat_id") + final int chatId; + @override + @JsonKey(name: "user_id") + final int userId; + @override + final UserEntity user; + + @override + String toString() { + return 'ChatParticipantEntity(id: $id, chatId: $chatId, userId: $userId, user: $user)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ChatParticipantEntityImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.chatId, chatId) || other.chatId == chatId) && + (identical(other.userId, userId) || other.userId == userId) && + (identical(other.user, user) || other.user == user)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, id, chatId, userId, user); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ChatParticipantEntityImplCopyWith<_$ChatParticipantEntityImpl> + get copyWith => __$$ChatParticipantEntityImplCopyWithImpl< + _$ChatParticipantEntityImpl>(this, _$identity); + + @override + Map toJson() { + return _$$ChatParticipantEntityImplToJson( + this, + ); + } +} + +abstract class _ChatParticipantEntity implements ChatParticipantEntity { + factory _ChatParticipantEntity( + {required final int id, + @JsonKey(name: "chat_id") required final int chatId, + @JsonKey(name: "user_id") required final int userId, + required final UserEntity user}) = _$ChatParticipantEntityImpl; + + factory _ChatParticipantEntity.fromJson(Map json) = + _$ChatParticipantEntityImpl.fromJson; + + @override + int get id; + @override + @JsonKey(name: "chat_id") + int get chatId; + @override + @JsonKey(name: "user_id") + int get userId; + @override + UserEntity get user; + @override + @JsonKey(ignore: true) + _$$ChatParticipantEntityImplCopyWith<_$ChatParticipantEntityImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_participant_model.g.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_participant_model.g.dart new file mode 100644 index 0000000..2926332 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/chat_participant_model.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'chat_participant_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$ChatParticipantEntityImpl _$$ChatParticipantEntityImplFromJson( + Map json) => + _$ChatParticipantEntityImpl( + id: (json['id'] as num).toInt(), + chatId: (json['chat_id'] as num).toInt(), + userId: (json['user_id'] as num).toInt(), + user: UserEntity.fromJson(json['user'] as Map), + ); + +Map _$$ChatParticipantEntityImplToJson( + _$ChatParticipantEntityImpl instance) => + { + 'id': instance.id, + 'chat_id': instance.chatId, + 'user_id': instance.userId, + 'user': instance.user, + }; diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/models.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/models.dart new file mode 100644 index 0000000..b5fddf9 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/models.dart @@ -0,0 +1,5 @@ +export "app_response.dart"; +export "chat_message_model.dart"; +export "chat_participant_model.dart"; +export "chat_model.dart"; +export "user_model.dart"; diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/user_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/user_model.dart new file mode 100644 index 0000000..b528050 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/user_model.dart @@ -0,0 +1,37 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:dash_chat_2/dash_chat_2.dart'; + +part 'user_model.freezed.dart'; +part 'user_model.g.dart'; + +@freezed +class UserEntity with _$UserEntity { + const UserEntity._(); + + factory UserEntity({ + required int id, + required String email, + required String username, + }) = _UserEntity; + + factory UserEntity.fromJson(Map json) => + _$UserEntityFromJson(json); + + ChatUser get toChatUser { + return ChatUser( + id: id.toString(), + firstName: username, + ); + } +} + +@freezed +class AuthUser with _$AuthUser { + factory AuthUser({ + required UserEntity user, + required String token, + }) = _AuthUser; + + factory AuthUser.fromJson(Map json) => + _$AuthUserFromJson(json); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/user_model.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/user_model.freezed.dart new file mode 100644 index 0000000..9a19114 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/user_model.freezed.dart @@ -0,0 +1,356 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'user_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +UserEntity _$UserEntityFromJson(Map json) { + return _UserEntity.fromJson(json); +} + +/// @nodoc +mixin _$UserEntity { + int get id => throw _privateConstructorUsedError; + String get email => throw _privateConstructorUsedError; + String get username => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $UserEntityCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $UserEntityCopyWith<$Res> { + factory $UserEntityCopyWith( + UserEntity value, $Res Function(UserEntity) then) = + _$UserEntityCopyWithImpl<$Res, UserEntity>; + @useResult + $Res call({int id, String email, String username}); +} + +/// @nodoc +class _$UserEntityCopyWithImpl<$Res, $Val extends UserEntity> + implements $UserEntityCopyWith<$Res> { + _$UserEntityCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? email = null, + Object? username = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + username: null == username + ? _value.username + : username // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$UserEntityImplCopyWith<$Res> + implements $UserEntityCopyWith<$Res> { + factory _$$UserEntityImplCopyWith( + _$UserEntityImpl value, $Res Function(_$UserEntityImpl) then) = + __$$UserEntityImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({int id, String email, String username}); +} + +/// @nodoc +class __$$UserEntityImplCopyWithImpl<$Res> + extends _$UserEntityCopyWithImpl<$Res, _$UserEntityImpl> + implements _$$UserEntityImplCopyWith<$Res> { + __$$UserEntityImplCopyWithImpl( + _$UserEntityImpl _value, $Res Function(_$UserEntityImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? email = null, + Object? username = null, + }) { + return _then(_$UserEntityImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + username: null == username + ? _value.username + : username // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$UserEntityImpl extends _UserEntity { + _$UserEntityImpl( + {required this.id, required this.email, required this.username}) + : super._(); + + factory _$UserEntityImpl.fromJson(Map json) => + _$$UserEntityImplFromJson(json); + + @override + final int id; + @override + final String email; + @override + final String username; + + @override + String toString() { + return 'UserEntity(id: $id, email: $email, username: $username)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$UserEntityImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.email, email) || other.email == email) && + (identical(other.username, username) || + other.username == username)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, id, email, username); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$UserEntityImplCopyWith<_$UserEntityImpl> get copyWith => + __$$UserEntityImplCopyWithImpl<_$UserEntityImpl>(this, _$identity); + + @override + Map toJson() { + return _$$UserEntityImplToJson( + this, + ); + } +} + +abstract class _UserEntity extends UserEntity { + factory _UserEntity( + {required final int id, + required final String email, + required final String username}) = _$UserEntityImpl; + _UserEntity._() : super._(); + + factory _UserEntity.fromJson(Map json) = + _$UserEntityImpl.fromJson; + + @override + int get id; + @override + String get email; + @override + String get username; + @override + @JsonKey(ignore: true) + _$$UserEntityImplCopyWith<_$UserEntityImpl> get copyWith => + throw _privateConstructorUsedError; +} + +AuthUser _$AuthUserFromJson(Map json) { + return _AuthUser.fromJson(json); +} + +/// @nodoc +mixin _$AuthUser { + UserEntity get user => throw _privateConstructorUsedError; + String get token => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $AuthUserCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $AuthUserCopyWith<$Res> { + factory $AuthUserCopyWith(AuthUser value, $Res Function(AuthUser) then) = + _$AuthUserCopyWithImpl<$Res, AuthUser>; + @useResult + $Res call({UserEntity user, String token}); + + $UserEntityCopyWith<$Res> get user; +} + +/// @nodoc +class _$AuthUserCopyWithImpl<$Res, $Val extends AuthUser> + implements $AuthUserCopyWith<$Res> { + _$AuthUserCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? user = null, + Object? token = null, + }) { + return _then(_value.copyWith( + user: null == user + ? _value.user + : user // ignore: cast_nullable_to_non_nullable + as UserEntity, + token: null == token + ? _value.token + : token // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } + + @override + @pragma('vm:prefer-inline') + $UserEntityCopyWith<$Res> get user { + return $UserEntityCopyWith<$Res>(_value.user, (value) { + return _then(_value.copyWith(user: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$AuthUserImplCopyWith<$Res> + implements $AuthUserCopyWith<$Res> { + factory _$$AuthUserImplCopyWith( + _$AuthUserImpl value, $Res Function(_$AuthUserImpl) then) = + __$$AuthUserImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({UserEntity user, String token}); + + @override + $UserEntityCopyWith<$Res> get user; +} + +/// @nodoc +class __$$AuthUserImplCopyWithImpl<$Res> + extends _$AuthUserCopyWithImpl<$Res, _$AuthUserImpl> + implements _$$AuthUserImplCopyWith<$Res> { + __$$AuthUserImplCopyWithImpl( + _$AuthUserImpl _value, $Res Function(_$AuthUserImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? user = null, + Object? token = null, + }) { + return _then(_$AuthUserImpl( + user: null == user + ? _value.user + : user // ignore: cast_nullable_to_non_nullable + as UserEntity, + token: null == token + ? _value.token + : token // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$AuthUserImpl implements _AuthUser { + _$AuthUserImpl({required this.user, required this.token}); + + factory _$AuthUserImpl.fromJson(Map json) => + _$$AuthUserImplFromJson(json); + + @override + final UserEntity user; + @override + final String token; + + @override + String toString() { + return 'AuthUser(user: $user, token: $token)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AuthUserImpl && + (identical(other.user, user) || other.user == user) && + (identical(other.token, token) || other.token == token)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, user, token); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AuthUserImplCopyWith<_$AuthUserImpl> get copyWith => + __$$AuthUserImplCopyWithImpl<_$AuthUserImpl>(this, _$identity); + + @override + Map toJson() { + return _$$AuthUserImplToJson( + this, + ); + } +} + +abstract class _AuthUser implements AuthUser { + factory _AuthUser( + {required final UserEntity user, + required final String token}) = _$AuthUserImpl; + + factory _AuthUser.fromJson(Map json) = + _$AuthUserImpl.fromJson; + + @override + UserEntity get user; + @override + String get token; + @override + @JsonKey(ignore: true) + _$$AuthUserImplCopyWith<_$AuthUserImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/user_model.g.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/user_model.g.dart new file mode 100644 index 0000000..bcd7058 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/chats/models/user_model.g.dart @@ -0,0 +1,33 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$UserEntityImpl _$$UserEntityImplFromJson(Map json) => + _$UserEntityImpl( + id: (json['id'] as num).toInt(), + email: json['email'] as String, + username: json['username'] as String, + ); + +Map _$$UserEntityImplToJson(_$UserEntityImpl instance) => + { + 'id': instance.id, + 'email': instance.email, + 'username': instance.username, + }; + +_$AuthUserImpl _$$AuthUserImplFromJson(Map json) => + _$AuthUserImpl( + user: UserEntity.fromJson(json['user'] as Map), + token: json['token'] as String, + ); + +Map _$$AuthUserImplToJson(_$AuthUserImpl instance) => + { + 'user': instance.user, + 'token': instance.token, + }; diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/address_remote_datasource.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/address_remote_datasource.dart new file mode 100644 index 0000000..32b5421 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/address_remote_datasource.dart @@ -0,0 +1,46 @@ +import 'package:flutter_pos_ecommerce/core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/requests/address_request_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/address_response_model.dart'; +import 'package:http/http.dart' as http; +import 'package:dartz/dartz.dart'; + +class AddressRemoteDatasource { + Future> getAddress() async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.get( + Uri.parse('${GlobalVariable.baseUrl}/api/addresses'), + headers: { + 'Authorization': 'Bearer ${authData?.accessToken}', + 'Accept': 'application/json', + }, + ); + if (response.statusCode == 200) { + return Right(AddressResponseModel.fromJson(response.body)); + } else { + return const Left("Internal Server Error"); + } + } + + Future> addAddress(AddressRequestModel data) async { + try { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.post( + Uri.parse('${GlobalVariable.baseUrl}/api/addresses'), + headers: { + 'Authorization': 'Bearer ${authData!.accessToken}', + 'Accept': 'application/json', + 'Content-type': 'application/json', + }, + body: data.toJson(), + ); + if (response.statusCode == 201) { + return const Right('Success'); + } else { + return const Left('Error'); + } + } catch (e) { + return const Left('Error'); + } + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/auth_local_datasource.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/auth_local_datasource.dart new file mode 100644 index 0000000..b4e0c4e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/auth_local_datasource.dart @@ -0,0 +1,47 @@ +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/auth_response_model.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class AuthLocalDatasource { + static String role = "ROLE"; + + static Future getRole() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + String? role = prefs.getString(AuthLocalDatasource.role); + return role ?? ''; + } + + static saveRole(String role) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setString(AuthLocalDatasource.role, role); + } + + Future saveAuthData(AuthResponseModel authResponseModel) async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setString('auth_data', authResponseModel.toJson()); + } + + Future removeAuthData() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.remove('auth_data'); + } + + Future getAuthData() async { + final prefs = await SharedPreferences.getInstance(); + final authData = prefs.getString('auth_data'); + if (authData != null) { + return AuthResponseModel.fromJson(authData); + } else { + return null; + } + } + + Future isAuth() async { + final prefs = await SharedPreferences.getInstance(); + final authData = prefs.getString('auth_data'); + if (authData != null) { + return true; + } else { + return false; + } + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/auth_remote_datasource.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/auth_remote_datasource.dart new file mode 100644 index 0000000..de88d2b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/auth_remote_datasource.dart @@ -0,0 +1,151 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter_pos_ecommerce/core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/auth_response_model.dart'; +import 'package:http/http.dart' as http; +import 'package:dartz/dartz.dart'; + +class AuthRemoteDatasource { + Future> login( + String email, String password) async { + final response = await http.post( + Uri.parse('${GlobalVariable.baseUrl}/api/login'), + body: {'email': email, 'password': password}); + + if (response.statusCode == 200) { + return Right(AuthResponseModel.fromJson(response.body)); + } else { + String res = response.body; + Map resData = jsonDecode(res); + return Left(resData['message']); + } + } + + Future> register( + String name, String email, String phone, String password) async { + final response = await http + .post(Uri.parse('${GlobalVariable.baseUrl}/api/register'), body: { + 'name': name, + 'email': email, + 'phone': phone, + 'password': password + }); + + if (response.statusCode == 201) { + return Right(AuthResponseModel.fromJson(response.body)); + } else { + String res = response.body; + Map resData = jsonDecode(res); + return Left(resData['message']); + } + } + + Future> logout() async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.post( + Uri.parse('${GlobalVariable.baseUrl}/api/logout'), + headers: {'Authorization': 'Bearer ${authData?.accessToken}'}); + if (response.statusCode == 200) { + AuthLocalDatasource().removeAuthData(); + return Right(response.body); + } else { + return Left(response.body); + } + } + + Future> updateFcmToken(String fcmToken) async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.post( + Uri.parse('${GlobalVariable.baseUrl}/api/update-fcm'), + headers: { + 'Authorization': 'Bearer ${authData?.accessToken}', + 'Accept': 'application/json', + }, + body: {'fcm_id': fcmToken}, + ); + + if (response.statusCode == 200) { + return Right(response.body); + } else { + return Left(response.body); + } + } + + Future>> getProfile() async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.get( + Uri.parse('${GlobalVariable.baseUrl}/api/profile'), + headers: { + 'Authorization': 'Bearer ${authData?.accessToken}', + }, + ); + if (response.statusCode == 200) { + return Right(jsonDecode(response.body)); + } else { + return const Left('Failed to fetch profile'); + } + } + + Future> updateProfile({ + required String name, + required String email, + required String phone, + File? foto, + }) async { + final authData = await AuthLocalDatasource().getAuthData(); + + if (foto == null) { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.put( + Uri.parse("${GlobalVariable.baseUrl}/api/profile"), + headers: { + 'Authorization': 'Bearer ${authData!.accessToken}', + 'Accept': 'application/json', + }, + body: {'name': name, 'email': email, 'phone': phone}, + ); + + print(response.body); + if (response.statusCode == 200) { + return const Right('Profile Berhasil di Perbarui'); + } else { + return const Left("Internal Server Error"); + } + } else { + var request = http.MultipartRequest( + 'POST', + Uri.parse('${GlobalVariable.baseUrl}/api/profile'), + ); + + request.headers['Authorization'] = 'Bearer ${authData?.accessToken}'; + + request.fields['name'] = name; + request.fields['email'] = email; + request.fields['phone'] = phone; + + // Periksa apakah foto tidak null + request.files.add( + await http.MultipartFile.fromPath( + 'foto', + foto.path, + ), + ); + + var response = await request.send(); + + if (response.statusCode == 200) { + var responseData = await http.Response.fromStream(response); + print('Response data: ${responseData.body}'); + return const Right('Profile Berhasil di Perbarui'); + } else { + var responseData = await http.Response.fromStream(response); + print('Error response data: ${responseData.body}'); + return const Left('Failed to update profile'); + } + } + } + + +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/category_remote_datasource.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/category_remote_datasource.dart new file mode 100644 index 0000000..161985e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/category_remote_datasource.dart @@ -0,0 +1,17 @@ +import 'package:flutter_pos_ecommerce/core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/category_response_model.dart'; +import 'package:http/http.dart' as http; +import 'package:dartz/dartz.dart'; + +class CategoryRemoteDatasource { + Future> getCategories() async { + final response = await http.get( + Uri.parse("${GlobalVariable.baseUrl}/api/categories"), + ); + if (response.statusCode == 200) { + return Right(CategoryResponseModel.fromJson(response.body)); + } else { + return left("Internal Server Error"); + } + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/discount_remote_datasource.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/discount_remote_datasource.dart new file mode 100644 index 0000000..3ae24e1 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/discount_remote_datasource.dart @@ -0,0 +1,88 @@ +import 'package:flutter_pos_ecommerce/core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/requests/discount_request_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/discount_response_model.dart'; +import 'package:http/http.dart' as http; +import 'package:dartz/dartz.dart'; +import 'dart:convert'; + +class DiscountRemoteDatasource { + Future> getDiscounts() async { + final url = Uri.parse('${GlobalVariable.baseUrl}/api/api-discounts'); + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.get(url, headers: { + 'Authorization': 'Bearer ${authData?.accessToken}', + 'Accept': 'application/json', + }); + + if (response.statusCode == 200) { + return Right(DiscountResponseModel.fromJson(response.body)); + } else { + return const Left('Failed to get discounts'); + } + } + + Future> addDiscount( + String name, + String description, + int value, + ) async { + final url = Uri.parse('${GlobalVariable.baseUrl}/api/api-discounts'); + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.post(url, headers: { + 'Authorization': 'Bearer ${authData?.accessToken}', + 'Accept': 'application/json', + }, body: { + 'name': name, + 'description': description, + 'value': value.toString(), + 'type': 'percentage', + }); + + if (response.statusCode == 201) { + return const Right(true); + } else { + return const Left('Failed to add discount'); + } + } + + Future> updateDiscount( + int id, String name, String description, double value) async { + final url = Uri.parse('${GlobalVariable.baseUrl}/api/api-discounts/$id'); + final authData = await AuthLocalDatasource().getAuthData(); + + final response = await http.put(url, headers: { + 'Authorization': 'Bearer ${authData?.accessToken}', + 'Accept': 'application/json', + }, body: { + 'name': name, + 'description': description, + 'value': value.toString(), + }); + if (response.statusCode == 200) { + return const Right(true); + } else { + return Left( + 'Failed to update discount. Status code: ${response.statusCode}'); + } + } + + Future> deleteDiscount(int id) async { + final url = Uri.parse('${GlobalVariable.baseUrl}/api/api-discounts/$id'); + final authData = await AuthLocalDatasource().getAuthData(); + + final response = await http.delete( + url, + headers: { + 'Authorization': 'Bearer ${authData?.accessToken}', + 'Accept': 'application/json', + }, + ); + + if (response.statusCode == 200) { + return const Right(true); + } else { + return const Left('Failed to delete discount'); + } + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/firebase_messaging_remote_datasource.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/firebase_messaging_remote_datasource.dart new file mode 100644 index 0000000..e693ddb --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/firebase_messaging_remote_datasource.dart @@ -0,0 +1,82 @@ +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_remote_datasource.dart'; + +@pragma('vm:entry-point') +Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { + await Firebase.initializeApp(); + + FirebaseMessagingRemoteDatasource().firebaseBackgroundHandler(message); +} + +class FirebaseMessagingRemoteDatasource { + final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; + final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + + Future initialize() async { + await _firebaseMessaging.requestPermission( + alert: true, badge: true, sound: true); + + const initializationSettingsAndroid = + AndroidInitializationSettings('ic_seller'); + final initializationSettingsIOS = DarwinInitializationSettings( + requestAlertPermission: true, + requestBadgePermission: true, + requestSoundPermission: true, + onDidReceiveLocalNotification: + (int id, String? title, String? body, String? payload) async { + // showNotification(id: id, title: title, body: body, payLoad: payload); + }); + + final initializationSettings = InitializationSettings( + android: initializationSettingsAndroid, iOS: initializationSettingsIOS); + await flutterLocalNotificationsPlugin.initialize(initializationSettings, + onDidReceiveNotificationResponse: + (NotificationResponse notificationResponse) async {}); + final fcmToken = await _firebaseMessaging.getToken(); + + print('Token: $fcmToken'); + + if (await AuthLocalDatasource().isAuth()) { + AuthRemoteDatasource().updateFcmToken(fcmToken!); + } + + FirebaseMessaging.instance.getInitialMessage(); + FirebaseMessaging.onMessage.listen((message) { + print(message.notification?.body); + print(message.notification?.title); + }); + + FirebaseMessaging.onMessage.listen(firebaseBackgroundHandler); + FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); + FirebaseMessaging.onMessageOpenedApp.listen(firebaseBackgroundHandler); + } + + Future showNotification( + {int id = 0, String? title, String? body, String? payLoad}) async { + return flutterLocalNotificationsPlugin.show( + id, + title, + body, + const NotificationDetails( + android: AndroidNotificationDetails( + 'com.example.flutter_pos_ecommerce', 'app', + importance: Importance.max), + iOS: DarwinNotificationDetails(), + ), + ); + } + + Future firebaseBackgroundHandler(RemoteMessage message) async { + showNotification( + title: message.notification!.title, + body: message.notification!.body, + ); + } + + // Future getToken() async { + // return await _firebaseMessaging.getToken(); + // } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/order_remote_datasource.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/order_remote_datasource.dart new file mode 100644 index 0000000..c9d1079 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/order_remote_datasource.dart @@ -0,0 +1,118 @@ +import 'dart:convert'; + +import 'package:dartz/dartz.dart'; +import 'package:flutter_pos_ecommerce/core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/order_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/order/models/order_model.dart'; +import 'package:http/http.dart' as http; + +import '../models/requests/order_request_model.dart'; +import '../models/responses/history_order_response_model.dart'; +import '../models/responses/order_detail_response_model.dart'; + +class OrderRemoteDatasource { + Future> order( + OrderRequestModel orderRequestModel) async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.post( + Uri.parse('${GlobalVariable.baseUrl}/api/order'), + headers: { + 'Accept': 'application/json', + 'Content-type': 'application/json', + 'Authorization': 'Bearer ${authData?.accessToken}' + }, + body: orderRequestModel.toJson(), + ); + print('request : ${orderRequestModel.toJson()}'); + print('response : $response'); + print('response status code : ${response.statusCode}'); + print('response body : ${response.body}'); + + if (response.statusCode == 200) { + return Right(OrderResponseModel.fromJson(response.body)); + } else { + return const Left("Internal Server Error"); + } + } + + Future saveOrder(OrderModel orderModel) async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.post( + Uri.parse('${GlobalVariable.baseUrl}/api/orderApiPos'), + body: orderModel.toJson(), + headers: { + 'Authorization': 'Bearer ${authData?.accessToken}', + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }, + ); + + // print("request ${orderModel.toJson()}"); + // print("response : $response"); + // print("response status code : ${response.statusCode}"); + // print("response body : ${response.body}"); + if (response.statusCode == 200) { + return true; + } else { + return false; + } + } + + Future> checkPaymentStatus(int orderId) async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.get( + Uri.parse('${GlobalVariable.baseUrl}/api/order/status/$orderId'), + headers: { + 'Accept': 'application/json', + 'Content-type': 'application/json', + 'Authorization': 'Bearer ${authData?.accessToken}' + }); + if (response.statusCode == 200) { + final data = jsonDecode(response.body); + return right(data['status']); + } else { + return left('Error'); + } + } + + Future> getOrders() async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.get( + Uri.parse('${GlobalVariable.baseUrl}/api/orders'), + headers: { + 'Accept': 'application/json', + 'Content-type': 'application/json', + 'Authorization': 'Bearer ${authData?.accessToken}' + }, + ); + + if (response.statusCode == 200) { + final orderList = HistoryOrderResponseModel.fromJson(response.body); + return right(orderList); + } else { + return left('Error'); + } + } + + Future> getOrderById( + int orderId) async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.get( + Uri.parse('${GlobalVariable.baseUrl}/api/order/$orderId'), + headers: { + 'Accept': 'application/json', + 'Content-type': 'application/json', + 'Authorization': 'Bearer ${authData!.accessToken}' + }, + ); + + if (response.statusCode == 200) { + final order = OrderDetailResponseModel.fromJson(response.body); + return right(order); + } else { + return left('Error'); + } + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/product_local_datasource.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/product_local_datasource.dart new file mode 100644 index 0000000..45f3390 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/product_local_datasource.dart @@ -0,0 +1,268 @@ +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/cost_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/models/product_quantity.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/order/models/order_model.dart'; +import 'package:sqflite/sqflite.dart'; + +class ProductLocalDatasource { + ProductLocalDatasource._init(); + + static final ProductLocalDatasource instance = ProductLocalDatasource._init(); + + final String tableProducts = 'products'; + // final String tableOrder = 'orders'; + // final String tableOrderItem = 'order_items'; + + static Database? _database; + + // "id": 8, + // "category_id": 2, + // "name": "Mr. Jamel Collier Jr.", + // "price": 35, + // "stock": 29, + // "image": "https://via.placeholder.com/640x480.png/008800?text=nam", + // "is_available": 1, + // "description": "Amet quasi est ad non. Qui voluptates nesciunt amet hic vel et sapiente. Omnis rem odit veniam unde fuga aspernatur.", + // "deleted_at": null, + // "created_at": "2024-02-26T03:39:25.000000Z", + // "updated_at": "2024-02-26T03:39:25.000000Z" + + Future _createDB(Database db, int version) async { + await db.execute(''' + CREATE TABLE $tableProducts ( + id INTEGER PRIMARY KEY, + productId INTEGER, + categoryId INTEGER, + categoryName TEXT, + name TEXT, + price INTEGER, + stock INTEGER, + image TEXT, + isAvailable INTEGER, + description TEXT, + createdAt TEXT, + updatedAt TEXT, + is_sync INTEGER DEFAULT 0 + ) + '''); + + // await db.execute(''' + // CREATE TABLE orders ( + // id INTEGER PRIMARY KEY AUTOINCREMENT, + // nominal INTEGER, + // payment_method TEXT, + // total_item INTEGER, + // id_kasir INTEGER, + // nama_kasir TEXT, + // is_sync INTEGER DEFAULT 0 + // ) + // '''); + await db.execute(''' + CREATE TABLE orders ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + address_id INTEGER DEFAULT 1, + payment_amount INTEGER, + subtotal INTEGER, + tax INTEGER, + discount INTEGER, + service_charge INTEGER, + total_cost INTEGER, + payment_method TEXT, + total_item INTEGER, + id_kasir INTEGER, + nama_kasir TEXT, + transaction_time TEXT, + is_sync INTEGER DEFAULT 0 + ) + '''); + + // await db.execute(''' + // CREATE TABLE order_items ( + // id INTEGER PRIMARY KEY AUTOINCREMENT, + // id_order INTEGER, + // id_product INTEGER, + // quantity INTEGER, + // price INTEGER + // ) + // '''); + + await db.execute(''' + CREATE TABLE order_items ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + id_order INTEGER, + id_product INTEGER, + quantity INTEGER, + price INTEGER + ) + '''); + } + + // Future saveOrder(OrderModel order) async { + // final db = await instance.database; + // int id = await db.insert('orders', order.toMapForLocal()); + // for (var orderItem in order.orders) { + // await db.insert('order_items', orderItem.toMapForLocal(id)); + // } + // return id; + // } + + Future saveOrder(OrderModel order) async { + final db = await instance.database; + int id = await db.insert('orders', order.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace); + + print("order id: $id"); + print('subtotal ${order.subtotal}'); + print('tax ${order.tax}'); + print('discount ${order.discount}'); + print('service_charge ${order.serviceCharge}'); + print('total_cost ${order.total_cost}'); + print('order to map : ${order.toMap()}'); + + for (var item in order.orderItems) { + await db.insert('order_items', item.toLocalMap(id), + conflictAlgorithm: ConflictAlgorithm.replace); + } + } + +//get order by isSync = 0 + // Future> getOrderByIsSync() async { + // final db = await instance.database; + // final result = await db.query('orders', where: 'is_sync = 0'); + + // return result.map((e) => OrderModel.fromLocalMap(e)).toList(); + // } + + //get data order + Future> getOrderByIsNotSync() async { + final db = await instance.database; + final List> maps = + await db.query('orders', where: 'is_sync = ?', whereArgs: [0]); + final results = List.generate( + maps.length, + (i) { + return OrderModel.fromMap(maps[i]); + }, + ); + print('order model from map $results'); + return results; + } + + Future> getOrderByIsSync() async { + final db = await instance.database; + final result = await db.query('orders', where: 'is_sync = 0'); + + return result.map((e) => OrderModel.fromLocalMap(e)).toList(); + } + + //get all orders + Future> getAllOrder() async { + final db = await instance.database; + final result = await db.query('orders', orderBy: 'id DESC'); + return result.map((e) => OrderModel.fromLocalMap(e)).toList(); + } + + Future> getAllOrders( + DateTime start, + DateTime end, + ) async { + final db = await instance.database; + final List> maps = await db.query( + "orders", + // where: 'transaction_time BETWEEN ? AND ?', + // whereArgs: [ + // DateFormat.yMd().format(start), + // DateFormat.yMd().format(end) + // ], + ); + return List.generate(maps.length, (i) { + return OrderModel.fromMap(maps[i]); + }); + } + + //get order item by order id + Future> getOrderItemByOrderId(int orderId) async { + final db = await instance.database; + final List> maps = await db + .query('order_items', where: 'id_order = ?', whereArgs: [orderId]); + final result = List.generate(maps.length, (i) { + return ProductQuantity.fromLocalMap(maps[i]); + }); + print('result get $result'); + return result; + } + + Future updateOrderIsSync(int orderId) async { + final db = await instance.database; + await db.update('orders', {'is_sync': 1}, + where: 'id = ?', whereArgs: [orderId]); + print('order id di sqlite $orderId'); + } + + Future _initDB(String filePath) async { + final dbPath = await getDatabasesPath(); + final path = dbPath + filePath; + + return await openDatabase( + path, + version: 1, + onCreate: _createDB, + ); + } + + Future get database async { + if (_database != null) return _database!; + _database = await _initDB('pos35.db'); + return _database!; + } + +// insert product + Future insertProduct(Product product) async { + final db = await instance.database; + int id = await db.insert( + tableProducts, + product.toLocalMap(), + ); + return product.copyWith(id: id); + } + + //insert data product from list product + Future insertAllProduct(List products) async { + final db = await instance.database; + for (var product in products) { + await db.insert(tableProducts, product.toLocalMap(), + conflictAlgorithm: ConflictAlgorithm.replace); + print('insert success ${product.name}'); + } + } + + //get all data product + Future> getAllProduct() async { + final db = await instance.database; + final List> maps = await db.query(tableProducts); + return List.generate(maps.length, (i) { + return Product.fromLocalMap(maps[i]); + }); + } + + // Future> getAllProduct() async { + // try { + // final db = await instance.database; + // final List> maps = await db.query(tableProducts); + // final List products = List.generate(maps.length, (i) { + // return Product.fromLocalMap(maps[i]); + // }); + // final data> = ProductResponseModel(data: products); + // return Right(ProductResponseModel.fromMap(data)); + // // return ProductResponseModel(data: products); + // } catch (e) { + // return ProductResponseModel(data: [], message: e.toString()); + // } + // } + + //remove all data product + Future deleteAllProducts() async { + final db = await instance.database; + await db.delete(tableProducts); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/product_remote_datasource.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/product_remote_datasource.dart new file mode 100644 index 0000000..9cbc145 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/product_remote_datasource.dart @@ -0,0 +1,156 @@ +import 'dart:convert'; + +import 'package:flutter_pos_ecommerce/core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/add_product_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/detail_product_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import 'package:http/http.dart' as http; +import 'package:dartz/dartz.dart'; + +import '../models/requests/product_request_model.dart'; + +class ProductRemoteDatasource { + Future> getProducts() async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http + .get(Uri.parse("${GlobalVariable.baseUrl}/api/products"), headers: { + 'Authorization': 'Bearer ${authData!.accessToken}', + 'Accept': 'application/json', + }); + if (response.statusCode == 200) { + return Right(ProductResponseModel.fromJson(response.body)); + } else { + return const Left("Internal Server Error"); + } + } + + Future> getProductByCategory( + int categoryId) async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.get( + Uri.parse( + "${GlobalVariable.baseUrl}/api/products?category_id=$categoryId"), + headers: { + 'Authorization': 'Bearer ${authData!.accessToken}', + 'Accept': 'application/json', + }); + if (response.statusCode == 200) { + final data = jsonDecode(response.body); + return Right(ProductResponseModel.fromMap(data)); + } else { + return const Left("Internal Server Error"); + } + } + + Future> getDetailProductByid( + int productId) async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.get( + Uri.parse("${GlobalVariable.baseUrl}/api/products/$productId"), + headers: { + 'Authorization': 'Bearer ${authData!.accessToken}', + 'Accept': 'application/json', + }); + if (response.statusCode == 200) { + return Right( + DetailProductResponseModel.fromJson( + jsonDecode(response.body), + ), + ); + } else { + return const Left("Internal Server Error"); + } + } + + Future> addProduct( + ProductRequestModel productRequestModel) async { + final authData = await AuthLocalDatasource().getAuthData(); + final Map headers = { + 'Authorization': 'Bearer ${authData!.accessToken}', + }; + var request = http.MultipartRequest( + 'POST', Uri.parse('${GlobalVariable.baseUrl}/api/products')); + request.fields.addAll(productRequestModel.toMap()); + request.files.add(await http.MultipartFile.fromPath( + 'image', productRequestModel.image!.path)); + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + final String body = await response.stream.bytesToString(); + + print(body); + if (response.statusCode == 201) { + return right(AddProductResponseModel.fromJson(body)); + } else { + return left(body); + } + } + + Future> updateProduct( + ProductRequestModel productRequestModel) async { + final authData = await AuthLocalDatasource().getAuthData(); + final Map headers = { + 'Authorization': 'Bearer ${authData!.accessToken}', + }; + if (productRequestModel.image == null) { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.put( + Uri.parse( + "${GlobalVariable.baseUrl}/api/products/${productRequestModel.id}"), + headers: { + 'Authorization': 'Bearer ${authData!.accessToken}', + 'Accept': 'application/json', + 'Content-type': 'application/json', + }, + body: productRequestModel.toJson(), + ); + print(productRequestModel.toJson()); + if (response.statusCode == 200) { + return const Right(true); + } else { + return const Left("Internal Server Error"); + } + } else { + var request = http.MultipartRequest( + 'PUT', + Uri.parse( + '${GlobalVariable.baseUrl}/api/products/${productRequestModel.id}')); + request.fields.addAll(productRequestModel.toMap()); + + print((productRequestModel.toMap())); + + request.files.add(await http.MultipartFile.fromPath( + 'image', productRequestModel.image!.path)); + + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + final String body = await response.stream.bytesToString(); + + if (response.statusCode == 200) { + return right(true); + } else { + return left(body); + } + } + } + + Future> deleteProduct(int productId) async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.delete( + Uri.parse("${GlobalVariable.baseUrl}/api/products/$productId"), + headers: { + 'Authorization': 'Bearer ${authData!.accessToken}', + 'Accept': 'application/json', + }, + ); + if (response.statusCode == 200) { + return const Right(true); + } else { + return const Left('Failed to delete product'); + } + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/rajaongkir_remote_datasource.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/rajaongkir_remote_datasource.dart new file mode 100644 index 0000000..b5c80c6 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/datasources/rajaongkir_remote_datasource.dart @@ -0,0 +1,95 @@ +import 'package:flutter_pos_ecommerce/core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/city_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/subdistrict_response_model.dart'; +import 'package:http/http.dart' as http; +import 'package:dartz/dartz.dart'; + +import '../models/responses/cost_response_model.dart'; +import '../models/responses/province_response_model.dart'; +import '../models/responses/tracking_response_model.dart'; + +class RajaongkirRemoteDatasource { + Future> getProvinces() async { + final url = Uri.parse('https://pro.rajaongkir.com/api/province'); + final response = await http.get(url, headers: { + 'key': GlobalVariable.rajaOngkirKey, + }); + if (response.statusCode == 200) { + return Right(ProvinceResponseModel.fromJson(response.body)); + } else { + return left('Internal Server Error'); + } + } + + Future> getCitiesByprovince( + String provinceId) async { + final url = Uri.parse( + 'https://pro.rajaongkir.com/api/city?province=$provinceId', + ); + final response = + await http.get(url, headers: {'key': GlobalVariable.rajaOngkirKey}); + if (response.statusCode == 200) { + return Right(CityResponseModel.fromJson(response.body)); + } else { + return const Left("Internal Server Error"); + } + } + + Future> getSubdistrictByCity( + String cityId) async { + final url = + Uri.parse('https://pro.rajaongkir.com/api/subdistrict?city=$cityId'); + final response = await http.get(url, headers: { + 'key': GlobalVariable.rajaOngkirKey, + }); + if (response.statusCode == 200) { + return Right(SubdistrictResponseModel.fromJson(response.body)); + } else { + return const Left("Internal Server Error"); + } + } + + Future> getCost( + String origin, String destination, String courier) async { + final url = Uri.parse('https://pro.rajaongkir.com/api/cost'); + final response = await http.post( + url, + headers: { + 'key': GlobalVariable.rajaOngkirKey, + }, + body: { + 'origin': origin, + 'originType': 'subdistrict', + 'destination': destination, + 'destinationType': 'subdistrict', + 'weight': '1000', + 'courier': courier, + }, + ); + if (response.statusCode == 200) { + return right(CostResponseModel.fromJson(response.body)); + } else { + return left('Error'); + } + } + + Future> getWaybill( + String courier, String waybill) async { + final url = Uri.parse('https://pro.rajaongkir.com/api/waybill'); + final response = await http.post( + url, + headers: { + 'key': GlobalVariable.rajaOngkirKey, + }, + body: { + 'waybill': waybill, + 'courier': courier, + }, + ); + if (response.statusCode == 200) { + return right(TrackingResponseModel.fromJson(response.body)); + } else { + return left('Error'); + } + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/address_request_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/address_request_model.dart new file mode 100644 index 0000000..603b9fc --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/address_request_model.dart @@ -0,0 +1,64 @@ +import 'dart:convert'; + +// 'name' => $request->name, +// 'full_address' => $request->full_address, +// 'phone' => $request->phone, +// 'prov_id' => $request->prov_id, +// 'city_id' => $request->city_id, +// 'district_id' => $request->district_id, +// 'postal_code' => $request->postal_code, +// 'user_id' => $request->user()->id, +// 'is_default' => $request->is_default, + +class AddressRequestModel { + final String? name; + final String? fullAddress; + final String? phone; + final String? provId; + final String? cityId; + final String? districtId; + final String? postalCode; + final int? isDefault; + + AddressRequestModel({ + this.name, + this.fullAddress, + this.phone, + this.provId, + this.cityId, + this.districtId, + this.postalCode, + this.isDefault, + }); + + Map toMap() { + return { + 'name': name, + 'full_address': fullAddress, + 'phone': phone, + 'prov_id': provId, + 'city_id': cityId, + 'district_id': districtId, + 'postal_code': postalCode, + 'is_default': isDefault, + }; + } + + factory AddressRequestModel.fromMap(Map map) { + return AddressRequestModel( + name: map['name'], + fullAddress: map['fullAddress'], + phone: map['phone'], + provId: map['provId'], + cityId: map['cityId'], + districtId: map['districtId'], + postalCode: map['postalCode'], + isDefault: map['isDefault']?.toInt(), + ); + } + + String toJson() => json.encode(toMap()); + + factory AddressRequestModel.fromJson(String source) => + AddressRequestModel.fromMap(json.decode(source)); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/discount_request_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/discount_request_model.dart new file mode 100644 index 0000000..c1c4726 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/discount_request_model.dart @@ -0,0 +1,26 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +class DiscountRequestModel { + final int id; + final String name; + final String description; + final int value; + + DiscountRequestModel( + {required this.id, + required this.name, + required this.description, + required this.value}); + + Map toMap() { + return { + 'id': id, + 'name': name, + 'description': description, + 'value': value, + }; + } + + String toJson() => json.encode(toMap()); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/order_request_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/order_request_model.dart new file mode 100644 index 0000000..bdb716b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/order_request_model.dart @@ -0,0 +1,118 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +class OrderRequestModel { + final int? addressId; + final String? paymentMethod; + final String? shippingService; + final int? shippingCost; + final String? paymentVaName; + final int? subtotal; + final int? discount; + final int? totalCost; + final List? items; + + OrderRequestModel({ + this.addressId, + this.paymentMethod, + this.shippingService, + this.shippingCost, + this.paymentVaName, + this.subtotal, + this.discount, + this.totalCost, + this.items, + }); + + factory OrderRequestModel.fromJson(String str) => + OrderRequestModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory OrderRequestModel.fromMap(Map json) => + OrderRequestModel( + addressId: json["address_id"], + discount: json["discount"], + paymentMethod: json["payment_method"], + shippingService: json["shipping_service"], + shippingCost: json["shipping_cost"], + paymentVaName: json["payment_va_name"], + subtotal: json["subtotal"], + totalCost: json["total_cost"], + items: json["items"] == null + ? [] + : List.from(json["items"]!.map((x) => Item.fromMap(x))), + ); + + Map toMap() => { + "address_id": addressId, + "discount": discount, + "payment_method": paymentMethod, + "shipping_service": shippingService, + "shipping_cost": shippingCost, + "payment_va_name": paymentVaName, + "subtotal": subtotal, + "total_cost": totalCost, + "items": items == null + ? [] + : List.from(items!.map((x) => x.toMap())), + }; + + OrderRequestModel copyWith({ + int? addressId, + String? paymentMethod, + String? shippingService, + int? shippingCost, + String? paymentVaName, + int? subtotal, + int? discount, + int? totalCost, + List? items, + }) { + final totalDiscount = ((discount ?? this.discount!) / 100 * subtotal!); + print('total discount $totalDiscount'); + int total = (subtotal) - (totalDiscount).toInt(); + print('total cost $total'); + + return OrderRequestModel( + addressId: addressId ?? this.addressId, + paymentMethod: paymentMethod ?? this.paymentMethod, + shippingService: shippingService ?? this.shippingService, + shippingCost: shippingCost ?? this.shippingCost, + paymentVaName: paymentVaName ?? this.paymentVaName, + subtotal: subtotal, + discount: discount ?? this.discount, + totalCost: total, + items: items ?? this.items, + ); + } + + @override + String toString() { + return 'OrderRequestModel(addressId: $addressId, paymentMethod: $paymentMethod, shippingService: $shippingService, shippingCost: $shippingCost, paymentVaName: $paymentVaName, subtotal: $subtotal, discount: $discount, totalCost: $totalCost, items: $items)'; + } +} + +class Item { + final int? productId; + final int? quantity; + + Item({ + this.productId, + this.quantity, + }); + + factory Item.fromJson(String str) => Item.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Item.fromMap(Map json) => Item( + productId: json["product_id"], + quantity: json["quantity"], + ); + + Map toMap() => { + "product_id": productId, + "quantity": quantity, + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/product_request_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/product_request_model.dart new file mode 100644 index 0000000..fb4d839 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/requests/product_request_model.dart @@ -0,0 +1,38 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +import 'package:image_picker/image_picker.dart'; + +class ProductRequestModel { + final int id; + final String name; + final int price; + final int stock; + final XFile? image; + final int is_available; + final String description; + final int category_id; + ProductRequestModel({ + required this.id, + required this.name, + required this.price, + required this.stock, + this.image, + required this.is_available, + required this.description, + required this.category_id, + }); + + Map toMap() { + return{ + 'id' : id.toString(), + 'name': name, + 'price': price.toString(), + 'stock': stock.toString(), + 'is_available': is_available.toString(), + 'description': description, + 'category_id': category_id.toString(), + }; + } +String toJson() => json.encode(toMap()); +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/add_product_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/add_product_response_model.dart new file mode 100644 index 0000000..26b9575 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/add_product_response_model.dart @@ -0,0 +1,33 @@ +import 'dart:convert'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; + +class AddProductResponseModel { + final bool success; + final String message; + final Product data; + + AddProductResponseModel({ + required this.success, + required this.message, + required this.data, + }); + + factory AddProductResponseModel.fromJson(String str) => + AddProductResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory AddProductResponseModel.fromMap(Map json) => + AddProductResponseModel( + success: json["success"], + message: json["message"], + data: Product.fromMap(json["data"]), + ); + + Map toMap() => { + "success": success, + "message": message, + "data": data.toMap(), + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/address_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/address_response_model.dart new file mode 100644 index 0000000..d903a9c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/address_response_model.dart @@ -0,0 +1,102 @@ +import 'dart:convert'; + +class AddressResponseModel { + final String? status; + final List
? data; + + AddressResponseModel({ + this.status, + this.data, + }); + + factory AddressResponseModel.fromJson(String str) => + AddressResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory AddressResponseModel.fromMap(Map json) => + AddressResponseModel( + status: json["status"], + data: json["data"] == null + ? [] + : List
.from(json["data"]!.map((x) => Address.fromMap(x))), + ); + + Map toMap() => { + "status": status, + "data": + data == null ? [] : List.from(data!.map((x) => x.toMap())), + }; +} + +class Address { + final int? id; + final String? name; + final String? fullAddress; + final String? phone; + final String? provId; + final String? cityId; + final String? districtId; + final String? postalCode; + final int? userId; + final int? idDefault; + final dynamic deletedAt; + final DateTime? createdAt; + final DateTime? updatedAt; + + Address({ + this.id, + this.name, + this.fullAddress, + this.phone, + this.provId, + this.cityId, + this.districtId, + this.postalCode, + this.userId, + this.idDefault, + this.deletedAt, + this.createdAt, + this.updatedAt, + }); + + factory Address.fromJson(String str) => Address.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Address.fromMap(Map json) => Address( + id: json["id"], + name: json["name"], + fullAddress: json["full_address"], + phone: json["phone"], + provId: json["prov_id"], + cityId: json["city_id"], + districtId: json["district_id"], + postalCode: json["postal_code"], + userId: json["user_id"], + idDefault: json["id_default"], + deletedAt: json["deleted_at"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + ); + + Map toMap() => { + "id": id, + "name": name, + "full_address": fullAddress, + "phone": phone, + "prov_id": provId, + "city_id": cityId, + "district_id": districtId, + "postal_code": postalCode, + "user_id": userId, + "id_default": idDefault, + "deleted_at": deletedAt, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/auth_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/auth_response_model.dart new file mode 100644 index 0000000..c9baef8 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/auth_response_model.dart @@ -0,0 +1,83 @@ +import 'dart:convert'; + +class AuthResponseModel { + final String? accessToken; + final User? user; + + AuthResponseModel({ + this.accessToken, + this.user, + }); + + factory AuthResponseModel.fromJson(String str) => + AuthResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory AuthResponseModel.fromMap(Map json) => + AuthResponseModel( + accessToken: json["access_token"], + user: json["user"] == null ? null : User.fromMap(json["user"]), + ); + + Map toMap() => { + "access_token": accessToken, + "user": user?.toMap(), + }; +} + +class User { + final int? id; + final String? name; + final String? email; + final String? phone; + final String? roles; + final String? foto; + final DateTime? createdAt; + final DateTime? updatedAt; + final dynamic deletedAt; + + User({ + this.id, + this.name, + this.email, + this.phone, + this.roles, + this.foto, + this.createdAt, + this.updatedAt, + this.deletedAt, + }); + + factory User.fromJson(String str) => User.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory User.fromMap(Map json) => User( + id: json["id"], + name: json["name"], + email: json["email"], + phone: json["phone"], + roles: json["roles"], + foto: json["foto"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + deletedAt: json["deleted_at"], + ); + + Map toMap() => { + "id": id, + "name": name, + "email": email, + "phone": phone, + "roles": roles, + "foto": foto, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + "deleted_at": deletedAt, + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/category_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/category_response_model.dart new file mode 100644 index 0000000..71809a9 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/category_response_model.dart @@ -0,0 +1,85 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +class CategoryResponseModel { + final String? message; + final List? data; + + CategoryResponseModel({ + this.message, + this.data, + }); + + factory CategoryResponseModel.fromJson(String str) => + CategoryResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory CategoryResponseModel.fromMap(Map json) => + CategoryResponseModel( + message: json["message"], + data: json["data"] == null + ? [] + : List.from( + json["data"]!.map((x) => Category.fromMap(x))), + ); + + Map toMap() => { + "message": message, + "data": + data == null ? [] : List.from(data!.map((x) => x.toMap())), + }; +} + +class Category { + final int? id; + final String? name; + final String? image; + final String? description; + final dynamic deletedAt; + final DateTime? createdAt; + final DateTime? updatedAt; + + Category({ + this.id, + this.name, + this.image, + this.description, + this.deletedAt, + this.createdAt, + this.updatedAt, + }); + + factory Category.fromJson(String str) => Category.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Category.fromMap(Map json) => Category( + id: json["id"], + name: json["name"], + image: json["image"], + description: json["description"], + deletedAt: json["deleted_at"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + ); + + Map toMap() => { + "id": id, + "name": name, + "image": image, + "description": description, + "deleted_at": deletedAt, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + }; + + @override + String toString() { + return 'Category(id: $id, name: $name, image: $image, description: $description, deletedAt: $deletedAt, createdAt: $createdAt, updatedAt: $updatedAt)'; + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/city_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/city_response_model.dart new file mode 100644 index 0000000..763ae5e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/city_response_model.dart @@ -0,0 +1,148 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +class CityResponseModel { + final Rajaongkir? rajaongkir; + + CityResponseModel({ + this.rajaongkir, + }); + + factory CityResponseModel.fromJson(String str) => + CityResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory CityResponseModel.fromMap(Map json) => + CityResponseModel( + rajaongkir: json["rajaongkir"] == null + ? null + : Rajaongkir.fromMap(json["rajaongkir"]), + ); + + Map toMap() => { + "rajaongkir": rajaongkir?.toMap(), + }; +} + +class Rajaongkir { + final Query? query; + final Status? status; + final List? results; + + Rajaongkir({ + this.query, + this.status, + this.results, + }); + + factory Rajaongkir.fromJson(String str) => + Rajaongkir.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Rajaongkir.fromMap(Map json) => Rajaongkir( + query: json["query"] == null ? null : Query.fromMap(json["query"]), + status: json["status"] == null ? null : Status.fromMap(json["status"]), + results: json["results"] == null + ? [] + : List.from(json["results"]!.map((x) => Cities.fromMap(x))), + ); + + Map toMap() => { + "query": query?.toMap(), + "status": status?.toMap(), + "results": results == null + ? [] + : List.from(results!.map((x) => x.toMap())), + }; +} + +class Query { + final String? province; + + Query({ + this.province, + }); + + factory Query.fromJson(String str) => Query.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Query.fromMap(Map json) => Query( + province: json["province"], + ); + + Map toMap() => { + "province": province, + }; +} + +class Cities { + final String? cityId; + final String? provinceId; + final String? province; + final String? type; + final String? cityName; + final String? postalCode; + + Cities({ + this.cityId, + this.provinceId, + this.province, + this.type, + this.cityName, + this.postalCode, + }); + + factory Cities.fromJson(String str) => Cities.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Cities.fromMap(Map json) => Cities( + cityId: json["city_id"], + provinceId: json["province_id"], + province: json["province"], + type: json["type"], + cityName: json["city_name"], + postalCode: json["postal_code"], + ); + + Map toMap() => { + "city_id": cityId, + "province_id": provinceId, + "province": province, + "type": type, + "city_name": cityName, + "postal_code": postalCode, + }; + + @override + String toString() { + return '$cityName'; + } +} + +class Status { + final int? code; + final String? description; + + Status({ + this.code, + this.description, + }); + + factory Status.fromJson(String str) => Status.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Status.fromMap(Map json) => Status( + code: json["code"], + description: json["description"], + ); + + Map toMap() => { + "code": code, + "description": description, + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/cost_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/cost_response_model.dart new file mode 100644 index 0000000..6cc3f95 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/cost_response_model.dart @@ -0,0 +1,272 @@ +import 'dart:convert'; + +class CostResponseModel { + final Rajaongkir? rajaongkir; + + CostResponseModel({ + this.rajaongkir, + }); + + factory CostResponseModel.fromJson(String str) => + CostResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory CostResponseModel.fromMap(Map json) => + CostResponseModel( + rajaongkir: json["rajaongkir"] == null + ? null + : Rajaongkir.fromMap(json["rajaongkir"]), + ); + + Map toMap() => { + "rajaongkir": rajaongkir?.toMap(), + }; +} + +class Rajaongkir { + final Query? query; + final Status? status; + final NDetails? originDetails; + final NDetails? destinationDetails; + final List? results; + + Rajaongkir({ + this.query, + this.status, + this.originDetails, + this.destinationDetails, + this.results, + }); + + factory Rajaongkir.fromJson(String str) => + Rajaongkir.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Rajaongkir.fromMap(Map json) => Rajaongkir( + query: json["query"] == null ? null : Query.fromMap(json["query"]), + status: json["status"] == null ? null : Status.fromMap(json["status"]), + originDetails: json["origin_details"] == null + ? null + : NDetails.fromMap(json["origin_details"]), + destinationDetails: json["destination_details"] == null + ? null + : NDetails.fromMap(json["destination_details"]), + results: json["results"] == null + ? [] + : List.from(json["results"]!.map((x) => Result.fromMap(x))), + ); + + Map toMap() => { + "query": query?.toMap(), + "status": status?.toMap(), + "origin_details": originDetails?.toMap(), + "destination_details": destinationDetails?.toMap(), + "results": results == null + ? [] + : List.from(results!.map((x) => x.toMap())), + }; +} + +class NDetails { + final String? subdistrictId; + final String? provinceId; + final String? province; + final String? cityId; + final String? city; + final String? type; + final String? subdistrictName; + + NDetails({ + this.subdistrictId, + this.provinceId, + this.province, + this.cityId, + this.city, + this.type, + this.subdistrictName, + }); + + factory NDetails.fromJson(String str) => NDetails.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory NDetails.fromMap(Map json) => NDetails( + subdistrictId: json["subdistrict_id"], + provinceId: json["province_id"], + province: json["province"], + cityId: json["city_id"], + city: json["city"], + type: json["type"], + subdistrictName: json["subdistrict_name"], + ); + + Map toMap() => { + "subdistrict_id": subdistrictId, + "province_id": provinceId, + "province": province, + "city_id": cityId, + "city": city, + "type": type, + "subdistrict_name": subdistrictName, + }; +} + +class Query { + final String? origin; + final String? originType; + final String? destination; + final String? destinationType; + final int? weight; + final String? courier; + + Query({ + this.origin, + this.originType, + this.destination, + this.destinationType, + this.weight, + this.courier, + }); + + factory Query.fromJson(String str) => Query.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Query.fromMap(Map json) => Query( + origin: json["origin"], + originType: json["originType"], + destination: json["destination"], + destinationType: json["destinationType"], + weight: json["weight"], + courier: json["courier"], + ); + + Map toMap() => { + "origin": origin, + "originType": originType, + "destination": destination, + "destinationType": destinationType, + "weight": weight, + "courier": courier, + }; +} + +class Result { + final String? code; + final String? name; + final List? costs; + + Result({ + this.code, + this.name, + this.costs, + }); + + factory Result.fromJson(String str) => Result.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Result.fromMap(Map json) => Result( + code: json["code"], + name: json["name"], + costs: json["costs"] == null + ? [] + : List.from( + json["costs"]!.map((x) => ResultCost.fromMap(x))), + ); + + Map toMap() => { + "code": code, + "name": name, + "costs": costs == null + ? [] + : List.from(costs!.map((x) => x.toMap())), + }; +} + +class ResultCost { + final String? service; + final String? description; + final List? cost; + + ResultCost({ + this.service, + this.description, + this.cost, + }); + + factory ResultCost.fromJson(String str) => + ResultCost.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory ResultCost.fromMap(Map json) => ResultCost( + service: json["service"], + description: json["description"], + cost: json["cost"] == null + ? [] + : List.from( + json["cost"]!.map((x) => CostCost.fromMap(x))), + ); + + Map toMap() => { + "service": service, + "description": description, + "cost": + cost == null ? [] : List.from(cost!.map((x) => x.toMap())), + }; +} + +class CostCost { + final int? value; + final String? etd; + final String? note; + + CostCost({ + this.value, + this.etd, + this.note, + }); + + factory CostCost.fromJson(String str) => CostCost.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory CostCost.fromMap(Map json) => CostCost( + value: json["value"], + etd: json["etd"], + note: json["note"], + ); + + Map toMap() => { + "value": value, + "etd": etd, + "note": note, + }; +} + +class Status { + final int? code; + final String? description; + + Status({ + this.code, + this.description, + }); + + factory Status.fromJson(String str) => Status.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Status.fromMap(Map json) => Status( + code: json["code"], + description: json["description"], + ); + + Map toMap() => { + "code": code, + "description": description, + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/detail_product_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/detail_product_response_model.dart new file mode 100644 index 0000000..c16c8be --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/detail_product_response_model.dart @@ -0,0 +1,110 @@ +// To parse this JSON data, do +// +// final detailProductResponseModel = detailProductResponseModelFromJson(jsonString); + +import 'dart:convert'; + +// import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/order_detail_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; + +DetailProductResponseModel detailProductResponseModelFromJson(String str) => + DetailProductResponseModel.fromJson(json.decode(str)); + +String detailProductResponseModelToJson(DetailProductResponseModel data) => + json.encode(data.toJson()); + +class DetailProductResponseModel { + final String? message; + final DetailProduct? detailProduct; + + DetailProductResponseModel({ + this.message, + this.detailProduct, + }); + + factory DetailProductResponseModel.fromJson(Map json) => + DetailProductResponseModel( + message: json["message"], + detailProduct: + json["data"] == null ? null : DetailProduct.fromJson(json["data"]), + ); + + Map toJson() => { + "message": message, + "data": detailProduct?.toJson(), + }; +} + +class DetailProduct { + final int? id; + final int? categoryId; + final String? name; + final int? price; + final int? stock; + final String? image; + final int? isAvailable; + final String? description; + final dynamic deletedAt; + final DateTime? createdAt; + final DateTime? updatedAt; + + DetailProduct({ + this.id, + this.categoryId, + this.name, + this.price, + this.stock, + this.image, + this.isAvailable, + this.description, + this.deletedAt, + this.createdAt, + this.updatedAt, + }); + + Product toProduct() => Product( + id: id, + categoryId: categoryId, + name: name, + price: price, + stock: stock, + image: image, + isAvailable: isAvailable, + description: description, + // deletedAt: deletedAt, + createdAt: createdAt, + updatedAt: updatedAt, + ); + + factory DetailProduct.fromJson(Map json) => DetailProduct( + id: json["id"], + categoryId: json["category_id"], + name: json["name"], + price: json["price"], + stock: json["stock"], + image: json["image"], + isAvailable: json["is_available"], + description: json["description"], + deletedAt: json["deleted_at"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + ); + + Map toJson() => { + "id": id, + "category_id": categoryId, + "name": name, + "price": price, + "stock": stock, + "image": image, + "is_available": isAvailable, + "description": description, + "deleted_at": deletedAt, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/discount_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/discount_response_model.dart new file mode 100644 index 0000000..887240c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/discount_response_model.dart @@ -0,0 +1,96 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +class DiscountResponseModel { + final String? status; + final List? data; + + DiscountResponseModel({ + this.status, + this.data, + }); + + factory DiscountResponseModel.fromJson(String str) => + DiscountResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory DiscountResponseModel.fromMap(Map json) => + DiscountResponseModel( + status: json["status"], + data: json["data"] == null + ? [] + : List.from( + json["data"]!.map((x) => Discount.fromMap(x))), + ); + + Map toMap() => { + "status": status, + "data": + data == null ? [] : List.from(data!.map((x) => x.toMap())), + }; +} + +class Discount { + final int? id; + final String? name; + final String? description; + final String? type; + final String? value; + final String? status; + final DateTime? expiredDate; + final DateTime? createdAt; + final DateTime? updatedAt; + + Discount({ + this.id, + this.name, + this.description, + this.type, + this.value, + this.status, + this.expiredDate, + this.createdAt, + this.updatedAt, + }); + + factory Discount.fromJson(String str) => Discount.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Discount.fromMap(Map json) => Discount( + id: json["id"], + name: json["name"], + description: json["description"], + type: json["type"], + value: json["value"], + status: json["status"], + expiredDate: json["expired_date"] == null + ? null + : DateTime.parse(json["expired_date"]), + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + ); + + Map toMap() => { + "id": id, + "name": name, + "description": description, + "type": type, + "value": value, + "status": status, + "expired_date": + "${expiredDate!.year.toString().padLeft(4, '0')}-${expiredDate!.month.toString().padLeft(2, '0')}-${expiredDate!.day.toString().padLeft(2, '0')}", + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + }; + + @override + String toString() { + return 'Discount(id: $id, name: $name, description: $description, type: $type, value: $value, status: $status, expiredDate: $expiredDate, createdAt: $createdAt, updatedAt: $updatedAt)'; + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/history_order_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/history_order_response_model.dart new file mode 100644 index 0000000..0a8ef3c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/history_order_response_model.dart @@ -0,0 +1,113 @@ +import 'dart:convert'; + +class HistoryOrderResponseModel { + final List? orders; + + HistoryOrderResponseModel({ + this.orders, + }); + + factory HistoryOrderResponseModel.fromJson(String str) => + HistoryOrderResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory HistoryOrderResponseModel.fromMap(Map json) => + HistoryOrderResponseModel( + orders: json["orders"] == null + ? [] + : List.from( + json["orders"]!.map((x) => HistoryOrder.fromMap(x))), + ); + + Map toMap() => { + "orders": orders == null + ? [] + : List.from(orders!.map((x) => x.toMap())), + }; +} + +class HistoryOrder { + final int? id; + final int? userId; + final int? addressId; + final int? subtotal; + final int? shippingCost; + final int? totalCost; + final String? status; + final String? paymentMethod; + final String? paymentVaName; + final String? paymentVaNumber; + final dynamic paymentEwallet; + final String? shippingService; + final String? shippingResi; + final String? transactionNumber; + final DateTime? createdAt; + final DateTime? updatedAt; + + HistoryOrder({ + this.id, + this.userId, + this.addressId, + this.subtotal, + this.shippingCost, + this.totalCost, + this.status, + this.paymentMethod, + this.paymentVaName, + this.paymentVaNumber, + this.paymentEwallet, + this.shippingService, + this.shippingResi, + this.transactionNumber, + this.createdAt, + this.updatedAt, + }); + + factory HistoryOrder.fromJson(String str) => + HistoryOrder.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory HistoryOrder.fromMap(Map json) => HistoryOrder( + id: json["id"], + userId: json["user_id"], + addressId: json["address_id"], + subtotal: json["subtotal"], + shippingCost: json["shipping_cost"], + totalCost: json["total_cost"], + status: json["status"], + paymentMethod: json["payment_method"], + paymentVaName: json["payment_va_name"], + paymentVaNumber: json["payment_va_number"], + paymentEwallet: json["payment_ewallet"], + shippingService: json["shipping_service"], + shippingResi: json["shipping_resi"], + transactionNumber: json["transaction_number"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + ); + + Map toMap() => { + "id": id, + "user_id": userId, + "address_id": addressId, + "subtotal": subtotal, + "shipping_cost": shippingCost, + "total_cost": totalCost, + "status": status, + "payment_method": paymentMethod, + "payment_va_name": paymentVaName, + "payment_va_number": paymentVaNumber, + "payment_ewallet": paymentEwallet, + "shipping_service": shippingService, + "shipping_resi": shippingResi, + "transaction_number": transactionNumber, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/order_detail_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/order_detail_response_model.dart new file mode 100644 index 0000000..fd9778e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/order_detail_response_model.dart @@ -0,0 +1,374 @@ +import 'dart:convert'; + +class OrderDetailResponseModel { + final OrderDetail? order; + + OrderDetailResponseModel({ + this.order, + }); + + factory OrderDetailResponseModel.fromJson(String str) => + OrderDetailResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory OrderDetailResponseModel.fromMap(Map json) => + OrderDetailResponseModel( + order: + json["order"] == null ? null : OrderDetail.fromMap(json["order"]), + ); + + Map toMap() => { + "order": order?.toMap(), + }; +} + +class OrderDetail { + final int? id; + final int? userId; + final int? addressId; + final int? subtotal; + final int? shippingCost; + final int? totalCost; + final String? status; + final String? paymentMethod; + final String? paymentVaName; + final String? paymentVaNumber; + final dynamic paymentEwallet; + final String? shippingService; + final dynamic shippingResi; + final String? transactionNumber; + final DateTime? createdAt; + final DateTime? updatedAt; + final List? orderItems; + final User? user; + final Address? address; + + OrderDetail({ + this.id, + this.userId, + this.addressId, + this.subtotal, + this.shippingCost, + this.totalCost, + this.status, + this.paymentMethod, + this.paymentVaName, + this.paymentVaNumber, + this.paymentEwallet, + this.shippingService, + this.shippingResi, + this.transactionNumber, + this.createdAt, + this.updatedAt, + this.orderItems, + this.user, + this.address, + }); + + factory OrderDetail.fromJson(String str) => + OrderDetail.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory OrderDetail.fromMap(Map json) => OrderDetail( + id: json["id"], + userId: json["user_id"], + addressId: json["address_id"], + subtotal: json["subtotal"], + shippingCost: json["shipping_cost"], + totalCost: json["total_cost"], + status: json["status"], + paymentMethod: json["payment_method"], + paymentVaName: json["payment_va_name"], + paymentVaNumber: json["payment_va_number"], + paymentEwallet: json["payment_ewallet"], + shippingService: json["shipping_service"], + shippingResi: json["shipping_resi"], + transactionNumber: json["transaction_number"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + orderItems: json["order_items"] == null + ? [] + : List.from( + json["order_items"]!.map((x) => OrderItem.fromMap(x))), + user: json["user"] == null ? null : User.fromMap(json["user"]), + address: + json["address"] == null ? null : Address.fromMap(json["address"]), + ); + + Map toMap() => { + "id": id, + "user_id": userId, + "address_id": addressId, + "subtotal": subtotal, + "shipping_cost": shippingCost, + "total_cost": totalCost, + "status": status, + "payment_method": paymentMethod, + "payment_va_name": paymentVaName, + "payment_va_number": paymentVaNumber, + "payment_ewallet": paymentEwallet, + "shipping_service": shippingService, + "shipping_resi": shippingResi, + "transaction_number": transactionNumber, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + "order_items": orderItems == null + ? [] + : List.from(orderItems!.map((x) => x.toMap())), + "user": user?.toMap(), + "address": address?.toMap(), + }; +} + +class Address { + final int? id; + final String? name; + final String? fullAddress; + final String? phone; + final String? provId; + final String? cityId; + final String? districtId; + final String? postalCode; + final int? userId; + final int? isDefault; + final DateTime? createdAt; + final DateTime? updatedAt; + + Address({ + this.id, + this.name, + this.fullAddress, + this.phone, + this.provId, + this.cityId, + this.districtId, + this.postalCode, + this.userId, + this.isDefault, + this.createdAt, + this.updatedAt, + }); + + factory Address.fromJson(String str) => Address.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Address.fromMap(Map json) => Address( + id: json["id"], + name: json["name"], + fullAddress: json["full_address"], + phone: json["phone"], + provId: json["prov_id"], + cityId: json["city_id"], + districtId: json["district_id"], + postalCode: json["postal_code"], + userId: json["user_id"], + isDefault: json["is_default"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + ); + + Map toMap() => { + "id": id, + "name": name, + "full_address": fullAddress, + "phone": phone, + "prov_id": provId, + "city_id": cityId, + "district_id": districtId, + "postal_code": postalCode, + "user_id": userId, + "is_default": isDefault, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + }; +} + +class OrderItem { + final int? id; + final int? orderId; + final int? productId; + final int? quantity; + final DateTime? createdAt; + final DateTime? updatedAt; + final Product? product; + + OrderItem({ + this.id, + this.orderId, + this.productId, + this.quantity, + this.createdAt, + this.updatedAt, + this.product, + }); + + factory OrderItem.fromJson(String str) => OrderItem.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory OrderItem.fromMap(Map json) => OrderItem( + id: json["id"], + orderId: json["order_id"], + productId: json["product_id"], + quantity: json["quantity"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + product: + json["product"] == null ? null : Product.fromMap(json["product"]), + ); + + Map toMap() => { + "id": id, + "order_id": orderId, + "product_id": productId, + "quantity": quantity, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + "product": product?.toMap(), + }; +} + +class Product { + final int? id; + final int? categoryId; + final String? name; + final String? description; + final String? image; + final int? price; + final int? stock; + final int? isAvailable; + final DateTime? createdAt; + final DateTime? updatedAt; + + Product({ + this.id, + this.categoryId, + this.name, + this.description, + this.image, + this.price, + this.stock, + this.isAvailable, + this.createdAt, + this.updatedAt, + }); + + factory Product.fromJson(String str) => Product.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Product.fromMap(Map json) => Product( + id: json["id"], + categoryId: json["category_id"], + name: json["name"], + description: json["description"], + image: json["image"], + price: json["price"], + stock: json["stock"], + isAvailable: json["is_available"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + ); + + Map toMap() => { + "id": id, + "category_id": categoryId, + "name": name, + "description": description, + "image": image, + "price": price, + "stock": stock, + "is_available": isAvailable, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + }; +} + +class User { + final int? id; + final String? name; + final String? email; + final String? fcmId; + final String? phone; + final String? roles; + final DateTime? emailVerifiedAt; + final dynamic twoFactorSecret; + final dynamic twoFactorRecoveryCodes; + final dynamic twoFactorConfirmedAt; + final DateTime? createdAt; + final DateTime? updatedAt; + + User({ + this.id, + this.name, + this.email, + this.fcmId, + this.phone, + this.roles, + this.emailVerifiedAt, + this.twoFactorSecret, + this.twoFactorRecoveryCodes, + this.twoFactorConfirmedAt, + this.createdAt, + this.updatedAt, + }); + + factory User.fromJson(String str) => User.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory User.fromMap(Map json) => User( + id: json["id"], + name: json["name"], + email: json["email"], + fcmId: json["fcm_id"], + phone: json["phone"], + roles: json["roles"], + emailVerifiedAt: json["email_verified_at"] == null + ? null + : DateTime.parse(json["email_verified_at"]), + twoFactorSecret: json["two_factor_secret"], + twoFactorRecoveryCodes: json["two_factor_recovery_codes"], + twoFactorConfirmedAt: json["two_factor_confirmed_at"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + ); + + Map toMap() => { + "id": id, + "name": name, + "email": email, + "fcm_id": fcmId, + "phone": phone, + "roles": roles, + "email_verified_at": emailVerifiedAt?.toIso8601String(), + "two_factor_secret": twoFactorSecret, + "two_factor_recovery_codes": twoFactorRecoveryCodes, + "two_factor_confirmed_at": twoFactorConfirmedAt, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/order_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/order_response_model.dart new file mode 100644 index 0000000..b386234 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/order_response_model.dart @@ -0,0 +1,291 @@ +import 'dart:convert'; + +class OrderResponseModel { + final String? message; + final Order? order; + + OrderResponseModel({ + this.message, + this.order, + }); + + factory OrderResponseModel.fromJson(String str) => + OrderResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory OrderResponseModel.fromMap(Map json) => + OrderResponseModel( + message: json["message"], + order: json["order"] == null ? null : Order.fromMap(json["order"]), + ); + + Map toMap() => { + "message": message, + "order": order?.toMap(), + }; +} + +class Order { + final int? userId; + final int? addressId; + final int? subtotal; + final int? shippingCost; + final int? totalCost; + final String? status; + final String? paymentMethod; + final String? shippingService; + final String? transactionNumber; + final DateTime? updatedAt; + final DateTime? createdAt; + final int? id; + final String? paymentVaName; + final String? paymentVaNumber; + final User? user; + final List? orderItems; + + Order({ + this.userId, + this.addressId, + this.subtotal, + this.shippingCost, + this.totalCost, + this.status, + this.paymentMethod, + this.shippingService, + this.transactionNumber, + this.updatedAt, + this.createdAt, + this.id, + this.paymentVaName, + this.paymentVaNumber, + this.user, + this.orderItems, + }); + + factory Order.fromJson(String str) => Order.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Order.fromMap(Map json) => Order( + userId: json["user_id"], + addressId: json["address_id"], + subtotal: json["subtotal"], + shippingCost: json["shipping_cost"], + totalCost: json["total_cost"], + status: json["status"], + paymentMethod: json["payment_method"], + shippingService: json["shipping_service"], + transactionNumber: json["transaction_number"], + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + id: json["id"], + paymentVaName: json["payment_va_name"], + paymentVaNumber: json["payment_va_number"], + user: json["user"] == null ? null : User.fromMap(json["user"]), + orderItems: json["order_items"] == null + ? [] + : List.from( + json["order_items"]!.map((x) => OrderItem.fromMap(x))), + ); + + Map toMap() => { + "user_id": userId, + "address_id": addressId, + "subtotal": subtotal, + "shipping_cost": shippingCost, + "total_cost": totalCost, + "status": status, + "payment_method": paymentMethod, + "shipping_service": shippingService, + "transaction_number": transactionNumber, + "updated_at": updatedAt?.toIso8601String(), + "created_at": createdAt?.toIso8601String(), + "id": id, + "payment_va_name": paymentVaName, + "payment_va_number": paymentVaNumber, + "user": user?.toMap(), + "order_items": orderItems == null + ? [] + : List.from(orderItems!.map((x) => x.toMap())), + }; +} + +class OrderItem { + final int? id; + final int? orderId; + final int? productId; + final int? quantity; + final DateTime? createdAt; + final DateTime? updatedAt; + final Product? product; + + OrderItem({ + this.id, + this.orderId, + this.productId, + this.quantity, + this.createdAt, + this.updatedAt, + this.product, + }); + + factory OrderItem.fromJson(String str) => OrderItem.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory OrderItem.fromMap(Map json) => OrderItem( + id: json["id"], + orderId: json["order_id"], + productId: json["product_id"], + quantity: json["quantity"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + product: + json["product"] == null ? null : Product.fromMap(json["product"]), + ); + + Map toMap() => { + "id": id, + "order_id": orderId, + "product_id": productId, + "quantity": quantity, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + "product": product?.toMap(), + }; +} + +class Product { + final int? id; + final int? categoryId; + final String? name; + final String? description; + final String? image; + final int? price; + final int? stock; + final int? isAvailable; + final DateTime? createdAt; + final DateTime? updatedAt; + + Product({ + this.id, + this.categoryId, + this.name, + this.description, + this.image, + this.price, + this.stock, + this.isAvailable, + this.createdAt, + this.updatedAt, + }); + + factory Product.fromJson(String str) => Product.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Product.fromMap(Map json) => Product( + id: json["id"], + categoryId: json["category_id"], + name: json["name"], + description: json["description"], + image: json["image"], + price: json["price"], + stock: json["stock"], + isAvailable: json["is_available"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + ); + + Map toMap() => { + "id": id, + "category_id": categoryId, + "name": name, + "description": description, + "image": image, + "price": price, + "stock": stock, + "is_available": isAvailable, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + }; +} + +class User { + final int? id; + final String? name; + final String? email; + final String? phone; + final String? roles; + final DateTime? emailVerifiedAt; + final dynamic twoFactorSecret; + final dynamic twoFactorRecoveryCodes; + final dynamic twoFactorConfirmedAt; + final DateTime? createdAt; + final DateTime? updatedAt; + + User({ + this.id, + this.name, + this.email, + this.phone, + this.roles, + this.emailVerifiedAt, + this.twoFactorSecret, + this.twoFactorRecoveryCodes, + this.twoFactorConfirmedAt, + this.createdAt, + this.updatedAt, + }); + + factory User.fromJson(String str) => User.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory User.fromMap(Map json) => User( + id: json["id"], + name: json["name"], + email: json["email"], + phone: json["phone"], + roles: json["roles"], + emailVerifiedAt: json["email_verified_at"] == null + ? null + : DateTime.parse(json["email_verified_at"]), + twoFactorSecret: json["two_factor_secret"], + twoFactorRecoveryCodes: json["two_factor_recovery_codes"], + twoFactorConfirmedAt: json["two_factor_confirmed_at"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + ); + + Map toMap() => { + "id": id, + "name": name, + "email": email, + "phone": phone, + "roles": roles, + "email_verified_at": emailVerifiedAt?.toIso8601String(), + "two_factor_secret": twoFactorSecret, + "two_factor_recovery_codes": twoFactorRecoveryCodes, + "two_factor_confirmed_at": twoFactorConfirmedAt, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/product_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/product_response_model.dart new file mode 100644 index 0000000..fae10bd --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/product_response_model.dart @@ -0,0 +1,270 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first + +import 'dart:convert'; + +class ProductResponseModel { + final String? status; + final List? data; + + ProductResponseModel({ + this.status, + this.data, + }); + + factory ProductResponseModel.fromJson(String str) => + ProductResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory ProductResponseModel.fromMap(Map json) => + ProductResponseModel( + status: json["status"], + data: json["data"] == null + ? [] + : List.from(json["data"]!.map((x) => Product.fromMap(x))), + ); + + Map toMap() => { + "status": status, + "data": + data == null ? [] : List.from(data!.map((x) => x.toMap())), + }; +} + +class Product { + final int? id; + final int? categoryId; + final String? name; + final String? description; + final String? image; + final int? price; + final int? stock; + final int? isAvailable; + final DateTime? createdAt; + final DateTime? updatedAt; + final Category? category; + + Product({ + this.id, + this.categoryId, + this.name, + this.description, + this.image, + this.price, + this.stock, + this.isAvailable, + this.createdAt, + this.updatedAt, + this.category, + }); + + factory Product.fromJson(String str) => Product.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Product.fromMap(Map json) => Product( + id: json["id"], + categoryId: int.tryParse(json["category_id"].toString()), + name: json["name"], + description: json["description"], + image: json["image"], + price: int.tryParse(json["price"].toString()), + stock: int.tryParse(json["stock"].toString()), + isAvailable: int.tryParse(json["is_available"].toString()), + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + category: json["category"] == null + ? null + : Category.fromMap(json["category"]), + ); + + factory Product.fromOrderMap(Map json) => Product( + id: json["id_product"], + price: int.tryParse(json["price"].toString()), + ); + + factory Product.fromLocalMap(Map json) => Product( + id: json["productId"], + categoryId: json["categoryId"], + category: Category( + id: json["categoryId"], + name: json["categoryName"], + ), + name: json["name"], + description: json["description"], + image: json["image"], + price: json["price"], + stock: json["stock"], + isAvailable: json["isAvailable"], + createdAt: json["createdAt"] == null + ? null + : DateTime.parse(json["createdAt"]), + updatedAt: json["updatedAt"] == null + ? null + : DateTime.parse(json["updatedAt"]), + ); + + Map toLocalMap() => { + "productId": id, + "categoryId": categoryId, + "categoryName": category?.name, + "name": name, + "description": description, + "image": image, + "price": price, + "stock": stock, + "isAvailable": isAvailable, + "createdAt": createdAt?.toIso8601String(), + "updatedAt": updatedAt?.toIso8601String(), + }; + + Map toMap() => { + "id": id, + "category_id": categoryId, + "name": name, + "description": description, + "image": image, + "price": price, + "stock": stock, + "is_available": isAvailable, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + "category": category?.toMap(), + }; + + @override + bool operator ==(covariant Product other) { + if (identical(this, other)) return true; + + return other.id == id && + other.categoryId == categoryId && + other.name == name && + other.description == description && + other.image == image && + other.price == price && + other.stock == stock && + other.isAvailable == isAvailable && + other.createdAt == createdAt && + other.updatedAt == updatedAt && + other.category == category; + } + + @override + int get hashCode { + return id.hashCode ^ + categoryId.hashCode ^ + name.hashCode ^ + description.hashCode ^ + image.hashCode ^ + price.hashCode ^ + stock.hashCode ^ + isAvailable.hashCode ^ + createdAt.hashCode ^ + updatedAt.hashCode ^ + category.hashCode; + } + + Product copyWith({ + int? id, + int? categoryId, + String? name, + String? description, + String? image, + int? price, + int? stock, + int? isAvailable, + bool? isSync, + DateTime? createdAt, + DateTime? updatedAt, + Category? category, + }) { + return Product( + id: id ?? this.id, + categoryId: categoryId ?? this.categoryId, + name: name ?? this.name, + description: description ?? this.description, + image: image ?? this.image, + price: price ?? this.price, + stock: stock ?? this.stock, + isAvailable: isAvailable ?? this.isAvailable, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + category: category ?? this.category, + ); + } + + @override + String toString() { + return 'Product(id: $id, categoryId: $categoryId, name: $name, description: $description, image: $image, price: $price, stock: $stock, isAvailable: $isAvailable, createdAt: $createdAt, updatedAt: $updatedAt, category: $category)'; + } +} + +class Category { + final int? id; + final String? name; + final String? description; + final String? image; + final DateTime? createdAt; + final DateTime? updatedAt; + + Category({ + this.id, + this.name, + this.description, + this.image, + this.createdAt, + this.updatedAt, + }); + + factory Category.fromJson(String str) => Category.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Category.fromMap(Map json) => Category( + id: json["id"], + name: json["name"], + description: json["description"], + image: json["image"], + createdAt: json["created_at"] == null + ? null + : DateTime.parse(json["created_at"]), + updatedAt: json["updated_at"] == null + ? null + : DateTime.parse(json["updated_at"]), + ); + + Map toMap() => { + "id": id, + "name": name, + "description": description, + "image": image, + "created_at": createdAt?.toIso8601String(), + "updated_at": updatedAt?.toIso8601String(), + }; + + @override + bool operator ==(covariant Category other) { + if (identical(this, other)) return true; + + return other.id == id && + other.name == name && + other.description == description && + other.image == image && + other.createdAt == createdAt && + other.updatedAt == updatedAt; + } + + @override + int get hashCode { + return id.hashCode ^ + name.hashCode ^ + description.hashCode ^ + image.hashCode ^ + createdAt.hashCode ^ + updatedAt.hashCode; + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/province_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/province_response_model.dart new file mode 100644 index 0000000..ec074e8 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/province_response_model.dart @@ -0,0 +1,113 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +class ProvinceResponseModel { + final Rajaongkir? rajaongkir; + + ProvinceResponseModel({ + this.rajaongkir, + }); + + factory ProvinceResponseModel.fromJson(String str) => + ProvinceResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory ProvinceResponseModel.fromMap(Map json) => + ProvinceResponseModel( + rajaongkir: json["rajaongkir"] == null + ? null + : Rajaongkir.fromMap(json["rajaongkir"]), + ); + + Map toMap() => { + "rajaongkir": rajaongkir?.toMap(), + }; +} + +class Rajaongkir { + final List? query; + final Status? status; + final List? results; + + Rajaongkir({ + this.query, + this.status, + this.results, + }); + + factory Rajaongkir.fromJson(String str) => + Rajaongkir.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Rajaongkir.fromMap(Map json) => Rajaongkir( + query: json["query"] == null + ? [] + : List.from(json["query"]!.map((x) => x)), + status: json["status"] == null ? null : Status.fromMap(json["status"]), + results: json["results"] == null + ? [] + : List.from( + json["results"]!.map((x) => Provinces.fromMap(x))), + ); + + Map toMap() => { + "query": query == null ? [] : List.from(query!.map((x) => x)), + "status": status?.toMap(), + "results": results == null + ? [] + : List.from(results!.map((x) => x.toMap())), + }; +} + +class Provinces { + final String? provinceId; + final String? province; + + Provinces({ + this.provinceId, + this.province, + }); + + factory Provinces.fromJson(String str) => Provinces.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Provinces.fromMap(Map json) => Provinces( + provinceId: json["province_id"], + province: json["province"], + ); + + Map toMap() => { + "province_id": provinceId, + "province": province, + }; + + @override + String toString() => '$province'; +} + +class Status { + final int? code; + final String? description; + + Status({ + this.code, + this.description, + }); + + factory Status.fromJson(String str) => Status.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Status.fromMap(Map json) => Status( + code: json["code"], + description: json["description"], + ); + + Map toMap() => { + "code": code, + "description": description, + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/subdistrict_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/subdistrict_response_model.dart new file mode 100644 index 0000000..f0adea3 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/subdistrict_response_model.dart @@ -0,0 +1,178 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +class SubdistrictResponseModel { + final Rajaongkir? rajaongkir; + + SubdistrictResponseModel({ + this.rajaongkir, + }); + + factory SubdistrictResponseModel.fromJson(String str) => + SubdistrictResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory SubdistrictResponseModel.fromMap(Map json) => + SubdistrictResponseModel( + rajaongkir: json["rajaongkir"] == null + ? null + : Rajaongkir.fromMap(json["rajaongkir"]), + ); + + Map toMap() => { + "rajaongkir": rajaongkir?.toMap(), + }; +} + +class Rajaongkir { + final Query? query; + final Status? status; + final List? results; + + Rajaongkir({ + this.query, + this.status, + this.results, + }); + + factory Rajaongkir.fromJson(String str) => + Rajaongkir.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Rajaongkir.fromMap(Map json) => Rajaongkir( + query: json["query"] == null ? null : Query.fromMap(json["query"]), + status: json["status"] == null ? null : Status.fromMap(json["status"]), + results: json["results"] == null + ? [] + : List.from( + json["results"]!.map((x) => Subdistrict.fromMap(x))), + ); + + Map toMap() => { + "query": query?.toMap(), + "status": status?.toMap(), + "results": results == null + ? [] + : List.from(results!.map((x) => x.toMap())), + }; +} + +class Query { + final String? city; + + Query({ + this.city, + }); + + factory Query.fromJson(String str) => Query.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Query.fromMap(Map json) => Query( + city: json["city"], + ); + + Map toMap() => { + "city": city, + }; +} + +class Subdistrict { + final String? subdistrictId; + final String? provinceId; + final Province? province; + final String? cityId; + final City? city; + final Type? type; + final String? subdistrictName; + + Subdistrict({ + this.subdistrictId, + this.provinceId, + this.province, + this.cityId, + this.city, + this.type, + this.subdistrictName, + }); + + factory Subdistrict.fromJson(String str) => + Subdistrict.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Subdistrict.fromMap(Map json) => Subdistrict( + subdistrictId: json["subdistrict_id"], + provinceId: json["province_id"], + province: provinceValues.map[json["province"]], + cityId: json["city_id"], + city: cityValues.map[json["city"]], + type: typeValues.map[json["type"]], + subdistrictName: json["subdistrict_name"], + ); + + Map toMap() => { + "subdistrict_id": subdistrictId, + "province_id": provinceId, + "province": provinceValues.reverse[province], + "city_id": cityId, + "city": cityValues.reverse[city], + "type": typeValues.reverse[type], + "subdistrict_name": subdistrictName, + }; + + @override + String toString() { + return '$subdistrictName'; + } +} + +enum City { SLEMAN } + +final cityValues = EnumValues({"Sleman": City.SLEMAN}); + +enum Province { DI_YOGYAKARTA } + +final provinceValues = EnumValues({"DI Yogyakarta": Province.DI_YOGYAKARTA}); + +enum Type { KABUPATEN } + +final typeValues = EnumValues({"Kabupaten": Type.KABUPATEN}); + +class Status { + final int? code; + final String? description; + + Status({ + this.code, + this.description, + }); + + factory Status.fromJson(String str) => Status.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Status.fromMap(Map json) => Status( + code: json["code"], + description: json["description"], + ); + + Map toMap() => { + "code": code, + "description": description, + }; +} + +class EnumValues { + Map map; + late Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + reverseMap = map.map((k, v) => MapEntry(v, k)); + return reverseMap; + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/tracking_response_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/tracking_response_model.dart new file mode 100644 index 0000000..537f248 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/data/models/responses/tracking_response_model.dart @@ -0,0 +1,361 @@ +import 'dart:convert'; + +class TrackingResponseModel { + final Rajaongkir? rajaongkir; + + TrackingResponseModel({ + this.rajaongkir, + }); + + factory TrackingResponseModel.fromJson(String str) => + TrackingResponseModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory TrackingResponseModel.fromMap(Map json) => + TrackingResponseModel( + rajaongkir: json["rajaongkir"] == null + ? null + : Rajaongkir.fromMap(json["rajaongkir"]), + ); + + Map toMap() => { + "rajaongkir": rajaongkir?.toMap(), + }; +} + +class Rajaongkir { + final Query? query; + final Status? status; + final Result? result; + + Rajaongkir({ + this.query, + this.status, + this.result, + }); + + factory Rajaongkir.fromJson(String str) => + Rajaongkir.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Rajaongkir.fromMap(Map json) => Rajaongkir( + query: json["query"] == null ? null : Query.fromMap(json["query"]), + status: json["status"] == null ? null : Status.fromMap(json["status"]), + result: json["result"] == null ? null : Result.fromMap(json["result"]), + ); + + Map toMap() => { + "query": query?.toMap(), + "status": status?.toMap(), + "result": result?.toMap(), + }; +} + +class Query { + final String? waybill; + final String? courier; + + Query({ + this.waybill, + this.courier, + }); + + factory Query.fromJson(String str) => Query.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Query.fromMap(Map json) => Query( + waybill: json["waybill"], + courier: json["courier"], + ); + + Map toMap() => { + "waybill": waybill, + "courier": courier, + }; +} + +class Result { + final bool? delivered; + final Summary? summary; + final Details? details; + final List? manifest; + final DeliveryStatus? deliveryStatus; + + Result({ + this.delivered, + this.summary, + this.details, + this.manifest, + this.deliveryStatus, + }); + + factory Result.fromJson(String str) => Result.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Result.fromMap(Map json) => Result( + delivered: json["delivered"], + summary: + json["summary"] == null ? null : Summary.fromMap(json["summary"]), + details: + json["details"] == null ? null : Details.fromMap(json["details"]), + manifest: json["manifest"] == null + ? [] + : List.from( + json["manifest"]!.map((x) => Manifest.fromMap(x))), + deliveryStatus: json["delivery_status"] == null + ? null + : DeliveryStatus.fromMap(json["delivery_status"]), + ); + + Map toMap() => { + "delivered": delivered, + "summary": summary?.toMap(), + "details": details?.toMap(), + "manifest": manifest == null + ? [] + : List.from(manifest!.map((x) => x.toMap())), + "delivery_status": deliveryStatus?.toMap(), + }; +} + +class DeliveryStatus { + final String? status; + final String? podReceiver; + final String? podDate; + final String? podTime; + + DeliveryStatus({ + this.status, + this.podReceiver, + this.podDate, + this.podTime, + }); + + factory DeliveryStatus.fromJson(String str) => + DeliveryStatus.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory DeliveryStatus.fromMap(Map json) => DeliveryStatus( + status: json["status"], + podReceiver: json["pod_receiver"], + podDate: json["pod_date"], + podTime: json["pod_time"], + ); + + Map toMap() => { + "status": status, + "pod_receiver": podReceiver, + "pod_date": podDate, + "pod_time": podTime, + }; +} + +class Details { + final String? waybillNumber; + final DateTime? waybillDate; + final String? waybillTime; + final String? weight; + final String? origin; + final String? destination; + final String? shippperName; + final String? shipperAddress1; + final String? shipperAddress2; + final String? shipperAddress3; + final String? shipperCity; + final String? receiverName; + final String? receiverAddress1; + final String? receiverAddress2; + final String? receiverAddress3; + final String? receiverCity; + + Details({ + this.waybillNumber, + this.waybillDate, + this.waybillTime, + this.weight, + this.origin, + this.destination, + this.shippperName, + this.shipperAddress1, + this.shipperAddress2, + this.shipperAddress3, + this.shipperCity, + this.receiverName, + this.receiverAddress1, + this.receiverAddress2, + this.receiverAddress3, + this.receiverCity, + }); + + factory Details.fromJson(String str) => Details.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Details.fromMap(Map json) => Details( + waybillNumber: json["waybill_number"], + waybillDate: json["waybill_date"] == null + ? null + : DateTime.parse(json["waybill_date"]), + waybillTime: json["waybill_time"], + weight: json["weight"], + origin: json["origin"], + destination: json["destination"], + shippperName: json["shippper_name"], + shipperAddress1: json["shipper_address1"], + shipperAddress2: json["shipper_address2"], + shipperAddress3: json["shipper_address3"], + shipperCity: json["shipper_city"], + receiverName: json["receiver_name"], + receiverAddress1: json["receiver_address1"], + receiverAddress2: json["receiver_address2"], + receiverAddress3: json["receiver_address3"], + receiverCity: json["receiver_city"], + ); + + Map toMap() => { + "waybill_number": waybillNumber, + "waybill_date": + "${waybillDate!.year.toString().padLeft(4, '0')}-${waybillDate!.month.toString().padLeft(2, '0')}-${waybillDate!.day.toString().padLeft(2, '0')}", + "waybill_time": waybillTime, + "weight": weight, + "origin": origin, + "destination": destination, + "shippper_name": shippperName, + "shipper_address1": shipperAddress1, + "shipper_address2": shipperAddress2, + "shipper_address3": shipperAddress3, + "shipper_city": shipperCity, + "receiver_name": receiverName, + "receiver_address1": receiverAddress1, + "receiver_address2": receiverAddress2, + "receiver_address3": receiverAddress3, + "receiver_city": receiverCity, + }; +} + +class Manifest { + final String? manifestCode; + final String? manifestDescription; + final DateTime? manifestDate; + final String? manifestTime; + final String? cityName; + + Manifest({ + this.manifestCode, + this.manifestDescription, + this.manifestDate, + this.manifestTime, + this.cityName, + }); + + factory Manifest.fromJson(String str) => Manifest.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Manifest.fromMap(Map json) => Manifest( + manifestCode: json["manifest_code"], + manifestDescription: json["manifest_description"], + manifestDate: json["manifest_date"] == null + ? null + : DateTime.parse(json["manifest_date"]), + manifestTime: json["manifest_time"], + cityName: json["city_name"], + ); + + Map toMap() => { + "manifest_code": manifestCode, + "manifest_description": manifestDescription, + "manifest_date": + "${manifestDate!.year.toString().padLeft(4, '0')}-${manifestDate!.month.toString().padLeft(2, '0')}-${manifestDate!.day.toString().padLeft(2, '0')}", + "manifest_time": manifestTime, + "city_name": cityName, + }; +} + +class Summary { + final String? courierCode; + final String? courierName; + final String? waybillNumber; + final String? serviceCode; + final DateTime? waybillDate; + final String? shipperName; + final String? receiverName; + final String? origin; + final String? destination; + final String? status; + + Summary({ + this.courierCode, + this.courierName, + this.waybillNumber, + this.serviceCode, + this.waybillDate, + this.shipperName, + this.receiverName, + this.origin, + this.destination, + this.status, + }); + + factory Summary.fromJson(String str) => Summary.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Summary.fromMap(Map json) => Summary( + courierCode: json["courier_code"], + courierName: json["courier_name"], + waybillNumber: json["waybill_number"], + serviceCode: json["service_code"], + waybillDate: json["waybill_date"] == null + ? null + : DateTime.parse(json["waybill_date"]), + shipperName: json["shipper_name"], + receiverName: json["receiver_name"], + origin: json["origin"], + destination: json["destination"], + status: json["status"], + ); + + Map toMap() => { + "courier_code": courierCode, + "courier_name": courierName, + "waybill_number": waybillNumber, + "service_code": serviceCode, + "waybill_date": + "${waybillDate!.year.toString().padLeft(4, '0')}-${waybillDate!.month.toString().padLeft(2, '0')}-${waybillDate!.day.toString().padLeft(2, '0')}", + "shipper_name": shipperName, + "receiver_name": receiverName, + "origin": origin, + "destination": destination, + "status": status, + }; +} + +class Status { + final int? code; + final String? description; + + Status({ + this.code, + this.description, + }); + + factory Status.fromJson(String str) => Status.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory Status.fromMap(Map json) => Status( + code: json["code"], + description: json["description"], + ); + + Map toMap() => { + "code": code, + "description": description, + }; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/account/pages/account_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/account/pages/account_page.dart new file mode 100644 index 0000000..3bf8f6e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/account/pages/account_page.dart @@ -0,0 +1,274 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/bloc/profile/profile_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/pages/profile_page.dart'; +import 'package:go_router/go_router.dart'; +import 'package:image_picker/image_picker.dart'; +import 'dart:io'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/router/app_router.dart'; +import '../../auth/bloc/logout/logout_bloc.dart'; +import '../widgets/custome_textfield.dart'; + +class AccountPage extends StatefulWidget { + const AccountPage({super.key}); + + @override + State createState() => _AccountPageState(); +} + +class _AccountPageState extends State { + final _nameController = TextEditingController(); + final _emailController = TextEditingController(); + final _phoneController = TextEditingController(); + File? _foto; + + @override + void initState() { + super.initState(); + context.read().add(const ProfileEvent.getProfile()); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Akun'), + actions: [ + IconButton( + icon: const Icon( + Icons.login_outlined, + color: AppColors.primary, + ), + onPressed: () { + showDialog( + context: context, + builder: (context) => const ShowDialogLogout()); + }, + ), + ], + ), + body: BlocConsumer( + listener: (context, state) { + state.maybeWhen( + profileLoaded: (profile) { + _nameController.text = profile['user']['name']; + _emailController.text = profile['user']['email']; + _phoneController.text = profile['user']['phone']; + }, + profileUpdated: () { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Profile Berhasil di Perbarui'), + backgroundColor: AppColors.primary, + ), + ); + Navigator.push(context, + MaterialPageRoute(builder: (context) => const ProfilePage())); + }, + error: (message) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(message), + backgroundColor: Colors.red, + ), + ); + }, + orElse: () {}, + ); + }, + builder: (context, state) { + return state.maybeWhen( + loading: () => const Center(child: CircularProgressIndicator()), + profileLoaded: (_) => _buildProfileForm(context), + orElse: () => const Center(child: CircularProgressIndicator()), + ); + }, + ), + ); + } + + Widget _buildProfileForm(BuildContext context) { + return ListView( + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20), + children: [ + Container( + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 30), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.white, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: GestureDetector( + onTap: () async { + final pickedFile = await ImagePicker() + .pickImage(source: ImageSource.gallery); + if (pickedFile != null) { + setState(() { + _foto = File(pickedFile.path); + }); + } + }, + child: const SizedBox() + // CircleAvatar( + // radius: 60, + // backgroundImage: _foto != null + // ? FileImage(_foto!) + // : const AssetImage('assets/images/img_friend4.png') + // as ImageProvider, + // ), + ), + ), + // const SizedBox(height: 10), + // const Text( + // "Ganti Foto Profile", + // style: TextStyle( + // fontWeight: FontWeight.w700, + // fontSize: 15, + // ), + // ), + const SizedBox(height: 12), + CustomeTextField( + title: "Nama", + controller: _nameController, + ), + const SizedBox(height: 10), + CustomeTextField( + title: "Email", + controller: _emailController, + ), + const SizedBox(height: 10), + CustomeTextField( + title: "No.HP", + controller: _phoneController, + ), + const SizedBox(height: 50), + SizedBox( + width: double.infinity, + height: 50, + child: TextButton( + onPressed: () { + if (_nameController.text.isNotEmpty && + _emailController.text.isNotEmpty && + _phoneController.text.isNotEmpty) { + context + .read() + .add(ProfileEvent.updateProfile( + name: _nameController.text, + email: _emailController.text, + phone: _phoneController.text, + foto: _foto, + )); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('All fields are required'), + backgroundColor: Colors.red, + ), + ); + } + }, + style: TextButton.styleFrom( + backgroundColor: AppColors.primary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(56), + ), + ), + child: const Text( + "Edit", + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), + ), + ), + ], + ), + ), + ], + ); + } +} + +class ShowDialogLogout extends StatelessWidget { + const ShowDialogLogout({super.key}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + insetPadding: const EdgeInsets.symmetric(horizontal: 30), + title: const Text( + "Logout", + style: TextStyle( + color: AppColors.black, + fontWeight: FontWeight.w700, + ), + ), + content: const Text( + "Apakah anda ingin logout ? ", + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text( + 'Cancel', + style: TextStyle( + color: AppColors.primary, + fontWeight: FontWeight.w700, + ), + ), + ), + BlocConsumer( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + loaded: () { + context + .read() + .add(const CheckoutEvent.started()); + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + content: Text('Logout Success'), + backgroundColor: AppColors.primary, + )); + context.goNamed( + RouteConstants.login, + ); + }, + error: (message) { + context + .read() + .add(const CheckoutEvent.started()); + context.goNamed( + RouteConstants.login, + ); + }); + }, + builder: (context, state) { + return state.maybeWhen( + loading: () => const CircularProgressIndicator(), + orElse: () => TextButton( + onPressed: () { + context.read().add(const LogoutEvent.logout()); + }, + child: const Text( + 'Logout', + style: TextStyle( + color: AppColors.primary, + fontWeight: FontWeight.w700, + ), + )), + ); + }, + ) + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/account/widgets/custome_textfield.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/account/widgets/custome_textfield.dart new file mode 100644 index 0000000..910b2cf --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/account/widgets/custome_textfield.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; + + +class CustomeTextField extends StatelessWidget { + final String title; + final bool obscureText; + final String? value; + final TextEditingController? controller; + final bool isShowTitle; + final Function(String)? onChanged; + final Function(String)? onSave; + final String? Function(String?)? validator; + final String? keyboardType; + final String? hinText; + final String? initialValue; + const CustomeTextField({ + super.key, + required this.title, + this.value, + this.obscureText = false, + this.controller, + this.onChanged, + this.isShowTitle = true, + this.validator, + this.keyboardType, + this.onSave, + this.hinText, + this.initialValue, + }); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (isShowTitle) + Text( + title, + style: TextStyle(fontSize: 14, fontWeight: FontWeight.w700), + ), + if (isShowTitle) + const SizedBox( + height: 8, + ), + TextFormField( + controller: controller, + initialValue: initialValue, + keyboardType: (obscureText == false) + ? TextInputType.text + : TextInputType.number, + validator: validator, + onChanged: onChanged != null ? (value) => onChanged!(value) : null, + onSaved: onSave != null ? (value) => onSave!(value.toString()) : null, + obscureText: obscureText, + decoration: InputDecoration( + hintText: hinText, + hintStyle: const TextStyle(color: Colors.amber), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: BorderSide(color: Colors.grey.shade300), + ), + contentPadding: const EdgeInsets.all(12), + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_bloc.dart new file mode 100644 index 0000000..1ec78ae --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_bloc.dart @@ -0,0 +1,27 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/address_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/requests/address_request_model.dart'; + +part 'add_address_bloc.freezed.dart'; +part 'add_address_event.dart'; +part 'add_address_state.dart'; + +class AddAddressBloc extends Bloc { + final AddressRemoteDatasource _addressRemoteDatasource; + AddAddressBloc( + this._addressRemoteDatasource, + ) : super(const _Initial()) { + on<_AddAddress>((event, emit) async { + emit(const _Loading()); + final response = + await _addressRemoteDatasource.addAddress(event.addressRequestModel); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(const _Loaded()), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_bloc.freezed.dart new file mode 100644 index 0000000..eede60e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_bloc.freezed.dart @@ -0,0 +1,875 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'add_address_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$AddAddressEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(AddressRequestModel addressRequestModel) + addAddress, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(AddressRequestModel addressRequestModel)? addAddress, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(AddressRequestModel addressRequestModel)? addAddress, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddAddress value) addAddress, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddAddress value)? addAddress, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddAddress value)? addAddress, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $AddAddressEventCopyWith<$Res> { + factory $AddAddressEventCopyWith( + AddAddressEvent value, $Res Function(AddAddressEvent) then) = + _$AddAddressEventCopyWithImpl<$Res, AddAddressEvent>; +} + +/// @nodoc +class _$AddAddressEventCopyWithImpl<$Res, $Val extends AddAddressEvent> + implements $AddAddressEventCopyWith<$Res> { + _$AddAddressEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$AddAddressEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'AddAddressEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(AddressRequestModel addressRequestModel) + addAddress, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(AddressRequestModel addressRequestModel)? addAddress, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(AddressRequestModel addressRequestModel)? addAddress, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddAddress value) addAddress, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddAddress value)? addAddress, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddAddress value)? addAddress, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements AddAddressEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$AddAddressImplCopyWith<$Res> { + factory _$$AddAddressImplCopyWith( + _$AddAddressImpl value, $Res Function(_$AddAddressImpl) then) = + __$$AddAddressImplCopyWithImpl<$Res>; + @useResult + $Res call({AddressRequestModel addressRequestModel}); +} + +/// @nodoc +class __$$AddAddressImplCopyWithImpl<$Res> + extends _$AddAddressEventCopyWithImpl<$Res, _$AddAddressImpl> + implements _$$AddAddressImplCopyWith<$Res> { + __$$AddAddressImplCopyWithImpl( + _$AddAddressImpl _value, $Res Function(_$AddAddressImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? addressRequestModel = null, + }) { + return _then(_$AddAddressImpl( + addressRequestModel: null == addressRequestModel + ? _value.addressRequestModel + : addressRequestModel // ignore: cast_nullable_to_non_nullable + as AddressRequestModel, + )); + } +} + +/// @nodoc + +class _$AddAddressImpl implements _AddAddress { + const _$AddAddressImpl({required this.addressRequestModel}); + + @override + final AddressRequestModel addressRequestModel; + + @override + String toString() { + return 'AddAddressEvent.addAddress(addressRequestModel: $addressRequestModel)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AddAddressImpl && + (identical(other.addressRequestModel, addressRequestModel) || + other.addressRequestModel == addressRequestModel)); + } + + @override + int get hashCode => Object.hash(runtimeType, addressRequestModel); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AddAddressImplCopyWith<_$AddAddressImpl> get copyWith => + __$$AddAddressImplCopyWithImpl<_$AddAddressImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(AddressRequestModel addressRequestModel) + addAddress, + }) { + return addAddress(addressRequestModel); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(AddressRequestModel addressRequestModel)? addAddress, + }) { + return addAddress?.call(addressRequestModel); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(AddressRequestModel addressRequestModel)? addAddress, + required TResult orElse(), + }) { + if (addAddress != null) { + return addAddress(addressRequestModel); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddAddress value) addAddress, + }) { + return addAddress(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddAddress value)? addAddress, + }) { + return addAddress?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddAddress value)? addAddress, + required TResult orElse(), + }) { + if (addAddress != null) { + return addAddress(this); + } + return orElse(); + } +} + +abstract class _AddAddress implements AddAddressEvent { + const factory _AddAddress( + {required final AddressRequestModel addressRequestModel}) = + _$AddAddressImpl; + + AddressRequestModel get addressRequestModel; + @JsonKey(ignore: true) + _$$AddAddressImplCopyWith<_$AddAddressImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$AddAddressState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $AddAddressStateCopyWith<$Res> { + factory $AddAddressStateCopyWith( + AddAddressState value, $Res Function(AddAddressState) then) = + _$AddAddressStateCopyWithImpl<$Res, AddAddressState>; +} + +/// @nodoc +class _$AddAddressStateCopyWithImpl<$Res, $Val extends AddAddressState> + implements $AddAddressStateCopyWith<$Res> { + _$AddAddressStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$AddAddressStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'AddAddressState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements AddAddressState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$AddAddressStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'AddAddressState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements AddAddressState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$AddAddressStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(); + + @override + String toString() { + return 'AddAddressState.loaded()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return loaded(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements AddAddressState { + const factory _Loaded() = _$LoadedImpl; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$AddAddressStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'AddAddressState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements AddAddressState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_event.dart new file mode 100644 index 0000000..b5a2c5b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_event.dart @@ -0,0 +1,8 @@ +part of 'add_address_bloc.dart'; + +@freezed +class AddAddressEvent with _$AddAddressEvent { + const factory AddAddressEvent.started() = _Started; + const factory AddAddressEvent.addAddress( + {required AddressRequestModel addressRequestModel}) = _AddAddress; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_state.dart new file mode 100644 index 0000000..fdafb67 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/add_address/add_address_state.dart @@ -0,0 +1,9 @@ +part of 'add_address_bloc.dart'; + +@freezed +class AddAddressState with _$AddAddressState { + const factory AddAddressState.initial() = _Initial; + const factory AddAddressState.loading() = _Loading; + const factory AddAddressState.loaded() = _Loaded; + const factory AddAddressState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_bloc.dart new file mode 100644 index 0000000..a969822 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_bloc.dart @@ -0,0 +1,27 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/address_remote_datasource.dart'; + +import '../../../../data/models/responses/address_response_model.dart'; + +part 'address_bloc.freezed.dart'; +part 'address_event.dart'; +part 'address_state.dart'; + +class AddressBloc extends Bloc { + final AddressRemoteDatasource _addressRemoteDatasource; + AddressBloc( + this._addressRemoteDatasource, + ) : super(const _Initial()) { + on<_GetAddress>((event, emit) async { + emit(const _Loading()); + final response = await _addressRemoteDatasource.getAddress(); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r.data ?? [])), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_bloc.freezed.dart new file mode 100644 index 0000000..4dfe48b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_bloc.freezed.dart @@ -0,0 +1,875 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'address_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$AddressEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getAddress, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getAddress, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getAddress, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetAddress value) getAddress, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetAddress value)? getAddress, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetAddress value)? getAddress, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $AddressEventCopyWith<$Res> { + factory $AddressEventCopyWith( + AddressEvent value, $Res Function(AddressEvent) then) = + _$AddressEventCopyWithImpl<$Res, AddressEvent>; +} + +/// @nodoc +class _$AddressEventCopyWithImpl<$Res, $Val extends AddressEvent> + implements $AddressEventCopyWith<$Res> { + _$AddressEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$AddressEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'AddressEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getAddress, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getAddress, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getAddress, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetAddress value) getAddress, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetAddress value)? getAddress, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetAddress value)? getAddress, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements AddressEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetAddressImplCopyWith<$Res> { + factory _$$GetAddressImplCopyWith( + _$GetAddressImpl value, $Res Function(_$GetAddressImpl) then) = + __$$GetAddressImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$GetAddressImplCopyWithImpl<$Res> + extends _$AddressEventCopyWithImpl<$Res, _$GetAddressImpl> + implements _$$GetAddressImplCopyWith<$Res> { + __$$GetAddressImplCopyWithImpl( + _$GetAddressImpl _value, $Res Function(_$GetAddressImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$GetAddressImpl implements _GetAddress { + const _$GetAddressImpl(); + + @override + String toString() { + return 'AddressEvent.getAddress()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$GetAddressImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getAddress, + }) { + return getAddress(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getAddress, + }) { + return getAddress?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getAddress, + required TResult orElse(), + }) { + if (getAddress != null) { + return getAddress(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetAddress value) getAddress, + }) { + return getAddress(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetAddress value)? getAddress, + }) { + return getAddress?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetAddress value)? getAddress, + required TResult orElse(), + }) { + if (getAddress != null) { + return getAddress(this); + } + return orElse(); + } +} + +abstract class _GetAddress implements AddressEvent { + const factory _GetAddress() = _$GetAddressImpl; +} + +/// @nodoc +mixin _$AddressState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List
address) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List
address)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List
address)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $AddressStateCopyWith<$Res> { + factory $AddressStateCopyWith( + AddressState value, $Res Function(AddressState) then) = + _$AddressStateCopyWithImpl<$Res, AddressState>; +} + +/// @nodoc +class _$AddressStateCopyWithImpl<$Res, $Val extends AddressState> + implements $AddressStateCopyWith<$Res> { + _$AddressStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$AddressStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'AddressState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List
address) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List
address)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List
address)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements AddressState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$AddressStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'AddressState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List
address) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List
address)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List
address)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements AddressState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List
address}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$AddressStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? address = null, + }) { + return _then(_$LoadedImpl( + null == address + ? _value._address + : address // ignore: cast_nullable_to_non_nullable + as List
, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List
address) : _address = address; + + final List
_address; + @override + List
get address { + if (_address is EqualUnmodifiableListView) return _address; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_address); + } + + @override + String toString() { + return 'AddressState.loaded(address: $address)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality().equals(other._address, _address)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_address)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List
address) loaded, + required TResult Function(String message) error, + }) { + return loaded(address); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List
address)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(address); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List
address)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(address); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements AddressState { + const factory _Loaded(final List
address) = _$LoadedImpl; + + List
get address; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$AddressStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'AddressState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List
address) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List
address)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List
address)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements AddressState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_event.dart new file mode 100644 index 0000000..6bf60f6 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_event.dart @@ -0,0 +1,7 @@ +part of 'address_bloc.dart'; + +@freezed +class AddressEvent with _$AddressEvent { + const factory AddressEvent.started() = _Started; + const factory AddressEvent.getAddress() = _GetAddress; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_state.dart new file mode 100644 index 0000000..05b64ba --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/address/address_state.dart @@ -0,0 +1,9 @@ +part of 'address_bloc.dart'; + +@freezed +class AddressState with _$AddressState { + const factory AddressState.initial() = _Initial; + const factory AddressState.loading() = _Loading; + const factory AddressState.loaded(List
address) = _Loaded; + const factory AddressState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_bloc.dart new file mode 100644 index 0000000..99fdddd --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_bloc.dart @@ -0,0 +1,28 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/rajaongkir_remote_datasource.dart'; + +import '../../../../data/models/responses/city_response_model.dart'; + +part 'city_bloc.freezed.dart'; +part 'city_event.dart'; +part 'city_state.dart'; + +class CityBloc extends Bloc { + final RajaongkirRemoteDatasource _rajaongkirRemoteDatasource; + CityBloc( + this._rajaongkirRemoteDatasource, + ) : super(const _Initial()) { + on<_GetCity>((event, emit) async { + emit(const _Loading()); + final response = + await _rajaongkirRemoteDatasource.getCitiesByprovince(event.provId); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r.rajaongkir?.results ?? [])), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_bloc.freezed.dart new file mode 100644 index 0000000..86d12de --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_bloc.freezed.dart @@ -0,0 +1,904 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'city_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$CityEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String provId) getCityByProvince, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String provId)? getCityByProvince, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String provId)? getCityByProvince, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetCity value) getCityByProvince, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetCity value)? getCityByProvince, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetCity value)? getCityByProvince, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CityEventCopyWith<$Res> { + factory $CityEventCopyWith(CityEvent value, $Res Function(CityEvent) then) = + _$CityEventCopyWithImpl<$Res, CityEvent>; +} + +/// @nodoc +class _$CityEventCopyWithImpl<$Res, $Val extends CityEvent> + implements $CityEventCopyWith<$Res> { + _$CityEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$CityEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'CityEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String provId) getCityByProvince, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String provId)? getCityByProvince, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String provId)? getCityByProvince, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetCity value) getCityByProvince, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetCity value)? getCityByProvince, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetCity value)? getCityByProvince, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements CityEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetCityImplCopyWith<$Res> { + factory _$$GetCityImplCopyWith( + _$GetCityImpl value, $Res Function(_$GetCityImpl) then) = + __$$GetCityImplCopyWithImpl<$Res>; + @useResult + $Res call({String provId}); +} + +/// @nodoc +class __$$GetCityImplCopyWithImpl<$Res> + extends _$CityEventCopyWithImpl<$Res, _$GetCityImpl> + implements _$$GetCityImplCopyWith<$Res> { + __$$GetCityImplCopyWithImpl( + _$GetCityImpl _value, $Res Function(_$GetCityImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? provId = null, + }) { + return _then(_$GetCityImpl( + null == provId + ? _value.provId + : provId // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$GetCityImpl implements _GetCity { + const _$GetCityImpl(this.provId); + + @override + final String provId; + + @override + String toString() { + return 'CityEvent.getCityByProvince(provId: $provId)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GetCityImpl && + (identical(other.provId, provId) || other.provId == provId)); + } + + @override + int get hashCode => Object.hash(runtimeType, provId); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$GetCityImplCopyWith<_$GetCityImpl> get copyWith => + __$$GetCityImplCopyWithImpl<_$GetCityImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String provId) getCityByProvince, + }) { + return getCityByProvince(provId); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String provId)? getCityByProvince, + }) { + return getCityByProvince?.call(provId); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String provId)? getCityByProvince, + required TResult orElse(), + }) { + if (getCityByProvince != null) { + return getCityByProvince(provId); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetCity value) getCityByProvince, + }) { + return getCityByProvince(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetCity value)? getCityByProvince, + }) { + return getCityByProvince?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetCity value)? getCityByProvince, + required TResult orElse(), + }) { + if (getCityByProvince != null) { + return getCityByProvince(this); + } + return orElse(); + } +} + +abstract class _GetCity implements CityEvent { + const factory _GetCity(final String provId) = _$GetCityImpl; + + String get provId; + @JsonKey(ignore: true) + _$$GetCityImplCopyWith<_$GetCityImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$CityState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List cities) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List cities)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List cities)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CityStateCopyWith<$Res> { + factory $CityStateCopyWith(CityState value, $Res Function(CityState) then) = + _$CityStateCopyWithImpl<$Res, CityState>; +} + +/// @nodoc +class _$CityStateCopyWithImpl<$Res, $Val extends CityState> + implements $CityStateCopyWith<$Res> { + _$CityStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$CityStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'CityState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List cities) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List cities)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List cities)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements CityState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$CityStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'CityState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List cities) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List cities)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List cities)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements CityState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List cities}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$CityStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? cities = null, + }) { + return _then(_$LoadedImpl( + null == cities + ? _value._cities + : cities // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List cities) : _cities = cities; + + final List _cities; + @override + List get cities { + if (_cities is EqualUnmodifiableListView) return _cities; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_cities); + } + + @override + String toString() { + return 'CityState.loaded(cities: $cities)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality().equals(other._cities, _cities)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_cities)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List cities) loaded, + required TResult Function(String message) error, + }) { + return loaded(cities); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List cities)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(cities); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List cities)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(cities); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements CityState { + const factory _Loaded(final List cities) = _$LoadedImpl; + + List get cities; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$CityStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'CityState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List cities) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List cities)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List cities)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements CityState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_event.dart new file mode 100644 index 0000000..c979d33 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_event.dart @@ -0,0 +1,7 @@ +part of 'city_bloc.dart'; + +@freezed +class CityEvent with _$CityEvent { + const factory CityEvent.started() = _Started; + const factory CityEvent.getCityByProvince(String provId) = _GetCity; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_state.dart new file mode 100644 index 0000000..19d3bfc --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/city/city_state.dart @@ -0,0 +1,9 @@ +part of 'city_bloc.dart'; + +@freezed +class CityState with _$CityState { + const factory CityState.initial() = _Initial; + const factory CityState.loading() = _Loading; + const factory CityState.loaded(List cities) = _Loaded; + const factory CityState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_bloc.dart new file mode 100644 index 0000000..47255dd --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_bloc.dart @@ -0,0 +1,29 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/rajaongkir_remote_datasource.dart'; + +import '../../../../data/models/responses/province_response_model.dart'; + +part 'province_bloc.freezed.dart'; +part 'province_event.dart'; +part 'province_state.dart'; + +class ProvinceBloc extends Bloc { + final RajaongkirRemoteDatasource _rajaongkirRemoteDatasource; + ProvinceBloc( + this._rajaongkirRemoteDatasource, + ) : super(const _Initial()) { + on<_GetProvince>( + (event, emit) async { + emit(const _Loading()); + final response = await _rajaongkirRemoteDatasource.getProvinces(); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r.rajaongkir?.results ?? [])), + ); + }, + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_bloc.freezed.dart new file mode 100644 index 0000000..956fc56 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_bloc.freezed.dart @@ -0,0 +1,876 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'province_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$ProvinceEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProvince, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProvince, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProvince, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProvince value) getProvince, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProvince value)? getProvince, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProvince value)? getProvince, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ProvinceEventCopyWith<$Res> { + factory $ProvinceEventCopyWith( + ProvinceEvent value, $Res Function(ProvinceEvent) then) = + _$ProvinceEventCopyWithImpl<$Res, ProvinceEvent>; +} + +/// @nodoc +class _$ProvinceEventCopyWithImpl<$Res, $Val extends ProvinceEvent> + implements $ProvinceEventCopyWith<$Res> { + _$ProvinceEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$ProvinceEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'ProvinceEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProvince, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProvince, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProvince, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProvince value) getProvince, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProvince value)? getProvince, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProvince value)? getProvince, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements ProvinceEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetProvinceImplCopyWith<$Res> { + factory _$$GetProvinceImplCopyWith( + _$GetProvinceImpl value, $Res Function(_$GetProvinceImpl) then) = + __$$GetProvinceImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$GetProvinceImplCopyWithImpl<$Res> + extends _$ProvinceEventCopyWithImpl<$Res, _$GetProvinceImpl> + implements _$$GetProvinceImplCopyWith<$Res> { + __$$GetProvinceImplCopyWithImpl( + _$GetProvinceImpl _value, $Res Function(_$GetProvinceImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$GetProvinceImpl implements _GetProvince { + const _$GetProvinceImpl(); + + @override + String toString() { + return 'ProvinceEvent.getProvince()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$GetProvinceImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProvince, + }) { + return getProvince(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProvince, + }) { + return getProvince?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProvince, + required TResult orElse(), + }) { + if (getProvince != null) { + return getProvince(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProvince value) getProvince, + }) { + return getProvince(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProvince value)? getProvince, + }) { + return getProvince?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProvince value)? getProvince, + required TResult orElse(), + }) { + if (getProvince != null) { + return getProvince(this); + } + return orElse(); + } +} + +abstract class _GetProvince implements ProvinceEvent { + const factory _GetProvince() = _$GetProvinceImpl; +} + +/// @nodoc +mixin _$ProvinceState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List provinces) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List provinces)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List provinces)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ProvinceStateCopyWith<$Res> { + factory $ProvinceStateCopyWith( + ProvinceState value, $Res Function(ProvinceState) then) = + _$ProvinceStateCopyWithImpl<$Res, ProvinceState>; +} + +/// @nodoc +class _$ProvinceStateCopyWithImpl<$Res, $Val extends ProvinceState> + implements $ProvinceStateCopyWith<$Res> { + _$ProvinceStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$ProvinceStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'ProvinceState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List provinces) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List provinces)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List provinces)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements ProvinceState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$ProvinceStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'ProvinceState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List provinces) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List provinces)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List provinces)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements ProvinceState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List provinces}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$ProvinceStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? provinces = null, + }) { + return _then(_$LoadedImpl( + null == provinces + ? _value._provinces + : provinces // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List provinces) : _provinces = provinces; + + final List _provinces; + @override + List get provinces { + if (_provinces is EqualUnmodifiableListView) return _provinces; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_provinces); + } + + @override + String toString() { + return 'ProvinceState.loaded(provinces: $provinces)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality() + .equals(other._provinces, _provinces)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_provinces)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List provinces) loaded, + required TResult Function(String message) error, + }) { + return loaded(provinces); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List provinces)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(provinces); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List provinces)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(provinces); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements ProvinceState { + const factory _Loaded(final List provinces) = _$LoadedImpl; + + List get provinces; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$ProvinceStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'ProvinceState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List provinces) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List provinces)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List provinces)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements ProvinceState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_event.dart new file mode 100644 index 0000000..f87a6c8 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_event.dart @@ -0,0 +1,7 @@ +part of 'province_bloc.dart'; + +@freezed +class ProvinceEvent with _$ProvinceEvent { + const factory ProvinceEvent.started() = _Started; + const factory ProvinceEvent.getProvince() = _GetProvince; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_state.dart new file mode 100644 index 0000000..766cc17 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/province/province_state.dart @@ -0,0 +1,9 @@ +part of 'province_bloc.dart'; + +@freezed +class ProvinceState with _$ProvinceState { + const factory ProvinceState.initial() = _Initial; + const factory ProvinceState.loading() = _Loading; + const factory ProvinceState.loaded(List provinces) = _Loaded; + const factory ProvinceState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_bloc.dart new file mode 100644 index 0000000..21d07f9 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_bloc.dart @@ -0,0 +1,28 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/rajaongkir_remote_datasource.dart'; + +import '../../../../data/models/responses/subdistrict_response_model.dart'; + +part 'subdistrict_bloc.freezed.dart'; +part 'subdistrict_event.dart'; +part 'subdistrict_state.dart'; + +class SubdistrictBloc extends Bloc { + final RajaongkirRemoteDatasource _rajaongkirRemoteDatasource; + SubdistrictBloc( + this._rajaongkirRemoteDatasource, + ) : super(const _Initial()) { + on<_GetSubdistrict>((event, emit) async { + emit(const _Loading()); + final response = + await _rajaongkirRemoteDatasource.getSubdistrictByCity(event.cityId); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r.rajaongkir?.results ?? [])), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_bloc.freezed.dart new file mode 100644 index 0000000..e03d9b7 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_bloc.freezed.dart @@ -0,0 +1,909 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'subdistrict_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$SubdistrictEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String cityId) getSubdistrictsByCity, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String cityId)? getSubdistrictsByCity, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String cityId)? getSubdistrictsByCity, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetSubdistrict value) getSubdistrictsByCity, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetSubdistrict value)? getSubdistrictsByCity, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetSubdistrict value)? getSubdistrictsByCity, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SubdistrictEventCopyWith<$Res> { + factory $SubdistrictEventCopyWith( + SubdistrictEvent value, $Res Function(SubdistrictEvent) then) = + _$SubdistrictEventCopyWithImpl<$Res, SubdistrictEvent>; +} + +/// @nodoc +class _$SubdistrictEventCopyWithImpl<$Res, $Val extends SubdistrictEvent> + implements $SubdistrictEventCopyWith<$Res> { + _$SubdistrictEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$SubdistrictEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'SubdistrictEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String cityId) getSubdistrictsByCity, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String cityId)? getSubdistrictsByCity, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String cityId)? getSubdistrictsByCity, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetSubdistrict value) getSubdistrictsByCity, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetSubdistrict value)? getSubdistrictsByCity, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetSubdistrict value)? getSubdistrictsByCity, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements SubdistrictEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetSubdistrictImplCopyWith<$Res> { + factory _$$GetSubdistrictImplCopyWith(_$GetSubdistrictImpl value, + $Res Function(_$GetSubdistrictImpl) then) = + __$$GetSubdistrictImplCopyWithImpl<$Res>; + @useResult + $Res call({String cityId}); +} + +/// @nodoc +class __$$GetSubdistrictImplCopyWithImpl<$Res> + extends _$SubdistrictEventCopyWithImpl<$Res, _$GetSubdistrictImpl> + implements _$$GetSubdistrictImplCopyWith<$Res> { + __$$GetSubdistrictImplCopyWithImpl( + _$GetSubdistrictImpl _value, $Res Function(_$GetSubdistrictImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? cityId = null, + }) { + return _then(_$GetSubdistrictImpl( + null == cityId + ? _value.cityId + : cityId // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$GetSubdistrictImpl implements _GetSubdistrict { + const _$GetSubdistrictImpl(this.cityId); + + @override + final String cityId; + + @override + String toString() { + return 'SubdistrictEvent.getSubdistrictsByCity(cityId: $cityId)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GetSubdistrictImpl && + (identical(other.cityId, cityId) || other.cityId == cityId)); + } + + @override + int get hashCode => Object.hash(runtimeType, cityId); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$GetSubdistrictImplCopyWith<_$GetSubdistrictImpl> get copyWith => + __$$GetSubdistrictImplCopyWithImpl<_$GetSubdistrictImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String cityId) getSubdistrictsByCity, + }) { + return getSubdistrictsByCity(cityId); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String cityId)? getSubdistrictsByCity, + }) { + return getSubdistrictsByCity?.call(cityId); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String cityId)? getSubdistrictsByCity, + required TResult orElse(), + }) { + if (getSubdistrictsByCity != null) { + return getSubdistrictsByCity(cityId); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetSubdistrict value) getSubdistrictsByCity, + }) { + return getSubdistrictsByCity(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetSubdistrict value)? getSubdistrictsByCity, + }) { + return getSubdistrictsByCity?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetSubdistrict value)? getSubdistrictsByCity, + required TResult orElse(), + }) { + if (getSubdistrictsByCity != null) { + return getSubdistrictsByCity(this); + } + return orElse(); + } +} + +abstract class _GetSubdistrict implements SubdistrictEvent { + const factory _GetSubdistrict(final String cityId) = _$GetSubdistrictImpl; + + String get cityId; + @JsonKey(ignore: true) + _$$GetSubdistrictImplCopyWith<_$GetSubdistrictImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$SubdistrictState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List subdistricts) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List subdistricts)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List subdistricts)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SubdistrictStateCopyWith<$Res> { + factory $SubdistrictStateCopyWith( + SubdistrictState value, $Res Function(SubdistrictState) then) = + _$SubdistrictStateCopyWithImpl<$Res, SubdistrictState>; +} + +/// @nodoc +class _$SubdistrictStateCopyWithImpl<$Res, $Val extends SubdistrictState> + implements $SubdistrictStateCopyWith<$Res> { + _$SubdistrictStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$SubdistrictStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'SubdistrictState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List subdistricts) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List subdistricts)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List subdistricts)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements SubdistrictState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$SubdistrictStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'SubdistrictState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List subdistricts) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List subdistricts)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List subdistricts)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements SubdistrictState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List subdistricts}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$SubdistrictStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? subdistricts = null, + }) { + return _then(_$LoadedImpl( + null == subdistricts + ? _value._subdistricts + : subdistricts // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List subdistricts) + : _subdistricts = subdistricts; + + final List _subdistricts; + @override + List get subdistricts { + if (_subdistricts is EqualUnmodifiableListView) return _subdistricts; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_subdistricts); + } + + @override + String toString() { + return 'SubdistrictState.loaded(subdistricts: $subdistricts)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality() + .equals(other._subdistricts, _subdistricts)); + } + + @override + int get hashCode => Object.hash( + runtimeType, const DeepCollectionEquality().hash(_subdistricts)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List subdistricts) loaded, + required TResult Function(String message) error, + }) { + return loaded(subdistricts); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List subdistricts)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(subdistricts); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List subdistricts)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(subdistricts); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements SubdistrictState { + const factory _Loaded(final List subdistricts) = _$LoadedImpl; + + List get subdistricts; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$SubdistrictStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'SubdistrictState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List subdistricts) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List subdistricts)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List subdistricts)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements SubdistrictState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_event.dart new file mode 100644 index 0000000..f3b028d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_event.dart @@ -0,0 +1,8 @@ +part of 'subdistrict_bloc.dart'; + +@freezed +class SubdistrictEvent with _$SubdistrictEvent { + const factory SubdistrictEvent.started() = _Started; + const factory SubdistrictEvent.getSubdistrictsByCity(String cityId) = + _GetSubdistrict; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_state.dart new file mode 100644 index 0000000..429b333 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_state.dart @@ -0,0 +1,10 @@ +part of 'subdistrict_bloc.dart'; + +@freezed +class SubdistrictState with _$SubdistrictState { + const factory SubdistrictState.initial() = _Initial; + const factory SubdistrictState.loading() = _Loading; + const factory SubdistrictState.loaded(List subdistricts) = + _Loaded; + const factory SubdistrictState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/models/address_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/models/address_model.dart new file mode 100644 index 0000000..6ebea92 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/models/address_model.dart @@ -0,0 +1,28 @@ +class AddressModel { + final String country; + final String firstName; + final String lastName; + final String address; + final String city; + final String province; + final int zipCode; + final String phoneNumber; + final bool isPrimary; + + AddressModel({ + required this.country, + required this.firstName, + required this.lastName, + required this.address, + required this.city, + required this.province, + required this.zipCode, + required this.phoneNumber, + this.isPrimary = false, + }); + + String get fullName => '$firstName $lastName'; + String get fullAddress => + '$address. $city. $province. $country. Zip Code $zipCode'; + String get primaryAddressText => isPrimary ? 'Utama' : 'Opsi'; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/pages/add_address_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/pages/add_address_page.dart new file mode 100644 index 0000000..c354585 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/pages/add_address_page.dart @@ -0,0 +1,217 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/components.dart'; +import 'package:flutter_pos_ecommerce/core/router/app_router.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/requests/address_request_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/city_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/province_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/subdistrict_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/address/bloc/add_address/add_address_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/address/bloc/city/city_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/address/bloc/province/province_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/address/bloc/subdistrict/subdistrict_bloc.dart'; +import 'package:go_router/go_router.dart'; + +import '../bloc/address/address_bloc.dart'; + +class AddAddressPage extends StatefulWidget { + const AddAddressPage({super.key}); + + @override + State createState() => _AddAddressPageState(); +} + +class _AddAddressPageState extends State { + final firstNameController = TextEditingController(); + final addressController = TextEditingController(); + final zipCodeController = TextEditingController(); + final phoneNumberController = TextEditingController(); + + Provinces selectedProvince = Provinces( + provinceId: '', + province: '', + ); + + Cities selectedCity = Cities( + cityId: '', + ); + + Subdistrict selectedSubdistrict = Subdistrict( + subdistrictId: '', + ); + + @override + void initState() { + context.read().add(const ProvinceEvent.getProvince()); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Tambah Alamat'), + ), + body: ListView( + padding: const EdgeInsets.all(20.0), + children: [ + CustomTextField( + controller: firstNameController, + label: 'Nama ', + ), + const SpaceHeight(24.0), + CustomTextField( + controller: addressController, + label: 'Alamat Lengkap', + ), + const SpaceHeight(24.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (provinces) { + selectedProvince = provinces.first; + return CustomDropdown( + value: selectedProvince, + items: provinces, + label: 'Provinsi', + onChanged: (value) { + setState(() { + selectedProvince = value!; + context.read().add( + CityEvent.getCityByProvince( + selectedProvince.provinceId!)); + }); + }, + ); + }, + ); + }, + ), + const SpaceHeight(24.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => CustomDropdown( + value: '-', + items: const ['-'], + label: 'Kota/Kabupaten', + onChanged: (value) {}, + ), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (cities) { + selectedCity = cities.first; + return CustomDropdown( + value: selectedCity, + items: cities, + label: 'Kota/Kabupaten', + onChanged: (value) { + setState( + () { + selectedCity = value!; + context.read().add( + SubdistrictEvent.getSubdistrictsByCity( + selectedCity.cityId!)); + }, + ); + }, + ); + }, + ); + }, + ), + const SpaceHeight(24.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => CustomDropdown( + value: '-', + items: const ['-'], + label: 'Kecamatan', + onChanged: (value) {}, + ), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (subdistricts) { + selectedSubdistrict = subdistricts.first; + return CustomDropdown( + value: selectedSubdistrict, + items: subdistricts, + label: 'Kecamatan', + onChanged: (value) { + setState(() { + selectedSubdistrict = value!; + }); + }, + ); + }, + ); + }, + ), + const SpaceHeight(24.0), + CustomTextField( + controller: zipCodeController, + label: 'Kode Pos', + ), + const SpaceHeight(24.0), + CustomTextField( + controller: phoneNumberController, + label: 'No Handphone', + ), + const SpaceHeight(24.0), + BlocConsumer( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + loaded: () { + context.goNamed( + RouteConstants.address, + pathParameters: PathParameters( + rootTab: RootTab.order, + ).toMap(), + ); + context + .read() + .add(const AddressEvent.getAddress()); + }, + ); + }, + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return Button.filled( + onPressed: () { + context.read().add( + AddAddressEvent.addAddress( + addressRequestModel: AddressRequestModel( + name: firstNameController.text, + fullAddress: addressController.text, + provId: selectedProvince.provinceId!, + cityId: selectedCity.cityId!, + districtId: selectedSubdistrict.subdistrictId!, + postalCode: zipCodeController.text, + phone: phoneNumberController.text, + isDefault: 0, + ), + ), + ); + }, + label: 'Tambah Alamat', + ); + }, + loading: () => const Center( + child: CircularProgressIndicator(), + ), + ); + }, + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/pages/address_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/pages/address_page.dart new file mode 100644 index 0000000..26f567d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/pages/address_page.dart @@ -0,0 +1,211 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/core.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/address/bloc/add_address/add_address_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/address/bloc/address/address_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/router/app_router.dart'; +import '../widgets/address_tile.dart'; + +class AddressPage extends StatefulWidget { + const AddressPage({super.key}); + + @override + State createState() => _AddressPageState(); +} + +class _AddressPageState extends State { + // final List addresses = [ + // AddressModel( + // country: 'Indonesia', + // firstName: 'Saiful', + // lastName: 'Bahri', + // address: 'Jl. Merdeka No. 123', + // city: 'Jakarta Selatan', + // province: 'DKI Jakarta', + // zipCode: 12345, + // phoneNumber: '08123456789', + // isPrimary: true, + // ), + // AddressModel( + // country: 'Indonesia', + // firstName: 'Saiful', + // lastName: '', + // address: 'Jl. Cendrawasih No. 456', + // city: 'Bandung', + // province: 'Jawa Barat', + // zipCode: 67890, + // phoneNumber: '08987654321', + // ), + // ]; + + @override + void initState() { + super.initState(); + context.read().add(const AddressEvent.getAddress()); + } + + @override + Widget build(BuildContext context) { + // int selectedIndex = addresses.indexWhere((element) => element.isPrimary); + return Scaffold( + appBar: AppBar( + title: const Text('Alamat'), + actions: [ + IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters( + rootTab: RootTab.order, + ).toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ), + ], + ), + body: ListView( + padding: const EdgeInsets.all(20.0), + children: [ + const Text( + 'Pilih atau tambahkan alamat pengiriman', + style: TextStyle( + fontSize: 16, + ), + ), + const SpaceHeight(20.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (address) { + return BlocBuilder( + builder: (context, state) { + // dapatkan addressid + final addressId = state.maybeWhen( + orElse: () => 0, + loaded: + (_, discount, addressId, __, ____, _____, ______) { + return addressId; + }, + ); + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: address.length, + itemBuilder: (context, index) => AddressTile( + isSelected: addressId == address[index].id, + data: address[index], + onTap: () { + context.read().add( + CheckoutEvent.addAddressId(address[index].id!)); + }, + onEditTap: () { + context.goNamed( + RouteConstants.editAddress, + pathParameters: PathParameters( + rootTab: RootTab.order, + ).toMap(), + extra: address[index], + ); + }, + ), + separatorBuilder: (context, index) => + const SpaceHeight(16.0), + ); + }, + ); + }, + ); + }, + ), + const SpaceHeight(40.0), + Button.outlined( + onPressed: () async { + await context.pushNamed( + RouteConstants.addAddress, + pathParameters: PathParameters( + rootTab: RootTab.order, + ).toMap(), + ); + context.read().add(const AddressEvent.getAddress()); + }, + label: 'Tambah Alamat', + ), + const SpaceHeight(50.0), + ], + ), + bottomNavigationBar: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + 'Subtotal (Estimasi)', + style: TextStyle( + fontSize: 16.0, + ), + ), + BlocBuilder( + builder: (context, state) { + final price = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) => + products.fold( + 0, + (previousValue, element) => + previousValue + + (element.product.price! * element.quantity), + ), + ); + final discount = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) { + if (discount == null) { + return 0; + } + return discount.value! + .replaceAll('.00', '') + .toIntegerFromText; + }); + final totalBayar = price - (discount / 100 * price); + return Text( + totalBayar.currencyFormatRp, + style: const TextStyle( + fontSize: 16.0, + ), + ); + }, + ), + ], + ), + const SpaceHeight(12.0), + Button.filled( + onPressed: () { + context.goNamed( + RouteConstants.orderDetail, + pathParameters: PathParameters( + rootTab: RootTab.order, + ).toMap(), + ); + }, + label: 'Lanjutkan', + ), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/pages/edit_address_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/pages/edit_address_page.dart new file mode 100644 index 0000000..3208c3e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/pages/edit_address_page.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/custom_dropdown.dart'; +import '../../../../../core/components/custom_text_field.dart'; +import '../../../../../core/components/spaces.dart'; +import '../models/address_model.dart'; + +class EditAddressPage extends StatelessWidget { + final AddressModel data; + const EditAddressPage({super.key, required this.data}); + + @override + Widget build(BuildContext context) { + final country = ['Indonesia', 'Inggris', 'Spanyol']; + final countryNotifier = ValueNotifier( + country.where((element) => element == data.country).first); + final firstNameController = TextEditingController(text: data.firstName); + final lastNameController = TextEditingController(text: data.lastName); + final addressController = TextEditingController(text: data.address); + final cityController = TextEditingController(text: data.city); + final provinceController = TextEditingController(text: data.province); + final zipCodeController = TextEditingController(text: '${data.zipCode}'); + final phoneNumberController = TextEditingController(text: data.phoneNumber); + + return Scaffold( + appBar: AppBar( + title: const Text('Edit Adress'), + ), + body: ListView( + padding: const EdgeInsets.all(20.0), + children: [ + ValueListenableBuilder( + valueListenable: countryNotifier, + builder: (context, value, _) => CustomDropdown( + value: value, + items: country, + label: 'Negara atau wilayah', + onChanged: (value) => countryNotifier.value = value ?? '', + ), + ), + const SpaceHeight(24.0), + CustomTextField( + controller: firstNameController, + label: 'Nama Depan', + ), + const SpaceHeight(24.0), + CustomTextField( + controller: lastNameController, + label: 'Nama Belakang', + ), + const SpaceHeight(24.0), + CustomTextField( + controller: addressController, + label: 'Alamat jalan', + ), + const SpaceHeight(24.0), + CustomTextField( + controller: cityController, + label: 'Kota', + ), + const SpaceHeight(24.0), + CustomTextField( + controller: provinceController, + label: 'Provinsi', + ), + const SpaceHeight(24.0), + CustomTextField( + controller: zipCodeController, + label: 'Kode Pos', + ), + const SpaceHeight(24.0), + CustomTextField( + controller: phoneNumberController, + label: 'No Handphone', + ), + const SpaceHeight(24.0), + Button.filled( + onPressed: () { + context.pop(); + }, + label: 'Perbarui Alamat', + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/widgets/address_tile.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/widgets/address_tile.dart new file mode 100644 index 0000000..04c7cf7 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/address/widgets/address_tile.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/address_response_model.dart'; + +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; + +class AddressTile extends StatelessWidget { + final bool isSelected; + final Address data; + final VoidCallback onTap; + final VoidCallback onEditTap; + + const AddressTile({ + super.key, + required this.data, + this.isSelected = false, + required this.onTap, + required this.onEditTap, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(12.0)), + boxShadow: isSelected + ? [ + BoxShadow( + color: AppColors.black.withOpacity(0.1), + blurRadius: 2, + offset: const Offset(0, 2), + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + ] + : null, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SpaceHeight(24.0), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Text( + '${data.name} - ${data.phone}', + style: const TextStyle( + fontSize: 16, + ), + ), + ), + const SpaceHeight(4.0), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text( + data.fullAddress ?? '', + style: const TextStyle( + fontSize: 16, + ), + ), + ), + const SpaceWidth(14.0), + Icon( + isSelected + ? Icons.radio_button_checked + : Icons.circle_outlined, + color: isSelected ? AppColors.primary : AppColors.grey, + ), + ], + ), + ), + const SpaceHeight(24.0), + // if (isSelected) ...[ + // const Divider(color: AppColors.primary), + // Center( + // child: TextButton( + // onPressed: onEditTap, + // child: const Text('Edit'), + // ), + // ), + // ], + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_bloc.dart new file mode 100644 index 0000000..5b56044 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_bloc.dart @@ -0,0 +1,27 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/auth_response_model.dart'; + +part 'login_bloc.freezed.dart'; +part 'login_event.dart'; +part 'login_state.dart'; + +class LoginBloc extends Bloc { + final AuthRemoteDatasource _authRemoteDatasource; + LoginBloc( + this._authRemoteDatasource, + ) : super(const _Initial()) { + on<_Login>((event, emit) async { + emit(const _Loading()); + final response = + await _authRemoteDatasource.login(event.email, event.password); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r)), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_bloc.freezed.dart new file mode 100644 index 0000000..4ef81eb --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_bloc.freezed.dart @@ -0,0 +1,914 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'login_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$LoginEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String email, String password) login, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String email, String password)? login, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String email, String password)? login, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Login value) login, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Login value)? login, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Login value)? login, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LoginEventCopyWith<$Res> { + factory $LoginEventCopyWith( + LoginEvent value, $Res Function(LoginEvent) then) = + _$LoginEventCopyWithImpl<$Res, LoginEvent>; +} + +/// @nodoc +class _$LoginEventCopyWithImpl<$Res, $Val extends LoginEvent> + implements $LoginEventCopyWith<$Res> { + _$LoginEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$LoginEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'LoginEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String email, String password) login, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String email, String password)? login, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String email, String password)? login, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Login value) login, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Login value)? login, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Login value)? login, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements LoginEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$LoginImplCopyWith<$Res> { + factory _$$LoginImplCopyWith( + _$LoginImpl value, $Res Function(_$LoginImpl) then) = + __$$LoginImplCopyWithImpl<$Res>; + @useResult + $Res call({String email, String password}); +} + +/// @nodoc +class __$$LoginImplCopyWithImpl<$Res> + extends _$LoginEventCopyWithImpl<$Res, _$LoginImpl> + implements _$$LoginImplCopyWith<$Res> { + __$$LoginImplCopyWithImpl( + _$LoginImpl _value, $Res Function(_$LoginImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? email = null, + Object? password = null, + }) { + return _then(_$LoginImpl( + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + password: null == password + ? _value.password + : password // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$LoginImpl implements _Login { + const _$LoginImpl({required this.email, required this.password}); + + @override + final String email; + @override + final String password; + + @override + String toString() { + return 'LoginEvent.login(email: $email, password: $password)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoginImpl && + (identical(other.email, email) || other.email == email) && + (identical(other.password, password) || + other.password == password)); + } + + @override + int get hashCode => Object.hash(runtimeType, email, password); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoginImplCopyWith<_$LoginImpl> get copyWith => + __$$LoginImplCopyWithImpl<_$LoginImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String email, String password) login, + }) { + return login(email, password); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String email, String password)? login, + }) { + return login?.call(email, password); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String email, String password)? login, + required TResult orElse(), + }) { + if (login != null) { + return login(email, password); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Login value) login, + }) { + return login(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Login value)? login, + }) { + return login?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Login value)? login, + required TResult orElse(), + }) { + if (login != null) { + return login(this); + } + return orElse(); + } +} + +abstract class _Login implements LoginEvent { + const factory _Login( + {required final String email, + required final String password}) = _$LoginImpl; + + String get email; + String get password; + @JsonKey(ignore: true) + _$$LoginImplCopyWith<_$LoginImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$LoginState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(AuthResponseModel authResponseModel) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(AuthResponseModel authResponseModel)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(AuthResponseModel authResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LoginStateCopyWith<$Res> { + factory $LoginStateCopyWith( + LoginState value, $Res Function(LoginState) then) = + _$LoginStateCopyWithImpl<$Res, LoginState>; +} + +/// @nodoc +class _$LoginStateCopyWithImpl<$Res, $Val extends LoginState> + implements $LoginStateCopyWith<$Res> { + _$LoginStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$LoginStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'LoginState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(AuthResponseModel authResponseModel) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(AuthResponseModel authResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(AuthResponseModel authResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements LoginState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$LoginStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'LoginState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(AuthResponseModel authResponseModel) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(AuthResponseModel authResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(AuthResponseModel authResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements LoginState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({AuthResponseModel authResponseModel}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$LoginStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? authResponseModel = null, + }) { + return _then(_$LoadedImpl( + null == authResponseModel + ? _value.authResponseModel + : authResponseModel // ignore: cast_nullable_to_non_nullable + as AuthResponseModel, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(this.authResponseModel); + + @override + final AuthResponseModel authResponseModel; + + @override + String toString() { + return 'LoginState.loaded(authResponseModel: $authResponseModel)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + (identical(other.authResponseModel, authResponseModel) || + other.authResponseModel == authResponseModel)); + } + + @override + int get hashCode => Object.hash(runtimeType, authResponseModel); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(AuthResponseModel authResponseModel) loaded, + required TResult Function(String message) error, + }) { + return loaded(authResponseModel); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(AuthResponseModel authResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(authResponseModel); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(AuthResponseModel authResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(authResponseModel); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements LoginState { + const factory _Loaded(final AuthResponseModel authResponseModel) = + _$LoadedImpl; + + AuthResponseModel get authResponseModel; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$LoginStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'LoginState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(AuthResponseModel authResponseModel) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(AuthResponseModel authResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(AuthResponseModel authResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements LoginState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_event.dart new file mode 100644 index 0000000..e5e900a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_event.dart @@ -0,0 +1,10 @@ +part of 'login_bloc.dart'; + +@freezed +class LoginEvent with _$LoginEvent { + const factory LoginEvent.started() = _Started; + const factory LoginEvent.login({ + required String email, + required String password, + }) = _Login; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_state.dart new file mode 100644 index 0000000..eae3a6c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/login/login_state.dart @@ -0,0 +1,10 @@ +part of 'login_bloc.dart'; + +@freezed +class LoginState with _$LoginState { + const factory LoginState.initial() = _Initial; + const factory LoginState.loading() = _Loading; + const factory LoginState.loaded(AuthResponseModel authResponseModel) = + _Loaded; + const factory LoginState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_bloc.dart new file mode 100644 index 0000000..b45ee52 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_bloc.dart @@ -0,0 +1,27 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_remote_datasource.dart'; + +part 'logout_bloc.freezed.dart'; +part 'logout_event.dart'; +part 'logout_state.dart'; + +class LogoutBloc extends Bloc { + final AuthRemoteDatasource _authRemoteDatasource; + LogoutBloc( + this._authRemoteDatasource, + ) : super(const _Initial()) { + on<_Logout>((event, emit) async { + emit(const _Loading()); + final response = await _authRemoteDatasource.logout(); + AuthLocalDatasource().removeAuthData(); + response.fold((l) => emit(_Error(l)), (r) { + emit(const _Loaded()); + emit(const LogoutState.clearState()); + }); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_bloc.freezed.dart new file mode 100644 index 0000000..30bd155 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_bloc.freezed.dart @@ -0,0 +1,988 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'logout_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$LogoutEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() logout, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? logout, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? logout, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Logout value) logout, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Logout value)? logout, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Logout value)? logout, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LogoutEventCopyWith<$Res> { + factory $LogoutEventCopyWith( + LogoutEvent value, $Res Function(LogoutEvent) then) = + _$LogoutEventCopyWithImpl<$Res, LogoutEvent>; +} + +/// @nodoc +class _$LogoutEventCopyWithImpl<$Res, $Val extends LogoutEvent> + implements $LogoutEventCopyWith<$Res> { + _$LogoutEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$LogoutEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'LogoutEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() logout, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? logout, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? logout, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Logout value) logout, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Logout value)? logout, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Logout value)? logout, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements LogoutEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$LogoutImplCopyWith<$Res> { + factory _$$LogoutImplCopyWith( + _$LogoutImpl value, $Res Function(_$LogoutImpl) then) = + __$$LogoutImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LogoutImplCopyWithImpl<$Res> + extends _$LogoutEventCopyWithImpl<$Res, _$LogoutImpl> + implements _$$LogoutImplCopyWith<$Res> { + __$$LogoutImplCopyWithImpl( + _$LogoutImpl _value, $Res Function(_$LogoutImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LogoutImpl implements _Logout { + const _$LogoutImpl(); + + @override + String toString() { + return 'LogoutEvent.logout()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LogoutImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() logout, + }) { + return logout(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? logout, + }) { + return logout?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? logout, + required TResult orElse(), + }) { + if (logout != null) { + return logout(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Logout value) logout, + }) { + return logout(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Logout value)? logout, + }) { + return logout?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Logout value)? logout, + required TResult orElse(), + }) { + if (logout != null) { + return logout(this); + } + return orElse(); + } +} + +abstract class _Logout implements LogoutEvent { + const factory _Logout() = _$LogoutImpl; +} + +/// @nodoc +mixin _$LogoutState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + required TResult Function() clearState, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + TResult? Function()? clearState, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + TResult Function()? clearState, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + required TResult Function(_ClearState value) clearState, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + TResult? Function(_ClearState value)? clearState, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + TResult Function(_ClearState value)? clearState, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LogoutStateCopyWith<$Res> { + factory $LogoutStateCopyWith( + LogoutState value, $Res Function(LogoutState) then) = + _$LogoutStateCopyWithImpl<$Res, LogoutState>; +} + +/// @nodoc +class _$LogoutStateCopyWithImpl<$Res, $Val extends LogoutState> + implements $LogoutStateCopyWith<$Res> { + _$LogoutStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$LogoutStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'LogoutState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + required TResult Function() clearState, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + TResult? Function()? clearState, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + TResult Function()? clearState, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + required TResult Function(_ClearState value) clearState, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + TResult? Function(_ClearState value)? clearState, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + TResult Function(_ClearState value)? clearState, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements LogoutState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$LogoutStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'LogoutState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + required TResult Function() clearState, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + TResult? Function()? clearState, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + TResult Function()? clearState, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + required TResult Function(_ClearState value) clearState, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + TResult? Function(_ClearState value)? clearState, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + TResult Function(_ClearState value)? clearState, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements LogoutState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$LogoutStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(); + + @override + String toString() { + return 'LogoutState.loaded()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + required TResult Function() clearState, + }) { + return loaded(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + TResult? Function()? clearState, + }) { + return loaded?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + TResult Function()? clearState, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + required TResult Function(_ClearState value) clearState, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + TResult? Function(_ClearState value)? clearState, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + TResult Function(_ClearState value)? clearState, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements LogoutState { + const factory _Loaded() = _$LoadedImpl; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$LogoutStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'LogoutState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + required TResult Function() clearState, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + TResult? Function()? clearState, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + TResult Function()? clearState, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + required TResult Function(_ClearState value) clearState, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + TResult? Function(_ClearState value)? clearState, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + TResult Function(_ClearState value)? clearState, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements LogoutState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ClearStateImplCopyWith<$Res> { + factory _$$ClearStateImplCopyWith( + _$ClearStateImpl value, $Res Function(_$ClearStateImpl) then) = + __$$ClearStateImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$ClearStateImplCopyWithImpl<$Res> + extends _$LogoutStateCopyWithImpl<$Res, _$ClearStateImpl> + implements _$$ClearStateImplCopyWith<$Res> { + __$$ClearStateImplCopyWithImpl( + _$ClearStateImpl _value, $Res Function(_$ClearStateImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$ClearStateImpl implements _ClearState { + const _$ClearStateImpl(); + + @override + String toString() { + return 'LogoutState.clearState()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$ClearStateImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + required TResult Function() clearState, + }) { + return clearState(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + TResult? Function()? clearState, + }) { + return clearState?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + TResult Function()? clearState, + required TResult orElse(), + }) { + if (clearState != null) { + return clearState(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + required TResult Function(_ClearState value) clearState, + }) { + return clearState(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + TResult? Function(_ClearState value)? clearState, + }) { + return clearState?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + TResult Function(_ClearState value)? clearState, + required TResult orElse(), + }) { + if (clearState != null) { + return clearState(this); + } + return orElse(); + } +} + +abstract class _ClearState implements LogoutState { + const factory _ClearState() = _$ClearStateImpl; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_event.dart new file mode 100644 index 0000000..38ee9d8 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_event.dart @@ -0,0 +1,7 @@ +part of 'logout_bloc.dart'; + +@freezed +class LogoutEvent with _$LogoutEvent { + const factory LogoutEvent.started() = _Started; + const factory LogoutEvent.logout() = _Logout; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_state.dart new file mode 100644 index 0000000..c2263cd --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/logout/logout_state.dart @@ -0,0 +1,10 @@ +part of 'logout_bloc.dart'; + +@freezed +class LogoutState with _$LogoutState { + const factory LogoutState.initial() = _Initial; + const factory LogoutState.loading() = _Loading; + const factory LogoutState.loaded() = _Loaded; + const factory LogoutState.error(String message) = _Error; + const factory LogoutState.clearState() = _ClearState; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_bloc.dart new file mode 100644 index 0000000..d81b190 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_bloc.dart @@ -0,0 +1,27 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/auth_response_model.dart'; + +part 'register_bloc.freezed.dart'; +part 'register_event.dart'; +part 'register_state.dart'; + +class RegisterBloc extends Bloc { + AuthRemoteDatasource authRemoteDatasource; + RegisterBloc( + this.authRemoteDatasource, + ) : super(const _Initial()) { + on<_Register>((event, emit) async { + emit(const _Loading()); + final response = await authRemoteDatasource.register( + event.name, event.email, event.phone, event.password); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r)), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_bloc.freezed.dart new file mode 100644 index 0000000..1d8f598 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_bloc.freezed.dart @@ -0,0 +1,950 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'register_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$RegisterEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function( + String name, String email, String phone, String password) + register, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String name, String email, String phone, String password)? + register, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String name, String email, String phone, String password)? + register, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Register value) register, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Register value)? register, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Register value)? register, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $RegisterEventCopyWith<$Res> { + factory $RegisterEventCopyWith( + RegisterEvent value, $Res Function(RegisterEvent) then) = + _$RegisterEventCopyWithImpl<$Res, RegisterEvent>; +} + +/// @nodoc +class _$RegisterEventCopyWithImpl<$Res, $Val extends RegisterEvent> + implements $RegisterEventCopyWith<$Res> { + _$RegisterEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$RegisterEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'RegisterEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function( + String name, String email, String phone, String password) + register, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String name, String email, String phone, String password)? + register, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String name, String email, String phone, String password)? + register, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Register value) register, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Register value)? register, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Register value)? register, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements RegisterEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$RegisterImplCopyWith<$Res> { + factory _$$RegisterImplCopyWith( + _$RegisterImpl value, $Res Function(_$RegisterImpl) then) = + __$$RegisterImplCopyWithImpl<$Res>; + @useResult + $Res call({String name, String email, String phone, String password}); +} + +/// @nodoc +class __$$RegisterImplCopyWithImpl<$Res> + extends _$RegisterEventCopyWithImpl<$Res, _$RegisterImpl> + implements _$$RegisterImplCopyWith<$Res> { + __$$RegisterImplCopyWithImpl( + _$RegisterImpl _value, $Res Function(_$RegisterImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? email = null, + Object? phone = null, + Object? password = null, + }) { + return _then(_$RegisterImpl( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + phone: null == phone + ? _value.phone + : phone // ignore: cast_nullable_to_non_nullable + as String, + password: null == password + ? _value.password + : password // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$RegisterImpl implements _Register { + const _$RegisterImpl( + {required this.name, + required this.email, + required this.phone, + required this.password}); + + @override + final String name; + @override + final String email; + @override + final String phone; + @override + final String password; + + @override + String toString() { + return 'RegisterEvent.register(name: $name, email: $email, phone: $phone, password: $password)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$RegisterImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.email, email) || other.email == email) && + (identical(other.phone, phone) || other.phone == phone) && + (identical(other.password, password) || + other.password == password)); + } + + @override + int get hashCode => Object.hash(runtimeType, name, email, phone, password); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$RegisterImplCopyWith<_$RegisterImpl> get copyWith => + __$$RegisterImplCopyWithImpl<_$RegisterImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function( + String name, String email, String phone, String password) + register, + }) { + return register(name, email, phone, password); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String name, String email, String phone, String password)? + register, + }) { + return register?.call(name, email, phone, password); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String name, String email, String phone, String password)? + register, + required TResult orElse(), + }) { + if (register != null) { + return register(name, email, phone, password); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Register value) register, + }) { + return register(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Register value)? register, + }) { + return register?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Register value)? register, + required TResult orElse(), + }) { + if (register != null) { + return register(this); + } + return orElse(); + } +} + +abstract class _Register implements RegisterEvent { + const factory _Register( + {required final String name, + required final String email, + required final String phone, + required final String password}) = _$RegisterImpl; + + String get name; + String get email; + String get phone; + String get password; + @JsonKey(ignore: true) + _$$RegisterImplCopyWith<_$RegisterImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$RegisterState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(AuthResponseModel authResponseModel) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(AuthResponseModel authResponseModel)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(AuthResponseModel authResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $RegisterStateCopyWith<$Res> { + factory $RegisterStateCopyWith( + RegisterState value, $Res Function(RegisterState) then) = + _$RegisterStateCopyWithImpl<$Res, RegisterState>; +} + +/// @nodoc +class _$RegisterStateCopyWithImpl<$Res, $Val extends RegisterState> + implements $RegisterStateCopyWith<$Res> { + _$RegisterStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$RegisterStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'RegisterState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(AuthResponseModel authResponseModel) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(AuthResponseModel authResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(AuthResponseModel authResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements RegisterState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$RegisterStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'RegisterState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(AuthResponseModel authResponseModel) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(AuthResponseModel authResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(AuthResponseModel authResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements RegisterState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({AuthResponseModel authResponseModel}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$RegisterStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? authResponseModel = null, + }) { + return _then(_$LoadedImpl( + null == authResponseModel + ? _value.authResponseModel + : authResponseModel // ignore: cast_nullable_to_non_nullable + as AuthResponseModel, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(this.authResponseModel); + + @override + final AuthResponseModel authResponseModel; + + @override + String toString() { + return 'RegisterState.loaded(authResponseModel: $authResponseModel)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + (identical(other.authResponseModel, authResponseModel) || + other.authResponseModel == authResponseModel)); + } + + @override + int get hashCode => Object.hash(runtimeType, authResponseModel); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(AuthResponseModel authResponseModel) loaded, + required TResult Function(String message) error, + }) { + return loaded(authResponseModel); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(AuthResponseModel authResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(authResponseModel); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(AuthResponseModel authResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(authResponseModel); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements RegisterState { + const factory _Loaded(final AuthResponseModel authResponseModel) = + _$LoadedImpl; + + AuthResponseModel get authResponseModel; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$RegisterStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'RegisterState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(AuthResponseModel authResponseModel) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(AuthResponseModel authResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(AuthResponseModel authResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements RegisterState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_event.dart new file mode 100644 index 0000000..f1e36b0 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_event.dart @@ -0,0 +1,12 @@ +part of 'register_bloc.dart'; + +@freezed +class RegisterEvent with _$RegisterEvent { + const factory RegisterEvent.started() = _Started; + const factory RegisterEvent.register({ + required String name, + required String email, + required String phone, + required String password + }) = _Register; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_state.dart new file mode 100644 index 0000000..a0b3bb3 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/bloc/register/register_state.dart @@ -0,0 +1,9 @@ +part of 'register_bloc.dart'; + +@freezed +class RegisterState with _$RegisterState { + const factory RegisterState.initial() = _Initial; + const factory RegisterState.loading() = _Loading; + const factory RegisterState.loaded(AuthResponseModel authResponseModel) = _Loaded; + const factory RegisterState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/pages/login_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/pages/login_page.dart new file mode 100644 index 0000000..24799e4 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/pages/login_page.dart @@ -0,0 +1,186 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/firebase_messaging_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/auth/bloc/login/login_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/pages/dashboard_page.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/router/app_router.dart'; + +class LoginPage extends StatefulWidget { + const LoginPage({super.key}); + + @override + State createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + final emailController = TextEditingController(); + final passwordController = TextEditingController(); + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + emailController.dispose(); + passwordController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: ListView( + padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 50.0), + children: [ + const Text( + 'Akun Login', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + ), + ), + const Text( + 'Masukkan email dan password anda', + style: TextStyle( + fontWeight: FontWeight.w600, + ), + ), + const SpaceHeight(50.0), + const SpaceHeight(60.0), + TextFormField( + controller: emailController, + keyboardType: TextInputType.emailAddress, + decoration: InputDecoration( + labelText: 'Email ID', + prefixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.icons.email.svg(), + ), + ), + ), + const SpaceHeight(20.0), + TextFormField( + controller: passwordController, + obscureText: true, + decoration: InputDecoration( + labelText: 'Password', + prefixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.icons.password.svg(), + ), + ), + ), + const SpaceHeight(50.0), + BlocConsumer( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + loaded: (authResponseModel) async { + AuthLocalDatasource().saveAuthData(authResponseModel); + await FirebaseMessagingRemoteDatasource().initialize(); + if (authResponseModel.user!.roles == 'owner' || + authResponseModel.user!.roles == 'kasir') { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const DashboardPosPage(), + ), + ); + } else { + context.goNamed(RouteConstants.root, + pathParameters: PathParameters().toMap()); + } + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + backgroundColor: AppColors.primary, + content: Text("Login Berhasil"), + ), + ); + }, + error: (message) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: Colors.red, + content: Text(message), + ), + ); + }, + ); + }, + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return Button.filled( + onPressed: () { + // context.goNamed( + // RouteConstants.root, + // pathParameters: PathParameters().toMap(), + // ); + context.read().add(LoginEvent.login( + email: emailController.text, + password: passwordController.text)); + }, + label: 'Login', + ); + }, + loading: () => const Center( + child: CircularProgressIndicator(), + ), + ); + }, + ), + + // const Row( + // children: [ + // Flexible(child: Divider()), + // SizedBox(width: 14.0), + // Text('OR'), + // SizedBox(width: 14.0), + // Flexible(child: Divider()), + // ], + // ), + // const SpaceHeight(50.0), + // Button.outlined( + // onPressed: () {}, + // label: 'Login with Google', + // icon: Assets.images.google.image(height: 20.0), + // ), + const SpaceHeight(50.0), + InkWell( + onTap: () { + context.goNamed(RouteConstants.register); + }, + child: const Text.rich( + TextSpan( + children: [ + TextSpan( + text: 'Belum register ? ', + style: TextStyle( + color: AppColors.primary, + ), + ), + TextSpan( + text: 'Buat akun', + style: TextStyle( + color: AppColors.grey, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + textAlign: TextAlign.center, + ), + ), + ]), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/pages/register_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/pages/register_page.dart new file mode 100644 index 0000000..46dc14a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/pages/register_page.dart @@ -0,0 +1,212 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/router/app_router.dart'; +import '../bloc/register/register_bloc.dart'; + +class RegisterPage extends StatefulWidget { + const RegisterPage({super.key}); + + @override + State createState() => _RegisterPageState(); +} + +class _RegisterPageState extends State { + final nameController = TextEditingController(); + final phoneController = TextEditingController(); + final emailController = TextEditingController(); + final passwordController = TextEditingController(); + // final confirmPasswordController = TextEditingController(); + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + nameController.dispose(); + phoneController.dispose(); + emailController.dispose(); + passwordController.dispose(); + // confirmPasswordController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: ListView( + padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 50.0), + children: [ + const Text( + 'Akun Register', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + ), + ), + const Text( + 'silahkan lengkapi data dibawah ini untuk mendaftar akun baru', + style: TextStyle( + fontWeight: FontWeight.w600, + ), + ), + + const SpaceHeight(60.0), + TextFormField( + controller: nameController, + keyboardType: TextInputType.name, + decoration: InputDecoration( + labelText: 'Name', + prefixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.icons.email.svg(), + ), + ), + ), + const SpaceHeight(20.0), + TextFormField( + controller: emailController, + keyboardType: TextInputType.emailAddress, + decoration: InputDecoration( + labelText: 'Email ID', + prefixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.icons.email.svg(), + ), + ), + ), + const SpaceHeight(20.0), + TextFormField( + controller: phoneController, + keyboardType: TextInputType.phone, + decoration: InputDecoration( + labelText: 'Phone', + prefixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.icons.email.svg(), + ), + ), + ), + const SpaceHeight(20.0), + TextFormField( + controller: passwordController, + obscureText: true, + decoration: InputDecoration( + labelText: 'Password', + prefixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.icons.password.svg(), + ), + ), + ), + // const SpaceHeight(20.0), + // TextFormField( + // controller: confirmPasswordController, + // obscureText: true, + // decoration: InputDecoration( + // labelText: 'Confirm Password', + // prefixIcon: Padding( + // padding: const EdgeInsets.all(12.0), + // child: Assets.icons.password.svg(), + // ), + // ), + // ), + const SpaceHeight(50.0), + BlocConsumer( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (authResponseModel) { + AuthLocalDatasource().saveAuthData(authResponseModel); + context.goNamed( + RouteConstants.login, + ); + }, + error: (message) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: Colors.red, + content: Text(message), + ), + ); + }, + ); + }, + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return Button.filled( + onPressed: () { + context.read().add(RegisterEvent.register( + name: nameController.text, + email: emailController.text, + phone: phoneController.text, + password: passwordController.text)); + }, + label: 'Register', + ); + }, + loading: () => const Center( + child: CircularProgressIndicator(), + ), + ); + }, + ), + + const SpaceHeight(50.0), + // const Row( + // children: [ + // Flexible(child: Divider()), + // SizedBox(width: 14.0), + // Text('OR'), + // SizedBox(width: 14.0), + // Flexible(child: Divider()), + // ], + // ), + // const SpaceHeight(50.0), + // Button.outlined( + // onPressed: () {}, + // label: 'Register with Google', + // icon: Assets.images.google.image(height: 20.0), + // ), + // const SpaceHeight(50.0), + InkWell( + onTap: () { + context.goNamed(RouteConstants.login); + }, + child: const Text.rich( + TextSpan( + children: [ + TextSpan( + text: 'Sudah memiliki akun ? ', + style: TextStyle( + color: AppColors.primary, + ), + ), + TextSpan( + text: 'Login', + style: TextStyle( + color: AppColors.grey, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + textAlign: TextAlign.center, + ), + ), + ]), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/pages/test.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/pages/test.dart new file mode 100644 index 0000000..296885e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/auth/pages/test.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class Test extends StatefulWidget { + const Test({super.key}); + + @override + State createState() => _TestState(); +} + +class _TestState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("kasir"), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_bloc.dart new file mode 100644 index 0000000..897d306 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_bloc.dart @@ -0,0 +1,41 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_remote_datasource.dart'; + +import '../../../../data/models/responses/product_response_model.dart'; + +part 'alat_pertanian_bloc.freezed.dart'; +part 'alat_pertanian_event.dart'; +part 'alat_pertanian_state.dart'; + +class AlatPertanianBloc extends Bloc { + final ProductRemoteDatasource _productRemoteDatasource; + List products = []; + AlatPertanianBloc( + this._productRemoteDatasource, + ) : super(const _Initial()) { + on<_GetProductAlatPertanian>((event, emit) async { + emit(const _Loading()); + final response = await _productRemoteDatasource.getProductByCategory(1); + response.fold((l) => emit(_Error(l)), (r) { + products = r.data ?? []; + emit(_Loaded(r.data!)); + }); + }); + on<_SearchProductAlatPertanian>((event, emit) async { + emit(const AlatPertanianState.loading()); + final newProducts = products + .where((element) => + element.name!.toLowerCase().contains(event.query.toLowerCase())) + .toList(); + emit(AlatPertanianState.loaded(newProducts)); + }); + + on<_FetchAllAlatPertanian>((event, emit) async { + emit(const AlatPertanianState.loading()); + emit(AlatPertanianState.loaded(products)); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_bloc.freezed.dart new file mode 100644 index 0000000..25b834c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_bloc.freezed.dart @@ -0,0 +1,1206 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'alat_pertanian_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$AlatPertanianEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String query) searchProductAlatPertanian, + required TResult Function() fetchAllAlatPertanian, + required TResult Function() getProductAlatPertanian, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String query)? searchProductAlatPertanian, + TResult? Function()? fetchAllAlatPertanian, + TResult? Function()? getProductAlatPertanian, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String query)? searchProductAlatPertanian, + TResult Function()? fetchAllAlatPertanian, + TResult Function()? getProductAlatPertanian, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_SearchProductAlatPertanian value) + searchProductAlatPertanian, + required TResult Function(_FetchAllAlatPertanian value) + fetchAllAlatPertanian, + required TResult Function(_GetProductAlatPertanian value) + getProductAlatPertanian, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_SearchProductAlatPertanian value)? + searchProductAlatPertanian, + TResult? Function(_FetchAllAlatPertanian value)? fetchAllAlatPertanian, + TResult? Function(_GetProductAlatPertanian value)? getProductAlatPertanian, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_SearchProductAlatPertanian value)? + searchProductAlatPertanian, + TResult Function(_FetchAllAlatPertanian value)? fetchAllAlatPertanian, + TResult Function(_GetProductAlatPertanian value)? getProductAlatPertanian, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $AlatPertanianEventCopyWith<$Res> { + factory $AlatPertanianEventCopyWith( + AlatPertanianEvent value, $Res Function(AlatPertanianEvent) then) = + _$AlatPertanianEventCopyWithImpl<$Res, AlatPertanianEvent>; +} + +/// @nodoc +class _$AlatPertanianEventCopyWithImpl<$Res, $Val extends AlatPertanianEvent> + implements $AlatPertanianEventCopyWith<$Res> { + _$AlatPertanianEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$AlatPertanianEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'AlatPertanianEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String query) searchProductAlatPertanian, + required TResult Function() fetchAllAlatPertanian, + required TResult Function() getProductAlatPertanian, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String query)? searchProductAlatPertanian, + TResult? Function()? fetchAllAlatPertanian, + TResult? Function()? getProductAlatPertanian, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String query)? searchProductAlatPertanian, + TResult Function()? fetchAllAlatPertanian, + TResult Function()? getProductAlatPertanian, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_SearchProductAlatPertanian value) + searchProductAlatPertanian, + required TResult Function(_FetchAllAlatPertanian value) + fetchAllAlatPertanian, + required TResult Function(_GetProductAlatPertanian value) + getProductAlatPertanian, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_SearchProductAlatPertanian value)? + searchProductAlatPertanian, + TResult? Function(_FetchAllAlatPertanian value)? fetchAllAlatPertanian, + TResult? Function(_GetProductAlatPertanian value)? getProductAlatPertanian, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_SearchProductAlatPertanian value)? + searchProductAlatPertanian, + TResult Function(_FetchAllAlatPertanian value)? fetchAllAlatPertanian, + TResult Function(_GetProductAlatPertanian value)? getProductAlatPertanian, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements AlatPertanianEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$SearchProductAlatPertanianImplCopyWith<$Res> { + factory _$$SearchProductAlatPertanianImplCopyWith( + _$SearchProductAlatPertanianImpl value, + $Res Function(_$SearchProductAlatPertanianImpl) then) = + __$$SearchProductAlatPertanianImplCopyWithImpl<$Res>; + @useResult + $Res call({String query}); +} + +/// @nodoc +class __$$SearchProductAlatPertanianImplCopyWithImpl<$Res> + extends _$AlatPertanianEventCopyWithImpl<$Res, + _$SearchProductAlatPertanianImpl> + implements _$$SearchProductAlatPertanianImplCopyWith<$Res> { + __$$SearchProductAlatPertanianImplCopyWithImpl( + _$SearchProductAlatPertanianImpl _value, + $Res Function(_$SearchProductAlatPertanianImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? query = null, + }) { + return _then(_$SearchProductAlatPertanianImpl( + null == query + ? _value.query + : query // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$SearchProductAlatPertanianImpl implements _SearchProductAlatPertanian { + const _$SearchProductAlatPertanianImpl(this.query); + + @override + final String query; + + @override + String toString() { + return 'AlatPertanianEvent.searchProductAlatPertanian(query: $query)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SearchProductAlatPertanianImpl && + (identical(other.query, query) || other.query == query)); + } + + @override + int get hashCode => Object.hash(runtimeType, query); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$SearchProductAlatPertanianImplCopyWith<_$SearchProductAlatPertanianImpl> + get copyWith => __$$SearchProductAlatPertanianImplCopyWithImpl< + _$SearchProductAlatPertanianImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String query) searchProductAlatPertanian, + required TResult Function() fetchAllAlatPertanian, + required TResult Function() getProductAlatPertanian, + }) { + return searchProductAlatPertanian(query); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String query)? searchProductAlatPertanian, + TResult? Function()? fetchAllAlatPertanian, + TResult? Function()? getProductAlatPertanian, + }) { + return searchProductAlatPertanian?.call(query); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String query)? searchProductAlatPertanian, + TResult Function()? fetchAllAlatPertanian, + TResult Function()? getProductAlatPertanian, + required TResult orElse(), + }) { + if (searchProductAlatPertanian != null) { + return searchProductAlatPertanian(query); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_SearchProductAlatPertanian value) + searchProductAlatPertanian, + required TResult Function(_FetchAllAlatPertanian value) + fetchAllAlatPertanian, + required TResult Function(_GetProductAlatPertanian value) + getProductAlatPertanian, + }) { + return searchProductAlatPertanian(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_SearchProductAlatPertanian value)? + searchProductAlatPertanian, + TResult? Function(_FetchAllAlatPertanian value)? fetchAllAlatPertanian, + TResult? Function(_GetProductAlatPertanian value)? getProductAlatPertanian, + }) { + return searchProductAlatPertanian?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_SearchProductAlatPertanian value)? + searchProductAlatPertanian, + TResult Function(_FetchAllAlatPertanian value)? fetchAllAlatPertanian, + TResult Function(_GetProductAlatPertanian value)? getProductAlatPertanian, + required TResult orElse(), + }) { + if (searchProductAlatPertanian != null) { + return searchProductAlatPertanian(this); + } + return orElse(); + } +} + +abstract class _SearchProductAlatPertanian implements AlatPertanianEvent { + const factory _SearchProductAlatPertanian(final String query) = + _$SearchProductAlatPertanianImpl; + + String get query; + @JsonKey(ignore: true) + _$$SearchProductAlatPertanianImplCopyWith<_$SearchProductAlatPertanianImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$FetchAllAlatPertanianImplCopyWith<$Res> { + factory _$$FetchAllAlatPertanianImplCopyWith( + _$FetchAllAlatPertanianImpl value, + $Res Function(_$FetchAllAlatPertanianImpl) then) = + __$$FetchAllAlatPertanianImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$FetchAllAlatPertanianImplCopyWithImpl<$Res> + extends _$AlatPertanianEventCopyWithImpl<$Res, _$FetchAllAlatPertanianImpl> + implements _$$FetchAllAlatPertanianImplCopyWith<$Res> { + __$$FetchAllAlatPertanianImplCopyWithImpl(_$FetchAllAlatPertanianImpl _value, + $Res Function(_$FetchAllAlatPertanianImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$FetchAllAlatPertanianImpl implements _FetchAllAlatPertanian { + const _$FetchAllAlatPertanianImpl(); + + @override + String toString() { + return 'AlatPertanianEvent.fetchAllAlatPertanian()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$FetchAllAlatPertanianImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String query) searchProductAlatPertanian, + required TResult Function() fetchAllAlatPertanian, + required TResult Function() getProductAlatPertanian, + }) { + return fetchAllAlatPertanian(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String query)? searchProductAlatPertanian, + TResult? Function()? fetchAllAlatPertanian, + TResult? Function()? getProductAlatPertanian, + }) { + return fetchAllAlatPertanian?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String query)? searchProductAlatPertanian, + TResult Function()? fetchAllAlatPertanian, + TResult Function()? getProductAlatPertanian, + required TResult orElse(), + }) { + if (fetchAllAlatPertanian != null) { + return fetchAllAlatPertanian(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_SearchProductAlatPertanian value) + searchProductAlatPertanian, + required TResult Function(_FetchAllAlatPertanian value) + fetchAllAlatPertanian, + required TResult Function(_GetProductAlatPertanian value) + getProductAlatPertanian, + }) { + return fetchAllAlatPertanian(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_SearchProductAlatPertanian value)? + searchProductAlatPertanian, + TResult? Function(_FetchAllAlatPertanian value)? fetchAllAlatPertanian, + TResult? Function(_GetProductAlatPertanian value)? getProductAlatPertanian, + }) { + return fetchAllAlatPertanian?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_SearchProductAlatPertanian value)? + searchProductAlatPertanian, + TResult Function(_FetchAllAlatPertanian value)? fetchAllAlatPertanian, + TResult Function(_GetProductAlatPertanian value)? getProductAlatPertanian, + required TResult orElse(), + }) { + if (fetchAllAlatPertanian != null) { + return fetchAllAlatPertanian(this); + } + return orElse(); + } +} + +abstract class _FetchAllAlatPertanian implements AlatPertanianEvent { + const factory _FetchAllAlatPertanian() = _$FetchAllAlatPertanianImpl; +} + +/// @nodoc +abstract class _$$GetProductAlatPertanianImplCopyWith<$Res> { + factory _$$GetProductAlatPertanianImplCopyWith( + _$GetProductAlatPertanianImpl value, + $Res Function(_$GetProductAlatPertanianImpl) then) = + __$$GetProductAlatPertanianImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$GetProductAlatPertanianImplCopyWithImpl<$Res> + extends _$AlatPertanianEventCopyWithImpl<$Res, + _$GetProductAlatPertanianImpl> + implements _$$GetProductAlatPertanianImplCopyWith<$Res> { + __$$GetProductAlatPertanianImplCopyWithImpl( + _$GetProductAlatPertanianImpl _value, + $Res Function(_$GetProductAlatPertanianImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$GetProductAlatPertanianImpl implements _GetProductAlatPertanian { + const _$GetProductAlatPertanianImpl(); + + @override + String toString() { + return 'AlatPertanianEvent.getProductAlatPertanian()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GetProductAlatPertanianImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String query) searchProductAlatPertanian, + required TResult Function() fetchAllAlatPertanian, + required TResult Function() getProductAlatPertanian, + }) { + return getProductAlatPertanian(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String query)? searchProductAlatPertanian, + TResult? Function()? fetchAllAlatPertanian, + TResult? Function()? getProductAlatPertanian, + }) { + return getProductAlatPertanian?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String query)? searchProductAlatPertanian, + TResult Function()? fetchAllAlatPertanian, + TResult Function()? getProductAlatPertanian, + required TResult orElse(), + }) { + if (getProductAlatPertanian != null) { + return getProductAlatPertanian(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_SearchProductAlatPertanian value) + searchProductAlatPertanian, + required TResult Function(_FetchAllAlatPertanian value) + fetchAllAlatPertanian, + required TResult Function(_GetProductAlatPertanian value) + getProductAlatPertanian, + }) { + return getProductAlatPertanian(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_SearchProductAlatPertanian value)? + searchProductAlatPertanian, + TResult? Function(_FetchAllAlatPertanian value)? fetchAllAlatPertanian, + TResult? Function(_GetProductAlatPertanian value)? getProductAlatPertanian, + }) { + return getProductAlatPertanian?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_SearchProductAlatPertanian value)? + searchProductAlatPertanian, + TResult Function(_FetchAllAlatPertanian value)? fetchAllAlatPertanian, + TResult Function(_GetProductAlatPertanian value)? getProductAlatPertanian, + required TResult orElse(), + }) { + if (getProductAlatPertanian != null) { + return getProductAlatPertanian(this); + } + return orElse(); + } +} + +abstract class _GetProductAlatPertanian implements AlatPertanianEvent { + const factory _GetProductAlatPertanian() = _$GetProductAlatPertanianImpl; +} + +/// @nodoc +mixin _$AlatPertanianState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $AlatPertanianStateCopyWith<$Res> { + factory $AlatPertanianStateCopyWith( + AlatPertanianState value, $Res Function(AlatPertanianState) then) = + _$AlatPertanianStateCopyWithImpl<$Res, AlatPertanianState>; +} + +/// @nodoc +class _$AlatPertanianStateCopyWithImpl<$Res, $Val extends AlatPertanianState> + implements $AlatPertanianStateCopyWith<$Res> { + _$AlatPertanianStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$AlatPertanianStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'AlatPertanianState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements AlatPertanianState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$AlatPertanianStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'AlatPertanianState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements AlatPertanianState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List products}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$AlatPertanianStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? products = null, + }) { + return _then(_$LoadedImpl( + null == products + ? _value._products + : products // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List products) : _products = products; + + final List _products; + @override + List get products { + if (_products is EqualUnmodifiableListView) return _products; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_products); + } + + @override + String toString() { + return 'AlatPertanianState.loaded(products: $products)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality().equals(other._products, _products)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_products)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loaded(products); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(products); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(products); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements AlatPertanianState { + const factory _Loaded(final List products) = _$LoadedImpl; + + List get products; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$AlatPertanianStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'AlatPertanianState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements AlatPertanianState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_event.dart new file mode 100644 index 0000000..67cdbd2 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_event.dart @@ -0,0 +1,10 @@ +part of 'alat_pertanian_bloc.dart'; + +@freezed +class AlatPertanianEvent with _$AlatPertanianEvent { + const factory AlatPertanianEvent.started() = _Started; + const factory AlatPertanianEvent.searchProductAlatPertanian(String query) = _SearchProductAlatPertanian; + const factory AlatPertanianEvent.fetchAllAlatPertanian() = _FetchAllAlatPertanian; + const factory AlatPertanianEvent.getProductAlatPertanian() = + _GetProductAlatPertanian; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_state.dart new file mode 100644 index 0000000..712e1b9 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_state.dart @@ -0,0 +1,9 @@ +part of 'alat_pertanian_bloc.dart'; + +@freezed +class AlatPertanianState with _$AlatPertanianState { + const factory AlatPertanianState.initial() = _Initial; + const factory AlatPertanianState.loading() = _Loading; + const factory AlatPertanianState.loaded(List products) = _Loaded; + const factory AlatPertanianState.error(final String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart new file mode 100644 index 0000000..5017976 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart @@ -0,0 +1,99 @@ +import 'package:bloc/bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/requests/product_request_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_remote_datasource.dart'; +import 'package:image_picker/image_picker.dart'; +import '../../../../data/models/responses/product_response_model.dart'; + +part 'all_product_bloc.freezed.dart'; +part 'all_product_event.dart'; +part 'all_product_state.dart'; + +class AllProductBloc extends Bloc { + final ProductRemoteDatasource productRemoteDatasource; + List products = []; + + AllProductBloc( + this.productRemoteDatasource, + ) : super(const AllProductState.initial()) { + on<_GetAllProducts>((event, emit) async { + emit(const AllProductState.loading()); + final response = await productRemoteDatasource.getProducts(); + response.fold( + (error) => emit(AllProductState.error(error.toString())), + (result) { + products = result.data ?? []; + emit(AllProductState.loaded(products)); + }, + ); + }); + + on<_GetAllProductsByCategory>((event, emit) async { + emit(const AllProductState.loading()); + final newProducts = event.categoryId == 0 + ? products + : products + .where((element) => element.categoryId == event.categoryId) + .toList(); + emit(AllProductState.loaded(newProducts)); + }); + + on<_AddProduct>((event, emit) async { + emit(const AllProductState.loading()); + final requestData = ProductRequestModel( + id: event.product.id ?? 0, + name: event.product.name ?? '', + price: event.product.price ?? 0, + stock: event.product.stock ?? 0, + image: event.image, + is_available: event.product.isAvailable ?? 0, + description: event.product.description.toString(), + category_id: event.product.categoryId ?? 0); + final response = await productRemoteDatasource.addProduct(requestData); + response.fold( + (l) => emit(AllProductState.error(l)), + (r) { + products.add(r.data); + emit(AllProductState.loaded(products)); + }, + ); + emit(AllProductState.loaded(products)); + }); + on<_UpdateProduct>((event, emit) async { + emit(const AllProductState.loading()); + final requestData = ProductRequestModel( + id: event.product.id ?? 0, + name: event.product.name ?? '', + price: event.product.price ?? 0, + stock: event.product.stock ?? 0, + image: event.image, + is_available: event.product.isAvailable ?? 0, + description: event.product.description.toString(), + category_id: event.product.categoryId ?? 0); + final response = await productRemoteDatasource.updateProduct(requestData); + response.fold( + (l) => emit(AllProductState.error(l)), + (r) { + add(const _GetAllProducts()); + }, + ); + }); + on<_SearchProduct>((event, emit) async { + emit(const AllProductState.loading()); + final newProducts = products + .where((element) => + element.name!.toLowerCase().contains(event.query.toLowerCase())) + .toList(); + emit(AllProductState.loaded(newProducts)); + }); + + on<_FetchAll>((event, emit) async { + emit(const AllProductState.loading()); + emit(AllProductState.loaded(products)); + }); + } + + +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.freezed.dart new file mode 100644 index 0000000..56bcd05 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.freezed.dart @@ -0,0 +1,1790 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'all_product_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$AllProductEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getAllProducts, + required TResult Function(int categoryId) getAllProductsByCategory, + required TResult Function(Product product, XFile? image) updateProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAll, + required TResult Function(Product product, XFile image) addProduct, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getAllProducts, + TResult? Function(int categoryId)? getAllProductsByCategory, + TResult? Function(Product product, XFile? image)? updateProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAll, + TResult? Function(Product product, XFile image)? addProduct, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getAllProducts, + TResult Function(int categoryId)? getAllProductsByCategory, + TResult Function(Product product, XFile? image)? updateProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAll, + TResult Function(Product product, XFile image)? addProduct, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetAllProducts value) getAllProducts, + required TResult Function(_GetAllProductsByCategory value) + getAllProductsByCategory, + required TResult Function(_UpdateProduct value) updateProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAll value) fetchAll, + required TResult Function(_AddProduct value) addProduct, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetAllProducts value)? getAllProducts, + TResult? Function(_GetAllProductsByCategory value)? + getAllProductsByCategory, + TResult? Function(_UpdateProduct value)? updateProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAll value)? fetchAll, + TResult? Function(_AddProduct value)? addProduct, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetAllProducts value)? getAllProducts, + TResult Function(_GetAllProductsByCategory value)? getAllProductsByCategory, + TResult Function(_UpdateProduct value)? updateProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAll value)? fetchAll, + TResult Function(_AddProduct value)? addProduct, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $AllProductEventCopyWith<$Res> { + factory $AllProductEventCopyWith( + AllProductEvent value, $Res Function(AllProductEvent) then) = + _$AllProductEventCopyWithImpl<$Res, AllProductEvent>; +} + +/// @nodoc +class _$AllProductEventCopyWithImpl<$Res, $Val extends AllProductEvent> + implements $AllProductEventCopyWith<$Res> { + _$AllProductEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$AllProductEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'AllProductEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getAllProducts, + required TResult Function(int categoryId) getAllProductsByCategory, + required TResult Function(Product product, XFile? image) updateProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAll, + required TResult Function(Product product, XFile image) addProduct, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getAllProducts, + TResult? Function(int categoryId)? getAllProductsByCategory, + TResult? Function(Product product, XFile? image)? updateProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAll, + TResult? Function(Product product, XFile image)? addProduct, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getAllProducts, + TResult Function(int categoryId)? getAllProductsByCategory, + TResult Function(Product product, XFile? image)? updateProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAll, + TResult Function(Product product, XFile image)? addProduct, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetAllProducts value) getAllProducts, + required TResult Function(_GetAllProductsByCategory value) + getAllProductsByCategory, + required TResult Function(_UpdateProduct value) updateProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAll value) fetchAll, + required TResult Function(_AddProduct value) addProduct, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetAllProducts value)? getAllProducts, + TResult? Function(_GetAllProductsByCategory value)? + getAllProductsByCategory, + TResult? Function(_UpdateProduct value)? updateProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAll value)? fetchAll, + TResult? Function(_AddProduct value)? addProduct, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetAllProducts value)? getAllProducts, + TResult Function(_GetAllProductsByCategory value)? getAllProductsByCategory, + TResult Function(_UpdateProduct value)? updateProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAll value)? fetchAll, + TResult Function(_AddProduct value)? addProduct, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements AllProductEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetAllProductsImplCopyWith<$Res> { + factory _$$GetAllProductsImplCopyWith(_$GetAllProductsImpl value, + $Res Function(_$GetAllProductsImpl) then) = + __$$GetAllProductsImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$GetAllProductsImplCopyWithImpl<$Res> + extends _$AllProductEventCopyWithImpl<$Res, _$GetAllProductsImpl> + implements _$$GetAllProductsImplCopyWith<$Res> { + __$$GetAllProductsImplCopyWithImpl( + _$GetAllProductsImpl _value, $Res Function(_$GetAllProductsImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$GetAllProductsImpl implements _GetAllProducts { + const _$GetAllProductsImpl(); + + @override + String toString() { + return 'AllProductEvent.getAllProducts()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$GetAllProductsImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getAllProducts, + required TResult Function(int categoryId) getAllProductsByCategory, + required TResult Function(Product product, XFile? image) updateProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAll, + required TResult Function(Product product, XFile image) addProduct, + }) { + return getAllProducts(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getAllProducts, + TResult? Function(int categoryId)? getAllProductsByCategory, + TResult? Function(Product product, XFile? image)? updateProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAll, + TResult? Function(Product product, XFile image)? addProduct, + }) { + return getAllProducts?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getAllProducts, + TResult Function(int categoryId)? getAllProductsByCategory, + TResult Function(Product product, XFile? image)? updateProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAll, + TResult Function(Product product, XFile image)? addProduct, + required TResult orElse(), + }) { + if (getAllProducts != null) { + return getAllProducts(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetAllProducts value) getAllProducts, + required TResult Function(_GetAllProductsByCategory value) + getAllProductsByCategory, + required TResult Function(_UpdateProduct value) updateProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAll value) fetchAll, + required TResult Function(_AddProduct value) addProduct, + }) { + return getAllProducts(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetAllProducts value)? getAllProducts, + TResult? Function(_GetAllProductsByCategory value)? + getAllProductsByCategory, + TResult? Function(_UpdateProduct value)? updateProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAll value)? fetchAll, + TResult? Function(_AddProduct value)? addProduct, + }) { + return getAllProducts?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetAllProducts value)? getAllProducts, + TResult Function(_GetAllProductsByCategory value)? getAllProductsByCategory, + TResult Function(_UpdateProduct value)? updateProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAll value)? fetchAll, + TResult Function(_AddProduct value)? addProduct, + required TResult orElse(), + }) { + if (getAllProducts != null) { + return getAllProducts(this); + } + return orElse(); + } +} + +abstract class _GetAllProducts implements AllProductEvent { + const factory _GetAllProducts() = _$GetAllProductsImpl; +} + +/// @nodoc +abstract class _$$GetAllProductsByCategoryImplCopyWith<$Res> { + factory _$$GetAllProductsByCategoryImplCopyWith( + _$GetAllProductsByCategoryImpl value, + $Res Function(_$GetAllProductsByCategoryImpl) then) = + __$$GetAllProductsByCategoryImplCopyWithImpl<$Res>; + @useResult + $Res call({int categoryId}); +} + +/// @nodoc +class __$$GetAllProductsByCategoryImplCopyWithImpl<$Res> + extends _$AllProductEventCopyWithImpl<$Res, _$GetAllProductsByCategoryImpl> + implements _$$GetAllProductsByCategoryImplCopyWith<$Res> { + __$$GetAllProductsByCategoryImplCopyWithImpl( + _$GetAllProductsByCategoryImpl _value, + $Res Function(_$GetAllProductsByCategoryImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? categoryId = null, + }) { + return _then(_$GetAllProductsByCategoryImpl( + null == categoryId + ? _value.categoryId + : categoryId // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$GetAllProductsByCategoryImpl implements _GetAllProductsByCategory { + const _$GetAllProductsByCategoryImpl(this.categoryId); + + @override + final int categoryId; + + @override + String toString() { + return 'AllProductEvent.getAllProductsByCategory(categoryId: $categoryId)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GetAllProductsByCategoryImpl && + (identical(other.categoryId, categoryId) || + other.categoryId == categoryId)); + } + + @override + int get hashCode => Object.hash(runtimeType, categoryId); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$GetAllProductsByCategoryImplCopyWith<_$GetAllProductsByCategoryImpl> + get copyWith => __$$GetAllProductsByCategoryImplCopyWithImpl< + _$GetAllProductsByCategoryImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getAllProducts, + required TResult Function(int categoryId) getAllProductsByCategory, + required TResult Function(Product product, XFile? image) updateProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAll, + required TResult Function(Product product, XFile image) addProduct, + }) { + return getAllProductsByCategory(categoryId); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getAllProducts, + TResult? Function(int categoryId)? getAllProductsByCategory, + TResult? Function(Product product, XFile? image)? updateProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAll, + TResult? Function(Product product, XFile image)? addProduct, + }) { + return getAllProductsByCategory?.call(categoryId); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getAllProducts, + TResult Function(int categoryId)? getAllProductsByCategory, + TResult Function(Product product, XFile? image)? updateProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAll, + TResult Function(Product product, XFile image)? addProduct, + required TResult orElse(), + }) { + if (getAllProductsByCategory != null) { + return getAllProductsByCategory(categoryId); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetAllProducts value) getAllProducts, + required TResult Function(_GetAllProductsByCategory value) + getAllProductsByCategory, + required TResult Function(_UpdateProduct value) updateProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAll value) fetchAll, + required TResult Function(_AddProduct value) addProduct, + }) { + return getAllProductsByCategory(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetAllProducts value)? getAllProducts, + TResult? Function(_GetAllProductsByCategory value)? + getAllProductsByCategory, + TResult? Function(_UpdateProduct value)? updateProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAll value)? fetchAll, + TResult? Function(_AddProduct value)? addProduct, + }) { + return getAllProductsByCategory?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetAllProducts value)? getAllProducts, + TResult Function(_GetAllProductsByCategory value)? getAllProductsByCategory, + TResult Function(_UpdateProduct value)? updateProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAll value)? fetchAll, + TResult Function(_AddProduct value)? addProduct, + required TResult orElse(), + }) { + if (getAllProductsByCategory != null) { + return getAllProductsByCategory(this); + } + return orElse(); + } +} + +abstract class _GetAllProductsByCategory implements AllProductEvent { + const factory _GetAllProductsByCategory(final int categoryId) = + _$GetAllProductsByCategoryImpl; + + int get categoryId; + @JsonKey(ignore: true) + _$$GetAllProductsByCategoryImplCopyWith<_$GetAllProductsByCategoryImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$UpdateProductImplCopyWith<$Res> { + factory _$$UpdateProductImplCopyWith( + _$UpdateProductImpl value, $Res Function(_$UpdateProductImpl) then) = + __$$UpdateProductImplCopyWithImpl<$Res>; + @useResult + $Res call({Product product, XFile? image}); +} + +/// @nodoc +class __$$UpdateProductImplCopyWithImpl<$Res> + extends _$AllProductEventCopyWithImpl<$Res, _$UpdateProductImpl> + implements _$$UpdateProductImplCopyWith<$Res> { + __$$UpdateProductImplCopyWithImpl( + _$UpdateProductImpl _value, $Res Function(_$UpdateProductImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? product = null, + Object? image = freezed, + }) { + return _then(_$UpdateProductImpl( + null == product + ? _value.product + : product // ignore: cast_nullable_to_non_nullable + as Product, + freezed == image + ? _value.image + : image // ignore: cast_nullable_to_non_nullable + as XFile?, + )); + } +} + +/// @nodoc + +class _$UpdateProductImpl implements _UpdateProduct { + const _$UpdateProductImpl(this.product, this.image); + + @override + final Product product; + @override + final XFile? image; + + @override + String toString() { + return 'AllProductEvent.updateProduct(product: $product, image: $image)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$UpdateProductImpl && + (identical(other.product, product) || other.product == product) && + (identical(other.image, image) || other.image == image)); + } + + @override + int get hashCode => Object.hash(runtimeType, product, image); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$UpdateProductImplCopyWith<_$UpdateProductImpl> get copyWith => + __$$UpdateProductImplCopyWithImpl<_$UpdateProductImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getAllProducts, + required TResult Function(int categoryId) getAllProductsByCategory, + required TResult Function(Product product, XFile? image) updateProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAll, + required TResult Function(Product product, XFile image) addProduct, + }) { + return updateProduct(product, image); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getAllProducts, + TResult? Function(int categoryId)? getAllProductsByCategory, + TResult? Function(Product product, XFile? image)? updateProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAll, + TResult? Function(Product product, XFile image)? addProduct, + }) { + return updateProduct?.call(product, image); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getAllProducts, + TResult Function(int categoryId)? getAllProductsByCategory, + TResult Function(Product product, XFile? image)? updateProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAll, + TResult Function(Product product, XFile image)? addProduct, + required TResult orElse(), + }) { + if (updateProduct != null) { + return updateProduct(product, image); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetAllProducts value) getAllProducts, + required TResult Function(_GetAllProductsByCategory value) + getAllProductsByCategory, + required TResult Function(_UpdateProduct value) updateProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAll value) fetchAll, + required TResult Function(_AddProduct value) addProduct, + }) { + return updateProduct(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetAllProducts value)? getAllProducts, + TResult? Function(_GetAllProductsByCategory value)? + getAllProductsByCategory, + TResult? Function(_UpdateProduct value)? updateProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAll value)? fetchAll, + TResult? Function(_AddProduct value)? addProduct, + }) { + return updateProduct?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetAllProducts value)? getAllProducts, + TResult Function(_GetAllProductsByCategory value)? getAllProductsByCategory, + TResult Function(_UpdateProduct value)? updateProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAll value)? fetchAll, + TResult Function(_AddProduct value)? addProduct, + required TResult orElse(), + }) { + if (updateProduct != null) { + return updateProduct(this); + } + return orElse(); + } +} + +abstract class _UpdateProduct implements AllProductEvent { + const factory _UpdateProduct(final Product product, final XFile? image) = + _$UpdateProductImpl; + + Product get product; + XFile? get image; + @JsonKey(ignore: true) + _$$UpdateProductImplCopyWith<_$UpdateProductImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SearchProductImplCopyWith<$Res> { + factory _$$SearchProductImplCopyWith( + _$SearchProductImpl value, $Res Function(_$SearchProductImpl) then) = + __$$SearchProductImplCopyWithImpl<$Res>; + @useResult + $Res call({String query}); +} + +/// @nodoc +class __$$SearchProductImplCopyWithImpl<$Res> + extends _$AllProductEventCopyWithImpl<$Res, _$SearchProductImpl> + implements _$$SearchProductImplCopyWith<$Res> { + __$$SearchProductImplCopyWithImpl( + _$SearchProductImpl _value, $Res Function(_$SearchProductImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? query = null, + }) { + return _then(_$SearchProductImpl( + null == query + ? _value.query + : query // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$SearchProductImpl implements _SearchProduct { + const _$SearchProductImpl(this.query); + + @override + final String query; + + @override + String toString() { + return 'AllProductEvent.searchProduct(query: $query)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SearchProductImpl && + (identical(other.query, query) || other.query == query)); + } + + @override + int get hashCode => Object.hash(runtimeType, query); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$SearchProductImplCopyWith<_$SearchProductImpl> get copyWith => + __$$SearchProductImplCopyWithImpl<_$SearchProductImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getAllProducts, + required TResult Function(int categoryId) getAllProductsByCategory, + required TResult Function(Product product, XFile? image) updateProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAll, + required TResult Function(Product product, XFile image) addProduct, + }) { + return searchProduct(query); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getAllProducts, + TResult? Function(int categoryId)? getAllProductsByCategory, + TResult? Function(Product product, XFile? image)? updateProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAll, + TResult? Function(Product product, XFile image)? addProduct, + }) { + return searchProduct?.call(query); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getAllProducts, + TResult Function(int categoryId)? getAllProductsByCategory, + TResult Function(Product product, XFile? image)? updateProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAll, + TResult Function(Product product, XFile image)? addProduct, + required TResult orElse(), + }) { + if (searchProduct != null) { + return searchProduct(query); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetAllProducts value) getAllProducts, + required TResult Function(_GetAllProductsByCategory value) + getAllProductsByCategory, + required TResult Function(_UpdateProduct value) updateProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAll value) fetchAll, + required TResult Function(_AddProduct value) addProduct, + }) { + return searchProduct(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetAllProducts value)? getAllProducts, + TResult? Function(_GetAllProductsByCategory value)? + getAllProductsByCategory, + TResult? Function(_UpdateProduct value)? updateProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAll value)? fetchAll, + TResult? Function(_AddProduct value)? addProduct, + }) { + return searchProduct?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetAllProducts value)? getAllProducts, + TResult Function(_GetAllProductsByCategory value)? getAllProductsByCategory, + TResult Function(_UpdateProduct value)? updateProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAll value)? fetchAll, + TResult Function(_AddProduct value)? addProduct, + required TResult orElse(), + }) { + if (searchProduct != null) { + return searchProduct(this); + } + return orElse(); + } +} + +abstract class _SearchProduct implements AllProductEvent { + const factory _SearchProduct(final String query) = _$SearchProductImpl; + + String get query; + @JsonKey(ignore: true) + _$$SearchProductImplCopyWith<_$SearchProductImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$FetchAllImplCopyWith<$Res> { + factory _$$FetchAllImplCopyWith( + _$FetchAllImpl value, $Res Function(_$FetchAllImpl) then) = + __$$FetchAllImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$FetchAllImplCopyWithImpl<$Res> + extends _$AllProductEventCopyWithImpl<$Res, _$FetchAllImpl> + implements _$$FetchAllImplCopyWith<$Res> { + __$$FetchAllImplCopyWithImpl( + _$FetchAllImpl _value, $Res Function(_$FetchAllImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$FetchAllImpl implements _FetchAll { + const _$FetchAllImpl(); + + @override + String toString() { + return 'AllProductEvent.fetchAll()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$FetchAllImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getAllProducts, + required TResult Function(int categoryId) getAllProductsByCategory, + required TResult Function(Product product, XFile? image) updateProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAll, + required TResult Function(Product product, XFile image) addProduct, + }) { + return fetchAll(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getAllProducts, + TResult? Function(int categoryId)? getAllProductsByCategory, + TResult? Function(Product product, XFile? image)? updateProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAll, + TResult? Function(Product product, XFile image)? addProduct, + }) { + return fetchAll?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getAllProducts, + TResult Function(int categoryId)? getAllProductsByCategory, + TResult Function(Product product, XFile? image)? updateProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAll, + TResult Function(Product product, XFile image)? addProduct, + required TResult orElse(), + }) { + if (fetchAll != null) { + return fetchAll(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetAllProducts value) getAllProducts, + required TResult Function(_GetAllProductsByCategory value) + getAllProductsByCategory, + required TResult Function(_UpdateProduct value) updateProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAll value) fetchAll, + required TResult Function(_AddProduct value) addProduct, + }) { + return fetchAll(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetAllProducts value)? getAllProducts, + TResult? Function(_GetAllProductsByCategory value)? + getAllProductsByCategory, + TResult? Function(_UpdateProduct value)? updateProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAll value)? fetchAll, + TResult? Function(_AddProduct value)? addProduct, + }) { + return fetchAll?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetAllProducts value)? getAllProducts, + TResult Function(_GetAllProductsByCategory value)? getAllProductsByCategory, + TResult Function(_UpdateProduct value)? updateProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAll value)? fetchAll, + TResult Function(_AddProduct value)? addProduct, + required TResult orElse(), + }) { + if (fetchAll != null) { + return fetchAll(this); + } + return orElse(); + } +} + +abstract class _FetchAll implements AllProductEvent { + const factory _FetchAll() = _$FetchAllImpl; +} + +/// @nodoc +abstract class _$$AddProductImplCopyWith<$Res> { + factory _$$AddProductImplCopyWith( + _$AddProductImpl value, $Res Function(_$AddProductImpl) then) = + __$$AddProductImplCopyWithImpl<$Res>; + @useResult + $Res call({Product product, XFile image}); +} + +/// @nodoc +class __$$AddProductImplCopyWithImpl<$Res> + extends _$AllProductEventCopyWithImpl<$Res, _$AddProductImpl> + implements _$$AddProductImplCopyWith<$Res> { + __$$AddProductImplCopyWithImpl( + _$AddProductImpl _value, $Res Function(_$AddProductImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? product = null, + Object? image = null, + }) { + return _then(_$AddProductImpl( + null == product + ? _value.product + : product // ignore: cast_nullable_to_non_nullable + as Product, + null == image + ? _value.image + : image // ignore: cast_nullable_to_non_nullable + as XFile, + )); + } +} + +/// @nodoc + +class _$AddProductImpl implements _AddProduct { + const _$AddProductImpl(this.product, this.image); + + @override + final Product product; + @override + final XFile image; + + @override + String toString() { + return 'AllProductEvent.addProduct(product: $product, image: $image)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AddProductImpl && + (identical(other.product, product) || other.product == product) && + (identical(other.image, image) || other.image == image)); + } + + @override + int get hashCode => Object.hash(runtimeType, product, image); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AddProductImplCopyWith<_$AddProductImpl> get copyWith => + __$$AddProductImplCopyWithImpl<_$AddProductImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getAllProducts, + required TResult Function(int categoryId) getAllProductsByCategory, + required TResult Function(Product product, XFile? image) updateProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAll, + required TResult Function(Product product, XFile image) addProduct, + }) { + return addProduct(product, image); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getAllProducts, + TResult? Function(int categoryId)? getAllProductsByCategory, + TResult? Function(Product product, XFile? image)? updateProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAll, + TResult? Function(Product product, XFile image)? addProduct, + }) { + return addProduct?.call(product, image); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getAllProducts, + TResult Function(int categoryId)? getAllProductsByCategory, + TResult Function(Product product, XFile? image)? updateProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAll, + TResult Function(Product product, XFile image)? addProduct, + required TResult orElse(), + }) { + if (addProduct != null) { + return addProduct(product, image); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetAllProducts value) getAllProducts, + required TResult Function(_GetAllProductsByCategory value) + getAllProductsByCategory, + required TResult Function(_UpdateProduct value) updateProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAll value) fetchAll, + required TResult Function(_AddProduct value) addProduct, + }) { + return addProduct(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetAllProducts value)? getAllProducts, + TResult? Function(_GetAllProductsByCategory value)? + getAllProductsByCategory, + TResult? Function(_UpdateProduct value)? updateProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAll value)? fetchAll, + TResult? Function(_AddProduct value)? addProduct, + }) { + return addProduct?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetAllProducts value)? getAllProducts, + TResult Function(_GetAllProductsByCategory value)? getAllProductsByCategory, + TResult Function(_UpdateProduct value)? updateProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAll value)? fetchAll, + TResult Function(_AddProduct value)? addProduct, + required TResult orElse(), + }) { + if (addProduct != null) { + return addProduct(this); + } + return orElse(); + } +} + +abstract class _AddProduct implements AllProductEvent { + const factory _AddProduct(final Product product, final XFile image) = + _$AddProductImpl; + + Product get product; + XFile get image; + @JsonKey(ignore: true) + _$$AddProductImplCopyWith<_$AddProductImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$AllProductState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $AllProductStateCopyWith<$Res> { + factory $AllProductStateCopyWith( + AllProductState value, $Res Function(AllProductState) then) = + _$AllProductStateCopyWithImpl<$Res, AllProductState>; +} + +/// @nodoc +class _$AllProductStateCopyWithImpl<$Res, $Val extends AllProductState> + implements $AllProductStateCopyWith<$Res> { + _$AllProductStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$AllProductStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'AllProductState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements AllProductState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$AllProductStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'AllProductState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements AllProductState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List products}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$AllProductStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? products = null, + }) { + return _then(_$LoadedImpl( + null == products + ? _value._products + : products // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List products) : _products = products; + + final List _products; + @override + List get products { + if (_products is EqualUnmodifiableListView) return _products; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_products); + } + + @override + String toString() { + return 'AllProductState.loaded(products: $products)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality().equals(other._products, _products)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_products)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loaded(products); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(products); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(products); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements AllProductState { + const factory _Loaded(final List products) = _$LoadedImpl; + + List get products; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$AllProductStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'AllProductState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements AllProductState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_event.dart new file mode 100644 index 0000000..9b311b4 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_event.dart @@ -0,0 +1,13 @@ +part of 'all_product_bloc.dart'; + +@freezed +class AllProductEvent with _$AllProductEvent { + const factory AllProductEvent.started() = _Started; + const factory AllProductEvent.getAllProducts() = _GetAllProducts; + const factory AllProductEvent.getAllProductsByCategory(int categoryId) = _GetAllProductsByCategory; + const factory AllProductEvent.updateProduct(Product product, XFile? image) = _UpdateProduct; + const factory AllProductEvent.searchProduct(String query) = _SearchProduct; + const factory AllProductEvent.fetchAll() = _FetchAll; + const factory AllProductEvent.addProduct(Product product, XFile image) = _AddProduct; + +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_state.dart new file mode 100644 index 0000000..7cfe0d2 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/all_product/all_product_state.dart @@ -0,0 +1,9 @@ +part of 'all_product_bloc.dart'; + +@freezed +class AllProductState with _$AllProductState { + const factory AllProductState.initial() = _Initial; + const factory AllProductState.loading() = _Loading; + const factory AllProductState.loaded(List products) = _Loaded; + const factory AllProductState.error(final String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_bloc.dart new file mode 100644 index 0000000..2248649 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_bloc.dart @@ -0,0 +1,42 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_remote_datasource.dart'; + +import '../../../../data/models/responses/product_response_model.dart'; + +part 'benih_bloc.freezed.dart'; +part 'benih_event.dart'; +part 'benih_state.dart'; + +class BenihBloc extends Bloc { + final ProductRemoteDatasource _productRemoteDatasource; + List products = []; + BenihBloc( + this._productRemoteDatasource, + ) : super(const _Initial()) { + on<_GetProductBenih>((event, emit) async { + emit(const _Loading()); + final response = await _productRemoteDatasource.getProductByCategory(4); + response.fold((l) => emit(_Error(l)), (r) { + products = r.data ?? []; + emit(_Loaded(products)); + }); + }); + + on<_SearchProductBenih>((event, emit) async { + emit(const BenihState.loading()); + final newProducts = products + .where((element) => + element.name!.toLowerCase().contains(event.query.toLowerCase())) + .toList(); + emit(BenihState.loaded(newProducts)); + }); + + on<_FetchAllBenih>((event, emit) async { + emit(const BenihState.loading()); + emit(BenihState.loaded(products)); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_bloc.freezed.dart new file mode 100644 index 0000000..78102a7 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_bloc.freezed.dart @@ -0,0 +1,1172 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'benih_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$BenihEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductBenih, + required TResult Function(String query) searchProductBenih, + required TResult Function() fetchAllBenih, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductBenih, + TResult? Function(String query)? searchProductBenih, + TResult? Function()? fetchAllBenih, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductBenih, + TResult Function(String query)? searchProductBenih, + TResult Function()? fetchAllBenih, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductBenih value) getProductBenih, + required TResult Function(_SearchProductBenih value) searchProductBenih, + required TResult Function(_FetchAllBenih value) fetchAllBenih, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductBenih value)? getProductBenih, + TResult? Function(_SearchProductBenih value)? searchProductBenih, + TResult? Function(_FetchAllBenih value)? fetchAllBenih, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductBenih value)? getProductBenih, + TResult Function(_SearchProductBenih value)? searchProductBenih, + TResult Function(_FetchAllBenih value)? fetchAllBenih, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $BenihEventCopyWith<$Res> { + factory $BenihEventCopyWith( + BenihEvent value, $Res Function(BenihEvent) then) = + _$BenihEventCopyWithImpl<$Res, BenihEvent>; +} + +/// @nodoc +class _$BenihEventCopyWithImpl<$Res, $Val extends BenihEvent> + implements $BenihEventCopyWith<$Res> { + _$BenihEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$BenihEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'BenihEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductBenih, + required TResult Function(String query) searchProductBenih, + required TResult Function() fetchAllBenih, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductBenih, + TResult? Function(String query)? searchProductBenih, + TResult? Function()? fetchAllBenih, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductBenih, + TResult Function(String query)? searchProductBenih, + TResult Function()? fetchAllBenih, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductBenih value) getProductBenih, + required TResult Function(_SearchProductBenih value) searchProductBenih, + required TResult Function(_FetchAllBenih value) fetchAllBenih, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductBenih value)? getProductBenih, + TResult? Function(_SearchProductBenih value)? searchProductBenih, + TResult? Function(_FetchAllBenih value)? fetchAllBenih, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductBenih value)? getProductBenih, + TResult Function(_SearchProductBenih value)? searchProductBenih, + TResult Function(_FetchAllBenih value)? fetchAllBenih, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements BenihEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetProductBenihImplCopyWith<$Res> { + factory _$$GetProductBenihImplCopyWith(_$GetProductBenihImpl value, + $Res Function(_$GetProductBenihImpl) then) = + __$$GetProductBenihImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$GetProductBenihImplCopyWithImpl<$Res> + extends _$BenihEventCopyWithImpl<$Res, _$GetProductBenihImpl> + implements _$$GetProductBenihImplCopyWith<$Res> { + __$$GetProductBenihImplCopyWithImpl( + _$GetProductBenihImpl _value, $Res Function(_$GetProductBenihImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$GetProductBenihImpl implements _GetProductBenih { + const _$GetProductBenihImpl(); + + @override + String toString() { + return 'BenihEvent.getProductBenih()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$GetProductBenihImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductBenih, + required TResult Function(String query) searchProductBenih, + required TResult Function() fetchAllBenih, + }) { + return getProductBenih(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductBenih, + TResult? Function(String query)? searchProductBenih, + TResult? Function()? fetchAllBenih, + }) { + return getProductBenih?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductBenih, + TResult Function(String query)? searchProductBenih, + TResult Function()? fetchAllBenih, + required TResult orElse(), + }) { + if (getProductBenih != null) { + return getProductBenih(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductBenih value) getProductBenih, + required TResult Function(_SearchProductBenih value) searchProductBenih, + required TResult Function(_FetchAllBenih value) fetchAllBenih, + }) { + return getProductBenih(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductBenih value)? getProductBenih, + TResult? Function(_SearchProductBenih value)? searchProductBenih, + TResult? Function(_FetchAllBenih value)? fetchAllBenih, + }) { + return getProductBenih?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductBenih value)? getProductBenih, + TResult Function(_SearchProductBenih value)? searchProductBenih, + TResult Function(_FetchAllBenih value)? fetchAllBenih, + required TResult orElse(), + }) { + if (getProductBenih != null) { + return getProductBenih(this); + } + return orElse(); + } +} + +abstract class _GetProductBenih implements BenihEvent { + const factory _GetProductBenih() = _$GetProductBenihImpl; +} + +/// @nodoc +abstract class _$$SearchProductBenihImplCopyWith<$Res> { + factory _$$SearchProductBenihImplCopyWith(_$SearchProductBenihImpl value, + $Res Function(_$SearchProductBenihImpl) then) = + __$$SearchProductBenihImplCopyWithImpl<$Res>; + @useResult + $Res call({String query}); +} + +/// @nodoc +class __$$SearchProductBenihImplCopyWithImpl<$Res> + extends _$BenihEventCopyWithImpl<$Res, _$SearchProductBenihImpl> + implements _$$SearchProductBenihImplCopyWith<$Res> { + __$$SearchProductBenihImplCopyWithImpl(_$SearchProductBenihImpl _value, + $Res Function(_$SearchProductBenihImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? query = null, + }) { + return _then(_$SearchProductBenihImpl( + null == query + ? _value.query + : query // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$SearchProductBenihImpl implements _SearchProductBenih { + const _$SearchProductBenihImpl(this.query); + + @override + final String query; + + @override + String toString() { + return 'BenihEvent.searchProductBenih(query: $query)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SearchProductBenihImpl && + (identical(other.query, query) || other.query == query)); + } + + @override + int get hashCode => Object.hash(runtimeType, query); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$SearchProductBenihImplCopyWith<_$SearchProductBenihImpl> get copyWith => + __$$SearchProductBenihImplCopyWithImpl<_$SearchProductBenihImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductBenih, + required TResult Function(String query) searchProductBenih, + required TResult Function() fetchAllBenih, + }) { + return searchProductBenih(query); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductBenih, + TResult? Function(String query)? searchProductBenih, + TResult? Function()? fetchAllBenih, + }) { + return searchProductBenih?.call(query); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductBenih, + TResult Function(String query)? searchProductBenih, + TResult Function()? fetchAllBenih, + required TResult orElse(), + }) { + if (searchProductBenih != null) { + return searchProductBenih(query); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductBenih value) getProductBenih, + required TResult Function(_SearchProductBenih value) searchProductBenih, + required TResult Function(_FetchAllBenih value) fetchAllBenih, + }) { + return searchProductBenih(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductBenih value)? getProductBenih, + TResult? Function(_SearchProductBenih value)? searchProductBenih, + TResult? Function(_FetchAllBenih value)? fetchAllBenih, + }) { + return searchProductBenih?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductBenih value)? getProductBenih, + TResult Function(_SearchProductBenih value)? searchProductBenih, + TResult Function(_FetchAllBenih value)? fetchAllBenih, + required TResult orElse(), + }) { + if (searchProductBenih != null) { + return searchProductBenih(this); + } + return orElse(); + } +} + +abstract class _SearchProductBenih implements BenihEvent { + const factory _SearchProductBenih(final String query) = + _$SearchProductBenihImpl; + + String get query; + @JsonKey(ignore: true) + _$$SearchProductBenihImplCopyWith<_$SearchProductBenihImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$FetchAllBenihImplCopyWith<$Res> { + factory _$$FetchAllBenihImplCopyWith( + _$FetchAllBenihImpl value, $Res Function(_$FetchAllBenihImpl) then) = + __$$FetchAllBenihImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$FetchAllBenihImplCopyWithImpl<$Res> + extends _$BenihEventCopyWithImpl<$Res, _$FetchAllBenihImpl> + implements _$$FetchAllBenihImplCopyWith<$Res> { + __$$FetchAllBenihImplCopyWithImpl( + _$FetchAllBenihImpl _value, $Res Function(_$FetchAllBenihImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$FetchAllBenihImpl implements _FetchAllBenih { + const _$FetchAllBenihImpl(); + + @override + String toString() { + return 'BenihEvent.fetchAllBenih()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$FetchAllBenihImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductBenih, + required TResult Function(String query) searchProductBenih, + required TResult Function() fetchAllBenih, + }) { + return fetchAllBenih(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductBenih, + TResult? Function(String query)? searchProductBenih, + TResult? Function()? fetchAllBenih, + }) { + return fetchAllBenih?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductBenih, + TResult Function(String query)? searchProductBenih, + TResult Function()? fetchAllBenih, + required TResult orElse(), + }) { + if (fetchAllBenih != null) { + return fetchAllBenih(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductBenih value) getProductBenih, + required TResult Function(_SearchProductBenih value) searchProductBenih, + required TResult Function(_FetchAllBenih value) fetchAllBenih, + }) { + return fetchAllBenih(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductBenih value)? getProductBenih, + TResult? Function(_SearchProductBenih value)? searchProductBenih, + TResult? Function(_FetchAllBenih value)? fetchAllBenih, + }) { + return fetchAllBenih?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductBenih value)? getProductBenih, + TResult Function(_SearchProductBenih value)? searchProductBenih, + TResult Function(_FetchAllBenih value)? fetchAllBenih, + required TResult orElse(), + }) { + if (fetchAllBenih != null) { + return fetchAllBenih(this); + } + return orElse(); + } +} + +abstract class _FetchAllBenih implements BenihEvent { + const factory _FetchAllBenih() = _$FetchAllBenihImpl; +} + +/// @nodoc +mixin _$BenihState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $BenihStateCopyWith<$Res> { + factory $BenihStateCopyWith( + BenihState value, $Res Function(BenihState) then) = + _$BenihStateCopyWithImpl<$Res, BenihState>; +} + +/// @nodoc +class _$BenihStateCopyWithImpl<$Res, $Val extends BenihState> + implements $BenihStateCopyWith<$Res> { + _$BenihStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$BenihStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'BenihState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements BenihState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$BenihStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'BenihState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements BenihState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List products}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$BenihStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? products = null, + }) { + return _then(_$LoadedImpl( + null == products + ? _value._products + : products // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List products) : _products = products; + + final List _products; + @override + List get products { + if (_products is EqualUnmodifiableListView) return _products; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_products); + } + + @override + String toString() { + return 'BenihState.loaded(products: $products)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality().equals(other._products, _products)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_products)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loaded(products); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(products); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(products); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements BenihState { + const factory _Loaded(final List products) = _$LoadedImpl; + + List get products; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$BenihStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'BenihState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements BenihState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_event.dart new file mode 100644 index 0000000..0d30ed1 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_event.dart @@ -0,0 +1,10 @@ +part of 'benih_bloc.dart'; + +@freezed +class BenihEvent with _$BenihEvent { + const factory BenihEvent.started() = _Started; + const factory BenihEvent.getProductBenih() = _GetProductBenih; + const factory BenihEvent.searchProductBenih(String query) = + _SearchProductBenih; + const factory BenihEvent.fetchAllBenih() = _FetchAllBenih; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_state.dart new file mode 100644 index 0000000..1015fff --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/benih/benih_state.dart @@ -0,0 +1,9 @@ +part of 'benih_bloc.dart'; + +@freezed +class BenihState with _$BenihState { + const factory BenihState.initial() = _Initial; + const factory BenihState.loading() = _Loading; + const factory BenihState.loaded(List products) = _Loaded; + const factory BenihState.error(final String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_bloc.dart new file mode 100644 index 0000000..c944f62 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_bloc.dart @@ -0,0 +1,27 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/category_remote_datasource.dart'; + +import '../../../../data/models/responses/category_response_model.dart'; + +part 'category_bloc.freezed.dart'; +part 'category_event.dart'; +part 'category_state.dart'; + +class CategoryBloc extends Bloc { + final CategoryRemoteDatasource _categoryRemoteDatasource; + CategoryBloc( + this._categoryRemoteDatasource, + ) : super(const _Initial()) { + on<_GetCategories>((event, emit) async { + emit(const _Loading()); + final response = await _categoryRemoteDatasource.getCategories(); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r.data!)), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_bloc.freezed.dart new file mode 100644 index 0000000..318e4e6 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_bloc.freezed.dart @@ -0,0 +1,877 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'category_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$CategoryEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getCategories, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getCategories, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getCategories, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetCategories value) getCategories, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetCategories value)? getCategories, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetCategories value)? getCategories, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CategoryEventCopyWith<$Res> { + factory $CategoryEventCopyWith( + CategoryEvent value, $Res Function(CategoryEvent) then) = + _$CategoryEventCopyWithImpl<$Res, CategoryEvent>; +} + +/// @nodoc +class _$CategoryEventCopyWithImpl<$Res, $Val extends CategoryEvent> + implements $CategoryEventCopyWith<$Res> { + _$CategoryEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$CategoryEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'CategoryEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getCategories, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getCategories, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getCategories, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetCategories value) getCategories, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetCategories value)? getCategories, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetCategories value)? getCategories, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements CategoryEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetCategoriesImplCopyWith<$Res> { + factory _$$GetCategoriesImplCopyWith( + _$GetCategoriesImpl value, $Res Function(_$GetCategoriesImpl) then) = + __$$GetCategoriesImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$GetCategoriesImplCopyWithImpl<$Res> + extends _$CategoryEventCopyWithImpl<$Res, _$GetCategoriesImpl> + implements _$$GetCategoriesImplCopyWith<$Res> { + __$$GetCategoriesImplCopyWithImpl( + _$GetCategoriesImpl _value, $Res Function(_$GetCategoriesImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$GetCategoriesImpl implements _GetCategories { + const _$GetCategoriesImpl(); + + @override + String toString() { + return 'CategoryEvent.getCategories()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$GetCategoriesImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getCategories, + }) { + return getCategories(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getCategories, + }) { + return getCategories?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getCategories, + required TResult orElse(), + }) { + if (getCategories != null) { + return getCategories(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetCategories value) getCategories, + }) { + return getCategories(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetCategories value)? getCategories, + }) { + return getCategories?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetCategories value)? getCategories, + required TResult orElse(), + }) { + if (getCategories != null) { + return getCategories(this); + } + return orElse(); + } +} + +abstract class _GetCategories implements CategoryEvent { + const factory _GetCategories() = _$GetCategoriesImpl; +} + +/// @nodoc +mixin _$CategoryState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List categories) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List categories)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List categories)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CategoryStateCopyWith<$Res> { + factory $CategoryStateCopyWith( + CategoryState value, $Res Function(CategoryState) then) = + _$CategoryStateCopyWithImpl<$Res, CategoryState>; +} + +/// @nodoc +class _$CategoryStateCopyWithImpl<$Res, $Val extends CategoryState> + implements $CategoryStateCopyWith<$Res> { + _$CategoryStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$CategoryStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'CategoryState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List categories) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List categories)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List categories)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements CategoryState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$CategoryStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'CategoryState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List categories) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List categories)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List categories)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements CategoryState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List categories}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$CategoryStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? categories = null, + }) { + return _then(_$LoadedImpl( + null == categories + ? _value._categories + : categories // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List categories) + : _categories = categories; + + final List _categories; + @override + List get categories { + if (_categories is EqualUnmodifiableListView) return _categories; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_categories); + } + + @override + String toString() { + return 'CategoryState.loaded(categories: $categories)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality() + .equals(other._categories, _categories)); + } + + @override + int get hashCode => Object.hash( + runtimeType, const DeepCollectionEquality().hash(_categories)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List categories) loaded, + required TResult Function(String message) error, + }) { + return loaded(categories); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List categories)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(categories); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List categories)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(categories); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements CategoryState { + const factory _Loaded(final List categories) = _$LoadedImpl; + + List get categories; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$CategoryStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'CategoryState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List categories) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List categories)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List categories)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements CategoryState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_event.dart new file mode 100644 index 0000000..f6f2c3a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_event.dart @@ -0,0 +1,7 @@ +part of 'category_bloc.dart'; + +@freezed +class CategoryEvent with _$CategoryEvent { + const factory CategoryEvent.started() = _Started; + const factory CategoryEvent.getCategories() = _GetCategories; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_state.dart new file mode 100644 index 0000000..f39b1d8 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/category/category_state.dart @@ -0,0 +1,9 @@ +part of 'category_bloc.dart'; + +@freezed +class CategoryState with _$CategoryState { + const factory CategoryState.initial() = _Initial; + const factory CategoryState.loading() = _Loading; + const factory CategoryState.loaded(List categories) = _Loaded; + const factory CategoryState.error(final String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.dart new file mode 100644 index 0000000..5612f27 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.dart @@ -0,0 +1,133 @@ +import 'package:bloc/bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/discount_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/models/discount_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import '../../models/product_quantity.dart'; + +part 'checkout_event.dart'; +part 'checkout_state.dart'; +part 'checkout_bloc.freezed.dart'; + +class CheckoutBloc extends Bloc { + CheckoutBloc() : super(const _Loaded([], null, 0, '', '', 0, '')) { + on<_AddItem>((event, emit) { + final currentState = state as _Loaded; + if (currentState.products + .any((element) => element.product.id == event.product.id)) { + final index = currentState.products + .indexWhere((element) => element.product.id == event.product.id); + final item = currentState.products[index]; + final newItem = item.copyWith(quantity: item.quantity + 1); + final newItems = + currentState.products.map((e) => e == item ? newItem : e).toList(); + emit(_Loaded( + newItems, + currentState.discount, + currentState.addressId, + currentState.paymentMethod, + currentState.shippingService, + currentState.shippingCost, + currentState.shippingService)); + } else { + final newItem = ProductQuantity(product: event.product, quantity: 1); + final newItems = [...currentState.products, newItem]; + emit(_Loaded( + newItems, + currentState.discount, + currentState.addressId, + currentState.paymentMethod, + currentState.shippingService, + currentState.shippingCost, + currentState.shippingService)); + } + }); + + on<_RemoveItem>((event, emit) { + final currentState = state as _Loaded; + if (currentState.products + .any((element) => element.product.id == event.product.id)) { + final index = currentState.products + .indexWhere((element) => element.product.id == event.product.id); + final item = currentState.products[index]; + //if quantity is 1, remove the item + if (item.quantity == 1) { + final newItems = currentState.products + .where((element) => element.product.id != event.product.id) + .toList(); + emit(_Loaded( + newItems, + currentState.discount, + currentState.addressId, + currentState.paymentMethod, + currentState.shippingService, + currentState.shippingCost, + currentState.shippingService)); + } else { + final newItem = item.copyWith(quantity: item.quantity - 1); + final newItems = currentState.products + .map((e) => e == item ? newItem : e) + .toList(); + emit(_Loaded( + newItems, + currentState.discount, + currentState.addressId, + currentState.paymentMethod, + currentState.shippingService, + currentState.shippingCost, + currentState.shippingService)); + } + } + }); + + on<_AddAddressId>((event, emit) { + final currentState = state as _Loaded; + emit(_Loaded( + currentState.products, + currentState.discount, + event.addressId, + currentState.paymentMethod, + currentState.shippingService, + currentState.shippingCost, + currentState.shippingService)); + }); + + on<_AddPaymentMethod>((event, emit) { + final currentState = state as _Loaded; + emit(_Loaded( + currentState.products, + currentState.discount, + currentState.addressId, + 'bank_transfer', + currentState.shippingService, + currentState.shippingCost, + event.paymentMethod)); + }); + + on<_AddShippingService>((event, emit) { + final currentState = state as _Loaded; + emit(_Loaded( + currentState.products, + currentState.discount, + currentState.addressId, + currentState.paymentMethod, + event.shippingService, + event.shippingCost, + currentState.paymentMethod)); + }); + on<_AddDiscount>((event, emit) { + var currentState = state as _Loaded; + emit(_Loaded(currentState.products, event.discount, 0, '', '', 0, '')); + }); + + on<_RemoveDiscount>((event, emit) { + var currentState = state as _Loaded; + emit(_Loaded(currentState.products, null, 0, '', '', 0, '')); + }); + + on<_Started>((event, emit) { + emit(const _Loaded([], null, 0, '', '', 0, '')); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.freezed.dart new file mode 100644 index 0000000..7c4042d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.freezed.dart @@ -0,0 +1,2256 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'checkout_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$CheckoutEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + required TResult Function(int addressId) addAddressId, + required TResult Function(String paymentMethod) addPaymentMethod, + required TResult Function(String shippingService, int shippingCost) + addShippingService, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + TResult? Function(int addressId)? addAddressId, + TResult? Function(String paymentMethod)? addPaymentMethod, + TResult? Function(String shippingService, int shippingCost)? + addShippingService, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + TResult Function(int addressId)? addAddressId, + TResult Function(String paymentMethod)? addPaymentMethod, + TResult Function(String shippingService, int shippingCost)? + addShippingService, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + required TResult Function(_AddAddressId value) addAddressId, + required TResult Function(_AddPaymentMethod value) addPaymentMethod, + required TResult Function(_AddShippingService value) addShippingService, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + TResult? Function(_AddAddressId value)? addAddressId, + TResult? Function(_AddPaymentMethod value)? addPaymentMethod, + TResult? Function(_AddShippingService value)? addShippingService, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + TResult Function(_AddAddressId value)? addAddressId, + TResult Function(_AddPaymentMethod value)? addPaymentMethod, + TResult Function(_AddShippingService value)? addShippingService, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CheckoutEventCopyWith<$Res> { + factory $CheckoutEventCopyWith( + CheckoutEvent value, $Res Function(CheckoutEvent) then) = + _$CheckoutEventCopyWithImpl<$Res, CheckoutEvent>; +} + +/// @nodoc +class _$CheckoutEventCopyWithImpl<$Res, $Val extends CheckoutEvent> + implements $CheckoutEventCopyWith<$Res> { + _$CheckoutEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$CheckoutEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'CheckoutEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + required TResult Function(int addressId) addAddressId, + required TResult Function(String paymentMethod) addPaymentMethod, + required TResult Function(String shippingService, int shippingCost) + addShippingService, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + TResult? Function(int addressId)? addAddressId, + TResult? Function(String paymentMethod)? addPaymentMethod, + TResult? Function(String shippingService, int shippingCost)? + addShippingService, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + TResult Function(int addressId)? addAddressId, + TResult Function(String paymentMethod)? addPaymentMethod, + TResult Function(String shippingService, int shippingCost)? + addShippingService, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + required TResult Function(_AddAddressId value) addAddressId, + required TResult Function(_AddPaymentMethod value) addPaymentMethod, + required TResult Function(_AddShippingService value) addShippingService, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + TResult? Function(_AddAddressId value)? addAddressId, + TResult? Function(_AddPaymentMethod value)? addPaymentMethod, + TResult? Function(_AddShippingService value)? addShippingService, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + TResult Function(_AddAddressId value)? addAddressId, + TResult Function(_AddPaymentMethod value)? addPaymentMethod, + TResult Function(_AddShippingService value)? addShippingService, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements CheckoutEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$AddItemImplCopyWith<$Res> { + factory _$$AddItemImplCopyWith( + _$AddItemImpl value, $Res Function(_$AddItemImpl) then) = + __$$AddItemImplCopyWithImpl<$Res>; + @useResult + $Res call({Product product}); +} + +/// @nodoc +class __$$AddItemImplCopyWithImpl<$Res> + extends _$CheckoutEventCopyWithImpl<$Res, _$AddItemImpl> + implements _$$AddItemImplCopyWith<$Res> { + __$$AddItemImplCopyWithImpl( + _$AddItemImpl _value, $Res Function(_$AddItemImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? product = null, + }) { + return _then(_$AddItemImpl( + null == product + ? _value.product + : product // ignore: cast_nullable_to_non_nullable + as Product, + )); + } +} + +/// @nodoc + +class _$AddItemImpl implements _AddItem { + const _$AddItemImpl(this.product); + + @override + final Product product; + + @override + String toString() { + return 'CheckoutEvent.addItem(product: $product)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AddItemImpl && + (identical(other.product, product) || other.product == product)); + } + + @override + int get hashCode => Object.hash(runtimeType, product); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AddItemImplCopyWith<_$AddItemImpl> get copyWith => + __$$AddItemImplCopyWithImpl<_$AddItemImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + required TResult Function(int addressId) addAddressId, + required TResult Function(String paymentMethod) addPaymentMethod, + required TResult Function(String shippingService, int shippingCost) + addShippingService, + }) { + return addItem(product); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + TResult? Function(int addressId)? addAddressId, + TResult? Function(String paymentMethod)? addPaymentMethod, + TResult? Function(String shippingService, int shippingCost)? + addShippingService, + }) { + return addItem?.call(product); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + TResult Function(int addressId)? addAddressId, + TResult Function(String paymentMethod)? addPaymentMethod, + TResult Function(String shippingService, int shippingCost)? + addShippingService, + required TResult orElse(), + }) { + if (addItem != null) { + return addItem(product); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + required TResult Function(_AddAddressId value) addAddressId, + required TResult Function(_AddPaymentMethod value) addPaymentMethod, + required TResult Function(_AddShippingService value) addShippingService, + }) { + return addItem(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + TResult? Function(_AddAddressId value)? addAddressId, + TResult? Function(_AddPaymentMethod value)? addPaymentMethod, + TResult? Function(_AddShippingService value)? addShippingService, + }) { + return addItem?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + TResult Function(_AddAddressId value)? addAddressId, + TResult Function(_AddPaymentMethod value)? addPaymentMethod, + TResult Function(_AddShippingService value)? addShippingService, + required TResult orElse(), + }) { + if (addItem != null) { + return addItem(this); + } + return orElse(); + } +} + +abstract class _AddItem implements CheckoutEvent { + const factory _AddItem(final Product product) = _$AddItemImpl; + + Product get product; + @JsonKey(ignore: true) + _$$AddItemImplCopyWith<_$AddItemImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$RemoveItemImplCopyWith<$Res> { + factory _$$RemoveItemImplCopyWith( + _$RemoveItemImpl value, $Res Function(_$RemoveItemImpl) then) = + __$$RemoveItemImplCopyWithImpl<$Res>; + @useResult + $Res call({Product product}); +} + +/// @nodoc +class __$$RemoveItemImplCopyWithImpl<$Res> + extends _$CheckoutEventCopyWithImpl<$Res, _$RemoveItemImpl> + implements _$$RemoveItemImplCopyWith<$Res> { + __$$RemoveItemImplCopyWithImpl( + _$RemoveItemImpl _value, $Res Function(_$RemoveItemImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? product = null, + }) { + return _then(_$RemoveItemImpl( + null == product + ? _value.product + : product // ignore: cast_nullable_to_non_nullable + as Product, + )); + } +} + +/// @nodoc + +class _$RemoveItemImpl implements _RemoveItem { + const _$RemoveItemImpl(this.product); + + @override + final Product product; + + @override + String toString() { + return 'CheckoutEvent.removeItem(product: $product)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$RemoveItemImpl && + (identical(other.product, product) || other.product == product)); + } + + @override + int get hashCode => Object.hash(runtimeType, product); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$RemoveItemImplCopyWith<_$RemoveItemImpl> get copyWith => + __$$RemoveItemImplCopyWithImpl<_$RemoveItemImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + required TResult Function(int addressId) addAddressId, + required TResult Function(String paymentMethod) addPaymentMethod, + required TResult Function(String shippingService, int shippingCost) + addShippingService, + }) { + return removeItem(product); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + TResult? Function(int addressId)? addAddressId, + TResult? Function(String paymentMethod)? addPaymentMethod, + TResult? Function(String shippingService, int shippingCost)? + addShippingService, + }) { + return removeItem?.call(product); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + TResult Function(int addressId)? addAddressId, + TResult Function(String paymentMethod)? addPaymentMethod, + TResult Function(String shippingService, int shippingCost)? + addShippingService, + required TResult orElse(), + }) { + if (removeItem != null) { + return removeItem(product); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + required TResult Function(_AddAddressId value) addAddressId, + required TResult Function(_AddPaymentMethod value) addPaymentMethod, + required TResult Function(_AddShippingService value) addShippingService, + }) { + return removeItem(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + TResult? Function(_AddAddressId value)? addAddressId, + TResult? Function(_AddPaymentMethod value)? addPaymentMethod, + TResult? Function(_AddShippingService value)? addShippingService, + }) { + return removeItem?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + TResult Function(_AddAddressId value)? addAddressId, + TResult Function(_AddPaymentMethod value)? addPaymentMethod, + TResult Function(_AddShippingService value)? addShippingService, + required TResult orElse(), + }) { + if (removeItem != null) { + return removeItem(this); + } + return orElse(); + } +} + +abstract class _RemoveItem implements CheckoutEvent { + const factory _RemoveItem(final Product product) = _$RemoveItemImpl; + + Product get product; + @JsonKey(ignore: true) + _$$RemoveItemImplCopyWith<_$RemoveItemImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$AddDiscountImplCopyWith<$Res> { + factory _$$AddDiscountImplCopyWith( + _$AddDiscountImpl value, $Res Function(_$AddDiscountImpl) then) = + __$$AddDiscountImplCopyWithImpl<$Res>; + @useResult + $Res call({Discount discount}); +} + +/// @nodoc +class __$$AddDiscountImplCopyWithImpl<$Res> + extends _$CheckoutEventCopyWithImpl<$Res, _$AddDiscountImpl> + implements _$$AddDiscountImplCopyWith<$Res> { + __$$AddDiscountImplCopyWithImpl( + _$AddDiscountImpl _value, $Res Function(_$AddDiscountImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? discount = null, + }) { + return _then(_$AddDiscountImpl( + null == discount + ? _value.discount + : discount // ignore: cast_nullable_to_non_nullable + as Discount, + )); + } +} + +/// @nodoc + +class _$AddDiscountImpl implements _AddDiscount { + const _$AddDiscountImpl(this.discount); + + @override + final Discount discount; + + @override + String toString() { + return 'CheckoutEvent.addDiscount(discount: $discount)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AddDiscountImpl && + (identical(other.discount, discount) || + other.discount == discount)); + } + + @override + int get hashCode => Object.hash(runtimeType, discount); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AddDiscountImplCopyWith<_$AddDiscountImpl> get copyWith => + __$$AddDiscountImplCopyWithImpl<_$AddDiscountImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + required TResult Function(int addressId) addAddressId, + required TResult Function(String paymentMethod) addPaymentMethod, + required TResult Function(String shippingService, int shippingCost) + addShippingService, + }) { + return addDiscount(discount); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + TResult? Function(int addressId)? addAddressId, + TResult? Function(String paymentMethod)? addPaymentMethod, + TResult? Function(String shippingService, int shippingCost)? + addShippingService, + }) { + return addDiscount?.call(discount); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + TResult Function(int addressId)? addAddressId, + TResult Function(String paymentMethod)? addPaymentMethod, + TResult Function(String shippingService, int shippingCost)? + addShippingService, + required TResult orElse(), + }) { + if (addDiscount != null) { + return addDiscount(discount); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + required TResult Function(_AddAddressId value) addAddressId, + required TResult Function(_AddPaymentMethod value) addPaymentMethod, + required TResult Function(_AddShippingService value) addShippingService, + }) { + return addDiscount(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + TResult? Function(_AddAddressId value)? addAddressId, + TResult? Function(_AddPaymentMethod value)? addPaymentMethod, + TResult? Function(_AddShippingService value)? addShippingService, + }) { + return addDiscount?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + TResult Function(_AddAddressId value)? addAddressId, + TResult Function(_AddPaymentMethod value)? addPaymentMethod, + TResult Function(_AddShippingService value)? addShippingService, + required TResult orElse(), + }) { + if (addDiscount != null) { + return addDiscount(this); + } + return orElse(); + } +} + +abstract class _AddDiscount implements CheckoutEvent { + const factory _AddDiscount(final Discount discount) = _$AddDiscountImpl; + + Discount get discount; + @JsonKey(ignore: true) + _$$AddDiscountImplCopyWith<_$AddDiscountImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$RemoveDiscountImplCopyWith<$Res> { + factory _$$RemoveDiscountImplCopyWith(_$RemoveDiscountImpl value, + $Res Function(_$RemoveDiscountImpl) then) = + __$$RemoveDiscountImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$RemoveDiscountImplCopyWithImpl<$Res> + extends _$CheckoutEventCopyWithImpl<$Res, _$RemoveDiscountImpl> + implements _$$RemoveDiscountImplCopyWith<$Res> { + __$$RemoveDiscountImplCopyWithImpl( + _$RemoveDiscountImpl _value, $Res Function(_$RemoveDiscountImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$RemoveDiscountImpl implements _RemoveDiscount { + const _$RemoveDiscountImpl(); + + @override + String toString() { + return 'CheckoutEvent.removeDiscount()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$RemoveDiscountImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + required TResult Function(int addressId) addAddressId, + required TResult Function(String paymentMethod) addPaymentMethod, + required TResult Function(String shippingService, int shippingCost) + addShippingService, + }) { + return removeDiscount(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + TResult? Function(int addressId)? addAddressId, + TResult? Function(String paymentMethod)? addPaymentMethod, + TResult? Function(String shippingService, int shippingCost)? + addShippingService, + }) { + return removeDiscount?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + TResult Function(int addressId)? addAddressId, + TResult Function(String paymentMethod)? addPaymentMethod, + TResult Function(String shippingService, int shippingCost)? + addShippingService, + required TResult orElse(), + }) { + if (removeDiscount != null) { + return removeDiscount(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + required TResult Function(_AddAddressId value) addAddressId, + required TResult Function(_AddPaymentMethod value) addPaymentMethod, + required TResult Function(_AddShippingService value) addShippingService, + }) { + return removeDiscount(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + TResult? Function(_AddAddressId value)? addAddressId, + TResult? Function(_AddPaymentMethod value)? addPaymentMethod, + TResult? Function(_AddShippingService value)? addShippingService, + }) { + return removeDiscount?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + TResult Function(_AddAddressId value)? addAddressId, + TResult Function(_AddPaymentMethod value)? addPaymentMethod, + TResult Function(_AddShippingService value)? addShippingService, + required TResult orElse(), + }) { + if (removeDiscount != null) { + return removeDiscount(this); + } + return orElse(); + } +} + +abstract class _RemoveDiscount implements CheckoutEvent { + const factory _RemoveDiscount() = _$RemoveDiscountImpl; +} + +/// @nodoc +abstract class _$$AddAddressIdImplCopyWith<$Res> { + factory _$$AddAddressIdImplCopyWith( + _$AddAddressIdImpl value, $Res Function(_$AddAddressIdImpl) then) = + __$$AddAddressIdImplCopyWithImpl<$Res>; + @useResult + $Res call({int addressId}); +} + +/// @nodoc +class __$$AddAddressIdImplCopyWithImpl<$Res> + extends _$CheckoutEventCopyWithImpl<$Res, _$AddAddressIdImpl> + implements _$$AddAddressIdImplCopyWith<$Res> { + __$$AddAddressIdImplCopyWithImpl( + _$AddAddressIdImpl _value, $Res Function(_$AddAddressIdImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? addressId = null, + }) { + return _then(_$AddAddressIdImpl( + null == addressId + ? _value.addressId + : addressId // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$AddAddressIdImpl implements _AddAddressId { + const _$AddAddressIdImpl(this.addressId); + + @override + final int addressId; + + @override + String toString() { + return 'CheckoutEvent.addAddressId(addressId: $addressId)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AddAddressIdImpl && + (identical(other.addressId, addressId) || + other.addressId == addressId)); + } + + @override + int get hashCode => Object.hash(runtimeType, addressId); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AddAddressIdImplCopyWith<_$AddAddressIdImpl> get copyWith => + __$$AddAddressIdImplCopyWithImpl<_$AddAddressIdImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + required TResult Function(int addressId) addAddressId, + required TResult Function(String paymentMethod) addPaymentMethod, + required TResult Function(String shippingService, int shippingCost) + addShippingService, + }) { + return addAddressId(addressId); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + TResult? Function(int addressId)? addAddressId, + TResult? Function(String paymentMethod)? addPaymentMethod, + TResult? Function(String shippingService, int shippingCost)? + addShippingService, + }) { + return addAddressId?.call(addressId); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + TResult Function(int addressId)? addAddressId, + TResult Function(String paymentMethod)? addPaymentMethod, + TResult Function(String shippingService, int shippingCost)? + addShippingService, + required TResult orElse(), + }) { + if (addAddressId != null) { + return addAddressId(addressId); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + required TResult Function(_AddAddressId value) addAddressId, + required TResult Function(_AddPaymentMethod value) addPaymentMethod, + required TResult Function(_AddShippingService value) addShippingService, + }) { + return addAddressId(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + TResult? Function(_AddAddressId value)? addAddressId, + TResult? Function(_AddPaymentMethod value)? addPaymentMethod, + TResult? Function(_AddShippingService value)? addShippingService, + }) { + return addAddressId?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + TResult Function(_AddAddressId value)? addAddressId, + TResult Function(_AddPaymentMethod value)? addPaymentMethod, + TResult Function(_AddShippingService value)? addShippingService, + required TResult orElse(), + }) { + if (addAddressId != null) { + return addAddressId(this); + } + return orElse(); + } +} + +abstract class _AddAddressId implements CheckoutEvent { + const factory _AddAddressId(final int addressId) = _$AddAddressIdImpl; + + int get addressId; + @JsonKey(ignore: true) + _$$AddAddressIdImplCopyWith<_$AddAddressIdImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$AddPaymentMethodImplCopyWith<$Res> { + factory _$$AddPaymentMethodImplCopyWith(_$AddPaymentMethodImpl value, + $Res Function(_$AddPaymentMethodImpl) then) = + __$$AddPaymentMethodImplCopyWithImpl<$Res>; + @useResult + $Res call({String paymentMethod}); +} + +/// @nodoc +class __$$AddPaymentMethodImplCopyWithImpl<$Res> + extends _$CheckoutEventCopyWithImpl<$Res, _$AddPaymentMethodImpl> + implements _$$AddPaymentMethodImplCopyWith<$Res> { + __$$AddPaymentMethodImplCopyWithImpl(_$AddPaymentMethodImpl _value, + $Res Function(_$AddPaymentMethodImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? paymentMethod = null, + }) { + return _then(_$AddPaymentMethodImpl( + null == paymentMethod + ? _value.paymentMethod + : paymentMethod // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$AddPaymentMethodImpl implements _AddPaymentMethod { + const _$AddPaymentMethodImpl(this.paymentMethod); + + @override + final String paymentMethod; + + @override + String toString() { + return 'CheckoutEvent.addPaymentMethod(paymentMethod: $paymentMethod)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AddPaymentMethodImpl && + (identical(other.paymentMethod, paymentMethod) || + other.paymentMethod == paymentMethod)); + } + + @override + int get hashCode => Object.hash(runtimeType, paymentMethod); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AddPaymentMethodImplCopyWith<_$AddPaymentMethodImpl> get copyWith => + __$$AddPaymentMethodImplCopyWithImpl<_$AddPaymentMethodImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + required TResult Function(int addressId) addAddressId, + required TResult Function(String paymentMethod) addPaymentMethod, + required TResult Function(String shippingService, int shippingCost) + addShippingService, + }) { + return addPaymentMethod(paymentMethod); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + TResult? Function(int addressId)? addAddressId, + TResult? Function(String paymentMethod)? addPaymentMethod, + TResult? Function(String shippingService, int shippingCost)? + addShippingService, + }) { + return addPaymentMethod?.call(paymentMethod); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + TResult Function(int addressId)? addAddressId, + TResult Function(String paymentMethod)? addPaymentMethod, + TResult Function(String shippingService, int shippingCost)? + addShippingService, + required TResult orElse(), + }) { + if (addPaymentMethod != null) { + return addPaymentMethod(paymentMethod); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + required TResult Function(_AddAddressId value) addAddressId, + required TResult Function(_AddPaymentMethod value) addPaymentMethod, + required TResult Function(_AddShippingService value) addShippingService, + }) { + return addPaymentMethod(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + TResult? Function(_AddAddressId value)? addAddressId, + TResult? Function(_AddPaymentMethod value)? addPaymentMethod, + TResult? Function(_AddShippingService value)? addShippingService, + }) { + return addPaymentMethod?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + TResult Function(_AddAddressId value)? addAddressId, + TResult Function(_AddPaymentMethod value)? addPaymentMethod, + TResult Function(_AddShippingService value)? addShippingService, + required TResult orElse(), + }) { + if (addPaymentMethod != null) { + return addPaymentMethod(this); + } + return orElse(); + } +} + +abstract class _AddPaymentMethod implements CheckoutEvent { + const factory _AddPaymentMethod(final String paymentMethod) = + _$AddPaymentMethodImpl; + + String get paymentMethod; + @JsonKey(ignore: true) + _$$AddPaymentMethodImplCopyWith<_$AddPaymentMethodImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$AddShippingServiceImplCopyWith<$Res> { + factory _$$AddShippingServiceImplCopyWith(_$AddShippingServiceImpl value, + $Res Function(_$AddShippingServiceImpl) then) = + __$$AddShippingServiceImplCopyWithImpl<$Res>; + @useResult + $Res call({String shippingService, int shippingCost}); +} + +/// @nodoc +class __$$AddShippingServiceImplCopyWithImpl<$Res> + extends _$CheckoutEventCopyWithImpl<$Res, _$AddShippingServiceImpl> + implements _$$AddShippingServiceImplCopyWith<$Res> { + __$$AddShippingServiceImplCopyWithImpl(_$AddShippingServiceImpl _value, + $Res Function(_$AddShippingServiceImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? shippingService = null, + Object? shippingCost = null, + }) { + return _then(_$AddShippingServiceImpl( + null == shippingService + ? _value.shippingService + : shippingService // ignore: cast_nullable_to_non_nullable + as String, + null == shippingCost + ? _value.shippingCost + : shippingCost // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$AddShippingServiceImpl implements _AddShippingService { + const _$AddShippingServiceImpl(this.shippingService, this.shippingCost); + + @override + final String shippingService; + @override + final int shippingCost; + + @override + String toString() { + return 'CheckoutEvent.addShippingService(shippingService: $shippingService, shippingCost: $shippingCost)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AddShippingServiceImpl && + (identical(other.shippingService, shippingService) || + other.shippingService == shippingService) && + (identical(other.shippingCost, shippingCost) || + other.shippingCost == shippingCost)); + } + + @override + int get hashCode => Object.hash(runtimeType, shippingService, shippingCost); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AddShippingServiceImplCopyWith<_$AddShippingServiceImpl> get copyWith => + __$$AddShippingServiceImplCopyWithImpl<_$AddShippingServiceImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + required TResult Function(int addressId) addAddressId, + required TResult Function(String paymentMethod) addPaymentMethod, + required TResult Function(String shippingService, int shippingCost) + addShippingService, + }) { + return addShippingService(shippingService, shippingCost); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + TResult? Function(int addressId)? addAddressId, + TResult? Function(String paymentMethod)? addPaymentMethod, + TResult? Function(String shippingService, int shippingCost)? + addShippingService, + }) { + return addShippingService?.call(shippingService, shippingCost); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + TResult Function(int addressId)? addAddressId, + TResult Function(String paymentMethod)? addPaymentMethod, + TResult Function(String shippingService, int shippingCost)? + addShippingService, + required TResult orElse(), + }) { + if (addShippingService != null) { + return addShippingService(shippingService, shippingCost); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + required TResult Function(_AddAddressId value) addAddressId, + required TResult Function(_AddPaymentMethod value) addPaymentMethod, + required TResult Function(_AddShippingService value) addShippingService, + }) { + return addShippingService(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + TResult? Function(_AddAddressId value)? addAddressId, + TResult? Function(_AddPaymentMethod value)? addPaymentMethod, + TResult? Function(_AddShippingService value)? addShippingService, + }) { + return addShippingService?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + TResult Function(_AddAddressId value)? addAddressId, + TResult Function(_AddPaymentMethod value)? addPaymentMethod, + TResult Function(_AddShippingService value)? addShippingService, + required TResult orElse(), + }) { + if (addShippingService != null) { + return addShippingService(this); + } + return orElse(); + } +} + +abstract class _AddShippingService implements CheckoutEvent { + const factory _AddShippingService( + final String shippingService, final int shippingCost) = + _$AddShippingServiceImpl; + + String get shippingService; + int get shippingCost; + @JsonKey(ignore: true) + _$$AddShippingServiceImplCopyWith<_$AddShippingServiceImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$CheckoutState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName) + loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName)? + loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName)? + loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CheckoutStateCopyWith<$Res> { + factory $CheckoutStateCopyWith( + CheckoutState value, $Res Function(CheckoutState) then) = + _$CheckoutStateCopyWithImpl<$Res, CheckoutState>; +} + +/// @nodoc +class _$CheckoutStateCopyWithImpl<$Res, $Val extends CheckoutState> + implements $CheckoutStateCopyWith<$Res> { + _$CheckoutStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$CheckoutStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'CheckoutState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName) + loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName)? + loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName)? + loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements CheckoutState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$CheckoutStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'CheckoutState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName) + loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName)? + loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName)? + loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements CheckoutState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call( + {List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$CheckoutStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? products = null, + Object? discount = freezed, + Object? addressId = null, + Object? paymentMethod = null, + Object? shippingService = null, + Object? shippingCost = null, + Object? paymentVaName = null, + }) { + return _then(_$LoadedImpl( + null == products + ? _value._products + : products // ignore: cast_nullable_to_non_nullable + as List, + freezed == discount + ? _value.discount + : discount // ignore: cast_nullable_to_non_nullable + as Discount?, + null == addressId + ? _value.addressId + : addressId // ignore: cast_nullable_to_non_nullable + as int, + null == paymentMethod + ? _value.paymentMethod + : paymentMethod // ignore: cast_nullable_to_non_nullable + as String, + null == shippingService + ? _value.shippingService + : shippingService // ignore: cast_nullable_to_non_nullable + as String, + null == shippingCost + ? _value.shippingCost + : shippingCost // ignore: cast_nullable_to_non_nullable + as int, + null == paymentVaName + ? _value.paymentVaName + : paymentVaName // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl( + final List products, + this.discount, + this.addressId, + this.paymentMethod, + this.shippingService, + this.shippingCost, + this.paymentVaName) + : _products = products; + + final List _products; + @override + List get products { + if (_products is EqualUnmodifiableListView) return _products; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_products); + } + + @override + final Discount? discount; + @override + final int addressId; + @override + final String paymentMethod; + @override + final String shippingService; + @override + final int shippingCost; + @override + final String paymentVaName; + + @override + String toString() { + return 'CheckoutState.loaded(products: $products, discount: $discount, addressId: $addressId, paymentMethod: $paymentMethod, shippingService: $shippingService, shippingCost: $shippingCost, paymentVaName: $paymentVaName)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality().equals(other._products, _products) && + (identical(other.discount, discount) || + other.discount == discount) && + (identical(other.addressId, addressId) || + other.addressId == addressId) && + (identical(other.paymentMethod, paymentMethod) || + other.paymentMethod == paymentMethod) && + (identical(other.shippingService, shippingService) || + other.shippingService == shippingService) && + (identical(other.shippingCost, shippingCost) || + other.shippingCost == shippingCost) && + (identical(other.paymentVaName, paymentVaName) || + other.paymentVaName == paymentVaName)); + } + + @override + int get hashCode => Object.hash( + runtimeType, + const DeepCollectionEquality().hash(_products), + discount, + addressId, + paymentMethod, + shippingService, + shippingCost, + paymentVaName); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName) + loaded, + required TResult Function(String message) error, + }) { + return loaded(products, discount, addressId, paymentMethod, shippingService, + shippingCost, paymentVaName); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName)? + loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(products, discount, addressId, paymentMethod, + shippingService, shippingCost, paymentVaName); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName)? + loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(products, discount, addressId, paymentMethod, + shippingService, shippingCost, paymentVaName); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements CheckoutState { + const factory _Loaded( + final List products, + final Discount? discount, + final int addressId, + final String paymentMethod, + final String shippingService, + final int shippingCost, + final String paymentVaName) = _$LoadedImpl; + + List get products; + Discount? get discount; + int get addressId; + String get paymentMethod; + String get shippingService; + int get shippingCost; + String get paymentVaName; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$CheckoutStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'CheckoutState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName) + loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName)? + loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName)? + loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements CheckoutState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_event.dart new file mode 100644 index 0000000..8b68eed --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_event.dart @@ -0,0 +1,15 @@ +part of 'checkout_bloc.dart'; + +@freezed +class CheckoutEvent with _$CheckoutEvent { + const factory CheckoutEvent.started() = _Started; + const factory CheckoutEvent.addItem(Product product) = _AddItem; + const factory CheckoutEvent.removeItem(Product product) = _RemoveItem; + const factory CheckoutEvent.addDiscount(Discount discount) = _AddDiscount; + const factory CheckoutEvent.removeDiscount() = _RemoveDiscount; + const factory CheckoutEvent.addAddressId(int addressId) = _AddAddressId; + const factory CheckoutEvent.addPaymentMethod(String paymentMethod) = + _AddPaymentMethod; + const factory CheckoutEvent.addShippingService( + String shippingService, int shippingCost) = _AddShippingService; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_state.dart new file mode 100644 index 0000000..b500a5a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/checkout/checkout_state.dart @@ -0,0 +1,17 @@ +part of 'checkout_bloc.dart'; + +@freezed +class CheckoutState with _$CheckoutState { + const factory CheckoutState.initial() = _Initial; + const factory CheckoutState.loading() = _Loading; + const factory CheckoutState.loaded( + List products, + Discount? discount, + int addressId, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName, + ) = _Loaded; + const factory CheckoutState.error(final String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_bloc.dart new file mode 100644 index 0000000..cd6187d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_bloc.dart @@ -0,0 +1,28 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/order_detail_response_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/detail_product_response_model.dart'; + +part 'detail_product_bloc.freezed.dart'; +part 'detail_product_event.dart'; +part 'detail_product_state.dart'; + +class DetailProductBloc extends Bloc { + final ProductRemoteDatasource productRemoteDatasource; + DetailProductBloc( + this.productRemoteDatasource, + ) : super(const _Initial()) { + on<_DetailProduct>((event, emit) async { + emit(const _Loading()); + final response = + await productRemoteDatasource.getDetailProductByid(event.productId); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r.detailProduct!)), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_bloc.freezed.dart new file mode 100644 index 0000000..0a7ae56 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_bloc.freezed.dart @@ -0,0 +1,1061 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'detail_product_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$DetailProductEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) getDetailProduct, + required TResult Function(int productId) detailProduct, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? getDetailProduct, + TResult? Function(int productId)? detailProduct, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? getDetailProduct, + TResult Function(int productId)? detailProduct, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetDetailProduct value) getDetailProduct, + required TResult Function(_DetailProduct value) detailProduct, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetDetailProduct value)? getDetailProduct, + TResult? Function(_DetailProduct value)? detailProduct, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetDetailProduct value)? getDetailProduct, + TResult Function(_DetailProduct value)? detailProduct, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $DetailProductEventCopyWith<$Res> { + factory $DetailProductEventCopyWith( + DetailProductEvent value, $Res Function(DetailProductEvent) then) = + _$DetailProductEventCopyWithImpl<$Res, DetailProductEvent>; +} + +/// @nodoc +class _$DetailProductEventCopyWithImpl<$Res, $Val extends DetailProductEvent> + implements $DetailProductEventCopyWith<$Res> { + _$DetailProductEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$DetailProductEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'DetailProductEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) getDetailProduct, + required TResult Function(int productId) detailProduct, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? getDetailProduct, + TResult? Function(int productId)? detailProduct, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? getDetailProduct, + TResult Function(int productId)? detailProduct, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetDetailProduct value) getDetailProduct, + required TResult Function(_DetailProduct value) detailProduct, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetDetailProduct value)? getDetailProduct, + TResult? Function(_DetailProduct value)? detailProduct, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetDetailProduct value)? getDetailProduct, + TResult Function(_DetailProduct value)? detailProduct, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements DetailProductEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetDetailProductImplCopyWith<$Res> { + factory _$$GetDetailProductImplCopyWith(_$GetDetailProductImpl value, + $Res Function(_$GetDetailProductImpl) then) = + __$$GetDetailProductImplCopyWithImpl<$Res>; + @useResult + $Res call({Product product}); +} + +/// @nodoc +class __$$GetDetailProductImplCopyWithImpl<$Res> + extends _$DetailProductEventCopyWithImpl<$Res, _$GetDetailProductImpl> + implements _$$GetDetailProductImplCopyWith<$Res> { + __$$GetDetailProductImplCopyWithImpl(_$GetDetailProductImpl _value, + $Res Function(_$GetDetailProductImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? product = null, + }) { + return _then(_$GetDetailProductImpl( + null == product + ? _value.product + : product // ignore: cast_nullable_to_non_nullable + as Product, + )); + } +} + +/// @nodoc + +class _$GetDetailProductImpl implements _GetDetailProduct { + const _$GetDetailProductImpl(this.product); + + @override + final Product product; + + @override + String toString() { + return 'DetailProductEvent.getDetailProduct(product: $product)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GetDetailProductImpl && + (identical(other.product, product) || other.product == product)); + } + + @override + int get hashCode => Object.hash(runtimeType, product); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$GetDetailProductImplCopyWith<_$GetDetailProductImpl> get copyWith => + __$$GetDetailProductImplCopyWithImpl<_$GetDetailProductImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) getDetailProduct, + required TResult Function(int productId) detailProduct, + }) { + return getDetailProduct(product); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? getDetailProduct, + TResult? Function(int productId)? detailProduct, + }) { + return getDetailProduct?.call(product); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? getDetailProduct, + TResult Function(int productId)? detailProduct, + required TResult orElse(), + }) { + if (getDetailProduct != null) { + return getDetailProduct(product); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetDetailProduct value) getDetailProduct, + required TResult Function(_DetailProduct value) detailProduct, + }) { + return getDetailProduct(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetDetailProduct value)? getDetailProduct, + TResult? Function(_DetailProduct value)? detailProduct, + }) { + return getDetailProduct?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetDetailProduct value)? getDetailProduct, + TResult Function(_DetailProduct value)? detailProduct, + required TResult orElse(), + }) { + if (getDetailProduct != null) { + return getDetailProduct(this); + } + return orElse(); + } +} + +abstract class _GetDetailProduct implements DetailProductEvent { + const factory _GetDetailProduct(final Product product) = + _$GetDetailProductImpl; + + Product get product; + @JsonKey(ignore: true) + _$$GetDetailProductImplCopyWith<_$GetDetailProductImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$DetailProductImplCopyWith<$Res> { + factory _$$DetailProductImplCopyWith( + _$DetailProductImpl value, $Res Function(_$DetailProductImpl) then) = + __$$DetailProductImplCopyWithImpl<$Res>; + @useResult + $Res call({int productId}); +} + +/// @nodoc +class __$$DetailProductImplCopyWithImpl<$Res> + extends _$DetailProductEventCopyWithImpl<$Res, _$DetailProductImpl> + implements _$$DetailProductImplCopyWith<$Res> { + __$$DetailProductImplCopyWithImpl( + _$DetailProductImpl _value, $Res Function(_$DetailProductImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? productId = null, + }) { + return _then(_$DetailProductImpl( + null == productId + ? _value.productId + : productId // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$DetailProductImpl implements _DetailProduct { + const _$DetailProductImpl(this.productId); + + @override + final int productId; + + @override + String toString() { + return 'DetailProductEvent.detailProduct(productId: $productId)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$DetailProductImpl && + (identical(other.productId, productId) || + other.productId == productId)); + } + + @override + int get hashCode => Object.hash(runtimeType, productId); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$DetailProductImplCopyWith<_$DetailProductImpl> get copyWith => + __$$DetailProductImplCopyWithImpl<_$DetailProductImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) getDetailProduct, + required TResult Function(int productId) detailProduct, + }) { + return detailProduct(productId); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? getDetailProduct, + TResult? Function(int productId)? detailProduct, + }) { + return detailProduct?.call(productId); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? getDetailProduct, + TResult Function(int productId)? detailProduct, + required TResult orElse(), + }) { + if (detailProduct != null) { + return detailProduct(productId); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetDetailProduct value) getDetailProduct, + required TResult Function(_DetailProduct value) detailProduct, + }) { + return detailProduct(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetDetailProduct value)? getDetailProduct, + TResult? Function(_DetailProduct value)? detailProduct, + }) { + return detailProduct?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetDetailProduct value)? getDetailProduct, + TResult Function(_DetailProduct value)? detailProduct, + required TResult orElse(), + }) { + if (detailProduct != null) { + return detailProduct(this); + } + return orElse(); + } +} + +abstract class _DetailProduct implements DetailProductEvent { + const factory _DetailProduct(final int productId) = _$DetailProductImpl; + + int get productId; + @JsonKey(ignore: true) + _$$DetailProductImplCopyWith<_$DetailProductImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$DetailProductState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(DetailProduct detailProduct) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(DetailProduct detailProduct)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(DetailProduct detailProduct)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $DetailProductStateCopyWith<$Res> { + factory $DetailProductStateCopyWith( + DetailProductState value, $Res Function(DetailProductState) then) = + _$DetailProductStateCopyWithImpl<$Res, DetailProductState>; +} + +/// @nodoc +class _$DetailProductStateCopyWithImpl<$Res, $Val extends DetailProductState> + implements $DetailProductStateCopyWith<$Res> { + _$DetailProductStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$DetailProductStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'DetailProductState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(DetailProduct detailProduct) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(DetailProduct detailProduct)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(DetailProduct detailProduct)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements DetailProductState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$DetailProductStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'DetailProductState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(DetailProduct detailProduct) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(DetailProduct detailProduct)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(DetailProduct detailProduct)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements DetailProductState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({DetailProduct detailProduct}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$DetailProductStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? detailProduct = null, + }) { + return _then(_$LoadedImpl( + null == detailProduct + ? _value.detailProduct + : detailProduct // ignore: cast_nullable_to_non_nullable + as DetailProduct, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(this.detailProduct); + + @override + final DetailProduct detailProduct; + + @override + String toString() { + return 'DetailProductState.loaded(detailProduct: $detailProduct)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + (identical(other.detailProduct, detailProduct) || + other.detailProduct == detailProduct)); + } + + @override + int get hashCode => Object.hash(runtimeType, detailProduct); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(DetailProduct detailProduct) loaded, + required TResult Function(String message) error, + }) { + return loaded(detailProduct); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(DetailProduct detailProduct)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(detailProduct); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(DetailProduct detailProduct)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(detailProduct); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements DetailProductState { + const factory _Loaded(final DetailProduct detailProduct) = _$LoadedImpl; + + DetailProduct get detailProduct; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$DetailProductStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'DetailProductState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(DetailProduct detailProduct) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(DetailProduct detailProduct)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(DetailProduct detailProduct)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements DetailProductState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_event.dart new file mode 100644 index 0000000..38b395d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_event.dart @@ -0,0 +1,9 @@ +part of 'detail_product_bloc.dart'; + +@freezed +class DetailProductEvent with _$DetailProductEvent { + const factory DetailProductEvent.started() = _Started; + const factory DetailProductEvent.getDetailProduct(Product product) = _GetDetailProduct; + const factory DetailProductEvent.detailProduct(int productId) = + _DetailProduct; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_state.dart new file mode 100644 index 0000000..f0b32a6 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/detail_product/detail_product_state.dart @@ -0,0 +1,10 @@ +part of 'detail_product_bloc.dart'; + +@freezed +class DetailProductState with _$DetailProductState { + const factory DetailProductState.initial() = _Initial; + const factory DetailProductState.loading() = _Loading; + const factory DetailProductState.loaded(DetailProduct detailProduct) = + _Loaded; + const factory DetailProductState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_bloc.dart new file mode 100644 index 0000000..d50280d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_bloc.dart @@ -0,0 +1,41 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_remote_datasource.dart'; + +import '../../../../data/models/responses/product_response_model.dart'; + +part 'pestisida_bloc.freezed.dart'; +part 'pestisida_event.dart'; +part 'pestisida_state.dart'; + +class PestisidaBloc extends Bloc { + final ProductRemoteDatasource _productRemoteDatasource; + List products = []; + PestisidaBloc( + this._productRemoteDatasource, + ) : super(const _Initial()) { + on<_GetProductPestisida>((event, emit) async { + emit(const _Loading()); + final response = await _productRemoteDatasource.getProductByCategory(2); + response.fold((l) => emit(_Error(l)), (r) { + products = r.data ?? []; + emit(_Loaded(r.data!)); + }); + }); + on<_SearchProductPestisida>((event, emit) async { + emit(const PestisidaState.loading()); + final newProducts = products + .where((element) => + element.name!.toLowerCase().contains(event.query.toLowerCase())) + .toList(); + emit(PestisidaState.loaded(newProducts)); + }); + + on<_FetchAllPestisida>((event, emit) async { + emit(const PestisidaState.loading()); + emit(PestisidaState.loaded(products)); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_bloc.freezed.dart new file mode 100644 index 0000000..ca3aa00 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_bloc.freezed.dart @@ -0,0 +1,1180 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'pestisida_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$PestisidaEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductPestisida, + required TResult Function(String query) searchProductPestisida, + required TResult Function() fetchAllPestisida, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductPestisida, + TResult? Function(String query)? searchProductPestisida, + TResult? Function()? fetchAllPestisida, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductPestisida, + TResult Function(String query)? searchProductPestisida, + TResult Function()? fetchAllPestisida, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductPestisida value) getProductPestisida, + required TResult Function(_SearchProductPestisida value) + searchProductPestisida, + required TResult Function(_FetchAllPestisida value) fetchAllPestisida, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductPestisida value)? getProductPestisida, + TResult? Function(_SearchProductPestisida value)? searchProductPestisida, + TResult? Function(_FetchAllPestisida value)? fetchAllPestisida, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductPestisida value)? getProductPestisida, + TResult Function(_SearchProductPestisida value)? searchProductPestisida, + TResult Function(_FetchAllPestisida value)? fetchAllPestisida, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PestisidaEventCopyWith<$Res> { + factory $PestisidaEventCopyWith( + PestisidaEvent value, $Res Function(PestisidaEvent) then) = + _$PestisidaEventCopyWithImpl<$Res, PestisidaEvent>; +} + +/// @nodoc +class _$PestisidaEventCopyWithImpl<$Res, $Val extends PestisidaEvent> + implements $PestisidaEventCopyWith<$Res> { + _$PestisidaEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$PestisidaEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'PestisidaEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductPestisida, + required TResult Function(String query) searchProductPestisida, + required TResult Function() fetchAllPestisida, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductPestisida, + TResult? Function(String query)? searchProductPestisida, + TResult? Function()? fetchAllPestisida, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductPestisida, + TResult Function(String query)? searchProductPestisida, + TResult Function()? fetchAllPestisida, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductPestisida value) getProductPestisida, + required TResult Function(_SearchProductPestisida value) + searchProductPestisida, + required TResult Function(_FetchAllPestisida value) fetchAllPestisida, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductPestisida value)? getProductPestisida, + TResult? Function(_SearchProductPestisida value)? searchProductPestisida, + TResult? Function(_FetchAllPestisida value)? fetchAllPestisida, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductPestisida value)? getProductPestisida, + TResult Function(_SearchProductPestisida value)? searchProductPestisida, + TResult Function(_FetchAllPestisida value)? fetchAllPestisida, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements PestisidaEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetProductPestisidaImplCopyWith<$Res> { + factory _$$GetProductPestisidaImplCopyWith(_$GetProductPestisidaImpl value, + $Res Function(_$GetProductPestisidaImpl) then) = + __$$GetProductPestisidaImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$GetProductPestisidaImplCopyWithImpl<$Res> + extends _$PestisidaEventCopyWithImpl<$Res, _$GetProductPestisidaImpl> + implements _$$GetProductPestisidaImplCopyWith<$Res> { + __$$GetProductPestisidaImplCopyWithImpl(_$GetProductPestisidaImpl _value, + $Res Function(_$GetProductPestisidaImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$GetProductPestisidaImpl implements _GetProductPestisida { + const _$GetProductPestisidaImpl(); + + @override + String toString() { + return 'PestisidaEvent.getProductPestisida()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GetProductPestisidaImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductPestisida, + required TResult Function(String query) searchProductPestisida, + required TResult Function() fetchAllPestisida, + }) { + return getProductPestisida(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductPestisida, + TResult? Function(String query)? searchProductPestisida, + TResult? Function()? fetchAllPestisida, + }) { + return getProductPestisida?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductPestisida, + TResult Function(String query)? searchProductPestisida, + TResult Function()? fetchAllPestisida, + required TResult orElse(), + }) { + if (getProductPestisida != null) { + return getProductPestisida(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductPestisida value) getProductPestisida, + required TResult Function(_SearchProductPestisida value) + searchProductPestisida, + required TResult Function(_FetchAllPestisida value) fetchAllPestisida, + }) { + return getProductPestisida(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductPestisida value)? getProductPestisida, + TResult? Function(_SearchProductPestisida value)? searchProductPestisida, + TResult? Function(_FetchAllPestisida value)? fetchAllPestisida, + }) { + return getProductPestisida?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductPestisida value)? getProductPestisida, + TResult Function(_SearchProductPestisida value)? searchProductPestisida, + TResult Function(_FetchAllPestisida value)? fetchAllPestisida, + required TResult orElse(), + }) { + if (getProductPestisida != null) { + return getProductPestisida(this); + } + return orElse(); + } +} + +abstract class _GetProductPestisida implements PestisidaEvent { + const factory _GetProductPestisida() = _$GetProductPestisidaImpl; +} + +/// @nodoc +abstract class _$$SearchProductPestisidaImplCopyWith<$Res> { + factory _$$SearchProductPestisidaImplCopyWith( + _$SearchProductPestisidaImpl value, + $Res Function(_$SearchProductPestisidaImpl) then) = + __$$SearchProductPestisidaImplCopyWithImpl<$Res>; + @useResult + $Res call({String query}); +} + +/// @nodoc +class __$$SearchProductPestisidaImplCopyWithImpl<$Res> + extends _$PestisidaEventCopyWithImpl<$Res, _$SearchProductPestisidaImpl> + implements _$$SearchProductPestisidaImplCopyWith<$Res> { + __$$SearchProductPestisidaImplCopyWithImpl( + _$SearchProductPestisidaImpl _value, + $Res Function(_$SearchProductPestisidaImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? query = null, + }) { + return _then(_$SearchProductPestisidaImpl( + null == query + ? _value.query + : query // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$SearchProductPestisidaImpl implements _SearchProductPestisida { + const _$SearchProductPestisidaImpl(this.query); + + @override + final String query; + + @override + String toString() { + return 'PestisidaEvent.searchProductPestisida(query: $query)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SearchProductPestisidaImpl && + (identical(other.query, query) || other.query == query)); + } + + @override + int get hashCode => Object.hash(runtimeType, query); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$SearchProductPestisidaImplCopyWith<_$SearchProductPestisidaImpl> + get copyWith => __$$SearchProductPestisidaImplCopyWithImpl< + _$SearchProductPestisidaImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductPestisida, + required TResult Function(String query) searchProductPestisida, + required TResult Function() fetchAllPestisida, + }) { + return searchProductPestisida(query); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductPestisida, + TResult? Function(String query)? searchProductPestisida, + TResult? Function()? fetchAllPestisida, + }) { + return searchProductPestisida?.call(query); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductPestisida, + TResult Function(String query)? searchProductPestisida, + TResult Function()? fetchAllPestisida, + required TResult orElse(), + }) { + if (searchProductPestisida != null) { + return searchProductPestisida(query); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductPestisida value) getProductPestisida, + required TResult Function(_SearchProductPestisida value) + searchProductPestisida, + required TResult Function(_FetchAllPestisida value) fetchAllPestisida, + }) { + return searchProductPestisida(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductPestisida value)? getProductPestisida, + TResult? Function(_SearchProductPestisida value)? searchProductPestisida, + TResult? Function(_FetchAllPestisida value)? fetchAllPestisida, + }) { + return searchProductPestisida?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductPestisida value)? getProductPestisida, + TResult Function(_SearchProductPestisida value)? searchProductPestisida, + TResult Function(_FetchAllPestisida value)? fetchAllPestisida, + required TResult orElse(), + }) { + if (searchProductPestisida != null) { + return searchProductPestisida(this); + } + return orElse(); + } +} + +abstract class _SearchProductPestisida implements PestisidaEvent { + const factory _SearchProductPestisida(final String query) = + _$SearchProductPestisidaImpl; + + String get query; + @JsonKey(ignore: true) + _$$SearchProductPestisidaImplCopyWith<_$SearchProductPestisidaImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$FetchAllPestisidaImplCopyWith<$Res> { + factory _$$FetchAllPestisidaImplCopyWith(_$FetchAllPestisidaImpl value, + $Res Function(_$FetchAllPestisidaImpl) then) = + __$$FetchAllPestisidaImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$FetchAllPestisidaImplCopyWithImpl<$Res> + extends _$PestisidaEventCopyWithImpl<$Res, _$FetchAllPestisidaImpl> + implements _$$FetchAllPestisidaImplCopyWith<$Res> { + __$$FetchAllPestisidaImplCopyWithImpl(_$FetchAllPestisidaImpl _value, + $Res Function(_$FetchAllPestisidaImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$FetchAllPestisidaImpl implements _FetchAllPestisida { + const _$FetchAllPestisidaImpl(); + + @override + String toString() { + return 'PestisidaEvent.fetchAllPestisida()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$FetchAllPestisidaImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductPestisida, + required TResult Function(String query) searchProductPestisida, + required TResult Function() fetchAllPestisida, + }) { + return fetchAllPestisida(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductPestisida, + TResult? Function(String query)? searchProductPestisida, + TResult? Function()? fetchAllPestisida, + }) { + return fetchAllPestisida?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductPestisida, + TResult Function(String query)? searchProductPestisida, + TResult Function()? fetchAllPestisida, + required TResult orElse(), + }) { + if (fetchAllPestisida != null) { + return fetchAllPestisida(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductPestisida value) getProductPestisida, + required TResult Function(_SearchProductPestisida value) + searchProductPestisida, + required TResult Function(_FetchAllPestisida value) fetchAllPestisida, + }) { + return fetchAllPestisida(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductPestisida value)? getProductPestisida, + TResult? Function(_SearchProductPestisida value)? searchProductPestisida, + TResult? Function(_FetchAllPestisida value)? fetchAllPestisida, + }) { + return fetchAllPestisida?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductPestisida value)? getProductPestisida, + TResult Function(_SearchProductPestisida value)? searchProductPestisida, + TResult Function(_FetchAllPestisida value)? fetchAllPestisida, + required TResult orElse(), + }) { + if (fetchAllPestisida != null) { + return fetchAllPestisida(this); + } + return orElse(); + } +} + +abstract class _FetchAllPestisida implements PestisidaEvent { + const factory _FetchAllPestisida() = _$FetchAllPestisidaImpl; +} + +/// @nodoc +mixin _$PestisidaState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PestisidaStateCopyWith<$Res> { + factory $PestisidaStateCopyWith( + PestisidaState value, $Res Function(PestisidaState) then) = + _$PestisidaStateCopyWithImpl<$Res, PestisidaState>; +} + +/// @nodoc +class _$PestisidaStateCopyWithImpl<$Res, $Val extends PestisidaState> + implements $PestisidaStateCopyWith<$Res> { + _$PestisidaStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$PestisidaStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'PestisidaState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements PestisidaState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$PestisidaStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'PestisidaState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements PestisidaState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List products}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$PestisidaStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? products = null, + }) { + return _then(_$LoadedImpl( + null == products + ? _value._products + : products // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List products) : _products = products; + + final List _products; + @override + List get products { + if (_products is EqualUnmodifiableListView) return _products; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_products); + } + + @override + String toString() { + return 'PestisidaState.loaded(products: $products)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality().equals(other._products, _products)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_products)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loaded(products); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(products); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(products); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements PestisidaState { + const factory _Loaded(final List products) = _$LoadedImpl; + + List get products; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$PestisidaStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'PestisidaState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements PestisidaState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_event.dart new file mode 100644 index 0000000..81542e8 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_event.dart @@ -0,0 +1,10 @@ +part of 'pestisida_bloc.dart'; + +@freezed +class PestisidaEvent with _$PestisidaEvent { + const factory PestisidaEvent.started() = _Started; + const factory PestisidaEvent.getProductPestisida() = _GetProductPestisida; + const factory PestisidaEvent.searchProductPestisida(String query) = + _SearchProductPestisida; + const factory PestisidaEvent.fetchAllPestisida() = _FetchAllPestisida; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_state.dart new file mode 100644 index 0000000..f68bc4d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pestisida/pestisida_state.dart @@ -0,0 +1,9 @@ +part of 'pestisida_bloc.dart'; + +@freezed +class PestisidaState with _$PestisidaState { + const factory PestisidaState.initial() = _Initial; + const factory PestisidaState.loading() = _Loading; + const factory PestisidaState.loaded(List products) = _Loaded; + const factory PestisidaState.error(final String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_bloc.dart new file mode 100644 index 0000000..c911a6c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_bloc.dart @@ -0,0 +1,41 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_remote_datasource.dart'; + +import '../../../../data/models/responses/product_response_model.dart'; + +part 'pupuk_bloc.freezed.dart'; +part 'pupuk_event.dart'; +part 'pupuk_state.dart'; + +class PupukBloc extends Bloc { + final ProductRemoteDatasource _productRemoteDatasource; + List products = []; + PupukBloc( + this._productRemoteDatasource, + ) : super(const _Initial()) { + on<_GetProductPupuk>((event, emit) async { + emit(const _Loading()); + final response = await _productRemoteDatasource.getProductByCategory(3); + response.fold((l) => emit(_Error(l)), (r) { + products = r.data ?? []; + emit(_Loaded(products)); + }); + }); + on<_SearchProductPupuk>((event, emit) async { + emit(const PupukState.loading()); + final newProducts = products + .where((element) => + element.name!.toLowerCase().contains(event.query.toLowerCase())) + .toList(); + emit(PupukState.loaded(newProducts)); + }); + + on<_FetchAllPupuk>((event, emit) async { + emit(const PupukState.loading()); + emit(PupukState.loaded(products)); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_bloc.freezed.dart new file mode 100644 index 0000000..15ea04e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_bloc.freezed.dart @@ -0,0 +1,1172 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'pupuk_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$PupukEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductPupuk, + required TResult Function(String query) searchProductPupuk, + required TResult Function() fetchAllPupuk, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductPupuk, + TResult? Function(String query)? searchProductPupuk, + TResult? Function()? fetchAllPupuk, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductPupuk, + TResult Function(String query)? searchProductPupuk, + TResult Function()? fetchAllPupuk, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductPupuk value) getProductPupuk, + required TResult Function(_SearchProductPupuk value) searchProductPupuk, + required TResult Function(_FetchAllPupuk value) fetchAllPupuk, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductPupuk value)? getProductPupuk, + TResult? Function(_SearchProductPupuk value)? searchProductPupuk, + TResult? Function(_FetchAllPupuk value)? fetchAllPupuk, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductPupuk value)? getProductPupuk, + TResult Function(_SearchProductPupuk value)? searchProductPupuk, + TResult Function(_FetchAllPupuk value)? fetchAllPupuk, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PupukEventCopyWith<$Res> { + factory $PupukEventCopyWith( + PupukEvent value, $Res Function(PupukEvent) then) = + _$PupukEventCopyWithImpl<$Res, PupukEvent>; +} + +/// @nodoc +class _$PupukEventCopyWithImpl<$Res, $Val extends PupukEvent> + implements $PupukEventCopyWith<$Res> { + _$PupukEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$PupukEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'PupukEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductPupuk, + required TResult Function(String query) searchProductPupuk, + required TResult Function() fetchAllPupuk, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductPupuk, + TResult? Function(String query)? searchProductPupuk, + TResult? Function()? fetchAllPupuk, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductPupuk, + TResult Function(String query)? searchProductPupuk, + TResult Function()? fetchAllPupuk, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductPupuk value) getProductPupuk, + required TResult Function(_SearchProductPupuk value) searchProductPupuk, + required TResult Function(_FetchAllPupuk value) fetchAllPupuk, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductPupuk value)? getProductPupuk, + TResult? Function(_SearchProductPupuk value)? searchProductPupuk, + TResult? Function(_FetchAllPupuk value)? fetchAllPupuk, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductPupuk value)? getProductPupuk, + TResult Function(_SearchProductPupuk value)? searchProductPupuk, + TResult Function(_FetchAllPupuk value)? fetchAllPupuk, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements PupukEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetProductPupukImplCopyWith<$Res> { + factory _$$GetProductPupukImplCopyWith(_$GetProductPupukImpl value, + $Res Function(_$GetProductPupukImpl) then) = + __$$GetProductPupukImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$GetProductPupukImplCopyWithImpl<$Res> + extends _$PupukEventCopyWithImpl<$Res, _$GetProductPupukImpl> + implements _$$GetProductPupukImplCopyWith<$Res> { + __$$GetProductPupukImplCopyWithImpl( + _$GetProductPupukImpl _value, $Res Function(_$GetProductPupukImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$GetProductPupukImpl implements _GetProductPupuk { + const _$GetProductPupukImpl(); + + @override + String toString() { + return 'PupukEvent.getProductPupuk()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$GetProductPupukImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductPupuk, + required TResult Function(String query) searchProductPupuk, + required TResult Function() fetchAllPupuk, + }) { + return getProductPupuk(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductPupuk, + TResult? Function(String query)? searchProductPupuk, + TResult? Function()? fetchAllPupuk, + }) { + return getProductPupuk?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductPupuk, + TResult Function(String query)? searchProductPupuk, + TResult Function()? fetchAllPupuk, + required TResult orElse(), + }) { + if (getProductPupuk != null) { + return getProductPupuk(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductPupuk value) getProductPupuk, + required TResult Function(_SearchProductPupuk value) searchProductPupuk, + required TResult Function(_FetchAllPupuk value) fetchAllPupuk, + }) { + return getProductPupuk(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductPupuk value)? getProductPupuk, + TResult? Function(_SearchProductPupuk value)? searchProductPupuk, + TResult? Function(_FetchAllPupuk value)? fetchAllPupuk, + }) { + return getProductPupuk?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductPupuk value)? getProductPupuk, + TResult Function(_SearchProductPupuk value)? searchProductPupuk, + TResult Function(_FetchAllPupuk value)? fetchAllPupuk, + required TResult orElse(), + }) { + if (getProductPupuk != null) { + return getProductPupuk(this); + } + return orElse(); + } +} + +abstract class _GetProductPupuk implements PupukEvent { + const factory _GetProductPupuk() = _$GetProductPupukImpl; +} + +/// @nodoc +abstract class _$$SearchProductPupukImplCopyWith<$Res> { + factory _$$SearchProductPupukImplCopyWith(_$SearchProductPupukImpl value, + $Res Function(_$SearchProductPupukImpl) then) = + __$$SearchProductPupukImplCopyWithImpl<$Res>; + @useResult + $Res call({String query}); +} + +/// @nodoc +class __$$SearchProductPupukImplCopyWithImpl<$Res> + extends _$PupukEventCopyWithImpl<$Res, _$SearchProductPupukImpl> + implements _$$SearchProductPupukImplCopyWith<$Res> { + __$$SearchProductPupukImplCopyWithImpl(_$SearchProductPupukImpl _value, + $Res Function(_$SearchProductPupukImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? query = null, + }) { + return _then(_$SearchProductPupukImpl( + null == query + ? _value.query + : query // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$SearchProductPupukImpl implements _SearchProductPupuk { + const _$SearchProductPupukImpl(this.query); + + @override + final String query; + + @override + String toString() { + return 'PupukEvent.searchProductPupuk(query: $query)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SearchProductPupukImpl && + (identical(other.query, query) || other.query == query)); + } + + @override + int get hashCode => Object.hash(runtimeType, query); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$SearchProductPupukImplCopyWith<_$SearchProductPupukImpl> get copyWith => + __$$SearchProductPupukImplCopyWithImpl<_$SearchProductPupukImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductPupuk, + required TResult Function(String query) searchProductPupuk, + required TResult Function() fetchAllPupuk, + }) { + return searchProductPupuk(query); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductPupuk, + TResult? Function(String query)? searchProductPupuk, + TResult? Function()? fetchAllPupuk, + }) { + return searchProductPupuk?.call(query); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductPupuk, + TResult Function(String query)? searchProductPupuk, + TResult Function()? fetchAllPupuk, + required TResult orElse(), + }) { + if (searchProductPupuk != null) { + return searchProductPupuk(query); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductPupuk value) getProductPupuk, + required TResult Function(_SearchProductPupuk value) searchProductPupuk, + required TResult Function(_FetchAllPupuk value) fetchAllPupuk, + }) { + return searchProductPupuk(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductPupuk value)? getProductPupuk, + TResult? Function(_SearchProductPupuk value)? searchProductPupuk, + TResult? Function(_FetchAllPupuk value)? fetchAllPupuk, + }) { + return searchProductPupuk?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductPupuk value)? getProductPupuk, + TResult Function(_SearchProductPupuk value)? searchProductPupuk, + TResult Function(_FetchAllPupuk value)? fetchAllPupuk, + required TResult orElse(), + }) { + if (searchProductPupuk != null) { + return searchProductPupuk(this); + } + return orElse(); + } +} + +abstract class _SearchProductPupuk implements PupukEvent { + const factory _SearchProductPupuk(final String query) = + _$SearchProductPupukImpl; + + String get query; + @JsonKey(ignore: true) + _$$SearchProductPupukImplCopyWith<_$SearchProductPupukImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$FetchAllPupukImplCopyWith<$Res> { + factory _$$FetchAllPupukImplCopyWith( + _$FetchAllPupukImpl value, $Res Function(_$FetchAllPupukImpl) then) = + __$$FetchAllPupukImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$FetchAllPupukImplCopyWithImpl<$Res> + extends _$PupukEventCopyWithImpl<$Res, _$FetchAllPupukImpl> + implements _$$FetchAllPupukImplCopyWith<$Res> { + __$$FetchAllPupukImplCopyWithImpl( + _$FetchAllPupukImpl _value, $Res Function(_$FetchAllPupukImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$FetchAllPupukImpl implements _FetchAllPupuk { + const _$FetchAllPupukImpl(); + + @override + String toString() { + return 'PupukEvent.fetchAllPupuk()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$FetchAllPupukImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProductPupuk, + required TResult Function(String query) searchProductPupuk, + required TResult Function() fetchAllPupuk, + }) { + return fetchAllPupuk(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProductPupuk, + TResult? Function(String query)? searchProductPupuk, + TResult? Function()? fetchAllPupuk, + }) { + return fetchAllPupuk?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProductPupuk, + TResult Function(String query)? searchProductPupuk, + TResult Function()? fetchAllPupuk, + required TResult orElse(), + }) { + if (fetchAllPupuk != null) { + return fetchAllPupuk(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProductPupuk value) getProductPupuk, + required TResult Function(_SearchProductPupuk value) searchProductPupuk, + required TResult Function(_FetchAllPupuk value) fetchAllPupuk, + }) { + return fetchAllPupuk(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProductPupuk value)? getProductPupuk, + TResult? Function(_SearchProductPupuk value)? searchProductPupuk, + TResult? Function(_FetchAllPupuk value)? fetchAllPupuk, + }) { + return fetchAllPupuk?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProductPupuk value)? getProductPupuk, + TResult Function(_SearchProductPupuk value)? searchProductPupuk, + TResult Function(_FetchAllPupuk value)? fetchAllPupuk, + required TResult orElse(), + }) { + if (fetchAllPupuk != null) { + return fetchAllPupuk(this); + } + return orElse(); + } +} + +abstract class _FetchAllPupuk implements PupukEvent { + const factory _FetchAllPupuk() = _$FetchAllPupukImpl; +} + +/// @nodoc +mixin _$PupukState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PupukStateCopyWith<$Res> { + factory $PupukStateCopyWith( + PupukState value, $Res Function(PupukState) then) = + _$PupukStateCopyWithImpl<$Res, PupukState>; +} + +/// @nodoc +class _$PupukStateCopyWithImpl<$Res, $Val extends PupukState> + implements $PupukStateCopyWith<$Res> { + _$PupukStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$PupukStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'PupukState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements PupukState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$PupukStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'PupukState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements PupukState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List products}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$PupukStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? products = null, + }) { + return _then(_$LoadedImpl( + null == products + ? _value._products + : products // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List products) : _products = products; + + final List _products; + @override + List get products { + if (_products is EqualUnmodifiableListView) return _products; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_products); + } + + @override + String toString() { + return 'PupukState.loaded(products: $products)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality().equals(other._products, _products)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_products)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loaded(products); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(products); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(products); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements PupukState { + const factory _Loaded(final List products) = _$LoadedImpl; + + List get products; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$PupukStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'PupukState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements PupukState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_event.dart new file mode 100644 index 0000000..ec410f2 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_event.dart @@ -0,0 +1,9 @@ +part of 'pupuk_bloc.dart'; + +@freezed +class PupukEvent with _$PupukEvent { + const factory PupukEvent.started() = _Started; + const factory PupukEvent.getProductPupuk() = _GetProductPupuk; + const factory PupukEvent.searchProductPupuk(String query) = _SearchProductPupuk; + const factory PupukEvent.fetchAllPupuk() = _FetchAllPupuk; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_state.dart new file mode 100644 index 0000000..6c46a0e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/bloc/pupuk/pupuk_state.dart @@ -0,0 +1,9 @@ +part of 'pupuk_bloc.dart'; + +@freezed +class PupukState with _$PupukState { + const factory PupukState.initial() = _Initial; + const factory PupukState.loading() = _Loading; + const factory PupukState.loaded(List products) = _Loaded; + const factory PupukState.error(final String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/models/product_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/models/product_model.dart new file mode 100644 index 0000000..a205a9e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/models/product_model.dart @@ -0,0 +1,23 @@ +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; + +import 'store_model.dart'; + +class ProductModel { + final List images; + final String name; + final int price; + final int stock; + final String description; + final StoreModel store; + + ProductModel({ + required this.images, + required this.name, + required this.price, + required this.stock, + required this.description, + required this.store, + }); + + String get priceFormat => price.currencyFormatRp; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/models/product_quantity.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/models/product_quantity.dart new file mode 100644 index 0000000..cc91471 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/models/product_quantity.dart @@ -0,0 +1,35 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; + +class ProductQuantity { + Product product; + int quantity; + ProductQuantity({ + required this.product, + required this.quantity, + }); + + @override + bool operator ==(covariant ProductQuantity other) { + if (identical(this, other)) return true; + + return other.product == product && other.quantity == quantity; + } + + @override + int get hashCode => product.hashCode ^ quantity.hashCode; + + @override + String toString() => + 'ProductQuantity(product: $product, quantity: $quantity)'; + + ProductQuantity copyWith({ + Product? product, + int? quantity, + }) { + return ProductQuantity( + product: product ?? this.product, + quantity: quantity ?? this.quantity, + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/models/store_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/models/store_model.dart new file mode 100644 index 0000000..9d8137f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/models/store_model.dart @@ -0,0 +1,27 @@ +class StoreModel { + final String name; + final StoreEnum type; + final String imageUrl; + + StoreModel({ + required this.name, + required this.type, + required this.imageUrl, + }); +} + +enum StoreEnum { + star('Star'), + starPlus('Star +'), + officialStore('Official Store'); + + final String value; + const StoreEnum(this.value); + + factory StoreEnum.getType(String value) { + return values.firstWhere( + (value) => value.value == '$value', + orElse: () => StoreEnum.star, + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/alat_pertanian_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/alat_pertanian_page.dart new file mode 100644 index 0000000..a374480 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/alat_pertanian_page.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/search_input_pos.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/widgets/organism/product_list.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/router/app_router.dart'; +import '../bloc/checkout/checkout_bloc.dart'; +import 'package:badges/badges.dart' as badges; + +class AlatPertanianPage extends StatefulWidget { + const AlatPertanianPage({super.key}); + + @override + State createState() => _AlatPertanianPageState(); +} + +class _AlatPertanianPageState extends State { + late TextEditingController searchController; + @override + void initState() { + context + .read() + .add(const AlatPertanianEvent.getProductAlatPertanian()); + searchController = TextEditingController(); + super.initState(); + } + + @override + void dispose() { + searchController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Alat Pertanian'), + actions: [ + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + loaded: (checkout, _, __, ___, ____, ______, _____) { + final totalQuantity = checkout.fold( + 0, + (previousValue, element) => + previousValue + element.quantity, + ); + return totalQuantity > 0 + ? badges.Badge( + badgeContent: Text( + totalQuantity.toString(), + style: const TextStyle(color: Colors.white), + ), + child: IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ), + ) + : IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ); + }, + orElse: () => const SizedBox.shrink(), + ); + }, + ), + const SizedBox( + width: 16, + ) + ], + ), + body: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + SearchInput( + controller: searchController, + onChanged: (value) { + if (value.length > 3) { + context + .read() + .add(AlatPertanianEvent.searchProductAlatPertanian(value)); + } + if (value.isEmpty) { + context + .read() + .add(const AlatPertanianEvent.fetchAllAlatPertanian()); + } + }, + ), + const SpaceHeight(20.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + error: (message) => Center( + child: Text(message), + ), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (products) { + return ProductList( + title: 'Pestisida', + onSeeAllTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const AlatPertanianPage())); + }, + items: products, + ); + }, + ); + }, + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/all_product_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/all_product_page.dart new file mode 100644 index 0000000..3ea4e31 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/all_product_page.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/search_input.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/widgets/organism/product_list.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/local_product/local_product_bloc.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/router/app_router.dart'; +import '../bloc/checkout/checkout_bloc.dart'; +import 'package:badges/badges.dart' as badges; + +class AllProductPage extends StatefulWidget { + const AllProductPage({super.key}); + + @override + State createState() => _AllProductPageState(); +} + +class _AllProductPageState extends State { + late TextEditingController searchController; + + @override + void initState() { + context.read().add(const AllProductEvent.getAllProducts()); + searchController = TextEditingController(); + super.initState(); + } + + @override + void dispose() { + searchController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Semua Produk'), + actions: [ + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + loaded: (checkout, _, __, ___, ____, ______, _____) { + final totalQuantity = checkout.fold( + 0, + (previousValue, element) => + previousValue + element.quantity, + ); + return totalQuantity > 0 + ? badges.Badge( + badgeContent: Text( + totalQuantity.toString(), + style: const TextStyle(color: Colors.white), + ), + child: IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ), + ) + : IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ); + }, + orElse: () => const SizedBox.shrink(), + ); + }, + ), + const SizedBox( + width: 16, + ) + ], + ), + body: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + SearchInput( + controller: searchController, + onChanged: (value) { + if (value.length > 3) { + context + .read() + .add(AllProductEvent.searchProduct(value)); + } + if (value.isEmpty) { + context + .read() + .add(const AllProductEvent.fetchAll()); + } + }, + ), + const SpaceHeight(20.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + error: (message) => Center( + child: Text(message), + ), + loaded: (products) { + return ProductList( + title: "Semua Produk", + onSeeAllTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const AllProductPage())); + }, + items: products, + ); + }, + ); + }, + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/benih_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/benih_page.dart new file mode 100644 index 0000000..7349ddd --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/benih_page.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:badges/badges.dart' as badges; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/search_input.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/core/router/app_router.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/benih/benih_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/widgets/organism/product_list.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../bloc/checkout/checkout_bloc.dart'; + +class BenihPage extends StatefulWidget { + const BenihPage({super.key}); + + @override + State createState() => _BenihPageState(); +} + +class _BenihPageState extends State { + late TextEditingController searchController; + + @override + void initState() { + context.read().add(const BenihEvent.getProductBenih()); + searchController = TextEditingController(); + super.initState(); + } + + @override + void dispose() { + searchController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Benih'), + actions: [ + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + loaded: (checkout, _, __, ___, ____, ______, _____) { + final totalQuantity = checkout.fold( + 0, + (previousValue, element) => + previousValue + element.quantity, + ); + return totalQuantity > 0 + ? badges.Badge( + badgeContent: Text( + totalQuantity.toString(), + style: const TextStyle(color: Colors.white), + ), + child: IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ), + ) + : IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ); + }, + orElse: () => const SizedBox.shrink(), + ); + }, + ), + const SizedBox( + width: 16, + ) + ], + ), + body: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + SearchInput( + controller: searchController, + onChanged: (value) { + if (value.length > 3) { + context + .read() + .add(BenihEvent.searchProductBenih(value)); + } + if (value.isEmpty) { + context.read().add(const BenihEvent.fetchAllBenih()); + } + }, + ), + const SpaceHeight(20.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + error: (message) => Center( + child: Text(message), + ), + loaded: (products) { + return ProductList( + title: 'Benih', + onSeeAllTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const BenihPage())); + }, + items: products, + ); + }, + ); + }, + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/chat_page_ecommerce.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/chat_page_ecommerce.dart new file mode 100644 index 0000000..a6b1005 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/chat_page_ecommerce.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/router/app_router.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:flutter_tawk/flutter_tawk.dart'; +import 'package:go_router/go_router.dart'; + +class ChatPageEcommerce extends StatefulWidget { + const ChatPageEcommerce({super.key}); + + @override + State createState() => _ChatPageEcommerceState(); +} + +class _ChatPageEcommerceState extends State { + // Future _initializePage() async { + // await Future.delayed(const Duration(seconds: 3)); + // final authData = await AuthLocalDatasource().getAuthData(); + // final role = authData?.user?.roles; + // final name = authData?.user?.name; + // final email = authData?.user?.email; + // if (role == 'owner' || role == 'kasir') { + // return name.toString(); + // } else if (role == 'member') { + // return name.toString(); + // } else { + // return email.toString(); + // } + // } + + @override + void initState() { + super.initState(); + // _initializePage(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Tawk( + directChatLink: + 'https://tawk.to/chat/6642c15e9a809f19fb3097d8/1htqc6mpr', + visitor: TawkVisitor( + name: "dayat", + email: 'dayat12@gmail.com', + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/dashboard_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/dashboard_page.dart new file mode 100644 index 0000000..7cf9364 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/dashboard_page.dart @@ -0,0 +1,96 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/account/pages/account_page.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../orders/pages/cart_page.dart'; +import '../../orders/pages/history_order_page.dart'; +import 'home_page.dart'; + +class DashboardPage extends StatefulWidget { + final int currentTab; + const DashboardPage({ + super.key, + required this.currentTab, + }); + + @override + State createState() => _DashboardPageState(); +} + +class _DashboardPageState extends State { + late int _selectedIndex; + final List _pages = [ + const HomePage(), + const CartPage(), + const HistoryOrderPage(), + const AccountPage() + ]; + + void _onItemTapped(int index) { + _selectedIndex = index; + setState(() {}); + } + + @override + void initState() { + _selectedIndex = widget.currentTab; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: IndexedStack(index: _selectedIndex, children: _pages), + bottomNavigationBar: BottomNavigationBar( + type: BottomNavigationBarType.fixed, + currentIndex: _selectedIndex, + selectedItemColor: AppColors.primary, + onTap: _onItemTapped, + items: [ + BottomNavigationBarItem( + icon: Assets.icons.home.svg( + colorFilter: const ColorFilter.mode( + AppColors.grey, + BlendMode.srcIn, + ), + ), + activeIcon: Assets.icons.home.svg(), + label: 'HOME', + ), + BottomNavigationBarItem( + icon: Assets.icons.order.svg( + colorFilter: const ColorFilter.mode( + AppColors.grey, + BlendMode.srcIn, + ), + ), + activeIcon: Assets.icons.order.svg(), + label: 'ORDER', + ), + BottomNavigationBarItem( + icon: Assets.icons.bag.svg( + colorFilter: const ColorFilter.mode( + AppColors.grey, + BlendMode.srcIn, + ), + ), + activeIcon: Assets.icons.bag.svg(), + label: 'HISTORI', + ), + BottomNavigationBarItem( + icon: Assets.icons.person.svg( + colorFilter: const ColorFilter.mode( + AppColors.grey, + BlendMode.srcIn, + ), + ), + activeIcon: Assets.icons.person.svg(), + label: 'AKUN', + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/detail_product_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/detail_product_page.dart new file mode 100644 index 0000000..746fd48 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/detail_product_page.dart @@ -0,0 +1,201 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:badges/badges.dart' as badges; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/detail_product_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/detail_product/detail_product_bloc.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/constants/global_variable.dart'; +import '../../../../../core/router/app_router.dart'; +import '../../../data/models/responses/order_detail_response_model.dart'; +import '../../../data/models/responses/product_response_model.dart'; +import '../bloc/checkout/checkout_bloc.dart'; + +class DetailProductPage extends StatefulWidget { + // final Product product; + final int productId; + const DetailProductPage({ + super.key, + // required this.product, + required this.productId, + }); + + @override + State createState() => _DetailProductPageState(); +} + +class _DetailProductPageState extends State { + @override + void initState() { + context + .read() + .add(DetailProductEvent.detailProduct(widget.productId)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("Detail Produk"), + actions: [ + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + loaded: (checkout, _, __, ___, ____, ______,_____) { + final totalQuantity = checkout.fold( + 0, + (previousValue, element) => + previousValue + element.quantity, + ); + return totalQuantity > 0 + ? badges.Badge( + badgeContent: Text( + totalQuantity.toString(), + style: const TextStyle(color: Colors.white), + ), + child: IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ), + ) + : IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ); + }, + orElse: () => const SizedBox.shrink(), + ); + }, + ), + const SizedBox( + width: 16, + ) + ], + ), + body: BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox(), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (detailProduct) { + return ListView( + padding: const EdgeInsets.all(16.0), + children: [ + Container( + width: double.infinity, + height: 400, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all( + Radius.circular(12.0), + ), + ), + child: Image.network( + detailProduct.image!.contains('http') + ? detailProduct.image! + : '${GlobalVariable.baseUrlImage}${detailProduct.image}', + width: 170.0, + height: 80.0, + fit: BoxFit.cover, + ), + ), + const SpaceHeight(16), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + detailProduct.name ?? '', + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + ), + ), + Text( + "Stok : ${detailProduct.stock}", + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + const SpaceHeight(16.0), + Text( + detailProduct.price!.currencyFormatRp, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: AppColors.primary, + ), + ), + const SpaceHeight(16.0), + const Text( + "Deskripsi Item", + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + ), + ), + const SpaceHeight(16.0), + Text(detailProduct.description ?? ''), + const SpaceHeight(16.0), + Row( + children: [ + Flexible( + child: Button.outlined( + onPressed: () { + context.read().add( + CheckoutEvent.addItem( + detailProduct.toProduct())); + }, + label: '+ Keranjang', + ), + ), + const SpaceWidth(12.0), + Flexible( + child: Button.filled( + onPressed: () { + context.read().add( + CheckoutEvent.addItem( + detailProduct.toProduct())); + context.pushNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + label: 'Beli Sekarang', + ), + ), + ], + ), + ], + ); + }, + ); + }, + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/home_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/home_page.dart new file mode 100644 index 0000000..b916cef --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/home_page.dart @@ -0,0 +1,500 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/alat_pertanian/alat_pertanian_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/benih/benih_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/pestisida/pestisida_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/pupuk/pupuk_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/search_input_pos.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/pages/alat_pertanian_page.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/pages/benih_page.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/pages/chat_page_ecommerce.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/pages/pestisida_page.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/pages/pupuk_page.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/local_product/local_product_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/bloc/discount/discount_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'package:badges/badges.dart' as badges; +import '../../../../../core/assets/assets.gen.dart'; +// import '../../../../../core/components/search_input.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/router/app_router.dart'; +import '../models/product_model.dart'; +import '../models/store_model.dart'; +import '../widgets/banner_slider.dart'; +import '../widgets/organism/menu_categories.dart'; +import '../widgets/organism/product_list.dart'; +import '../widgets/title_content.dart'; +import 'all_product_page.dart'; + +class HomePage extends StatefulWidget { + const HomePage({super.key}); + + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State { + late TextEditingController searchController; + final List featuredProducts = [ + ProductModel( + images: [ + Assets.images.products.lampu.path, + Assets.images.products.lampu.path, + Assets.images.products.lampu.path, + ], + name: 'Lampu', + price: 90000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ProductModel( + images: [ + Assets.images.products.earphone.path, + Assets.images.products.earphone.path, + Assets.images.products.earphone.path, + ], + name: 'Earphone', + price: 320000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ]; + final List bestSellers = [ + ProductModel( + images: [ + Assets.images.products.keyboard.path, + Assets.images.products.keyboard.path, + Assets.images.products.keyboard.path, + ], + name: 'Keyboard Mechanical', + price: 320000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ProductModel( + images: [ + Assets.images.products.earphone.path, + Assets.images.products.earphone.path, + Assets.images.products.earphone.path, + ], + name: 'Earphone', + price: 320000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ]; + final List newArrivals = [ + ProductModel( + images: [ + Assets.images.products.sepatu.path, + Assets.images.products.sepatu2.path, + Assets.images.products.sepatu.path, + ], + name: 'Sepatu Nike', + price: 2200000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ProductModel( + images: [ + Assets.images.products.sepatu2.path, + Assets.images.products.sepatu.path, + Assets.images.products.sepatu2.path, + ], + name: 'Sepatu Nike', + price: 2200000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ]; + final List topRatedProducts = [ + ProductModel( + images: [ + Assets.images.products.mac.path, + Assets.images.products.mac2.path, + Assets.images.products.mac.path, + ], + name: 'Macbook', + price: 12220000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ProductModel( + images: [ + Assets.images.products.mac2.path, + Assets.images.products.mac.path, + Assets.images.products.mac2.path, + ], + name: 'Macbook', + price: 12220000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ]; + final List specialOffers = [ + ProductModel( + images: [ + Assets.images.products.mac.path, + Assets.images.products.mac2.path, + Assets.images.products.mac.path, + ], + name: 'Macbook', + price: 12220000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ProductModel( + images: [ + Assets.images.products.mac2.path, + Assets.images.products.mac.path, + Assets.images.products.mac2.path, + ], + name: 'Macbook', + price: 12220000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ]; + final List banners1 = [ + Assets.images.banner1.path, + Assets.images.banner1.path, + ]; + final List banners2 = [ + Assets.images.banner2.path, + Assets.images.banner2.path, + Assets.images.banner2.path, + ]; + + @override + void initState() { + context.read().add(const AllProductEvent.getAllProducts()); + context.read().add(const BenihEvent.getProductBenih()); + context.read().add(const PupukEvent.getProductPupuk()); + context + .read() + .add(const PestisidaEvent.getProductPestisida()); + context + .read() + .add(const AlatPertanianEvent.getProductAlatPertanian()); + searchController = TextEditingController(); + context.read().add(const DiscountEvent.getDiscounts()); + super.initState(); + } + + @override + void dispose() { + searchController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Tani Store'), + actions: [ + // IconButton( + // onPressed: () {}, + // icon: Assets.icons.notification.svg(height: 24.0), + // ), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + loaded: (checkout, _, __, ___, ____, ______, _____) { + final totalQuantity = checkout.fold( + 0, + (previousValue, element) => + previousValue + element.quantity, + ); + return totalQuantity > 0 + ? badges.Badge( + badgeContent: Text( + totalQuantity.toString(), + style: const TextStyle(color: Colors.white), + ), + child: IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ), + ) + : IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ); + }, + orElse: () => const SizedBox.shrink(), + ); + }, + ), + const SizedBox( + width: 16, + ) + ], + ), + body: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + // SearchInput( + // controller: searchController, + // onChanged: (value) { + // if (value.length > 3) { + // context + // .read() + // .add(LocalProductEvent.searchProduct(value)); + // } + // if (value.isEmpty) { + // context + // .read() + // .add(const LocalProductEvent.fetchAllFromState()); + // } + // }, + // ), + const SpaceHeight(16.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return const SizedBox.shrink(); + }, + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (discounts) { + return BannerSlider(items: discounts); + }, + ); + }, + ), + const SpaceHeight(12.0), + TitleContent( + title: 'kategori', + onSeeAllTap: () {}, + ), + const SpaceHeight(12.0), + const MenuCategories(), + const SpaceHeight(50.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + error: (message) => Center( + child: Text(message), + ), + loaded: (products) { + return ProductList( + title: "Semua Produk", + onSeeAllTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const AllProductPage())); + }, + items: + products.length > 2 ? products.sublist(0, 2) : products, + ); + }, + ); + }, + ), + const SpaceHeight(50.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return const SizedBox.shrink(); + }, + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (discounts) { + return BannerSlider(items: discounts); + }, + ); + }, + ), + const SpaceHeight(28.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + error: (message) => Center( + child: Text(message), + ), + loaded: (products) { + return ProductList( + title: 'Benih', + onSeeAllTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const BenihPage())); + }, + items: + products.length > 2 ? products.sublist(0, 2) : products, + ); + }, + ); + }, + ), + const SpaceHeight(50.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + error: (message) => Center( + child: Text(message), + ), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (products) { + return ProductList( + title: 'Pupuk', + onSeeAllTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const PupukPage())); + }, + items: + products.length > 2 ? products.sublist(0, 2) : products, + ); + }, + ); + }, + ), + const SpaceHeight(50.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + error: (message) => Center( + child: Text(message), + ), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (products) { + return ProductList( + title: 'Pestisida', + onSeeAllTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const PestisidaPage())); + }, + items: products, + ); + }, + ); + }, + ), + const SpaceHeight(50.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + error: (message) => Center( + child: Text(message), + ), + loaded: (products) { + return ProductList( + title: 'Alat Pertanian', + onSeeAllTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const AlatPertanianPage())); + }, + items: products, + ); + }, + ); + }, + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/logout_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/logout_page.dart new file mode 100644 index 0000000..f157464 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/logout_page.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/router/app_router.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/auth/bloc/logout/logout_bloc.dart'; +import 'package:go_router/go_router.dart'; + +class LogoutPage extends StatefulWidget { + const LogoutPage({super.key}); + + @override + State createState() => _LogoutPageState(); +} + +class _LogoutPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: BlocConsumer( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + loaded: () { + context.goNamed(RouteConstants.root, + pathParameters: PathParameters().toMap()); + }, + error: (message) { + context.goNamed( + RouteConstants.login, + ); + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar( + // backgroundColor: Colors.red, + // content: Text(message), + // ), + // ); + }, + ); + }, + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return ElevatedButton( + onPressed: () { + context.read().add(const LogoutEvent.logout()); + }, + child: const Text("Logout"), + ); + }, + loading: () => const Center( + child: CircularProgressIndicator(), + ), + ); + }, + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/pestisida_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/pestisida_page.dart new file mode 100644 index 0000000..2eacbb5 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/pestisida_page.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; +import 'package:badges/badges.dart' as badges; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/search_input_pos.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/core/router/app_router.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/pestisida/pestisida_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/widgets/organism/product_list.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../bloc/checkout/checkout_bloc.dart'; + +class PestisidaPage extends StatefulWidget { + const PestisidaPage({super.key}); + + @override + State createState() => _PestisidaPageState(); +} + +class _PestisidaPageState extends State { + late TextEditingController searchController; + @override + void initState() { + context + .read() + .add(const PestisidaEvent.getProductPestisida()); + searchController = TextEditingController(); + super.initState(); + } + + @override + void dispose() { + searchController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Pestisida'), + actions: [ + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + loaded: (checkout, _, __, ___, ____, ______, _____) { + final totalQuantity = checkout.fold( + 0, + (previousValue, element) => + previousValue + element.quantity, + ); + return totalQuantity > 0 + ? badges.Badge( + badgeContent: Text( + totalQuantity.toString(), + style: const TextStyle(color: Colors.white), + ), + child: IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ), + ) + : IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ); + }, + orElse: () => const SizedBox.shrink(), + ); + }, + ), + const SizedBox( + width: 16, + ) + ], + ), + body: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + SearchInput( + controller: searchController, + onChanged: (value) { + if (value.length > 3) { + context + .read() + .add(PestisidaEvent.searchProductPestisida(value)); + } + if (value.isEmpty) { + context + .read() + .add(const PestisidaEvent.fetchAllPestisida()); + } + }, + ), + const SpaceHeight(20.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + error: (message) => Center( + child: Text(message), + ), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (products) { + return ProductList( + title: 'Pestisida', + onSeeAllTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const PestisidaPage())); + }, + items: products, + ); + }, + ); + }, + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/pupuk_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/pupuk_page.dart new file mode 100644 index 0000000..5ea03e8 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/pages/pupuk_page.dart @@ -0,0 +1,133 @@ +import 'package:flutter/material.dart'; +import 'package:badges/badges.dart' as badges; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/search_input.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/pupuk/pupuk_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/widgets/organism/product_list.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/router/app_router.dart'; +import '../bloc/checkout/checkout_bloc.dart'; + +class PupukPage extends StatefulWidget { + const PupukPage({super.key}); + + @override + State createState() => _PupukPageState(); +} + +class _PupukPageState extends State { + late TextEditingController searchController; + + @override + void initState() { + context.read().add(const PupukEvent.getProductPupuk()); + searchController = TextEditingController(); + super.initState(); + } + + @override + void dispose() { + searchController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Pupuk'), + actions: [ + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + loaded: (checkout, _, __, ___, ____, ______, _____) { + final totalQuantity = checkout.fold( + 0, + (previousValue, element) => + previousValue + element.quantity, + ); + return totalQuantity > 0 + ? badges.Badge( + badgeContent: Text( + totalQuantity.toString(), + style: const TextStyle(color: Colors.white), + ), + child: IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ), + ) + : IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ); + }, + orElse: () => const SizedBox.shrink(), + ); + }, + ), + const SizedBox( + width: 16, + ) + ], + ), + body: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + SearchInput( + controller: searchController, + onChanged: (value) { + if (value.length > 3) { + context + .read() + .add(PupukEvent.searchProductPupuk(value)); + } + if (value.isEmpty) { + context.read().add(const PupukEvent.fetchAllPupuk()); + } + }, + ), + const SpaceHeight(20.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + error: (message) => Center( + child: Text(message), + ), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (products) { + return ProductList( + title: 'Pupuk', + onSeeAllTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const PupukPage())); + }, + items: products, + ); + }, + ); + }, + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/banner_slider.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/banner_slider.dart new file mode 100644 index 0000000..33fa156 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/banner_slider.dart @@ -0,0 +1,102 @@ +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/assets/assets.gen.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/discount_response_model.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/core/constants/colors.dart'; + +class BannerSlider extends StatefulWidget { + final List items; + const BannerSlider({super.key, required this.items}); + + @override + State createState() => _BannerSliderState(); +} + +class _BannerSliderState extends State { + int _current = 0; + final CarouselController _controller = CarouselController(); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + CarouselSlider( + items: widget.items.map((discount) { + return Container( + margin: const EdgeInsets.symmetric(horizontal: 8.0), + padding: const EdgeInsets.all(16.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12.0), + color: Colors.greenAccent, + ), + child: Row( + children: [ + Assets.images.imgLogo + .image(height: 50.0, width: 50.0), // Display the logo + const SizedBox(width: 16.0), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + discount.name ?? '', + style: const TextStyle( + fontSize: 24.0, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 8.0), + Text( + discount.description ?? '', + style: const TextStyle(fontSize: 16.0), + textAlign: TextAlign.left, + ), + const SizedBox(height: 8.0), + Text( + '${discount.value}% off', + style: const TextStyle( + fontSize: 20.0, fontWeight: FontWeight.bold), + ), + ], + ), + ), + ], + ), + ); + }).toList(), + carouselController: _controller, + options: CarouselOptions( + autoPlay: true, + aspectRatio: 315 / 152, + viewportFraction: 1, + onPageChanged: (index, reason) { + setState(() { + _current = index; + }); + }, + ), + ), + const SpaceHeight(22.0), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: widget.items.asMap().entries.map((entry) { + return GestureDetector( + onTap: () => _controller.animateToPage(entry.key), + child: Container( + width: _current == entry.key ? 20.0 : 8.0, + height: 8.0, + margin: const EdgeInsets.symmetric(horizontal: 4.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30.0), + color: (Theme.of(context).brightness == Brightness.dark + ? AppColors.grey + : AppColors.primary) + .withOpacity(_current == entry.key ? 0.9 : 0.4)), + ), + ); + }).toList(), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/category_button.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/category_button.dart new file mode 100644 index 0000000..20664de --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/category_button.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + +import '../../../../../core/constants/global_variable.dart'; + +class CategoryButton extends StatelessWidget { + final String imagePath; + final String label; + final VoidCallback onPressed; + + const CategoryButton({ + super.key, + required this.imagePath, + required this.label, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + borderRadius: const BorderRadius.all(Radius.circular(8.0)), + onTap: onPressed, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Image.network( + imagePath.contains('http') + ? imagePath + : '${GlobalVariable.baseUrlImageCategories}$imagePath', + width: 80.0, + height: 80.0, + fit: BoxFit.contain, + ), + SizedBox( + width: 70.0, + child: Text( + label, + style: const TextStyle(), + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/organism/menu_categories.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/organism/menu_categories.dart new file mode 100644 index 0000000..ce73c0f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/organism/menu_categories.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../../bloc/category/category_bloc.dart'; +import '../category_button.dart'; + +class MenuCategories extends StatefulWidget { + const MenuCategories({super.key}); + + @override + State createState() => _MenuCategoriesState(); +} + +class _MenuCategoriesState extends State { + @override + void initState() { + context.read().add(const CategoryEvent.getCategories()); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + loaded: (categories) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ...categories.map( + (category) => Flexible( + child: CategoryButton( + imagePath: category.image!, + label: category.name!, + onPressed: () {}), + ), + ) + ], + ); + }, + loading: () => const Center( + child: CircularProgressIndicator(), + ), + error: (message) => Center( + child: Text(message), + ), + ); + // return Row( + // children: [ + // Flexible( + // child: CategoryButton( + // imagePath: Assets.images.categories.menuBestseller.path, + // label: 'Bestseller', + // onPressed: () {}, + // ), + // ), + // Flexible( + // child: CategoryButton( + // imagePath: Assets.images.categories.menuFlashsale.path, + // label: 'Flashsale', + // onPressed: () {}, + // ), + // ), + // Flexible( + // child: CategoryButton( + // imagePath: Assets.images.categories.menuToprated.path, + // label: 'Toprated', + // onPressed: () {}, + // ), + // ), + // Flexible( + // child: CategoryButton( + // imagePath: Assets.images.categories.menuMore.path, + // label: 'More', + // onPressed: () {}, + // ), + // ), + // ], + // ); + }, + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/organism/product_list.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/organism/product_list.dart new file mode 100644 index 0000000..b963841 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/organism/product_list.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import '../../../../../../core/components/spaces.dart'; +import '../product_card.dart'; +import '../title_content.dart'; + +class ProductList extends StatelessWidget { + final String title; + final VoidCallback onSeeAllTap; + final List items; + + const ProductList({ + super.key, + required this.title, + required this.onSeeAllTap, + required this.items, + }); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TitleContent( + title: title, + onSeeAllTap: onSeeAllTap, + ), + const SpaceHeight(20.0), + GridView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 10.0, + mainAxisSpacing: 55.0, + ), + itemCount: items.length, + itemBuilder: (context, index) => ProductCard( + data: items[index], + ), + ) + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/product_card.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/product_card.dart new file mode 100644 index 0000000..e4b2935 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/product_card.dart @@ -0,0 +1,105 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.dart'; +import 'package:go_router/go_router.dart'; +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/router/app_router.dart'; + +class ProductCard extends StatelessWidget { + final Product data; + const ProductCard({super.key, required this.data}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + context.goNamed( + RouteConstants.productDetail, + pathParameters: PathParameters().toMap(), + extra: data.id, + ); + }, + child: Stack( + children: [ + Container( + padding: const EdgeInsets.all(8.0), + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(10.0)), + boxShadow: [ + BoxShadow( + color: AppColors.black.withOpacity(0.05), + blurRadius: 7.0, + spreadRadius: 0, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(5.0), + child: Image.network( + data.image!.contains('http') + ? data.image! + : '${GlobalVariable.baseUrlImage}${data.image}', + width: 170.0, + height: 90.0, + fit: BoxFit.cover, + ), + ), + const SpaceHeight(10.0), + Flexible( + child: Text( + data.name!, + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w400, + ), + ), + ), + Text( + data.price!.currencyFormatRp, + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + color: AppColors.primary, + ), + ), + ], + ), + ), + Align( + alignment: Alignment.bottomRight, + child: IconButton( + onPressed: () { + context.read().add(CheckoutEvent.addItem(data)); + }, + icon: Container( + padding: const EdgeInsets.all(4.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(50.0), + color: AppColors.white, + boxShadow: [ + BoxShadow( + color: AppColors.black.withOpacity(0.1), + blurRadius: 10.0, + offset: const Offset(0, 2), + blurStyle: BlurStyle.outer, + ), + ], + ), + child: Assets.icons.order.svg(), + ), + ), + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/product_slider.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/product_slider.dart new file mode 100644 index 0000000..c986ea0 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/product_slider.dart @@ -0,0 +1,54 @@ +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:flutter/material.dart'; + +class ProductSlider extends StatefulWidget { + final List items; + const ProductSlider({super.key, required this.items}); + + @override + State createState() => _ProductSliderState(); +} + +class _ProductSliderState extends State { + int _current = 0; + final CarouselController _controller = CarouselController(); + + @override + Widget build(BuildContext context) { + final total = widget.items.length; + return Stack( + alignment: Alignment.bottomLeft, + children: [ + CarouselSlider( + items: widget.items + .map((e) => Image.asset( + e, + height: 206.0, + width: MediaQuery.of(context).size.width, + fit: BoxFit.fill, + )) + .toList(), + carouselController: _controller, + options: CarouselOptions( + autoPlay: true, + aspectRatio: 325 / 300, + viewportFraction: 1, + onPageChanged: (index, reason) { + _current = index; + setState(() {}); + }, + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + '${_current + 1}/$total Foto', + style: const TextStyle( + color: Colors.white, + ), + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/search_tile.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/search_tile.dart new file mode 100644 index 0000000..8dbb78b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/search_tile.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../models/product_model.dart'; + +class SearchTile extends StatelessWidget { + final ProductModel data; + const SearchTile({super.key, required this.data}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(10.0)), + child: Image.asset( + data.images.first, + width: 68.0, + height: 68.0, + ), + ), + const SpaceWidth(14.0), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data.name, + style: const TextStyle( + fontSize: 16, + ), + overflow: TextOverflow.ellipsis, + ), + Row( + children: [ + Text( + data.priceFormat, + style: const TextStyle( + color: AppColors.primary, + fontSize: 12, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ], + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/title_content.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/title_content.dart new file mode 100644 index 0000000..6017dd4 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/home/widgets/title_content.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import '../../../../../core/constants/colors.dart'; + +class TitleContent extends StatelessWidget { + final String title; + final VoidCallback onSeeAllTap; + + const TitleContent({ + super.key, + required this.title, + required this.onSeeAllTap, + }); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: const TextStyle( + fontWeight: FontWeight.w500, + fontSize: 16.0, + ), + ), + InkWell( + onTap: onSeeAllTap, + child: const Text( + 'Lihat Semua', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + color: AppColors.primary, + ), + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/intro/splash_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/intro/splash_page.dart new file mode 100644 index 0000000..7aa8ce8 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/intro/splash_page.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/assets/assets.gen.dart'; +import 'package:flutter_pos_ecommerce/core/router/app_router.dart'; +import 'package:go_router/go_router.dart'; +import '../../../../core/constants/colors.dart'; +import '../../data/datasources/auth_local_datasource.dart'; + +class SplashPage extends StatefulWidget { + const SplashPage({super.key}); + + @override + State createState() => _SplashPageState(); +} + +class _SplashPageState extends State { + @override + void initState() { + super.initState(); + _initializePage(); + } + + Future _initializePage() async { + await Future.delayed(const Duration(seconds: 3)); + final authData = await AuthLocalDatasource().getAuthData(); + final role = authData?.user?.roles; + // print('Role: $role'); + if (role == 'owner' || role == 'kasir') { + context.goNamed(RouteConstants.dashboardPos); + } else if (role == 'member') { + context.goNamed(RouteConstants.root, + pathParameters: PathParameters().toMap()); + } else if (role == null || role.isEmpty) { + context.goNamed( + RouteConstants.login, + ); + } else { + context.goNamed( + RouteConstants.login, + ); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 50.0), + child: Assets.images.imgLogo.image(), + ), + ), + bottomNavigationBar: const Padding( + padding: EdgeInsets.all(30.0), + child: Text( + 'Nusa Dua Agro', + style: TextStyle( + color: AppColors.grey, + fontWeight: FontWeight.w600, + ), + textAlign: TextAlign.center, + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_bloc.dart new file mode 100644 index 0000000..60077ce --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_bloc.dart @@ -0,0 +1,31 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/rajaongkir_remote_datasource.dart'; + +import '../../../../data/models/responses/cost_response_model.dart'; + +part 'cost_bloc.freezed.dart'; +part 'cost_event.dart'; +part 'cost_state.dart'; + +class CostBloc extends Bloc { + final RajaongkirRemoteDatasource _rajaongkirRemoteDatasource; + CostBloc( + this._rajaongkirRemoteDatasource, + ) : super(const _Initial()) { + on<_GetCost>((event, emit) async { + emit(const _Loading()); + final response = await _rajaongkirRemoteDatasource.getCost( + event.origin, + event.destination, + 'jne', + ); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r)), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_bloc.freezed.dart new file mode 100644 index 0000000..2850172 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_bloc.freezed.dart @@ -0,0 +1,955 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'cost_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$CostEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function( + String origin, String destination, int weight, String courier) + getCost, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function( + String origin, String destination, int weight, String courier)? + getCost, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function( + String origin, String destination, int weight, String courier)? + getCost, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetCost value) getCost, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetCost value)? getCost, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetCost value)? getCost, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CostEventCopyWith<$Res> { + factory $CostEventCopyWith(CostEvent value, $Res Function(CostEvent) then) = + _$CostEventCopyWithImpl<$Res, CostEvent>; +} + +/// @nodoc +class _$CostEventCopyWithImpl<$Res, $Val extends CostEvent> + implements $CostEventCopyWith<$Res> { + _$CostEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$CostEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'CostEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function( + String origin, String destination, int weight, String courier) + getCost, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function( + String origin, String destination, int weight, String courier)? + getCost, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function( + String origin, String destination, int weight, String courier)? + getCost, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetCost value) getCost, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetCost value)? getCost, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetCost value)? getCost, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements CostEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetCostImplCopyWith<$Res> { + factory _$$GetCostImplCopyWith( + _$GetCostImpl value, $Res Function(_$GetCostImpl) then) = + __$$GetCostImplCopyWithImpl<$Res>; + @useResult + $Res call({String origin, String destination, int weight, String courier}); +} + +/// @nodoc +class __$$GetCostImplCopyWithImpl<$Res> + extends _$CostEventCopyWithImpl<$Res, _$GetCostImpl> + implements _$$GetCostImplCopyWith<$Res> { + __$$GetCostImplCopyWithImpl( + _$GetCostImpl _value, $Res Function(_$GetCostImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? origin = null, + Object? destination = null, + Object? weight = null, + Object? courier = null, + }) { + return _then(_$GetCostImpl( + origin: null == origin + ? _value.origin + : origin // ignore: cast_nullable_to_non_nullable + as String, + destination: null == destination + ? _value.destination + : destination // ignore: cast_nullable_to_non_nullable + as String, + weight: null == weight + ? _value.weight + : weight // ignore: cast_nullable_to_non_nullable + as int, + courier: null == courier + ? _value.courier + : courier // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$GetCostImpl implements _GetCost { + const _$GetCostImpl( + {required this.origin, + required this.destination, + required this.weight, + required this.courier}); + + @override + final String origin; + @override + final String destination; + @override + final int weight; + @override + final String courier; + + @override + String toString() { + return 'CostEvent.getCost(origin: $origin, destination: $destination, weight: $weight, courier: $courier)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GetCostImpl && + (identical(other.origin, origin) || other.origin == origin) && + (identical(other.destination, destination) || + other.destination == destination) && + (identical(other.weight, weight) || other.weight == weight) && + (identical(other.courier, courier) || other.courier == courier)); + } + + @override + int get hashCode => + Object.hash(runtimeType, origin, destination, weight, courier); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$GetCostImplCopyWith<_$GetCostImpl> get copyWith => + __$$GetCostImplCopyWithImpl<_$GetCostImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function( + String origin, String destination, int weight, String courier) + getCost, + }) { + return getCost(origin, destination, weight, courier); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function( + String origin, String destination, int weight, String courier)? + getCost, + }) { + return getCost?.call(origin, destination, weight, courier); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function( + String origin, String destination, int weight, String courier)? + getCost, + required TResult orElse(), + }) { + if (getCost != null) { + return getCost(origin, destination, weight, courier); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetCost value) getCost, + }) { + return getCost(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetCost value)? getCost, + }) { + return getCost?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetCost value)? getCost, + required TResult orElse(), + }) { + if (getCost != null) { + return getCost(this); + } + return orElse(); + } +} + +abstract class _GetCost implements CostEvent { + const factory _GetCost( + {required final String origin, + required final String destination, + required final int weight, + required final String courier}) = _$GetCostImpl; + + String get origin; + String get destination; + int get weight; + String get courier; + @JsonKey(ignore: true) + _$$GetCostImplCopyWith<_$GetCostImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$CostState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(CostResponseModel costResponseModel) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(CostResponseModel costResponseModel)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(CostResponseModel costResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CostStateCopyWith<$Res> { + factory $CostStateCopyWith(CostState value, $Res Function(CostState) then) = + _$CostStateCopyWithImpl<$Res, CostState>; +} + +/// @nodoc +class _$CostStateCopyWithImpl<$Res, $Val extends CostState> + implements $CostStateCopyWith<$Res> { + _$CostStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$CostStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'CostState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(CostResponseModel costResponseModel) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(CostResponseModel costResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(CostResponseModel costResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements CostState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$CostStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'CostState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(CostResponseModel costResponseModel) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(CostResponseModel costResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(CostResponseModel costResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements CostState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({CostResponseModel costResponseModel}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$CostStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? costResponseModel = null, + }) { + return _then(_$LoadedImpl( + null == costResponseModel + ? _value.costResponseModel + : costResponseModel // ignore: cast_nullable_to_non_nullable + as CostResponseModel, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(this.costResponseModel); + + @override + final CostResponseModel costResponseModel; + + @override + String toString() { + return 'CostState.loaded(costResponseModel: $costResponseModel)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + (identical(other.costResponseModel, costResponseModel) || + other.costResponseModel == costResponseModel)); + } + + @override + int get hashCode => Object.hash(runtimeType, costResponseModel); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(CostResponseModel costResponseModel) loaded, + required TResult Function(String message) error, + }) { + return loaded(costResponseModel); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(CostResponseModel costResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(costResponseModel); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(CostResponseModel costResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(costResponseModel); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements CostState { + const factory _Loaded(final CostResponseModel costResponseModel) = + _$LoadedImpl; + + CostResponseModel get costResponseModel; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$CostStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'CostState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(CostResponseModel costResponseModel) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(CostResponseModel costResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(CostResponseModel costResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements CostState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_event.dart new file mode 100644 index 0000000..c1dab55 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_event.dart @@ -0,0 +1,12 @@ +part of 'cost_bloc.dart'; + +@freezed +class CostEvent with _$CostEvent { + const factory CostEvent.started() = _Started; + const factory CostEvent.getCost({ + required String origin, + required String destination, + required int weight, + required String courier, + }) = _GetCost; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_state.dart new file mode 100644 index 0000000..578798b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/cost/cost_state.dart @@ -0,0 +1,9 @@ +part of 'cost_bloc.dart'; + +@freezed +class CostState with _$CostState { + const factory CostState.initial() = _Initial; + const factory CostState.loading() = _Loading; + const factory CostState.loaded(CostResponseModel costResponseModel) = _Loaded; + const factory CostState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_bloc.dart new file mode 100644 index 0000000..7109445 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_bloc.dart @@ -0,0 +1,27 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/order_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/history_order_response_model.dart'; + +part 'history_order_bloc.freezed.dart'; +part 'history_order_event.dart'; +part 'history_order_state.dart'; + +class HistoryOrderBloc extends Bloc { + final OrderRemoteDatasource orderRemoteDatasource; + HistoryOrderBloc( + this.orderRemoteDatasource, + ) : super(const _HistoryOrderState(status: HistoryOrderStateStatus.initial)) { + on<_HistoryOrder>((event, emit) async { + final response = await orderRemoteDatasource.getOrders(); + response.fold( + (l) => emit(_HistoryOrderState( + status: HistoryOrderStateStatus.error, errorMessage: l)), + (r) => emit(_HistoryOrderState( + status: HistoryOrderStateStatus.loaded, orders: r)), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_bloc.freezed.dart new file mode 100644 index 0000000..4c7879e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_bloc.freezed.dart @@ -0,0 +1,445 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'history_order_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$HistoryOrderEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getHistoryOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getHistoryOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getHistoryOrder, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_HistoryOrder value) getHistoryOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_HistoryOrder value)? getHistoryOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_HistoryOrder value)? getHistoryOrder, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $HistoryOrderEventCopyWith<$Res> { + factory $HistoryOrderEventCopyWith( + HistoryOrderEvent value, $Res Function(HistoryOrderEvent) then) = + _$HistoryOrderEventCopyWithImpl<$Res, HistoryOrderEvent>; +} + +/// @nodoc +class _$HistoryOrderEventCopyWithImpl<$Res, $Val extends HistoryOrderEvent> + implements $HistoryOrderEventCopyWith<$Res> { + _$HistoryOrderEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$HistoryOrderEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'HistoryOrderEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getHistoryOrder, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getHistoryOrder, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getHistoryOrder, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_HistoryOrder value) getHistoryOrder, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_HistoryOrder value)? getHistoryOrder, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_HistoryOrder value)? getHistoryOrder, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements HistoryOrderEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$HistoryOrderImplCopyWith<$Res> { + factory _$$HistoryOrderImplCopyWith( + _$HistoryOrderImpl value, $Res Function(_$HistoryOrderImpl) then) = + __$$HistoryOrderImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$HistoryOrderImplCopyWithImpl<$Res> + extends _$HistoryOrderEventCopyWithImpl<$Res, _$HistoryOrderImpl> + implements _$$HistoryOrderImplCopyWith<$Res> { + __$$HistoryOrderImplCopyWithImpl( + _$HistoryOrderImpl _value, $Res Function(_$HistoryOrderImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$HistoryOrderImpl implements _HistoryOrder { + const _$HistoryOrderImpl(); + + @override + String toString() { + return 'HistoryOrderEvent.getHistoryOrder()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$HistoryOrderImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getHistoryOrder, + }) { + return getHistoryOrder(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getHistoryOrder, + }) { + return getHistoryOrder?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getHistoryOrder, + required TResult orElse(), + }) { + if (getHistoryOrder != null) { + return getHistoryOrder(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_HistoryOrder value) getHistoryOrder, + }) { + return getHistoryOrder(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_HistoryOrder value)? getHistoryOrder, + }) { + return getHistoryOrder?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_HistoryOrder value)? getHistoryOrder, + required TResult orElse(), + }) { + if (getHistoryOrder != null) { + return getHistoryOrder(this); + } + return orElse(); + } +} + +abstract class _HistoryOrder implements HistoryOrderEvent { + const factory _HistoryOrder() = _$HistoryOrderImpl; +} + +/// @nodoc +mixin _$HistoryOrderState { + HistoryOrderStateStatus get status => throw _privateConstructorUsedError; + HistoryOrderResponseModel? get orders => throw _privateConstructorUsedError; + String get errorMessage => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $HistoryOrderStateCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $HistoryOrderStateCopyWith<$Res> { + factory $HistoryOrderStateCopyWith( + HistoryOrderState value, $Res Function(HistoryOrderState) then) = + _$HistoryOrderStateCopyWithImpl<$Res, HistoryOrderState>; + @useResult + $Res call( + {HistoryOrderStateStatus status, + HistoryOrderResponseModel? orders, + String errorMessage}); +} + +/// @nodoc +class _$HistoryOrderStateCopyWithImpl<$Res, $Val extends HistoryOrderState> + implements $HistoryOrderStateCopyWith<$Res> { + _$HistoryOrderStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = null, + Object? orders = freezed, + Object? errorMessage = null, + }) { + return _then(_value.copyWith( + status: null == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as HistoryOrderStateStatus, + orders: freezed == orders + ? _value.orders + : orders // ignore: cast_nullable_to_non_nullable + as HistoryOrderResponseModel?, + errorMessage: null == errorMessage + ? _value.errorMessage + : errorMessage // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$HistoryOrderStateImplCopyWith<$Res> + implements $HistoryOrderStateCopyWith<$Res> { + factory _$$HistoryOrderStateImplCopyWith(_$HistoryOrderStateImpl value, + $Res Function(_$HistoryOrderStateImpl) then) = + __$$HistoryOrderStateImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {HistoryOrderStateStatus status, + HistoryOrderResponseModel? orders, + String errorMessage}); +} + +/// @nodoc +class __$$HistoryOrderStateImplCopyWithImpl<$Res> + extends _$HistoryOrderStateCopyWithImpl<$Res, _$HistoryOrderStateImpl> + implements _$$HistoryOrderStateImplCopyWith<$Res> { + __$$HistoryOrderStateImplCopyWithImpl(_$HistoryOrderStateImpl _value, + $Res Function(_$HistoryOrderStateImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = null, + Object? orders = freezed, + Object? errorMessage = null, + }) { + return _then(_$HistoryOrderStateImpl( + status: null == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as HistoryOrderStateStatus, + orders: freezed == orders + ? _value.orders + : orders // ignore: cast_nullable_to_non_nullable + as HistoryOrderResponseModel?, + errorMessage: null == errorMessage + ? _value.errorMessage + : errorMessage // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$HistoryOrderStateImpl implements _HistoryOrderState { + const _$HistoryOrderStateImpl( + {this.status = HistoryOrderStateStatus.initial, + this.orders = null, + this.errorMessage = ''}); + + @override + @JsonKey() + final HistoryOrderStateStatus status; + @override + @JsonKey() + final HistoryOrderResponseModel? orders; + @override + @JsonKey() + final String errorMessage; + + @override + String toString() { + return 'HistoryOrderState(status: $status, orders: $orders, errorMessage: $errorMessage)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$HistoryOrderStateImpl && + (identical(other.status, status) || other.status == status) && + (identical(other.orders, orders) || other.orders == orders) && + (identical(other.errorMessage, errorMessage) || + other.errorMessage == errorMessage)); + } + + @override + int get hashCode => Object.hash(runtimeType, status, orders, errorMessage); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$HistoryOrderStateImplCopyWith<_$HistoryOrderStateImpl> get copyWith => + __$$HistoryOrderStateImplCopyWithImpl<_$HistoryOrderStateImpl>( + this, _$identity); +} + +abstract class _HistoryOrderState implements HistoryOrderState { + const factory _HistoryOrderState( + {final HistoryOrderStateStatus status, + final HistoryOrderResponseModel? orders, + final String errorMessage}) = _$HistoryOrderStateImpl; + + @override + HistoryOrderStateStatus get status; + @override + HistoryOrderResponseModel? get orders; + @override + String get errorMessage; + @override + @JsonKey(ignore: true) + _$$HistoryOrderStateImplCopyWith<_$HistoryOrderStateImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_event.dart new file mode 100644 index 0000000..820b4f0 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_event.dart @@ -0,0 +1,7 @@ +part of 'history_order_bloc.dart'; + +@freezed +class HistoryOrderEvent with _$HistoryOrderEvent { + const factory HistoryOrderEvent.started() = _Started; + const factory HistoryOrderEvent.getHistoryOrder() = _HistoryOrder; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_state.dart new file mode 100644 index 0000000..274d419 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/history_order/history_order_state.dart @@ -0,0 +1,17 @@ +part of 'history_order_bloc.dart'; + +enum HistoryOrderStateStatus { initial, loading, loaded, error } + +@freezed +class HistoryOrderState with _$HistoryOrderState { + // const factory HistoryOrderState.initial() = _Initial; + // const factory HistoryOrderState.loading() = _Loading; + // const factory HistoryOrderState.loaded(HistoryOrderResponseModel orders) = _Loaded; + // const factory HistoryOrderState.error(String message) = _Error; + const factory HistoryOrderState({ + @Default(HistoryOrderStateStatus.initial) HistoryOrderStateStatus status, + @Default(null) HistoryOrderResponseModel? orders, + @Default('') String errorMessage, + }) = _HistoryOrderState; + +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_bloc.dart new file mode 100644 index 0000000..578ed7c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_bloc.dart @@ -0,0 +1,60 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/order_remote_datasource.dart'; + +import '../../../../data/models/requests/order_request_model.dart'; +import '../../../../data/models/responses/order_response_model.dart'; +import '../../../home/models/product_quantity.dart'; + +part 'order_bloc.freezed.dart'; +part 'order_event.dart'; +part 'order_state.dart'; + +class OrderBloc extends Bloc { + final OrderRemoteDatasource _orderRemoteDatasource; + OrderBloc( + this._orderRemoteDatasource, + ) : super(const _Initial()) { + on<_DoOrder>((event, emit) async { + emit(const _Loading()); + + final subTotal = event.products.fold( + 0, + (previousValue, element) => + previousValue + (element.product.price! * element.quantity)); + + final totalDiscount = (event.discount / 100) * subTotal; + final total = subTotal - totalDiscount; + + + print('SubTotal: $subTotal'); + print('Discount: $totalDiscount'); + print('Discount event: ${event.discount}'); + print('Total after discount: $total'); + + final orderRequestData = OrderRequestModel( + addressId: event.addressId, + paymentMethod: event.paymentMethod, + shippingService: event.shippingService, + shippingCost: event.shippingCost, + paymentVaName: event.paymentVaName, + subtotal: subTotal, + discount: event.discount, + totalCost: total.toInt(), + items: event.products + .map((e) => Item(productId: e.product.id!, quantity: e.quantity)) + .toList()); + + print("data input ${orderRequestData.toJson()}"); + print('total cost bloc $total'); + + final response = await _orderRemoteDatasource.order(orderRequestData); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r)), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_bloc.freezed.dart new file mode 100644 index 0000000..3d2383f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_bloc.freezed.dart @@ -0,0 +1,1072 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'order_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$OrderEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function( + int addressId, + int discount, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName, + List products) + doOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function( + int addressId, + int discount, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName, + List products)? + doOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function( + int addressId, + int discount, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName, + List products)? + doOrder, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_DoOrder value) doOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_DoOrder value)? doOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_DoOrder value)? doOrder, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $OrderEventCopyWith<$Res> { + factory $OrderEventCopyWith( + OrderEvent value, $Res Function(OrderEvent) then) = + _$OrderEventCopyWithImpl<$Res, OrderEvent>; +} + +/// @nodoc +class _$OrderEventCopyWithImpl<$Res, $Val extends OrderEvent> + implements $OrderEventCopyWith<$Res> { + _$OrderEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$OrderEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'OrderEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function( + int addressId, + int discount, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName, + List products) + doOrder, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function( + int addressId, + int discount, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName, + List products)? + doOrder, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function( + int addressId, + int discount, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName, + List products)? + doOrder, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_DoOrder value) doOrder, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_DoOrder value)? doOrder, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_DoOrder value)? doOrder, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements OrderEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$DoOrderImplCopyWith<$Res> { + factory _$$DoOrderImplCopyWith( + _$DoOrderImpl value, $Res Function(_$DoOrderImpl) then) = + __$$DoOrderImplCopyWithImpl<$Res>; + @useResult + $Res call( + {int addressId, + int discount, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName, + List products}); +} + +/// @nodoc +class __$$DoOrderImplCopyWithImpl<$Res> + extends _$OrderEventCopyWithImpl<$Res, _$DoOrderImpl> + implements _$$DoOrderImplCopyWith<$Res> { + __$$DoOrderImplCopyWithImpl( + _$DoOrderImpl _value, $Res Function(_$DoOrderImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? addressId = null, + Object? discount = null, + Object? paymentMethod = null, + Object? shippingService = null, + Object? shippingCost = null, + Object? paymentVaName = null, + Object? products = null, + }) { + return _then(_$DoOrderImpl( + addressId: null == addressId + ? _value.addressId + : addressId // ignore: cast_nullable_to_non_nullable + as int, + discount: null == discount + ? _value.discount + : discount // ignore: cast_nullable_to_non_nullable + as int, + paymentMethod: null == paymentMethod + ? _value.paymentMethod + : paymentMethod // ignore: cast_nullable_to_non_nullable + as String, + shippingService: null == shippingService + ? _value.shippingService + : shippingService // ignore: cast_nullable_to_non_nullable + as String, + shippingCost: null == shippingCost + ? _value.shippingCost + : shippingCost // ignore: cast_nullable_to_non_nullable + as int, + paymentVaName: null == paymentVaName + ? _value.paymentVaName + : paymentVaName // ignore: cast_nullable_to_non_nullable + as String, + products: null == products + ? _value._products + : products // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$DoOrderImpl implements _DoOrder { + const _$DoOrderImpl( + {required this.addressId, + required this.discount, + required this.paymentMethod, + required this.shippingService, + required this.shippingCost, + required this.paymentVaName, + required final List products}) + : _products = products; + + @override + final int addressId; + @override + final int discount; + @override + final String paymentMethod; + @override + final String shippingService; + @override + final int shippingCost; + @override + final String paymentVaName; + final List _products; + @override + List get products { + if (_products is EqualUnmodifiableListView) return _products; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_products); + } + + @override + String toString() { + return 'OrderEvent.doOrder(addressId: $addressId, discount: $discount, paymentMethod: $paymentMethod, shippingService: $shippingService, shippingCost: $shippingCost, paymentVaName: $paymentVaName, products: $products)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$DoOrderImpl && + (identical(other.addressId, addressId) || + other.addressId == addressId) && + (identical(other.discount, discount) || + other.discount == discount) && + (identical(other.paymentMethod, paymentMethod) || + other.paymentMethod == paymentMethod) && + (identical(other.shippingService, shippingService) || + other.shippingService == shippingService) && + (identical(other.shippingCost, shippingCost) || + other.shippingCost == shippingCost) && + (identical(other.paymentVaName, paymentVaName) || + other.paymentVaName == paymentVaName) && + const DeepCollectionEquality().equals(other._products, _products)); + } + + @override + int get hashCode => Object.hash( + runtimeType, + addressId, + discount, + paymentMethod, + shippingService, + shippingCost, + paymentVaName, + const DeepCollectionEquality().hash(_products)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$DoOrderImplCopyWith<_$DoOrderImpl> get copyWith => + __$$DoOrderImplCopyWithImpl<_$DoOrderImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function( + int addressId, + int discount, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName, + List products) + doOrder, + }) { + return doOrder(addressId, discount, paymentMethod, shippingService, + shippingCost, paymentVaName, products); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function( + int addressId, + int discount, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName, + List products)? + doOrder, + }) { + return doOrder?.call(addressId, discount, paymentMethod, shippingService, + shippingCost, paymentVaName, products); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function( + int addressId, + int discount, + String paymentMethod, + String shippingService, + int shippingCost, + String paymentVaName, + List products)? + doOrder, + required TResult orElse(), + }) { + if (doOrder != null) { + return doOrder(addressId, discount, paymentMethod, shippingService, + shippingCost, paymentVaName, products); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_DoOrder value) doOrder, + }) { + return doOrder(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_DoOrder value)? doOrder, + }) { + return doOrder?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_DoOrder value)? doOrder, + required TResult orElse(), + }) { + if (doOrder != null) { + return doOrder(this); + } + return orElse(); + } +} + +abstract class _DoOrder implements OrderEvent { + const factory _DoOrder( + {required final int addressId, + required final int discount, + required final String paymentMethod, + required final String shippingService, + required final int shippingCost, + required final String paymentVaName, + required final List products}) = _$DoOrderImpl; + + int get addressId; + int get discount; + String get paymentMethod; + String get shippingService; + int get shippingCost; + String get paymentVaName; + List get products; + @JsonKey(ignore: true) + _$$DoOrderImplCopyWith<_$DoOrderImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$OrderState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderResponseModel orderResponseModel) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderResponseModel orderResponseModel)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderResponseModel orderResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $OrderStateCopyWith<$Res> { + factory $OrderStateCopyWith( + OrderState value, $Res Function(OrderState) then) = + _$OrderStateCopyWithImpl<$Res, OrderState>; +} + +/// @nodoc +class _$OrderStateCopyWithImpl<$Res, $Val extends OrderState> + implements $OrderStateCopyWith<$Res> { + _$OrderStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$OrderStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'OrderState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderResponseModel orderResponseModel) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderResponseModel orderResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderResponseModel orderResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements OrderState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$OrderStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'OrderState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderResponseModel orderResponseModel) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderResponseModel orderResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderResponseModel orderResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements OrderState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({OrderResponseModel orderResponseModel}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$OrderStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? orderResponseModel = null, + }) { + return _then(_$LoadedImpl( + null == orderResponseModel + ? _value.orderResponseModel + : orderResponseModel // ignore: cast_nullable_to_non_nullable + as OrderResponseModel, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(this.orderResponseModel); + + @override + final OrderResponseModel orderResponseModel; + + @override + String toString() { + return 'OrderState.loaded(orderResponseModel: $orderResponseModel)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + (identical(other.orderResponseModel, orderResponseModel) || + other.orderResponseModel == orderResponseModel)); + } + + @override + int get hashCode => Object.hash(runtimeType, orderResponseModel); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderResponseModel orderResponseModel) loaded, + required TResult Function(String message) error, + }) { + return loaded(orderResponseModel); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderResponseModel orderResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(orderResponseModel); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderResponseModel orderResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(orderResponseModel); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements OrderState { + const factory _Loaded(final OrderResponseModel orderResponseModel) = + _$LoadedImpl; + + OrderResponseModel get orderResponseModel; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$OrderStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'OrderState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderResponseModel orderResponseModel) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderResponseModel orderResponseModel)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderResponseModel orderResponseModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements OrderState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_event.dart new file mode 100644 index 0000000..26bcfd9 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_event.dart @@ -0,0 +1,15 @@ +part of 'order_bloc.dart'; + +@freezed +class OrderEvent with _$OrderEvent { + const factory OrderEvent.started() = _Started; + const factory OrderEvent.doOrder({ + required int addressId, + required int discount, + required String paymentMethod, + required String shippingService, + required int shippingCost, + required String paymentVaName, + required List products, + }) = _DoOrder; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_state.dart new file mode 100644 index 0000000..f8931ab --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order/order_state.dart @@ -0,0 +1,11 @@ +part of 'order_bloc.dart'; + +@freezed +class OrderState with _$OrderState { + const factory OrderState.initial() = _Initial; + const factory OrderState.loading() = _Loading; + const factory OrderState.loaded( + OrderResponseModel orderResponseModel, + ) = _Loaded; + const factory OrderState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_bloc.dart new file mode 100644 index 0000000..2e2f6af --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_bloc.dart @@ -0,0 +1,26 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/order_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/order_detail_response_model.dart'; + +part 'order_detail_bloc.freezed.dart'; +part 'order_detail_event.dart'; +part 'order_detail_state.dart'; + +class OrderDetailBloc extends Bloc { + final OrderRemoteDatasource orderRemoteDatasource; + OrderDetailBloc( + this.orderRemoteDatasource, + ) : super(const _Initial()) { + on<_GetOrderDetail>((event, emit) async { + emit(const _Loading()); + final response = await orderRemoteDatasource.getOrderById(event.orderId); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r.order!)), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_bloc.freezed.dart new file mode 100644 index 0000000..e151391 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_bloc.freezed.dart @@ -0,0 +1,902 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'order_detail_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$OrderDetailEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(int orderId) getOrderDetail, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(int orderId)? getOrderDetail, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(int orderId)? getOrderDetail, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetOrderDetail value) getOrderDetail, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetOrderDetail value)? getOrderDetail, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetOrderDetail value)? getOrderDetail, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $OrderDetailEventCopyWith<$Res> { + factory $OrderDetailEventCopyWith( + OrderDetailEvent value, $Res Function(OrderDetailEvent) then) = + _$OrderDetailEventCopyWithImpl<$Res, OrderDetailEvent>; +} + +/// @nodoc +class _$OrderDetailEventCopyWithImpl<$Res, $Val extends OrderDetailEvent> + implements $OrderDetailEventCopyWith<$Res> { + _$OrderDetailEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$OrderDetailEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'OrderDetailEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(int orderId) getOrderDetail, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(int orderId)? getOrderDetail, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(int orderId)? getOrderDetail, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetOrderDetail value) getOrderDetail, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetOrderDetail value)? getOrderDetail, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetOrderDetail value)? getOrderDetail, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements OrderDetailEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetOrderDetailImplCopyWith<$Res> { + factory _$$GetOrderDetailImplCopyWith(_$GetOrderDetailImpl value, + $Res Function(_$GetOrderDetailImpl) then) = + __$$GetOrderDetailImplCopyWithImpl<$Res>; + @useResult + $Res call({int orderId}); +} + +/// @nodoc +class __$$GetOrderDetailImplCopyWithImpl<$Res> + extends _$OrderDetailEventCopyWithImpl<$Res, _$GetOrderDetailImpl> + implements _$$GetOrderDetailImplCopyWith<$Res> { + __$$GetOrderDetailImplCopyWithImpl( + _$GetOrderDetailImpl _value, $Res Function(_$GetOrderDetailImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? orderId = null, + }) { + return _then(_$GetOrderDetailImpl( + null == orderId + ? _value.orderId + : orderId // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$GetOrderDetailImpl implements _GetOrderDetail { + const _$GetOrderDetailImpl(this.orderId); + + @override + final int orderId; + + @override + String toString() { + return 'OrderDetailEvent.getOrderDetail(orderId: $orderId)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GetOrderDetailImpl && + (identical(other.orderId, orderId) || other.orderId == orderId)); + } + + @override + int get hashCode => Object.hash(runtimeType, orderId); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$GetOrderDetailImplCopyWith<_$GetOrderDetailImpl> get copyWith => + __$$GetOrderDetailImplCopyWithImpl<_$GetOrderDetailImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(int orderId) getOrderDetail, + }) { + return getOrderDetail(orderId); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(int orderId)? getOrderDetail, + }) { + return getOrderDetail?.call(orderId); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(int orderId)? getOrderDetail, + required TResult orElse(), + }) { + if (getOrderDetail != null) { + return getOrderDetail(orderId); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetOrderDetail value) getOrderDetail, + }) { + return getOrderDetail(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetOrderDetail value)? getOrderDetail, + }) { + return getOrderDetail?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetOrderDetail value)? getOrderDetail, + required TResult orElse(), + }) { + if (getOrderDetail != null) { + return getOrderDetail(this); + } + return orElse(); + } +} + +abstract class _GetOrderDetail implements OrderDetailEvent { + const factory _GetOrderDetail(final int orderId) = _$GetOrderDetailImpl; + + int get orderId; + @JsonKey(ignore: true) + _$$GetOrderDetailImplCopyWith<_$GetOrderDetailImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$OrderDetailState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderDetail orderDetail) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderDetail orderDetail)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderDetail orderDetail)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $OrderDetailStateCopyWith<$Res> { + factory $OrderDetailStateCopyWith( + OrderDetailState value, $Res Function(OrderDetailState) then) = + _$OrderDetailStateCopyWithImpl<$Res, OrderDetailState>; +} + +/// @nodoc +class _$OrderDetailStateCopyWithImpl<$Res, $Val extends OrderDetailState> + implements $OrderDetailStateCopyWith<$Res> { + _$OrderDetailStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$OrderDetailStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'OrderDetailState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderDetail orderDetail) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderDetail orderDetail)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderDetail orderDetail)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements OrderDetailState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$OrderDetailStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'OrderDetailState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderDetail orderDetail) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderDetail orderDetail)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderDetail orderDetail)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements OrderDetailState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({OrderDetail orderDetail}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$OrderDetailStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? orderDetail = null, + }) { + return _then(_$LoadedImpl( + null == orderDetail + ? _value.orderDetail + : orderDetail // ignore: cast_nullable_to_non_nullable + as OrderDetail, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(this.orderDetail); + + @override + final OrderDetail orderDetail; + + @override + String toString() { + return 'OrderDetailState.loaded(orderDetail: $orderDetail)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + (identical(other.orderDetail, orderDetail) || + other.orderDetail == orderDetail)); + } + + @override + int get hashCode => Object.hash(runtimeType, orderDetail); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderDetail orderDetail) loaded, + required TResult Function(String message) error, + }) { + return loaded(orderDetail); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderDetail orderDetail)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(orderDetail); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderDetail orderDetail)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(orderDetail); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements OrderDetailState { + const factory _Loaded(final OrderDetail orderDetail) = _$LoadedImpl; + + OrderDetail get orderDetail; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$OrderDetailStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'OrderDetailState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderDetail orderDetail) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderDetail orderDetail)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderDetail orderDetail)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements OrderDetailState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_event.dart new file mode 100644 index 0000000..c5a79e9 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_event.dart @@ -0,0 +1,7 @@ +part of 'order_detail_bloc.dart'; + +@freezed +class OrderDetailEvent with _$OrderDetailEvent { + const factory OrderDetailEvent.started() = _Started; + const factory OrderDetailEvent.getOrderDetail(int orderId) = _GetOrderDetail; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_state.dart new file mode 100644 index 0000000..74ce857 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/order_detail/order_detail_state.dart @@ -0,0 +1,9 @@ +part of 'order_detail_bloc.dart'; + +@freezed +class OrderDetailState with _$OrderDetailState { + const factory OrderDetailState.initial() = _Initial; + const factory OrderDetailState.loading() = _Loading; + const factory OrderDetailState.loaded(OrderDetail orderDetail) = _Loaded; + const factory OrderDetailState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_bloc.dart new file mode 100644 index 0000000..60f752d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_bloc.dart @@ -0,0 +1,26 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/order_remote_datasource.dart'; + +part 'status_order_bloc.freezed.dart'; +part 'status_order_event.dart'; +part 'status_order_state.dart'; + +class StatusOrderBloc extends Bloc { + final OrderRemoteDatasource _orderRemoteDatasource; + StatusOrderBloc( + this._orderRemoteDatasource, + ) : super(const _Initial()) { + on<_CheckPaymentStatus>((event, emit) async { + emit(const StatusOrderState.loading()); + final result = + await _orderRemoteDatasource.checkPaymentStatus(event.orderId); + result.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r)), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_bloc.freezed.dart new file mode 100644 index 0000000..9942aa1 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_bloc.freezed.dart @@ -0,0 +1,902 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'status_order_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$StatusOrderEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(int orderId) checkPaymentStatus, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(int orderId)? checkPaymentStatus, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(int orderId)? checkPaymentStatus, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_CheckPaymentStatus value) checkPaymentStatus, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_CheckPaymentStatus value)? checkPaymentStatus, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_CheckPaymentStatus value)? checkPaymentStatus, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $StatusOrderEventCopyWith<$Res> { + factory $StatusOrderEventCopyWith( + StatusOrderEvent value, $Res Function(StatusOrderEvent) then) = + _$StatusOrderEventCopyWithImpl<$Res, StatusOrderEvent>; +} + +/// @nodoc +class _$StatusOrderEventCopyWithImpl<$Res, $Val extends StatusOrderEvent> + implements $StatusOrderEventCopyWith<$Res> { + _$StatusOrderEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$StatusOrderEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'StatusOrderEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(int orderId) checkPaymentStatus, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(int orderId)? checkPaymentStatus, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(int orderId)? checkPaymentStatus, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_CheckPaymentStatus value) checkPaymentStatus, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_CheckPaymentStatus value)? checkPaymentStatus, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_CheckPaymentStatus value)? checkPaymentStatus, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements StatusOrderEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$CheckPaymentStatusImplCopyWith<$Res> { + factory _$$CheckPaymentStatusImplCopyWith(_$CheckPaymentStatusImpl value, + $Res Function(_$CheckPaymentStatusImpl) then) = + __$$CheckPaymentStatusImplCopyWithImpl<$Res>; + @useResult + $Res call({int orderId}); +} + +/// @nodoc +class __$$CheckPaymentStatusImplCopyWithImpl<$Res> + extends _$StatusOrderEventCopyWithImpl<$Res, _$CheckPaymentStatusImpl> + implements _$$CheckPaymentStatusImplCopyWith<$Res> { + __$$CheckPaymentStatusImplCopyWithImpl(_$CheckPaymentStatusImpl _value, + $Res Function(_$CheckPaymentStatusImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? orderId = null, + }) { + return _then(_$CheckPaymentStatusImpl( + null == orderId + ? _value.orderId + : orderId // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$CheckPaymentStatusImpl implements _CheckPaymentStatus { + const _$CheckPaymentStatusImpl(this.orderId); + + @override + final int orderId; + + @override + String toString() { + return 'StatusOrderEvent.checkPaymentStatus(orderId: $orderId)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$CheckPaymentStatusImpl && + (identical(other.orderId, orderId) || other.orderId == orderId)); + } + + @override + int get hashCode => Object.hash(runtimeType, orderId); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$CheckPaymentStatusImplCopyWith<_$CheckPaymentStatusImpl> get copyWith => + __$$CheckPaymentStatusImplCopyWithImpl<_$CheckPaymentStatusImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(int orderId) checkPaymentStatus, + }) { + return checkPaymentStatus(orderId); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(int orderId)? checkPaymentStatus, + }) { + return checkPaymentStatus?.call(orderId); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(int orderId)? checkPaymentStatus, + required TResult orElse(), + }) { + if (checkPaymentStatus != null) { + return checkPaymentStatus(orderId); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_CheckPaymentStatus value) checkPaymentStatus, + }) { + return checkPaymentStatus(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_CheckPaymentStatus value)? checkPaymentStatus, + }) { + return checkPaymentStatus?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_CheckPaymentStatus value)? checkPaymentStatus, + required TResult orElse(), + }) { + if (checkPaymentStatus != null) { + return checkPaymentStatus(this); + } + return orElse(); + } +} + +abstract class _CheckPaymentStatus implements StatusOrderEvent { + const factory _CheckPaymentStatus(final int orderId) = + _$CheckPaymentStatusImpl; + + int get orderId; + @JsonKey(ignore: true) + _$$CheckPaymentStatusImplCopyWith<_$CheckPaymentStatusImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$StatusOrderState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(String status) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(String status)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(String status)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $StatusOrderStateCopyWith<$Res> { + factory $StatusOrderStateCopyWith( + StatusOrderState value, $Res Function(StatusOrderState) then) = + _$StatusOrderStateCopyWithImpl<$Res, StatusOrderState>; +} + +/// @nodoc +class _$StatusOrderStateCopyWithImpl<$Res, $Val extends StatusOrderState> + implements $StatusOrderStateCopyWith<$Res> { + _$StatusOrderStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$StatusOrderStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'StatusOrderState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(String status) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(String status)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(String status)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements StatusOrderState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$StatusOrderStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'StatusOrderState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(String status) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(String status)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(String status)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements StatusOrderState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({String status}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$StatusOrderStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = null, + }) { + return _then(_$LoadedImpl( + null == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(this.status); + + @override + final String status; + + @override + String toString() { + return 'StatusOrderState.loaded(status: $status)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + (identical(other.status, status) || other.status == status)); + } + + @override + int get hashCode => Object.hash(runtimeType, status); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(String status) loaded, + required TResult Function(String message) error, + }) { + return loaded(status); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(String status)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(status); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(String status)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(status); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements StatusOrderState { + const factory _Loaded(final String status) = _$LoadedImpl; + + String get status; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$StatusOrderStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'StatusOrderState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(String status) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(String status)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(String status)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements StatusOrderState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_event.dart new file mode 100644 index 0000000..9169ee2 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_event.dart @@ -0,0 +1,7 @@ +part of 'status_order_bloc.dart'; + +@freezed +class StatusOrderEvent with _$StatusOrderEvent { + const factory StatusOrderEvent.started() = _Started; + const factory StatusOrderEvent.checkPaymentStatus(int orderId) = _CheckPaymentStatus; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_state.dart new file mode 100644 index 0000000..1f62460 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/status_order/status_order_state.dart @@ -0,0 +1,9 @@ +part of 'status_order_bloc.dart'; + +@freezed +class StatusOrderState with _$StatusOrderState { + const factory StatusOrderState.initial() = _Initial; + const factory StatusOrderState.loading() = _Loading; + const factory StatusOrderState.loaded(String status) = _Loaded; + const factory StatusOrderState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_bloc.dart new file mode 100644 index 0000000..abfe1b5 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_bloc.dart @@ -0,0 +1,28 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/rajaongkir_remote_datasource.dart'; + +import '../../../../data/models/responses/tracking_response_model.dart'; + +part 'tracking_bloc.freezed.dart'; +part 'tracking_event.dart'; +part 'tracking_state.dart'; + +class TrackingBloc extends Bloc { + final RajaongkirRemoteDatasource rajaongkirRemoteDatasource; + TrackingBloc( + this.rajaongkirRemoteDatasource, + ) : super(const _Initial()) { + on<_GetTracking>((event, emit) async { + emit(const _Loading()); + final response = await rajaongkirRemoteDatasource.getWaybill( + event.kurir, event.noResi); + response.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r)), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_bloc.freezed.dart new file mode 100644 index 0000000..f7339e7 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_bloc.freezed.dart @@ -0,0 +1,911 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'tracking_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$TrackingEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String noResi, String kurir) getTracking, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String noResi, String kurir)? getTracking, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String noResi, String kurir)? getTracking, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetTracking value) getTracking, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetTracking value)? getTracking, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetTracking value)? getTracking, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $TrackingEventCopyWith<$Res> { + factory $TrackingEventCopyWith( + TrackingEvent value, $Res Function(TrackingEvent) then) = + _$TrackingEventCopyWithImpl<$Res, TrackingEvent>; +} + +/// @nodoc +class _$TrackingEventCopyWithImpl<$Res, $Val extends TrackingEvent> + implements $TrackingEventCopyWith<$Res> { + _$TrackingEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$TrackingEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'TrackingEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String noResi, String kurir) getTracking, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String noResi, String kurir)? getTracking, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String noResi, String kurir)? getTracking, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetTracking value) getTracking, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetTracking value)? getTracking, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetTracking value)? getTracking, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements TrackingEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetTrackingImplCopyWith<$Res> { + factory _$$GetTrackingImplCopyWith( + _$GetTrackingImpl value, $Res Function(_$GetTrackingImpl) then) = + __$$GetTrackingImplCopyWithImpl<$Res>; + @useResult + $Res call({String noResi, String kurir}); +} + +/// @nodoc +class __$$GetTrackingImplCopyWithImpl<$Res> + extends _$TrackingEventCopyWithImpl<$Res, _$GetTrackingImpl> + implements _$$GetTrackingImplCopyWith<$Res> { + __$$GetTrackingImplCopyWithImpl( + _$GetTrackingImpl _value, $Res Function(_$GetTrackingImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? noResi = null, + Object? kurir = null, + }) { + return _then(_$GetTrackingImpl( + null == noResi + ? _value.noResi + : noResi // ignore: cast_nullable_to_non_nullable + as String, + null == kurir + ? _value.kurir + : kurir // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$GetTrackingImpl implements _GetTracking { + const _$GetTrackingImpl(this.noResi, this.kurir); + + @override + final String noResi; + @override + final String kurir; + + @override + String toString() { + return 'TrackingEvent.getTracking(noResi: $noResi, kurir: $kurir)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GetTrackingImpl && + (identical(other.noResi, noResi) || other.noResi == noResi) && + (identical(other.kurir, kurir) || other.kurir == kurir)); + } + + @override + int get hashCode => Object.hash(runtimeType, noResi, kurir); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$GetTrackingImplCopyWith<_$GetTrackingImpl> get copyWith => + __$$GetTrackingImplCopyWithImpl<_$GetTrackingImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String noResi, String kurir) getTracking, + }) { + return getTracking(noResi, kurir); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String noResi, String kurir)? getTracking, + }) { + return getTracking?.call(noResi, kurir); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String noResi, String kurir)? getTracking, + required TResult orElse(), + }) { + if (getTracking != null) { + return getTracking(noResi, kurir); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetTracking value) getTracking, + }) { + return getTracking(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetTracking value)? getTracking, + }) { + return getTracking?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetTracking value)? getTracking, + required TResult orElse(), + }) { + if (getTracking != null) { + return getTracking(this); + } + return orElse(); + } +} + +abstract class _GetTracking implements TrackingEvent { + const factory _GetTracking(final String noResi, final String kurir) = + _$GetTrackingImpl; + + String get noResi; + String get kurir; + @JsonKey(ignore: true) + _$$GetTrackingImplCopyWith<_$GetTrackingImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$TrackingState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(TrackingResponseModel tracking) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(TrackingResponseModel tracking)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(TrackingResponseModel tracking)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $TrackingStateCopyWith<$Res> { + factory $TrackingStateCopyWith( + TrackingState value, $Res Function(TrackingState) then) = + _$TrackingStateCopyWithImpl<$Res, TrackingState>; +} + +/// @nodoc +class _$TrackingStateCopyWithImpl<$Res, $Val extends TrackingState> + implements $TrackingStateCopyWith<$Res> { + _$TrackingStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$TrackingStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'TrackingState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(TrackingResponseModel tracking) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(TrackingResponseModel tracking)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(TrackingResponseModel tracking)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements TrackingState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$TrackingStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'TrackingState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(TrackingResponseModel tracking) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(TrackingResponseModel tracking)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(TrackingResponseModel tracking)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements TrackingState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({TrackingResponseModel tracking}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$TrackingStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? tracking = null, + }) { + return _then(_$LoadedImpl( + null == tracking + ? _value.tracking + : tracking // ignore: cast_nullable_to_non_nullable + as TrackingResponseModel, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(this.tracking); + + @override + final TrackingResponseModel tracking; + + @override + String toString() { + return 'TrackingState.loaded(tracking: $tracking)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + (identical(other.tracking, tracking) || + other.tracking == tracking)); + } + + @override + int get hashCode => Object.hash(runtimeType, tracking); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(TrackingResponseModel tracking) loaded, + required TResult Function(String message) error, + }) { + return loaded(tracking); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(TrackingResponseModel tracking)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(tracking); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(TrackingResponseModel tracking)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(tracking); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements TrackingState { + const factory _Loaded(final TrackingResponseModel tracking) = _$LoadedImpl; + + TrackingResponseModel get tracking; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$TrackingStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'TrackingState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(TrackingResponseModel tracking) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(TrackingResponseModel tracking)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(TrackingResponseModel tracking)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements TrackingState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_event.dart new file mode 100644 index 0000000..e3a46d4 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_event.dart @@ -0,0 +1,8 @@ +part of 'tracking_bloc.dart'; + +@freezed +class TrackingEvent with _$TrackingEvent { + const factory TrackingEvent.started() = _Started; + const factory TrackingEvent.getTracking(String noResi, String kurir) = + _GetTracking; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_state.dart new file mode 100644 index 0000000..179c383 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/bloc/tracking/tracking_state.dart @@ -0,0 +1,9 @@ +part of 'tracking_bloc.dart'; + +@freezed +class TrackingState with _$TrackingState { + const factory TrackingState.initial() = _Initial; + const factory TrackingState.loading() = _Loading; + const factory TrackingState.loaded(TrackingResponseModel tracking) = _Loaded; + const factory TrackingState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/bank_account_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/bank_account_model.dart new file mode 100644 index 0000000..02c78d9 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/bank_account_model.dart @@ -0,0 +1,31 @@ +import '../../../../../core/assets/assets.gen.dart'; + +class BankAccountModel { + String code; + final String name; + final String image; + + BankAccountModel({ + required this.code, + required this.name, + required this.image, + }); +} + +final banks = [ + BankAccountModel( + code: 'bri', + name: 'BRI Virtual Account', + image: Assets.images.banks.bRIDirectDebit.path, + ), + BankAccountModel( + code: 'bca', + name: 'BCA Virtual Account', + image: Assets.images.banks.bca.path, + ), + BankAccountModel( + code: 'mandiri', + name: 'Bank Mandiri', + image: Assets.images.banks.mandiri.path, + ), +]; diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/cart_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/cart_model.dart new file mode 100644 index 0000000..6388057 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/cart_model.dart @@ -0,0 +1,11 @@ +import '../../home/models/product_model.dart'; + +class CartModel { + final ProductModel product; + int quantity; + + CartModel({ + required this.product, + required this.quantity, + }); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/track_record_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/track_record_model.dart new file mode 100644 index 0000000..8ce5d3a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/track_record_model.dart @@ -0,0 +1,86 @@ +class TrackRecordModel { + final String title; + final TrackRecordStatus status; + final bool isActive; + final DateTime updatedAt; + + TrackRecordModel({ + required this.title, + required this.status, + this.isActive = false, + required this.updatedAt, + }); + + String get formattedDate => + '${updatedAt.day} ${_monthName(updatedAt.month)} ${updatedAt.year}'; + + String get formattedDateShort { + final now = DateTime.now(); + final yesterday = DateTime(now.year, now.month, now.day - 1); + + if (updatedAt.year == now.year && + updatedAt.month == now.month && + updatedAt.day == now.day) { + return 'Hari Ini'; + } else if (updatedAt.year == yesterday.year && + updatedAt.month == yesterday.month && + updatedAt.day == yesterday.day) { + return 'Kemarin'; + } else { + return '${updatedAt.day} ${_monthAbbreviation(updatedAt.month)}'; + } + } + + String get formattedTime => + '${updatedAt.hour}:${updatedAt.minute.toString().padLeft(2, '0')}'; + + String _monthName(int month) { + switch (month) { + case 1: + return 'Januari'; + case 2: + return 'Februari'; + case 3: + return 'Maret'; + case 4: + return 'April'; + case 5: + return 'Mei'; + case 6: + return 'Juni'; + case 7: + return 'Juli'; + case 8: + return 'Agustus'; + case 9: + return 'September'; + case 10: + return 'Oktober'; + case 11: + return 'November'; + case 12: + return 'Desember'; + default: + return ''; + } + } + + String _monthAbbreviation(int month) { + final String monthName = _monthName(month); + if (monthName.length >= 3) { + return monthName.substring(0, 3); + } else { + return monthName; + } + } +} + +enum TrackRecordStatus { + belumBayar('Belum Bayar'), + dikemas('Dikemas'), + dikirim('Dikirim'), + selesai('Selesai'); + + final String value; + const TrackRecordStatus(this.value); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/transaction_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/transaction_model.dart new file mode 100644 index 0000000..05c6e3f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/models/transaction_model.dart @@ -0,0 +1,18 @@ +import 'package:flutter_pos_ecommerce/core/core.dart'; + +class TransactionModel { + final String noResi; + final String status; + final int quantity; + final int price; + + TransactionModel({ + required this.noResi, + required this.status, + required this.quantity, + required this.price, + }); + + String get item => '$quantity item yang dibeli'; + String get priceFormat => price.currencyFormatRp; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/cart_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/cart_page.dart new file mode 100644 index 0000000..094a47b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/cart_page.dart @@ -0,0 +1,285 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/menu_button.dart'; +import 'package:flutter_pos_ecommerce/core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/dialogs/discount_dialog.dart'; +import 'package:go_router/go_router.dart'; +import 'package:http/http.dart' as http; +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/router/app_router.dart'; +import '../../home/bloc/checkout/checkout_bloc.dart'; +import '../widgets/cart_tile.dart'; +import 'package:badges/badges.dart' as badges; + +class CartPage extends StatefulWidget { + const CartPage({super.key}); + + @override + State createState() => _CartPageState(); +} + +class _CartPageState extends State { + bool showDiscountButton = false; + + @override + void initState() { + super.initState(); + _checkTransactionCount(); + } + + Future _checkTransactionCount() async { + final authData = await AuthLocalDatasource().getAuthData(); + final response = await http.get( + Uri.parse('${GlobalVariable.baseUrl}/api/transaction-count'), + headers: { + 'Authorization': 'Bearer ${authData!.accessToken}', + 'Accept': 'application/json', + }, + ); + + if (response.statusCode == 200) { + final data = jsonDecode(response.body); + setState(() { + showDiscountButton = data['transaction_count'] > 10; + }); + } else { + print('Failed to load transaction count'); + } + } + + @override + Widget build(BuildContext context) { + // final List carts = [ + // ProductModel( + // images: [ + // Assets.images.products.earphone.path, + // Assets.images.products.earphone.path, + // Assets.images.products.earphone.path, + // ], + // name: 'Earphone', + // price: 320000, + // stock: 20, + // description: + // 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + // store: StoreModel( + // name: 'CWB Online Store', + // type: StoreEnum.officialStore, + // imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + // ), + // ), + // ProductModel( + // images: [ + // Assets.images.products.sepatu.path, + // Assets.images.products.sepatu2.path, + // Assets.images.products.sepatu.path, + // ], + // name: 'Sepatu Nike', + // price: 2200000, + // stock: 20, + // description: + // 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + // store: StoreModel( + // name: 'CWB Online Store', + // type: StoreEnum.officialStore, + // imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + // ), + // ), + // ]; + + return Scaffold( + appBar: AppBar( + title: const Text('Keranjang'), + actions: [ + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + loaded: (checkout, discount, _, __, ___, ____, ______) { + final totalQuantity = checkout.fold( + 0, + (previousValue, element) => + previousValue + element.quantity, + ); + return totalQuantity > 0 + ? badges.Badge( + badgeContent: Text( + totalQuantity.toString(), + style: const TextStyle(color: Colors.white), + ), + child: IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ), + ) + : IconButton( + onPressed: () { + context.goNamed( + RouteConstants.cart, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ); + }, + orElse: () => const SizedBox.shrink(), + ); + }, + ), + const SizedBox( + width: 16, + ) + ], + ), + body: ListView( + padding: const EdgeInsets.all(20.0), + children: [ + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + loaded: (checkout, discount, _, __, ___, ____, _____) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: checkout.length, + itemBuilder: (context, index) => CartTile( + data: checkout[index], + ), + separatorBuilder: (context, index) => + const SpaceHeight(16.0), + ); + }); + }, + ), + const SpaceHeight(50.0), + if (showDiscountButton) + MenuButton( + iconPath: Assets.icons.qrCode.path, + label: 'Diskon', + onPressed: () { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => const DiscountDialog(), + ); + }, + ), + const SpaceHeight(50.0), + Row( + children: [ + const Text( + 'Total', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + const Spacer(), + BlocBuilder( + builder: (context, state) { + final price = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) => + products.fold( + 0, + (previousValue, element) => + previousValue + + (element.product.price! * element.quantity), + ), + ); + final discount = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) { + if (discount == null) { + return 0; + } + return discount.value! + .replaceAll('.00', '') + .toIntegerFromText; + }); + // final total = state.maybeWhen( + // orElse: () => 0, + // loaded: (checkout, discount, _, __, ___, ____, _____) { + // return checkout.fold( + // 0, + // (previousValue, element) => + // previousValue + + // (element.quantity * element.product.price!), + // ); + // }, + // ); + print('price $price'); + print('discount $discount'); + final totalBayar = price - (discount / 100 * price); + print('totalBayar $totalBayar'); + return Text( + totalBayar.currencyFormatRp, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ); + }, + ), + ], + ), + const SpaceHeight(40.0), + BlocBuilder( + builder: (context, state) { + final totalQty = state.maybeWhen( + orElse: () => 0, + loaded: (checkout, _, __, ___, ____, _____, ______) { + return checkout.fold( + 0, + (previousValue, element) => + previousValue + element.quantity, + ); + }, + ); + return Button.filled( + onPressed: () async { + final isAuth = await AuthLocalDatasource().isAuth(); + if (!isAuth) { + context.pushNamed( + RouteConstants.login, + ); + } else { + context.goNamed( + RouteConstants.address, + pathParameters: PathParameters( + rootTab: RootTab.order, + ).toMap(), + ); + } + }, + label: 'Checkout ($totalQty)', + ); + // return Button.filled( + // onPressed: () { + // context.goNamed( + // RouteConstants.address, + // pathParameters: PathParameters( + // rootTab: RootTab.order, + // ).toMap(), + // ); + // }, + // label: 'Checkout (10)', + // ); + }, + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/history_order_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/history_order_page.dart new file mode 100644 index 0000000..3f51612 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/history_order_page.dart @@ -0,0 +1,83 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../../../../core/components/spaces.dart'; +import '../bloc/history_order/history_order_bloc.dart'; +import '../widgets/order_card.dart'; + +class HistoryOrderPage extends StatefulWidget { + const HistoryOrderPage({super.key}); + + @override + State createState() => _HistoryOrderPageState(); +} + +class _HistoryOrderPageState extends State { + late Timer timer; + @override + void initState() { + timer = Timer.periodic(const Duration(seconds: 5), (timer) { + context + .read() + .add(const HistoryOrderEvent.getHistoryOrder()); + }); + context + .read() + .add(const HistoryOrderEvent.getHistoryOrder()); + super.initState(); + } + + @override + void dispose() { + timer.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Pesanan'), + ), + body: BlocBuilder( + builder: (context, state) { + switch (state.status) { + case HistoryOrderStateStatus.initial: + return const Center( + child: Text('No Data'), + ); + case HistoryOrderStateStatus.error: + return Center( + child: Text(state.errorMessage), + ); + default: + if (state.orders?.orders?.isEmpty ?? true) { + return const Center( + child: Text('No Data'), + ); + } + return ListView.separated( + padding: const EdgeInsets.all(16.0), + separatorBuilder: (context, index) => const SpaceHeight(16.0), + itemCount: state.orders?.orders?.length ?? 0, + itemBuilder: (context, index) => OrderCard( + data: state.orders!.orders![index], + ), + ); + } + + // return ListView.separated( + // padding: const EdgeInsets.all(16.0), + // separatorBuilder: (context, index) => const SpaceHeight(16.0), + // itemCount: transactions.length, + // itemBuilder: (context, index) => OrderCard( + // data: transactions[index], + // ), + // ); + }, + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/metode_pembayaran_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/metode_pembayaran_page.dart new file mode 100644 index 0000000..a73979a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/metode_pembayaran_page.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class BankTransferPage extends StatefulWidget { + const BankTransferPage({super.key}); + + @override + State createState() => _BankTransferPageState(); +} + +class _BankTransferPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Bank Transfer'), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/order_detail_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/order_detail_page.dart new file mode 100644 index 0000000..4704d70 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/order_detail_page.dart @@ -0,0 +1,544 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; +import 'package:go_router/go_router.dart'; +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/router/app_router.dart'; +import '../../home/bloc/checkout/checkout_bloc.dart'; +import '../bloc/cost/cost_bloc.dart'; +import '../widgets/cart_tile.dart'; + +class OrderDetailPage extends StatefulWidget { + const OrderDetailPage({super.key}); + + @override + State createState() => _OrderDetailPageState(); +} + +class _OrderDetailPageState extends State { + void onTimerCompletion() { + showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: AppColors.white, + builder: (BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 14.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(40.0)), + child: ColoredBox( + color: AppColors.light, + child: SizedBox(height: 8.0, width: 55.0), + ), + ), + const SpaceHeight(20.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Center( + child: Text( + 'Pilih Metode Pembayaran', + style: TextStyle( + color: AppColors.primary, + fontSize: 20, + fontWeight: FontWeight.w600, + ), + maxLines: 2, + ), + ), + CircleAvatar( + backgroundColor: AppColors.light, + child: IconButton( + onPressed: () => context.pop(), + icon: const Icon( + Icons.close, + color: AppColors.primary, + ), + ), + ), + ], + ), + const SpaceHeight(20.0), + Row( + children: [ + Flexible( + child: Button.outlined( + onPressed: () { + context.goNamed( + RouteConstants.paymentDetail, + pathParameters: PathParameters().toMap(), + ); + }, + label: 'Payment', + ), + ), + const SpaceWidth(4.0), + Flexible( + child: Button.filled( + onPressed: () { + context.goNamed( + RouteConstants.metodePembayaran, + pathParameters: PathParameters().toMap(), + ); + }, + label: 'Bank Transfer', + ), + ), + ], + ), + const SpaceHeight(20.0), + ], + ), + ); + }, + ); + } + + @override + void initState() { + context.read().add(const CostEvent.getCost( + origin: '5779', + destination: '2103', + weight: 1000, + courier: 'jne', + )); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Detail Order'), + actions: [ + IconButton( + onPressed: () { + // context.goNamed( + // RouteConstants.cart, + // pathParameters: PathParameters( + // rootTab: RootTab.order, + // ).toMap(), + // ); + context.goNamed(RouteConstants.metodePembayaran); + }, + icon: Assets.icons.cart.svg(height: 24.0), + ), + ], + ), + body: ListView( + padding: const EdgeInsets.all(20.0), + children: [ + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return const SizedBox(); + }, + loaded: (products, _, __, ___, ____, _____, ______) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: products.length, + itemBuilder: (context, index) => CartTile( + data: products[index], + ), + separatorBuilder: (context, index) => + const SpaceHeight(16.0), + ); + }, + ); + }, + ), + const SpaceHeight(36.0), + const _SelectShipping(), + const SpaceHeight(36.0), + const Divider(), + const SpaceHeight(8.0), + const Text( + 'Detail Belanja :', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + const SpaceHeight(12.0), + Row( + children: [ + const Text( + 'Total Harga (Produk)', + style: TextStyle( + fontWeight: FontWeight.w600, + ), + ), + const Spacer(), + BlocBuilder( + builder: (context, state) { + final price = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) => + products.fold( + 0, + (previousValue, element) => + previousValue + + (element.product.price! * element.quantity), + ), + ); + final discount = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) { + if (discount == null) { + return 0; + } + return discount.value! + .replaceAll('.00', '') + .toIntegerFromText; + }); + final totalBayar = price - (discount / 100 * price); + return Text( + totalBayar.currencyFormatRp, + style: const TextStyle( + fontWeight: FontWeight.w600, + ), + ); + }, + ), + ], + ), + const SpaceHeight(5.0), + Row( + children: [ + const Text( + 'Total Ongkos Kirim', + style: TextStyle( + fontWeight: FontWeight.w600, + ), + ), + const Spacer(), + BlocBuilder( + builder: (context, state) { + final shippingCost = state.maybeWhen( + orElse: () => 0, + loaded: (_, discount, ___, ____, __, shippingCost, ______) { + return shippingCost; + }, + ); + return Text( + shippingCost.currencyFormatRp, + style: const TextStyle( + fontWeight: FontWeight.w600, + ), + ); + }, + ), + ], + ), + const SpaceHeight(8.0), + const Divider(), + const SpaceHeight(24.0), + Row( + children: [ + const Text( + 'Total Belanja', + style: TextStyle( + fontWeight: FontWeight.w600, + ), + ), + const Spacer(), + BlocBuilder( + builder: (context, state) { + final total = state.maybeWhen( + orElse: () => 0, + loaded: + (products, discount, __, ___, _, shippingCost, _____) { + return products.fold( + 0, + (previousValue, element) => + previousValue + + (element.product.price! * element.quantity)); + }, + ); + print("total harga : $total"); + + final discount = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) { + if (discount == null) { + return 0; + } + return discount.value! + .replaceAll('.00', '') + .toIntegerFromText; + }); + print("diskon : $discount"); + + final shippingCost = state.maybeWhen( + orElse: () => 0, + loaded: (_, discount, ___, ____, __, shippingCost, ______) { + return shippingCost; + }, + ); + print("shipping cos : $shippingCost"); + final totalBayar = + total - (discount / 100 * total) + shippingCost; + return Text( + totalBayar.currencyFormatRp, + style: const TextStyle( + fontWeight: FontWeight.w600, + ), + ); + }, + ), + ], + ), + const SpaceHeight(20.0), + Button.filled( + onPressed: () { + // onTimerCompletion(); + context.goNamed( + RouteConstants.paymentDetail, + pathParameters: PathParameters().toMap(), + ); + }, + label: 'Pilih Pembayaran', + ), + ], + ), + ); + } +} + +class _SelectShipping extends StatefulWidget { + const _SelectShipping(); + + @override + State<_SelectShipping> createState() => _SelectShippingState(); +} + +class _SelectShippingState extends State<_SelectShipping> { + @override + Widget build(BuildContext context) { + final selectedPayment = ValueNotifier(0); + // final shippings = [ + // ShippingModel( + // type: 'Reguler', + // priceStart: 20000, + // priceEnd: 30000, + // estimate: DateTime.now().subtract(const Duration(days: 3)), + // ), + // ShippingModel( + // type: 'Kargo', + // priceStart: 20000, + // priceEnd: 30000, + // estimate: DateTime.now().subtract(const Duration(days: 3)), + // ), + // ShippingModel( + // type: 'Ekonomi', + // priceStart: 20000, + // priceEnd: 30000, + // estimate: DateTime.now().subtract(const Duration(days: 4)), + // ), + // ]; + + void onSelectShippingTap() { + showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: AppColors.white, + builder: (BuildContext context) { + return Padding( + padding: + const EdgeInsets.symmetric(horizontal: 20.0, vertical: 14.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Center( + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(40.0)), + child: ColoredBox( + color: AppColors.light, + child: SizedBox(height: 8.0, width: 55.0), + ), + ), + ), + const SpaceHeight(20.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + 'Metode Pengiriman', + style: TextStyle( + color: AppColors.primary, + fontSize: 20, + fontWeight: FontWeight.w600, + ), + ), + CircleAvatar( + backgroundColor: AppColors.light, + child: IconButton( + onPressed: () => context.pop(), + icon: const Icon( + Icons.close, + color: AppColors.primary, + ), + ), + ), + ], + ), + const SpaceHeight(18.0), + // Container( + // decoration: ShapeDecoration( + // shape: RoundedRectangleBorder( + // side: const BorderSide( + // width: 1.50, + // color: AppColors.stroke, + // ), + // borderRadius: BorderRadius.circular(14), + // ), + // ), + // child: ListTile( + // leading: Assets.icons.routing.svg(), + // subtitle: const Text('Dikirim dari Kabupaten Banyuwangi'), + // trailing: const Text( + // 'berat: 1kg', + // textAlign: TextAlign.right, + // style: TextStyle( + // color: AppColors.primary, + // fontSize: 16, + // fontWeight: FontWeight.w500, + // ), + // ), + // ), + // ), + // const SpaceHeight(12.0), + // const Text( + // 'Estimasi tiba 20 - 23 Januari (Rp. 20.000)', + // style: TextStyle( + // fontSize: 16, + // fontWeight: FontWeight.w600, + // ), + // ), + // const SpaceHeight(30.0), + const Divider(color: AppColors.stroke), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return const SizedBox(); + }, + loaded: (costResponseModel) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + final item = costResponseModel + .rajaongkir!.results![0].costs![index]; + return ListTile( + contentPadding: EdgeInsets.zero, + onTap: () { + context.read().add( + CheckoutEvent.addShippingService( + 'jne', item.cost![0].value!), + ); + context.pop(); + }, + title: Text( + '${item.service} - ${item.description} (${item.cost![0].value!.currencyFormatRp})'), + subtitle: + Text('Estimasi ${item.cost![0].etd} Hari'), + ); + }, + separatorBuilder: (context, index) => + const Divider(color: AppColors.stroke), + itemCount: costResponseModel + .rajaongkir!.results![0].costs!.length, + ); + }, + ); + }, + ), + ], + ), + ); + }, + ); + } + + return GestureDetector( + onTap: onSelectShippingTap, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 14.0, vertical: 20.0), + decoration: BoxDecoration( + border: Border.all(color: AppColors.stroke), + borderRadius: const BorderRadius.all(Radius.circular(10.0)), + ), + child: const Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Pilih Pengiriman', + style: TextStyle(fontSize: 16), + ), + Icon(Icons.chevron_right), + ], + ), + ), + ); + } +} + +class _ShippingSelected extends StatelessWidget { + const _ShippingSelected(); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () {}, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 14.0, vertical: 20.0), + decoration: BoxDecoration( + border: Border.all(color: AppColors.stroke), + borderRadius: const BorderRadius.all(Radius.circular(10.0)), + ), + child: const Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + 'Reguler', + style: TextStyle(fontSize: 16), + ), + Spacer(), + Text( + 'Edit', + style: TextStyle(fontSize: 16), + ), + SpaceWidth(4.0), + Icon(Icons.chevron_right), + ], + ), + SpaceHeight(12.0), + Text( + 'JNE (Rp. 25.000)', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + Text('Estimasi tiba 2 Januari 2024'), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/payment_detail_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/payment_detail_page.dart new file mode 100644 index 0000000..0e7d41a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/payment_detail_page.dart @@ -0,0 +1,532 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/dialogs/discount_dialog.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/router/app_router.dart'; +import '../../home/bloc/checkout/checkout_bloc.dart'; +import '../../home/models/product_quantity.dart'; +import '../bloc/order/order_bloc.dart'; +import '../models/bank_account_model.dart'; +import '../widgets/payment_method.dart'; + +class PaymentDetailPage extends StatelessWidget { + const PaymentDetailPage({super.key}); + + @override + Widget build(BuildContext context) { + final selectedPayment = ValueNotifier(0); + + List banksLimit = [banks[0], banks[1]]; + + void seeAllTap() { + showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: AppColors.white, + builder: (BuildContext context) { + return Padding( + padding: + const EdgeInsets.symmetric(horizontal: 20.0, vertical: 14.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(40.0)), + child: ColoredBox( + color: AppColors.light, + child: SizedBox(height: 8.0, width: 55.0), + ), + ), + const SpaceHeight(20.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + 'Metode Pembayaran', + style: TextStyle( + color: AppColors.primary, + fontSize: 20, + fontWeight: FontWeight.w600, + ), + ), + CircleAvatar( + backgroundColor: AppColors.light, + child: IconButton( + onPressed: () => context.pop(), + icon: const Icon( + Icons.close, + color: AppColors.primary, + ), + ), + ), + ], + ), + const SpaceHeight(16.0), + ValueListenableBuilder( + valueListenable: selectedPayment, + builder: (context, value, _) => ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) => PaymentMethod( + isActive: value == banks[index].code, + data: banks[index], + onTap: () { + // selectedPayment.value = banks[index].code; + // if (banksLimit.first != banks[index]) { + // banksLimit[1] = banks[index]; + // } + context.pop(); + }, + ), + separatorBuilder: (context, index) => + const SpaceHeight(14.0), + itemCount: banks.length, + ), + ), + ], + ), + ); + }, + ); + } + + void buyNowTap() { + showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: AppColors.white, + builder: (BuildContext context) { + return Padding( + padding: + const EdgeInsets.symmetric(horizontal: 20.0, vertical: 14.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(40.0)), + child: ColoredBox( + color: AppColors.light, + child: SizedBox(height: 8.0, width: 55.0), + ), + ), + const SpaceHeight(20.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + 'Pesananmu dalam Proses', + style: TextStyle( + color: AppColors.primary, + fontSize: 20, + fontWeight: FontWeight.w600, + ), + ), + CircleAvatar( + backgroundColor: AppColors.light, + child: IconButton( + onPressed: () => context.pop(), + icon: const Icon( + Icons.close, + color: AppColors.primary, + ), + ), + ), + ], + ), + const SpaceHeight(20.0), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 50.0), + child: Assets.images.processOrder.image(), + ), + const SpaceHeight(50.0), + Row( + children: [ + Flexible( + child: Button.outlined( + onPressed: () { + context.goNamed( + RouteConstants.trackingOrder, + pathParameters: PathParameters().toMap(), + ); + }, + icon: Assets.icons.bag.svg(), + label: 'Lacak', + ), + ), + const SpaceWidth(4.0), + Flexible( + child: Button.filled( + onPressed: () { + context.goNamed( + RouteConstants.root, + pathParameters: PathParameters().toMap(), + ); + }, + label: 'Home', + ), + ), + ], + ), + const SpaceHeight(20.0), + ], + ), + ); + }, + ); + } + + return Scaffold( + appBar: AppBar( + title: const Text('Pembayaran'), + ), + body: ListView( + padding: const EdgeInsets.all(20.0), + children: [ + // Row( + // children: [ + // const Icon(Icons.schedule), + // const SpaceWidth(12.0), + // const Flexible( + // child: Text( + // 'Selesaikan Pembayaran Dalam', + // overflow: TextOverflow.ellipsis, + // ), + // ), + // const SpaceWidth(12.0), + // CountdownTimer( + // minute: 120, + // onTimerCompletion: () {}, + // ), + // ], + // ), + // const SpaceHeight(30.0), + Row( + children: [ + const Text( + 'Metode Pembayaran', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + const Spacer(), + InkWell( + onTap: seeAllTap, + child: const Text( + 'Lihat semua', + style: TextStyle( + color: AppColors.primary, + fontSize: 12, + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ), + const SpaceHeight(20.0), + BlocBuilder( + builder: (context, state) { + final paymentVaName = state.maybeWhen( + orElse: () => '', + loaded: (_, discount, ___, ____, _____, __, paymentVaName) => + paymentVaName, + ); + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) => PaymentMethod( + isActive: paymentVaName == banksLimit[index].code, + data: banksLimit[index], + onTap: () { + context.read().add( + CheckoutEvent.addPaymentMethod( + banksLimit[index].code, + ), + ); + }, + ), + separatorBuilder: (context, index) => const SpaceHeight(14.0), + itemCount: banksLimit.length, + ); + }, + ), + + const SpaceHeight(36.0), + const Divider(), + const SpaceHeight(8.0), + const Text( + 'Ringkasan Pembayaran', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + const SpaceHeight(12.0), + Row( + children: [ + const Text( + 'Total Belanja', + style: TextStyle( + fontWeight: FontWeight.w600, + ), + ), + const Spacer(), + BlocBuilder( + builder: (context, state) { + final price = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) => + products.fold( + 0, + (previousValue, element) => + previousValue + + (element.product.price! * element.quantity), + ), + ); + final discount = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) { + if (discount == null) { + return 0; + } + return discount.value! + .replaceAll('.00', '') + .toIntegerFromText; + }); + final totalBayar = price - (discount / 100 * price); + return Text( + totalBayar.currencyFormatRp, + style: const TextStyle( + fontWeight: FontWeight.w600, + ), + ); + }, + ), + ], + ), + const SpaceHeight(5.0), + Row( + children: [ + const Text( + 'Biaya Kirim', + style: TextStyle( + fontWeight: FontWeight.w600, + ), + ), + const Spacer(), + BlocBuilder( + builder: (context, state) { + final shippingCost = state.maybeWhen( + orElse: () => 0, + loaded: + (_, discount, __, ___, ____, shippingCost, ______) => + shippingCost, + ); + return Text( + shippingCost.currencyFormatRp, + style: const TextStyle( + fontWeight: FontWeight.w600, + ), + ); + }, + ), + ], + ), + const SpaceHeight(5.0), + // Row( + // children: [ + // const Text( + // 'Segera Ambil =>', + // style: TextStyle( + // fontWeight: FontWeight.w600, + // ), + // ), + // const Spacer(), + // ElevatedButton( + // onPressed: () { + // showDialog( + // context: context, + // barrierDismissible: false, + // builder: (context) => const DiscountDialog(), + // ); + // }, + // child: const Text("Klaim Diskon")) + // ], + // ), + const Divider(), + const SpaceHeight(24.0), + Row( + children: [ + const Text( + 'Total Tagihan', + style: TextStyle( + fontWeight: FontWeight.w600, + ), + ), + const Spacer(), + BlocBuilder( + builder: (context, state) { + // final total = state.maybeWhen( + // orElse: () => 0, + // loaded: (products, discount, _, __, ___, shippingCost, + // ______) => + // products.fold( + // 0, + // (previousValue, element) => + // previousValue + + // (element.product.price! * element.quantity), + // ) + + // shippingCost, + // ); + + final price = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) => + products.fold( + 0, + (previousValue, element) => + previousValue + + (element.product.price! * element.quantity), + ), + ); + + final shippingCost = state.maybeWhen( + orElse: () => 0, + loaded: (_, discount, ___, ____, __, shippingCost, ______) { + return shippingCost; + }, + ); + final discount = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) { + if (discount == null) { + return 0; + } + return discount.value! + .replaceAll('.00', '') + .toIntegerFromText; + }); + final totalBayar = + price - (discount / 100 * price) + shippingCost; + + return Text( + totalBayar.currencyFormatRp, + style: const TextStyle( + fontWeight: FontWeight.w600, + ), + ); + }, + ), + ], + ), + + const SpaceHeight(20.0), + BlocBuilder( + builder: (context, state) { + final paymentMethod = state.maybeWhen( + orElse: () => '', + loaded: (_, discount, __, paymentMethod, ___, ____, ______) => + paymentMethod, + ); + final shippingService = state.maybeWhen( + orElse: () => '', + loaded: (_, discount, __, ___, shippingService, ____, ______) => + shippingService, + ); + + final shippingCost = state.maybeWhen( + orElse: () => 0, + loaded: (_, discount, __, ___, ____, shippingCost, ______) => + shippingCost, + ); + + final paymentVaName = state.maybeWhen( + orElse: () => '', + loaded: (_, discount, __, ___, ____, _____, paymentVaName) => + paymentVaName, + ); + final products = state.maybeWhen( + orElse: () => [], + loaded: (products, discount, _, __, ___, ____, ______) => + products, + ); + final addressId = state.maybeWhen( + orElse: () => 0, + loaded: (_, discount, addressId, __, ___, ____, ______) => + addressId, + ); + + final double discount = state.maybeWhen( + orElse: () => 0, + loaded: (_, discount, addressId, __, ___, ____, ______) { + print("Discount object in loaded state: $discount"); + return (double.tryParse(discount?.value ?? '0.0') ?? 0); + }); + print("Discount value calculated: $discount"); + print("diskon state $discount"); + print("state $state"); + return BlocListener( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + loaded: (orderResponseModel) { + context.pushNamed(RouteConstants.paymentWaiting, + pathParameters: PathParameters().toMap(), + extra: orderResponseModel.order!.id); + }, + error: (message) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: AppColors.red, + content: Text(message), + ), + ); + }, + ); + }, + child: BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return Button.filled( + disabled: paymentMethod == '', + onPressed: () { + print("discount : $discount "); + print("product : $products"); + context.read().add(OrderEvent.doOrder( + addressId: addressId, + discount: discount.toInt(), + paymentMethod: paymentMethod, + shippingService: shippingService, + shippingCost: shippingCost, + paymentVaName: paymentVaName, + products: products as List)); + }, + label: 'Bayar Sekarang', + ); + }, + loading: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, + ); + }, + ), + ); + }, + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/payment_witing_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/payment_witing_page.dart new file mode 100644 index 0000000..25cca80 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/payment_witing_page.dart @@ -0,0 +1,360 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/core.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/orders/bloc/status_order/status_order_bloc.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/router/app_router.dart'; +import '../bloc/order/order_bloc.dart'; +import '../models/bank_account_model.dart'; +import '../widgets/countdown_timer.dart'; + +class PaymentWaitingPage extends StatefulWidget { + final int orderId; + const PaymentWaitingPage({ + super.key, + required this.orderId, + }); + + @override + State createState() => _PaymentWaitingPageState(); +} + +class _PaymentWaitingPageState extends State { + Timer? _timer; + + @override + void initState() { + _timer = Timer.periodic( + const Duration(seconds: 5), + (timer) { + // tiap 5 detik cek status pemnbayaran + context + .read() + .add(StatusOrderEvent.checkPaymentStatus(widget.orderId)); + }, + ); + super.initState(); + } + + @override + void dispose() { + // timer di clear + _timer?.cancel(); + super.dispose(); + } + + void onTimerCompletion() { + showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: AppColors.white, + builder: (BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 14.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(40.0)), + child: ColoredBox( + color: AppColors.light, + child: SizedBox(height: 8.0, width: 55.0), + ), + ), + const SpaceHeight(20.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Center( + child: Text( + 'Pembayaran Selesai', + style: TextStyle( + color: AppColors.primary, + fontSize: 20, + fontWeight: FontWeight.w600, + ), + maxLines: 2, + ), + ), + CircleAvatar( + backgroundColor: AppColors.light, + child: IconButton( + onPressed: () => context.pop(), + icon: const Icon( + Icons.close, + color: AppColors.primary, + ), + ), + ), + ], + ), + const SpaceHeight(20.0), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 50.0), + child: Assets.images.processOrder.image(), + ), + const SpaceHeight(50.0), + Row( + children: [ + Flexible( + child: Button.outlined( + onPressed: () { + context.pushNamed( + RouteConstants.orderList, + pathParameters: PathParameters( + rootTab: RootTab.account, + ).toMap(), + ); + }, + icon: Assets.icons.bag.svg(), + label: 'Lacak', + ), + ), + const SpaceWidth(4.0), + Flexible( + child: Button.filled( + onPressed: () { + context.goNamed( + RouteConstants.root, + pathParameters: PathParameters().toMap(), + ); + }, + label: 'Home', + ), + ), + ], + ), + const SpaceHeight(20.0), + ], + ), + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Menunggu Pembayaran'), + ), + body: BlocListener( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + loaded: (status) { + if (status == 'paid') { + _timer?.cancel(); + context.read().add(const CheckoutEvent.started()); + onTimerCompletion(); + } + }, + ); + }, + child: ListView( + padding: const EdgeInsets.all(20.0), + children: [ + Row( + children: [ + const Icon(Icons.schedule), + const SpaceWidth(12.0), + const Flexible( + child: Text( + 'Selesaikan Pembayaran Dalam', + overflow: TextOverflow.ellipsis, + ), + ), + const SpaceWidth(12.0), + CountdownTimer( + minute: 1, + onTimerCompletion: onTimerCompletion, + ), + ], + ), + const SpaceHeight(20.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return const SizedBox(); + }, + loaded: (orderResponseModel) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + banks + .where((element) => + element.code == + orderResponseModel.order!.paymentVaName!) + .first + .name, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + Image.asset(banks + .where((element) => + element.code == + orderResponseModel.order!.paymentVaName!) + .first + .image), + ], + ); + }, + ); + }, + ), + const SpaceHeight(14.0), + const Divider(), + const SpaceHeight(14.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'No Virtual Account', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w400, + ), + ), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return const SizedBox(); + }, + loaded: (orderResponseModel) { + return Text( + orderResponseModel.order!.paymentVaNumber!, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ); + }, + ); + }, + ), + ], + ), + Button.outlined( + textColor: AppColors.primary, + width: 125.0, + onPressed: () { + Clipboard.setData(const ClipboardData(text: 'test dong')) + .then((_) { + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + content: Text('Copied to clipboard'), + duration: Duration(seconds: 1), + backgroundColor: AppColors.primary, + )); + }); + }, + label: 'Copy', + icon: Assets.icons.copy.svg(), + ), + ], + ), + const SpaceHeight(14.0), + ListTile( + contentPadding: EdgeInsets.zero, + title: const Text( + 'Total Pembayaran', + style: TextStyle( + fontSize: 14.0, + fontWeight: FontWeight.w400, + ), + ), + subtitle: BlocBuilder( + builder: (context, state) { + final price = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) => + products.fold( + 0, + (previousValue, element) => + previousValue + + (element.product.price! * element.quantity), + ), + ); + + final shippingCost = state.maybeWhen( + orElse: () => 0, + loaded: (_, discount, ___, ____, __, shippingCost, ______) { + return shippingCost; + }, + ); + final discount = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount, _, __, ___, ____, _____) { + if (discount == null) { + return 0; + } + return discount.value! + .replaceAll('.00', '') + .toIntegerFromText; + }); + final totalBayar = + price - (discount / 100 * price) + shippingCost; + print("total pembayaran $totalBayar"); + return Text( + totalBayar.currencyFormatRp, + style: const TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w700, + ), + ); + }, + ), + ), + ], + ), + ), + bottomNavigationBar: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Button.filled( + onPressed: () { + context.goNamed( + RouteConstants.root, + pathParameters: PathParameters().toMap(), + ); + }, + label: 'Belanja Lagi', + ), + // Button.outlined( + // onPressed: () { + // context.pushNamed( + // RouteConstants.trackingOrder, + // pathParameters: PathParameters().toMap(), + // ); + // }, + // label: 'Cek Status Pembayaran', + // ), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/shipping_detail_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/shipping_detail_page.dart new file mode 100644 index 0000000..28cab25 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/shipping_detail_page.dart @@ -0,0 +1,188 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../home/models/product_model.dart'; +import '../../home/models/store_model.dart'; +import '../bloc/tracking/tracking_bloc.dart'; +import '../models/track_record_model.dart'; +import '../widgets/tracking_vertical.dart'; + +class ShippingDetailPage extends StatefulWidget { + final String resi; + const ShippingDetailPage({ + super.key, + required this.resi, + }); + + @override + State createState() => _ShippingDetailPageState(); +} + +class _ShippingDetailPageState extends State { + final List orders = [ + ProductModel( + images: [ + Assets.images.products.earphone.path, + Assets.images.products.earphone.path, + Assets.images.products.earphone.path, + ], + name: 'Earphone', + price: 320000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ProductModel( + images: [ + Assets.images.products.sepatu.path, + Assets.images.products.sepatu2.path, + Assets.images.products.sepatu.path, + ], + name: 'Sepatu Nike', + price: 2200000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ]; + final List trackRecords = [ + TrackRecordModel( + title: 'Pesanan Anda belum dibayar', + status: TrackRecordStatus.belumBayar, + updatedAt: DateTime.now().subtract(const Duration(days: 3)), + ), + TrackRecordModel( + title: 'Pesanan Anda sedang disiapkan', + status: TrackRecordStatus.dikemas, + updatedAt: DateTime.now().subtract(const Duration(days: 2)), + ), + TrackRecordModel( + title: 'Pesanan Anda dalam pengiriman', + status: TrackRecordStatus.dikirim, + updatedAt: DateTime.now().subtract(const Duration(days: 1)), + ), + TrackRecordModel( + title: 'Pesanan Anda telah tiba', + status: TrackRecordStatus.selesai, + updatedAt: DateTime.now(), + ), + ]; + + void copyToClipboard(String text) { + Clipboard.setData(ClipboardData(text: text)).then((_) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Nomor resi disalin!'), + duration: Duration(seconds: 1), + backgroundColor: AppColors.primary, + ), + ); + }); + } + + @override + void initState() { + context + .read() + .add(TrackingEvent.getTracking(widget.resi, 'sicepat')); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Detail Pengiriman - ${widget.resi}'), + ), + body: ListView( + padding: const EdgeInsets.all(20.0), + children: [ + // ProductTile( + // data: orders.first, + // ), + const SpaceHeight(36.0), + Container( + decoration: BoxDecoration( + border: Border.all(color: AppColors.stroke), + borderRadius: const BorderRadius.all(Radius.circular(10.0)), + ), + child: BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, + loaded: (tracking) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + children: [ + const Text( + 'No. Resi', + style: TextStyle( + fontSize: 16, + ), + ), + const Spacer(), + Text( + widget.resi, + style: const TextStyle( + fontSize: 16, + color: AppColors.grey, + ), + ), + const SpaceWidth(5.0), + InkWell( + onTap: () => copyToClipboard(widget.resi), + child: const Text( + 'SALIN', + style: TextStyle( + fontSize: 16, + color: AppColors.primary, + ), + ), + ), + ], + ), + ), + const Divider( + height: 1, + color: AppColors.light, + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: TrackignVertical( + trackRecords: + tracking.rajaongkir?.result?.manifest ?? []), + ), + ], + ); + }, + ); + }, + ), + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/tracking_order_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/tracking_order_page.dart new file mode 100644 index 0000000..4e6125f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/pages/tracking_order_page.dart @@ -0,0 +1,179 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/router/app_router.dart'; +import '../../home/models/product_model.dart'; +import '../../home/models/store_model.dart'; +import '../bloc/order_detail/order_detail_bloc.dart'; +import '../models/track_record_model.dart'; +import '../widgets/product_tile.dart'; + +class TrackingOrderPage extends StatefulWidget { + final int orderId; + const TrackingOrderPage({ + super.key, + required this.orderId, + }); + + @override + State createState() => _TrackingOrderPageState(); +} + +class _TrackingOrderPageState extends State { + final List orders = [ + ProductModel( + images: [ + Assets.images.products.earphone.path, + Assets.images.products.earphone.path, + Assets.images.products.earphone.path, + ], + name: 'Earphone', + price: 320000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ProductModel( + images: [ + Assets.images.products.sepatu.path, + Assets.images.products.sepatu2.path, + Assets.images.products.sepatu.path, + ], + name: 'Sepatu Nike', + price: 2200000, + stock: 20, + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ', + store: StoreModel( + name: 'CWB Online Store', + type: StoreEnum.officialStore, + imageUrl: 'https://avatars.githubusercontent.com/u/534678?v=4', + ), + ), + ]; + final List trackRecords = [ + TrackRecordModel( + title: 'Pesanan Anda belum dibayar', + status: TrackRecordStatus.belumBayar, + isActive: true, + updatedAt: DateTime.now().subtract(const Duration(days: 3)), + ), + TrackRecordModel( + title: 'Pesanan Anda sedang disiapkan', + status: TrackRecordStatus.dikemas, + isActive: true, + updatedAt: DateTime.now().subtract(const Duration(days: 2)), + ), + TrackRecordModel( + title: 'Pesanan Anda dalam pengiriman', + status: TrackRecordStatus.dikirim, + isActive: true, + updatedAt: DateTime.now().subtract(const Duration(days: 1)), + ), + TrackRecordModel( + title: 'Pesanan Anda telah tiba', + status: TrackRecordStatus.selesai, + isActive: true, + updatedAt: DateTime.now(), + ), + ]; + + @override + void initState() { + context + .read() + .add(OrderDetailEvent.getOrderDetail(widget.orderId)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Detail Orders'), + ), + body: BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return const Center( + child: Text('No Data'), + ); + }, + loaded: (orderDetail) { + return ListView( + padding: const EdgeInsets.all(20.0), + children: [ + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: orderDetail.orderItems?.length ?? 0, + itemBuilder: (context, index) => ProductTile( + data: orderDetail.orderItems![index], + ), + separatorBuilder: (context, index) => + const SpaceHeight(16.0), + ), + const SpaceHeight(20.0), + // TrackingHorizontal(trackRecords: trackRecords), + Button.outlined( + onPressed: () { + context.pushNamed( + RouteConstants.shippingDetail, + pathParameters: PathParameters().toMap(), + extra: orderDetail.shippingResi.toString(), + ); + }, + label: 'Detail pelacakan pengiriman', + ), + const SpaceHeight(20.0), + const Text( + 'Info Pengiriman', + style: TextStyle( + fontSize: 20, + ), + ), + const SpaceHeight(20.0), + const Text( + 'Alamat Pesanan', + style: TextStyle( + fontSize: 16, + ), + ), + Text( + orderDetail.address!.fullAddress!, + style: const TextStyle( + fontSize: 16, + ), + ), + const SpaceHeight(16.0), + const Text( + 'Penerima', + style: TextStyle( + fontSize: 16, + ), + ), + Text( + orderDetail.user!.name!, + style: const TextStyle( + fontSize: 16, + ), + ), + ], + ); + }, + ); + }, + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/cart_tile.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/cart_tile.dart new file mode 100644 index 0000000..5de9e07 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/cart_tile.dart @@ -0,0 +1,141 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/core.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/models/product_quantity.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/orders/models/cart_model.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/constants/global_variable.dart'; +import '../../home/bloc/checkout/checkout_bloc.dart'; + +class CartTile extends StatelessWidget { + final ProductQuantity data; + const CartTile({super.key, required this.data}); + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(10.0)), + child: Slidable( + endActionPane: ActionPane( + extentRatio: 0.25, + motion: const StretchMotion(), + children: [ + SlidableAction( + onPressed: (context) {}, + backgroundColor: AppColors.primary.withOpacity(0.44), + foregroundColor: AppColors.red, + icon: Icons.delete_outlined, + borderRadius: const BorderRadius.horizontal( + right: Radius.circular(10.0), + ), + ), + ], + ), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 14.0, vertical: 10.0), + decoration: BoxDecoration( + border: Border.all(color: AppColors.stroke), + ), + child: Stack( + alignment: Alignment.bottomRight, + children: [ + Row( + children: [ + ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(10.0)), + child: Image.network( + data.product.image!.contains('http') + ? data.product.image! + : '${GlobalVariable.baseUrlImage}${data.product.image}', + width: 68.0, + height: 68.0, + fit: BoxFit.cover, + ), + ), + const SpaceWidth(14.0), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data.product.name ?? '', + style: const TextStyle( + fontSize: 14, + ), + overflow: TextOverflow.ellipsis, + ), + Row( + children: [ + Text( + data.product.price?.currencyFormatRp ?? '', + style: const TextStyle( + color: AppColors.primary, + fontSize: 14, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ], + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(5.0)), + child: InkWell( + onTap: () { + context + .read() + .add(CheckoutEvent.removeItem(data.product)); + }, + child: const ColoredBox( + color: AppColors.primary, + child: Padding( + padding: EdgeInsets.all(4.0), + child: Icon( + Icons.remove, + color: AppColors.white, + ), + ), + ), + ), + ), + const SpaceWidth(4.0), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text('${data.quantity}'), + ), + const SpaceWidth(4.0), + ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(5.0)), + child: InkWell( + onTap: () { + context + .read() + .add(CheckoutEvent.addItem(data.product)); + }, + child: const ColoredBox( + color: AppColors.primary, + child: Padding( + padding: EdgeInsets.all(4.0), + child: Icon( + Icons.add, + color: AppColors.white, + ), + ), + ), + ), + ), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/countdown_timer.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/countdown_timer.dart new file mode 100644 index 0000000..ad419c4 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/countdown_timer.dart @@ -0,0 +1,103 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; + +class CountdownTimer extends StatefulWidget { + final int minute; + final void Function() onTimerCompletion; + + const CountdownTimer({ + super.key, + required this.minute, + required this.onTimerCompletion, + }); + + @override + State createState() => _CountdownTimerState(); +} + +class _CountdownTimerState extends State { + late int _remainingHours; + late int _remainingMinutes; + late int _remainingSeconds; + late Timer _timer; + + @override + void initState() { + super.initState(); + _remainingHours = widget.minute ~/ 60; + _remainingMinutes = widget.minute % 60; + _remainingSeconds = 0; + _timer = Timer.periodic(const Duration(seconds: 1), _updateTimer); + } + + @override + void dispose() { + _timer.cancel(); + super.dispose(); + } + + void _updateTimer(Timer timer) { + if (_remainingHours == 0 && + _remainingMinutes == 0 && + _remainingSeconds == 0) { + _timer.cancel(); + widget.onTimerCompletion(); + } else { + setState(() { + if (_remainingMinutes == 0) { + _remainingHours--; + _remainingMinutes = 59; + } else if (_remainingSeconds == 0) { + _remainingMinutes--; + _remainingSeconds = 59; + } else { + _remainingSeconds--; + } + }); + } + } + + @override + Widget build(BuildContext context) { + return Row( + children: [ + _Time(_remainingHours), + const SpaceWidth(8.0), + _Time(_remainingMinutes), + const SpaceWidth(8.0), + _Time(_remainingSeconds), + ], + ); + } +} + +class _Time extends StatelessWidget { + final int time; + const _Time(this.time); + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(5.0)), + child: ColoredBox( + color: AppColors.primary, + child: SizedBox( + width: 24.0, + height: 24.0, + child: Center( + child: Text( + '$time', + style: const TextStyle( + color: AppColors.white, + ), + ), + ), + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/order_card.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/order_card.dart new file mode 100644 index 0000000..cab0954 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/order_card.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/router/app_router.dart'; +import '../../../data/models/responses/history_order_response_model.dart'; +import 'row_text.dart'; + +class OrderCard extends StatelessWidget { + final HistoryOrder data; + const OrderCard({super.key, required this.data}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + context.pushNamed( + RouteConstants.trackingOrder, + pathParameters: PathParameters().toMap(), + extra: data.id!, + ); + }, + child: Container( + padding: const EdgeInsets.all(16.0), + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(5.0)), + border: Border.all(color: AppColors.stroke), + ), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'NO RESI: ${data.shippingResi ?? '-'}', + style: const TextStyle(fontWeight: FontWeight.w700), + ), + Button.filled( + onPressed: () { + + }, + label: 'Lacak', + height: 20.0, + width: 94.0, + fontSize: 11.0, + ), + ], + ), + const SpaceHeight(24.0), + RowText(label: 'Status', value: data.status ?? '-'), + // const SpaceHeight(12.0), + // RowText(label: 'Item', value: data.quantity.toString() ?? '-'), + const SpaceHeight(12.0), + RowText( + label: 'Total Harga', value: data.totalCost!.currencyFormatRp), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/payment_method.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/payment_method.dart new file mode 100644 index 0000000..4f6a337 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/payment_method.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../models/bank_account_model.dart'; + +class PaymentMethod extends StatelessWidget { + final bool isActive; + final BankAccountModel data; + final VoidCallback onTap; + + const PaymentMethod({ + super.key, + required this.isActive, + required this.data, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.all(24.0), + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(10.0)), + border: Border.all(color: AppColors.stroke), + ), + child: Row( + children: [ + Image.asset( + data.image, + height: 30.0, + ), + const SpaceWidth(8.0), + Flexible( + child: Text( + data.name, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + ), + const Spacer(), + Icon( + isActive ? Icons.circle : Icons.circle_outlined, + color: isActive ? AppColors.primary : AppColors.grey, + ), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/product_tile.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/product_tile.dart new file mode 100644 index 0000000..331a5ca --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/product_tile.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; + +import '../../../../../core/constants/colors.dart'; +import '../../../data/models/responses/order_detail_response_model.dart'; + +class ProductTile extends StatelessWidget { + final OrderItem data; + const ProductTile({super.key, required this.data}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 14.0, vertical: 10.0), + decoration: BoxDecoration( + border: Border.all(color: AppColors.stroke), + borderRadius: const BorderRadius.all(Radius.circular(10.0)), + ), + child: Row( + children: [ + // ClipRRect( + // borderRadius: const BorderRadius.all(Radius.circular(10.0)), + // child: Image.network( + // '${Variables.baseUrlImage}${data.product!.image!}', + // width: 68.0, + // height: 68.0, + // ), + // ), + // const SpaceWidth(14.0), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data.product!.name!, + style: const TextStyle( + fontSize: 16, + ), + overflow: TextOverflow.ellipsis, + ), + Row( + children: [ + Text( + '${data.product!.price?.currencyFormatRp} x ${data.quantity} = ${(data.product!.price! * data.quantity!).currencyFormatRp}', + style: const TextStyle( + color: AppColors.primary, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ], + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/row_text.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/row_text.dart new file mode 100644 index 0000000..81bb529 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/row_text.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +import '../../../../../core/constants/colors.dart'; + +class RowText extends StatelessWidget { + final String label; + final String value; + final Color valueColor; + final FontWeight fontWeight; + + const RowText({ + super.key, + required this.label, + required this.value, + this.valueColor = AppColors.black, + this.fontWeight = FontWeight.w400, + }); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + label, + style: TextStyle( + fontSize: 12, + fontWeight: fontWeight, + ), + ), + Flexible( + child: Text( + value, + style: TextStyle( + fontSize: 12, + fontWeight: fontWeight, + color: valueColor, + ), + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/tracking_horizontal.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/tracking_horizontal.dart new file mode 100644 index 0000000..d850be1 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/tracking_horizontal.dart @@ -0,0 +1,141 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/router/app_router.dart'; +import '../models/track_record_model.dart'; + +class TrackingHorizontal extends StatelessWidget { + final List trackRecords; + const TrackingHorizontal({super.key, required this.trackRecords}); + + @override + Widget build(BuildContext context) { + final trackRecord = trackRecords.where((element) => element.isActive).last; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 20.0, + child: ListView.builder( + scrollDirection: Axis.horizontal, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: trackRecords.length, + itemBuilder: (BuildContext context, int index) => TrackingItem( + isActive: trackRecords[index].isActive, + isCurrent: + index == (trackRecords.where((e) => e.isActive).length - 1), + isLast: index == trackRecords.length - 1, + ), + ), + ), + const SpaceHeight(24.0), + Text( + trackRecord.title, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w700, + ), + ), + const SpaceHeight(4.0), + if (trackRecord.status != TrackRecordStatus.selesai) ...[ + const Text( + 'Estimasi tiba : 20 Januari 2024', + style: TextStyle( + fontSize: 16, + ), + ), + const SpaceHeight(20.0), + const Text( + 'Pesanan dikemas Penjual', + style: TextStyle( + fontSize: 16, + ), + ), + const Text( + 'Januari 14, 22:36', + style: TextStyle( + color: AppColors.grey, + ), + ), + const SpaceHeight(30.0), + Button.outlined( + disabled: trackRecord.status == TrackRecordStatus.dikirim, + onPressed: () {}, + label: 'Cancel order', + ), + ], + if (trackRecord.status == TrackRecordStatus.selesai) ...[ + Text( + 'Diterima : ${trackRecord.formattedDate}', + style: const TextStyle( + fontSize: 16, + ), + ), + const SpaceHeight(30.0), + Button.outlined( + onPressed: () { + context.goNamed( + RouteConstants.shippingDetail, + pathParameters: PathParameters().toMap(), + ); + }, + label: 'Detail pelacakan pengiriman', + ), + const SpaceHeight(8.0), + Button.filled( + onPressed: () { + context.goNamed( + RouteConstants.root, + pathParameters: PathParameters().toMap(), + ); + }, + label: 'Beli lagi', + ), + ], + ], + ); + } +} + +class TrackingItem extends StatelessWidget { + final bool isActive; + final bool isCurrent; + final bool isLast; + + const TrackingItem({ + super.key, + required this.isActive, + required this.isCurrent, + required this.isLast, + }); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + isCurrent ? Icons.radio_button_checked : Icons.circle, + color: + isActive ? AppColors.primary : AppColors.primary.withOpacity(0.2), + size: isCurrent ? 20.0 : 14.0, + ), + if (!isLast) + Flexible( + child: Container( + width: MediaQuery.of(context).size.width / 4.2, + height: 2.0, + color: isActive && !isCurrent + ? AppColors.primary + : AppColors.primary.withOpacity(0.2), + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/tracking_vertical.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/tracking_vertical.dart new file mode 100644 index 0000000..9415c0f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/ecommerce/presentation/orders/widgets/tracking_vertical.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../data/models/responses/tracking_response_model.dart'; + +class TrackignVertical extends StatelessWidget { + final List trackRecords; + const TrackignVertical({super.key, required this.trackRecords}); + + @override + Widget build(BuildContext context) { + // final sortedTrackRecords = trackRecords.toList() + // ..sort((a, b) => b.updatedAt.compareTo(a.updatedAt)); + + return ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: trackRecords.length, + itemBuilder: (BuildContext context, int index) => TrackingItem( + trackRecord: trackRecords[index], + isCurrent: index == 0, + isLast: index == trackRecords.length - 1, + ), + ); + } +} + +class TrackingItem extends StatelessWidget { + final Manifest trackRecord; + final bool isCurrent; + final bool isLast; + + const TrackingItem({ + super.key, + required this.trackRecord, + required this.isCurrent, + required this.isLast, + }); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: 65.0, + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + DateFormat('yyyy-MM-dd').format(trackRecord.manifestDate!), + textAlign: TextAlign.right, + style: const TextStyle( + fontSize: 16, + ), + ), + Text( + trackRecord.manifestTime.toString(), + style: const TextStyle( + color: AppColors.grey, + ), + ), + ], + ), + ), + const SpaceWidth(10.0), + SizedBox( + width: 20.0, + child: Column( + children: [ + Icon( + isCurrent ? Icons.radio_button_checked : Icons.circle, + color: AppColors.primary, + size: isCurrent ? 20.0 : 14.0, + ), + if (!isLast) + Container( + width: 2, + height: 90.0, + color: AppColors.primary, + ), + ], + ), + ), + const SpaceWidth(10.0), + Flexible( + child: RichText( + text: TextSpan( + text: '[${trackRecord.manifestCode}] ', + children: [ + TextSpan( + text: trackRecord.manifestDescription, + style: const TextStyle( + fontWeight: FontWeight.w400, + ), + ), + ], + style: TextStyle( + color: isCurrent ? AppColors.primary : AppColors.grey, + fontWeight: FontWeight.w700, + ), + ), + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/data/dataoutputs/print_dataoutputs.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/data/dataoutputs/print_dataoutputs.dart new file mode 100644 index 0000000..85ffceb --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/data/dataoutputs/print_dataoutputs.dart @@ -0,0 +1,170 @@ +import 'package:esc_pos_utils_plus/esc_pos_utils_plus.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/models/product_quantity.dart'; +import 'package:intl/intl.dart'; + +class PrintDataoutputs { + PrintDataoutputs._init(); + + static final PrintDataoutputs instance = PrintDataoutputs._init(); + + Future> printOrder( + List products, + int paymentAmount, + int totalQuantity, + int totalPrice, + String paymentMethod, + int nominalBayar, + String namaKasir, + int discount, + int subTotal, + int kembalian, + int normalPrice) async { + List bytes = []; + + final profile = await CapabilityProfile.load(); + final generator = Generator(PaperSize.mm58, profile); + + final total = totalPrice; + + bytes += generator.reset(); + bytes += generator.text('Nusa Dua Agro', + styles: const PosStyles( + bold: true, + align: PosAlign.center, + height: PosTextSize.size1, + width: PosTextSize.size1, + )); + + bytes += generator.text('Jl.Koptu Berlian No 115', + styles: const PosStyles(bold: true, align: PosAlign.center)); + bytes += generator.text( + 'Tanggal : ${DateFormat('dd/MM/yyyy HH:mm').format(DateTime.now())}', + styles: const PosStyles(bold: false, align: PosAlign.center)); + + bytes += generator.feed(1); + bytes += generator.text('Pesanan:', + styles: const PosStyles(bold: false, align: PosAlign.center)); + + for (final product in products) { + bytes += generator.text(product.product.name!, + styles: const PosStyles(align: PosAlign.left)); + + bytes += generator.row([ + PosColumn( + text: + '${product.product.price!.currencyFormatRp} x ${product.quantity}', + width: 8, + styles: const PosStyles(align: PosAlign.left), + ), + PosColumn( + text: '${product.product.price! * product.quantity}' + .toIntegerFromText + .currencyFormatRp, + width: 4, + styles: const PosStyles(align: PosAlign.right), + ), + ]); + } + + bytes += generator.feed(1); + + bytes += generator.row([ + PosColumn( + text: 'Normal harga', + width: 6, + styles: const PosStyles(align: PosAlign.left), + ), + PosColumn( + text: normalPrice.currencyFormatRp, + width: 6, + styles: const PosStyles(align: PosAlign.right), + ), + ]); + + bytes += generator.row([ + PosColumn( + text: 'Diskon', + width: 6, + styles: const PosStyles(align: PosAlign.left), + ), + PosColumn( + text: discount.currencyFormatRp, + width: 6, + styles: const PosStyles(align: PosAlign.right), + ), + ]); + + bytes += generator.row([ + PosColumn( + text: 'Sub total', + width: 6, + styles: const PosStyles(align: PosAlign.left), + ), + PosColumn( + text: totalPrice.currencyFormatRp, + width: 6, + styles: const PosStyles(align: PosAlign.right), + ), + ]); + bytes += generator.row([ + PosColumn( + text: 'Total bayar', + width: 6, + styles: const PosStyles(align: PosAlign.left), + ), + PosColumn( + text: subTotal.currencyFormatRp, + width: 6, + styles: const PosStyles(align: PosAlign.right), + ), + ]); + + bytes += generator.row([ + PosColumn( + text: 'Bayar', + width: 6, + styles: const PosStyles(align: PosAlign.left), + ), + PosColumn( + text: paymentAmount.ceil().currencyFormatRp, + width: 6, + styles: const PosStyles(align: PosAlign.right), + ), + ]); + bytes += generator.row([ + PosColumn( + text: 'Kembalian', + width: 6, + styles: const PosStyles(align: PosAlign.left), + ), + PosColumn( + text: kembalian.ceil().currencyFormatRp, + width: 6, + styles: const PosStyles(align: PosAlign.right), + ), + ]); + + bytes += generator.row([ + PosColumn( + text: 'Pembayaran', + width: 8, + styles: const PosStyles(align: PosAlign.left), + ), + PosColumn( + text: paymentMethod, + width: 4, + styles: const PosStyles(align: PosAlign.right), + ), + ]); + + bytes += generator.feed(1); + bytes += generator.text('Selalu siap melayani kebutuhan pertanian Anda', + styles: const PosStyles(bold: false, align: PosAlign.center)); + bytes += generator.text('Terima kasih atas kunjungannya ', + styles: const PosStyles(bold: false, align: PosAlign.center)); + bytes += generator.feed(3); + return bytes; + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_bloc.dart new file mode 100644 index 0000000..9209a77 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_bloc.dart @@ -0,0 +1,18 @@ +import 'package:bloc/bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/order/models/order_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'history_pos_event.dart'; +part 'history_pos_state.dart'; +part 'history_pos_bloc.freezed.dart'; + +class HistoryPosBloc extends Bloc { + HistoryPosBloc() : super(const _Initial()) { + on<_Fetch>((event, emit) async { + emit(const _Loading()); + final data = await ProductLocalDatasource.instance.getAllOrder(); + emit(_Loaded(data)); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_bloc.freezed.dart new file mode 100644 index 0000000..5972f22 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_bloc.freezed.dart @@ -0,0 +1,876 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'history_pos_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$HistoryPosEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() fetch, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? fetch, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? fetch, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Fetch value) fetch, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Fetch value)? fetch, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Fetch value)? fetch, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $HistoryPosEventCopyWith<$Res> { + factory $HistoryPosEventCopyWith( + HistoryPosEvent value, $Res Function(HistoryPosEvent) then) = + _$HistoryPosEventCopyWithImpl<$Res, HistoryPosEvent>; +} + +/// @nodoc +class _$HistoryPosEventCopyWithImpl<$Res, $Val extends HistoryPosEvent> + implements $HistoryPosEventCopyWith<$Res> { + _$HistoryPosEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$HistoryPosEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'HistoryPosEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() fetch, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? fetch, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? fetch, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Fetch value) fetch, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Fetch value)? fetch, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Fetch value)? fetch, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements HistoryPosEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$FetchImplCopyWith<$Res> { + factory _$$FetchImplCopyWith( + _$FetchImpl value, $Res Function(_$FetchImpl) then) = + __$$FetchImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$FetchImplCopyWithImpl<$Res> + extends _$HistoryPosEventCopyWithImpl<$Res, _$FetchImpl> + implements _$$FetchImplCopyWith<$Res> { + __$$FetchImplCopyWithImpl( + _$FetchImpl _value, $Res Function(_$FetchImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$FetchImpl implements _Fetch { + const _$FetchImpl(); + + @override + String toString() { + return 'HistoryPosEvent.fetch()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$FetchImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() fetch, + }) { + return fetch(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? fetch, + }) { + return fetch?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? fetch, + required TResult orElse(), + }) { + if (fetch != null) { + return fetch(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Fetch value) fetch, + }) { + return fetch(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Fetch value)? fetch, + }) { + return fetch?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Fetch value)? fetch, + required TResult orElse(), + }) { + if (fetch != null) { + return fetch(this); + } + return orElse(); + } +} + +abstract class _Fetch implements HistoryPosEvent { + const factory _Fetch() = _$FetchImpl; +} + +/// @nodoc +mixin _$HistoryPosState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List histories) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List histories)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List histories)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $HistoryPosStateCopyWith<$Res> { + factory $HistoryPosStateCopyWith( + HistoryPosState value, $Res Function(HistoryPosState) then) = + _$HistoryPosStateCopyWithImpl<$Res, HistoryPosState>; +} + +/// @nodoc +class _$HistoryPosStateCopyWithImpl<$Res, $Val extends HistoryPosState> + implements $HistoryPosStateCopyWith<$Res> { + _$HistoryPosStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$HistoryPosStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'HistoryPosState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List histories) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List histories)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List histories)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements HistoryPosState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$HistoryPosStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'HistoryPosState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List histories) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List histories)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List histories)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements HistoryPosState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List histories}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$HistoryPosStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? histories = null, + }) { + return _then(_$LoadedImpl( + null == histories + ? _value._histories + : histories // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List histories) : _histories = histories; + + final List _histories; + @override + List get histories { + if (_histories is EqualUnmodifiableListView) return _histories; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_histories); + } + + @override + String toString() { + return 'HistoryPosState.loaded(histories: $histories)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality() + .equals(other._histories, _histories)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_histories)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List histories) loaded, + required TResult Function(String message) error, + }) { + return loaded(histories); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List histories)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(histories); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List histories)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(histories); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements HistoryPosState { + const factory _Loaded(final List histories) = _$LoadedImpl; + + List get histories; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$HistoryPosStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'HistoryPosState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List histories) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List histories)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List histories)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements HistoryPosState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_event.dart new file mode 100644 index 0000000..b65974c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_event.dart @@ -0,0 +1,7 @@ +part of 'history_pos_bloc.dart'; + +@freezed +class HistoryPosEvent with _$HistoryPosEvent { + const factory HistoryPosEvent.started() = _Started; + const factory HistoryPosEvent.fetch() = _Fetch; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_state.dart new file mode 100644 index 0000000..d9534f2 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/bloc/bloc/history_pos_state.dart @@ -0,0 +1,9 @@ +part of 'history_pos_bloc.dart'; + +@freezed +class HistoryPosState with _$HistoryPosState { + const factory HistoryPosState.initial() = _Initial; + const factory HistoryPosState.loading() = _Loading; + const factory HistoryPosState.loaded(List histories) = _Loaded; + const factory HistoryPosState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/models/history_transaction_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/models/history_transaction_model.dart new file mode 100644 index 0000000..f63248c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/models/history_transaction_model.dart @@ -0,0 +1,15 @@ +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; + +class HistoryTransactionModel { + final String name; + final String category; + final int price; + + HistoryTransactionModel({ + required this.name, + required this.category, + required this.price, + }); + + String get priceFormat => price.currencyFormatRp; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/pages/history_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/pages/history_page.dart new file mode 100644 index 0000000..b83570f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/pages/history_page.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/history/bloc/bloc/history_pos_bloc.dart'; + +import '../../../../../core/components/spaces.dart'; +import '../models/history_transaction_model.dart'; +import '../widgets/history_transaction_card.dart'; + +class HistoryPage extends StatefulWidget { + const HistoryPage({super.key}); + + @override + State createState() => _HistoryPageState(); +} + +class _HistoryPageState extends State { + @override + void initState() { + super.initState(); + context.read().add(const HistoryPosEvent.fetch()); + } + + @override + Widget build(BuildContext context) { + const paddingHorizontal = EdgeInsets.symmetric(horizontal: 16.0); + // final indeValue = ValueNotifier(0); + + // final List historyTransactions = [ + // HistoryTransactionModel( + // name: 'Payment 1', + // category: 'Category A', + // price: 50000, + // ), + // HistoryTransactionModel( + // name: 'Payment 2', + // category: 'Category B', + // price: 75000, + // ), + // HistoryTransactionModel( + // name: 'Payment 3', + // category: 'Category C', + // price: 100000, + // ), + // ]; + + return Scaffold( + appBar: AppBar( + title: const Text('History Orders', + style: TextStyle(fontWeight: FontWeight.bold)), + // backgroundColor: AppColors.primary, + elevation: 0, + centerTitle: true, + ), + body: BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const Center( + child: Text('No Data'), + ), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (histories) { + return ListView.separated( + padding: const EdgeInsets.symmetric(vertical: 30.0), + itemCount: histories.length, + separatorBuilder: (context, index) => const SpaceHeight(8.0), + itemBuilder: (context, index) => HistoryTransactionCard( + padding: paddingHorizontal, + data: histories[index], + ), + ); + }, + ); + }, + )); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/widgets/history_transaction_card.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/widgets/history_transaction_card.dart new file mode 100644 index 0000000..e9da105 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/history/widgets/history_transaction_card.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/order/models/order_model.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/constants/colors.dart'; + + +class HistoryTransactionCard extends StatelessWidget { + final OrderModel data; + final EdgeInsetsGeometry? padding; + + const HistoryTransactionCard({ + super.key, + required this.data, + this.padding, + }); + + @override + Widget build(BuildContext context) { + return Container( + margin: padding, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + offset: const Offset(0, 2), + blurRadius: 48.0, + blurStyle: BlurStyle.outer, + spreadRadius: 0, + color: AppColors.black.withOpacity(0.06), + ), + ], + ), + child: ListTile( + leading: Assets.icons.payments.svg(), + title: Text(data.paymentMethod), + subtitle: Text('${data.totalItem} items'), + trailing: Text( + data.subtotal.currencyFormatRp, + style: const TextStyle( + color: AppColors.green, + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart new file mode 100644 index 0000000..fc2d232 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart @@ -0,0 +1,60 @@ +import 'package:bloc/bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/discount_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import '../../models/product_quantity.dart'; +part 'checkout_pos_event.dart'; +part 'checkout_pos_state.dart'; +part 'checkout_pos_bloc.freezed.dart'; + +class CheckoutPosBloc extends Bloc { + CheckoutPosBloc() : super(const _Loaded([], null)) { + on<_AddItem>((event, emit) { + var currentState = state as _Loaded; + List items = [...currentState.items]; + var index = + items.indexWhere((element) => element.product.id == event.product.id); + emit(const _Loading()); + if (index != -1) { + items[index] = ProductQuantity( + product: event.product, quantity: items[index].quantity + 1); + } else { + items.add(ProductQuantity(product: event.product, quantity: 1)); + } + emit(_Loaded(items, currentState.discount)); + }); + + on<_RemoveItem>((event, emit) { + var currentState = state as _Loaded; + List items = [...currentState.items]; + var index = + items.indexWhere((element) => element.product.id == event.product.id); + emit(const _Loading()); + if (index != -1) { + if (items[index].quantity > 1) { + items[index] = ProductQuantity( + product: event.product, quantity: items[index].quantity - 1); + } else { + items.removeAt(index); + } + } + emit(_Loaded(items, currentState.discount)); + }); + + on<_Started>((event, emit) { + emit(const _Loaded([], null)); + }); + + on<_AddDiscount>((event, emit) { + var currentState = state as _Loaded; + emit(_Loaded(currentState.items, event.discount)); + }); + + on<_RemoveDiscount>((event, emit) { + var currentState = state as _Loaded; + emit(_Loaded(currentState.items, null)); + }); + + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.freezed.dart new file mode 100644 index 0000000..fdc0085 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.freezed.dart @@ -0,0 +1,1402 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'checkout_pos_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$CheckoutPosEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CheckoutPosEventCopyWith<$Res> { + factory $CheckoutPosEventCopyWith( + CheckoutPosEvent value, $Res Function(CheckoutPosEvent) then) = + _$CheckoutPosEventCopyWithImpl<$Res, CheckoutPosEvent>; +} + +/// @nodoc +class _$CheckoutPosEventCopyWithImpl<$Res, $Val extends CheckoutPosEvent> + implements $CheckoutPosEventCopyWith<$Res> { + _$CheckoutPosEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$CheckoutPosEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'CheckoutPosEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements CheckoutPosEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$AddItemImplCopyWith<$Res> { + factory _$$AddItemImplCopyWith( + _$AddItemImpl value, $Res Function(_$AddItemImpl) then) = + __$$AddItemImplCopyWithImpl<$Res>; + @useResult + $Res call({Product product}); +} + +/// @nodoc +class __$$AddItemImplCopyWithImpl<$Res> + extends _$CheckoutPosEventCopyWithImpl<$Res, _$AddItemImpl> + implements _$$AddItemImplCopyWith<$Res> { + __$$AddItemImplCopyWithImpl( + _$AddItemImpl _value, $Res Function(_$AddItemImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? product = null, + }) { + return _then(_$AddItemImpl( + null == product + ? _value.product + : product // ignore: cast_nullable_to_non_nullable + as Product, + )); + } +} + +/// @nodoc + +class _$AddItemImpl implements _AddItem { + const _$AddItemImpl(this.product); + + @override + final Product product; + + @override + String toString() { + return 'CheckoutPosEvent.addItem(product: $product)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AddItemImpl && + (identical(other.product, product) || other.product == product)); + } + + @override + int get hashCode => Object.hash(runtimeType, product); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AddItemImplCopyWith<_$AddItemImpl> get copyWith => + __$$AddItemImplCopyWithImpl<_$AddItemImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + }) { + return addItem(product); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + }) { + return addItem?.call(product); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + required TResult orElse(), + }) { + if (addItem != null) { + return addItem(product); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + }) { + return addItem(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + }) { + return addItem?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + required TResult orElse(), + }) { + if (addItem != null) { + return addItem(this); + } + return orElse(); + } +} + +abstract class _AddItem implements CheckoutPosEvent { + const factory _AddItem(final Product product) = _$AddItemImpl; + + Product get product; + @JsonKey(ignore: true) + _$$AddItemImplCopyWith<_$AddItemImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$RemoveItemImplCopyWith<$Res> { + factory _$$RemoveItemImplCopyWith( + _$RemoveItemImpl value, $Res Function(_$RemoveItemImpl) then) = + __$$RemoveItemImplCopyWithImpl<$Res>; + @useResult + $Res call({Product product}); +} + +/// @nodoc +class __$$RemoveItemImplCopyWithImpl<$Res> + extends _$CheckoutPosEventCopyWithImpl<$Res, _$RemoveItemImpl> + implements _$$RemoveItemImplCopyWith<$Res> { + __$$RemoveItemImplCopyWithImpl( + _$RemoveItemImpl _value, $Res Function(_$RemoveItemImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? product = null, + }) { + return _then(_$RemoveItemImpl( + null == product + ? _value.product + : product // ignore: cast_nullable_to_non_nullable + as Product, + )); + } +} + +/// @nodoc + +class _$RemoveItemImpl implements _RemoveItem { + const _$RemoveItemImpl(this.product); + + @override + final Product product; + + @override + String toString() { + return 'CheckoutPosEvent.removeItem(product: $product)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$RemoveItemImpl && + (identical(other.product, product) || other.product == product)); + } + + @override + int get hashCode => Object.hash(runtimeType, product); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$RemoveItemImplCopyWith<_$RemoveItemImpl> get copyWith => + __$$RemoveItemImplCopyWithImpl<_$RemoveItemImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + }) { + return removeItem(product); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + }) { + return removeItem?.call(product); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + required TResult orElse(), + }) { + if (removeItem != null) { + return removeItem(product); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + }) { + return removeItem(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + }) { + return removeItem?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + required TResult orElse(), + }) { + if (removeItem != null) { + return removeItem(this); + } + return orElse(); + } +} + +abstract class _RemoveItem implements CheckoutPosEvent { + const factory _RemoveItem(final Product product) = _$RemoveItemImpl; + + Product get product; + @JsonKey(ignore: true) + _$$RemoveItemImplCopyWith<_$RemoveItemImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$AddDiscountImplCopyWith<$Res> { + factory _$$AddDiscountImplCopyWith( + _$AddDiscountImpl value, $Res Function(_$AddDiscountImpl) then) = + __$$AddDiscountImplCopyWithImpl<$Res>; + @useResult + $Res call({Discount discount}); +} + +/// @nodoc +class __$$AddDiscountImplCopyWithImpl<$Res> + extends _$CheckoutPosEventCopyWithImpl<$Res, _$AddDiscountImpl> + implements _$$AddDiscountImplCopyWith<$Res> { + __$$AddDiscountImplCopyWithImpl( + _$AddDiscountImpl _value, $Res Function(_$AddDiscountImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? discount = null, + }) { + return _then(_$AddDiscountImpl( + null == discount + ? _value.discount + : discount // ignore: cast_nullable_to_non_nullable + as Discount, + )); + } +} + +/// @nodoc + +class _$AddDiscountImpl implements _AddDiscount { + const _$AddDiscountImpl(this.discount); + + @override + final Discount discount; + + @override + String toString() { + return 'CheckoutPosEvent.addDiscount(discount: $discount)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AddDiscountImpl && + (identical(other.discount, discount) || + other.discount == discount)); + } + + @override + int get hashCode => Object.hash(runtimeType, discount); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AddDiscountImplCopyWith<_$AddDiscountImpl> get copyWith => + __$$AddDiscountImplCopyWithImpl<_$AddDiscountImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + }) { + return addDiscount(discount); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + }) { + return addDiscount?.call(discount); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + required TResult orElse(), + }) { + if (addDiscount != null) { + return addDiscount(discount); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + }) { + return addDiscount(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + }) { + return addDiscount?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + required TResult orElse(), + }) { + if (addDiscount != null) { + return addDiscount(this); + } + return orElse(); + } +} + +abstract class _AddDiscount implements CheckoutPosEvent { + const factory _AddDiscount(final Discount discount) = _$AddDiscountImpl; + + Discount get discount; + @JsonKey(ignore: true) + _$$AddDiscountImplCopyWith<_$AddDiscountImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$RemoveDiscountImplCopyWith<$Res> { + factory _$$RemoveDiscountImplCopyWith(_$RemoveDiscountImpl value, + $Res Function(_$RemoveDiscountImpl) then) = + __$$RemoveDiscountImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$RemoveDiscountImplCopyWithImpl<$Res> + extends _$CheckoutPosEventCopyWithImpl<$Res, _$RemoveDiscountImpl> + implements _$$RemoveDiscountImplCopyWith<$Res> { + __$$RemoveDiscountImplCopyWithImpl( + _$RemoveDiscountImpl _value, $Res Function(_$RemoveDiscountImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$RemoveDiscountImpl implements _RemoveDiscount { + const _$RemoveDiscountImpl(); + + @override + String toString() { + return 'CheckoutPosEvent.removeDiscount()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$RemoveDiscountImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(Product product) addItem, + required TResult Function(Product product) removeItem, + required TResult Function(Discount discount) addDiscount, + required TResult Function() removeDiscount, + }) { + return removeDiscount(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(Product product)? addItem, + TResult? Function(Product product)? removeItem, + TResult? Function(Discount discount)? addDiscount, + TResult? Function()? removeDiscount, + }) { + return removeDiscount?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(Product product)? addItem, + TResult Function(Product product)? removeItem, + TResult Function(Discount discount)? addDiscount, + TResult Function()? removeDiscount, + required TResult orElse(), + }) { + if (removeDiscount != null) { + return removeDiscount(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddItem value) addItem, + required TResult Function(_RemoveItem value) removeItem, + required TResult Function(_AddDiscount value) addDiscount, + required TResult Function(_RemoveDiscount value) removeDiscount, + }) { + return removeDiscount(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddItem value)? addItem, + TResult? Function(_RemoveItem value)? removeItem, + TResult? Function(_AddDiscount value)? addDiscount, + TResult? Function(_RemoveDiscount value)? removeDiscount, + }) { + return removeDiscount?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddItem value)? addItem, + TResult Function(_RemoveItem value)? removeItem, + TResult Function(_AddDiscount value)? addDiscount, + TResult Function(_RemoveDiscount value)? removeDiscount, + required TResult orElse(), + }) { + if (removeDiscount != null) { + return removeDiscount(this); + } + return orElse(); + } +} + +abstract class _RemoveDiscount implements CheckoutPosEvent { + const factory _RemoveDiscount() = _$RemoveDiscountImpl; +} + +/// @nodoc +mixin _$CheckoutPosState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List items, Discount? discount) + loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List items, Discount? discount)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List items, Discount? discount)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CheckoutPosStateCopyWith<$Res> { + factory $CheckoutPosStateCopyWith( + CheckoutPosState value, $Res Function(CheckoutPosState) then) = + _$CheckoutPosStateCopyWithImpl<$Res, CheckoutPosState>; +} + +/// @nodoc +class _$CheckoutPosStateCopyWithImpl<$Res, $Val extends CheckoutPosState> + implements $CheckoutPosStateCopyWith<$Res> { + _$CheckoutPosStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$CheckoutPosStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'CheckoutPosState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List items, Discount? discount) + loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List items, Discount? discount)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List items, Discount? discount)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements CheckoutPosState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$CheckoutPosStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'CheckoutPosState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List items, Discount? discount) + loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List items, Discount? discount)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List items, Discount? discount)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements CheckoutPosState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List items, Discount? discount}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$CheckoutPosStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? items = null, + Object? discount = freezed, + }) { + return _then(_$LoadedImpl( + null == items + ? _value._items + : items // ignore: cast_nullable_to_non_nullable + as List, + freezed == discount + ? _value.discount + : discount // ignore: cast_nullable_to_non_nullable + as Discount?, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List items, this.discount) + : _items = items; + + final List _items; + @override + List get items { + if (_items is EqualUnmodifiableListView) return _items; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_items); + } + + @override + final Discount? discount; + + @override + String toString() { + return 'CheckoutPosState.loaded(items: $items, discount: $discount)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality().equals(other._items, _items) && + (identical(other.discount, discount) || + other.discount == discount)); + } + + @override + int get hashCode => Object.hash( + runtimeType, const DeepCollectionEquality().hash(_items), discount); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List items, Discount? discount) + loaded, + required TResult Function(String message) error, + }) { + return loaded(items, discount); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List items, Discount? discount)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(items, discount); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List items, Discount? discount)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(items, discount); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements CheckoutPosState { + const factory _Loaded( + final List items, final Discount? discount) = + _$LoadedImpl; + + List get items; + Discount? get discount; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$CheckoutPosStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'CheckoutPosState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List items, Discount? discount) + loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List items, Discount? discount)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List items, Discount? discount)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements CheckoutPosState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_event.dart new file mode 100644 index 0000000..e4fb796 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_event.dart @@ -0,0 +1,10 @@ +part of 'checkout_pos_bloc.dart'; + +@freezed +class CheckoutPosEvent with _$CheckoutPosEvent { + const factory CheckoutPosEvent.started() = _Started; + const factory CheckoutPosEvent.addItem(Product product) = _AddItem; + const factory CheckoutPosEvent.removeItem(Product product) = _RemoveItem; + const factory CheckoutPosEvent.addDiscount(Discount discount) = _AddDiscount; + const factory CheckoutPosEvent.removeDiscount() = _RemoveDiscount; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_state.dart new file mode 100644 index 0000000..7553c96 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_state.dart @@ -0,0 +1,9 @@ +part of 'checkout_pos_bloc.dart'; + +@freezed +class CheckoutPosState with _$CheckoutPosState { + const factory CheckoutPosState.initial() = _Initial; + const factory CheckoutPosState.loading() = _Loading; + const factory CheckoutPosState.loaded(List items, Discount? discount,) = _Loaded; + const factory CheckoutPosState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_bloc.dart new file mode 100644 index 0000000..4957f70 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_bloc.dart @@ -0,0 +1,58 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; + +part 'local_product_bloc.freezed.dart'; +part 'local_product_event.dart'; +part 'local_product_state.dart'; + +class LocalProductBloc extends Bloc { + final ProductLocalDatasource productLocalDatasource; + List products = []; + LocalProductBloc( + this.productLocalDatasource, + ) : super(const LocalProductState.initial()) { + on<_GetLocalProduct>((event, emit) async { + emit(const LocalProductState.loading()); + final result = await productLocalDatasource.getAllProduct(); + products = result; + emit(LocalProductState.loaded(products)); + }); + + on<_GetLocalProductByCategoryId>((event, emit) async { + emit(const LocalProductState.loading()); + final newProducts = event.categoryId == 0 + ? products + : products + .where((element) => element.categoryId == event.categoryId) + .toList(); + + emit(LocalProductState.loaded(newProducts)); + }); + + on<_AddProduct>((event, emit) async { + emit(const LocalProductState.loading()); + final newProduct = + await ProductLocalDatasource.instance.insertProduct(event.product); + products.add(newProduct); + + emit(LocalProductState.loaded(products)); + }); + + on<_SearchProduct>((event, emit) async { + emit(const LocalProductState.loading()); + final newProducts = products + .where((element) => + element.name!.toLowerCase().contains(event.query.toLowerCase())) + .toList(); + emit(LocalProductState.loaded(newProducts)); + }); + on<_FetchAllFromState>((event, emit) async { + emit(const LocalProductState.loading()); + emit(LocalProductState.loaded(products)); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_bloc.freezed.dart new file mode 100644 index 0000000..10c1822 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_bloc.freezed.dart @@ -0,0 +1,1572 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'local_product_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$LocalProductEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getLocalProduct, + required TResult Function(Product product) addProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAllFromState, + required TResult Function(int categoryId) getLocalProductByCategoryId, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getLocalProduct, + TResult? Function(Product product)? addProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAllFromState, + TResult? Function(int categoryId)? getLocalProductByCategoryId, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getLocalProduct, + TResult Function(Product product)? addProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAllFromState, + TResult Function(int categoryId)? getLocalProductByCategoryId, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetLocalProduct value) getLocalProduct, + required TResult Function(_AddProduct value) addProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAllFromState value) fetchAllFromState, + required TResult Function(_GetLocalProductByCategoryId value) + getLocalProductByCategoryId, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetLocalProduct value)? getLocalProduct, + TResult? Function(_AddProduct value)? addProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAllFromState value)? fetchAllFromState, + TResult? Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetLocalProduct value)? getLocalProduct, + TResult Function(_AddProduct value)? addProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAllFromState value)? fetchAllFromState, + TResult Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LocalProductEventCopyWith<$Res> { + factory $LocalProductEventCopyWith( + LocalProductEvent value, $Res Function(LocalProductEvent) then) = + _$LocalProductEventCopyWithImpl<$Res, LocalProductEvent>; +} + +/// @nodoc +class _$LocalProductEventCopyWithImpl<$Res, $Val extends LocalProductEvent> + implements $LocalProductEventCopyWith<$Res> { + _$LocalProductEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$LocalProductEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'LocalProductEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getLocalProduct, + required TResult Function(Product product) addProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAllFromState, + required TResult Function(int categoryId) getLocalProductByCategoryId, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getLocalProduct, + TResult? Function(Product product)? addProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAllFromState, + TResult? Function(int categoryId)? getLocalProductByCategoryId, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getLocalProduct, + TResult Function(Product product)? addProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAllFromState, + TResult Function(int categoryId)? getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetLocalProduct value) getLocalProduct, + required TResult Function(_AddProduct value) addProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAllFromState value) fetchAllFromState, + required TResult Function(_GetLocalProductByCategoryId value) + getLocalProductByCategoryId, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetLocalProduct value)? getLocalProduct, + TResult? Function(_AddProduct value)? addProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAllFromState value)? fetchAllFromState, + TResult? Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetLocalProduct value)? getLocalProduct, + TResult Function(_AddProduct value)? addProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAllFromState value)? fetchAllFromState, + TResult Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements LocalProductEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetLocalProductImplCopyWith<$Res> { + factory _$$GetLocalProductImplCopyWith(_$GetLocalProductImpl value, + $Res Function(_$GetLocalProductImpl) then) = + __$$GetLocalProductImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$GetLocalProductImplCopyWithImpl<$Res> + extends _$LocalProductEventCopyWithImpl<$Res, _$GetLocalProductImpl> + implements _$$GetLocalProductImplCopyWith<$Res> { + __$$GetLocalProductImplCopyWithImpl( + _$GetLocalProductImpl _value, $Res Function(_$GetLocalProductImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$GetLocalProductImpl implements _GetLocalProduct { + const _$GetLocalProductImpl(); + + @override + String toString() { + return 'LocalProductEvent.getLocalProduct()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$GetLocalProductImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getLocalProduct, + required TResult Function(Product product) addProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAllFromState, + required TResult Function(int categoryId) getLocalProductByCategoryId, + }) { + return getLocalProduct(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getLocalProduct, + TResult? Function(Product product)? addProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAllFromState, + TResult? Function(int categoryId)? getLocalProductByCategoryId, + }) { + return getLocalProduct?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getLocalProduct, + TResult Function(Product product)? addProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAllFromState, + TResult Function(int categoryId)? getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (getLocalProduct != null) { + return getLocalProduct(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetLocalProduct value) getLocalProduct, + required TResult Function(_AddProduct value) addProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAllFromState value) fetchAllFromState, + required TResult Function(_GetLocalProductByCategoryId value) + getLocalProductByCategoryId, + }) { + return getLocalProduct(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetLocalProduct value)? getLocalProduct, + TResult? Function(_AddProduct value)? addProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAllFromState value)? fetchAllFromState, + TResult? Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + }) { + return getLocalProduct?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetLocalProduct value)? getLocalProduct, + TResult Function(_AddProduct value)? addProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAllFromState value)? fetchAllFromState, + TResult Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (getLocalProduct != null) { + return getLocalProduct(this); + } + return orElse(); + } +} + +abstract class _GetLocalProduct implements LocalProductEvent { + const factory _GetLocalProduct() = _$GetLocalProductImpl; +} + +/// @nodoc +abstract class _$$AddProductImplCopyWith<$Res> { + factory _$$AddProductImplCopyWith( + _$AddProductImpl value, $Res Function(_$AddProductImpl) then) = + __$$AddProductImplCopyWithImpl<$Res>; + @useResult + $Res call({Product product}); +} + +/// @nodoc +class __$$AddProductImplCopyWithImpl<$Res> + extends _$LocalProductEventCopyWithImpl<$Res, _$AddProductImpl> + implements _$$AddProductImplCopyWith<$Res> { + __$$AddProductImplCopyWithImpl( + _$AddProductImpl _value, $Res Function(_$AddProductImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? product = null, + }) { + return _then(_$AddProductImpl( + null == product + ? _value.product + : product // ignore: cast_nullable_to_non_nullable + as Product, + )); + } +} + +/// @nodoc + +class _$AddProductImpl implements _AddProduct { + const _$AddProductImpl(this.product); + + @override + final Product product; + + @override + String toString() { + return 'LocalProductEvent.addProduct(product: $product)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AddProductImpl && + (identical(other.product, product) || other.product == product)); + } + + @override + int get hashCode => Object.hash(runtimeType, product); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AddProductImplCopyWith<_$AddProductImpl> get copyWith => + __$$AddProductImplCopyWithImpl<_$AddProductImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getLocalProduct, + required TResult Function(Product product) addProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAllFromState, + required TResult Function(int categoryId) getLocalProductByCategoryId, + }) { + return addProduct(product); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getLocalProduct, + TResult? Function(Product product)? addProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAllFromState, + TResult? Function(int categoryId)? getLocalProductByCategoryId, + }) { + return addProduct?.call(product); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getLocalProduct, + TResult Function(Product product)? addProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAllFromState, + TResult Function(int categoryId)? getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (addProduct != null) { + return addProduct(product); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetLocalProduct value) getLocalProduct, + required TResult Function(_AddProduct value) addProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAllFromState value) fetchAllFromState, + required TResult Function(_GetLocalProductByCategoryId value) + getLocalProductByCategoryId, + }) { + return addProduct(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetLocalProduct value)? getLocalProduct, + TResult? Function(_AddProduct value)? addProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAllFromState value)? fetchAllFromState, + TResult? Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + }) { + return addProduct?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetLocalProduct value)? getLocalProduct, + TResult Function(_AddProduct value)? addProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAllFromState value)? fetchAllFromState, + TResult Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (addProduct != null) { + return addProduct(this); + } + return orElse(); + } +} + +abstract class _AddProduct implements LocalProductEvent { + const factory _AddProduct(final Product product) = _$AddProductImpl; + + Product get product; + @JsonKey(ignore: true) + _$$AddProductImplCopyWith<_$AddProductImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SearchProductImplCopyWith<$Res> { + factory _$$SearchProductImplCopyWith( + _$SearchProductImpl value, $Res Function(_$SearchProductImpl) then) = + __$$SearchProductImplCopyWithImpl<$Res>; + @useResult + $Res call({String query}); +} + +/// @nodoc +class __$$SearchProductImplCopyWithImpl<$Res> + extends _$LocalProductEventCopyWithImpl<$Res, _$SearchProductImpl> + implements _$$SearchProductImplCopyWith<$Res> { + __$$SearchProductImplCopyWithImpl( + _$SearchProductImpl _value, $Res Function(_$SearchProductImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? query = null, + }) { + return _then(_$SearchProductImpl( + null == query + ? _value.query + : query // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$SearchProductImpl implements _SearchProduct { + const _$SearchProductImpl(this.query); + + @override + final String query; + + @override + String toString() { + return 'LocalProductEvent.searchProduct(query: $query)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SearchProductImpl && + (identical(other.query, query) || other.query == query)); + } + + @override + int get hashCode => Object.hash(runtimeType, query); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$SearchProductImplCopyWith<_$SearchProductImpl> get copyWith => + __$$SearchProductImplCopyWithImpl<_$SearchProductImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getLocalProduct, + required TResult Function(Product product) addProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAllFromState, + required TResult Function(int categoryId) getLocalProductByCategoryId, + }) { + return searchProduct(query); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getLocalProduct, + TResult? Function(Product product)? addProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAllFromState, + TResult? Function(int categoryId)? getLocalProductByCategoryId, + }) { + return searchProduct?.call(query); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getLocalProduct, + TResult Function(Product product)? addProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAllFromState, + TResult Function(int categoryId)? getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (searchProduct != null) { + return searchProduct(query); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetLocalProduct value) getLocalProduct, + required TResult Function(_AddProduct value) addProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAllFromState value) fetchAllFromState, + required TResult Function(_GetLocalProductByCategoryId value) + getLocalProductByCategoryId, + }) { + return searchProduct(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetLocalProduct value)? getLocalProduct, + TResult? Function(_AddProduct value)? addProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAllFromState value)? fetchAllFromState, + TResult? Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + }) { + return searchProduct?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetLocalProduct value)? getLocalProduct, + TResult Function(_AddProduct value)? addProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAllFromState value)? fetchAllFromState, + TResult Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (searchProduct != null) { + return searchProduct(this); + } + return orElse(); + } +} + +abstract class _SearchProduct implements LocalProductEvent { + const factory _SearchProduct(final String query) = _$SearchProductImpl; + + String get query; + @JsonKey(ignore: true) + _$$SearchProductImplCopyWith<_$SearchProductImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$FetchAllFromStateImplCopyWith<$Res> { + factory _$$FetchAllFromStateImplCopyWith(_$FetchAllFromStateImpl value, + $Res Function(_$FetchAllFromStateImpl) then) = + __$$FetchAllFromStateImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$FetchAllFromStateImplCopyWithImpl<$Res> + extends _$LocalProductEventCopyWithImpl<$Res, _$FetchAllFromStateImpl> + implements _$$FetchAllFromStateImplCopyWith<$Res> { + __$$FetchAllFromStateImplCopyWithImpl(_$FetchAllFromStateImpl _value, + $Res Function(_$FetchAllFromStateImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$FetchAllFromStateImpl implements _FetchAllFromState { + const _$FetchAllFromStateImpl(); + + @override + String toString() { + return 'LocalProductEvent.fetchAllFromState()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$FetchAllFromStateImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getLocalProduct, + required TResult Function(Product product) addProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAllFromState, + required TResult Function(int categoryId) getLocalProductByCategoryId, + }) { + return fetchAllFromState(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getLocalProduct, + TResult? Function(Product product)? addProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAllFromState, + TResult? Function(int categoryId)? getLocalProductByCategoryId, + }) { + return fetchAllFromState?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getLocalProduct, + TResult Function(Product product)? addProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAllFromState, + TResult Function(int categoryId)? getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (fetchAllFromState != null) { + return fetchAllFromState(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetLocalProduct value) getLocalProduct, + required TResult Function(_AddProduct value) addProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAllFromState value) fetchAllFromState, + required TResult Function(_GetLocalProductByCategoryId value) + getLocalProductByCategoryId, + }) { + return fetchAllFromState(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetLocalProduct value)? getLocalProduct, + TResult? Function(_AddProduct value)? addProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAllFromState value)? fetchAllFromState, + TResult? Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + }) { + return fetchAllFromState?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetLocalProduct value)? getLocalProduct, + TResult Function(_AddProduct value)? addProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAllFromState value)? fetchAllFromState, + TResult Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (fetchAllFromState != null) { + return fetchAllFromState(this); + } + return orElse(); + } +} + +abstract class _FetchAllFromState implements LocalProductEvent { + const factory _FetchAllFromState() = _$FetchAllFromStateImpl; +} + +/// @nodoc +abstract class _$$GetLocalProductByCategoryIdImplCopyWith<$Res> { + factory _$$GetLocalProductByCategoryIdImplCopyWith( + _$GetLocalProductByCategoryIdImpl value, + $Res Function(_$GetLocalProductByCategoryIdImpl) then) = + __$$GetLocalProductByCategoryIdImplCopyWithImpl<$Res>; + @useResult + $Res call({int categoryId}); +} + +/// @nodoc +class __$$GetLocalProductByCategoryIdImplCopyWithImpl<$Res> + extends _$LocalProductEventCopyWithImpl<$Res, + _$GetLocalProductByCategoryIdImpl> + implements _$$GetLocalProductByCategoryIdImplCopyWith<$Res> { + __$$GetLocalProductByCategoryIdImplCopyWithImpl( + _$GetLocalProductByCategoryIdImpl _value, + $Res Function(_$GetLocalProductByCategoryIdImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? categoryId = null, + }) { + return _then(_$GetLocalProductByCategoryIdImpl( + null == categoryId + ? _value.categoryId + : categoryId // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$GetLocalProductByCategoryIdImpl + implements _GetLocalProductByCategoryId { + const _$GetLocalProductByCategoryIdImpl(this.categoryId); + + @override + final int categoryId; + + @override + String toString() { + return 'LocalProductEvent.getLocalProductByCategoryId(categoryId: $categoryId)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GetLocalProductByCategoryIdImpl && + (identical(other.categoryId, categoryId) || + other.categoryId == categoryId)); + } + + @override + int get hashCode => Object.hash(runtimeType, categoryId); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$GetLocalProductByCategoryIdImplCopyWith<_$GetLocalProductByCategoryIdImpl> + get copyWith => __$$GetLocalProductByCategoryIdImplCopyWithImpl< + _$GetLocalProductByCategoryIdImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getLocalProduct, + required TResult Function(Product product) addProduct, + required TResult Function(String query) searchProduct, + required TResult Function() fetchAllFromState, + required TResult Function(int categoryId) getLocalProductByCategoryId, + }) { + return getLocalProductByCategoryId(categoryId); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getLocalProduct, + TResult? Function(Product product)? addProduct, + TResult? Function(String query)? searchProduct, + TResult? Function()? fetchAllFromState, + TResult? Function(int categoryId)? getLocalProductByCategoryId, + }) { + return getLocalProductByCategoryId?.call(categoryId); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getLocalProduct, + TResult Function(Product product)? addProduct, + TResult Function(String query)? searchProduct, + TResult Function()? fetchAllFromState, + TResult Function(int categoryId)? getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (getLocalProductByCategoryId != null) { + return getLocalProductByCategoryId(categoryId); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetLocalProduct value) getLocalProduct, + required TResult Function(_AddProduct value) addProduct, + required TResult Function(_SearchProduct value) searchProduct, + required TResult Function(_FetchAllFromState value) fetchAllFromState, + required TResult Function(_GetLocalProductByCategoryId value) + getLocalProductByCategoryId, + }) { + return getLocalProductByCategoryId(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetLocalProduct value)? getLocalProduct, + TResult? Function(_AddProduct value)? addProduct, + TResult? Function(_SearchProduct value)? searchProduct, + TResult? Function(_FetchAllFromState value)? fetchAllFromState, + TResult? Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + }) { + return getLocalProductByCategoryId?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetLocalProduct value)? getLocalProduct, + TResult Function(_AddProduct value)? addProduct, + TResult Function(_SearchProduct value)? searchProduct, + TResult Function(_FetchAllFromState value)? fetchAllFromState, + TResult Function(_GetLocalProductByCategoryId value)? + getLocalProductByCategoryId, + required TResult orElse(), + }) { + if (getLocalProductByCategoryId != null) { + return getLocalProductByCategoryId(this); + } + return orElse(); + } +} + +abstract class _GetLocalProductByCategoryId implements LocalProductEvent { + const factory _GetLocalProductByCategoryId(final int categoryId) = + _$GetLocalProductByCategoryIdImpl; + + int get categoryId; + @JsonKey(ignore: true) + _$$GetLocalProductByCategoryIdImplCopyWith<_$GetLocalProductByCategoryIdImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$LocalProductState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LocalProductStateCopyWith<$Res> { + factory $LocalProductStateCopyWith( + LocalProductState value, $Res Function(LocalProductState) then) = + _$LocalProductStateCopyWithImpl<$Res, LocalProductState>; +} + +/// @nodoc +class _$LocalProductStateCopyWithImpl<$Res, $Val extends LocalProductState> + implements $LocalProductStateCopyWith<$Res> { + _$LocalProductStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$LocalProductStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'LocalProductState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements LocalProductState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$LocalProductStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'LocalProductState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements LocalProductState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List products}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$LocalProductStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? products = null, + }) { + return _then(_$LoadedImpl( + null == products + ? _value._products + : products // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List products) : _products = products; + + final List _products; + @override + List get products { + if (_products is EqualUnmodifiableListView) return _products; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_products); + } + + @override + String toString() { + return 'LocalProductState.loaded(products: $products)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality().equals(other._products, _products)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_products)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return loaded(products); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(products); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(products); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements LocalProductState { + const factory _Loaded(final List products) = _$LoadedImpl; + + List get products; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$LocalProductStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'LocalProductState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List products) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List products)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List products)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements LocalProductState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_event.dart new file mode 100644 index 0000000..07e3399 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_event.dart @@ -0,0 +1,12 @@ +part of 'local_product_bloc.dart'; + +@freezed +class LocalProductEvent with _$LocalProductEvent { + const factory LocalProductEvent.started() = _Started; + const factory LocalProductEvent.getLocalProduct() = _GetLocalProduct; + const factory LocalProductEvent.addProduct(Product product) = _AddProduct; + const factory LocalProductEvent.searchProduct(String query) = _SearchProduct; + const factory LocalProductEvent.fetchAllFromState() = _FetchAllFromState; + const factory LocalProductEvent.getLocalProductByCategoryId(int categoryId) = + _GetLocalProductByCategoryId; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_state.dart new file mode 100644 index 0000000..b350e30 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/bloc/local_product/local_product_state.dart @@ -0,0 +1,9 @@ +part of 'local_product_bloc.dart'; + +@freezed +class LocalProductState with _$LocalProductState { + const factory LocalProductState.initial() = _Initial; + const factory LocalProductState.loading() = _Loading; + const factory LocalProductState.loaded(List products) = _Loaded; + const factory LocalProductState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/order_item.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/order_item.dart new file mode 100644 index 0000000..fa3393f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/order_item.dart @@ -0,0 +1,24 @@ + + +import 'product_model.dart'; + +class OrderItem { + final ProductModel product; + int quantity; + OrderItem({ + required this.product, + required this.quantity, + }); + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is OrderItem && + other.product == product && + other.quantity == quantity; + } + + @override + int get hashCode => product.hashCode ^ quantity.hashCode; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/product_category.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/product_category.dart new file mode 100644 index 0000000..3456c2d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/product_category.dart @@ -0,0 +1,9 @@ +enum ProductCategory { + none('None'), + drink('Minuman'), + food('Makanan'), + snack('Snack'); + + final String value; + const ProductCategory(this.value); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/product_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/product_model.dart new file mode 100644 index 0000000..67b537b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/product_model.dart @@ -0,0 +1,23 @@ + + +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; + +import 'product_category.dart'; + +class ProductModel { + final String image; + final String name; + final ProductCategory category; + final int price; + final int stock; + + ProductModel({ + required this.image, + required this.name, + required this.category, + required this.price, + required this.stock, + }); + + String get priceFormat => price.currencyFormatRp; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/product_quantity.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/product_quantity.dart new file mode 100644 index 0000000..e8b5efe --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/models/product_quantity.dart @@ -0,0 +1,67 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; + +class ProductQuantity { + final Product product; + int quantity; + ProductQuantity({ + required this.product, + required this.quantity, + }); + Map toMap() { + return { + 'product': product.toMap(), + 'quantity': quantity, + }; + } + + Map toLocalMap(int orderId) { + print('orderId $orderId'); + return { + 'id_order': orderId, + 'id_product': product.id, + 'quantity': quantity, + 'price': product.price, + }; + } + + // Map toMapForLocal(int orderId) { + // return { + // 'id_order': orderId, + // 'id_product': product.id, + // 'quantity': quantity, + // 'price': product.price, + // }; + // } + factory ProductQuantity.fromLocalMap(Map map) { + return ProductQuantity( + product: Product.fromOrderMap(map), + quantity: map['quantity']?.toInt() ?? 0, + ); + } + + factory ProductQuantity.fromMap(Map map) { + return ProductQuantity( + product: Product.fromMap(map['product']), + quantity: map['quantity']?.toInt() ?? 0, + ); + } + + // String toJson() => json.encode(toMap()); + + // factory ProductQuantity.fromJson(String source) => ProductQuantity.fromMap(json.decode(source)); + + @override + bool operator ==(covariant ProductQuantity other) { + if (identical(this, other)) return true; + + return other.product == product && other.quantity == quantity; + } + + @override + int get hashCode => product.hashCode ^ quantity.hashCode; + + @override + String toString() => + 'ProductQuantity(product: $product, quantity: $quantity)'; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/pages/dashboard_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/pages/dashboard_page.dart new file mode 100644 index 0000000..2cb6efd --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/pages/dashboard_page.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/history/pages/history_page.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/pages/home_page.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/order/pages/order_page.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../setting/pages/setting_page.dart'; +import '../widgets/nav_item.dart'; + +class DashboardPosPage extends StatefulWidget { + const DashboardPosPage({super.key}); + + @override + State createState() => _DashboardPosPageState(); +} + +class _DashboardPosPageState extends State { + int _selectedIndex = 0; + + final List _pages = [ + const HomePage(), + const OrdersPage(), + const HistoryPage(), + const SettingPage() + // const ManageMenuPage(), + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: _pages[_selectedIndex], + bottomNavigationBar: Container( + padding: const EdgeInsets.all(20.0), + decoration: BoxDecoration( + borderRadius: const BorderRadius.vertical( + top: Radius.circular(30), + ), + color: AppColors.white, + boxShadow: [ + BoxShadow( + offset: const Offset(0, -2), + blurRadius: 30.0, + blurStyle: BlurStyle.outer, + spreadRadius: 0, + color: AppColors.black.withOpacity(0.08), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + NavItem( + iconPath: Assets.icons.home.path, + label: 'Home', + isActive: _selectedIndex == 0, + onTap: () => _onItemTapped(0), + ), + NavItem( + iconPath: Assets.icons.orders.path, + label: 'Orders', + isActive: _selectedIndex == 1, + onTap: () { + _onItemTapped(1); + // context.push(const OrdersPage()); + }), + NavItem( + iconPath: Assets.icons.payments.path, + label: 'History', + isActive: _selectedIndex == 2, + onTap: () => _onItemTapped(2), + ), + NavItem( + iconPath: Assets.icons.dashboard.path, + label: 'Kelola', + isActive: _selectedIndex == 3, + onTap: () => _onItemTapped(3), + ), + ], + ), + ), + ); + } + + void _onItemTapped(int index) { + setState(() { + _selectedIndex = index; + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/pages/home_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/pages/home_page.dart new file mode 100644 index 0000000..2d34742 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/pages/home_page.dart @@ -0,0 +1,239 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/search_input_pos.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/local_product/local_product_bloc.dart'; +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/menu_button.dart'; +import '../../../../../core/components/spaces.dart'; +import '../widgets/product_card.dart'; +import '../widgets/product_empty.dart'; + +class HomePage extends StatefulWidget { + const HomePage({super.key}); + + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State { + late TextEditingController searchController; + final indexValue = ValueNotifier(0); + + // List searchResults = []; + // final List products = [ + // ProductModel( + // image: Assets.images.f1.path, + // name: 'Nutty Latte', + // category: ProductCategory.drink, + // price: 39000, + // stock: 10, + // ), + // ProductModel( + // image: Assets.images.f2.path, + // name: 'Iced Latte', + // category: ProductCategory.drink, + // price: 24000, + // stock: 10, + // ), + // ProductModel( + // image: Assets.images.f3.path, + // name: 'Iced Mocha', + // category: ProductCategory.drink, + // price: 33000, + // stock: 10, + // ), + // ProductModel( + // image: Assets.images.f4.path, + // name: 'Hot Mocha', + // category: ProductCategory.drink, + // price: 33000, + // stock: 10, + // ), + // ]; + + @override + void initState() { + // searchResults = products; + context + .read() + .add(const LocalProductEvent.getLocalProduct()); + searchController = TextEditingController(); + super.initState(); + } + + @override + void dispose() { + searchController.dispose(); + super.dispose(); + } + + void onCategoryTap(int index) { + searchController.clear(); + indexValue.value = index; + int categoryId = 0; + switch (index) { + case 0: + categoryId = 0; + break; + case 1: + categoryId = 1; + break; + case 2: + categoryId = 2; + break; + case 3: + categoryId = 3; + break; + case 4: + categoryId = 4; + break; + default: + } + print('Selected CategoryId: $categoryId'); + context + .read() + .add(LocalProductEvent.getLocalProductByCategoryId(categoryId)); + } + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + appBar: AppBar( + title: const Text( + 'Produk', + style: TextStyle( + fontWeight: FontWeight.bold, + ), + ), + centerTitle: true, + ), + body: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + SearchInput( + controller: searchController, + onChanged: (value) { + if (value.length > 3) { + context + .read() + .add(LocalProductEvent.searchProduct(value)); + } + if (value.isEmpty) { + context + .read() + .add(const LocalProductEvent.fetchAllFromState()); + } + }, + ), + const SpaceHeight(20.0), + ValueListenableBuilder( + valueListenable: indexValue, + builder: (context, value, _) => SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: [ + SizedBox( + // Batasan lebar untuk SingleChildScrollView + width: MediaQuery.of(context) + .size + .width, // Lebar layar penuh + child: Row( + children: [ + Flexible( + fit: FlexFit.loose, + child: MenuButton( + iconPath: Assets.icons.food.path, + label: 'Semua', + isActive: value == 0, + onPressed: () => onCategoryTap(0), + ), + ), + const SpaceWidth(10.0), + Flexible( + fit: FlexFit.loose, + child: MenuButton( + iconPath: Assets.icons.food.path, + label: 'Benih', + isActive: value == 1, + onPressed: () => onCategoryTap(1), + ), + ), + const SpaceWidth(10.0), + Flexible( + fit: FlexFit.loose, + child: MenuButton( + iconPath: Assets.icons.food.path, + label: 'Pupuk', + isActive: value == 2, + onPressed: () => onCategoryTap(2), + ), + ), + const SpaceWidth(10.0), + Flexible( + fit: FlexFit.loose, + child: MenuButton( + iconPath: Assets.icons.food.path, + label: 'Pestisida', + isActive: value == 3, + onPressed: () => onCategoryTap(3), + ), + ), + const SpaceWidth(10.0), + Flexible( + fit: FlexFit.loose, + child: MenuButton( + iconPath: Assets.icons.food.path, + label: 'Alat Pertanian', + isActive: value == 4, + onPressed: () => onCategoryTap(4), + ), + ), + ], + ), + ), + ], + ), + ), + ), + const SpaceHeight(35.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox(), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + error: (message) => Center( + child: Text(message), + ), + loaded: (products) { + if (products.isEmpty) return const ProductEmpty(); + return GridView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: products.length, + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + childAspectRatio: 0.65, + crossAxisCount: 2, + crossAxisSpacing: 16.0, + mainAxisSpacing: 16.0, + ), + itemBuilder: (context, index) => ProductCard( + data: products[index], + onCartButton: () {}, + ), + ); + }, + ); + }, + ), + const SpaceHeight(30.0), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/widgets/nav_item.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/widgets/nav_item.dart new file mode 100644 index 0000000..8cfcbfe --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/widgets/nav_item.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/models/product_quantity.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +// import '../../../core/components/spaces.dart'; +import 'package:badges/badges.dart' as badges; + +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../bloc/checkout_pos/checkout_pos_bloc.dart'; + +class NavItem extends StatelessWidget { + final String iconPath; + final String label; + final bool isActive; + final VoidCallback onTap; + + const NavItem({ + super.key, + required this.iconPath, + required this.label, + required this.isActive, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + borderRadius: const BorderRadius.all(Radius.circular(16.0)), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + label == 'Orders' + ? BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return SizedBox( + width: 25.0, + height: 25.0, + child: SvgPicture.asset( + iconPath, + colorFilter: ColorFilter.mode( + isActive ? AppColors.black : AppColors.disabled, + BlendMode.srcIn, + ), + ), + ); + }, + loaded: (data,_) { + if (data.isEmpty) { + return SizedBox( + width: 25.0, + height: 25.0, + child: SvgPicture.asset( + iconPath, + colorFilter: ColorFilter.mode( + isActive ? AppColors.black : AppColors.disabled, + BlendMode.srcIn, + ), + ), + ); + } else { + final totalQuantity = data.fold( + 0, + (previousValue, element) => + previousValue + element.quantity, + ); + return totalQuantity > 0 + ? badges.Badge( + badgeContent: Text( + totalQuantity.toString(), + style: const TextStyle(color: Colors.white), + ), + child: SizedBox( + width: 25.0, + height: 25.0, + child: SvgPicture.asset( + iconPath, + colorFilter: ColorFilter.mode( + isActive + ? AppColors.black + : AppColors.disabled, + BlendMode.srcIn, + ), + ), + ), + ) + : const SizedBox(); + } + }, + ); + // return badges.Badge( + // badgeContent: Text('3'), + // child: SizedBox( + // width: 25.0, + // height: 25.0, + // child: SvgPicture.asset( + // iconPath, + // colorFilter: ColorFilter.mode( + // isActive ? AppColors.black : AppColors.disabled, + // BlendMode.srcIn, + // ), + // ), + // ), + // ); + }, + ) + : SizedBox( + width: 25.0, + height: 25.0, + child: SvgPicture.asset( + iconPath, + colorFilter: ColorFilter.mode( + isActive ? AppColors.black : AppColors.disabled, + BlendMode.srcIn, + ), + ), + ), + const SpaceHeight(4.0), + Text( + label, + style: TextStyle( + fontSize: 12, + color: isActive ? AppColors.black : AppColors.disabled, + ), + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/widgets/product_card.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/widgets/product_card.dart new file mode 100644 index 0000000..16cdc51 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/widgets/product_card.dart @@ -0,0 +1,145 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; + +class ProductCard extends StatelessWidget { + final Product data; + final VoidCallback onCartButton; + + const ProductCard({ + super.key, + required this.data, + required this.onCartButton, + }); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Container( + padding: const EdgeInsets.all(16.0), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: AppColors.card), + borderRadius: BorderRadius.circular(19), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + alignment: Alignment.center, + padding: const EdgeInsets.all(12.0), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColors.disabled.withOpacity(0.4), + ), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(50.0)), + child: Image.network( + data.image!.contains('http') + ? data.image! + : '${GlobalVariable.baseUrlImage}${data.image}', + width: 180.0, + height: 90.0, + fit: BoxFit.cover, + ), + ), + ), + const Spacer(), + Text( + data.name ?? '', + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w700, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SpaceHeight(8.0), + Text( + data.category?.name ?? '', + style: const TextStyle( + color: AppColors.black, + fontSize: 12, + ), + ), + const SpaceHeight(8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text( + data.price!.currencyFormatRp, + style: const TextStyle( + fontWeight: FontWeight.w700, + ), + ), + ), + GestureDetector( + onTap: () { + context + .read() + .add(CheckoutPosEvent.addItem(data)); + }, + child: Container( + padding: const EdgeInsets.all(6), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(9.0)), + color: AppColors.primary, + ), + child: const Icon( + Icons.add, + color: Colors.white, + ) //Assets.icons.orders.svg(), + ), + ), + ], + ), + ], + ), + ), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox(), + loaded: (products, _) { + // if (qty == 0) { + // return const SizedBox(); + // } + return products.any((element) => element.product == data) + ? products + .firstWhere( + (element) => element.product == data) + .quantity > + 0 + ? Positioned( + top: 8, + right: 8, + child: CircleAvatar( + backgroundColor: AppColors.primary, + child: Text( + products + .firstWhere( + (element) => element.product == data) + .quantity + .toString(), + style: const TextStyle(color: Colors.white), + ), + ), + ) + : const SizedBox() + : const SizedBox(); + }, + ); + }, + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/widgets/product_empty.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/widgets/product_empty.dart new file mode 100644 index 0000000..994bbb0 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/home/widgets/product_empty.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; + + + + +class ProductEmpty extends StatelessWidget { + const ProductEmpty({super.key}); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Assets.icons.orders.svg(width: 114.0), + const SpaceHeight(4.0), + const Text( + 'Belum ada Produk', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + color: AppColors.grey, + ), + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_bloc.dart new file mode 100644 index 0000000..31fd1d9 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_bloc.dart @@ -0,0 +1,88 @@ +import 'package:bloc/bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/models/product_quantity.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/order/models/order_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import '../../../../../ecommerce/data/datasources/product_local_datasource.dart'; + +part 'order_pos_event.dart'; +part 'order_pos_state.dart'; +part 'order_pos_bloc.freezed.dart'; + +class OrderPosBloc extends Bloc { + OrderPosBloc() : super(const _Initial()) { + on<_Order>((event, emit) async { + emit(const _Loading()); + final subTotal = event.items.fold( + 0, + (previousValue, element) => + previousValue + (element.product.price! * element.quantity)); + + final totalDiscount = (event.discount / 100) * subTotal; + final total = subTotal - totalDiscount; + + // Print statements to debug + print('SubTotal: $subTotal'); + print('Discount: $totalDiscount'); + print('Total after discount: $total'); + + final totalItem = event.items.fold( + 0, (previousValue, element) => previousValue + element.quantity); + print('total item $totalItem'); + + final userData = await AuthLocalDatasource().getAuthData(); + print('user data $userData'); + + final dataInput = OrderModel( + subtotal: subTotal, + addressId: 1, + paymentAmount: event.paymentAmount, + tax: event.tax, + discount: event.discount, + serviceCharge: event.serviceCharge, + total_cost: total.toInt(), + paymentMethod: 'Cash', + totalItem: totalItem, + idKasir: userData!.user!.id!, + namaKasir: userData.user!.name!, + transactionTime: DateTime.now().toIso8601String(), + isSync: 0, + orderItems: event.items, + ); + + print("data input ${dataInput.toJson()}"); + + print('total cost bloc $total'); + + await ProductLocalDatasource.instance.saveOrder(dataInput); + + emit(_Loaded( + dataInput, + )); + }); + + on<_Started>((event, emit) { + emit(const _Loading()); + + final dataInput = OrderModel( + subtotal: 0, + addressId: 0, + paymentAmount: 0, + tax: 0, + discount: 0, + serviceCharge: 0, + total_cost: 0, + paymentMethod: '', + totalItem: 0, + idKasir: 0, + namaKasir: '', + transactionTime: '', + isSync: 0, + orderItems: [], + ); + + emit(_Loaded(dataInput)); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_bloc.freezed.dart new file mode 100644 index 0000000..67603a2 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_bloc.freezed.dart @@ -0,0 +1,982 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'order_pos_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$OrderPosEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(List items, int discount, + int tax, int serviceCharge, int paymentAmount) + order, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(List items, int discount, int tax, + int serviceCharge, int paymentAmount)? + order, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(List items, int discount, int tax, + int serviceCharge, int paymentAmount)? + order, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Order value) order, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Order value)? order, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Order value)? order, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $OrderPosEventCopyWith<$Res> { + factory $OrderPosEventCopyWith( + OrderPosEvent value, $Res Function(OrderPosEvent) then) = + _$OrderPosEventCopyWithImpl<$Res, OrderPosEvent>; +} + +/// @nodoc +class _$OrderPosEventCopyWithImpl<$Res, $Val extends OrderPosEvent> + implements $OrderPosEventCopyWith<$Res> { + _$OrderPosEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$OrderPosEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'OrderPosEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(List items, int discount, + int tax, int serviceCharge, int paymentAmount) + order, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(List items, int discount, int tax, + int serviceCharge, int paymentAmount)? + order, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(List items, int discount, int tax, + int serviceCharge, int paymentAmount)? + order, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Order value) order, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Order value)? order, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Order value)? order, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements OrderPosEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$OrderImplCopyWith<$Res> { + factory _$$OrderImplCopyWith( + _$OrderImpl value, $Res Function(_$OrderImpl) then) = + __$$OrderImplCopyWithImpl<$Res>; + @useResult + $Res call( + {List items, + int discount, + int tax, + int serviceCharge, + int paymentAmount}); +} + +/// @nodoc +class __$$OrderImplCopyWithImpl<$Res> + extends _$OrderPosEventCopyWithImpl<$Res, _$OrderImpl> + implements _$$OrderImplCopyWith<$Res> { + __$$OrderImplCopyWithImpl( + _$OrderImpl _value, $Res Function(_$OrderImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? items = null, + Object? discount = null, + Object? tax = null, + Object? serviceCharge = null, + Object? paymentAmount = null, + }) { + return _then(_$OrderImpl( + null == items + ? _value._items + : items // ignore: cast_nullable_to_non_nullable + as List, + null == discount + ? _value.discount + : discount // ignore: cast_nullable_to_non_nullable + as int, + null == tax + ? _value.tax + : tax // ignore: cast_nullable_to_non_nullable + as int, + null == serviceCharge + ? _value.serviceCharge + : serviceCharge // ignore: cast_nullable_to_non_nullable + as int, + null == paymentAmount + ? _value.paymentAmount + : paymentAmount // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$OrderImpl implements _Order { + const _$OrderImpl(final List items, this.discount, this.tax, + this.serviceCharge, this.paymentAmount) + : _items = items; + + final List _items; + @override + List get items { + if (_items is EqualUnmodifiableListView) return _items; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_items); + } + + @override + final int discount; + @override + final int tax; + @override + final int serviceCharge; + @override + final int paymentAmount; + + @override + String toString() { + return 'OrderPosEvent.order(items: $items, discount: $discount, tax: $tax, serviceCharge: $serviceCharge, paymentAmount: $paymentAmount)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$OrderImpl && + const DeepCollectionEquality().equals(other._items, _items) && + (identical(other.discount, discount) || + other.discount == discount) && + (identical(other.tax, tax) || other.tax == tax) && + (identical(other.serviceCharge, serviceCharge) || + other.serviceCharge == serviceCharge) && + (identical(other.paymentAmount, paymentAmount) || + other.paymentAmount == paymentAmount)); + } + + @override + int get hashCode => Object.hash( + runtimeType, + const DeepCollectionEquality().hash(_items), + discount, + tax, + serviceCharge, + paymentAmount); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$OrderImplCopyWith<_$OrderImpl> get copyWith => + __$$OrderImplCopyWithImpl<_$OrderImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(List items, int discount, + int tax, int serviceCharge, int paymentAmount) + order, + }) { + return order(items, discount, tax, serviceCharge, paymentAmount); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(List items, int discount, int tax, + int serviceCharge, int paymentAmount)? + order, + }) { + return order?.call(items, discount, tax, serviceCharge, paymentAmount); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(List items, int discount, int tax, + int serviceCharge, int paymentAmount)? + order, + required TResult orElse(), + }) { + if (order != null) { + return order(items, discount, tax, serviceCharge, paymentAmount); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_Order value) order, + }) { + return order(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_Order value)? order, + }) { + return order?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_Order value)? order, + required TResult orElse(), + }) { + if (order != null) { + return order(this); + } + return orElse(); + } +} + +abstract class _Order implements OrderPosEvent { + const factory _Order( + final List items, + final int discount, + final int tax, + final int serviceCharge, + final int paymentAmount) = _$OrderImpl; + + List get items; + int get discount; + int get tax; + int get serviceCharge; + int get paymentAmount; + @JsonKey(ignore: true) + _$$OrderImplCopyWith<_$OrderImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$OrderPosState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderModel orderModel) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderModel orderModel)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderModel orderModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $OrderPosStateCopyWith<$Res> { + factory $OrderPosStateCopyWith( + OrderPosState value, $Res Function(OrderPosState) then) = + _$OrderPosStateCopyWithImpl<$Res, OrderPosState>; +} + +/// @nodoc +class _$OrderPosStateCopyWithImpl<$Res, $Val extends OrderPosState> + implements $OrderPosStateCopyWith<$Res> { + _$OrderPosStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$OrderPosStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'OrderPosState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderModel orderModel) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderModel orderModel)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderModel orderModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements OrderPosState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$OrderPosStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'OrderPosState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderModel orderModel) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderModel orderModel)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderModel orderModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements OrderPosState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({OrderModel orderModel}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$OrderPosStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? orderModel = null, + }) { + return _then(_$LoadedImpl( + null == orderModel + ? _value.orderModel + : orderModel // ignore: cast_nullable_to_non_nullable + as OrderModel, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(this.orderModel); + + @override + final OrderModel orderModel; + + @override + String toString() { + return 'OrderPosState.loaded(orderModel: $orderModel)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + (identical(other.orderModel, orderModel) || + other.orderModel == orderModel)); + } + + @override + int get hashCode => Object.hash(runtimeType, orderModel); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderModel orderModel) loaded, + required TResult Function(String message) error, + }) { + return loaded(orderModel); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderModel orderModel)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(orderModel); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderModel orderModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(orderModel); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements OrderPosState { + const factory _Loaded(final OrderModel orderModel) = _$LoadedImpl; + + OrderModel get orderModel; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$OrderPosStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'OrderPosState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(OrderModel orderModel) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(OrderModel orderModel)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(OrderModel orderModel)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements OrderPosState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_event.dart new file mode 100644 index 0000000..a37ce34 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_event.dart @@ -0,0 +1,11 @@ +part of 'order_pos_bloc.dart'; + +@freezed +class OrderPosEvent with _$OrderPosEvent { + const factory OrderPosEvent.started() = _Started; + const factory OrderPosEvent.order(List items, + int discount, + int tax, + int serviceCharge, + int paymentAmount,) = _Order; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_state.dart new file mode 100644 index 0000000..0b4f7bf --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/bloc/order_pos/order_pos_state.dart @@ -0,0 +1,10 @@ +part of 'order_pos_bloc.dart'; + +@freezed +class OrderPosState with _$OrderPosState { + const factory OrderPosState.initial() = _Initial; + const factory OrderPosState.loading() = _Loading; + const factory OrderPosState.loaded(OrderModel orderModel) + = _Loaded; + const factory OrderPosState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/models/order_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/models/order_model.dart new file mode 100644 index 0000000..5882ef1 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/models/order_model.dart @@ -0,0 +1,194 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/models/product_quantity.dart'; + +// id INTEGER PRIMARY KEY AUTOINCREMENT, +// sub_total INTEGER, +// tax INTEGER, +// discount INTEGER, +// service_charge INTEGER, +// total INTEGER, +// payment_method TEXT, +// total_item INTEGER, +// id_kasir INTEGER, +// nama_kasir TEXT, +// transaction_time TEXT, +// is_sync INTEGER DEFAULT 0 + +class OrderModel { + final int? id; + //payment_amount + final int paymentAmount; + final int addressId; + final int subtotal; + final int tax; + final int discount; + final int serviceCharge; + final int total_cost; + final String paymentMethod; + final int totalItem; + final int idKasir; + final String namaKasir; + final String transactionTime; + final int isSync; + final List orderItems; + OrderModel({ + this.id, + required this.subtotal, + required this.paymentAmount, + required this.addressId, + required this.tax, + required this.discount, + required this.serviceCharge, + required this.total_cost, + required this.paymentMethod, + required this.totalItem, + required this.idKasir, + required this.namaKasir, + required this.transactionTime, + required this.isSync, + required this.orderItems, + }); + + // 'payment_amount' => 'required', + // 'sub_total' => 'required', + // 'tax' => 'required', + // 'discount' => 'required', + // 'service_charge' => 'required', + // 'total' => 'required', + // 'payment_method' => 'required', + // 'total_item' => 'required', + // 'id_kasir' => 'required', + // 'nama_kasir' => 'required', + // 'transaction_time' => 'required', + // 'order_items' => 'required' + + Map toServerMap() { + print('id $id'); + return { + 'payment_amount': paymentAmount, + 'address_id': addressId, + 'subtotal': subtotal, + 'tax': tax, + 'discount': discount, + 'service_charge': serviceCharge, + 'total': total_cost, + 'payment_method': paymentMethod, + 'total_item': totalItem, + 'id_kasir': idKasir, + 'nama_kasir': namaKasir, + 'transaction_time': transactionTime, + 'order_items': orderItems.map((e) => e.toLocalMap(id ?? 0)).toList(), + }; + } + + Map toMap() { + return { + 'id': id, + 'address_id': 1, + 'payment_amount': paymentAmount, + 'subtotal': subtotal, + 'tax': tax, + 'discount': discount, + 'service_charge': serviceCharge, + 'total_cost': total_cost, + 'payment_method': paymentMethod, + 'total_item': totalItem, + 'id_kasir': idKasir, + 'nama_kasir': namaKasir, + 'transaction_time': transactionTime, + 'is_sync': isSync, + }; + } + + factory OrderModel.fromMap(Map map) { + return OrderModel( + id: map['id']?.toInt(), + addressId: map['address_id']?.toInt() ?? 0, + paymentAmount: map['payment_amount']?.toInt() ?? 0, + subtotal: map['subtotal']?.toInt() ?? 0, + tax: map['tax']?.toInt() ?? 0, + discount: map['discount']?.toInt() ?? 0, + serviceCharge: map['service_charge']?.toInt() ?? 0, + total_cost: map['total_cost']?.toInt() ?? 0, + paymentMethod: map['payment_method'] ?? '', + totalItem: map['total_item']?.toInt() ?? 0, + idKasir: map['id_kasir']?.toInt() ?? 0, + namaKasir: map['nama_kasir'] ?? '', + transactionTime: map['transaction_time'] ?? '', + isSync: map['is_sync']?.toInt() ?? 0, + orderItems: [], + ); + } + factory OrderModel.fromLocalMap(Map map) { + return OrderModel( + id: map['id']?.toInt(), + addressId: map['address_id']?.toInt() ?? 0, + paymentAmount: map['payment_amount']?.toInt() ?? 0, + subtotal: map['subtotal']?.toInt() ?? 0, + tax: map['tax']?.toInt() ?? 0, + discount: map['discount']?.toInt() ?? 0, + serviceCharge: map['service_charge']?.toInt() ?? 0, + total_cost: map['total_cost']?.toInt() ?? 0, + paymentMethod: map['payment_method'] ?? '', + totalItem: map['total_item']?.toInt() ?? 0, + idKasir: map['id_kasir']?.toInt() ?? 0, + namaKasir: map['nama_kasir'] ?? '', + transactionTime: map['transaction_time'] ?? '', + isSync: map['is_sync']?.toInt() ?? 0, + orderItems: [], + ); + } + + String toJson() => json.encode(toServerMap()); + + factory OrderModel.fromJson(String source) => + OrderModel.fromMap(json.decode(source)); + + OrderModel copyWith({ + int? id, + int? addressId, + int? paymentAmount, + int? subTotal, + int? tax, + int? discount, + int? serviceCharge, + int? total, + String? paymentMethod, + int? totalItem, + int? idKasir, + String? namaKasir, + String? transactionTime, + int? isSync, + List? orderItems, + }) { + final totalDiscount = ((discount ?? this.discount) / 100 * subtotal); + print('total discount $totalDiscount'); + int total = (subTotal ?? subtotal) - (totalDiscount).toInt(); + print('total cost $total'); + + return OrderModel( + id: id ?? this.id, + paymentAmount: paymentAmount ?? this.paymentAmount, + addressId: addressId ?? this.addressId, + subtotal: subTotal ?? subtotal, + tax: tax ?? this.tax, + discount: discount ?? this.discount, + serviceCharge: serviceCharge ?? this.serviceCharge, + total_cost: total, + paymentMethod: paymentMethod ?? this.paymentMethod, + totalItem: totalItem ?? this.totalItem, + idKasir: idKasir ?? this.idKasir, + namaKasir: namaKasir ?? this.namaKasir, + transactionTime: transactionTime ?? this.transactionTime, + isSync: isSync ?? this.isSync, + orderItems: orderItems ?? this.orderItems, + ); + } + + @override + String toString() { + return 'OrderModel(id: $id, paymentAmount: $paymentAmount, addressId: $addressId, subtotal: $subtotal, tax: $tax, discount: $discount, serviceCharge: $serviceCharge, total_cost: $total_cost, paymentMethod: $paymentMethod, totalItem: $totalItem, idKasir: $idKasir, namaKasir: $namaKasir, transactionTime: $transactionTime, isSync: $isSync, orderItems: $orderItems)'; + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/pages/order_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/pages/order_page.dart new file mode 100644 index 0000000..dbafce0 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/pages/order_page.dart @@ -0,0 +1,151 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/assets/assets.gen.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/models/product_quantity.dart'; + +import '../../../../../core/components/menu_button.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../setting/dialogs/discount_dialog.dart'; +import '../widgets/order_card.dart'; +import '../widgets/payment_cash_dialog.dart'; +import '../widgets/process_button.dart'; + +class OrdersPage extends StatelessWidget { + const OrdersPage({super.key}); + + @override + Widget build(BuildContext context) { + final indexValue = ValueNotifier(0); + const paddingHorizontal = EdgeInsets.symmetric(horizontal: 16.0); + // final List orders = [ + // OrderModel( + // image: Assets.images.f1.path, + // name: 'Nutty Oat Latte', + // price: 39000, + // ), + // OrderModel( + // image: Assets.images.f2.path, + // name: 'Iced Latte', + // price: 24000, + // ), + // ]; + + List orders = []; + int calculateTotalPrice(List orders) { + // int totalPrice = 0; + // for (final order in orders) { + // totalPrice += order.price; + // } + // return totalPrice; + return orders.fold( + 0, + (previousValue, element) => + previousValue + element.product.price! * element.quantity); + } + + return Scaffold( + appBar: AppBar( + title: const Text('Order Detail'), + centerTitle: true, + // actions: [ + // IconButton( + // onPressed: () {}, + // icon: Assets.icons.delete.svg(), + // ), + // ], + ), + body: BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return const Center( + child: Text('No Data'), + ); + }, + loaded: (items, _) { + if (items.isEmpty) { + return const Center( + child: Text("No Data"), + ); + } + orders = items; + return ListView.separated( + padding: const EdgeInsets.symmetric(vertical: 16.0), + itemCount: items.length, + separatorBuilder: (context, index) => const SpaceHeight(20.0), + itemBuilder: (context, index) => OrderCard( + padding: paddingHorizontal, + data: items[index], + onDeleteTap: () { + // orders.removeAt(index); + // setState(() {}); + }, + ), + ); + }, + ); + }, + ), + bottomNavigationBar: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ValueListenableBuilder( + valueListenable: indexValue, + builder: (context, value, _) => Row( + children: [ + const SpaceWidth(10.0), + MenuButton( + iconPath: Assets.icons.cash.path, + label: 'Tunai', + isActive: value == 1, + onPressed: () => indexValue.value = 1, + ), + const SpaceWidth(10.0), + MenuButton( + iconPath: Assets.icons.qrCode.path, + label: 'Diskon', + isActive: value == 2, + onPressed: () { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => const DiscountDialog(), + ); + }, + ), + const SpaceWidth(10.0), + ], + ), + ), + const SpaceHeight(20.0), + ProcessButton( + price: 0, + onPressed: () async { + if (indexValue.value == 0) { + } else if (indexValue.value == 1) { + showDialog( + context: context, + builder: (context) => PaymentCashDialog( + price: calculateTotalPrice(orders), + ), + ); + } else if (indexValue.value == 2) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => PaymentCashDialog( + price: calculateTotalPrice(orders), + ), + ); + } + }, + ), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/order_card.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/order_card.dart new file mode 100644 index 0000000..59337ca --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/order_card.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/models/product_quantity.dart'; + +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/constants/global_variable.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; + +class OrderCard extends StatelessWidget { + final ProductQuantity data; + final VoidCallback onDeleteTap; + final EdgeInsetsGeometry? padding; + + const OrderCard({ + super.key, + required this.data, + required this.onDeleteTap, + this.padding, + }); + + @override + Widget build(BuildContext context) { + return Stack( + alignment: Alignment.bottomRight, + children: [ + Container( + margin: padding, + padding: const EdgeInsets.all(16.0), + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder( + side: const BorderSide(width: 2, color: Color(0xFFC7D0EB)), + borderRadius: BorderRadius.circular(10), + ), + ), + child: Row( + children: [ + ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(50.0)), + child: Image.network( + data.product.image!.contains('http') + ? data.product.image! + : '${GlobalVariable.baseUrlImage}${data.product.image}', + width: 76, + height: 76, + fit: BoxFit.cover, + ), + ), + const SpaceWidth(24.0), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + data.product.name ?? '', + style: const TextStyle( + fontWeight: FontWeight.w700, + ), + ), + Text( + (data.product.price! * data.quantity) + .currencyFormatRp, + style: const TextStyle( + fontWeight: FontWeight.w700, + ), + ), + ], + ), + const SpaceHeight(20.0), + Row( + children: [ + GestureDetector( + onTap: () { + context + .read() + .add(CheckoutPosEvent.removeItem(data.product)); + }, + child: Container( + color: AppColors.white, + child: const Icon( + Icons.remove_circle, + color: AppColors.primary, + ), + ), + ), + SizedBox( + width: 40.0, + child: Center( + child: Text(data.quantity.toString()), + ), + ), + GestureDetector( + onTap: () { + context + .read() + .add(CheckoutPosEvent.addItem(data.product)); + }, + child: Container( + color: AppColors.white, + child: const Icon( + Icons.add_circle, + color: AppColors.primary, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ), + ), + // Padding( + // padding: const EdgeInsets.only(right: 16.0), + // child: IconButton( + // onPressed: onDeleteTap, + // icon: const Icon( + // Icons.highlight_off, + // color: AppColors.primary, + // ), + // ), + // ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/payment_cash_dialog.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/payment_cash_dialog.dart new file mode 100644 index 0000000..dcebe04 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/payment_cash_dialog.dart @@ -0,0 +1,160 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/core.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/build_context_ext.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/models/product_quantity.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/order/bloc/order_pos/order_pos_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/order/widgets/payment_success_dialog.dart'; + +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/custom_text_field.dart'; +import '../../../../../core/components/spaces.dart'; + +class PaymentCashDialog extends StatelessWidget { + final int price; + const PaymentCashDialog({super.key, required this.price}); + + @override + Widget build(BuildContext context) { + final totalPriceController = + TextEditingController(text: price.currencyFormatRp); + return AlertDialog( + scrollable: true, + title: Stack( + children: [ + IconButton( + onPressed: () => context.pop(), + icon: const Icon(Icons.highlight_off), + color: AppColors.primary, + ), + const Center( + child: Padding( + padding: EdgeInsets.only(top: 12.0), + child: Text( + 'Pembayaran - Tunai', + style: TextStyle( + color: AppColors.primary, + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + ), + ), + ], + ), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SpaceHeight(5.0), + const SpaceHeight(16.0), + CustomTextField( + controller: totalPriceController, + label: '', + showLabel: false, + keyboardType: TextInputType.number, + onChanged: (value) { + final int priceValue = value.toIntegerFromText; + totalPriceController.text = priceValue.currencyFormatRp; + totalPriceController.selection = TextSelection.fromPosition( + TextPosition(offset: totalPriceController.text.length)); + }, + ), + const SpaceHeight(16.0), + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Button.filled( + // onPressed: () {}, + // label: 'Uang Pas', + // disabled: true, + // textColor: AppColors.primary, + // fontSize: 13.0, + // width: 112.0, + // height: 50.0, + // ), + // const SpaceWidth(4.0), + Flexible( + child: Button.filled( + onPressed: () {}, + label: price.currencyFormatRp, + disabled: true, + textColor: AppColors.primary, + fontSize: 13.0, + height: 50.0, + ), + ), + // ], + // ), + const SpaceHeight(30.0), + BlocBuilder( + builder: (context, state) { + List items = state.maybeWhen( + orElse: () => [], + loaded: (products, discount) => products, + ); + + final price = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount) => products.fold( + 0, + (previousValue, element) => + previousValue + + (element.product.price! * element.quantity), + ), + ); + + final discount = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount) { + if (discount == null) { + return 0; + } + return discount.value! + .replaceAll('.00', '') + .toIntegerFromText; + }); + final totalDiscount = discount / 100 * price; + final totalQty = price - (discount / 100 * price); + totalPriceController.text = totalQty.currencyFormatRp; + + print("discount di payment $discount"); + print("total di payment $totalQty"); + + return Button.filled( + onPressed: () async { + context.read().add(OrderPosEvent.order( + items, + discount, + 0, + 0, + totalPriceController.text.toIntegerFromText, + )); + + showDialog( + context: context, + builder: (context) => PaymentSuccessDialog( + data: items, + paymentAmount: + totalPriceController.text.toIntegerFromText, + totalQty: totalQty.toInt(), + totalPrice: price.toInt(), + totalDiscount: totalDiscount.toInt(), + subTotal: (price - totalDiscount).toInt(), + kembalian: totalPriceController.text.toIntegerFromText - + (price - totalDiscount).toInt(), + normalPrice: price, + ), + ); + }, + label: 'Bayar', + ); + }, + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/payment_qris_dialog.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/payment_qris_dialog.dart new file mode 100644 index 0000000..e4146c6 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/payment_qris_dialog.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/build_context_ext.dart'; + +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; + + + +class PaymentQrisDialog extends StatelessWidget { + const PaymentQrisDialog({super.key}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + scrollable: true, + contentPadding: const EdgeInsets.all(0), + backgroundColor: AppColors.primary, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Padding( + padding: EdgeInsets.all(12.0), + child: Text( + 'Pembayaran QRIS', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontFamily: 'Quicksand', + fontWeight: FontWeight.w700, + height: 0, + ), + ), + ), + const SpaceHeight(6.0), + Container( + width: context.deviceWidth, + padding: const EdgeInsets.all(14.0), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20.0)), + color: AppColors.white, + ), + child: const Column( + mainAxisSize: MainAxisSize.min, + children: [ + // SizedBox( + // width: 256.0, + // height: 256.0, + // child: QrImageView( + // data: 's.id/batch11', + // version: QrVersions.auto, + // ), + // ), + SpaceHeight(5.0), + Text( + 'Scan QRIS untuk melakukan pembayaran', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/payment_success_dialog.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/payment_success_dialog.dart new file mode 100644 index 0000000..4a8887f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/payment_success_dialog.dart @@ -0,0 +1,281 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/core.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/date_time_ext.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; +import 'package:flutter_pos_ecommerce/module/pos/data/dataoutputs/print_dataoutputs.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/models/product_quantity.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/pages/dashboard_page.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/order/bloc/order_pos/order_pos_bloc.dart'; +import 'package:print_bluetooth_thermal/print_bluetooth_thermal.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; + +class PaymentSuccessDialog extends StatefulWidget { + const PaymentSuccessDialog({ + super.key, + required this.data, + required this.paymentAmount, + required this.totalQty, + required this.totalPrice, + required this.totalDiscount, + required this.subTotal, + required this.kembalian, + required this.normalPrice, + }); + final List data; + final int totalQty; + final int paymentAmount; + final int totalPrice; + final int totalDiscount; + final int subTotal; + final int kembalian; + final int normalPrice; + + @override + State createState() => _PaymentSuccessDialogState(); +} + +class _PaymentSuccessDialogState extends State { + // List data = []; + // int totalQty = 0; + // int totalPrice = 0; + + void _handleFinishPressed() { + context.read().add(const CheckoutPosEvent.started()); + Navigator.of(context).pushReplacement( + MaterialPageRoute(builder: (context) => const DashboardPosPage()), + ); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + scrollable: true, + title: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Center(child: Assets.icons.done.svg()), + const SpaceHeight(24.0), + const Text( + 'Pembayaran telah sukses dilakukan', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 20, + ), + ), + ], + ), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SpaceHeight(12.0), + // const _LabelValue( + // label: 'METODE PEMBAYARAN', + // value: 'Tunai', + // ), + const Text('METODE BAYAR'), + const SpaceHeight(5.0), + BlocBuilder( + builder: (context, state) { + final paymentMethod = state.maybeWhen( + orElse: () => 'Cash', + loaded: (model) => model.paymentMethod, + ); + return Text( + paymentMethod, + style: const TextStyle( + fontWeight: FontWeight.w700, + ), + ); + }, + ), + const Divider(height: 36.0), + // _LabelValue( + // label: 'TOTAL PEMBELIAN', + // value: 123000.currencyFormatRp, + // ), + + const Text('TOTAL TAGIHAN'), + const SpaceHeight(5.0), + BlocBuilder( + builder: (context, state) { + final price = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount) => products.fold( + 0, + (previousValue, element) => + previousValue + + (element.product.price! * element.quantity), + ), + ); + + final discount = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount) { + if (discount == null) { + return 0; + } + return discount.value! + .replaceAll('.00', '') + .toIntegerFromText; + }); + final total = price - (discount / 100 * price); + return Text( + total.currencyFormatRp, + style: const TextStyle( + fontWeight: FontWeight.w700, + ), + ); + }, + ), + const Divider(height: 36.0), + // _LabelValue( + // label: 'NOMINAL BAYAR', + // value: 123000.currencyFormatRp, + // ), + const Text('NOMINAL BAYAR'), + const SpaceHeight(5.0), + BlocBuilder( + builder: (context, state) { + final paymentAmount = state.maybeWhen( + orElse: () => 0, + loaded: (model) => model.paymentAmount, + ); + return Text( + paymentAmount.ceil().currencyFormatRp, + style: const TextStyle( + fontWeight: FontWeight.w700, + ), + ); + }, + ), + const Divider(height: 36.0), + const Text('KEMBALIAN'), + const SpaceHeight(5.0), + + BlocBuilder( + builder: (context, stateCheckout) { + final price = stateCheckout.maybeWhen( + orElse: () => 0, + loaded: (products, discount) => products.fold( + 0, + (previousValue, element) => + previousValue + + (element.product.price! * element.quantity), + ), + ); + + final discount = stateCheckout.maybeWhen( + orElse: () => 0, + loaded: (products, discount) { + if (discount == null) { + return 0; + } + return discount.value! + .replaceAll('.00', '') + .toIntegerFromText; + }); + final total = price - (discount / 100 * price); + + return BlocBuilder( + builder: (context, stateOrderPos) { + final paymentAmount = stateOrderPos.maybeWhen( + orElse: () => 0, + loaded: (model) => model.paymentAmount, + ); + final kembalian = paymentAmount - total; + return Text( + kembalian.currencyFormatRp, + style: const TextStyle( + fontWeight: FontWeight.w700, + ), + ); + }, + ); + }, + ), + const Divider(height: 36.0), + _LabelValue( + label: 'WAKTU PEMBAYARAN', + value: DateTime.now().toFormattedTime(), + ), + const SpaceHeight(40.0), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Flexible( + child: Button.filled( + onPressed: _handleFinishPressed, + label: 'Selesai', + fontSize: 13, + ), + ), + const SpaceWidth(8.0), + Flexible( + child: Button.outlined( + onPressed: () async { + // final ticket = await CwbPrint.instance.bluetoothStart(); + // final result = + // await PrintBluetoothThermal.writeBytes(ticket); + final printValue = await PrintDataoutputs.instance + .printOrder( + widget.data, + widget.paymentAmount, + widget.totalQty, + widget.totalPrice, + 'Cash', + widget.totalPrice, + 'Dayat', + widget.totalDiscount, + widget.subTotal, + widget.kembalian, + widget.normalPrice); + await PrintBluetoothThermal.writeBytes(printValue); + }, + label: 'Print', + icon: Assets.icons.print.svg(), + fontSize: 13, + ), + ), + ], + ), + ], + ), + ); + } +} + +class _LabelValue extends StatelessWidget { + final String label; + final String value; + + const _LabelValue({ + required this.label, + required this.value, + }); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: const TextStyle(), + ), + const SpaceHeight(5.0), + Text( + value, + style: const TextStyle( + fontWeight: FontWeight.w700, + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/process_button.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/process_button.dart new file mode 100644 index 0000000..c63b03b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/order/widgets/process_button.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; + +class ProcessButton extends StatelessWidget { + final int price; + final VoidCallback onPressed; + + const ProcessButton({ + super.key, + required this.price, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onPressed, + child: Container( + padding: const EdgeInsets.all(20.0), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(6.0)), + color: AppColors.primary, + ), + child: Row( + children: [ + BlocBuilder( + builder: (context, state) { + final price = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount) => products.fold( + 0, + (previousValue, element) => + previousValue + + (element.product.price! * element.quantity), + ), + ); + final discount = state.maybeWhen( + orElse: () => 0, + loaded: (products, discount) { + if (discount == null) { + return 0; + } + return discount.value! + .replaceAll('.00', '') + .toIntegerFromText; + }); + final total = price - (discount / 100 * price); + return Text( + total.currencyFormatRp, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.w700, + ), + ); + }, + ), + const Spacer(), + const Text( + 'Proses', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + const SpaceWidth(5.0), + const Icon( + Icons.chevron_right, + color: AppColors.white, + ), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_bloc.dart new file mode 100644 index 0000000..6008826 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_bloc.dart @@ -0,0 +1,26 @@ +import 'package:bloc/bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/order/models/order_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'transaction_report_event.dart'; +part 'transaction_report_state.dart'; +part 'transaction_report_bloc.freezed.dart'; + +class TransactionReportBloc + extends Bloc { + final ProductLocalDatasource productLocalDatasource; + TransactionReportBloc( + this.productLocalDatasource, + ) : super(const _Initial()) { + on<_GetReport>((event, emit) async { + emit(const _Loading()); + final result = await productLocalDatasource.getAllOrders( + event.startDate, + event.endDate, + ); + + emit(_Loaded(result)); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_bloc.freezed.dart new file mode 100644 index 0000000..358d078 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_bloc.freezed.dart @@ -0,0 +1,924 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'transaction_report_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$TransactionReportEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(DateTime startDate, DateTime endDate) getReport, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(DateTime startDate, DateTime endDate)? getReport, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(DateTime startDate, DateTime endDate)? getReport, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetReport value) getReport, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetReport value)? getReport, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetReport value)? getReport, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $TransactionReportEventCopyWith<$Res> { + factory $TransactionReportEventCopyWith(TransactionReportEvent value, + $Res Function(TransactionReportEvent) then) = + _$TransactionReportEventCopyWithImpl<$Res, TransactionReportEvent>; +} + +/// @nodoc +class _$TransactionReportEventCopyWithImpl<$Res, + $Val extends TransactionReportEvent> + implements $TransactionReportEventCopyWith<$Res> { + _$TransactionReportEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$TransactionReportEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'TransactionReportEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(DateTime startDate, DateTime endDate) getReport, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(DateTime startDate, DateTime endDate)? getReport, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(DateTime startDate, DateTime endDate)? getReport, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetReport value) getReport, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetReport value)? getReport, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetReport value)? getReport, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements TransactionReportEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetReportImplCopyWith<$Res> { + factory _$$GetReportImplCopyWith( + _$GetReportImpl value, $Res Function(_$GetReportImpl) then) = + __$$GetReportImplCopyWithImpl<$Res>; + @useResult + $Res call({DateTime startDate, DateTime endDate}); +} + +/// @nodoc +class __$$GetReportImplCopyWithImpl<$Res> + extends _$TransactionReportEventCopyWithImpl<$Res, _$GetReportImpl> + implements _$$GetReportImplCopyWith<$Res> { + __$$GetReportImplCopyWithImpl( + _$GetReportImpl _value, $Res Function(_$GetReportImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? startDate = null, + Object? endDate = null, + }) { + return _then(_$GetReportImpl( + startDate: null == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime, + endDate: null == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime, + )); + } +} + +/// @nodoc + +class _$GetReportImpl implements _GetReport { + const _$GetReportImpl({required this.startDate, required this.endDate}); + + @override + final DateTime startDate; + @override + final DateTime endDate; + + @override + String toString() { + return 'TransactionReportEvent.getReport(startDate: $startDate, endDate: $endDate)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GetReportImpl && + (identical(other.startDate, startDate) || + other.startDate == startDate) && + (identical(other.endDate, endDate) || other.endDate == endDate)); + } + + @override + int get hashCode => Object.hash(runtimeType, startDate, endDate); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$GetReportImplCopyWith<_$GetReportImpl> get copyWith => + __$$GetReportImplCopyWithImpl<_$GetReportImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(DateTime startDate, DateTime endDate) getReport, + }) { + return getReport(startDate, endDate); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(DateTime startDate, DateTime endDate)? getReport, + }) { + return getReport?.call(startDate, endDate); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(DateTime startDate, DateTime endDate)? getReport, + required TResult orElse(), + }) { + if (getReport != null) { + return getReport(startDate, endDate); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetReport value) getReport, + }) { + return getReport(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetReport value)? getReport, + }) { + return getReport?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetReport value)? getReport, + required TResult orElse(), + }) { + if (getReport != null) { + return getReport(this); + } + return orElse(); + } +} + +abstract class _GetReport implements TransactionReportEvent { + const factory _GetReport( + {required final DateTime startDate, + required final DateTime endDate}) = _$GetReportImpl; + + DateTime get startDate; + DateTime get endDate; + @JsonKey(ignore: true) + _$$GetReportImplCopyWith<_$GetReportImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$TransactionReportState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List transactionReport) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List transactionReport)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List transactionReport)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $TransactionReportStateCopyWith<$Res> { + factory $TransactionReportStateCopyWith(TransactionReportState value, + $Res Function(TransactionReportState) then) = + _$TransactionReportStateCopyWithImpl<$Res, TransactionReportState>; +} + +/// @nodoc +class _$TransactionReportStateCopyWithImpl<$Res, + $Val extends TransactionReportState> + implements $TransactionReportStateCopyWith<$Res> { + _$TransactionReportStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$TransactionReportStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'TransactionReportState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List transactionReport) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List transactionReport)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List transactionReport)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements TransactionReportState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$TransactionReportStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'TransactionReportState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List transactionReport) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List transactionReport)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List transactionReport)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements TransactionReportState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List transactionReport}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$TransactionReportStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? transactionReport = null, + }) { + return _then(_$LoadedImpl( + null == transactionReport + ? _value._transactionReport + : transactionReport // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List transactionReport) + : _transactionReport = transactionReport; + + final List _transactionReport; + @override + List get transactionReport { + if (_transactionReport is EqualUnmodifiableListView) + return _transactionReport; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_transactionReport); + } + + @override + String toString() { + return 'TransactionReportState.loaded(transactionReport: $transactionReport)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality() + .equals(other._transactionReport, _transactionReport)); + } + + @override + int get hashCode => Object.hash( + runtimeType, const DeepCollectionEquality().hash(_transactionReport)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List transactionReport) loaded, + required TResult Function(String message) error, + }) { + return loaded(transactionReport); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List transactionReport)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(transactionReport); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List transactionReport)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(transactionReport); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements TransactionReportState { + const factory _Loaded(final List transactionReport) = + _$LoadedImpl; + + List get transactionReport; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$TransactionReportStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'TransactionReportState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List transactionReport) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List transactionReport)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List transactionReport)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements TransactionReportState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_event.dart new file mode 100644 index 0000000..e07078b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_event.dart @@ -0,0 +1,8 @@ +part of 'transaction_report_bloc.dart'; + +@freezed +class TransactionReportEvent with _$TransactionReportEvent { + const factory TransactionReportEvent.started() = _Started; + const factory TransactionReportEvent.getReport({required DateTime startDate, + required DateTime endDate,}) = _GetReport; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_state.dart new file mode 100644 index 0000000..015cb22 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/bloc/transaction_report/transaction_report_state.dart @@ -0,0 +1,10 @@ +part of 'transaction_report_bloc.dart'; + +@freezed +class TransactionReportState with _$TransactionReportState { + const factory TransactionReportState.initial() = _Initial; + const factory TransactionReportState.loading() = _Loading; + const factory TransactionReportState.loaded( + List transactionReport) = _Loaded; + const factory TransactionReportState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/pages/report_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/pages/report_page.dart new file mode 100644 index 0000000..6e74602 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/pages/report_page.dart @@ -0,0 +1,240 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/custom_date_picker.dart'; +import 'package:flutter_pos_ecommerce/core/components/dashed_line.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/date_time_ext2.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/int_ext.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/report/bloc/transaction_report/transaction_report_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/report/widgets/report_title.dart'; + +class ReportPage extends StatefulWidget { + const ReportPage({super.key}); + + @override + State createState() => _ReportPageState(); +} + +class _ReportPageState extends State { + int selectedMenu = 0; + String title = 'Laporan Penjualan'; + DateTime fromDate = DateTime.now().subtract(const Duration(days: 30)); + DateTime toDate = DateTime.now(); + + @override + Widget build(BuildContext context) { + String searchDateFormatted = + '${fromDate.toFormattedDate2()} to ${toDate.toFormattedDate2()}'; + final isMobile = MediaQuery.of(context).size.width < 600; + + return Scaffold( + body: SafeArea( + child: ListView( + padding: const EdgeInsets.all(16), + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ReportTitle(), + Padding( + padding: const EdgeInsets.all(20.0), + child: isMobile + ? Column( + children: [ + CustomDatePicker( + prefix: const Text('Dari: '), + initialDate: fromDate, + onDateSelected: (selectedDate) { + setState(() { + fromDate = selectedDate; + }); + }, + ), + const SpaceHeight(10.0), + CustomDatePicker( + prefix: const Text('Sampai: '), + initialDate: toDate, + onDateSelected: (selectedDate) { + setState(() { + toDate = selectedDate; + }); + }, + ), + const SpaceHeight(10.0), + ElevatedButton( + onPressed: () { + setState(() {}); + context.read().add( + TransactionReportEvent.getReport( + startDate: DateTime.now(), + endDate: DateTime.now().subtract( + const Duration(days: 30)))); + }, + child: const Text("Cari"), + ), + // MenuButton( + // iconPath: Assets.icons.search.path, + // label: 'Cari', + // onPressed: () { + // setState(() {}); + // context.read().add( + // TransactionReportEvent.getReport( + // startDate: DateTime.now(), + // endDate: DateTime.now().subtract( + // const Duration(days: 30)))); + // }), + ], + ) + : Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: CustomDatePicker( + prefix: const Text('Dari: '), + initialDate: fromDate, + onDateSelected: (selectedDate) { + setState(() { + fromDate = selectedDate; + }); + }, + ), + ), + const SpaceWidth(10.0), + Flexible( + child: CustomDatePicker( + prefix: const Text('Sampai: '), + initialDate: toDate, + onDateSelected: (selectedDate) { + setState(() { + toDate = selectedDate; + }); + }, + ), + ), + const SpaceWidth(10.0), + ElevatedButton( + onPressed: () { + setState(() {}); + context.read().add( + TransactionReportEvent.getReport( + startDate: DateTime.now(), + endDate: DateTime.now().subtract( + const Duration(days: 30)))); + }, + child: const Text("Cari")) + ], + ), + ), + ], + ), + BlocBuilder( + builder: (context, state) { + final totalRevenue = state.maybeMap( + orElse: () => 0, + loaded: (value) { + return value.transactionReport.fold( + 0, + (previousValue, element) => + previousValue + element.total_cost, + ); + }, + ); + print("totalRevenue $totalRevenue"); + final subTotal = state.maybeMap( + orElse: () => 0, + loaded: (value) { + return value.transactionReport.fold( + 0, + (previousValue, element) => + previousValue + element.subtotal, + ); + }, + ); + + print("subtotal $subTotal"); + + final discount = state.maybeMap( + orElse: () => 0, + loaded: (value) { + return value.transactionReport.fold( + 0, + (previousValue, element) => + previousValue + element.discount, + ); + }, + ); + + print("diskon $discount"); + return state.maybeWhen(orElse: () { + return const Center( + child: Text('Tidak ada Data'), + ); + }, loading: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, loaded: (transactionReport) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: Text( + title, + style: const TextStyle( + fontWeight: FontWeight.w600, fontSize: 16.0), + ), + ), + Center( + child: Text( + searchDateFormatted, + style: const TextStyle(fontSize: 16.0), + ), + ), + const SpaceHeight(16.0), + + // REVENUE PEN + ...[ + Text('PENDAPATAN : ${totalRevenue.currencyFormatRp}'), + const SpaceHeight(8.0), + const DashedLine(), + const DashedLine(), + const SpaceHeight(8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text('Subtotal'), + Text(subTotal.currencyFormatRp), + ], + ), + const SpaceHeight(4.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text('Diskon'), + Text('$discount'), + ], + ), + const SpaceHeight(8.0), + const DashedLine(), + const DashedLine(), + const SpaceHeight(8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text('TOTAL'), + Text(totalRevenue.currencyFormatRp), + ], + ), + ], + const SpaceHeight(32.0), + ], + ); + }); + }, + ), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/pages/transaction_report_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/pages/transaction_report_page.dart new file mode 100644 index 0000000..b12b3b6 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/pages/transaction_report_page.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/dashed_line.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/date_time_ext2.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/report/bloc/transaction_report/transaction_report_bloc.dart'; + +class TransactionReportPage extends StatefulWidget { + const TransactionReportPage({super.key}); + + @override + State createState() => _TransactionReportPageState(); +} + +class _TransactionReportPageState extends State { + int selectedMenu = 0; + String title = 'Transaction Report'; + DateTime fromDate = DateTime.now().subtract(const Duration(days: 30)); + DateTime toDate = DateTime.now(); + @override + Widget build(BuildContext context) { + String searchDateFormatted = + '${fromDate.toFormattedDate2()} to ${toDate.toFormattedDate2()}'; + return Scaffold( + appBar: AppBar( + title: const Text("Transaction Report"), + ), + body: Align( + alignment: Alignment.topCenter, + child: SingleChildScrollView( + padding: const EdgeInsets.all(24.0), + child: BlocBuilder( + builder: (context, state) { + final totalRevenue = state.maybeMap( + orElse: () => 0, + loaded: (value) { + return value.transactionReport.fold( + 0, + (previousValue, element) => + previousValue + element.total_cost, + ); + }, + ); + + final subTotal = state.maybeMap( + orElse: () => 0, + loaded: (value) { + return value.transactionReport.fold( + 0, + (previousValue, element) => + previousValue + element.subtotal, + ); + }, + ); + + final discount = state.maybeMap( + orElse: () => 0, + loaded: (value) { + return value.transactionReport.fold( + 0, + (previousValue, element) => + previousValue + element.discount, + ); + }, + ); + return state.maybeWhen(orElse: () { + return const Center( + child: Text('No Data'), + ); + }, loading: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, loaded: (transactionReport) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: Text( + title, + style: const TextStyle( + fontWeight: FontWeight.w600, fontSize: 16.0), + ), + ), + Center( + child: Text( + searchDateFormatted, + style: const TextStyle(fontSize: 16.0), + ), + ), + const SpaceHeight(16.0), + + // REVENUE INFO + ...[ + Text('REVENUE : $totalRevenue'), + const SpaceHeight(8.0), + const DashedLine(), + const DashedLine(), + const SpaceHeight(8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text('Subtotal'), + Text('$subTotal'), + ], + ), + const SpaceHeight(4.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text('Discount'), + Text('$discount'), + ], + ), + const SpaceHeight(8.0), + const DashedLine(), + const DashedLine(), + const SpaceHeight(8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text('TOTAL'), + Text('$totalRevenue'), + ], + ), + ], + const SpaceHeight(32.0), + ], + ); + }); + }, + ), + ), + )); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/widgets/report_menu.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/widgets/report_menu.dart new file mode 100644 index 0000000..b157b7e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/widgets/report_menu.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/assets/assets.gen.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/core/constants/colors.dart'; + +class ReportMenu extends StatelessWidget { + final String label; + final VoidCallback onPressed; + final bool isActive; + + const ReportMenu({ + super.key, + required this.label, + required this.onPressed, + required this.isActive, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onPressed, + child: Container( + margin: const EdgeInsets.all(5.0), + width: 140.0, + height: 160.0, + alignment: Alignment.center, + decoration: BoxDecoration( + color: + isActive ? AppColors.primary.withOpacity(0.13) : AppColors.white, + borderRadius: BorderRadius.circular(18.0), + border: Border.all( + color: isActive ? AppColors.primary : AppColors.stroke, + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Assets.icons.report.svg( + colorFilter: isActive + ? const ColorFilter.mode( + AppColors.primary, + BlendMode.srcIn, + ) + : null, + ), + const SpaceHeight(28.0), + Text( + label, + style: TextStyle( + color: isActive ? AppColors.primary : AppColors.black, + fontWeight: FontWeight.w600, + ), + ), + const SpaceHeight(24.0), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/widgets/report_title.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/widgets/report_title.dart new file mode 100644 index 0000000..1c7b644 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/report/widgets/report_title.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/core/constants/colors.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/date_time_ext2.dart'; + +class ReportTitle extends StatelessWidget { + const ReportTitle({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Laporan Penjualan', + style: TextStyle( + color: AppColors.primary, + fontSize: 24, + fontWeight: FontWeight.w600, + ), + ), + const SpaceHeight(4.0), + Text( + DateTime.now().toFormattedDate(), + style: const TextStyle( + color: AppColors.subtitle, + fontSize: 16, + ), + ), + const SpaceHeight(20.0), + const Divider(), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_bloc.dart new file mode 100644 index 0000000..bf2475a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_bloc.dart @@ -0,0 +1,26 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/discount_remote_datasource.dart'; + +part 'add_discount_bloc.freezed.dart'; +part 'add_discount_event.dart'; +part 'add_discount_state.dart'; + +class AddDiscountBloc extends Bloc { + final DiscountRemoteDatasource discountRemoteDatasource; + AddDiscountBloc( + this.discountRemoteDatasource, + ) : super(const _Initial()) { + on<_AddDiscount>((event, emit) async { + emit(const _Laoding()); + final result = await discountRemoteDatasource.addDiscount( + event.name, event.description, event.value); + result.fold( + (l) => emit(_Error(l)), + (r) => emit(const _Loaded()), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_bloc.freezed.dart new file mode 100644 index 0000000..f76a66d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_bloc.freezed.dart @@ -0,0 +1,895 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'add_discount_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$AddDiscountEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String name, String description, int value) + addDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String name, String description, int value)? addDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String name, String description, int value)? addDiscount, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddDiscount value) addDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddDiscount value)? addDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddDiscount value)? addDiscount, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $AddDiscountEventCopyWith<$Res> { + factory $AddDiscountEventCopyWith( + AddDiscountEvent value, $Res Function(AddDiscountEvent) then) = + _$AddDiscountEventCopyWithImpl<$Res, AddDiscountEvent>; +} + +/// @nodoc +class _$AddDiscountEventCopyWithImpl<$Res, $Val extends AddDiscountEvent> + implements $AddDiscountEventCopyWith<$Res> { + _$AddDiscountEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$AddDiscountEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'AddDiscountEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String name, String description, int value) + addDiscount, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String name, String description, int value)? addDiscount, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String name, String description, int value)? addDiscount, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddDiscount value) addDiscount, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddDiscount value)? addDiscount, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddDiscount value)? addDiscount, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements AddDiscountEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$AddDiscountImplCopyWith<$Res> { + factory _$$AddDiscountImplCopyWith( + _$AddDiscountImpl value, $Res Function(_$AddDiscountImpl) then) = + __$$AddDiscountImplCopyWithImpl<$Res>; + @useResult + $Res call({String name, String description, int value}); +} + +/// @nodoc +class __$$AddDiscountImplCopyWithImpl<$Res> + extends _$AddDiscountEventCopyWithImpl<$Res, _$AddDiscountImpl> + implements _$$AddDiscountImplCopyWith<$Res> { + __$$AddDiscountImplCopyWithImpl( + _$AddDiscountImpl _value, $Res Function(_$AddDiscountImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? description = null, + Object? value = null, + }) { + return _then(_$AddDiscountImpl( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + value: null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$AddDiscountImpl implements _AddDiscount { + const _$AddDiscountImpl( + {required this.name, required this.description, required this.value}); + + @override + final String name; + @override + final String description; + @override + final int value; + + @override + String toString() { + return 'AddDiscountEvent.addDiscount(name: $name, description: $description, value: $value)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$AddDiscountImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.description, description) || + other.description == description) && + (identical(other.value, value) || other.value == value)); + } + + @override + int get hashCode => Object.hash(runtimeType, name, description, value); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$AddDiscountImplCopyWith<_$AddDiscountImpl> get copyWith => + __$$AddDiscountImplCopyWithImpl<_$AddDiscountImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function(String name, String description, int value) + addDiscount, + }) { + return addDiscount(name, description, value); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function(String name, String description, int value)? addDiscount, + }) { + return addDiscount?.call(name, description, value); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function(String name, String description, int value)? addDiscount, + required TResult orElse(), + }) { + if (addDiscount != null) { + return addDiscount(name, description, value); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_AddDiscount value) addDiscount, + }) { + return addDiscount(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_AddDiscount value)? addDiscount, + }) { + return addDiscount?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_AddDiscount value)? addDiscount, + required TResult orElse(), + }) { + if (addDiscount != null) { + return addDiscount(this); + } + return orElse(); + } +} + +abstract class _AddDiscount implements AddDiscountEvent { + const factory _AddDiscount( + {required final String name, + required final String description, + required final int value}) = _$AddDiscountImpl; + + String get name; + String get description; + int get value; + @JsonKey(ignore: true) + _$$AddDiscountImplCopyWith<_$AddDiscountImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$AddDiscountState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Laoding value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Laoding value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Laoding value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $AddDiscountStateCopyWith<$Res> { + factory $AddDiscountStateCopyWith( + AddDiscountState value, $Res Function(AddDiscountState) then) = + _$AddDiscountStateCopyWithImpl<$Res, AddDiscountState>; +} + +/// @nodoc +class _$AddDiscountStateCopyWithImpl<$Res, $Val extends AddDiscountState> + implements $AddDiscountStateCopyWith<$Res> { + _$AddDiscountStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$AddDiscountStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'AddDiscountState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Laoding value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Laoding value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Laoding value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements AddDiscountState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LaodingImplCopyWith<$Res> { + factory _$$LaodingImplCopyWith( + _$LaodingImpl value, $Res Function(_$LaodingImpl) then) = + __$$LaodingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LaodingImplCopyWithImpl<$Res> + extends _$AddDiscountStateCopyWithImpl<$Res, _$LaodingImpl> + implements _$$LaodingImplCopyWith<$Res> { + __$$LaodingImplCopyWithImpl( + _$LaodingImpl _value, $Res Function(_$LaodingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LaodingImpl implements _Laoding { + const _$LaodingImpl(); + + @override + String toString() { + return 'AddDiscountState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LaodingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Laoding value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Laoding value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Laoding value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Laoding implements AddDiscountState { + const factory _Laoding() = _$LaodingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$AddDiscountStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(); + + @override + String toString() { + return 'AddDiscountState.loaded()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return loaded(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Laoding value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Laoding value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Laoding value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements AddDiscountState { + const factory _Loaded() = _$LoadedImpl; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$AddDiscountStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'AddDiscountState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Laoding value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Laoding value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Laoding value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements AddDiscountState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_event.dart new file mode 100644 index 0000000..f8378b5 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_event.dart @@ -0,0 +1,9 @@ +part of 'add_discount_bloc.dart'; + +@freezed +class AddDiscountEvent with _$AddDiscountEvent { + const factory AddDiscountEvent.started() = _Started; + const factory AddDiscountEvent.addDiscount({required String name, + required String description, + required int value,}) = _AddDiscount; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_state.dart new file mode 100644 index 0000000..da5185c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/add_discount/add_discount_state.dart @@ -0,0 +1,9 @@ +part of 'add_discount_bloc.dart'; + +@freezed +class AddDiscountState with _$AddDiscountState { + const factory AddDiscountState.initial() = _Initial; + const factory AddDiscountState.loading() = _Laoding; + const factory AddDiscountState.loaded() = _Loaded; + const factory AddDiscountState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_bloc.dart new file mode 100644 index 0000000..263733b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_bloc.dart @@ -0,0 +1,42 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/discount_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/discount_response_model.dart'; + +part 'discount_bloc.freezed.dart'; +part 'discount_event.dart'; +part 'discount_state.dart'; + +class DiscountBloc extends Bloc { + final DiscountRemoteDatasource discountRemoteDatasource; + DiscountBloc( + this.discountRemoteDatasource, + ) : super(const _Initial()) { + on<_GetDiscounts>((event, emit) async { + emit(const _Loading()); + final result = await discountRemoteDatasource.getDiscounts(); + result.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r.data!)), + ); + }); + on<_UpdateDiscount>((event, emit) async { + emit(const _Loading()); + final result = await discountRemoteDatasource.updateDiscount( + event.id, + event.name, + event.description, + event.value, + ); + result.fold( + (l) => emit(_Error(l)), + (r) { + emit(const _Success('Discount updated successfully')); + add(const DiscountEvent.getDiscounts()); + }, + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_bloc.freezed.dart new file mode 100644 index 0000000..213e99f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_bloc.freezed.dart @@ -0,0 +1,1267 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'discount_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$DiscountEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getDiscounts, + required TResult Function( + int id, String name, String description, double value) + updateDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getDiscounts, + TResult? Function(int id, String name, String description, double value)? + updateDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getDiscounts, + TResult Function(int id, String name, String description, double value)? + updateDiscount, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetDiscounts value) getDiscounts, + required TResult Function(_UpdateDiscount value) updateDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetDiscounts value)? getDiscounts, + TResult? Function(_UpdateDiscount value)? updateDiscount, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetDiscounts value)? getDiscounts, + TResult Function(_UpdateDiscount value)? updateDiscount, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $DiscountEventCopyWith<$Res> { + factory $DiscountEventCopyWith( + DiscountEvent value, $Res Function(DiscountEvent) then) = + _$DiscountEventCopyWithImpl<$Res, DiscountEvent>; +} + +/// @nodoc +class _$DiscountEventCopyWithImpl<$Res, $Val extends DiscountEvent> + implements $DiscountEventCopyWith<$Res> { + _$DiscountEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$DiscountEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'DiscountEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getDiscounts, + required TResult Function( + int id, String name, String description, double value) + updateDiscount, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getDiscounts, + TResult? Function(int id, String name, String description, double value)? + updateDiscount, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getDiscounts, + TResult Function(int id, String name, String description, double value)? + updateDiscount, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetDiscounts value) getDiscounts, + required TResult Function(_UpdateDiscount value) updateDiscount, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetDiscounts value)? getDiscounts, + TResult? Function(_UpdateDiscount value)? updateDiscount, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetDiscounts value)? getDiscounts, + TResult Function(_UpdateDiscount value)? updateDiscount, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements DiscountEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetDiscountsImplCopyWith<$Res> { + factory _$$GetDiscountsImplCopyWith( + _$GetDiscountsImpl value, $Res Function(_$GetDiscountsImpl) then) = + __$$GetDiscountsImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$GetDiscountsImplCopyWithImpl<$Res> + extends _$DiscountEventCopyWithImpl<$Res, _$GetDiscountsImpl> + implements _$$GetDiscountsImplCopyWith<$Res> { + __$$GetDiscountsImplCopyWithImpl( + _$GetDiscountsImpl _value, $Res Function(_$GetDiscountsImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$GetDiscountsImpl implements _GetDiscounts { + const _$GetDiscountsImpl(); + + @override + String toString() { + return 'DiscountEvent.getDiscounts()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$GetDiscountsImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getDiscounts, + required TResult Function( + int id, String name, String description, double value) + updateDiscount, + }) { + return getDiscounts(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getDiscounts, + TResult? Function(int id, String name, String description, double value)? + updateDiscount, + }) { + return getDiscounts?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getDiscounts, + TResult Function(int id, String name, String description, double value)? + updateDiscount, + required TResult orElse(), + }) { + if (getDiscounts != null) { + return getDiscounts(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetDiscounts value) getDiscounts, + required TResult Function(_UpdateDiscount value) updateDiscount, + }) { + return getDiscounts(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetDiscounts value)? getDiscounts, + TResult? Function(_UpdateDiscount value)? updateDiscount, + }) { + return getDiscounts?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetDiscounts value)? getDiscounts, + TResult Function(_UpdateDiscount value)? updateDiscount, + required TResult orElse(), + }) { + if (getDiscounts != null) { + return getDiscounts(this); + } + return orElse(); + } +} + +abstract class _GetDiscounts implements DiscountEvent { + const factory _GetDiscounts() = _$GetDiscountsImpl; +} + +/// @nodoc +abstract class _$$UpdateDiscountImplCopyWith<$Res> { + factory _$$UpdateDiscountImplCopyWith(_$UpdateDiscountImpl value, + $Res Function(_$UpdateDiscountImpl) then) = + __$$UpdateDiscountImplCopyWithImpl<$Res>; + @useResult + $Res call({int id, String name, String description, double value}); +} + +/// @nodoc +class __$$UpdateDiscountImplCopyWithImpl<$Res> + extends _$DiscountEventCopyWithImpl<$Res, _$UpdateDiscountImpl> + implements _$$UpdateDiscountImplCopyWith<$Res> { + __$$UpdateDiscountImplCopyWithImpl( + _$UpdateDiscountImpl _value, $Res Function(_$UpdateDiscountImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + Object? description = null, + Object? value = null, + }) { + return _then(_$UpdateDiscountImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + value: null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as double, + )); + } +} + +/// @nodoc + +class _$UpdateDiscountImpl implements _UpdateDiscount { + const _$UpdateDiscountImpl( + {required this.id, + required this.name, + required this.description, + required this.value}); + + @override + final int id; + @override + final String name; + @override + final String description; + @override + final double value; + + @override + String toString() { + return 'DiscountEvent.updateDiscount(id: $id, name: $name, description: $description, value: $value)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$UpdateDiscountImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.description, description) || + other.description == description) && + (identical(other.value, value) || other.value == value)); + } + + @override + int get hashCode => Object.hash(runtimeType, id, name, description, value); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$UpdateDiscountImplCopyWith<_$UpdateDiscountImpl> get copyWith => + __$$UpdateDiscountImplCopyWithImpl<_$UpdateDiscountImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getDiscounts, + required TResult Function( + int id, String name, String description, double value) + updateDiscount, + }) { + return updateDiscount(id, name, description, value); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getDiscounts, + TResult? Function(int id, String name, String description, double value)? + updateDiscount, + }) { + return updateDiscount?.call(id, name, description, value); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getDiscounts, + TResult Function(int id, String name, String description, double value)? + updateDiscount, + required TResult orElse(), + }) { + if (updateDiscount != null) { + return updateDiscount(id, name, description, value); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetDiscounts value) getDiscounts, + required TResult Function(_UpdateDiscount value) updateDiscount, + }) { + return updateDiscount(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetDiscounts value)? getDiscounts, + TResult? Function(_UpdateDiscount value)? updateDiscount, + }) { + return updateDiscount?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetDiscounts value)? getDiscounts, + TResult Function(_UpdateDiscount value)? updateDiscount, + required TResult orElse(), + }) { + if (updateDiscount != null) { + return updateDiscount(this); + } + return orElse(); + } +} + +abstract class _UpdateDiscount implements DiscountEvent { + const factory _UpdateDiscount( + {required final int id, + required final String name, + required final String description, + required final double value}) = _$UpdateDiscountImpl; + + int get id; + String get name; + String get description; + double get value; + @JsonKey(ignore: true) + _$$UpdateDiscountImplCopyWith<_$UpdateDiscountImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$DiscountState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List discounts) loaded, + required TResult Function(String message) success, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List discounts)? loaded, + TResult? Function(String message)? success, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List discounts)? loaded, + TResult Function(String message)? success, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Success value) success, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Success value)? success, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Success value)? success, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $DiscountStateCopyWith<$Res> { + factory $DiscountStateCopyWith( + DiscountState value, $Res Function(DiscountState) then) = + _$DiscountStateCopyWithImpl<$Res, DiscountState>; +} + +/// @nodoc +class _$DiscountStateCopyWithImpl<$Res, $Val extends DiscountState> + implements $DiscountStateCopyWith<$Res> { + _$DiscountStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$DiscountStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'DiscountState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List discounts) loaded, + required TResult Function(String message) success, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List discounts)? loaded, + TResult? Function(String message)? success, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List discounts)? loaded, + TResult Function(String message)? success, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Success value) success, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Success value)? success, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Success value)? success, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements DiscountState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$DiscountStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'DiscountState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List discounts) loaded, + required TResult Function(String message) success, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List discounts)? loaded, + TResult? Function(String message)? success, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List discounts)? loaded, + TResult Function(String message)? success, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Success value) success, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Success value)? success, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Success value)? success, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements DiscountState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List discounts}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$DiscountStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? discounts = null, + }) { + return _then(_$LoadedImpl( + null == discounts + ? _value._discounts + : discounts // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(final List discounts) : _discounts = discounts; + + final List _discounts; + @override + List get discounts { + if (_discounts is EqualUnmodifiableListView) return _discounts; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_discounts); + } + + @override + String toString() { + return 'DiscountState.loaded(discounts: $discounts)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + const DeepCollectionEquality() + .equals(other._discounts, _discounts)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_discounts)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List discounts) loaded, + required TResult Function(String message) success, + required TResult Function(String message) error, + }) { + return loaded(discounts); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List discounts)? loaded, + TResult? Function(String message)? success, + TResult? Function(String message)? error, + }) { + return loaded?.call(discounts); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List discounts)? loaded, + TResult Function(String message)? success, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(discounts); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Success value) success, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Success value)? success, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Success value)? success, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements DiscountState { + const factory _Loaded(final List discounts) = _$LoadedImpl; + + List get discounts; + @JsonKey(ignore: true) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SuccessImplCopyWith<$Res> { + factory _$$SuccessImplCopyWith( + _$SuccessImpl value, $Res Function(_$SuccessImpl) then) = + __$$SuccessImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$SuccessImplCopyWithImpl<$Res> + extends _$DiscountStateCopyWithImpl<$Res, _$SuccessImpl> + implements _$$SuccessImplCopyWith<$Res> { + __$$SuccessImplCopyWithImpl( + _$SuccessImpl _value, $Res Function(_$SuccessImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$SuccessImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$SuccessImpl implements _Success { + const _$SuccessImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'DiscountState.success(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SuccessImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$SuccessImplCopyWith<_$SuccessImpl> get copyWith => + __$$SuccessImplCopyWithImpl<_$SuccessImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List discounts) loaded, + required TResult Function(String message) success, + required TResult Function(String message) error, + }) { + return success(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List discounts)? loaded, + TResult? Function(String message)? success, + TResult? Function(String message)? error, + }) { + return success?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List discounts)? loaded, + TResult Function(String message)? success, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (success != null) { + return success(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Success value) success, + required TResult Function(_Error value) error, + }) { + return success(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Success value)? success, + TResult? Function(_Error value)? error, + }) { + return success?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Success value)? success, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (success != null) { + return success(this); + } + return orElse(); + } +} + +abstract class _Success implements DiscountState { + const factory _Success(final String message) = _$SuccessImpl; + + String get message; + @JsonKey(ignore: true) + _$$SuccessImplCopyWith<_$SuccessImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$DiscountStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'DiscountState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List discounts) loaded, + required TResult Function(String message) success, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List discounts)? loaded, + TResult? Function(String message)? success, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List discounts)? loaded, + TResult Function(String message)? success, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Success value) success, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Success value)? success, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Success value)? success, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements DiscountState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_event.dart new file mode 100644 index 0000000..1684c90 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_event.dart @@ -0,0 +1,13 @@ +part of 'discount_bloc.dart'; + +@freezed +class DiscountEvent with _$DiscountEvent { + const factory DiscountEvent.started() = _Started; + const factory DiscountEvent.getDiscounts() = _GetDiscounts; + const factory DiscountEvent.updateDiscount({ + required int id, + required String name, + required String description, + required double value, + }) = _UpdateDiscount; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_state.dart new file mode 100644 index 0000000..3bf946a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/discount/discount_state.dart @@ -0,0 +1,10 @@ +part of 'discount_bloc.dart'; + +@freezed +class DiscountState with _$DiscountState { + const factory DiscountState.initial() = _Initial; + const factory DiscountState.loading() = _Loading; + const factory DiscountState.loaded(List discounts) = _Loaded; + const factory DiscountState.success(String message) = _Success; + const factory DiscountState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_bloc.dart new file mode 100644 index 0000000..c5ab4cc --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_bloc.dart @@ -0,0 +1,41 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:io'; + +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_remote_datasource.dart'; + +part 'profile_bloc.freezed.dart'; +part 'profile_event.dart'; +part 'profile_state.dart'; + +class ProfileBloc extends Bloc { + final AuthRemoteDatasource _datasource; + ProfileBloc( + this._datasource, + ) : super(const _Initial()) { + on<_GetProfile>((event, emit) async { + emit(const ProfileState.loading()); + final result = await _datasource.getProfile(); + result.fold( + (failure) => emit(ProfileState.error(message: failure)), + (profile) => emit(ProfileState.profileLoaded(profile: profile)), + ); + }); + + on<_UpdateProfile>((event, emit) async { + emit(const ProfileState.loading()); + final result = await _datasource.updateProfile( + name: event.name, + email: event.email, + phone: event.phone, + foto: event.foto, + ); + result.fold( + (failure) => emit(ProfileState.error(message: failure)), + (_) => emit(const ProfileState.profileUpdated()), + ); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_bloc.freezed.dart new file mode 100644 index 0000000..bab09f0 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_bloc.freezed.dart @@ -0,0 +1,1235 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'profile_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$ProfileEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProfile, + required TResult Function( + String name, String email, String phone, File? foto) + updateProfile, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProfile, + TResult? Function(String name, String email, String phone, File? foto)? + updateProfile, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProfile, + TResult Function(String name, String email, String phone, File? foto)? + updateProfile, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProfile value) getProfile, + required TResult Function(_UpdateProfile value) updateProfile, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProfile value)? getProfile, + TResult? Function(_UpdateProfile value)? updateProfile, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProfile value)? getProfile, + TResult Function(_UpdateProfile value)? updateProfile, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ProfileEventCopyWith<$Res> { + factory $ProfileEventCopyWith( + ProfileEvent value, $Res Function(ProfileEvent) then) = + _$ProfileEventCopyWithImpl<$Res, ProfileEvent>; +} + +/// @nodoc +class _$ProfileEventCopyWithImpl<$Res, $Val extends ProfileEvent> + implements $ProfileEventCopyWith<$Res> { + _$ProfileEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$ProfileEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'ProfileEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProfile, + required TResult Function( + String name, String email, String phone, File? foto) + updateProfile, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProfile, + TResult? Function(String name, String email, String phone, File? foto)? + updateProfile, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProfile, + TResult Function(String name, String email, String phone, File? foto)? + updateProfile, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProfile value) getProfile, + required TResult Function(_UpdateProfile value) updateProfile, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProfile value)? getProfile, + TResult? Function(_UpdateProfile value)? updateProfile, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProfile value)? getProfile, + TResult Function(_UpdateProfile value)? updateProfile, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements ProfileEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$GetProfileImplCopyWith<$Res> { + factory _$$GetProfileImplCopyWith( + _$GetProfileImpl value, $Res Function(_$GetProfileImpl) then) = + __$$GetProfileImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$GetProfileImplCopyWithImpl<$Res> + extends _$ProfileEventCopyWithImpl<$Res, _$GetProfileImpl> + implements _$$GetProfileImplCopyWith<$Res> { + __$$GetProfileImplCopyWithImpl( + _$GetProfileImpl _value, $Res Function(_$GetProfileImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$GetProfileImpl implements _GetProfile { + const _$GetProfileImpl(); + + @override + String toString() { + return 'ProfileEvent.getProfile()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$GetProfileImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProfile, + required TResult Function( + String name, String email, String phone, File? foto) + updateProfile, + }) { + return getProfile(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProfile, + TResult? Function(String name, String email, String phone, File? foto)? + updateProfile, + }) { + return getProfile?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProfile, + TResult Function(String name, String email, String phone, File? foto)? + updateProfile, + required TResult orElse(), + }) { + if (getProfile != null) { + return getProfile(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProfile value) getProfile, + required TResult Function(_UpdateProfile value) updateProfile, + }) { + return getProfile(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProfile value)? getProfile, + TResult? Function(_UpdateProfile value)? updateProfile, + }) { + return getProfile?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProfile value)? getProfile, + TResult Function(_UpdateProfile value)? updateProfile, + required TResult orElse(), + }) { + if (getProfile != null) { + return getProfile(this); + } + return orElse(); + } +} + +abstract class _GetProfile implements ProfileEvent { + const factory _GetProfile() = _$GetProfileImpl; +} + +/// @nodoc +abstract class _$$UpdateProfileImplCopyWith<$Res> { + factory _$$UpdateProfileImplCopyWith( + _$UpdateProfileImpl value, $Res Function(_$UpdateProfileImpl) then) = + __$$UpdateProfileImplCopyWithImpl<$Res>; + @useResult + $Res call({String name, String email, String phone, File? foto}); +} + +/// @nodoc +class __$$UpdateProfileImplCopyWithImpl<$Res> + extends _$ProfileEventCopyWithImpl<$Res, _$UpdateProfileImpl> + implements _$$UpdateProfileImplCopyWith<$Res> { + __$$UpdateProfileImplCopyWithImpl( + _$UpdateProfileImpl _value, $Res Function(_$UpdateProfileImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? email = null, + Object? phone = null, + Object? foto = freezed, + }) { + return _then(_$UpdateProfileImpl( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + phone: null == phone + ? _value.phone + : phone // ignore: cast_nullable_to_non_nullable + as String, + foto: freezed == foto + ? _value.foto + : foto // ignore: cast_nullable_to_non_nullable + as File?, + )); + } +} + +/// @nodoc + +class _$UpdateProfileImpl implements _UpdateProfile { + const _$UpdateProfileImpl( + {required this.name, + required this.email, + required this.phone, + this.foto}); + + @override + final String name; + @override + final String email; + @override + final String phone; + @override + final File? foto; + + @override + String toString() { + return 'ProfileEvent.updateProfile(name: $name, email: $email, phone: $phone, foto: $foto)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$UpdateProfileImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.email, email) || other.email == email) && + (identical(other.phone, phone) || other.phone == phone) && + (identical(other.foto, foto) || other.foto == foto)); + } + + @override + int get hashCode => Object.hash(runtimeType, name, email, phone, foto); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$UpdateProfileImplCopyWith<_$UpdateProfileImpl> get copyWith => + __$$UpdateProfileImplCopyWithImpl<_$UpdateProfileImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() getProfile, + required TResult Function( + String name, String email, String phone, File? foto) + updateProfile, + }) { + return updateProfile(name, email, phone, foto); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? getProfile, + TResult? Function(String name, String email, String phone, File? foto)? + updateProfile, + }) { + return updateProfile?.call(name, email, phone, foto); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? getProfile, + TResult Function(String name, String email, String phone, File? foto)? + updateProfile, + required TResult orElse(), + }) { + if (updateProfile != null) { + return updateProfile(name, email, phone, foto); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_GetProfile value) getProfile, + required TResult Function(_UpdateProfile value) updateProfile, + }) { + return updateProfile(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_GetProfile value)? getProfile, + TResult? Function(_UpdateProfile value)? updateProfile, + }) { + return updateProfile?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_GetProfile value)? getProfile, + TResult Function(_UpdateProfile value)? updateProfile, + required TResult orElse(), + }) { + if (updateProfile != null) { + return updateProfile(this); + } + return orElse(); + } +} + +abstract class _UpdateProfile implements ProfileEvent { + const factory _UpdateProfile( + {required final String name, + required final String email, + required final String phone, + final File? foto}) = _$UpdateProfileImpl; + + String get name; + String get email; + String get phone; + File? get foto; + @JsonKey(ignore: true) + _$$UpdateProfileImplCopyWith<_$UpdateProfileImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$ProfileState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(Map profile) profileLoaded, + required TResult Function() profileUpdated, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(Map profile)? profileLoaded, + TResult? Function()? profileUpdated, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(Map profile)? profileLoaded, + TResult Function()? profileUpdated, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_ProfileLoaded value) profileLoaded, + required TResult Function(_ProfileUpdated value) profileUpdated, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_ProfileLoaded value)? profileLoaded, + TResult? Function(_ProfileUpdated value)? profileUpdated, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_ProfileLoaded value)? profileLoaded, + TResult Function(_ProfileUpdated value)? profileUpdated, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ProfileStateCopyWith<$Res> { + factory $ProfileStateCopyWith( + ProfileState value, $Res Function(ProfileState) then) = + _$ProfileStateCopyWithImpl<$Res, ProfileState>; +} + +/// @nodoc +class _$ProfileStateCopyWithImpl<$Res, $Val extends ProfileState> + implements $ProfileStateCopyWith<$Res> { + _$ProfileStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$ProfileStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'ProfileState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(Map profile) profileLoaded, + required TResult Function() profileUpdated, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(Map profile)? profileLoaded, + TResult? Function()? profileUpdated, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(Map profile)? profileLoaded, + TResult Function()? profileUpdated, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_ProfileLoaded value) profileLoaded, + required TResult Function(_ProfileUpdated value) profileUpdated, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_ProfileLoaded value)? profileLoaded, + TResult? Function(_ProfileUpdated value)? profileUpdated, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_ProfileLoaded value)? profileLoaded, + TResult Function(_ProfileUpdated value)? profileUpdated, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements ProfileState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$ProfileStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'ProfileState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(Map profile) profileLoaded, + required TResult Function() profileUpdated, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(Map profile)? profileLoaded, + TResult? Function()? profileUpdated, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(Map profile)? profileLoaded, + TResult Function()? profileUpdated, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_ProfileLoaded value) profileLoaded, + required TResult Function(_ProfileUpdated value) profileUpdated, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_ProfileLoaded value)? profileLoaded, + TResult? Function(_ProfileUpdated value)? profileUpdated, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_ProfileLoaded value)? profileLoaded, + TResult Function(_ProfileUpdated value)? profileUpdated, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements ProfileState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$ProfileLoadedImplCopyWith<$Res> { + factory _$$ProfileLoadedImplCopyWith( + _$ProfileLoadedImpl value, $Res Function(_$ProfileLoadedImpl) then) = + __$$ProfileLoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({Map profile}); +} + +/// @nodoc +class __$$ProfileLoadedImplCopyWithImpl<$Res> + extends _$ProfileStateCopyWithImpl<$Res, _$ProfileLoadedImpl> + implements _$$ProfileLoadedImplCopyWith<$Res> { + __$$ProfileLoadedImplCopyWithImpl( + _$ProfileLoadedImpl _value, $Res Function(_$ProfileLoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? profile = null, + }) { + return _then(_$ProfileLoadedImpl( + profile: null == profile + ? _value._profile + : profile // ignore: cast_nullable_to_non_nullable + as Map, + )); + } +} + +/// @nodoc + +class _$ProfileLoadedImpl implements _ProfileLoaded { + const _$ProfileLoadedImpl({required final Map profile}) + : _profile = profile; + + final Map _profile; + @override + Map get profile { + if (_profile is EqualUnmodifiableMapView) return _profile; + // ignore: implicit_dynamic_type + return EqualUnmodifiableMapView(_profile); + } + + @override + String toString() { + return 'ProfileState.profileLoaded(profile: $profile)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ProfileLoadedImpl && + const DeepCollectionEquality().equals(other._profile, _profile)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_profile)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ProfileLoadedImplCopyWith<_$ProfileLoadedImpl> get copyWith => + __$$ProfileLoadedImplCopyWithImpl<_$ProfileLoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(Map profile) profileLoaded, + required TResult Function() profileUpdated, + required TResult Function(String message) error, + }) { + return profileLoaded(profile); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(Map profile)? profileLoaded, + TResult? Function()? profileUpdated, + TResult? Function(String message)? error, + }) { + return profileLoaded?.call(profile); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(Map profile)? profileLoaded, + TResult Function()? profileUpdated, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (profileLoaded != null) { + return profileLoaded(profile); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_ProfileLoaded value) profileLoaded, + required TResult Function(_ProfileUpdated value) profileUpdated, + required TResult Function(_Error value) error, + }) { + return profileLoaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_ProfileLoaded value)? profileLoaded, + TResult? Function(_ProfileUpdated value)? profileUpdated, + TResult? Function(_Error value)? error, + }) { + return profileLoaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_ProfileLoaded value)? profileLoaded, + TResult Function(_ProfileUpdated value)? profileUpdated, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (profileLoaded != null) { + return profileLoaded(this); + } + return orElse(); + } +} + +abstract class _ProfileLoaded implements ProfileState { + const factory _ProfileLoaded({required final Map profile}) = + _$ProfileLoadedImpl; + + Map get profile; + @JsonKey(ignore: true) + _$$ProfileLoadedImplCopyWith<_$ProfileLoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ProfileUpdatedImplCopyWith<$Res> { + factory _$$ProfileUpdatedImplCopyWith(_$ProfileUpdatedImpl value, + $Res Function(_$ProfileUpdatedImpl) then) = + __$$ProfileUpdatedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$ProfileUpdatedImplCopyWithImpl<$Res> + extends _$ProfileStateCopyWithImpl<$Res, _$ProfileUpdatedImpl> + implements _$$ProfileUpdatedImplCopyWith<$Res> { + __$$ProfileUpdatedImplCopyWithImpl( + _$ProfileUpdatedImpl _value, $Res Function(_$ProfileUpdatedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$ProfileUpdatedImpl implements _ProfileUpdated { + const _$ProfileUpdatedImpl(); + + @override + String toString() { + return 'ProfileState.profileUpdated()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$ProfileUpdatedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(Map profile) profileLoaded, + required TResult Function() profileUpdated, + required TResult Function(String message) error, + }) { + return profileUpdated(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(Map profile)? profileLoaded, + TResult? Function()? profileUpdated, + TResult? Function(String message)? error, + }) { + return profileUpdated?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(Map profile)? profileLoaded, + TResult Function()? profileUpdated, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (profileUpdated != null) { + return profileUpdated(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_ProfileLoaded value) profileLoaded, + required TResult Function(_ProfileUpdated value) profileUpdated, + required TResult Function(_Error value) error, + }) { + return profileUpdated(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_ProfileLoaded value)? profileLoaded, + TResult? Function(_ProfileUpdated value)? profileUpdated, + TResult? Function(_Error value)? error, + }) { + return profileUpdated?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_ProfileLoaded value)? profileLoaded, + TResult Function(_ProfileUpdated value)? profileUpdated, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (profileUpdated != null) { + return profileUpdated(this); + } + return orElse(); + } +} + +abstract class _ProfileUpdated implements ProfileState { + const factory _ProfileUpdated() = _$ProfileUpdatedImpl; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$ProfileStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + message: null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl({required this.message}); + + @override + final String message; + + @override + String toString() { + return 'ProfileState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(Map profile) profileLoaded, + required TResult Function() profileUpdated, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(Map profile)? profileLoaded, + TResult? Function()? profileUpdated, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(Map profile)? profileLoaded, + TResult Function()? profileUpdated, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_ProfileLoaded value) profileLoaded, + required TResult Function(_ProfileUpdated value) profileUpdated, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_ProfileLoaded value)? profileLoaded, + TResult? Function(_ProfileUpdated value)? profileUpdated, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_ProfileLoaded value)? profileLoaded, + TResult Function(_ProfileUpdated value)? profileUpdated, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements ProfileState { + const factory _Error({required final String message}) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_event.dart new file mode 100644 index 0000000..2f946a2 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_event.dart @@ -0,0 +1,13 @@ +part of 'profile_bloc.dart'; + +@freezed +class ProfileEvent with _$ProfileEvent { + const factory ProfileEvent.started() = _Started; + const factory ProfileEvent.getProfile() = _GetProfile; + const factory ProfileEvent.updateProfile({ + required String name, + required String email, + required String phone, + File? foto, + }) = _UpdateProfile; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_state.dart new file mode 100644 index 0000000..e82c601 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/profile/profile_state.dart @@ -0,0 +1,12 @@ +part of 'profile_bloc.dart'; + +@freezed +class ProfileState with _$ProfileState { + const factory ProfileState.initial() = _Initial; + const factory ProfileState.loading() = _Loading; + const factory ProfileState.profileLoaded({ + required Map profile, + }) = _ProfileLoaded; + const factory ProfileState.profileUpdated() = _ProfileUpdated; + const factory ProfileState.error({required String message}) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_bloc.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_bloc.dart new file mode 100644 index 0000000..978d2aa --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_bloc.dart @@ -0,0 +1,42 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:bloc/bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_local_datasource.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/order_remote_datasource.dart'; + +part 'sync_order_bloc.freezed.dart'; +part 'sync_order_event.dart'; +part 'sync_order_state.dart'; + +class SyncOrderBloc extends Bloc { + final OrderRemoteDatasource orderRemoteDatasource; + SyncOrderBloc( + this.orderRemoteDatasource, + ) : super(const _Initial()) { + on<_SyncOrder>((event, emit) async { + emit(const _Loading()); + final dataOrderNotSynced = + await ProductLocalDatasource.instance.getOrderByIsNotSync(); + for (var order in dataOrderNotSynced) { + print("order : $order"); + final orderItem = await ProductLocalDatasource.instance + .getOrderItemByOrderId(order.id!); + + print("order item : $orderItem"); + final newOrder = order.copyWith(orderItems: orderItem); + print("new order : $newOrder"); + final result = await orderRemoteDatasource.saveOrder(newOrder); + print("result : $result"); + if (result) { + await ProductLocalDatasource.instance.updateOrderIsSync(order.id!); + + } else { + emit(const _Error('Sync Order Failed')); + return; + } + } + emit(const _Loaded()); + }); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_bloc.freezed.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_bloc.freezed.dart new file mode 100644 index 0000000..892e2be --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_bloc.freezed.dart @@ -0,0 +1,838 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'sync_order_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$SyncOrderEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() syncOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? syncOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? syncOrder, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_SyncOrder value) syncOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_SyncOrder value)? syncOrder, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_SyncOrder value)? syncOrder, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SyncOrderEventCopyWith<$Res> { + factory $SyncOrderEventCopyWith( + SyncOrderEvent value, $Res Function(SyncOrderEvent) then) = + _$SyncOrderEventCopyWithImpl<$Res, SyncOrderEvent>; +} + +/// @nodoc +class _$SyncOrderEventCopyWithImpl<$Res, $Val extends SyncOrderEvent> + implements $SyncOrderEventCopyWith<$Res> { + _$SyncOrderEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$StartedImplCopyWith<$Res> { + factory _$$StartedImplCopyWith( + _$StartedImpl value, $Res Function(_$StartedImpl) then) = + __$$StartedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$StartedImplCopyWithImpl<$Res> + extends _$SyncOrderEventCopyWithImpl<$Res, _$StartedImpl> + implements _$$StartedImplCopyWith<$Res> { + __$$StartedImplCopyWithImpl( + _$StartedImpl _value, $Res Function(_$StartedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$StartedImpl implements _Started { + const _$StartedImpl(); + + @override + String toString() { + return 'SyncOrderEvent.started()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$StartedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() syncOrder, + }) { + return started(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? syncOrder, + }) { + return started?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? syncOrder, + required TResult orElse(), + }) { + if (started != null) { + return started(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_SyncOrder value) syncOrder, + }) { + return started(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_SyncOrder value)? syncOrder, + }) { + return started?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_SyncOrder value)? syncOrder, + required TResult orElse(), + }) { + if (started != null) { + return started(this); + } + return orElse(); + } +} + +abstract class _Started implements SyncOrderEvent { + const factory _Started() = _$StartedImpl; +} + +/// @nodoc +abstract class _$$SyncOrderImplCopyWith<$Res> { + factory _$$SyncOrderImplCopyWith( + _$SyncOrderImpl value, $Res Function(_$SyncOrderImpl) then) = + __$$SyncOrderImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$SyncOrderImplCopyWithImpl<$Res> + extends _$SyncOrderEventCopyWithImpl<$Res, _$SyncOrderImpl> + implements _$$SyncOrderImplCopyWith<$Res> { + __$$SyncOrderImplCopyWithImpl( + _$SyncOrderImpl _value, $Res Function(_$SyncOrderImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$SyncOrderImpl implements _SyncOrder { + const _$SyncOrderImpl(); + + @override + String toString() { + return 'SyncOrderEvent.syncOrder()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$SyncOrderImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() started, + required TResult Function() syncOrder, + }) { + return syncOrder(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? started, + TResult? Function()? syncOrder, + }) { + return syncOrder?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? started, + TResult Function()? syncOrder, + required TResult orElse(), + }) { + if (syncOrder != null) { + return syncOrder(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Started value) started, + required TResult Function(_SyncOrder value) syncOrder, + }) { + return syncOrder(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Started value)? started, + TResult? Function(_SyncOrder value)? syncOrder, + }) { + return syncOrder?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Started value)? started, + TResult Function(_SyncOrder value)? syncOrder, + required TResult orElse(), + }) { + if (syncOrder != null) { + return syncOrder(this); + } + return orElse(); + } +} + +abstract class _SyncOrder implements SyncOrderEvent { + const factory _SyncOrder() = _$SyncOrderImpl; +} + +/// @nodoc +mixin _$SyncOrderState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SyncOrderStateCopyWith<$Res> { + factory $SyncOrderStateCopyWith( + SyncOrderState value, $Res Function(SyncOrderState) then) = + _$SyncOrderStateCopyWithImpl<$Res, SyncOrderState>; +} + +/// @nodoc +class _$SyncOrderStateCopyWithImpl<$Res, $Val extends SyncOrderState> + implements $SyncOrderStateCopyWith<$Res> { + _$SyncOrderStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$SyncOrderStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'SyncOrderState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements SyncOrderState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$SyncOrderStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'SyncOrderState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements SyncOrderState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$SyncOrderStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(); + + @override + String toString() { + return 'SyncOrderState.loaded()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return loaded(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements SyncOrderState { + const factory _Loaded() = _$LoadedImpl; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$SyncOrderStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'SyncOrderState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements SyncOrderState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + @JsonKey(ignore: true) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_event.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_event.dart new file mode 100644 index 0000000..fedb95a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_event.dart @@ -0,0 +1,7 @@ +part of 'sync_order_bloc.dart'; + +@freezed +class SyncOrderEvent with _$SyncOrderEvent { + const factory SyncOrderEvent.started() = _Started; + const factory SyncOrderEvent.syncOrder() = _SyncOrder; +} \ No newline at end of file diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_state.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_state.dart new file mode 100644 index 0000000..d07d854 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/bloc/sync_order/sync_order_state.dart @@ -0,0 +1,9 @@ +part of 'sync_order_bloc.dart'; + +@freezed +class SyncOrderState with _$SyncOrderState { + const factory SyncOrderState.initial() = _Initial; + const factory SyncOrderState.loading() = _Loading; + const factory SyncOrderState.loaded() = _Loaded; + const factory SyncOrderState.error(String message) = _Error; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/dialogs/discount_dialog.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/dialogs/discount_dialog.dart new file mode 100644 index 0000000..885adfe --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/dialogs/discount_dialog.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/build_context_ext.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/orders/bloc/order/order_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../setting/bloc/discount/discount_bloc.dart'; + +class DiscountDialog extends StatelessWidget { + const DiscountDialog({super.key}); + + // @override + // void didChangeDependencies() { + // super.didChangeDependencies(); + // context.read().add(const DiscountEvent.getDiscounts()); + // } + + @override + Widget build(BuildContext context) { + context.read().add(const DiscountEvent.getDiscounts()); + int discountIdSelected = 0; + return AlertDialog( + title: Stack( + alignment: Alignment.center, + children: [ + const Text( + 'DISKON', + style: TextStyle( + color: AppColors.primary, + fontSize: 28, + fontWeight: FontWeight.w600, + ), + ), + Align( + alignment: Alignment.centerRight, + child: IconButton( + onPressed: () { + context.pop(); + }, + icon: const Icon( + Icons.cancel, + color: AppColors.primary, + size: 30.0, + ), + ), + ), + ], + ), + content: BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => const SizedBox.shrink(), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + loaded: (discounts) { + return StatefulBuilder( + builder: (context, setState) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: discounts + .map( + (discount) => ListTile( + title: Text('Nama Diskon: ${discount.name}'), + subtitle: Text('Potongan harga (${discount.value}%)'), + contentPadding: EdgeInsets.zero, + textColor: AppColors.primary, + trailing: Checkbox( + value: discount.id == discountIdSelected, + onChanged: (value) { + context.read().add( + CheckoutPosEvent.addDiscount(discount), + ); + context.read().add( + CheckoutEvent.addDiscount(discount), + ); + // context.read().add( + // OrderEvent.doOrder(addressId: addressId, discount: discount, paymentMethod: paymentMethod, shippingService: shippingService, shippingCost: shippingCost, paymentVaName: paymentVaName, products: products), + // ); + // FIXME + setState(() { + discountIdSelected = discount.id!; + }); + }, + ), + onTap: () { + context.pop(); + }, + ), + ) + .toList(), + ), + ); + }, + ); + }, + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/dialogs/form_discount_dialog.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/dialogs/form_discount_dialog.dart new file mode 100644 index 0000000..2d4fe0e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/dialogs/form_discount_dialog.dart @@ -0,0 +1,111 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'package:flutter_pos_ecommerce/core/components/custom_text_field.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/build_context_ext.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/discount_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/bloc/add_discount/add_discount_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/models/discount_model.dart'; + +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../bloc/discount/discount_bloc.dart'; + +class FormDiscountDialog extends StatefulWidget { + final Discount? data; + const FormDiscountDialog({ + super.key, + this.data, + }); + + @override + State createState() => _FormDiscountDialogState(); +} + +class _FormDiscountDialogState extends State { + final nameController = TextEditingController(); + final descriptionController = TextEditingController(); + final discountController = TextEditingController(); + // final categoryController = + // ValueNotifier(data?.category ?? ProductCategory.food); + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + onPressed: () => context.pop(), + icon: const Icon(Icons.close), + ), + Text(widget.data == null ? 'Tambah Diskon' : 'Edit Diskon'), + const Spacer(), + ], + ), + content: SingleChildScrollView( + child: SizedBox( + width: context.deviceWidth / 1, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextField( + controller: nameController, + label: 'Nama Diskon', + onChanged: (value) {}, + ), + const SpaceHeight(24.0), + CustomTextField( + controller: descriptionController, + label: 'Deskripsi (Opsional)', + onChanged: (value) {}, + ), + const SpaceHeight(24.0), + CustomTextField( + controller: discountController, + label: 'Percent', + prefixIcon: const Icon(Icons.percent), + onChanged: (value) {}, + keyboardType: TextInputType.number, + ), + const SpaceHeight(24.0), + BlocConsumer( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + loaded: () { + context + .read() + .add(const DiscountEvent.getDiscounts()); + context.pop(); + }, + ); + }, + builder: (context, state) { + return state.maybeWhen(orElse: () { + return Button.filled( + onPressed: () { + context.read().add( + AddDiscountEvent.addDiscount( + name: nameController.text, + description: descriptionController.text, + value: int.parse(discountController.text), + ), + ); + }, + label: 'Simpan Diskon', + ); + }, loading: () { + return const Center( + child: CircularProgressIndicator(), + ); + }); + }, + ) + ], + ), + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/dialogs/form_update_discount_dialog.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/dialogs/form_update_discount_dialog.dart new file mode 100644 index 0000000..f916ab4 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/dialogs/form_update_discount_dialog.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/components/custom_text_field.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/build_context_ext.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; + +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../ecommerce/data/models/responses/discount_response_model.dart'; +import '../bloc/discount/discount_bloc.dart'; + +class FormUpdateDiscountDialog extends StatefulWidget { + final Discount? data; + const FormUpdateDiscountDialog({ + super.key, + this.data, + }); + + @override + State createState() => + _FormUpdateDiscountDialogState(); +} + +class _FormUpdateDiscountDialogState extends State { + final nameController = TextEditingController(); + final descriptionController = TextEditingController(); + final discountController = TextEditingController(); + + @override + void initState() { + super.initState(); + if (widget.data != null) { + nameController.text = widget.data!.name.toString(); + descriptionController.text = widget.data!.description ?? ''; + discountController.text = widget.data!.value.toString(); + } + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + onPressed: () => context.pop(), + icon: const Icon(Icons.close), + ), + Text(widget.data == null ? 'Tambah Diskon' : 'Edit Diskon'), + const Spacer(), + ], + ), + content: SingleChildScrollView( + child: SizedBox( + width: context.deviceWidth / 1, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextField( + controller: nameController, + label: 'Nama Diskon', + onChanged: (value) {}, + ), + const SpaceHeight(24.0), + CustomTextField( + controller: descriptionController, + label: 'Deskripsi (Opsional)', + onChanged: (value) {}, + ), + const SpaceHeight(24.0), + CustomTextField( + controller: discountController, + label: 'Percent', + prefixIcon: const Icon(Icons.percent), + onChanged: (value) {}, + keyboardType: TextInputType.number, + ), + const SpaceHeight(24.0), + BlocConsumer( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + success: (message) { + Navigator.of(context).pop(); + context + .read() + .add(const DiscountEvent.getDiscounts()); + }, + ); + }, + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return Button.filled( + onPressed: () { + if (widget.data != null) { + context.read().add( + DiscountEvent.updateDiscount( + id: widget.data!.id!, + name: nameController.text, + description: descriptionController.text, + value: + double.parse(discountController.text), + ), + ); + } else {} + }, + label: 'Ubah Diskon', + ); + }, + loading: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, + ); + }, + ), + ], + ), + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/category_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/category_model.dart new file mode 100644 index 0000000..a57645e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/category_model.dart @@ -0,0 +1,12 @@ +class CategoryModel { + final int value; + final String name; + + CategoryModel({ + required this.name, + required this.value, + }); + + @override + String toString() => name; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/discount_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/discount_model.dart new file mode 100644 index 0000000..f06baa3 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/discount_model.dart @@ -0,0 +1,23 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import '../../home/models/product_category.dart'; + +class DiscountModel { + final String name; + final String code; + final int discount; + final ProductCategory category; + final String? description; + + DiscountModel({ + required this.name, + required this.code, + required this.discount, + required this.category, + required this.description, + }); + + @override + String toString() { + return 'DiscountModel(name: $name, code: $code, discount: $discount, category: $category, description: $description)'; + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/isAvailable_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/isAvailable_model.dart new file mode 100644 index 0000000..c16232f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/isAvailable_model.dart @@ -0,0 +1,12 @@ +class IsAvailable { + int value; + String name; + + IsAvailable({ + required this.value, + required this.name, + }); + + @override + String toString() => name; +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/printer_model.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/printer_model.dart new file mode 100644 index 0000000..d7d5577 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/models/printer_model.dart @@ -0,0 +1,9 @@ +class PrinterModel { + final String name; + final int address; + + PrinterModel({ + required this.name, + required this.address, + }); +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/add_product_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/add_product_page.dart new file mode 100644 index 0000000..6a0be41 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/add_product_page.dart @@ -0,0 +1,192 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart'; +import 'package:image_picker/image_picker.dart'; +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/custom_dropdown.dart'; +import '../../../../../core/components/custom_text_field.dart'; +import '../../../../../core/components/image_picker_widget.dart'; +import '../../../../../core/components/spaces.dart'; +import '../models/category_model.dart'; +import '../models/isAvailable_model.dart'; + +class AddProductPage extends StatefulWidget { + const AddProductPage({super.key}); + + @override + State createState() => _AddProductPageState(); +} + +class _AddProductPageState extends State { + TextEditingController? nameController; + TextEditingController? priceController; + TextEditingController? stockController; + TextEditingController? isAvailableController; + TextEditingController? descriptionController; + TextEditingController? categoryController; + + int category = 1; + int isAvailable = 1; + + XFile? imageFile; + + final List categories = [ + CategoryModel(name: 'Benih', value: 1), + CategoryModel(name: 'Pupuk', value: 2), + CategoryModel(name: 'Pestisida', value: 3), + CategoryModel(name: 'Alat Pertanian', value: 4), + ]; + + final List isavailable = [ + IsAvailable(name: 'Ya', value: 1), + IsAvailable(name: 'Tidak', value: 0), + ]; + + @override + void initState() { + nameController = TextEditingController(); + priceController = TextEditingController(); + stockController = TextEditingController(); + isAvailableController = TextEditingController(); + descriptionController = TextEditingController(); + categoryController = TextEditingController(); + super.initState(); + } + + @override + void dispose() { + super.dispose(); + nameController!.dispose(); + priceController!.dispose(); + stockController!.dispose(); + isAvailableController!.dispose(); + descriptionController!.dispose(); + categoryController!.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Tambah Produk'), + centerTitle: true, + ), + body: ListView( + padding: const EdgeInsets.all(24.0), + children: [ + CustomTextField( + controller: nameController!, + label: 'Nama Produk', + ), + const SpaceHeight(20.0), + CustomTextField( + controller: priceController!, + label: 'Harga Produk', + keyboardType: TextInputType.number, + onChanged: (value) { + // final int priceValue = value.toIntegerFromText; + // priceController.text = priceValue.currencyFormatRp; + // priceController.selection = TextSelection.fromPosition( + // TextPosition(offset: priceController.text.length)); + }, + ), + const SpaceHeight(20.0), + ImagePickerWidget( + label: 'Foto Produk', + onChanged: (file) { + if (file == null) { + return; + } + imageFile = file; + }, + ), + const SpaceHeight(20.0), + CustomTextField( + controller: stockController!, + label: 'Stok Produk', + keyboardType: TextInputType.number, + ), + const SpaceHeight(20.0), + CustomDropdown( + value: categories.first, + items: categories, + label: 'Kategori', + onChanged: (value) { + setState(() { + category = value!.value; // Mengubah nilai category menjadi int + }); + }, + ), + const SpaceHeight(20.0), + CustomDropdown( + value: isavailable.first, + items: isavailable, + label: 'Tersedia', + onChanged: (value) { + setState(() { + isAvailable = value!.value; + }); + }, + ), + const SpaceHeight(20.0), + CustomTextField( + controller: descriptionController!, + label: 'Deskripsi Produk', + ), + const SpaceHeight(24.0), + BlocConsumer( + listener: (context, state) { + state.maybeMap( + orElse: () {}, + loaded: (_) { + Navigator.pop(context); + }, + ); + }, + builder: (context, state) { + return state.maybeWhen(orElse: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, loading: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, loaded: (_) { + return Button.filled( + onPressed: () { + final String name = nameController!.text; + final int price = priceController!.text.toIntegerFromText; + final int stock = stockController!.text.toIntegerFromText; + final Product product = Product( + name: name, + price: price, + stock: stock, + categoryId: category, + description: descriptionController!.text, + isAvailable: isAvailable, + image: imageFile!.path); + context + .read() + .add(AllProductEvent.addProduct(product, imageFile!)); + }, + label: 'Simpan', + ); + }); + }, + ), + const SpaceHeight(30.0), + Button.outlined( + onPressed: () { + Navigator.pop(context); + }, + label: 'Batal', + ), + const SpaceHeight(30.0), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/discount_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/discount_page.dart new file mode 100644 index 0000000..082c666 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/discount_page.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/constants/colors.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/discount_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/discount_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/dialogs/form_update_discount_dialog.dart'; +import '../bloc/discount/discount_bloc.dart'; +import '../dialogs/form_discount_dialog.dart'; +import '../widgets/add_data.dart'; +import '../widgets/manage_discount_card.dart'; + +class DiscountPage extends StatefulWidget { + const DiscountPage({super.key}); + + @override + State createState() => _DiscountPageState(); +} + +class _DiscountPageState extends State { + // final List discounts = [ + // DiscountModel( + // name: '20', + // code: 'BUKAPUASA', + // description: null, + // discount: 50, + // category: ProductCategory.food, + // ), + // ]; + + void onEditTap(Discount item) { + showDialog( + context: context, + builder: (context) => FormUpdateDiscountDialog(data: item), + ); + } + + void onAddDataTap() { + showDialog( + context: context, + builder: (context) => const FormDiscountDialog(), + ); + } + + void onDeleteTap(Discount item) async { + final result = await DiscountRemoteDatasource().deleteDiscount(item.id!); + result.fold( + (error) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(error), + backgroundColor: Colors.red, + ), + ); + }, + (success) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Discount deleted successfully'), + backgroundColor: AppColors.primary, + ), + ); + context.read().add(const DiscountEvent.getDiscounts()); + }, + ); + } + + @override + void initState() { + context.read().add(const DiscountEvent.getDiscounts()); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Kelola Diskon'), + centerTitle: true, + ), + body: ListView( + padding: const EdgeInsets.all(24.0), + children: [ + BlocBuilder( + builder: (context, state) { + return state.maybeWhen(orElse: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, loaded: (discounts) { + return GridView.builder( + shrinkWrap: true, + itemCount: discounts.length + 1, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + childAspectRatio: 0.85, + crossAxisCount: 2, + crossAxisSpacing: 30.0, + mainAxisSpacing: 30.0, + ), + itemBuilder: (context, index) { + if (index == 0) { + return AddData( + title: 'Tambah Diskon Baru', + onPressed: onAddDataTap, + ); + } + final item = discounts[index - 1]; + return ManageDiscountCard( + data: item, + onEditTap: () { + onEditTap(item); + }, + onDeleteTap: () { + onDeleteTap(item); + }, + ); + }, + ); + }); + }, + ), + ], + )); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/manage_printer_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/manage_printer_page.dart new file mode 100644 index 0000000..8b5c4fb --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/manage_printer_page.dart @@ -0,0 +1,338 @@ +import 'package:esc_pos_utils_plus/esc_pos_utils_plus.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/core/constants/colors.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/build_context_ext%20copy.dart'; +import 'package:print_bluetooth_thermal/print_bluetooth_thermal.dart'; + +import '../widgets/menu_printer_button.dart'; +import '../widgets/menu_printer_content.dart'; + +class ManagePrinterPage extends StatefulWidget { + const ManagePrinterPage({super.key}); + + @override + State createState() => _ManagePrinterPageState(); +} + +class _ManagePrinterPageState extends State { + int selectedIndex = 0; + // final List datas = [ + // PrinterModel( + // name: 'Galaxy A30', + // address: 12324567412, + // ), + // PrinterModel( + // name: 'Galaxy A30', + // address: 12324567412, + // ), + // PrinterModel( + // name: 'Galaxy A30', + // address: 12324567412, + // ), + // ]; + + String macName = ''; + + String _info = ""; + String _msj = ''; + bool connected = false; + List items = []; + final List _options = [ + "permission bluetooth granted", + "bluetooth enabled", + "connection status", + "update info" + ]; + + final String _selectSize = "2"; + final _txtText = TextEditingController(text: "Hello developer"); + bool _progress = false; + String _msjprogress = ""; + + String optionprinttype = "58 mm"; + List options = ["58 mm", "80 mm"]; + + @override + void initState() { + super.initState(); + initPlatformState(); + } + + Future initPlatformState() async { + String platformVersion; + int porcentbatery = 0; + // Platform messages may fail, so we use a try/catch PlatformException. + try { + platformVersion = await PrintBluetoothThermal.platformVersion; + print("patformversion: $platformVersion"); + porcentbatery = await PrintBluetoothThermal.batteryLevel; + } on PlatformException { + platformVersion = 'Failed to get platform version.'; + } + + // If the widget was removed from the tree while the asynchronous platform + // message was in flight, we want to discard the reply rather than calling + // setState to update our non-existent appearance. + if (!mounted) return; + + final bool result = await PrintBluetoothThermal.bluetoothEnabled; + print("bluetooth enabled: $result"); + if (result) { + _msj = "Bluetooth enabled, please search and connect"; + } else { + _msj = "Bluetooth not enabled"; + } + + setState(() { + _info = "$platformVersion ($porcentbatery% battery)"; + }); + } + + Future getBluetoots() async { + setState(() { + _progress = true; + _msjprogress = "Wait"; + items = []; + }); + final List listResult = + await PrintBluetoothThermal.pairedBluetooths; + + setState(() { + _progress = false; + }); + + if (listResult.isEmpty) { + _msj = + "There are no bluetoohs linked, go to settings and link the printer"; + } else { + _msj = "Touch an item in the list to connect"; + } + + setState(() { + items = listResult; + }); + } + + Future connect(String mac) async { + setState(() { + _progress = true; + _msjprogress = "Connecting..."; + connected = false; + }); + final bool result = + await PrintBluetoothThermal.connect(macPrinterAddress: mac); + print("state conected $result"); + if (result) connected = true; + setState(() { + _progress = false; + }); + } + + Future disconnect() async { + final bool status = await PrintBluetoothThermal.disconnect; + setState(() { + connected = false; + }); + print("status disconnect $status"); + } + + Future printTest() async { + bool conexionStatus = await PrintBluetoothThermal.connectionStatus; + //print("connection status: $conexionStatus"); + if (conexionStatus) { + List ticket = await testTicket(); + final result = await PrintBluetoothThermal.writeBytes(ticket); + print("print test result: $result"); + } else { + //no conectado, reconecte + } + } + + Future> testTicket() async { + List bytes = []; + // Using default profile + final profile = await CapabilityProfile.load(); + final generator = Generator( + optionprinttype == "58 mm" ? PaperSize.mm58 : PaperSize.mm80, profile); + //bytes += generator.setGlobalFont(PosFontType.fontA); + bytes += generator.reset(); + + bytes += + generator.text('Code with Bahri', styles: const PosStyles(bold: true)); + bytes += + generator.text('Reverse text', styles: const PosStyles(reverse: true)); + bytes += generator.text('Underlined text', + styles: const PosStyles(underline: true), linesAfter: 1); + bytes += generator.text('Align left', + styles: const PosStyles(align: PosAlign.left)); + bytes += generator.text('Align center', + styles: const PosStyles(align: PosAlign.center)); + bytes += generator.text('Align right', + styles: const PosStyles(align: PosAlign.right), linesAfter: 1); + + bytes += generator.text( + 'FIC Batch 11', + styles: const PosStyles( + height: PosTextSize.size2, + width: PosTextSize.size2, + ), + ); + + bytes += generator.feed(2); + //bytes += generator.cut(); + return bytes; + } + + Future printWithoutPackage() async { + //impresion sin paquete solo de PrintBluetoothTermal + bool connectionStatus = await PrintBluetoothThermal.connectionStatus; + if (connectionStatus) { + String text = "${_txtText.text}\n"; + bool result = await PrintBluetoothThermal.writeString( + printText: PrintTextSize(size: int.parse(_selectSize), text: text)); + print("status print result: $result"); + setState(() { + _msj = "printed status: $result"; + }); + } else { + //no conectado, reconecte + setState(() { + _msj = "no connected device"; + }); + print("no conectado"); + } + } + + Future printString() async { + bool conexionStatus = await PrintBluetoothThermal.connectionStatus; + if (conexionStatus) { + String enter = '\n'; + await PrintBluetoothThermal.writeBytes(enter.codeUnits); + //size of 1-5 + String text = "Hello"; + await PrintBluetoothThermal.writeString( + printText: PrintTextSize(size: 1, text: text)); + await PrintBluetoothThermal.writeString( + printText: PrintTextSize(size: 2, text: "$text size 2")); + await PrintBluetoothThermal.writeString( + printText: PrintTextSize(size: 3, text: "$text size 3")); + } else { + //desconectado + print("desconectado bluetooth $conexionStatus"); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Kelola Printer'), + centerTitle: true, + ), + body: ListView( + padding: const EdgeInsets.all(20.0), + children: [ + Container( + width: context.deviceWidth / 2, + padding: const EdgeInsets.all(8.0), + decoration: BoxDecoration( + color: AppColors.card, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + MenuPrinterButton( + label: 'Cari', + onPressed: () { + getBluetoots(); + selectedIndex = 0; + setState(() {}); + }, + isActive: selectedIndex == 0, + ), + // MenuPrinterButton( + // label: 'Disconnect', + // onPressed: () { + // selectedIndex = 1; + // setState(() {}); + // }, + // isActive: selectedIndex == 1, + // ), + // MenuPrinterButton( + // label: 'Test', + // onPressed: () { + // selectedIndex = 2; + // setState(() {}); + // }, + // isActive: selectedIndex == 2, + // ), + ], + ), + ), + const SpaceHeight(34.0), + _Body( + // selectedIndex: selectedIndex, + macName: macName, + datas: items, + clickHandler: (mac) async { + macName = mac; + await connect(mac); + setState(() {}); + }, + ), + ], + ), + ); + } +} + +class _Body extends StatelessWidget { + // final int selectedIndex; + final String macName; + final List datas; + + //clickHandler + final Function(String) clickHandler; + + const _Body({ + super.key, + required this.macName, + required this.datas, + required this.clickHandler, + }); + + @override + Widget build(BuildContext context) { + if (datas.isEmpty) { + return const Text('No data available'); + } else { + return Container( + padding: const EdgeInsets.all(24.0), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: AppColors.card, width: 2), + borderRadius: BorderRadius.circular(6), + ), + child: ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: datas.length, + separatorBuilder: (context, index) => const SpaceHeight(16.0), + itemBuilder: (context, index) => InkWell( + onTap: () { + clickHandler(datas[index].macAdress); + }, + child: MenuPrinterContent( + isSelected: macName == datas[index].macAdress, + data: datas[index], + ), + ), + ), + ); + } + // return const Placeholder(); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/manage_product_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/manage_product_page.dart new file mode 100644 index 0000000..dd3a8b5 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/manage_product_page.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/constants/colors.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_remote_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart'; + +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../home/models/product_category.dart'; +import '../../home/models/product_model.dart'; +import '../widgets/menu_product_item.dart'; +import 'add_product_page.dart'; + +class ManageProductPage extends StatefulWidget { + const ManageProductPage({super.key}); + + @override + State createState() => _ManageProductPageState(); +} + +class _ManageProductPageState extends State { + void onDeleteTap(Product product) async { + // Lakukan permintaan HTTP untuk menghapus produk dari server + final result = await ProductRemoteDatasource().deleteProduct(product.id!); + + result.fold( + (error) { + // Tangani kesalahan jika permintaan gagal + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Gagal menghapus produk: $error'), + backgroundColor: Colors.red, + ), + ); + }, + (success) { + // Jika penghapusan berhasil, perbarui UI dengan menghapus produk dari daftar + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Produk berhasil dihapus'), + backgroundColor: AppColors.primary, + ), + ); + // Perbarui UI dengan menghapus produk dari daftar + setState(() { + products.remove(product); + }); + }, + ); + } + + final List products = [ + ProductModel( + image: Assets.images.f1.path, + name: 'Vanila Late Vanila itu', + category: ProductCategory.drink, + price: 200000, + stock: 10, + ), + ProductModel( + image: Assets.images.f2.path, + name: 'V60', + category: ProductCategory.drink, + price: 1200000, + stock: 10, + ), + ProductModel( + image: Assets.images.f3.path, + name: 'Americano', + category: ProductCategory.drink, + price: 2100000, + stock: 10, + ), + ProductModel( + image: Assets.images.f4.path, + name: 'Cappucino', + category: ProductCategory.food, + price: 200000, + stock: 10, + ), + ]; + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Kelola Produk'), + centerTitle: true, + ), + body: ListView( + padding: const EdgeInsets.all(24.0), + children: [ + const Text( + 'List Produk', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + const SpaceHeight(20.0), + BlocBuilder( + builder: (context, state) { + return state.maybeWhen(orElse: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, loaded: (products) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: products.length, + separatorBuilder: (context, index) => const SpaceHeight(20.0), + itemBuilder: (context, index) => MenuProductItem( + onDeleteTap: onDeleteTap, + data: products[index], + ), + ); + }); + // ListView.separated( + // shrinkWrap: true, + // physics: const NeverScrollableScrollPhysics(), + // itemCount: products.length, + // separatorBuilder: (context, index) => const SpaceHeight(20.0), + // itemBuilder: (context, index) => MenuProductItem( + // data: products[index], + // ), + // ), + }, + ), + ], + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + Navigator.push(context, MaterialPageRoute(builder: (context) { + return const AddProductPage(); + })); + }, + child: const Icon(Icons.add), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/profile_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/profile_page.dart new file mode 100644 index 0000000..31a0abd --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/profile_page.dart @@ -0,0 +1,278 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/constants/colors.dart'; +import 'package:flutter_pos_ecommerce/core/router/app_router.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/auth_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/account/widgets/custome_textfield.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/auth/bloc/logout/logout_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/auth/pages/login_page.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/checkout/checkout_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/home/bloc/checkout_pos/checkout_pos_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/bloc/profile/profile_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'package:image_picker/image_picker.dart'; + +class ProfilePage extends StatefulWidget { + const ProfilePage({super.key}); + + @override + State createState() => _ProfilePageState(); +} + +class _ProfilePageState extends State { + final _nameController = TextEditingController(); + final _emailController = TextEditingController(); + final _phoneController = TextEditingController(); + File? _foto; + + @override + void initState() { + super.initState(); + context.read().add(const ProfileEvent.getProfile()); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Profile'), + actions: [ + IconButton( + icon: const Icon( + Icons.login_outlined, + color: AppColors.primary, + ), + onPressed: () { + showDialog( + context: context, + builder: (context) => const ShowDialogLogout(), + ); + }, + ), + ], + ), + body: BlocConsumer( + listener: (context, state) { + state.maybeWhen( + profileLoaded: (profile) { + _nameController.text = profile['user']['name']; + _emailController.text = profile['user']['email']; + _phoneController.text = profile['user']['phone']; + }, + profileUpdated: () { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Profile Berhasil di Perbaruih'), + backgroundColor: AppColors.primary, + ), + ); + Navigator.push(context, + MaterialPageRoute(builder: (context) => const ProfilePage())); + }, + error: (message) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(message), + backgroundColor: Colors.red, + ), + ); + }, + orElse: () {}, + ); + }, + builder: (context, state) { + return state.maybeWhen( + loading: () => const Center(child: CircularProgressIndicator()), + profileLoaded: (_) => _buildProfileForm(context), + orElse: () => const Center(child: CircularProgressIndicator()), + ); + }, + ), + ); + } + + Widget _buildProfileForm(BuildContext context) { + return ListView( + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20), + children: [ + Container( + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 30), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.white, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: GestureDetector( + onTap: () async { + final pickedFile = await ImagePicker() + .pickImage(source: ImageSource.gallery); + if (pickedFile != null) { + setState(() { + _foto = File(pickedFile.path); + }); + } + }, + child: const SizedBox() + // CircleAvatar( + // radius: 60, + // backgroundImage: _foto != null + // ? FileImage(_foto!) + // : const AssetImage('assets/images/img_friend4.png') + // as ImageProvider, + // ), + ), + ), + // const SizedBox(height: 10), + // const Text( + // "Ganti Foto Profile", + // style: TextStyle( + // fontWeight: FontWeight.w700, + // fontSize: 15, + // ), + // ), + const SizedBox(height: 12), + CustomeTextField( + title: "Nama", + controller: _nameController, + ), + const SizedBox(height: 10), + CustomeTextField( + title: "Email", + controller: _emailController, + ), + const SizedBox(height: 10), + CustomeTextField( + title: "No.HP", + controller: _phoneController, + ), + const SizedBox(height: 50), + SizedBox( + width: double.infinity, + height: 50, + child: TextButton( + onPressed: () { + if (_nameController.text.isNotEmpty && + _emailController.text.isNotEmpty && + _phoneController.text.isNotEmpty) { + context + .read() + .add(ProfileEvent.updateProfile( + name: _nameController.text, + email: _emailController.text, + phone: _phoneController.text, + foto: _foto, + )); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('All fields are required'), + backgroundColor: Colors.red, + ), + ); + } + }, + style: TextButton.styleFrom( + backgroundColor: AppColors.primary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(56), + ), + ), + child: const Text( + "Edit", + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), + ), + ), + ], + ), + ), + ], + ); + } +} + +class ShowDialogLogout extends StatelessWidget { + const ShowDialogLogout({super.key}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + insetPadding: const EdgeInsets.symmetric(horizontal: 30), + title: const Text( + "Logout", + style: TextStyle( + color: AppColors.black, + fontWeight: FontWeight.w700, + ), + ), + content: const Text( + "Apakah anda ingin logout ? ", + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text( + 'Cancel', + style: TextStyle( + color: AppColors.primary, + fontWeight: FontWeight.w700, + ), + ), + ), + BlocConsumer( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + loaded: () { + context + .read() + .add(const CheckoutPosEvent.started()); + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + content: Text('Logout Success'), + backgroundColor: AppColors.primary, + )); + context.goNamed( + RouteConstants.login, + ); + }, + error: (message) { + context + .read() + .add(const CheckoutPosEvent.started()); + context.goNamed( + RouteConstants.login, + ); + }); + }, + builder: (context, state) { + return state.maybeWhen( + loading: () => const CircularProgressIndicator(), + orElse: () => TextButton( + onPressed: () { + context.read().add(const LogoutEvent.logout()); + }, + child: const Text( + 'Logout', + style: TextStyle( + color: AppColors.primary, + fontWeight: FontWeight.w700, + ), + )), + ); + }, + ) + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/setting_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/setting_page.dart new file mode 100644 index 0000000..5588c78 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/setting_page.dart @@ -0,0 +1,187 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/core/assets/assets.gen.dart'; +import 'package:flutter_pos_ecommerce/core/components/menu_button.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/build_context_ext.dart'; +import 'package:flutter_pos_ecommerce/core/router/app_router.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/report/pages/report_page.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/pages/discount_page.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/pages/manage_printer_page.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/pages/profile_page.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/pages/sync_data_page.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../ecommerce/data/datasources/auth_local_datasource.dart'; +import '../../../../ecommerce/data/datasources/product_local_datasource.dart'; +import '../../../../ecommerce/presentation/auth/bloc/logout/logout_bloc.dart'; +import '../../../../ecommerce/presentation/auth/pages/login_page.dart'; +import '../bloc/sync_order/sync_order_bloc.dart'; +import 'manage_product_page.dart'; + +class SettingPage extends StatefulWidget { + const SettingPage({super.key}); + + @override + State createState() => _SettingPageState(); +} + +class _SettingPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Kelola'), + ), + body: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + Row( + children: [ + MenuButton( + iconPath: Assets.images.manageProduct.path, + label: 'Kelola Produk', + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const ManageProductPage())), + isImage: true, + ), + const SpaceWidth(15.0), + MenuButton( + iconPath: Assets.images.manageProduct.path, + label: 'Kelola Diskon', + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const DiscountPage(), + )), + isImage: true, + ), + ], + ), + const SpaceHeight(20), + Row( + children: [ + MenuButton( + iconPath: Assets.images.managePrinter.path, + label: 'Kelola Printer', + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const ManagePrinterPage())); + }, + isImage: true, + ), + const SpaceWidth(15.0), + MenuButton( + iconPath: Assets.images.managePrinter.path, + label: 'Sinkronisasi Data', + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const SyncDataPage())); + }, + isImage: true, + ), + ], + ), + const SpaceHeight(20), + Row( + children: [ + MenuButton( + iconPath: Assets.images.managePrinter.path, + label: 'Profile', + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const ProfilePage())); + }, + isImage: true, + ), + const SpaceWidth(15.0), + MenuButton( + iconPath: Assets.images.managePrinter.path, + label: 'Laporan Penjualan', + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const ReportPage())); + }, + isImage: true, + ), + ], + ), + const SpaceHeight(60), + // ListTile( + // leading: const Icon( + // Icons.login_outlined, + // color: AppColors.primary, + // ), + // title: const Text( + // 'Chat', + // style: TextStyle( + // color: AppColors.primary, + // fontWeight: FontWeight.w700, + // ), + // ), + // onTap: () {}, + // ), + // const Divider(), + // BlocConsumer( + // listener: (context, state) { + // state.maybeWhen( + // orElse: () {}, + // loaded: () { + // ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + // content: Text('Logout Success'), + // backgroundColor: AppColors.primary, + // )); + // Navigator.pushReplacement( + // context, + // MaterialPageRoute( + // builder: (context) => const LoginPage())); + // }, + // error: (message) { + // Navigator.pushReplacement( + // context, + // MaterialPageRoute( + // builder: (context) => const LoginPage())); + // }); + // }, + // builder: (context, state) { + // return state.maybeWhen(orElse: () { + // return ListTile( + // leading: const Icon( + // Icons.login_outlined, + // color: AppColors.primary, + // ), + // title: const Text( + // 'Logout', + // style: TextStyle( + // color: AppColors.primary, + // fontWeight: FontWeight.w700, + // ), + // ), + // onTap: () { + // context + // .read() + // .add(const LogoutEvent.logout()); + // }, + // ); + // }, loading: () { + // return const Center(child: CircularProgressIndicator()); + // }); + // }, + // ), + // const Divider(), + ], + )); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/sync_data_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/sync_data_page.dart new file mode 100644 index 0000000..2531142 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/sync_data_page.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/datasources/product_local_datasource.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/bloc/sync_order/sync_order_bloc.dart'; +import '../../../../../core/constants/colors.dart'; + +class SyncDataPage extends StatefulWidget { + const SyncDataPage({super.key}); + + @override + State createState() => _SyncDataPageState(); +} + +class _SyncDataPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Sync Data'), + centerTitle: true, + ), + body: ListView( + padding: const EdgeInsets.all(20.0), + children: [ + BlocConsumer( + listener: (context, state) { + state.maybeMap( + orElse: () {}, + loaded: (_) async { + await ProductLocalDatasource.instance.deleteAllProducts(); + await ProductLocalDatasource.instance + .insertAllProduct(_.products.toList()); + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + backgroundColor: AppColors.primary, + content: Text( + 'Sync data berhasil', + ))); + }, + ); + }, + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return ElevatedButton( + onPressed: () { + context + .read() + .add(const AllProductEvent.getAllProducts()); + }, + child: const Text('Sync Produk')); + }, + loading: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, + ); + }, + ), + const Divider(), + BlocConsumer( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + error: (message) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(message), + backgroundColor: Colors.red, + ), + ); + }, + loaded: () { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Sync order berhasil'), + backgroundColor: AppColors.primary, + ), + ); + }, + ); + }, + builder: (context, state) { + return state.maybeWhen( + orElse: () { + return ElevatedButton( + onPressed: () { + context + .read() + .add(const SyncOrderEvent.syncOrder()); + }, + child: const Text('Sync Order'), + ); + }, + loading: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, + ); + }, + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/update_product_page.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/update_product_page.dart new file mode 100644 index 0000000..487e64a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/update_product_page.dart @@ -0,0 +1,217 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:image_picker/image_picker.dart'; + +import 'package:flutter_pos_ecommerce/core/components/buttons.dart'; +import 'package:flutter_pos_ecommerce/core/components/custom_dropdown%20copy.dart'; +import 'package:flutter_pos_ecommerce/core/components/image_picker_widget.dart'; +import 'package:flutter_pos_ecommerce/core/components/spaces.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/string_ext.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/requests/product_request_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/models/category_model.dart'; + +import '../../../../../core/components/custom_text_field.dart'; +import '../../../../ecommerce/presentation/home/bloc/all_product/all_product_bloc.dart'; +import '../models/isAvailable_model.dart'; + +class UpdateProductPage extends StatefulWidget { + final ProductRequestModel productRequestModel; + const UpdateProductPage({ + super.key, + required this.productRequestModel, + }); + + @override + State createState() => _UpdateProductPageState(); +} + +class _UpdateProductPageState extends State { + TextEditingController? nameController; + TextEditingController? priceController; + TextEditingController? stockController; + TextEditingController? isAvailableController; + TextEditingController? descriptionController; + TextEditingController? categoryController; + + int category = 1; + int isAvailable = 1; + + XFile? imageFile; + + final List categories = [ + CategoryModel(name: 'Benih', value: 1), + CategoryModel(name: 'Pupuk', value: 2), + CategoryModel(name: 'Pestisida', value: 3), + CategoryModel(name: 'Alat Pertanian', value: 4), + ]; + + final List isavailable = [ + IsAvailable(name: 'Ya', value: 1), + IsAvailable(name: 'Tidak', value: 0), + ]; + + @override + void initState() { + final item = widget.productRequestModel; + nameController = TextEditingController(text: item.name); + priceController = TextEditingController(text: item.price.toString()); + stockController = TextEditingController(text: item.stock.toString()); + isAvailableController = + TextEditingController(text: item.is_available.toString()); + descriptionController = TextEditingController(text: item.description); + categoryController = + TextEditingController(text: item.category_id.toString()); + super.initState(); + } + + @override + void dispose() { + super.dispose(); + nameController!.dispose(); + priceController!.dispose(); + stockController!.dispose(); + isAvailableController!.dispose(); + descriptionController!.dispose(); + categoryController!.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Edit Produk'), + centerTitle: true, + ), + body: ListView( + padding: const EdgeInsets.all(24.0), + children: [ + CustomTextField( + controller: nameController!, + label: 'Nama Produk', + ), + const SpaceHeight(20.0), + CustomTextField( + controller: priceController!, + label: 'Harga Produk', + keyboardType: TextInputType.number, + onChanged: (value) { + // final int priceValue = value.toIntegerFromText; + // priceController.text = priceValue.currencyFormatRp; + // priceController.selection = TextSelection.fromPosition( + // TextPosition(offset: priceController.text.length)); + }, + ), + const SpaceHeight(20.0), + ImagePickerWidget( + label: 'Foto Produk', + onChanged: (file) { + if (file == null) { + return; + } + imageFile = file; + }, + ), + const SpaceHeight(20.0), + CustomTextField( + controller: stockController!, + label: 'Stok Produk', + keyboardType: TextInputType.number, + ), + const SpaceHeight(20.0), + CustomDropdown( + value: categories.first, + items: categories, + label: 'Kategori', + onChanged: (value) { + setState(() { + category = value!.value; // Mengubah nilai category menjadi int + }); + }, + ), + const SpaceHeight(20.0), + CustomDropdown( + value: isavailable.first, + items: isavailable, + label: 'Tersedia', + onChanged: (value) { + setState(() { + isAvailable = value!.value; + }); + }, + ), + const SpaceHeight(20.0), + CustomTextField( + controller: descriptionController!, + label: 'Deskripsi Produk', + ), + const SpaceHeight(24.0), + BlocConsumer( + listener: (context, state) { + state.maybeMap( + orElse: () {}, + loaded: (_) { + Navigator.pop(context); + }, + error: (value) => showDialog( + context: context, + builder: (context) => + AlertDialog(content: Text(value.message)), + ), + ); + }, + builder: (context, state) { + return state.maybeWhen(orElse: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, loading: () { + return const Center( + child: CircularProgressIndicator(), + ); + }, loaded: (_) { + return Button.filled( + onPressed: () { + final String name = nameController!.text; + final int price = priceController!.text.toIntegerFromText; + final int stock = stockController!.text.toIntegerFromText; + final Product product = Product( + id: widget.productRequestModel.id, + name: name, + price: price, + stock: stock, + categoryId: category, + description: descriptionController!.text, + isAvailable: isAvailable, + image: imageFile?.path); + + print('nama $name'); + print('price $price'); + print('stock $stock'); + print('category $category'); + print('isAvailable $isAvailable'); + print('description $descriptionController'); + print('image $imageFile'); + context + .read() + .add(AllProductEvent.updateProduct(product, imageFile)); + }, + label: 'Ubah', + ); + }); + }, + ), + const SpaceHeight(30.0), + Button.outlined( + onPressed: () { + Navigator.pop(context); + }, + label: 'Batal', + ), + const SpaceHeight(30.0), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/webview_chat.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/webview_chat.dart new file mode 100644 index 0000000..4862bbc --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/pages/webview_chat.dart @@ -0,0 +1,54 @@ +// import 'package:flutter/material.dart'; +// import 'package:webview_flutter/webview_flutter.dart'; + + + +// class WebviewChat extends StatefulWidget { +// const WebviewChat({super.key}); + +// @override +// State createState() => _WebviewChatState(); +// } + +// class _WebviewChatState extends State { +// WebViewController? _controller; + +// @override +// void initState() { +// super.initState(); +// _controller = WebViewController() +// ..setJavaScriptMode(JavaScriptMode.unrestricted) +// ..setBackgroundColor(const Color(0x00000000)) +// ..setNavigationDelegate( +// NavigationDelegate( +// onProgress: (int progress) { +// // Update loading bar. +// }, +// onPageStarted: (String url) {}, +// onPageFinished: (String url) {}, +// onWebResourceError: (WebResourceError error) {}, +// onNavigationRequest: (NavigationRequest request) { +// if (request.url.startsWith('https://www.youtube.com/')) { +// return NavigationDecision.prevent; +// } +// return NavigationDecision.navigate; +// }, +// ), +// ) +// ..loadRequest(Uri.parse('https://flutter.dev')); +// } + +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// body: SingleChildScrollView( +// child: Container( +// padding: const EdgeInsets.all(10.0), +// child: const Column( +// children: [], +// ), +// ), +// ), +// ); +// } +// } diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/add_data.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/add_data.dart new file mode 100644 index 0000000..67bcf10 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/add_data.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; + + + + +class AddData extends StatelessWidget { + final String title; + final VoidCallback onPressed; + + const AddData({ + super.key, + required this.title, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onPressed, + child: Container( + padding: const EdgeInsets.all(16.0), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: AppColors.card), + borderRadius: BorderRadius.circular(19), + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Icons.add, + color: AppColors.primary, + ), + const SpaceHeight(8.0), + Text( + title, + style: const TextStyle( + color: AppColors.primary, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/custom_tab_bar.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/custom_tab_bar.dart new file mode 100644 index 0000000..754152b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/custom_tab_bar.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; + +import '../../../../../core/constants/colors.dart'; + + + + +class CustomTabBar extends StatefulWidget { + final List tabTitles; + final int initialTabIndex; + final List tabViews; + + const CustomTabBar({ + super.key, + required this.tabTitles, + required this.initialTabIndex, + required this.tabViews, + }); + + @override + State createState() => _CustomTabBarState(); +} + +class _CustomTabBarState extends State { + late int _selectedIndex; + + @override + void initState() { + super.initState(); + _selectedIndex = widget.initialTabIndex; + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: List.generate( + widget.tabTitles.length, + (index) => GestureDetector( + onTap: () { + setState(() { + _selectedIndex = index; + }); + }, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 14), + margin: const EdgeInsets.only(right: 32), + decoration: BoxDecoration( + border: _selectedIndex == index + ? const Border( + bottom: BorderSide( + width: 3.0, + color: AppColors.primary, + ), + ) + : null, + ), + child: Text( + widget.tabTitles[index], + style: const TextStyle( + color: AppColors.primary, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 18.0), + child: widget.tabViews[_selectedIndex], + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/manage_discount_card.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/manage_discount_card.dart new file mode 100644 index 0000000..b7da11b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/manage_discount_card.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/discount_response_model.dart'; +import '../../../../../core/assets/assets.gen.dart'; +import '../../../../../core/constants/colors.dart'; + +class ManageDiscountCard extends StatelessWidget { + final Discount data; + final VoidCallback onEditTap; + final VoidCallback onDeleteTap; // Tambahkan callback untuk onDeleteTap + + const ManageDiscountCard({ + super.key, // Ganti super.key dengan Key? key + required this.data, + required this.onEditTap, + required this.onDeleteTap, // Tambahkan parameter dan assign ke field + }); // Ganti super.key dengan key + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(8.0), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: AppColors.card), + borderRadius: BorderRadius.circular(19), + ), + ), + child: Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Spacer(), + Container( + alignment: Alignment.center, + padding: const EdgeInsets.all(10.0), + margin: const EdgeInsets.only(top: 15.0), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColors.disabled.withOpacity(0.4), + ), + child: Text( + '${data.value!.replaceAll('.00', '')}%', + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w900, + ), + ), + ), + const Spacer(), + Center( + child: RichText( + text: TextSpan( + text: 'Nama Promo : ', + children: [ + TextSpan( + text: data.name, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + ), + ), + ], + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w400, + color: AppColors.black, + ), + ), + ), + ), + const Spacer(), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: + onDeleteTap, // Panggil onDeleteTap saat tombol delete ditekan + child: Container( + padding: const EdgeInsets.all(8.0), + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: + Colors.red, // Ganti warna dengan warna yang diinginkan + ), + child: const Icon(Icons.delete, + color: Colors.white), // Tambahkan ikon delete + ), + ), + const SizedBox( + width: 8), // Berikan jarak antara tombol edit dan delete + GestureDetector( + onTap: onEditTap, + child: Container( + padding: const EdgeInsets.all(8.0), + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: AppColors.primary, + ), + child: Assets.icons.edit.svg(), + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_discount_item.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_discount_item.dart new file mode 100644 index 0000000..c92e6fe --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_discount_item.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class MenuDiscountItem extends StatefulWidget { + const MenuDiscountItem({super.key}); + + @override + State createState() => _MenuDiscountItemState(); +} + +class _MenuDiscountItemState extends State { + @override + Widget build(BuildContext context) { + return const Scaffold(); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_printer_button.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_printer_button.dart new file mode 100644 index 0000000..3435241 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_printer_button.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/constants/colors.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/build_context_ext%20copy.dart'; + +class MenuPrinterButton extends StatelessWidget { + final String label; + final VoidCallback onPressed; + final bool isActive; + + const MenuPrinterButton({ + super.key, + required this.label, + required this.onPressed, + required this.isActive, + }); + + @override + Widget build(BuildContext context) { + return Flexible( + child: InkWell( + onTap: onPressed, + child: Container( + width: context.deviceWidth, + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: isActive ? Colors.white : AppColors.card, + borderRadius: BorderRadius.circular(6), + boxShadow: isActive + ? const [ + BoxShadow( + color: AppColors.white, + blurRadius: 2, + offset: Offset(0, 1), + spreadRadius: 0, + ), + ] + : null, + ), + child: Text( + label, + textAlign: TextAlign.center, + style: TextStyle( + color: isActive ? AppColors.primary : AppColors.black, + ), + ), + ), + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_printer_content.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_printer_content.dart new file mode 100644 index 0000000..b385eb4 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_printer_content.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/constants/colors.dart'; +import 'package:print_bluetooth_thermal/print_bluetooth_thermal.dart'; + +class MenuPrinterContent extends StatelessWidget { + final BluetoothInfo data; + final bool isSelected; + const MenuPrinterContent({ + Key? key, + required this.data, + required this.isSelected, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 10.0), + decoration: BoxDecoration( + border: Border.all( + width: isSelected ? 4.0 : 1.0, + color: isSelected ? AppColors.blueLight : AppColors.card), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Name : ${data.name}', + style: const TextStyle( + fontWeight: FontWeight.w700, + ), + ), + Text( + 'macAddress: ${data.macAdress}', + style: const TextStyle( + fontSize: 12, + ), + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_product_item.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_product_item.dart new file mode 100644 index 0000000..37cd837 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/menu_product_item.dart @@ -0,0 +1,150 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/extensions/build_context_ext%20copy.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/requests/product_request_model.dart'; +import 'package:flutter_pos_ecommerce/module/ecommerce/data/models/responses/product_response_model.dart'; +import 'package:flutter_pos_ecommerce/module/pos/presentation/setting/pages/update_product_page.dart'; +import 'package:image_picker/image_picker.dart'; + +import '../../../../../core/components/buttons.dart'; +import '../../../../../core/components/spaces.dart'; +import '../../../../../core/constants/colors.dart'; +import '../../../../../core/constants/global_variable.dart'; + +class MenuProductItem extends StatelessWidget { + final Product data; + final Function(Product) onDeleteTap; // Tambahkan properti onDeleteTap + const MenuProductItem( + {super.key, required this.data, required this.onDeleteTap}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(8.0), + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder( + side: const BorderSide(width: 3, color: AppColors.blueLight), + borderRadius: BorderRadius.circular(10), + ), + ), + child: Row( + children: [ + ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(10.0)), + child: Image.network( + data.image!.contains('http') + ? data.image! + : '${GlobalVariable.baseUrlImage}${data.image}', + width: 74, + height: 74, + fit: BoxFit.cover, + ), + ), + const SpaceWidth(11.0), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data.name ?? '', + style: const TextStyle( + fontSize: 20, + ), + ), + const SpaceHeight(5.0), + Text( + data.category?.name ?? '', + style: const TextStyle( + fontSize: 12, + color: Colors.grey, + ), + ), + const SpaceHeight(10.0), + Row( + children: [ + Flexible( + child: Button.outlined( + onPressed: () { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text(data.name ?? ''), + content: SizedBox( + width: 200, + height: 120, + child: Column( + children: [ + const Text( + 'Apakah Anda yakin ingin menghapus produk ini?', + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + ElevatedButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text('Tidak'), + ), + ElevatedButton( + onPressed: () { + onDeleteTap( + data); // Panggil onDeleteTap + Navigator.pop(context); + }, + child: const Text('Ya'), + ), + ], + ), + ], + ), + ), + ), + ); + }, + label: 'Hapus Produk', + fontSize: 8.0, + height: 31, + ), + ), + Flexible( + child: Button.outlined( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => UpdateProductPage( + productRequestModel: ProductRequestModel( + category_id: data.category!.id!, + description: data.description!, + id: data.id!, + image: data.image != null + ? XFile(data.image!) + : null, + is_available: data.isAvailable!, + name: data.name!, + price: data.price!, + stock: data.stock!, + ), + ), + ), + ); + }, + label: 'Ubah Produk', + fontSize: 8.0, + height: 31, + ), + ), + ], + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/settings_title.dart b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/settings_title.dart new file mode 100644 index 0000000..e913561 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/module/pos/presentation/setting/widgets/settings_title.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_pos_ecommerce/core/components/search_input_pos.dart'; + +import '../../../../../core/constants/colors.dart'; + + + + +class SettingsTitle extends StatelessWidget { + final String title; + final TextEditingController? controller; + final Function(String value)? onChanged; + + const SettingsTitle( + this.title, { + super.key, + this.controller, + this.onChanged, + }); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: const TextStyle( + color: AppColors.primary, + fontSize: 20, + fontWeight: FontWeight.w600, + ), + ), + if (controller != null) + SizedBox( + width: 300.0, + child: SearchInput( + controller: controller!, + onChanged: onChanged, + hintText: 'Search for food, coffe, etc..', + ), + ), + ], + ); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/lib/web_socket_service.dart b/FrontEnd/flutter_pos_ecommerce/lib/web_socket_service.dart new file mode 100644 index 0000000..1a29c06 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/lib/web_socket_service.dart @@ -0,0 +1,21 @@ +import 'dart:convert'; +import 'package:web_socket_channel/io.dart'; +import 'package:web_socket_channel/web_socket_channel.dart'; + +class WebSocketService { + late WebSocketChannel channel; + + void connect(String channelId) { + channel = IOWebSocketChannel.connect('ws://12.0.0.1:6001'); + channel.sink.add(jsonEncode({'type': 'join', 'channel': channelId})); + } + + void sendMessage(String channelId, String message) { + channel.sink.add(jsonEncode( + {'type': 'message', 'channel': channelId, 'message': message})); + } + + void disconnect() { + channel.sink.close(); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/linux/.gitignore b/FrontEnd/flutter_pos_ecommerce/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/FrontEnd/flutter_pos_ecommerce/linux/CMakeLists.txt b/FrontEnd/flutter_pos_ecommerce/linux/CMakeLists.txt new file mode 100644 index 0000000..f62cfbf --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/linux/CMakeLists.txt @@ -0,0 +1,145 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "flutter_pos_ecommerce") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.flutter_pos_ecommerce") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/FrontEnd/flutter_pos_ecommerce/linux/flutter/CMakeLists.txt b/FrontEnd/flutter_pos_ecommerce/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/FrontEnd/flutter_pos_ecommerce/linux/flutter/generated_plugin_registrant.cc b/FrontEnd/flutter_pos_ecommerce/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..7299b5c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/FrontEnd/flutter_pos_ecommerce/linux/flutter/generated_plugin_registrant.h b/FrontEnd/flutter_pos_ecommerce/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/FrontEnd/flutter_pos_ecommerce/linux/flutter/generated_plugins.cmake b/FrontEnd/flutter_pos_ecommerce/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..786ff5c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/linux/flutter/generated_plugins.cmake @@ -0,0 +1,25 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/FrontEnd/flutter_pos_ecommerce/linux/main.cc b/FrontEnd/flutter_pos_ecommerce/linux/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/FrontEnd/flutter_pos_ecommerce/linux/my_application.cc b/FrontEnd/flutter_pos_ecommerce/linux/my_application.cc new file mode 100644 index 0000000..4f8df02 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/linux/my_application.cc @@ -0,0 +1,104 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "flutter_pos_ecommerce"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "flutter_pos_ecommerce"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/FrontEnd/flutter_pos_ecommerce/linux/my_application.h b/FrontEnd/flutter_pos_ecommerce/linux/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/FrontEnd/flutter_pos_ecommerce/macos/.gitignore b/FrontEnd/flutter_pos_ecommerce/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Flutter/Flutter-Debug.xcconfig b/FrontEnd/flutter_pos_ecommerce/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Flutter/Flutter-Release.xcconfig b/FrontEnd/flutter_pos_ecommerce/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Flutter/GeneratedPluginRegistrant.swift b/FrontEnd/flutter_pos_ecommerce/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..4761d2a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,32 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import cloud_firestore +import file_selector_macos +import firebase_auth +import firebase_core +import firebase_messaging +import flutter_local_notifications +import path_provider_foundation +import shared_preferences_foundation +import sqflite +import url_launcher_macos +import video_player_avfoundation + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) +} diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcodeproj/project.pbxproj b/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..165841e --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,695 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* flutter_pos_ecommerce.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "flutter_pos_ecommerce.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* flutter_pos_ecommerce.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* flutter_pos_ecommerce.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1430; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPosEcommerce.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_pos_ecommerce.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_pos_ecommerce"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPosEcommerce.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_pos_ecommerce.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_pos_ecommerce"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPosEcommerce.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_pos_ecommerce.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_pos_ecommerce"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..bb0e666 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcworkspace/contents.xcworkspacedata b/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/AppDelegate.swift b/FrontEnd/flutter_pos_ecommerce/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..d53ef64 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..a2ec33f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000..82b6f9d Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000..13b35eb Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000..0a3f5fa Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000..bdb5722 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 0000000..f083318 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000..326c0e7 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000..2f1632c Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Base.lproj/MainMenu.xib b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..80e867a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/AppInfo.xcconfig b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..15d9009 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = flutter_pos_ecommerce + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPosEcommerce + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/Debug.xcconfig b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/Release.xcconfig b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/Warnings.xcconfig b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/DebugProfile.entitlements b/FrontEnd/flutter_pos_ecommerce/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Info.plist b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/MainFlutterWindow.swift b/FrontEnd/flutter_pos_ecommerce/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/macos/Runner/Release.entitlements b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/FrontEnd/flutter_pos_ecommerce/macos/RunnerTests/RunnerTests.swift b/FrontEnd/flutter_pos_ecommerce/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..5418c9f --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import FlutterMacOS +import Cocoa +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/FrontEnd/flutter_pos_ecommerce/pubspec.lock b/FrontEnd/flutter_pos_ecommerce/pubspec.lock new file mode 100644 index 0000000..f84ccdf --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/pubspec.lock @@ -0,0 +1,1554 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + url: "https://pub.dev" + source: hosted + version: "67.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: "2350805d7afefb0efe7acd325cb19d3ae8ba4039b906eade3807ffb69938a01f" + url: "https://pub.dev" + source: hosted + version: "1.3.33" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + archive: + dependency: transitive + description: + name: archive + sha256: ecf4273855368121b1caed0d10d4513c7241dfc813f7d3c8933b36622ae9b265 + url: "https://pub.dev" + source: hosted + version: "3.5.1" + args: + dependency: transitive + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + badges: + dependency: "direct main" + description: + name: badges + sha256: a7b6bbd60dce418df0db3058b53f9d083c22cdb5132a052145dc267494df0b84 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + bloc: + dependency: transitive + description: + name: bloc + sha256: f53a110e3b48dcd78136c10daa5d51512443cea5e1348c9d80a320095fa2db9e + url: "https://pub.dev" + source: hosted + version: "8.1.3" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21" + url: "https://pub.dev" + source: hosted + version: "2.4.8" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" + url: "https://pub.dev" + source: hosted + version: "7.3.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: fedde275e0a6b798c3296963c5cd224e3e1b55d0e478d5b7e65e6b540f363a0e + url: "https://pub.dev" + source: hosted + version: "8.9.1" + cached_network_image: + dependency: "direct main" + description: + name: cached_network_image + sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f" + url: "https://pub.dev" + source: hosted + version: "3.3.1" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + carousel_slider: + dependency: "direct main" + description: + name: carousel_slider + sha256: "9c695cc963bf1d04a47bd6021f68befce8970bcd61d24938e1fb0918cf5d9c42" + url: "https://pub.dev" + source: hosted + version: "4.2.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + cloud_firestore: + dependency: "direct main" + description: + name: cloud_firestore + sha256: e461ea9ab23959102a780efcbccfe33c2ac46269928bc57093bbc0b526afc801 + url: "https://pub.dev" + source: hosted + version: "4.17.3" + cloud_firestore_platform_interface: + dependency: transitive + description: + name: cloud_firestore_platform_interface + sha256: "2e0b8db9a759ffc71086019f1bd27237e5e888ab1e99c507067ff8616acdfa24" + url: "https://pub.dev" + source: hosted + version: "6.2.3" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + sha256: "37b6974bef5b0a7ecd31037ffb7d7bfe6bb9d2ac6c064fbea395411ef0a64d55" + url: "https://pub.dev" + source: hosted + version: "3.12.3" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + url: "https://pub.dev" + source: hosted + version: "4.10.0" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + color: + dependency: transitive + description: + name: color + sha256: ddcdf1b3badd7008233f5acffaf20ca9f5dc2cd0172b75f68f24526a5f5725cb + url: "https://pub.dev" + source: hosted + version: "3.0.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + url: "https://pub.dev" + source: hosted + version: "0.3.4+1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + csslib: + dependency: transitive + description: + name: csslib + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.dev" + source: hosted + version: "1.0.6" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" + url: "https://pub.dev" + source: hosted + version: "2.3.6" + dartx: + dependency: transitive + description: + name: dartx + sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + dartz: + dependency: "direct main" + description: + name: dartz + sha256: e6acf34ad2e31b1eb00948692468c30ab48ac8250e0f0df661e29f12dd252168 + url: "https://pub.dev" + source: hosted + version: "0.10.1" + dash_chat: + dependency: "direct main" + description: + name: dash_chat + sha256: b6ba8f8d52245bca2de1e3c8db87d8a6a4a130815925272500dd8ecba5172903 + url: "https://pub.dev" + source: hosted + version: "1.1.16" + dash_chat_2: + dependency: "direct main" + description: + name: dash_chat_2 + sha256: "7ffdeb023fb2c9e194e2147ef8e967d36e4481493178051ceb36d98c62396ddd" + url: "https://pub.dev" + source: hosted + version: "0.0.15" + dbus: + dependency: transitive + description: + name: dbus + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + url: "https://pub.dev" + source: hosted + version: "0.7.10" + dio: + dependency: "direct main" + description: + name: dio + sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5" + url: "https://pub.dev" + source: hosted + version: "5.4.3+1" + equatable: + dependency: "direct main" + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" + esc_pos_utils_plus: + dependency: "direct main" + description: + name: esc_pos_utils_plus + sha256: "518a7172ee39221de350619e04a8ea410d875bc27937fd341dd24ba5ef81360c" + url: "https://pub.dev" + source: hosted + version: "2.0.3" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + url: "https://pub.dev" + source: hosted + version: "0.9.2+1" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 + url: "https://pub.dev" + source: hosted + version: "0.9.3+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 + url: "https://pub.dev" + source: hosted + version: "0.9.3+1" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + sha256: f0a75f61992d036e4c46ad0e9febd364d98aa2c092690a5475cb1421a8243cfe + url: "https://pub.dev" + source: hosted + version: "4.19.5" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + sha256: feb77258404309ffc7761c78e1c0ad2ed5e4fdc378e035619e2cc13be4397b62 + url: "https://pub.dev" + source: hosted + version: "7.2.6" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + sha256: "6d527f357da2bf93a67a42b423aa92943104a0c290d1d72ad9a42c779d501cd2" + url: "https://pub.dev" + source: hosted + version: "5.11.5" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: "372d94ced114b9c40cb85e18c50ac94a7e998c8eec630c50d7aec047847d27bf" + url: "https://pub.dev" + source: hosted + version: "2.31.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: c437ae5d17e6b5cc7981cf6fd458a5db4d12979905f9aafd1fea930428a9fe63 + url: "https://pub.dev" + source: hosted + version: "5.0.0" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: "43d9e951ac52b87ae9cc38ecdcca1e8fa7b52a1dd26a96085ba41ce5108db8e9" + url: "https://pub.dev" + source: hosted + version: "2.17.0" + firebase_messaging: + dependency: "direct main" + description: + name: firebase_messaging + sha256: e0882a7426821f7caccaabfc15a535155cd15b4daa73a5a7b3af701a552d73ab + url: "https://pub.dev" + source: hosted + version: "14.9.2" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + sha256: "52e12cc50e1395ad7ea3552dcbe9958fb1994b5afcf58ee4c0db053932a6fce5" + url: "https://pub.dev" + source: hosted + version: "4.5.35" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + sha256: "8812cc5929380b783f92290d934bf32e2fea06701583f47cdccd5f13f4f24522" + url: "https://pub.dev" + source: hosted + version: "3.8.5" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_bloc: + dependency: "direct main" + description: + name: flutter_bloc + sha256: "87325da1ac757fcc4813e6b34ed5dd61169973871fdf181d6c2109dd6935ece1" + url: "https://pub.dev" + source: hosted + version: "8.1.4" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" + url: "https://pub.dev" + source: hosted + version: "3.3.1" + flutter_gen_core: + dependency: transitive + description: + name: flutter_gen_core + sha256: "3a6c3dbc1c0e260088e9c7ed1ba905436844e8c01a44799f6281edada9e45308" + url: "https://pub.dev" + source: hosted + version: "5.4.0" + flutter_gen_runner: + dependency: "direct dev" + description: + name: flutter_gen_runner + sha256: "24889d5140b03997f7148066a9c5fab8b606dff36093434c782d7a7fb22c6fb6" + url: "https://pub.dev" + source: hosted + version: "5.4.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + sha256: "40e6fbd2da7dcc7ed78432c5cdab1559674b4af035fddbfb2f9a8f9c2112fcef" + url: "https://pub.dev" + source: hosted + version: "17.1.2" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" + url: "https://pub.dev" + source: hosted + version: "4.0.0+1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "340abf67df238f7f0ef58f4a26d2a83e1ab74c77ab03cd2b2d5018ac64db30b7" + url: "https://pub.dev" + source: hosted + version: "7.1.0" + flutter_parsed_text: + dependency: transitive + description: + name: flutter_parsed_text + sha256: "529cf5793b7acdf16ee0f97b158d0d4ba0bf06e7121ef180abe1a5b59e32c1e2" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f" + url: "https://pub.dev" + source: hosted + version: "2.0.19" + flutter_slidable: + dependency: "direct main" + description: + name: flutter_slidable + sha256: "19ed4813003a6ff4e9c6bcce37e792a2a358919d7603b2b31ff200229191e44c" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" + url: "https://pub.dev" + source: hosted + version: "2.0.10+1" + flutter_tawk: + dependency: "direct main" + description: + name: flutter_tawk + sha256: "9a01356f9b754ceda9679ee0348779e465dff3ab02a55a7565fb8326ac365155" + url: "https://pub.dev" + source: hosted + version: "0.1.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + freezed: + dependency: "direct dev" + description: + name: freezed + sha256: "57247f692f35f068cae297549a46a9a097100685c6780fe67177503eea5ed4e5" + url: "https://pub.dev" + source: hosted + version: "2.4.7" + freezed_annotation: + dependency: "direct main" + description: + name: freezed_annotation + sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d + url: "https://pub.dev" + source: hosted + version: "2.4.1" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: "170c46e237d6eb0e6e9f0e8b3f56101e14fb64f787016e42edd74c39cf8b176a" + url: "https://pub.dev" + source: hosted + version: "13.2.0" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: f0b8d115a13ecf827013ec9fc883390ccc0e87a96ed5347a3114cac177ef18e8 + url: "https://pub.dev" + source: hosted + version: "6.1.0" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + hive: + dependency: transitive + description: + name: hive + sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" + url: "https://pub.dev" + source: hosted + version: "2.2.3" + html: + dependency: transitive + description: + name: html + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" + source: hosted + version: "0.15.4" + http: + dependency: "direct main" + description: + name: http + sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + hydrated_bloc: + dependency: "direct main" + description: + name: hydrated_bloc + sha256: af35b357739fe41728df10bec03aad422cdc725a1e702e03af9d2a41ea05160c + url: "https://pub.dev" + source: hosted + version: "9.1.5" + image: + dependency: transitive + description: + name: image + sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" + url: "https://pub.dev" + source: hosted + version: "4.1.7" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "33974eca2e87e8b4e3727f1b94fa3abcb25afe80b6bc2c4d449a0e150aedf720" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "40e24f467b75cd6f4a92ee93dd13d1a7bcb4523a84fd95f00c755f01f42398c8" + url: "https://pub.dev" + source: hosted + version: "0.8.11" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: e2423c53a68b579a7c37a1eda967b8ae536c3d98518e5db95ca1fe5719a730a3 + url: "https://pub.dev" + source: hosted + version: "3.0.2" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: f74064bc548b5164a033ec05638e23c91be1a249c255e0f56319dddffd759794 + url: "https://pub.dev" + source: hosted + version: "0.8.10+1" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80" + url: "https://pub.dev" + source: hosted + version: "2.10.0" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + intl: + dependency: "direct main" + description: + name: intl + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" + source: hosted + version: "0.17.0" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + url: "https://pub.dev" + source: hosted + version: "0.7.1" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + json_serializable: + dependency: "direct main" + description: + name: json_serializable + sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b + url: "https://pub.dev" + source: hosted + version: "6.8.0" + laravel_echo: + dependency: "direct main" + description: + name: laravel_echo + sha256: aec1c8a989f8718ffbb9864e746eed2181638e156d4e22724230a5be9cdf43ab + url: "https://pub.dev" + source: hosted + version: "1.0.0-beta.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + logger: + dependency: "direct main" + description: + name: logger + sha256: af05cc8714f356fd1f3888fb6741cbe9fbe25cdb6eedbab80e1a6db21047d4a4 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + url: "https://pub.dev" + source: hosted + version: "0.8.0" + meta: + dependency: transitive + description: + name: meta + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + url: "https://pub.dev" + source: hosted + version: "1.11.0" + mime: + dependency: transitive + description: + name: mime + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + octo_image: + dependency: transitive + description: + name: octo_image + sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" + source: hosted + version: "1.0.1" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + url: "https://pub.dev" + source: hosted + version: "2.1.3" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pretty_dio_logger: + dependency: "direct main" + description: + name: pretty_dio_logger + sha256: "00b80053063935cf9a6190da344c5373b9d0e92da4c944c878ff2fbef0ef6dc2" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + print_bluetooth_thermal: + dependency: "direct main" + description: + name: print_bluetooth_thermal + sha256: bdca68db1a7959d46a421eeb60d0d8698a7aff1dd5983e7dd8b18574fe792c11 + url: "https://pub.dev" + source: hosted + version: "1.1.0" + provider: + dependency: transitive + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" + source: hosted + version: "0.27.7" + search_page: + dependency: "direct main" + description: + name: search_page + sha256: "675239c1ac17f999c37aea7f4c969dc2fc21b58eb61d78180ff0c16112aab49b" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + url: "https://pub.dev" + source: hosted + version: "2.3.5" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" + url: "https://pub.dev" + source: hosted + version: "1.3.4" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sqflite: + dependency: "direct main" + description: + name: sqflite + sha256: "5ce2e1a15e822c3b4bfb5400455775e421da7098eed8adc8f26298ada7c9308c" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + time: + dependency: transitive + description: + name: time + sha256: ad8e018a6c9db36cb917a031853a1aae49467a93e0d464683e029537d848c221 + url: "https://pub.dev" + source: hosted + version: "2.1.4" + timezone: + dependency: transitive + description: + name: timezone + sha256: a6ccda4a69a442098b602c44e61a1e2b4bf6f5516e875bbf0f427d5df14745d5 + url: "https://pub.dev" + source: hosted + version: "0.9.3" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + transparent_image: + dependency: transitive + description: + name: transparent_image + sha256: e8991d955a2094e197ca24c645efec2faf4285772a4746126ca12875e54ca02f + url: "https://pub.dev" + source: hosted + version: "2.0.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + url_launcher: + dependency: transitive + description: + name: url_launcher + sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" + url: "https://pub.dev" + source: hosted + version: "6.2.6" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775" + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" + url: "https://pub.dev" + source: hosted + version: "6.3.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + uuid: + dependency: transitive + description: + name: uuid + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + url: "https://pub.dev" + source: hosted + version: "3.0.7" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + video_player: + dependency: transitive + description: + name: video_player + sha256: db6a72d8f4fd155d0189845678f55ad2fd54b02c10dcafd11c068dbb631286c0 + url: "https://pub.dev" + source: hosted + version: "2.8.6" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "134e1ad410d67e18a19486ed9512c72dfc6d8ffb284d0e8f2e99e903d1ba8fa3" + url: "https://pub.dev" + source: hosted + version: "2.4.14" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: d1e9a824f2b324000dc8fb2dcb2a3285b6c1c7c487521c63306cc5b394f68a7c + url: "https://pub.dev" + source: hosted + version: "2.6.1" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: "236454725fafcacf98f0f39af0d7c7ab2ce84762e3b63f2cbb3ef9a7e0550bc6" + url: "https://pub.dev" + source: hosted + version: "6.2.2" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: "41245cef5ef29c4585dbabcbcbe9b209e34376642c7576cabf11b4ad9289d6e4" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + url: "https://pub.dev" + source: hosted + version: "13.0.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + web_socket_channel: + dependency: "direct main" + description: + name: web_socket_channel + sha256: "1d8e795e2a8b3730c41b8a98a2dff2e0fb57ae6f0764a1c46ec5915387d257b2" + url: "https://pub.dev" + source: hosted + version: "2.4.4" + webview_flutter: + dependency: "direct main" + description: + name: webview_flutter + sha256: "392c1d83b70fe2495de3ea2c84531268d5b8de2de3f01086a53334d8b6030a88" + url: "https://pub.dev" + source: hosted + version: "3.0.4" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + sha256: "8b3b2450e98876c70bfcead876d9390573b34b9418c19e28168b74f6cb252dbd" + url: "https://pub.dev" + source: hosted + version: "2.10.4" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + sha256: "812165e4e34ca677bdfbfa58c01e33b27fd03ab5fa75b70832d4b7d4ca1fa8cf" + url: "https://pub.dev" + source: hosted + version: "1.9.5" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + sha256: a5364369c758892aa487cbf59ea41d9edd10f9d9baf06a94e80f1bd1b4c7bbc0 + url: "https://pub.dev" + source: hosted + version: "2.9.5" + win32: + dependency: transitive + description: + name: win32 + sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + url: "https://pub.dev" + source: hosted + version: "5.2.0" + win_ble: + dependency: transitive + description: + name: win_ble + sha256: "2a867e13c4b355b101fc2c6e2ac85eeebf965db34eca46856f8b478e93b41e96" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.19.0" diff --git a/FrontEnd/flutter_pos_ecommerce/pubspec.yaml b/FrontEnd/flutter_pos_ecommerce/pubspec.yaml new file mode 100644 index 0000000..a2adcfb --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/pubspec.yaml @@ -0,0 +1,122 @@ +name: flutter_pos_ecommerce +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning 3at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ">=3.2.3 <4.0.0" + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + badges: ^3.1.2 + cached_network_image: ^3.3.1 + carousel_slider: ^4.2.1 + cloud_firestore: ^4.17.3 + cupertino_icons: ^1.0.2 + dartz: ^0.10.1 + dash_chat: ^1.1.16 + dash_chat_2: ^0.0.15 + dio: ^5.4.3+1 + equatable: ^2.0.5 + esc_pos_utils_plus: ^2.0.3 + firebase_auth: ^4.19.5 + firebase_core: ^2.31.0 + firebase_messaging: ^14.9.2 + flutter: + sdk: flutter + flutter_bloc: ^8.1.4 + flutter_local_notifications: ^17.1.2 + flutter_slidable: ^3.0.1 + flutter_svg: ^2.0.10+1 + flutter_tawk: ^0.1.0 + freezed_annotation: ^2.4.1 + go_router: ^13.2.0 + google_fonts: ^6.1.0 + http: ^1.2.1 + hydrated_bloc: ^9.1.5 + image_picker: ^1.1.1 + intl: ^0.17.0 + json_serializable: ^6.8.0 + laravel_echo: ^1.0.0-beta.1 + logger: ^2.3.0 + path_provider: ^2.1.3 + pretty_dio_logger: ^1.3.1 + print_bluetooth_thermal: ^1.1.0 + search_page: ^2.3.0 + shared_preferences: ^2.2.2 + sqflite: ^2.3.3 + web_socket_channel: ^2.4.4 + webview_flutter: ^3.0.2 + +dev_dependencies: + build_runner: ^2.4.8 + flutter_gen_runner: ^5.4.0 + flutter_lints: ^3.0.1 + flutter_test: + sdk: flutter + freezed: ^2.4.7 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec +flutter_gen: + output: lib/core/assets/ + integrations: + flutter_svg: true +# The following section is specific to Flutter packages. +flutter: + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + assets: + - assets/images/ + - assets/images/banks/ + - assets/images/categories/ + - assets/images/products/ + - assets/icons/ + - assets/images/img_friend4.png + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/FrontEnd/flutter_pos_ecommerce/test/widget_test.dart b/FrontEnd/flutter_pos_ecommerce/test/widget_test.dart new file mode 100644 index 0000000..38f2d52 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:flutter_pos_ecommerce/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/FrontEnd/flutter_pos_ecommerce/web/favicon.png b/FrontEnd/flutter_pos_ecommerce/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/web/favicon.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-192.png b/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-192.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-512.png b/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-512.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-maskable-192.png b/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..eb9b4d7 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-maskable-192.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-maskable-512.png b/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d69c566 Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/web/icons/Icon-maskable-512.png differ diff --git a/FrontEnd/flutter_pos_ecommerce/web/index.html b/FrontEnd/flutter_pos_ecommerce/web/index.html new file mode 100644 index 0000000..4bb507c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/web/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + flutter_pos_ecommerce + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/web/manifest.json b/FrontEnd/flutter_pos_ecommerce/web/manifest.json new file mode 100644 index 0000000..3c10b62 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "flutter_pos_ecommerce", + "short_name": "flutter_pos_ecommerce", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/FrontEnd/flutter_pos_ecommerce/windows/.gitignore b/FrontEnd/flutter_pos_ecommerce/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/FrontEnd/flutter_pos_ecommerce/windows/CMakeLists.txt b/FrontEnd/flutter_pos_ecommerce/windows/CMakeLists.txt new file mode 100644 index 0000000..80a512a --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(flutter_pos_ecommerce LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "flutter_pos_ecommerce") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/FrontEnd/flutter_pos_ecommerce/windows/flutter/CMakeLists.txt b/FrontEnd/flutter_pos_ecommerce/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/FrontEnd/flutter_pos_ecommerce/windows/flutter/generated_plugin_registrant.cc b/FrontEnd/flutter_pos_ecommerce/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..d4add03 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,26 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + CloudFirestorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("CloudFirestorePluginCApi")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); + FirebaseAuthPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi")); + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/FrontEnd/flutter_pos_ecommerce/windows/flutter/generated_plugin_registrant.h b/FrontEnd/flutter_pos_ecommerce/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/FrontEnd/flutter_pos_ecommerce/windows/flutter/generated_plugins.cmake b/FrontEnd/flutter_pos_ecommerce/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..9f6d484 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/flutter/generated_plugins.cmake @@ -0,0 +1,28 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + cloud_firestore + file_selector_windows + firebase_auth + firebase_core + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/CMakeLists.txt b/FrontEnd/flutter_pos_ecommerce/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..394917c --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/Runner.rc b/FrontEnd/flutter_pos_ecommerce/windows/runner/Runner.rc new file mode 100644 index 0000000..eb03d52 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "flutter_pos_ecommerce" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "flutter_pos_ecommerce" "\0" + VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "flutter_pos_ecommerce.exe" "\0" + VALUE "ProductName", "flutter_pos_ecommerce" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/flutter_window.cpp b/FrontEnd/flutter_pos_ecommerce/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..955ee30 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/flutter_window.h b/FrontEnd/flutter_pos_ecommerce/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/main.cpp b/FrontEnd/flutter_pos_ecommerce/windows/runner/main.cpp new file mode 100644 index 0000000..0ba8e38 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"flutter_pos_ecommerce", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/resource.h b/FrontEnd/flutter_pos_ecommerce/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/resources/app_icon.ico b/FrontEnd/flutter_pos_ecommerce/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000..c04e20c Binary files /dev/null and b/FrontEnd/flutter_pos_ecommerce/windows/runner/resources/app_icon.ico differ diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/runner.exe.manifest b/FrontEnd/flutter_pos_ecommerce/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..a42ea76 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/utils.cpp b/FrontEnd/flutter_pos_ecommerce/windows/runner/utils.cpp new file mode 100644 index 0000000..b2b0873 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length <= 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/utils.h b/FrontEnd/flutter_pos_ecommerce/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/win32_window.cpp b/FrontEnd/flutter_pos_ecommerce/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/FrontEnd/flutter_pos_ecommerce/windows/runner/win32_window.h b/FrontEnd/flutter_pos_ecommerce/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/FrontEnd/flutter_pos_ecommerce/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_