Files
tripz_admin/lib/controller/functions/crud.dart
2026-01-21 17:31:10 +03:00

2099 lines
45 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:jwt_decoder/jwt_decoder.dart';
import 'package:secure_string_operations/secure_string_operations.dart';
import '../../constant/api_key.dart';
import '../../constant/box_name.dart';
import '../../constant/char_map.dart';
import '../../constant/info.dart';
import '../../constant/links.dart';
import '../../env/env.dart';
import '../../main.dart';
import '../../print.dart';
import '../../views/widgets/elevated_btn.dart';
import 'device_info.dart';
import 'encrypt_decrypt.dart';
class CRUD {
var dev = '';
getJWT() async {
dev = Platform.isAndroid ? 'android' : 'ios';
var payload = {
'id': 'admin',
'password': AK.passnpassenger,
'aud': '${AK.allowed}$dev',
};
var response1 = await http.post(
Uri.parse(AppLink.loginJwtDriver),
body: payload,
);
if (response1.statusCode == 200) {
final decodedResponse1 = jsonDecode(response1.body);
final jwt = decodedResponse1['jwt'];
await box.write(BoxName.jwt, X.c(X.c(X.c(jwt, cn), cC), cs));
// await AppInitializer().getKey();
}
}
getJwtWallet() async {
String fingerPrint = await DeviceHelper.getDeviceFingerprint();
print('fingerPrint: ${fingerPrint}');
dev = Platform.isAndroid ? 'android' : 'ios';
var payload = {
'id': '1',
'password': AK.passnpassenger,
'aud': '${Env.allowedWallet}$dev',
'fingerPrint': fingerPrint
};
// Log.print('payload: ${payload}');
var response1 = await http.post(
Uri.parse(AppLink.loginWalletAdmin),
body: payload,
);
// Log.print('response.request: ${response1.request}');
// Log.print('response.body: ${response1.body}');
// print(payload);
// Log.print(
// 'jsonDecode(response1.body)["jwt"]: ${jsonDecode(response1.body)['jwt']}');
await box.write(BoxName.hmac, jsonDecode(response1.body)['hmac']);
return jsonDecode(response1.body)['jwt'].toString();
}
Future<dynamic> postWallet(
{required String link, Map<String, dynamic>? payload}) async {
var s = await getJwtWallet();
Log.print('jwt: ${s}');
final hmac = box.read(BoxName.hmac);
Log.print('hmac: ${hmac}');
var url = Uri.parse(link);
Log.print('url: ${url}');
try {
// await LoginDriverController().getJWT();
var response = await http.post(
url,
body: payload,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization': 'Bearer $s',
'X-HMAC-Auth': hmac.toString(),
},
);
Log.print('response.request:${response.request}');
Log.print('response.body: ${response.body}');
Log.print('payload:$payload');
if (response.statusCode == 200) {
try {
var jsonData = jsonDecode(response.body);
if (jsonData['status'] == 'success') {
return jsonData;
} else {
return jsonData['status'];
}
} catch (e) {
// addError(e.toString(), 'crud().post - JSON decoding');
return 'failure';
}
} else if (response.statusCode == 401) {
// Specifically handle 401 Unauthorized
var jsonData = jsonDecode(response.body);
if (jsonData['error'] == 'Token expired') {
return 'token_expired'; // Return a specific value for token expiration
} else {
// Other 401 errors
// addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401');
return 'failure';
}
} else {
// addError('Non-200 response code: ${response.statusCode}',
// 'crud().post - Other');
return 'failure';
}
} catch (e) {
// addError('HTTP request error: $e', 'crud().post - HTTP');
return 'failure';
}
}
Future<dynamic> get({
required String link,
Map<String, dynamic>? payload,
}) async {
if (box.read(BoxName.jwt) == null) {
await getJWT();
}
bool isTokenExpired = JwtDecoder.isExpired(X
.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs)
.toString()
.split(AppInformation.addd)[0]);
if (isTokenExpired) {
await getJWT();
}
// await Get.put(LoginDriverController()).getJWT();
var url = Uri.parse(
link,
);
var response = await http.post(
url,
body: payload,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization':
'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}'
},
);
if (response.statusCode == 200) {
Log.print('response: ${response.body}');
var jsonData = jsonDecode(response.body);
if (jsonData['status'] == 'success') {
return response.body;
}
return jsonData['status'];
} else if (response.statusCode == 401) {
// Specifically handle 401 Unauthorized
var jsonData = jsonDecode(response.body);
if (jsonData['error'] == 'Token expired') {
// Show snackbar prompting to re-login
// await Get.put(LoginDriverController()).getJWT();
// mySnackbarSuccess('please order now'.tr);
return 'token_expired'; // Return a specific value for token expiration
} else {
// Other 401 errors
// addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401');
return 'failure';
}
} else {
// addError('Non-200 response code: ${response.statusCode}',
// 'crud().post - Other');
return 'failure';
}
}
// Future<dynamic> getWallet({
// required String link,
// Map<String, dynamic>? payload,
// }) async {
// var s = await getJwtWallet();
// var url = Uri.parse(
// link,
// );
// var response = await http.post(
// url,
// body: payload,
// headers: {
// "Content-Type": "application/x-www-form-urlencoded",
// 'Authorization': 'Bearer $s'
// },
// );
// if (response.statusCode == 200) {
// var jsonData = jsonDecode(response.body);
// if (jsonData['status'] == 'success') {
// return response.body;
// }
// return jsonData['status'];
// } else if (response.statusCode == 401) {
// // Specifically handle 401 Unauthorized
// var jsonData = jsonDecode(response.body);
// if (jsonData['error'] == 'Token expired') {
// // Show snackbar prompting to re-login
// // await Get.put(LoginDriverController()).getJwtWallet();
// return 'token_expired'; // Return a specific value for token expiration
// } else {
// // Other 401 errors
// addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401');
// return 'failure';
// }
// } else {
// addError('Non-200 response code: ${response.statusCode}',
// 'crud().post - Other');
// return 'failure';
// }
// }
Future<dynamic> post(
{required String link, Map<String, dynamic>? payload}) async {
var url = Uri.parse(link);
try {
bool isTokenExpired = JwtDecoder.isExpired(X
.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs)
.toString()
.split(AppInformation.addd)[0]);
if (isTokenExpired) {
await getJWT();
}
var response = await http.post(
url,
body: payload,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization':
'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}'
// 'Authorization': 'Bearer ${box.read(BoxName.jwt)}'
},
);
if (response.statusCode == 200) {
try {
var jsonData = jsonDecode(response.body);
if (jsonData['status'] == 'success') {
return jsonData;
} else {
return jsonData['status'];
}
} catch (e) {
// addError(e.toString(), 'crud().post - JSON decoding');
return 'failure';
}
} else if (response.statusCode == 401) {
// Specifically handle 401 Unauthorized
var jsonData = jsonDecode(response.body);
if (jsonData['error'] == 'Token expired') {
// Show snackbar prompting to re-login
await getJWT();
// MyDialog().getDialog(
// 'Session expired. Please log in again.'.tr,
// '',
// () {
// Get.put(LoginController()).loginUsingCredentials(
// box.read(BoxName.passengerID), box.read(BoxName.email));
// Get.back();
// },
// );
return 'token_expired'; // Return a specific value for token expiration
} else {
// Other 401 errors
// addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401');
return 'failure';
}
} else {
// addError('Non-200 response code: ${response.statusCode}',
// 'crud().post - Other');
return 'failure';
}
} catch (e) {
// addError('HTTP request error: $e', 'crud().post - HTTP');
return 'failure';
}
}
// }
Future sendWhatsAppAuth(String to) async {
var headers = {
'Authorization': 'Bearer ${Env.whatsapp}',
'Content-Type': 'application/json'
};
var request = http.Request(
'POST',
Uri.parse(
'https://graph.facebook.com/v20.0/${Env.whatappID}/messages'));
var bodyMap = {
"messaging_product": "whatsapp",
"to": to,
"type": "template",
"template": {
"name": "passengers_sefer_1",
"language": {"code": "ar"}
}
};
request.body = json.encode(bodyMap);
request.headers.addAll(headers);
http.StreamedResponse response = await request.send();
if (response.statusCode == 200) {
} else {}
}
Future<dynamic> getAgoraToken({
required String channelName,
required String uid,
}) async {
var uid = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver);
var res = await http.get(
Uri.parse(
'https://repulsive-pig-rugby-shirt.cyclic.app/token?channelName=$channelName'),
headers: {'Authorization': 'Bearer ${AK.agoraAppCertificate}'});
if (res.statusCode == 200) {
var response = jsonDecode(res.body);
return response['token'];
} else {}
}
Future<dynamic> getLlama({
required String link,
required String payload,
required String prompt,
}) async {
var url = Uri.parse(
link,
);
var headers = {
'Content-Type': 'application/json',
'Authorization':
'Bearer LL-X5lJ0Px9CzKK0HTuVZ3u2u4v3tGWkImLTG7okGRk4t25zrsLqJ0qNoUzZ2x4ciPy'
// 'Authorization': 'Bearer ${Env.llamaKey}'
};
var data = json.encode({
"model": "Llama-3-70b-Inst-FW",
// "model": "llama-13b-chat",
"messages": [
{
"role": "user",
"content":
"Extract the desired information from the following passage as json decoded like $prompt just in this:\n\n$payload"
}
],
"temperature": 0.9
});
var response = await http.post(
url,
body: data,
headers: headers,
);
if (response.statusCode == 200) {
return response.body;
}
return response.statusCode;
}
Future allMethodForAI(String prompt, driverID, imagePath) async {
// await ImageController().choosImage(linkPHP, imagePath);
Future.delayed(const Duration(seconds: 2));
var extractedString = await arabicTextExtractByVisionAndAI(
imagePath: imagePath, driverID: driverID);
var json = jsonDecode(extractedString);
var textValues = getAllTextValuesWithLineNumbers(json);
// List<String> textValues = getAllTextValues(json);
// await AI().geminiAiExtraction(prompt, textValues);
}
Map<String, List<Map<String, String>>> getAllTextValuesWithLineNumbers(
Map json) {
Map<String, List<Map<String, String>>> output = {};
int lineNumber = 1;
if (json.containsKey('regions')) {
List<dynamic> regions = json['regions'];
for (Map<String, dynamic> region in regions) {
if (region.containsKey('lines')) {
List<dynamic> lines = region['lines'];
List<Map<String, String>> linesWithText = [];
for (Map<String, dynamic> line in lines) {
if (line.containsKey('words')) {
List<dynamic> words = line['words'];
String lineText = "";
for (Map<String, dynamic> word in words) {
if (word.containsKey('text')) {
lineText += word['text'] + " ";
}
}
lineText = lineText.trim();
linesWithText.add(
{"line_number": lineNumber.toString(), "text": lineText});
lineNumber++;
}
}
output["region_${region.hashCode}"] = linesWithText;
}
}
}
return output;
}
// List<String> getAllTextValues(Map json) {
// List<String> textValues = [];
// if (json.containsKey('regions')) {
// List<dynamic> regions = json['regions'];
// for (Map<String, dynamic> region in regions) {
// if (region.containsKey('lines')) {
// List<dynamic> lines = region['lines'];
// for (Map<String, dynamic> line in lines) {
// if (line.containsKey('words')) {
// List<dynamic> words = line['words'];
// for (Map<String, dynamic> word in words) {
// if (word.containsKey('text')) {
// textValues.add(word['text']);
// }
// }
// }
// }
// }
// }
// }
// return textValues;
// }
Future<dynamic> arabicTextExtractByVisionAndAI({
required String imagePath,
required String driverID,
}) async {
var headers = {
'Content-Type': 'application/json',
'Ocp-Apim-Subscription-Key': AK.ocpApimSubscriptionKey
};
String imagePathFull =
'${AppLink.server}/card_image/$imagePath-$driverID.jpg';
var request = http.Request(
'POST',
Uri.parse(
'https://eastus.api.cognitive.microsoft.com/computervision/imageanalysis:analyze?features=caption,read&model-version=latest&language=en&api-version=2024-02-01'));
request.body = json.encode({"url": imagePathFull});
request.headers.addAll(headers);
http.StreamedResponse response = await request.send();
if (response.statusCode == 200) {
return await response.stream.bytesToString();
} else {}
}
Future<dynamic> getChatGPT({
required String link,
required String payload,
}) async {
var url = Uri.parse(
link,
);
var headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ${Env.chatGPTkeySeferNew}'
};
var data = json.encode({
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content":
"Extract the desired information from the following passage as json decoded like vin,make,made,year,expiration_date,color,owner,registration_date just in this:\n\n$payload"
}
],
"temperature": 0.9
});
var response = await http.post(
url,
body: data,
headers: headers,
);
if (response.statusCode == 200) {
return response.body;
}
return response.statusCode;
}
Future<dynamic> postStripe({
required String link,
Map<String, dynamic>? payload,
}) async {
// String? secretKey = await storage.read(key: BoxName.secretKey);
var url = Uri.parse(
link,
);
var response = await http.post(
url,
body: payload,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization': 'Bearer ${AK.secretKey}',
},
);
if (response.statusCode == 200) {
return response.body;
} else {}
}
Future<dynamic> kazumiSMS({
required String link,
Map<String, dynamic>? payload,
}) async {
var url = Uri.parse(
link,
);
var headers = {'Content-Type': 'application/json'};
var request = http.Request('POST', url);
request.body = json.encode({
"username": "Sefer",
"password": AK.smsPasswordEgypt,
});
request.headers.addAll(headers);
http.StreamedResponse response = await request.send();
if (response.statusCode == 200) {
var responseBody = await response.stream.bytesToString();
var data = json.decode(responseBody);
return data;
} else {}
}
Future<dynamic> sendSmsEgypt(String phone, otp) async {
// String sender = await getSender();
var headers = {'Content-Type': 'application/json'};
var body = jsonEncode({
"username": "Sefer",
"password": "E)Pu=an/@Z",
"message": otp,
"language": "e",
"sender": "Sefer Egy",
"receiver": phone
});
var res = await http.post(
Uri.parse(AppLink.sendSms),
body: body,
headers: headers,
);
}
Future<dynamic> postPayMob({
required String link,
Map<String, dynamic>? payload,
}) async {
// String? basicAuthCredentials =
// await storage.read(key: BoxName.basicAuthCredentials);
var url = Uri.parse(
link,
);
var response = await http.post(url,
body: payload, headers: {'Content-Type': 'application/json'});
var jsonData = jsonDecode(response.body);
if (response.statusCode == 200) {
if (jsonData['status'] == 'success') {
return response.body;
} else {
return (jsonData['status']);
}
} else {
return response.statusCode;
}
}
sendEmail(
String link,
Map<String, String>? payload,
) async {
var headers = {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization':
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
};
var request = http.Request('POST', Uri.parse(link));
request.bodyFields = payload!;
request.headers.addAll(headers);
http.StreamedResponse response = await request.send();
if (response.statusCode == 200) {
} else {}
}
Future<dynamic> postFromDialogue({
required String link,
Map<String, dynamic>? payload,
}) async {
// String? basicAuthCredentials =
// await storage.read(key: BoxName.basicAuthCredentials);
var url = Uri.parse(
link,
);
var response = await http.post(
url,
body: payload,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization':
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
},
);
if (response.body.isNotEmpty) {
var jsonData = jsonDecode(response.body);
if (response.statusCode == 200) {
if (jsonData['status'] == 'success') {
Get.back();
// Get.snackbar(
// jsonData['status'],
// jsonData['message'],
// );
return response.body;
}
}
return (jsonData['status']);
}
}
Future<void> sendVerificationRequest(String phoneNumber) async {
final accountSid = AK.accountSIDTwillo;
final authToken = AK.authTokenTwillo;
final verifySid = AK.twilloRecoveryCode;
final Uri verificationUri = Uri.parse(
'https://verify.twilio.com/v2/Services/$verifySid/Verifications');
// Send the verification request
final response = await http.post(
verificationUri,
headers: {
'Authorization':
'Basic ${base64Encode(utf8.encode('$accountSid:$authToken'))}',
'Content-Type': 'application/x-www-form-urlencoded',
},
body: {
'To': phoneNumber,
'Channel': 'sms',
},
);
if (response.statusCode == 201) {
} else {}
// Prompt the user to enter the OTP
const otpCode = "123456"; // Replace with user input
// Check the verification code
final checkUri = Uri.parse(
'https://verify.twilio.com/v2/Services/$verifySid/VerificationCheck');
final checkResponse = await http.post(
checkUri,
headers: {
'Authorization':
'Basic ${base64Encode(utf8.encode('$accountSid:$authToken'))}',
'Content-Type': 'application/x-www-form-urlencoded',
},
body: {
'To': phoneNumber,
'Code': otpCode,
},
);
if (checkResponse.statusCode == 201) {
} else {}
}
Future<dynamic> getGoogleApi({
required String link,
Map<String, dynamic>? payload,
}) async {
var url = Uri.parse(
link,
);
var response = await http.post(
url,
body: payload,
);
var jsonData = jsonDecode(response.body);
if (jsonData['status'] == 'OK') {
return jsonData;
}
return (jsonData['status']);
}
Future<dynamic> update({
required String endpoint,
required Map<String, dynamic> data,
required String id,
}) async {
// String? basicAuthCredentials =
// await storage.read(key: BoxName.basicAuthCredentials);
var url = Uri.parse('$endpoint/$id');
var response = await http.put(
url,
body: json.encode(data),
headers: {
'Authorization':
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
},
);
return json.decode(response.body);
}
Future<dynamic> delete({
required String endpoint,
required String id,
}) async {
// String? basicAuthCredentials =
// await storage.read(key: BoxName.basicAuthCredentials);
var url = Uri.parse('$endpoint/$id');
var response = await http.delete(
url,
headers: {
'Authorization':
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
},
);
return json.decode(response.body);
}
List phoneDriversTest = [
201023248456,
201023248456,
];
List phoneDrivers = [
201000038159,
201000038736,
201000064464,
201000091230,
201000136570,
201000151861,
201000198736,
201000228580,
201000237951,
201000255720,
201000287614,
201000292939,
201000304215,
201000332271,
201000392607,
201000405678,
201000426363,
201000435451,
201000480175,
201000669808,
201000692012,
201000892261,
201000927483,
201001022044,
201001088358,
201001195138,
201001216083,
201001227223,
201001231343,
201001281229,
201001324045,
201001372270,
201001448413,
201001456101,
201001460169,
201001484302,
201001486990,
201001609106,
201001614305,
201001616098,
201001695782,
201001741428,
201001868999,
201001880988,
201001917872,
201001974843,
201002026121,
201002034349,
201002050890,
201002205527,
201002211383,
201002220298,
201002380874,
201002507461,
201002524889,
201002559121,
201002593666,
201002726223,
201002757121,
201002772429,
201002831939,
201002918886,
201003008890,
201003093029,
201003111434,
201003247072,
201003284035,
201003312497,
201003322933,
201003335753,
201003395388,
201003454075,
201003457552,
201003464748,
201003516746,
201003519354,
201003562562,
201003624502,
201003660350,
201003698426,
201003732688,
201003758852,
201003769330,
201003970205,
201003973327,
201004008170,
201004034125,
201004361687,
201004362477,
201004378446,
201004508215,
201004519539,
201004558484,
201004625077,
201004658742,
201004663695,
201004712116,
201004754688,
201004770495,
201004771729,
201004800479,
201004848413,
201004965744,
201005004603,
201005094804,
201005126645,
201005145830,
201005170670,
201005215092,
201005259664,
201005285496,
201005308188,
201005315146,
201005457333,
201005457388,
201005464946,
201005467997,
201005496502,
201005591720,
201005655832,
201005748724,
201005778338,
201005802822,
201005804981,
201005840296,
201005857716,
201005894006,
201006098594,
201006119945,
201006261655,
201006336012,
201006373310,
201006399505,
201006529560,
201006550621,
201006566057,
201006568992,
201006576933,
201006642448,
201006681860,
201006701396,
201006775356,
201006833930,
201006841969,
201006874127,
201006886819,
201006905156,
201006911892,
201006953238,
201006997521,
201007006197,
201007126077,
201007135060,
201007174032,
201007210871,
201007251945,
201007420153,
201007431781,
201007436392,
201007467887,
201007526078,
201007532774,
201007536613,
201007573334,
201007581968,
201007737308,
201007740820,
201007901024,
201007910121,
201008018110,
201008053391,
201008073697,
201008235676,
201008269802,
201008306697,
201008330262,
201008360039,
201008527428,
201008529970,
201008597171,
201008698488,
201008864162,
201008872941,
201008900034,
201008940080,
201008968686,
201009033817,
201009089217,
201009120576,
201009150184,
201009171151,
201009190006,
201009225265,
201009440993,
201009752899,
201009759313,
201009793301,
201009797500,
201009804581,
201009869329,
201009886308,
201009939077,
201009945537,
201009969727,
201010025269,
201010041236,
201010107223,
201010259482,
201010376273,
201010382250,
201010490869,
201010684229,
201010743158,
201010789827,
201010866363,
201010885870,
201010887621,
201010887705,
201011205708,
201011492446,
201011508900,
201011604297,
201011723604,
201011936165,
201011953955,
201011999310,
201012036826,
201012338391,
201012342004,
201012475707,
201012530826,
201012574024,
201012775059,
201012856677,
201012962316,
201013004000,
201013135258,
201013248449,
201013327761,
201013331683,
201013725067,
201014063641,
201014242962,
201014446768,
201014626816,
201014687816,
201014714084,
201014781950,
201014786553,
201015084707,
201015162969,
201015264416,
201015328382,
201015493716,
201015554008,
201015555050,
201015654885,
201015665467,
201015736460,
201015817826,
201015994940,
201016388436,
201016408801,
201016497939,
201016565911,
201016636646,
201016748176,
201017035902,
201017062590,
201017212144,
201017435616,
201017505135,
201017567245,
201017580860,
201017650550,
201017672180,
201017690285,
201017815188,
201018042320,
201018180201,
201018416878,
201018518723,
201018861694,
201018933273,
201018984078,
201019023091,
201019069097,
201019217036,
201019266797,
201019502290,
201019782128,
201019785811,
201019859988,
201020007540,
201020060588,
201020093997,
201020170343,
201020172859,
201020178391,
201020184220,
201020235190,
201020301781,
201020335329,
201020555412,
201020649148,
201020695352,
201020847945,
201020969782,
201021017211,
201021160682,
201021222549,
201021235129,
201021394443,
201021655556,
201021736217,
201021875274,
201022226451,
201022246204,
201022265083,
201022329267,
201022446211,
201022518181,
201022660026,
201023005090,
201023069002,
201023069907,
201023095063,
201023118846,
201023130711,
201023247045,
201023248455,
201023248456,
201023248457,
201023248488,
201023626140,
201023674737,
201023790070,
201023848787,
201024052053,
201024181778,
201024420162,
201024470224,
201024501874,
201024769948,
201025075574,
201025227216,
201025255404,
201025393959,
201025412613,
201025432017,
201025463793,
201025500060,
201025581505,
201025647745,
201025737661,
201025767385,
201025887117,
201026191863,
201026200067,
201026264611,
201026300904,
201026440737,
201026773473,
201026798518,
201026807264,
201027030168,
201027234885,
201027316763,
201027481133,
201027605557,
201027719574,
201027774092,
201027775432,
201027788822,
201027994009,
201028258757,
201028313498,
201028340666,
201028603589,
201028885144,
201028912082,
201029116604,
201029135123,
201029139900,
201029296526,
201029362080,
201029484514,
201029602004,
201029777011,
201029885806,
201029929017,
201029950342,
201030014226,
201030039804,
201030047331,
201030096464,
201030145357,
201030282895,
201030356606,
201030367702,
201030382740,
201030499449,
201030530211,
201030596294,
201030673353,
201030751777,
201030806901,
201030812036,
201030885983,
201030985581,
201032073723,
201032080240,
201032197354,
201032215558,
201032599049,
201032900804,
201032960990,
201032995929,
201033006950,
201033014117,
201033053068,
201033054527,
201033087547,
201033159408,
201033499971,
201033552484,
201033598513,
201033854635,
201033970821,
201040535096,
201040873577,
201050048044,
201050774777,
201050797017,
201050894194,
201050916243,
201050923423,
201060037563,
201060040065,
201060090105,
201060156231,
201060163215,
201060208601,
201060371260,
201060444330,
201060525792,
201060577208,
201060686267,
201060794536,
201060896771,
201060906267,
201060974333,
201061099914,
201061131720,
201061337043,
201061350410,
201061489820,
201061973544,
201062031886,
201062166038,
201062319321,
201062415502,
201062603244,
201062702907,
201062718466,
201062981863,
201063103737,
201063141018,
201063251961,
201063308303,
201063525249,
201063556251,
201063600748,
201063688477,
201063831389,
201063923914,
201063955559,
201064026674,
201064054511,
201064101887,
201064153512,
201064178167,
201064312767,
201064334558,
201064468695,
201064626776,
201064630354,
201064644619,
201064684185,
201064921214,
201064982002,
201065048819,
201065050067,
201065161321,
201065286286,
201065451010,
201065601203,
201065635907,
201066228870,
201066229104,
201066253365,
201066292351,
201066465787,
201066596220,
201066730578,
201067611319,
201067696612,
201067788258,
201067791624,
201067859062,
201067889013,
201067970457,
201067986841,
201068212833,
201068640092,
201068653978,
201069074613,
201069133688,
201069483289,
201069766969,
201069938005,
201070021630,
201070076171,
201070129941,
201070290269,
201070641133,
201070665752,
201080058399,
201080068372,
201080076746,
201080269149,
201080322306,
201080351275,
201080454035,
201080688081,
201080827009,
201080931721,
201080979919,
201090009131,
201090090088,
201090119050,
201090213039,
201090333810,
201090744905,
201090809381,
201091029772,
201091467068,
201091677319,
201091729780,
201091951144,
201092955061,
201092977597,
201093030032,
201093092520,
201093122561,
201093359914,
201093594953,
201093882353,
201093981308,
201094057691,
201094186227,
201094255708,
201094584806,
201094688043,
201094688644,
201094769303,
201094924486,
201094960584,
201095032754,
201095288771,
201095667357,
201095782382,
201095956669,
201096133443,
201096148124,
201096351318,
201096567961,
201096662301,
201096725050,
201096776146,
201097229576,
201097267405,
201097761778,
201097765410,
201097846083,
201097919136,
201098123666,
201098127395,
201098166776,
201098386668,
201098582216,
201098700882,
201098957440,
201099336257,
201099412985,
201099420820,
201099530964,
201099550606,
201099600846,
201099670072,
201099785084,
201099907868,
201099915861,
201099924551,
201099981747,
201099997143,
201100038956,
201100040727,
201100074027,
201100082801,
201100170600,
201100245413,
201100316991,
201100485561,
201100583911,
201100588511,
201100667988,
201100680306,
201100711857,
201100721522,
201100726360,
201101163626,
201101371471,
201101474377,
201101512699,
201101626410,
201101795866,
201101986128,
201102192489,
201102432276,
201102563435,
201102660856,
201102752569,
201102766374,
201102779987,
201104429778,
201110110495,
201110121075,
201110144858,
201110333451,
201110600956,
201110668338,
201110797333,
201110868027,
201110921077,
201111047616,
201111105976,
201111250676,
201111282490,
201111300613,
201111512106,
201111522040,
201111528707,
201111667567,
201111697961,
201111715992,
201111716562,
201111718210,
201111751166,
201111751446,
201111754283,
201111951209,
201111981450,
201112000443,
201112022291,
201112044799,
201112105588,
201112215276,
201112235547,
201112299884,
201112524534,
201112539202,
201112591953,
201112861834,
201113001950,
201113024717,
201113305615,
201113328519,
201113512958,
201113617737,
201113701121,
201113931993,
201113999375,
201114202318,
201114211410,
201114384428,
201114568129,
201114729635,
201114776641,
201114801155,
201114988892,
201115232474,
201115299186,
201115307275,
201115440591,
201115553247,
201115605581,
201115691406,
201115790410,
201115794827,
201115801585,
201115892867,
201115934957,
201115997592,
201116036599,
201116062390,
201116155328,
201116195736,
201116360444,
201116362464,
201116397705,
201116410122,
201116646518,
201116661682,
201116662263,
201116669877,
201116684607,
201116787624,
201116951169,
201116985014,
201117008885,
201117059617,
201117246068,
201117265855,
201117558213,
201117651958,
201117663059,
201117685256,
201117730892,
201117745888,
201117937985,
201118001729,
201118002160,
201118175123,
201118243930,
201118313079,
201118331500,
201118342702,
201118636820,
201118653148,
201118674734,
201118689666,
201118706518,
201118787900,
201118882012,
201118886390,
201118970961,
201119044711,
201119079364,
201119100748,
201119137787,
201119159545,
201119187827,
201119256418,
201119298768,
201119490066,
201119499018,
201119557005,
201119601947,
201119905035,
201119928400,
201119993654,
201120071355,
201120086686,
201120161089,
201120194397,
201120272743,
201120357820,
201120732419,
201120760088,
201120777527,
201120803031,
201120840502,
201120917643,
201121000454,
201121104000,
201121115920,
201121218416,
201121262634,
201121537458,
201121539342,
201121641905,
201121645943,
201121676093,
201121721649,
201121738274,
201121833893,
201121880293,
201121904651,
201121999951,
201122130454,
201122277009,
201122352926,
201122352929,
201122441260,
201122453889,
201122466640,
201122681852,
201123138354,
201123200082,
201123237473,
201123338071,
201123355123,
201123386341,
201123606787,
201123850040,
201124166622,
201124215002,
201124355455,
201124484309,
201124525303,
201124535519,
201124554413,
201124585917,
201124868717,
201124939986,
201125111045,
201125308780,
201125388876,
201125811384,
201125869973,
201126002027,
201126047174,
201126255847,
201126312269,
201126442254,
201126625122,
201126636750,
201126659891,
201126669098,
201126946975,
201127000498,
201127009293,
201127010150,
201127029020,
201127040489,
201127068159,
201127100040,
201127233460,
201127301093,
201127315881,
201128008500,
201128144862,
201128293924,
201128316869,
201128399780,
201128482002,
201128652929,
201128716058,
201128852395,
201128872000,
201128932455,
201129157079,
201129158922,
201129706750,
201129808001,
201140276818,
201140490935,
201140823736,
201140826987,
201141094583,
201141191135,
201141231122,
201141307507,
201141385551,
201141438922,
201141473992,
201141549347,
201141573088,
201141614543,
201141675135,
201141679102,
201141679162,
201141696200,
201141724381,
201141761526,
201141822739,
201141941402,
201142001090,
201142088851,
201142136063,
201142224902,
201142381399,
201142394076,
201142461102,
201142492474,
201142783738,
201142877782,
201142889397,
201142985578,
201143123876,
201143283485,
201143335405,
201143490888,
201143631229,
201143730080,
201143791394,
201143915554,
201144038991,
201144129961,
201144175633,
201144224787,
201144294246,
201144338541,
201144352678,
201144601683,
201144626239,
201144707747,
201145000373,
201145579943,
201145611618,
201145621795,
201145809497,
201145814704,
201145828830,
201145922310,
201146055558,
201146207812,
201146445021,
201146448910,
201146461695,
201146628267,
201146791090,
201147155402,
201147181768,
201147333047,
201147429209,
201147504941,
201147769989,
201147912222,
201147965344,
201148073829,
201148140582,
201148163794,
201148283337,
201148460674,
201148504650,
201148581664,
201148656049,
201149228245,
201149363795,
201149492463,
201149518708,
201150259592,
201150300052,
201150304075,
201150343503,
201150352022,
201150451768,
201150516739,
201150533289,
201150548146,
201150647985,
201150650378,
201150793312,
201150872150,
201150921271,
201151296487,
201151458889,
201151510446,
201151593953,
201151616245,
201151845956,
201151869870,
201152054617,
201152154482,
201152184337,
201152228476,
201152336491,
201152636067,
201152851954,
201152994061,
201153086752,
201153094925,
201153260339,
201153506778,
201153508619,
201153590337,
201154004771,
201154322032,
201154404977,
201154505875,
201154554795,
201154558329,
201154566231,
201154962800,
201155018765,
201155072426,
201155110000,
201155215891,
201155394107,
201155449375,
201155465556,
201155512282,
201155540425,
201155581701,
201155617074,
201155633622,
201155705126,
201155883321,
201156012567,
201156265716,
201156422481,
201156839185,
201156894666,
201156941320,
201157009020,
201157055175,
201157121939,
201157347771,
201157566765,
201157693835,
201158232008,
201158313756,
201158342680,
201158601956,
201158680006,
201158913381,
201158937603,
201159109401,
201159430166,
201159519690,
201159555233,
201159775543,
201200008264,
201200205662,
201200225120,
201200240122,
201200360155,
201200395648,
201200520512,
201200622072,
201200622129,
201200678667,
201200751933,
201200757011,
201200811161,
201200999580,
201201025700,
201201155000,
201201294180,
201201312691,
201201383512,
201201421326,
201201491025,
201201621622,
201201840871,
201202000888,
201202211450,
201202530513,
201202665435,
201202912341,
201203014151,
201203039750,
201203181372,
201203456879,
201203477332,
201204023121,
201204281981,
201204514017,
201204688081,
201204855400,
201204977751,
201205000292,
201205031905,
201205686247,
201205759040,
201206017464,
201206600861,
201206975332,
201207121802,
201207372344,
201207616444,
201207750441,
201208085263,
201208414347,
201208977177,
201210023938,
201210583591,
201210588038,
201210732122,
201210818176,
201210945113,
201211066299,
201211079908,
201211161032,
201211795422,
201211986162,
201212145380,
201212258721,
201212479538,
201220444133,
201220612822,
201220724766,
201220820976,
201220914219,
201221041254,
201221138834,
201221212426,
201221212824,
201221278704,
201221280828,
201221328517,
201221408219,
201221732389,
201221800122,
201221954550,
201222143516,
201222278308,
201222282205,
201222332047,
201222517257,
201222620610,
201222695023,
201222748994,
201222781707,
201222967787,
201222971467,
201223234257,
201223336884,
201223376686,
201223401519,
201223456731,
201223521664,
201223596905,
201223671633,
201223705456,
201223838760,
201223874421,
201223940650,
201224050760,
201224053907,
201224213162,
201224217248,
201224236042,
201224353363,
201224380088,
201224483706,
201224508493,
201224535248,
201224661061,
201224752065,
201224825057,
201224911013,
201224927485,
201224970278,
201224971527,
201225001313,
201225015388,
201225294141,
201225301553,
201225328559,
201225460762,
201225570507,
201225656181,
201225958509,
201226262906,
201226291683,
201226315730,
201226416059,
201226461243,
201226595175,
201226655253,
201226672939,
201226757626,
201226782942,
201226790797,
201226965492,
201226994629,
201227070538,
201227314954,
201227757571,
201227831100,
201227885100,
201228030501,
201228216918,
201228781347,
201228922343,
201228946285,
201229082850,
201229123460,
201229974967,
201270550493,
201270565699,
201270626113,
201271122314,
201271132209,
201271133956,
201271160173,
201271401468,
201272021184,
201272072854,
201272336635,
201272649581,
201272939093,
201273024547,
201273073912,
201273114754,
201273170033,
201273273705,
201273808399,
201273888510,
201273943548,
201274050210,
201274206995,
201274302911,
201274527249,
201274768678,
201274793455,
201274842863,
201275200924,
201275298194,
201275610030,
201275624989,
201275662461,
201275668382,
201275901512,
201276330019,
201276624302,
201276766553,
201277014277,
201277117926,
201277131373,
201277606290,
201277740069,
201277773181,
201277855345,
201277862323,
201278119893,
201278324075,
201278378190,
201278539943,
201278956638,
201279236054,
201279296936,
201279803133,
201279872337,
201279920962,
201280024389,
201280256821,
201280433297,
201280832425,
201280838169,
201281011857,
201281181008,
201281659132,
201281802541,
201281898421,
201282199565,
201282427635,
201283170305,
201283329751,
201283991212,
201284350745,
201284436627,
201284601547,
201285060920,
201285686701,
201285980741,
201286065056,
201286254841,
201287277734,
201287585360,
201287839817,
201288006876,
201288090780,
201288199133,
201288326620,
201288446043,
201288496608,
201288863470,
201289006333,
201289354010,
201289488182,
201289723337,
201289723730,
201289920270,
201500085192,
201500263335,
201500567444,
201500791104,
201500888614,
201501355877,
201501538118,
201501602948,
201501877880,
201503227949,
201507255344,
201507416444,
201508325183,
201550132936,
201550707584,
201550801300,
201550817512,
201550861194,
201550919395,
201551141835,
201551233318,
201551418313,
201551421493,
201551465551,
201551500674,
201551630844,
201551980169,
201553022775,
201553077785,
201553222768,
201553324455,
201553335619,
201553540894,
201553684030,
201553806016,
201553996793,
201554435301,
201554666842,
201554752044,
201555000205,
201555116452,
201555181159,
201555310975,
201555320344,
201555402805,
201555408958,
201555577228,
201555583558,
201555604325,
201555791055,
201555888091,
201555944650,
201556206194,
201556754333,
201557454447,
201557567007,
201557770122,
201558550454,
201559170967,
201559975610,
21142703233
];
}