diff --git a/.gitignore b/.gitignore
index fd4aca5a..cff0e374 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,6 +25,7 @@
.dart_tool/
.flutter-plugins
pubspec.lock
+/ios/Podfile.lock
.flutter-plugins-dependencies
.packages
.pub-cache/
diff --git a/GoogleService-Info_DQ.plist b/GoogleService-Info_DQ.plist
new file mode 100644
index 00000000..0c093a2a
--- /dev/null
+++ b/GoogleService-Info_DQ.plist
@@ -0,0 +1,36 @@
+
+
+
+
+ CLIENT_ID
+ 864393916058-ekeb4s8tgfo58dutv0l54399t7ivr06r.apps.googleusercontent.com
+ REVERSED_CLIENT_ID
+ com.googleusercontent.apps.864393916058-ekeb4s8tgfo58dutv0l54399t7ivr06r
+ API_KEY
+ AIzaSyA_6ayGCk4fly7o7eTVBrj9kuHBYHMAOfs
+ GCM_SENDER_ID
+ 864393916058
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ com.cloud.diplomaticquarterapp
+ PROJECT_ID
+ diplomaticquarter-d2385
+ STORAGE_BUCKET
+ diplomaticquarter-d2385.appspot.com
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:864393916058:ios:13f787bbfe6051f8b97923
+ DATABASE_URL
+ https://diplomaticquarter-d2385.firebaseio.com
+
+
\ No newline at end of file
diff --git a/GoogleService-Info_HMG.plist b/GoogleService-Info_HMG.plist
new file mode 100644
index 00000000..153aa2c6
--- /dev/null
+++ b/GoogleService-Info_HMG.plist
@@ -0,0 +1,38 @@
+
+
+
+
+ CLIENT_ID
+ 815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt.apps.googleusercontent.com
+ REVERSED_CLIENT_ID
+ com.googleusercontent.apps.815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt
+ ANDROID_CLIENT_ID
+ 815750722565-m14h8mkosm7cnq6uh6rhqr54dn02d705.apps.googleusercontent.com
+ API_KEY
+ AIzaSyDiXnCO00li4V7Ioa2YZ_M4ECxRsu_P9tA
+ GCM_SENDER_ID
+ 815750722565
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ com.HMG.Smartphone
+ PROJECT_ID
+ api-project-815750722565
+ STORAGE_BUCKET
+ api-project-815750722565.appspot.com
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:815750722565:ios:328ec247a81a2ca23c186c
+ DATABASE_URL
+ https://api-project-815750722565.firebaseio.com
+
+
\ No newline at end of file
diff --git a/agconnect-services_DQ.json b/agconnect-services_DQ.json
new file mode 100644
index 00000000..563c412f
--- /dev/null
+++ b/agconnect-services_DQ.json
@@ -0,0 +1,14 @@
+{
+ "client":{
+ "appType":"1",
+ "cp_id":"2640966000002322881",
+ "product_id":"736430079244816576",
+ "client_id":"563737844552565952",
+ "client_secret":"9C9A2C272576B8AE6E886C78AF944E8354B91F0AF3381129BB8369FB35E41C47",
+ "project_id":"736430079244816576",
+ "app_id":"103856487",
+ "api_key":"CgB6e3x90XxBrOCMun809w+DOzcFEettcBDUF3fqaLry1ViqTeJqoPwpfaOq/uGw//x0oYwucu9aWazs+Rdj0GUF",
+ "package_name":"com.cloud.diplomaticquarterapp"
+ },
+ "configuration_version":"1.0"
+}
\ No newline at end of file
diff --git a/agconnect-services_HMG.json b/agconnect-services_HMG.json
new file mode 100644
index 00000000..cfdaf83b
--- /dev/null
+++ b/agconnect-services_HMG.json
@@ -0,0 +1,14 @@
+{
+ "client":{
+ "appType":"1",
+ "cp_id":"2640966000002322881",
+ "product_id":"736430079244816567",
+ "client_id":"563735388191982656",
+ "client_secret":"650C7C799812AFFD53A10C7756CF05FB9F215A7E49032ABA8EBF3E14B77535CF",
+ "project_id":"736430079244816567",
+ "app_id":"102857389",
+ "api_key":"CgB6e3x9DJzMgRCmnT6dyUEkp6UsIfddb6l3w0ZEXzeiRMHEFi3400Z5fJ5qaHneU0OrAI/JRpk+DMGVs3QpUxlI",
+ "package_name":"com.ejada.hmg"
+ },
+ "configuration_version":"1.0"
+}
\ No newline at end of file
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 759fa6a7..11e99a2a 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -7,9 +7,9 @@ if (localPropertiesFile.exists()) {
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
-if (flutterRoot == null) {
- throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
-}
+//if (flutterRoot == null) {
+// throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
+//}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
@@ -78,6 +78,7 @@ dependencies {
// exclude group: 'com.google.protobuf',module: 'protobuf-lite'
// })
implementation 'pub.devrel:easypermissions:0.4.0'
+// implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0'
// implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0'
implementation 'com.google.guava:guava:27.0.1-android'
// Dependency on local binaries
@@ -93,6 +94,6 @@ dependencies {
implementation 'com.github.kittinunf.fuel:fuel:2.3.0' //for JVM
implementation 'com.github.kittinunf.fuel:fuel-android:2.3.0'
implementation 'com.google.android.gms:play-services-location:17.1.0'//for Android
-
+ implementation 'com.google.android.gms:play-services-basement:17.5.0'
}
diff --git a/android/app/google-services.json b/android/app/google-services.json
index f86832ad..a4655794 100644
--- a/android/app/google-services.json
+++ b/android/app/google-services.json
@@ -1,39 +1,37 @@
{
"project_info": {
- "project_number": "815750722565",
- "firebase_url": "https://api-project-815750722565.firebaseio.com",
- "project_id": "api-project-815750722565",
- "storage_bucket": "api-project-815750722565.appspot.com"
+ "project_number": "864393916058",
+ "firebase_url": "https://diplomaticquarter-d2385.firebaseio.com",
+ "project_id": "diplomaticquarter-d2385",
+ "storage_bucket": "diplomaticquarter-d2385.appspot.com"
},
"client": [
{
"client_info": {
- "mobilesdk_app_id": "1:815750722565:android:62281cd3e5df4063",
+ "mobilesdk_app_id": "1:864393916058:android:5b5a65cd6d8c18b4b97923",
"android_client_info": {
"package_name": "com.cloud.diplomaticquarterapp"
}
},
"oauth_client": [
{
- "client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com",
+ "client_id": "864393916058-tphjrn8j39ntevt32ekcvmll8aue7qql.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
- "current_key": "AIzaSyDUfg6AKM1-00WyzpvLImUBC46wFrq9-qw"
+ "current_key": "AIzaSyBdV3mos1BPhUzNKCj2KANJtiO3o2zh9IM"
}
],
"services": {
- "analytics_service": {
- "status": 1
- },
"appinvite_service": {
- "status": 1,
- "other_platform_oauth_client": []
- },
- "ads_service": {
- "status": 2
+ "other_platform_oauth_client": [
+ {
+ "client_id": "864393916058-tphjrn8j39ntevt32ekcvmll8aue7qql.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ]
}
}
}
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
new file mode 100644
index 00000000..4ace459d
--- /dev/null
+++ b/android/app/proguard-rules.pro
@@ -0,0 +1,4 @@
+-keep class tvi.webrtc.** { *; }
+-keep class com.twilio.video.** { *; }
+-keep class com.twilio.common.** { *; }
+-keepattributes InnerClasses
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/geofence/intent_receivers/GeofenceErrorMessages.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/geofence/intent_receivers/GeofenceErrorMessages.kt
old mode 100755
new mode 100644
diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/geofence/intent_receivers/GeofenceTransitionsJobIntentService.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/geofence/intent_receivers/GeofenceTransitionsJobIntentService.kt
old mode 100755
new mode 100644
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
old mode 100755
new mode 100644
diff --git a/android/build.gradle b/android/build.gradle
index 433bc8ad..32bda0b1 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -3,6 +3,9 @@ buildscript {
repositories {
google()
jcenter()
+// maven {
+// url "https://dl.bintray.com/kotlin/kotlin-eap/"
+// }
}
dependencies {
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index c935be88..1f9de82f 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-all.zip
diff --git a/assets/app_icons/config.json b/assets/app_icons/config.json
index 0bedcb06..e2e1afdb 100644
--- a/assets/app_icons/config.json
+++ b/assets/app_icons/config.json
@@ -257,6 +257,20 @@
"search": [
"calendar-(2)"
]
+ },
+ {
+ "uid": "ad42aa33b55d1a7b2edcf4ed976435d9",
+ "css": "roboticon",
+ "code": 59410,
+ "src": "custom_icons",
+ "selected": true,
+ "svg": {
+ "path": "M546.9 33.2C546.1 35.3 544.8 37.2 544.1 37.7 542.9 38.3 542.9 38.9 543.8 40.6 544.5 42.2 546.7 43.5 550.4 44.7L555.8 46.6 557.5 44.4C560.3 40.7 562.1 36.4 561.5 34.8 561.2 34 559.3 32.9 557.3 32.3 555.4 31.7 553.7 30.8 553.7 30.4 553.7 30 552.5 29.6 551 29.6 548.8 29.6 548.1 30.2 546.9 33.2ZM453.8 33.9C452.7 35.3 451.9 37.6 451.9 39 451.9 41 451.4 41.7 450 41.7 447.2 41.7 447.8 43.1 452 46.8 458.9 52.5 461.7 52.1 464.4 45 466.7 39.1 466 36.9 461.7 35.6 459.7 35.1 457.6 33.9 456.9 33.1 455.8 31.5 455.6 31.6 453.8 33.9ZM500.2 34.4C499.4 36 498 38.1 497.1 39 495.6 40.5 495.7 40.7 499 43.8 503.9 48.7 506.6 49 509.6 45.2 510.9 43.5 512.8 41.4 513.6 40.6 515 39 514.9 38.7 511.2 35.2 506.2 30.4 502.5 30.1 500.2 34.4ZM523.1 36L518.8 40.5 523.3 45.2C525.7 47.8 527.8 50.6 527.8 51.7 527.8 52.7 525.9 55.6 523.6 58.1L519.4 62.9 523 66.6C528 71.9 530.9 71.8 536.2 66 539.9 62 540 61.7 538.4 60.7 534.1 58.3 531.5 54.8 531.5 51.5 531.5 47.3 535.7 38.9 537.9 38.9 538.9 38.9 538.1 37.7 535.5 35.2 530.3 30.3 528.3 30.5 523.1 36ZM477.4 34.4C476.7 35.6 475.4 38.2 474.5 40.3 473 43.8 473.1 44 475 45.6 476.1 46.5 477.9 47.2 478.8 47.2 479.7 47.2 481 48.1 481.7 49.1 482.3 50.1 483.1 50.9 483.6 50.9 484.8 50.9 488 45 488 42.8 488 41.3 488.5 40.7 490 40.7 491.9 40.7 491.9 40.6 489.3 37.9 486.3 34.8 482.4 32.4 480.2 32.4 479.4 32.4 478.1 33.3 477.4 34.4ZM568.7 36.6L566.8 39.7 569.5 42C575.1 46.8 581.6 46.9 583.2 42.3 585.6 36 585.8 36.4 578.8 34.8 570.4 32.9 570.8 32.8 568.7 36.6ZM428.6 38C428 40.2 426.8 41.9 425.6 42.2 424.1 42.7 424.2 43.1 426.9 46 433.4 52.7 436.5 52.8 439.8 46.2 440.8 44.3 442.3 42.6 443.1 42.6 446.6 42.6 442.2 37.5 437.9 36.6 436.4 36.2 435 35.6 434.7 35.1 434.4 34.6 433.1 34.3 431.9 34.3 430.1 34.3 429.4 35 428.6 38ZM408.4 38.8C404 40.2 403.2 40.7 402.5 43.4 401.4 47.9 402 48.8 407.7 50.6 413.7 52.4 415.6 51.9 416.4 48.1 416.7 46.6 417.9 44.5 419.1 43.6L421.3 41.9 419.4 39.4C417.2 36.7 415.5 36.6 408.4 38.8ZM619.7 52C617 54.9 615.3 61.8 616.8 63.5 617.3 64.3 618.3 64.8 618.9 64.8 619.5 64.8 621.5 65.6 623.4 66.6 626.8 68.2 626.9 68.2 629.1 66.6 631.3 64.8 633.9 57.2 632.9 55.6 632.3 54.7 623.1 50 622 50 621.9 50 620.7 50.9 619.7 52ZM572.2 54.3C571.7 55.6 571.3 56.9 571.3 57.3 571.3 57.8 570.5 59.2 569.4 60.5 567.6 62.8 567.6 62.8 569.5 65.2 571.6 67.8 577 69.8 580.6 69.3 582.4 69.1 583.1 68.1 584.5 64 585.5 61.3 585.9 58.2 585.6 57.2 585 55.3 581.2 53.4 576.1 52.5 573.5 51.9 573 52.2 572.2 54.3ZM595.2 53.4C594.4 54.4 593.2 56.9 592.8 59.1 591.6 64.3 593.2 66.4 599.4 67.5 605.4 68.6 606.3 68.1 607 64.1 607.4 62.1 608.1 59.9 608.5 58.9 610.9 54.4 598.8 49.4 595.2 53.4ZM548.7 54.7C547.9 55.9 547.2 57.4 547.2 58 547.2 58.5 546.6 59.5 545.8 60.2 545.1 60.8 544.4 62.3 544.4 63.6 544.4 65.5 545.3 66.2 549.1 67.8 551.7 68.8 553.7 70.1 553.7 70.5 553.7 72 556.2 71.3 558.1 69.2 560.4 66.8 562.5 60 561.7 57.9 561.1 56.4 557.2 54.4 552.6 53.2 550.7 52.8 549.9 53.1 548.7 54.7ZM480 55.4C479.4 55.7 477.8 58.1 476.4 60.8 473.3 66.3 473.7 67.3 479.7 70.5 485.6 73.3 487.9 72.7 489.4 67.6 489.7 66.3 490.6 64.5 491.5 63.6 493.2 61.7 492.5 60.8 487.7 59.3 485.7 58.7 483.7 57.4 483.1 56.4 481.9 54.4 481.5 54.4 480 55.4ZM500.1 57C499 58.4 497.9 60.6 497.6 61.8 496.5 65.8 502.6 72 506.6 70.8 509 70 515.7 64.1 515.7 62.6 515.7 61.3 507.7 55.8 504.5 55.1 502.6 54.6 501.7 55 500.1 57ZM429.7 59.8C427.7 62.3 426.5 67.1 427 70 427.7 73.6 438.2 76.1 439.8 73.1 444.9 63.8 444.7 62 438.5 59.2 433.4 56.9 431.9 56.9 429.7 59.8ZM453.2 59.5C452.5 60.7 451.6 63.6 451.3 65.8 450.7 70 450.8 70.1 453.8 71.3 455.6 71.9 457.7 73.1 458.5 73.9 460.7 75.8 462.9 74.6 464.4 70.6 465.2 68.7 466.3 66.2 466.9 65.1 468.2 62.4 465.9 59.6 461.2 58.3 456.2 56.9 454.8 57.2 453.2 59.5ZM407.2 59.9C405 62.5 401.8 69.4 402.3 70.4 402.6 70.8 404.4 71.5 406.3 71.9 408.1 72.1 410.8 73.2 412.2 74.2L414.8 75.9 417.1 71.3C418.4 68.8 419.4 65.7 419.4 64.4 419.4 59.5 410.5 56.3 407.2 59.9ZM382.4 60.6C380.8 62.5 378.7 70.2 379.3 71.8 379.5 72.5 381.3 73.5 383.1 74.2 385.1 74.7 386.9 75.6 387.5 76 390.3 78.7 394.8 74.6 395.8 68.4 396.7 63.6 394.9 61.6 388.8 60.3 383.1 59.1 383.8 59 382.4 60.6ZM358.9 61.9C357.3 63.7 355.6 68.7 355.6 71.5 355.6 73.8 358 75.7 362.1 76.9 367.1 78.2 369 77.4 370.7 73.1 373.4 66.5 372.9 65.1 367 62.5 360.7 59.7 360.8 59.7 358.9 61.9ZM339.3 65.2C332 69 331 70.1 332 72.9 333.1 75.8 336 77.5 341.2 78 344.4 78.2 345 78 346 75.9 346.7 74.6 347.4 71.9 347.8 69.7 348.3 66.2 348.1 65.8 345.7 64.5 343.2 63.2 342.8 63.3 339.3 65.2ZM645.2 73.8C644.4 74.7 643 77.7 642 80.4 640.4 85.3 640.4 85.4 642.1 86.7 643.1 87.4 644.5 88 645.5 88 646.3 88 647.5 88.6 648.1 89.4 650.7 92.5 655.6 89 657 83.1 657.6 80.8 657 79.9 653.3 76.3 648.6 71.9 647.3 71.4 645.2 73.8ZM666.4 77.7C663.8 85 664.4 87 669.5 87 670.5 87 672.1 87.9 673.2 89 675.5 91.2 677.2 90.3 678.2 86.3 678.6 84.9 679.4 83.1 680.2 82.3 681.4 81 681 80.5 676.6 77.6 668.8 72.4 668.2 72.4 666.4 77.7ZM622.2 75C621.4 75.5 619.7 78 618.5 80.6L616.3 85.4 618.8 87.6C621.2 89.6 623.3 90.3 626.9 89.9 628.5 89.7 635.2 82.7 635.2 81.1 635.1 80 626.1 74.1 624.5 74.1 624.1 74.1 623 74.5 622.2 75ZM597.8 76.4C595.7 78.5 592.6 85.9 593.1 87.5 593.7 88.8 599.9 91.7 602.2 91.7 604.1 91.7 608.5 87.8 610.4 84.4L611.9 81.8 607 78.3C601.7 74.6 599.9 74.3 597.8 76.4ZM550.1 78.3C547.8 81.3 545.8 87.3 546.6 89.3 547.2 90.9 556.7 94 558.7 93.2 559.5 92.9 560.2 91.9 560.2 90.9 560.2 90 561.2 87.9 562.5 86.1 563.8 84.4 564.8 82.9 564.8 82.7 564.8 82.5 562.9 81.5 560.5 80.5 558 79.4 555.6 78 555.3 77.2 554.2 75.3 552.2 75.6 550.1 78.3ZM574.4 77C573 78.8 569.4 86.6 569.4 87.7 569.4 89.4 575.5 92.6 578.4 92.6 581.4 92.6 584.1 90.3 586.4 85.6L587.9 82.7 583.4 79.4C578.8 75.8 575.8 75.1 574.4 77ZM525.5 79.3C524.7 80 523.9 81.7 523.6 83 523.3 84.2 523 86.1 522.7 87.3 522.1 90.1 523.1 91.2 526.4 92 528 92.4 529.9 93.3 530.7 94.2 534.2 97.2 538.9 91.9 538.9 84.7 538.9 81.9 538.5 81.2 535.9 80.2 530.6 78.1 527 77.7 525.5 79.3ZM501.7 80.3C499.5 82.6 498.1 89.7 499.2 91.9 499.6 92.7 502.1 94.1 504.7 94.8 509.4 96.2 512 96 512 94.2 512 93.6 512.9 91.4 514 89.2 516.2 84.5 515.9 83.1 512.3 81.1 507.6 78.7 503.3 78.3 501.7 80.3ZM478.5 80.6C476.9 81.6 475 86.9 475 90.6 475 91.9 475.8 93 477.6 93.6 479 94.2 481.4 95.2 482.9 95.9 484.4 96.7 486.4 97 487.2 96.8 489.4 95.9 491.7 90.6 491.7 86.7 491.7 84 491.2 83.1 489.2 82.1 485.5 80.3 480.4 79.5 478.5 80.6ZM455.1 82.1C454.4 82.9 453.7 84.4 453.7 85.6 453.7 86.8 453.1 88.2 452.3 88.9 448.9 91.8 451.7 95.6 458.5 97.3 462.4 98.4 463.1 98.3 464.7 96.9 466.9 94.8 468.7 87.3 467.5 85.1 466.8 83.6 463.9 82.4 458.5 81.2 457.3 80.9 455.8 81.3 455.1 82.1ZM430.8 82.6C429.4 84.4 427.8 89.7 427.8 92.3 427.8 93.6 428.4 94.7 429.4 95.1 430.3 95.4 432.8 96.4 434.9 97.4 437 98.4 439.4 98.9 439.9 98.6 441.5 97.6 444.4 90.6 444.4 87.7 444.4 85.6 443.8 84.8 441.5 83.8 436.4 81.8 431.9 81.2 430.8 82.6ZM407.6 83.5C406.9 84.2 406.5 85.4 406.5 86.3 406.5 87.3 405.5 89.1 404.2 90.4 401.9 92.6 401.9 92.7 403.7 94.4 404.7 95.5 406.1 96.3 406.9 96.3 407.5 96.3 409.2 97.1 410.5 98.1 413.1 100.3 416 100.6 417.5 98.7 419 96.9 421.5 88.1 420.8 87 420.4 86.3 410.9 82.4 409.4 82.4 409 82.4 408.2 82.9 407.6 83.5ZM386.6 84.3C385.6 84.6 383.3 86.8 381.6 88.9L378.5 92.8 382.4 96.8C387.1 101.6 389.1 102.2 392 99.9 394.6 97.9 397.5 91.2 396.8 88.9 395.7 85.6 389.7 83 386.6 84.3ZM360.3 86.7C359.2 88.1 357.9 90.8 357.2 92.9 356.2 96.1 356.3 96.7 357.9 97.8 358.8 98.5 360.6 99.1 361.7 99.1 362.9 99.1 364.4 99.9 365.1 100.9 366.3 102.7 366.4 102.7 368.9 100.1 370.3 98.7 371.3 97.1 371.2 96.7 370.8 94.6 371.4 93.5 372.7 93.5 375.6 93.5 373 89.2 368.1 86.2 364.1 83.6 362.6 83.8 360.3 86.7ZM336.9 85.9C334.5 86.4 332.9 91.8 333.2 97.5 333.3 99.5 338.5 101.9 343 101.9 345.8 101.9 346.3 101.5 347.2 98.3 347.9 96.5 348.7 94.5 349.2 94 350.6 92.5 350.1 89.9 348 88.5 345.5 86.9 339.1 85.4 336.9 85.9ZM311.6 88.2C310.8 89.4 309.9 92.3 309.6 94.7 309 99.4 308.7 99.2 317 101.9 320.6 103 320.8 102.9 322.8 100.6 325.8 97.1 326.6 92.1 324.5 89.8 322.9 88.1 317.8 86.1 314.6 86.1 313.7 86.1 312.4 87 311.6 88.2ZM671.6 95.5C670.5 95.8 668.5 98.4 666.9 101.8L664.3 107.3 668.1 110.2C670.3 111.7 673.1 113 674.4 113 676.9 113 680.8 109 681.9 105.5 683.6 100.3 676.7 93.5 671.6 95.5ZM691.9 96.5C690.8 97.8 688.9 104.3 688.9 106.5 688.9 107.4 691.2 109 694.5 110.6 699.8 113 700.3 113.1 701.9 111.6 702.8 110.7 704.2 108.1 705 105.7L706.5 101.4 703 98.4C699.3 95.2 693.7 94.3 691.9 96.5ZM647.5 98.9C645.9 99.7 643.5 101.8 642.2 103.3L639.8 106.3 644.4 110.6C646.9 112.9 649.5 114.8 650.3 114.8 652.8 114.8 658.3 106.7 658.3 103.1 658.2 101.3 655.5 98.8 652.3 97.8 651.2 97.5 649.2 97.9 647.5 98.9ZM596.4 103.2C592.5 109.6 593.1 112 599 113.8 601.1 114.4 603.1 115.5 603.3 116.2 604.3 118.5 606.7 116.5 608.9 111.4 611.9 104.6 611.8 102.9 608.4 102.2 606.9 101.9 604.9 100.8 604.1 99.9 601.5 97 599.6 97.9 596.4 103.2ZM622.4 99.3C621.9 99.9 620.5 102.4 619.2 104.8 617 108.8 616.9 109.3 618.4 110.5 623.5 115 628.6 115.1 633 110.7 634.7 109 636.1 106.9 636.1 106.2 636.1 105.4 634.4 103.2 632.2 101.5 628.2 98.1 624.2 97.1 622.4 99.3ZM574.6 101.1C571.9 105.4 570.1 110.1 570.6 111.5 571 112.3 573.1 113.8 575.5 114.8 578.6 116.2 579.6 117.1 579.6 118.7 579.6 120.5 579.8 120.6 580.9 119.4 582.8 117.5 588 107.6 588 106 588 105.3 586.6 104.1 585 103.4 583.3 102.7 581.4 101.5 580.6 100.6 578.9 98.4 576.2 98.7 574.6 101.1ZM549.3 103C546.1 108.9 546.2 114.8 549.4 114.8 550 114.8 552 115.6 553.9 116.5 558.7 119 560.7 117.9 562.5 111.6 564.4 105.4 564 104.1 559.7 102.3 554.8 100.2 550.6 100.6 549.3 103ZM502.9 104.3C500.2 107.7 498.6 113.6 500.1 115.4 500.6 116.1 501.7 116.7 502.2 116.7 502.9 116.7 504.9 117.5 506.9 118.5L510.6 120.4 512.6 118.4C516.6 114.7 517.1 105.6 513.5 105.6 512.9 105.6 510.8 104.7 508.8 103.7 506.8 102.7 505.1 101.9 505 101.9 504.8 101.9 503.9 103 502.9 104.3ZM525.9 105.3C525.3 107.2 524.2 109.5 523.4 110.4 520.6 113.5 526.8 118.5 533.2 118.5 535.6 118.5 536.4 118 537.1 115.9 537.7 114.5 538.7 112.1 539.4 110.6 540.9 106.9 539.9 105.3 535 103.2 529.2 100.9 527.1 101.3 525.9 105.3ZM480.3 103.8C478.1 105.1 475.9 110.2 475.9 113.8 475.9 117.3 478.6 119.2 484.4 120L488.7 120.6 490.3 115.8C491.1 113.2 492.2 110.9 492.7 110.6 494 109.7 491.9 106.6 488.6 104.6 485.3 102.6 482.8 102.3 480.3 103.8ZM408.3 108.4C404.9 113.2 404.4 114.9 405.5 117.8 406.7 120.9 414 124.5 416.5 123.2 418.4 122.2 421.3 116.9 421.3 114.3 421.3 112.6 413.6 104.6 412 104.6 411.6 104.6 409.9 106.3 408.3 108.4ZM433.1 107.4C431.8 108.9 430.2 111.7 429.5 113.6 428.5 116.8 428.6 117.1 430.6 118.7 431.7 119.6 433.4 120.4 434.4 120.4 435.4 120.4 436.4 121 436.7 121.8 438 125.1 442.6 121.5 442.6 117.2 442.6 115.5 443.1 114.5 444.4 114.2 445.5 113.9 446.3 113.3 446.3 113 446.3 111.8 438.1 104.6 436.7 104.6 435.9 104.6 434.4 105.8 433.1 107.4ZM455.7 106.2C455.3 107.1 454.6 109 454.3 110.4 453.9 111.9 453 113 451.6 113.1L449.5 113.4 451.9 115.7C456.3 119.8 461.2 122.4 463.6 121.8 466.2 121.1 468.2 117 468.7 111.6L469 108.1 463.4 106.3C456.6 104.3 456.8 104.3 455.7 106.2ZM363.6 107.5C362.8 108.1 361 110.5 359.7 113 358.4 115.5 357 117.7 356.5 118.1 355.9 118.3 357.7 120.1 360.2 121.9 366.6 126.2 369.1 125.9 371.9 120.4 373.1 118.1 374.1 115.3 374.1 114.2 374.1 111.9 371.7 110.2 368.5 110.2 367.5 110.2 366.3 109.4 365.9 108.4 365.5 107 364.9 106.9 363.6 107.5ZM384.2 109.8C383.6 111.3 382.5 113.9 381.7 115.5 380.4 118.2 380.4 118.6 381.9 120.3 384.2 122.8 388.1 124.3 391.8 123.9 395.3 123.6 397 120.9 397.9 114.8 398.3 111.8 398.1 111.1 395.9 109.7 394.6 108.8 391.7 107.9 389.4 107.6 385.6 107.2 385.2 107.3 384.2 109.8ZM313.7 110.8C311.7 113.1 310.2 117.1 310.2 120.5 310.2 122.6 310.7 123.4 312.8 124.1 314.2 124.5 316.5 125.6 318.1 126.5 320.7 127.9 320.8 127.9 323.2 125.2 324.6 123.6 326 120.6 326.4 118.6 327.3 113.2 325.6 111.5 318 109.8 315.9 109.4 314.8 109.6 313.7 110.8ZM336.1 112.2C335.1 113.9 334.3 116.9 334.3 118.8 334.3 122 334.5 122.4 338.2 124.1 344.7 127 346 126.7 348.7 120.6 350.2 117.3 350.7 114.8 350.3 114 349.5 112.8 341.3 109.3 339.1 109.3 338.4 109.3 337.1 110.6 336.1 112.2ZM291 111.3C288.7 112.4 286.9 116.2 286.8 120.6 286.6 123.4 286.9 123.8 291.7 126 295.2 127.7 297.2 128.2 298.3 127.7 299.9 126.9 303.9 115.9 303.1 114.6 302.4 113.5 295.6 110.2 294.3 110.3 293.6 110.3 292.1 110.7 291 111.3ZM268 117.7L262.5 123.3 266.1 126.5C268.1 128.2 270.2 129.6 270.6 129.6 271.1 129.6 273.1 128 275.2 125.9 279.3 121.9 279.3 120.6 275.5 115.1L273.5 112.1 268 117.7ZM718.3 118.1C717.4 119.3 716.7 120.6 716.7 121 716.7 121.5 715.8 122.8 714.8 123.9 711.4 127.5 714.1 132.3 720.4 134.1 723.1 134.8 721.8 135 713.2 135.1L702.8 135.2 704.7 131.6C705.7 129.6 706.7 126.8 706.8 125.4 706.9 123.1 706.5 122.6 702.1 121 698 119.5 697 119.4 694.7 120.6 693.3 121.2 691.4 123.3 690.5 125.3 688.9 128.4 688.9 129 690.1 130.9 690.8 132 692.9 133.4 694.6 134 697.2 134.8 696.3 135 688.2 135.1L678.7 135.2 680.6 132.1C683.1 128.1 682.9 126.9 679.5 122.9 675.5 118 672.2 118.1 669.1 123.5 667.8 125.7 666 127.8 665.2 128.1 664.3 128.5 661.6 127.3 658.1 125 651.6 120.6 648 120.4 645.3 124.1 642.8 127.6 642.2 131.9 644 133.7 645.4 135.1 645 135.2 639.4 135.2 636.1 135.2 633.3 134.9 633.3 134.6 633.3 133.6 635.5 130.1 636.5 129.4 638.1 128.4 632.5 123.2 628.5 122 623.6 120.6 620.9 122.5 619.4 128.6 618.9 131.2 618.6 133.7 619 134.3 619.4 134.8 617.8 135.2 614.5 135.2L609.4 135.2 610.4 132C611.7 127.9 610.9 126.3 606.9 124.6 605.2 123.9 603.7 122.8 603.7 122.3 603.7 120.2 600.7 121.5 599.3 124.2 598.4 125.7 596.8 128.4 595.6 130.2 593.8 133.1 593.7 133.3 595.2 134.2 596.4 134.9 595.6 135.1 591.8 135.2 587.6 135.2 586.9 135 588 133.9 590 131.4 588.7 128.3 584.6 126.4 582.5 125.4 580.2 124 579.4 123.4 577.2 121.5 572.7 126.9 572.7 131.5L572.7 135.2 567.9 135.2C564 135.2 563.1 134.9 563.5 133.8 563.9 133.1 564.4 132.4 564.8 132.4 566.2 132.4 564.5 128.6 562.6 127.3 561.6 126.6 558.8 125.6 556.7 125.1 551.7 124 549.6 125.6 548.6 131.4L548 135.2 543.4 135.2C539.1 135.2 538.9 135.1 539.8 133.2 541.1 130.9 539.4 128.7 534.7 126.5 530.4 124.4 529.9 124.5 527.3 128.7 526 130.8 524.3 132.8 523.4 133.1 521.9 133.7 512.7 129.4 509.5 126.6 507.8 125 507.2 124.9 505.9 126 505.1 126.7 503.6 129.1 502.7 131.2 501 135.1 500.9 135.2 496.4 135.2 492.4 135.2 491.9 135 492.3 133.4 493 131 489.7 128.1 485.6 127.2 481.8 126.6 480.6 127.3 479.1 131.8 478.2 134.4 477.7 134.7 474.2 135 471.1 135.3 469.9 134.9 469 133.6 468.2 132.6 466 130.6 463.9 129.2L460.1 126.6 457.4 129.2C455.9 130.6 454.4 132.6 454.1 133.5 453.3 136 447.9 135.7 443.7 132.9 441.9 131.6 439.8 130.6 439.3 130.6 438.7 130.6 438 129.7 437.7 128.7 436.9 126 434.8 127.3 432.9 131.6 431.2 135.1 431.1 135.2 426.2 135.2 423.5 135.2 421.3 134.8 421.3 134.4 421.3 133.9 419.5 132.9 417.4 131.9 415.2 131.1 413.1 129.9 412.9 129.4 412.5 128.8 411 129.8 409.3 131.9 406.8 134.7 405.7 135.2 402.4 135.2 400.3 135.2 396.6 134.2 394 133 389.3 130.6 387.7 130.8 385.2 133.7 383.6 135.6 373 135.7 371.4 133.9 369.4 131.4 365.6 131.2 362.7 133.3 360.4 135.1 359.2 135.3 353.3 134.8 349.7 134.5 345.2 134.1 343.2 133.7 341 133.3 339.3 133.5 338.4 134.3 337.4 135.1 321.6 135.3 268.3 135.1L199.5 134.7 193.5 137.6C178.4 144.7 170.9 160.9 175.4 176.3 177.2 182.6 178.8 185.3 183.1 189.9L186.3 193.3 181.6 194.4C171.5 196.5 163 203.3 158.5 212.8 156.4 217.3 156 219.3 156 226.4 156 233.6 156.4 235.5 158.7 240.5 161.8 247.2 168.3 253.8 174.8 256.8 178.1 258.2 181.6 258.8 189 259.1L198.8 259.4 198.3 263.4C198 267.1 198.2 267.8 201.8 271.5L205.6 275.5 209.3 271.6C213.4 267.1 213.9 264.5 210.9 261.4L209 259.3 215.5 259.3 221.9 259.3 221.5 264.3C221.1 269.1 221.2 269.4 223.9 270.7 227.3 272.5 232.8 272.7 234 271 235.2 269.5 237.4 261.9 237.1 260.4 237 259.6 238.3 259.3 241.1 259.3L245.4 259.3 244.8 263.2C244.4 266.3 244.6 267.6 245.7 268.8 247.6 270.6 254.3 272.6 256.1 271.9 257.7 271.3 262.2 261.3 261.5 260.1 261.2 259.6 263.1 259.3 265.8 259.3L270.6 259.3 269 261.7C267.6 263.8 267.6 264.2 269 266.3 270.7 269 273.9 270.4 278.3 270.4 281.1 270.4 281.8 269.9 283 267.1 283.6 265.4 284.3 262.9 284.3 261.6 284.3 259.4 284.6 259.3 288.2 259.3 292.1 259.3 292.1 259.3 292.1 262.7 292.1 265.9 292.3 266.1 297.6 268.2 302.8 270.2 303.2 270.3 304.8 268.8 305.7 268 307 265.5 307.6 263.2 308.5 259.3 308.6 259.3 312.7 259.3 316.2 259.3 316.7 259.4 315.9 260.8 314.5 263.5 315.6 264.8 320.9 267.1 326.7 269.7 328.6 269.4 329.4 265.6 330.1 262 333 259.3 336.1 259.3 338.1 259.3 338.8 259.7 339.1 261.2 339.4 264 343.8 266.9 347.3 266.9 349.6 266.9 351.1 266.1 353.9 263.1 358.4 258.2 361.1 258.1 364.9 262.5 366.9 264.7 368.6 265.7 370.3 265.7 371.9 265.7 374.3 264.4 376.6 262.5 380.6 259.1 386.1 258 386.1 260.6 386.1 262.3 390.1 264.4 395.3 265.6 398.7 266.4 399.3 266.3 400.5 264.5 401.2 263.4 401.9 261.9 401.9 260.9 401.9 259.5 402.7 259.3 406.5 259.3 409.1 259.3 411.1 259.7 411.1 260.3 411.1 260.7 412.9 261.9 415.1 262.9 422.4 266.1 422.7 266.1 424 262.5 425.1 259.4 425.3 259.3 429.7 259.3 432.2 259.3 434.3 259.6 434.3 260.1 434.3 260.6 435.8 261.5 437.8 262 439.6 262.7 441.9 263.8 442.9 264.6 444.3 265.9 444.6 265.8 446.3 264.4 447.3 263.4 448.3 261.9 448.6 261 449.5 258.2 457.3 258.6 461.7 261.6 463.5 262.9 465.8 263.9 466.9 263.9 467.8 263.9 469.6 262.9 470.9 261.6 472.9 259.6 474.2 259.3 478.3 259.3 481.6 259.3 484.7 259.9 487 261.1 491.7 263.4 493.1 263.4 494.7 261 496 259.3 496.8 259.2 503.4 259.6 512 260.3 512.5 260.3 525.2 259.6 530.6 259.4 536.6 259.5 538.3 260.1 540.4 260.6 541.7 260.6 541.7 260.1 541.7 259.6 578.1 259.3 632.9 259.3L724.2 259.3 722.7 262C721.9 263.5 721.3 265.6 721.3 266.7 721.3 267.9 720.6 268.9 719.4 269.2 716.8 269.9 717.1 270.9 721.5 274.1 726.1 277.5 729.8 277.7 732.9 274.6 737.4 270.1 736.7 264.2 731.3 261.9 726.3 259.9 727.7 259.3 737.6 259.3 745.4 259.3 747.2 259.5 746.6 260.4 746 261 744.9 263.7 744 266.4 741.9 272.3 742.6 273.5 749.7 275.6 755.8 277.3 756.9 276.8 758.9 269.7 760.3 265 760.3 264.5 758.7 262.9 757.9 261.9 755.8 260.7 754.3 260.3 752 259.6 753.6 259.4 760.8 259.4L770.2 259.3 769.2 262.7C768.6 264.6 767.6 266.9 766.8 267.9 765.6 269.4 765.6 269.7 767.7 271.8 770.6 274.7 777 276.2 779.4 274.4 781.4 273.1 783.9 264.7 783 262.5 782.7 261.7 781.5 260.6 780.4 260.2 778.7 259.5 779.2 259.4 783.1 259.4 788.3 259.3 788.2 259.2 789.4 266.4 790.1 271.3 791 271.4 799.7 267.2 807.2 263.6 813.9 258 817.8 251.9 821.4 246.2 821.2 245.4 816.1 245.4 813.8 245.4 812 245.1 812.2 244.6 820.6 228.4 818.3 213.3 806 201.9 801.8 198.1 799.4 196.8 794 195.2L787.2 193.2 791.2 188.3C804.6 171.9 799.2 147.2 779.8 137.8L773.6 134.7 750.3 134.7C737.4 134.7 726.9 134.5 726.9 134.4 726.9 134.2 727.8 132.4 728.9 130.5L730.8 126.9 726.3 121.6C723.7 118.7 721.3 116.2 720.7 116 720.3 115.9 719.2 116.8 718.3 118.1ZM675.6 263.1C674.4 264.4 672.9 267.2 672.2 269.9 671.3 273.9 671.4 274.6 672.8 275.6 674.7 277 684.1 279.3 684.8 278.4 685.2 278.1 685.6 276.5 686 274.8 686.4 273 687.4 271.4 688.7 270.8 689.8 270.4 690.7 269.7 690.7 269.4 690.7 268.1 686.8 264.8 685.2 264.8 684.2 264.8 682.6 264 681.8 263 679.7 260.6 678.4 260.6 675.6 263.1ZM699.9 263.8C698.4 265.3 697.2 267.1 697.2 267.9 697.2 268.6 696.3 269.4 695.2 269.7L693.1 270.3 695.4 272.7C696.9 274.3 698.2 274.9 699.5 274.6 700.6 274.4 702.5 273.9 704 273.6 705.9 273.1 706.5 273.2 706.5 274.4 706.5 276.7 707.7 276.3 710.6 273.1 713.2 270.5 713.3 270.2 712 267.8 710.6 265.4 705.2 261.1 703.5 261.1 703.1 261.1 701.4 262.3 699.9 263.8ZM605.2 265.1C604.4 266.2 602.9 269.1 601.8 271.5 599.4 276.5 600 278.1 604.8 279.2 606.3 279.5 608.4 280.6 609.4 281.7 611.7 283.9 613.4 282.8 614.4 278.6 614.7 277.1 616 275.1 617.3 274.1L619.7 272.2 617.6 269.9C616.4 268.6 614.9 267.6 614.4 267.6 613.7 267.6 611.7 266.6 609.8 265.3L606.5 263.1 605.2 265.1ZM650.9 266.3C650.3 268.3 649.2 270.9 648.3 272.1 647 274.3 647.1 274.5 649.4 276.5 650.7 277.7 653.4 279.1 655.3 279.5 659.8 280.8 662.5 279.1 663.9 274 665.7 267.1 663.7 264.4 656.1 263.3 652 262.8 652 262.8 650.9 266.3ZM627.8 266.3C627.2 267.6 626.9 269.1 626.9 269.5 626.9 270 626 271.2 624.9 272.3 623.1 274.2 623.1 274.3 624.7 276.1 628.6 280.5 634.7 281.8 637.3 278.9 639.6 276.4 641.9 270.5 641.2 268.4 640.8 267.3 639 266.2 635.9 265.3 629.5 263.4 628.8 263.5 627.8 266.3ZM580.6 268.1C579.6 269.5 578.3 272.1 577.8 274 576.9 276.9 577 277.5 578.8 278.9 579.9 279.8 581.6 280.6 582.5 280.6 583.4 280.6 584.7 281.4 585.4 282.3 587 285 589.3 283.3 592.3 276.9L594.9 271.6 590.6 268.7C585.6 265.1 583.1 265 580.6 268.1ZM555.6 268.4C552.8 273.6 553 280.6 555.8 280.6 556.5 280.6 558.7 281.4 560.6 282.4L564.4 284.4 566.8 281.6C569.3 278.9 571.1 272.2 569.9 270.3 567.8 266.9 557.2 265.5 555.6 268.4ZM487.1 268.9C486.7 269.4 485.6 271.7 484.7 273.8 483.9 275.9 482.6 277.9 481.9 278.1 479.6 279 481.9 282.1 485.6 283.3 487.4 283.9 489.6 285.4 490.6 286.7 492.2 288.7 492.6 288.8 493.8 287.5 494.6 286.8 495.5 284.9 495.8 283.3 496.2 281.9 497.5 279.7 498.8 278.7 501.1 276.9 501.1 276.8 499.5 275 496.7 271.9 488.1 267.6 487.1 268.9ZM532.3 271.4C531.7 273.4 530.3 275.7 529.3 276.5 527.3 277.9 527.3 277.9 529.9 280.1 532.5 282.4 538.8 284.6 541.5 284.1 543.3 283.7 547.2 277.1 547.2 274.4 547.2 272.8 546.1 271.7 542.6 269.9 535.8 266.5 533.7 266.8 532.3 271.4ZM511.2 271.2C504 279 504.2 278.5 506.1 280.7 507.1 281.8 509.3 283.2 510.9 284 513.4 285 514.4 285 517 283.9 518.7 283.2 521 281.3 522.1 279.8L524.2 276.9 520.8 273.3C516.5 268.4 514.3 268 511.2 271.2ZM439.4 271.5C435.9 273.4 433.4 282.9 436.1 284.3 436.9 284.7 439.4 285.9 441.7 286.9L445.7 288.9 447.9 286.9C449.9 284.9 451.9 280 451.9 276.7 451.9 273.5 442.7 269.6 439.4 271.5ZM460.2 276.4C459.1 279.8 458.5 282.9 458.9 283.3 459.4 283.7 461.3 284.5 463.2 285.2 465.1 285.7 466.7 286.9 466.7 287.6 466.7 288.3 467.2 288.9 467.9 288.9 469.5 288.9 471.7 286.4 473.1 282.6 473.8 281 474.7 279.6 475.2 279.6 475.6 279.6 475.9 278.5 475.7 277.1 475.4 274 471.9 271.6 466.6 270.8L462.2 270.2 460.2 276.4ZM414.5 273.9C412.5 276.1 411 280.6 411.6 282.5 411.9 283.4 414.2 285.6 416.7 287.4L421.2 290.6 424.9 286.4C429.2 281.6 429.6 279 426.7 276.1 422.5 272.2 416.9 271.2 414.5 273.9ZM278.4 273.8C277.9 274.7 266.1 322.5 265.2 327.1 264.6 330.3 264.4 330.5 263.1 329.3 262.2 328.5 259.2 327.2 256.1 326.4 251.6 325.1 250.6 325 249.5 326 248.1 327.5 246.3 336.5 247.1 337.8 247.4 338.2 249.6 339.5 252.1 340.6 254.5 341.7 256.5 343.1 256.5 343.9 256.5 346.4 259 344.4 260.6 340.6 261.6 338.7 262.4 337.1 262.6 337.3 263.2 337.9 259.9 350.6 258.9 351.1 258.3 351.5 257.5 350.9 256.9 349.9 256 348.2 255.8 348.2 253.1 351.1 248.6 355.9 247.8 358.1 249.4 360.6 250.3 361.9 252.1 363.6 253.7 364.5 256.2 365.9 256.6 366.6 256.1 369 255.7 370.5 254.7 372.6 253.7 373.6 252.7 374.7 251.9 376 251.9 376.5 251.9 376.9 250.8 378.9 249.5 380.7L247.2 384.2 250 385.6C251.9 386.7 252.7 387.6 252.4 388.7 252.1 389.5 251.3 394.3 250.5 399.1 249.6 403.9 248.6 408.7 248.1 409.7 247.7 410.7 247 413.9 246.8 416.7 246.5 419.4 245.4 427.5 244.3 434.4L242.4 447.1 237.9 446.6C233.5 446.1 233.2 446.2 229.6 449.8 226.2 453.2 226 453.7 226.9 455.9 228.4 459.1 231.4 460.9 236 461.7 239.2 462.1 239.8 462.6 239.8 464.4 239.8 468.1 238.9 469.4 236.5 468.9 233.5 468.1 230 471.9 229.2 476.8 228.4 481.5 229.3 482.8 234.6 484.3 238.5 485.4 238.8 485.6 240.2 490.6 243.2 501.7 244.3 509.3 247.2 544 249.6 572.4 255.3 618.1 257.1 624.4 257.5 625.9 257.2 626.1 255 625.6 250.6 624.4 242.8 618.8 234.5 610.6 230.4 606.5 226.7 603.3 226.4 603.5 226.1 603.8 225.9 606.5 225.9 609.4 225.9 615.6 225.5 615.8 220 613 218 612 216.1 611.4 215.6 611.6 214.4 612.4 211.1 620 211.1 622.3 211.1 624.2 212 625.1 216.3 627.1 219.2 628.6 221.6 629.6 221.8 629.4 221.9 629.3 222.6 628.1 223.4 626.9 225 624.6 225 624.7 225 631.3 225 634.9 224.8 638 224.5 638 224.3 638 222.5 637.3 220.6 636.6 216.7 634.9 214.8 635.3 214.8 637.9 214.8 638.9 213.6 641.2 212 642.9L209.3 646 214.7 649.4C217.8 651.3 221 652.8 222.1 652.8 223.8 652.8 224.1 653.3 224.1 656.6 224.1 659.9 223.9 660.3 222.2 659.7 221.2 659.4 219.5 659.4 218.5 659.7 216.2 660.5 213 666.6 213 670.3 213 672.6 213.4 673.2 215.6 673.7 220.6 674.8 221.3 675.2 221.3 676.6 221.3 677.4 221.9 677.8 222.6 677.5 224 676.9 225 679.4 225 683.1 225 685.6 223.6 685.7 221.6 683.3 219.3 680.6 218.7 680.9 216.6 685.8 215.6 688.3 214 690.8 213.1 691.5 211.8 692.6 211.9 693.1 215.7 696.4 219.1 699.4 220.5 700 223 699.7 225.6 699.4 225.9 699.7 225.9 701.9 225.9 703.1 226.2 705.2 226.6 706.4 227 708.1 226.9 708.4 225.4 708.1 219.4 706.3 218.7 706.3 217.2 708.5 216.5 709.6 215.6 712.8 215.2 715.4L214.6 720.2 219.4 721.8C222 722.6 224.4 724 224.7 724.7 225.2 726 225.5 725.9 226.5 724.5 228 722.6 228.3 723.2 229 729.4 229.5 734 228.3 734.5 223.9 731.4 220.6 729 219.6 729.7 217.2 735.9 215.1 741.5 215.3 744.4 217.7 744.4 218.7 744.4 220.8 745.3 222.3 746.4 225.6 748.7 227.5 748.1 228.9 744.4 229.4 742.9 230 741.8 230.3 742 230.6 742.2 231.1 745.5 231.6 749.3 232 753 232.6 756.9 232.9 758.1 233.3 760.2 233.2 760.1 229.5 757.4 227.4 755.9 224.7 754.6 223.5 754.6 221.2 754.6 218.5 757.8 218.5 760.4 218.5 761.4 217.8 762 216.7 762 214.1 762 214.4 763 218.1 766.9 222.6 771.5 225.6 771.5 230 767.1 231.9 765.4 233.4 763.9 233.6 763.9 233.8 763.9 234.3 766.3 234.6 769.2 235 772 237.3 786.2 239.8 800.6 244 824.3 244.4 827.1 243.3 831.4 242.2 836.2 243.1 838.9 245.8 838.9 246.5 838.9 247.3 840.6 247.6 843.1 248.1 846.4 247.9 847.7 246.4 849.7 245.4 851.1 244.4 854.2 244.3 856.5 244 860.7 244.6 861.5 251 864.1 251.3 864.3 251.9 865.9 252.2 867.8 252.8 871.1 252.7 871.3 250.6 871.3 247.7 871.3 245.8 873.9 244.5 879.6 243.3 884.9 244.5 886.4 251.3 887.9 256.4 889 257.3 890.1 257.4 894.7 257.4 896.1 256.8 896.4 253.1 896.1 249.2 895.8 248.5 896.1 247.5 898.2 246.9 899.5 246.3 902.4 246.1 904.6 245.8 908.7 245.9 908.8 249.5 910 251.6 910.6 253.8 911.9 254.4 912.7 255.5 914.1 255.6 914.1 257.4 912.5 258.4 911.6 259.3 910.2 259.3 909.4 259.3 906.3 260.3 909.4 261.5 916L262.7 923 260.1 922C258.7 921.6 257 920.6 256.4 919.8 255.8 919.1 254.4 918.5 253.1 918.5 251.3 918.5 250.5 919.4 249.1 922.4 248.1 924.5 246.5 926.9 245.4 927.8 243.3 929.4 243.3 929.4 247.8 931.9 250.3 933.3 253.8 935.4 255.6 936.4 257.3 937.4 258.5 938 258.1 937.6 257.8 937.1 258.1 936.2 258.8 935.5 259.5 934.8 260.6 932.5 261.1 930.6 261.7 928.5 262.5 926.9 262.9 926.9 263.3 926.9 264.3 930.4 264.8 934.5L266 942.3 272.8 945.6C276.6 947.5 279.5 948.6 279.4 948.1 279.3 947.7 281.5 945.8 284.3 944.2 288.7 941.5 293 936.4 319.3 902.8 335.6 881.7 349.7 863.8 350.5 863.1 351.5 862 352 861.9 353.1 862.9 353.9 863.5 354.6 863.6 354.9 863.2 355.8 861.9 360.2 833.9 361.4 822.5L362.5 811.3 372.7 818.6C400.6 838.7 426.3 851 452 856.7 463 859.1 504.3 860.1 518.2 858.3 549.7 854.4 579.4 840.8 614.2 814.6 621.4 809.3 627.6 805.1 627.9 805.4 628.1 805.7 628.9 809.7 629.5 814.4 631.9 832.5 636.4 854.7 637.6 854.3 638.2 854 649.4 870.2 666.2 895.6 681.3 918.5 693.9 937.8 694.1 938.3 694.4 938.9 698.7 941.6 703.8 944.4 711 948.3 713 949.8 712.7 951 712 953.3 727.6 945.6 728.3 943.2 728.7 942 729.5 941.6 731 941.9 732.8 942.2 733.5 941.6 735 938.5 738 932.5 738.3 930.2 736.4 928.5 735.5 927.7 733.9 926.9 732.9 926.7 731.3 926.4 731.1 925.7 731.3 922.2 731.5 920 732.4 917.1 733.4 915.9 734.4 914.6 735.2 912.9 735.2 912 735.2 911.1 735.8 909.9 736.6 909.3 738.5 907.7 738.3 905.8 736.1 905.1 733.8 904.4 733.8 902.9 736 887.5 737 880.8 738.1 872.7 738.4 869.2 738.8 865.7 739.4 863 739.7 863 740 863 742.1 864.4 744.4 866.2 751.6 871.9 754.3 871.6 756.9 864.4 759.3 858.3 758.6 856.3 753.8 854.5 751.5 853.7 749.4 852.3 749.1 851.4 748.5 849.9 748.4 849.9 746.9 851.3 746.1 852.1 745 854.5 744.4 856.6 743.5 859.9 741.4 862 740.2 860.8 739.7 860.5 741.4 845.2 742.1 842.9 742.3 842.2 743.6 842.8 745.5 844.5 747 846 748.6 847.2 749 847.2 749.4 847.2 751.4 845.7 753.5 843.9 759.3 839 758.9 835.3 752 830 747.9 826.9 747.9 826.9 745.9 828.6L744 830.5 744.3 825.8C744.6 821.2 745.2 820.6 746.9 822.3 749.2 824.5 752.8 822.4 754.7 817.8 755.7 815.5 757 813.1 757.6 812.8 759.3 811.9 756.9 809.4 751.7 806.9 747.7 804.8 747.2 804.3 747.2 801.5 747.2 798.9 747.5 798.4 749 798.8 751.2 799.4 754.4 796 755.6 791.8 756.9 786.6 756.7 785.4 753.8 783.8L751.1 782.4 752.9 777.8C754.5 773.2 756.6 753.6 756.4 742.6L756.3 738.4 755.1 741.7 753.9 744.9 753.8 742.1C753.7 740.6 754.2 733.3 754.7 725.9 755.2 718.6 755.9 704.4 756.4 694.3 756.8 684.2 757.3 675.7 757.6 675.5 758.1 674.8 764.9 677.6 766.7 679.3 767.9 680.3 768.6 679.9 771.6 676.2 776.1 670.6 775.9 668 770.8 665.1 765.4 661.9 762.2 662.2 760.7 665.9 758 673 757.9 672.9 757.4 662.5 757.1 656.9 756.9 652.2 757 652 757 651.9 759.7 652.7 763 653.8 766.1 654.8 769.3 655.5 769.9 655.2 770.6 655 771.4 653.2 771.7 651.4 772.1 649.1 773 647.8 774.2 647.5 777.8 646.6 775.5 643.1 769.7 640.8 768.1 640.2 766.6 639.1 766.3 638.4 765.7 636.9 762.7 637.6 760.7 639.7 759.9 640.6 758.7 643 758 645 756.7 648.5 756.6 648.4 756.5 638.4 756.3 627.5 755.4 612.2 753.8 593.5 753.2 587.1 751.9 571.3 750.8 558.3 749.8 545.4 748.6 533.5 748.2 532L747.6 529.4 743.7 534.4C741.6 537.2 738.4 542.6 736.7 546.4L733.4 553.2 734 542.6C734.3 536.5 735 530.8 735.7 529.3 736.5 527.7 737.7 520.6 738.4 513.5 739.3 506.3 740.6 497.5 741.4 494 742.2 490.4 743 484 743.1 479.7 743.1 475.3 743.6 471.8 744.1 471.6 745 471.3 744.8 421.6 744 418.7 743.7 418.1 742.7 417.6 741.6 417.6 740.2 417.6 739.8 417.2 740.2 416.1 742.8 409.3 741.9 405.9 737 404.6 735 404.1 732.9 403.9 732.4 404.2 731.9 404.4 731.5 403.9 731.5 402.9 731.5 397 718.8 337.1 709.6 299.8L703.5 275 701.1 275.6C699.7 275.8 698.1 276.2 697.6 276.4 696.9 276.6 697 278.6 698.3 283.1 701.4 293.8 702.6 301.6 704.6 323.1 706.8 345.6 707.7 350.9 714.2 376 718 390.6 722.2 411.6 722.2 415.6 722.2 417.1 718.1 417.2 667.4 416.9 637.2 416.8 603 416.9 591.2 417.5 572.3 418.2 569.1 418.6 562.3 420.7 553.1 423.7 544.4 429.4 540 435.3L536.7 439.7 520.9 439.3C506.9 438.8 494.4 439.4 475.5 441.3L469.9 441.9 467.2 436.7C462.1 426.7 449.6 418.2 435.5 415.3 423.2 412.8 381.6 411 323.1 410.5 292.3 410.2 266.9 409.8 266.8 409.6 266 408.9 287.1 285.8 289 280.2 290.4 275.8 290.5 274.4 289.5 273.9 288.1 273 279 273 278.4 273.8ZM360.2 425.9C395.7 427 421.9 428.5 429.6 429.7 441.2 431.6 449.9 436.9 454.3 444.6 456.9 449.4 456.9 449.8 456.9 463 456.8 474.8 456.4 477.7 453.9 487 445.2 520.2 433 538.3 411.2 550.6 398.9 557.6 386.2 561 369 561.8 326.8 563.7 291.5 544.1 280.5 512.4 276.1 499.8 274.4 469.8 277.2 456.4 278.7 449.4 282.1 442.1 285.4 439.2 292.4 432.7 305.6 427.2 317.9 425.9 327.5 424.9 329.1 424.9 360.2 425.9ZM679.9 434.5C694 438.6 702.2 445.2 705.4 454.7 711.5 473.2 709.9 504.4 702.2 520.2 685.6 554.4 631.8 569.7 594 550.9 575 541.6 562.6 525.9 554.4 500.8 549.4 485.7 547.8 476.9 547.7 464.4 547.7 454.2 547.9 452.8 550.1 448.6 553 443 559.3 438 566.5 435.6 574 433.2 589.4 432.6 635.2 432.9 668.9 433 675.3 433.2 679.9 434.5ZM528.4 455.2L531.2 455.7 531.8 466C533.4 498.9 548.1 534.4 566.9 551.5 590.3 572.4 623.7 579.7 657.5 571.2 692.3 562.4 716.9 538.3 722.7 507.3 723.4 503 724.3 493.4 724.4 486.3 724.5 475.7 724.8 473.1 725.8 473.1 726.9 473.1 727 477.2 726.5 499.7L725.9 526.4 717.7 543.1C698.8 581.8 680.4 608.8 657 631.9 639.3 649.6 622.8 660.6 604 667.6L596.9 670.2 589.4 663.9C550.6 631.5 501.6 619.6 455 631.5 432 637.4 408.7 649.5 391.8 664.4 384.7 670.6 384.4 670.6 371.6 665 333.1 648.4 296.2 605.8 264.9 541.7L256.9 525.5 256.6 516.2C256.2 506.3 258.1 471.9 259.2 467.8 259.6 466.3 260.1 470.8 260.5 479.6 261.9 514.2 268.7 532.1 286.9 549.2 294.7 556.7 299.2 559.7 309 564.7 344.5 582.5 390.5 581.4 422.2 561.9 431.2 556.4 444.8 543.3 450.4 534.9 462 517 470.9 489.4 472.8 465.1L473.4 456.7 481.9 455.7C491.5 454.8 524.4 454.4 528.4 455.2ZM740.5 604.6L744.4 614.4 740.6 618C736.8 621.3 730.6 625 726.3 626.3 724.4 626.9 724.4 626.9 725.5 620.2 726.1 616.5 727.3 607.8 728.2 600.9 730.6 582.2 730.2 582.8 733.6 589.4 735.2 592.4 738.2 599.3 740.5 604.6ZM555.6 685.7C555.6 686 554 689.3 552.1 693 545.4 705.9 532.8 715.7 517.5 720.1 508.8 722.5 476.4 722.5 467.1 720.1 456.7 717.3 444.8 711.1 438 704.8 432.7 700 425 689.2 425 686.6 425 685.9 446.6 685.6 490.3 685.4 526.2 685.2 555.6 685.4 555.6 685.7ZM602.7 692.1C612.2 694.4 620.8 699.5 629.3 707.9 637.6 716.1 639.8 720.2 642 730.9 644.6 743.6 643.7 749.6 638.1 755.7 630.7 764 619.2 768.1 605.6 767.4 598.7 767.1 596.6 766.6 590.4 763.6 571.3 754.5 559.9 739.1 559.9 722.2 559.9 699.6 578.6 686.5 602.7 692.1ZM363 462.2C355.6 465.9 351.6 471 349.9 478.2 347.7 488.3 352.1 498.3 361.5 504.2 365 506.3 367.3 506.9 372.2 507.2 380.1 507.7 383.9 506.5 389.2 501.8 399.1 493.1 400.8 479.2 393.2 469.3 388.6 463.1 382.8 460 375.3 459.5 369.5 459.2 368.4 459.4 363 462.2ZM389.3 466.8C394.2 470.6 391.4 478.1 385 478.1 379.1 478.1 376.5 470.4 381.1 466.8 382.5 465.6 384.3 464.8 385.2 464.8 386.1 464.8 387.9 465.6 389.3 466.8ZM602.5 460.6C594.4 463.6 587.8 471.9 586.6 480.6 584.6 494.4 596.3 507.4 610.6 507.4 620.3 507.3 627.8 502.4 632 493.1 637.4 481.7 632.4 467.8 620.8 461.9 616.2 459.4 607.2 458.8 602.5 460.6ZM626.3 466.8C631.2 470.6 628.4 478.1 622 478.1 616.3 478.1 613.8 471.3 618.1 467.1 620.8 464.4 623.1 464.3 626.3 466.8ZM390.1 274.3C389.4 275 388.5 277.5 388 279.9 386.8 285.6 387.8 287.6 392.4 288.8 399.4 290.6 399.4 290.6 402.1 285 403.6 282 404.6 279.1 404.4 278.3 403 274.6 392.2 271.7 390.1 274.3ZM366.2 276.3C365.3 277.6 364.4 280.6 364.2 282.8L363.7 286.9 368.4 288.4C371 289.3 373.3 290.4 373.6 290.8 374.5 292.2 377.6 290.1 379.2 287 379.9 285.6 380.6 282.9 380.6 281.1 380.6 277.1 377.9 275 371.9 274.4 368.2 273.9 367.6 274.2 366.2 276.3ZM342.6 278.4C341.9 280.4 340.9 282.9 340.2 283.9 339.2 285.6 339.3 286.1 341.1 287.9 343.5 290.1 348.7 291.3 352.2 290.4 353.8 290 354.9 288.6 356 285.6 357.5 281.8 357.6 281.4 356.1 279.2 354.3 276.4 351.2 275 346.8 275 344 275 343.5 275.4 342.6 278.4ZM202.1 281.7C198.6 285.6 198 287.3 199.2 290.6 200.3 293.5 204.5 298.1 206.1 298.1 207.6 298.1 213 292.8 213.9 290.4 214.8 287.8 213 284.4 208.9 281.2 207.1 279.8 205.5 278.7 205.3 278.7 205.2 278.7 203.7 280.1 202.1 281.7ZM249.2 281.1C248.1 282.4 246.9 284.9 246.3 286.7 245 290.5 245.9 292 249.7 293.1 251.1 293.3 253.2 294.4 254.4 295.5L256.8 297.2 258.5 294.7C259.4 293.2 260.2 291.3 260.2 290.2 260.2 289.1 261 287.9 262 287.4 263.8 286.6 263.9 286.5 262.4 284.4 260.9 282.3 254.5 278.8 252.1 278.7 251.6 278.7 250.2 279.8 249.2 281.1ZM224.3 280.8C222.6 282.8 221.3 290 222.3 291.8 222.8 292.7 224.4 293.6 226.1 294 227.8 294.4 229.9 295.3 230.8 296.1 232.3 297.4 232.6 297.3 234.6 295.5 237.4 292.9 239.4 285.9 238 283.4 236.3 280.1 226.4 278.2 224.3 280.8ZM770 284C769.4 285.5 768.2 288.1 767.8 290.1 766.9 293.3 766.9 293.9 768.9 295.8 771.4 298.3 777.4 299.8 779.5 298.4 780.3 298 781.3 296.3 781.8 294.8 782.2 293.3 783.2 291.4 784.1 290.6 786.3 288 783.5 284.7 777.4 283 771.1 281.1 771.6 281 770 284ZM748.5 283.1C746.9 284.2 743.2 293.3 743.8 294.8 744.7 297.1 749.1 299.4 752.9 299.4 756.5 299.5 756.6 299.4 758.8 294.1 760.6 289.8 760.8 288.2 760 287.2 757.8 284.6 750.4 281.9 748.5 283.1ZM723.1 285.5C723.1 286.1 722.3 288.2 721.3 290.3 720.3 292.3 719.4 294.4 719.4 295 719.4 298.1 730.1 302.3 733.1 300.4 735.2 299.1 737.2 290.1 736 287.9 734.5 285 723.1 282.9 723.1 285.5ZM606.6 289.9C604.5 291.5 602.5 293.8 602.2 295.1 601.6 297.5 603.2 301.5 605.1 302.2 606.5 302.8 616.9 299.1 617.8 297.7 618.8 296.4 617.7 293.4 615.4 290.9 611.9 287 610.7 286.9 606.6 289.9ZM582.1 290.6C580.7 291.9 579.2 294.4 578.6 296.2 577.7 298.8 577.8 299.5 579.4 301.7 580.3 303 582.8 304.5 584.7 305.3 591 307.5 593.6 305 593.9 296.5 594 293.5 593.7 293.1 590.3 292 588.2 291.3 586.1 290.1 585.6 289.4 584.7 288.2 584.2 288.4 582.1 290.6ZM535 293.2C533.7 294.7 532.4 296.7 532.2 297.7 532 298.7 531.3 299.5 530.6 299.5 528.1 299.5 528.7 301.7 532.1 304.4 538.1 309.2 539.2 309.1 544.7 303.8L549.5 299.1 545.2 294.9C542.8 292.6 540.1 290.7 539.1 290.7 538.1 290.7 536.3 291.9 535 293.2ZM557.5 293.1C552.6 297.2 552.4 298.3 556.1 302.7 560.9 308.2 563.9 307.9 569.1 300.8 570.8 298.3 572 295.8 571.7 295.3 570.9 294 564 290.8 561.9 290.7 561 290.7 559.1 291.9 557.5 293.1ZM488.2 293.1C486.3 294.4 485 297.5 483.8 303.3 483.3 305.9 483.5 306.3 486.9 307.8 492.3 310.3 495.4 309.5 497.9 305.1 501 299.6 500.5 297 495.6 295.6 493.4 294.8 491.7 293.7 491.7 293 491.7 291.3 490.7 291.3 488.2 293.1ZM509.2 295.8C508.1 298.1 507.4 301.4 507.6 303.1 507.9 305.6 508.4 306.2 512.1 307.6 517.6 309.5 519.9 309 521.3 305.3 521.9 303.6 522.9 301.2 523.6 299.8 524.9 297.2 524.9 297.2 519.3 294.4 516.2 293 513.1 291.7 512.3 291.7 511.6 291.7 510.2 293.5 509.2 295.8ZM464.1 293.8C463.5 294.4 462.8 296.1 462.5 297.5 462.1 298.9 460.7 300.8 459.5 301.9 456.6 304.2 457.4 305.4 464.7 309.3L469.9 312.1 471.9 309.6C473.1 308.2 474.6 305.5 475.6 303.5 477.5 299.3 476.6 297.7 471.3 296.3 469.4 295.7 467.5 294.7 467.2 294 466.6 292.3 465.4 292.2 464.1 293.8ZM417.9 295.4C414.6 296.7 411.3 305.3 412.6 308.8 413 309.5 415.5 310.8 418.3 311.7 423.4 313.1 423.5 313.1 425.2 311.1 426.1 310 426.9 308.3 426.9 307.3 426.9 306.4 427.7 305.1 428.7 304.4 431.3 302.6 430.4 300.6 425.2 297.2 420.6 294.2 420.7 294.3 417.9 295.4ZM439.4 296.5C438.6 297.6 438 299.3 438 300.2 438 301 437.2 302.1 436.4 302.6 434.9 303.4 434.9 303.6 436.4 305.9 438.7 309.4 442.2 311.4 444.8 310.7 446.8 310.3 454.5 301.3 453.6 300.6 449.4 297.6 443.8 294.4 442.5 294.4 441.6 294.4 440.2 295.4 439.4 296.5ZM391.2 298.5C389.9 300.6 388 305.9 388 307.7 388 308.1 390.7 309.6 394.1 311.2 399.7 313.7 400.4 313.8 401.9 312.5 402.8 311.7 404 309.2 404.6 307 406.1 301.5 404.9 299.5 398.9 297.7 392.8 295.9 392.9 295.9 391.2 298.5ZM251.4 300.8C247.7 302.4 245.9 305.5 245.8 310.4L245.8 315.2 251.8 317.3C258.5 319.7 259.4 319.4 261 313.9 261.7 311.5 262.7 310.2 263.6 310.2 265.8 310.2 260.6 304.8 258 304.4 256.9 304.3 255.6 303.2 255.1 302 254.1 299.8 254.1 299.8 251.4 300.8ZM203.3 305.6C198.1 311.8 198.5 315.7 204.5 320.1L207.3 322.2 211.1 318.7C216 314 216 311.2 211.4 307.7 209.4 306.3 207.4 304.5 206.9 303.8 206.1 302.8 205.4 303.1 203.3 305.6ZM226 304.4C225 305.3 223.6 308 223 310.5 221.6 315.7 222.2 316.6 229.1 318.9 233.5 320.4 233.7 320.3 235.7 318.4 238.1 316.3 239.9 310.2 239.2 307.3 238.1 303.2 229.6 301.4 226 304.4ZM181.6 310.9C181 313.8 180.3 317.1 180 318.2 179.2 321.3 183.5 322.9 186.8 320.7 189.3 319.2 191.7 314.3 191.7 310.7 191.7 308.8 191 308.2 187.8 307.3 185.6 306.8 183.5 306.1 183.2 305.9 182.9 305.7 182.1 308 181.6 310.9ZM748.4 307C747.8 307.3 746.6 309.8 745.7 312.6 743.8 319.4 745.1 321.6 751.9 323.1 754.6 323.6 756.9 324 756.9 323.9 757 323.7 758.3 321.1 759.7 318.1 762.5 312.2 762.3 310.6 758.2 308.6 755.5 307.3 749.9 306.4 748.4 307ZM770.8 308.3C770 309.3 769 311.9 768.8 314.3L768.2 318.4 773.7 320.8C776.7 322.1 779.6 323 780.2 322.8 782.2 321.9 784.3 318.1 784.8 313.6 785.5 309.4 785.4 309.3 782.1 307.9 777.4 305.9 772.9 306.1 770.8 308.3ZM723.6 310.4C723.2 311.6 722.3 313.9 721.6 315.6 720.1 318.8 721 321.3 723.8 321.3 724.5 321.3 726.2 322.4 727.5 323.7 730.7 326.9 732.4 325.8 734.3 319.6 735 317 735.9 314.6 736.4 314.3 737.8 312.9 736.9 311.9 732.8 310.2 727.1 307.7 724.4 307.8 723.6 310.4ZM513 314.8C513 315.5 511.9 317.4 510.6 319.2 509.3 320.9 507.9 323.4 507.5 324.8L506.9 327.2 501.1 321.9C495.8 317.1 494.4 316 494.4 317 494.4 317.9 510.6 330.9 511.9 331.2 521.3 332.9 522.2 332.6 522.2 328 522.2 326.9 522.9 325.6 523.6 325.4 524.4 325 525 323.8 525 322.5 525 320.7 524.2 319.9 520.6 318.3 518.1 317.3 515.5 315.8 514.6 315 513.3 314 513 313.9 513 314.8ZM534.3 318.1C533.7 319.4 533.3 320.8 533.3 321.3 533.3 321.8 532.7 322.8 531.9 323.6 530.5 325 530.5 325.3 532.5 327.4 538.5 333.9 543.8 333.4 547.3 326.1 549.2 322.3 549.3 321.7 548.1 319.5 546.6 317 544.1 316 538.6 315.8 535.6 315.7 535 316.1 534.3 318.1ZM464.5 319C463.7 319.7 462.9 321.6 462.5 323.1 462.2 324.5 461.3 326.3 460.6 326.9 458.5 328.6 459 329.6 462.8 331.2 464.6 331.9 466.9 333.1 467.7 333.9 468.9 335 469.4 334.8 471.5 332.6 472.8 331.2 474.1 328.8 474.4 327.3 474.8 325.7 475.3 323.9 475.6 323.1 475.8 321.9 474.7 321 471.4 319.5 465.9 317.2 466.2 317.2 464.5 319ZM440.2 322.9C438.7 324.8 436.9 326.9 436.2 327.6 434.9 328.7 435.1 329.2 437.8 331.6 441.4 334.8 446.1 335.2 450.1 332.3 454.9 328.9 455.1 327.4 451.3 323.1 446.8 318.1 443.7 318.1 440.2 322.9ZM228.5 326.6C227.1 326.9 223.1 335.4 223.1 337.9 223.1 339 235 343.5 236.5 343 239.3 341.9 241.5 332.9 239.6 330.3 238.3 328.5 231 326 228.5 326.6ZM203.3 329.5C199.2 333.9 199.8 338.6 205.6 344L208.4 346.8 212.1 342.9C217 337.6 216.9 334.6 212 330.2 210 328.3 207.8 326.9 207.1 326.9 206.5 326.9 204.7 328.1 203.3 329.5ZM178.2 331.9C177.4 333.7 176.7 336.8 176.6 338.6 176.4 341.9 176.5 342 180.8 343.2 183.2 344 185.2 344.9 185.2 345.5 185.2 347 187.6 346.3 189.6 344.2 191.6 342 193.7 334.9 193 332.9 192.3 331.3 188.4 329.6 183.7 329 179.7 328.4 179.6 328.5 178.2 331.9ZM773.1 330.6C772.7 331.5 772.2 333 772.2 333.8 772.2 334.6 771.2 336.2 769.9 337.4L767.6 339.6 770.8 342.4C774 345.3 779.5 347 781.4 345.8 783.1 344.8 786.2 338 785.9 335.9 785.7 334.6 783.9 333.2 779.9 331.5 774.4 328.9 774.1 328.9 773.1 330.6ZM725 333.9C721.1 340.1 721.5 343.2 726.4 346 732.6 349.5 735.5 348.6 736.7 342.8 737.1 340.7 737.8 339.8 739 339.8 742.6 339.8 740.6 336.7 735.6 334.6 733.6 333.8 731 332.3 729.9 331.3L727.9 329.4 725 333.9ZM796.8 331.3C795.3 332.2 793.3 334.2 792.6 335.6 791.3 338.1 791.3 338.2 794.4 340.9 799.2 344.9 801.7 345.7 804.3 344 806.7 342.4 806.8 341.5 805.3 334.7 804.4 330.8 803.8 330.1 801.9 329.8 800.6 329.7 798.3 330.4 796.8 331.3ZM747.1 335.3L743.3 339.1 745.6 341.5C749.3 345.7 751.3 347.2 753.7 347.2 757.1 347.2 760.2 344.7 760.2 341.9 760.2 340.5 760.8 339.4 762 339.2 764.5 338.5 764.4 337.9 760.8 334.4 756.3 330 752.1 330.3 747.1 335.3ZM205.3 351.7C204.4 352.6 203.4 354.6 203.1 356.2 202.8 358.2 201.9 359.3 200.4 359.6 198.2 360.2 198.1 360.3 199.6 362.5 200.5 363.8 201.9 364.8 202.7 364.8 203.5 364.8 205.2 365.6 206.5 366.7 209.9 369.4 212.5 369.1 213.9 365.7 214.5 364.2 216.1 362 217.4 361 220.5 358.6 219.4 356.7 214.3 354.9 212.3 354.3 210 352.9 209.1 351.9 207.2 349.6 207.1 349.6 205.3 351.7ZM227.8 351.8C227.3 352.8 226.9 354.2 226.9 354.9 226.9 355.6 225.8 357.1 224.5 358.3L222.3 360.5 226.7 364.1C230.4 367.1 231.6 367.6 234.7 367.4 238.1 367.1 238.5 366.9 239.6 363.5 240.3 361.6 240.8 358.8 241 357.3 241.2 354.8 240.7 354.4 235.6 352.3 229 349.5 229 349.5 227.8 351.8ZM181.7 353.7C178.9 356.3 176.7 360.8 177 363.2 177.2 364.7 178.4 365.6 180.9 366.5 183 367.1 185 368.2 185.6 369.1 186.5 370.3 186.9 370.3 189.2 368.5 190.6 367.4 191.7 365.6 191.7 364.6 191.7 363.5 192.3 361.9 193.1 361.1 194.4 359.6 194.1 359.2 190.3 355.6 185.6 351.3 184.5 351.1 181.7 353.7ZM796.9 353.9C796.1 355.1 795.2 358.1 794.9 360.6L794.3 365.3 799.4 367.4C806.7 370.5 808.2 369.5 809.7 361 810.6 356 809.2 354.1 803.7 352.9 801.1 352.3 798.8 351.9 798.6 351.9 798.3 351.9 797.6 352.8 796.9 353.9ZM774.2 354C773.7 354.6 773 356.3 772.7 357.7 772.3 359.1 771.2 360.8 770.1 361.6 768.4 362.7 768.4 363.1 769.5 364.4 770.3 365.3 772.1 366.6 773.6 367.3 775.2 368 777.1 369.1 778.1 369.7 780.4 371.4 782.6 369.5 784 364.8 784.6 362.7 785.6 360.3 786.2 359.5 787.7 357.8 786.7 356.9 780.4 354.7 776.4 353.3 774.9 353.1 774.2 354ZM726 356.7C725.5 358.3 725.3 361.5 725.6 364.2 726.1 368.1 726.7 369 729.7 370.9 731.7 372.1 733.5 373.1 733.7 373.1 735 373.1 738.9 365.8 738.9 363.4 738.9 360 737.6 358.1 733.3 355.6 728.8 353 727.2 353.1 726 356.7ZM749.1 357.4C748 358.9 746.9 361.7 746.6 363.4 746 366.6 746.1 366.7 751.4 369 754.4 370.3 757.4 371.3 758.1 371.1 758.9 370.9 760.2 369.1 760.9 366.9 761.7 364.6 762.8 362.6 763.5 362.3 765.7 361.5 765 360.3 760.5 357.4 754.8 353.8 751.7 353.8 749.1 357.4ZM591.7 373.2C576.1 374.3 558.8 377.6 554.8 380.2 546.9 385.4 547.4 397.6 555.7 402.9 559.3 405 563.5 404.9 575 402.3 596 397.6 623.9 399.2 647 406.3 651.5 407.6 656.9 408.8 659.3 408.8 669.7 408.8 675.7 396.8 669.5 388.1 666.9 384.4 661.2 381.9 646.9 378.2 628.7 373.6 610 371.9 591.7 373.2ZM227.5 378.2C225.6 381.2 224.4 384.2 224.7 385.1 225.2 386.8 228.6 388.9 230.7 388.9 231.4 388.9 232.8 389.7 233.9 390.8L235.9 392.7 237.7 390.5C238.6 389.2 240 386.4 240.7 384.3 242.2 379.7 241.5 377.9 237.4 376.6 235.9 376.1 234.1 375.1 233.2 374.4 232.5 373.7 231.6 373.1 231.2 373.1 230.9 373.1 229.3 375.5 227.5 378.2ZM362 373.8C332.4 378.2 318.1 382.8 314.5 388.8 312.1 393 312.4 399.6 315.4 403.4 318.1 407 322 409.3 325.7 409.3 327.2 409.3 331.4 408.2 335.1 406.9 358 399.2 388.1 397.5 412 402.7 416.9 403.8 421.8 404.6 423 404.6 426.4 404.6 431.3 401.9 433.4 398.9 437.2 393.6 435.3 383.2 429.7 379.9 427.3 378.4 417.3 376.1 406 374.5 397.6 373.3 368.2 372.8 362 373.8ZM182.6 376.4C179.7 378.8 177.1 385.8 178.1 388.4 178.7 390.1 181.9 391.4 187 392.2 190.6 392.8 190.7 392.8 192.5 388.6 193.5 386.3 195 384 195.9 383.5 197.4 382.7 197.2 382.4 194.4 380.6 192.6 379.6 190.7 378.7 190.1 378.7 189.5 378.7 188.2 377.7 187.2 376.4L185.4 374.1 182.6 376.4ZM776.1 375.2C775.6 375.8 774.7 378.1 774.2 380.3 773.5 382.4 772.2 384.8 771.1 385.6 768.4 387.4 769.4 389.3 774 390.6 776 391.2 778.3 392.6 779.1 393.7 780.9 396.3 783 395.4 784.7 391 785.6 389.1 786.9 386.9 787.7 386.4 790 384.6 788 381 783.3 378.7 781.2 377.6 779.4 376.2 779 375.5 778.4 373.8 777.4 373.7 776.1 375.2ZM797.7 376.6C797.4 378.1 796.4 380.7 795.5 382.6 794 385.6 793.9 386.2 795 387.9 795.7 388.9 797.5 389.9 799 390.3 800.5 390.6 802.2 391.5 802.9 392.2 804.7 394.4 806.1 393.7 809.6 388.2 814.6 380.3 814.4 379.4 805.6 376 799 373.5 798.2 373.6 797.7 376.6ZM206 377.7C204.5 378.6 202.4 380.3 201.5 381.4 199.6 383.3 199.7 383.4 203.2 387 208.1 392 210.8 391.9 216.5 386.7L220.8 382.6 219 380.6C216.8 378.1 212.8 375.9 210.5 375.9 209.5 375.9 207.6 376.7 206 377.7ZM750.3 381.3C748.6 383.7 747.2 386.6 747.2 387.7 747.2 390.3 752.9 393.8 757.2 393.9 760.5 394 760.7 393.8 761.9 390 762.6 387.9 763.7 386.1 764.4 386.1 765.8 386.1 766.1 385.3 765 383.6 764.5 383 754 376.8 753.2 376.9 753.2 376.9 751.9 378.8 750.3 381.3ZM728.8 380.7C728.8 381.9 729.4 385.6 730 388.9 731.1 394.6 731.3 394.9 733.7 394.7 736.9 394.4 738.9 392.9 740.5 389.1 742.3 384.6 741.3 382.9 735.9 380.6 730 378.1 728.7 378.1 728.8 380.7ZM230.2 398.7C229.4 399.4 228.7 400.9 228.7 401.8 228.7 402.7 227.9 404.5 226.8 405.9 224.9 408.3 224.9 408.5 226.4 410.2 227.2 411.1 229.3 412.2 230.9 412.6 232.5 412.9 234.4 413.6 234.9 414.1 236.6 415.4 240.3 412.8 242.2 409.2 244.2 405.3 242.7 401.9 238.1 399.3 233.8 396.9 232.1 396.8 230.2 398.7ZM181.9 400.2C181.5 400.7 180.6 403.6 180 406.4 178.6 412.2 179.2 413.3 183.5 414.3 185.1 414.5 187.1 415.5 188 416.2 190.5 418.4 194 415.1 195.4 409.3 196.8 403.5 196 402.4 189.5 400.5 183.9 398.8 182.7 398.7 181.9 400.2ZM205.6 401.1C201.9 411.1 202 413 206 413 207.4 413 209.4 414 210.6 415.4 213.2 418.1 214.2 417.9 215.7 413.7 216.4 412 217.8 409.7 218.8 408.6 221.4 405.6 220.2 403.3 214.6 401 208.6 398.5 206.7 398.5 205.6 401.1ZM775.2 403.4C773.1 405.5 771.3 408.1 771.3 409.1 771.3 411 776.2 415.7 778.2 415.7 778.9 415.7 779.7 416.5 780 417.3 780.6 418.6 781.2 418.2 784.3 415.3 788.6 411 789 408.2 785.5 405.3 784.1 404.2 782.1 402.4 781.1 401.4L779.2 399.5 775.2 403.4ZM799.5 402.3C796.7 405 796.2 405.9 796.7 408.1 797.5 411.5 804 418.1 805.9 417.3 808.1 416.5 812.3 409.5 812.3 406.8 812.3 403.9 807.5 399.1 804.7 399.1 803.7 399.1 801.4 400.6 799.5 402.3ZM162.5 404C162.2 405.6 161.7 409 161.2 411.4 160.5 415.5 160.6 415.9 162.5 417.2 166 419.5 169 417.6 171.2 411.5 172.3 408.6 172.9 405.8 172.5 405.5 172.1 405.1 169.8 403.9 167.4 402.9L163.1 401 162.5 404ZM751.1 403.2C749.1 405.8 747.8 410.6 748.3 413.5 748.7 415.8 752.8 417.7 757.6 417.9 761.4 418.1 761.5 418 762.7 414 763.3 411.7 764.4 409.5 765 409.1 767.6 407.5 762 403 755.5 401.4 753.5 400.9 752.6 401.3 751.1 403.2ZM231.5 422.1C229.3 425.4 226.9 430.8 226.9 432.9 226.9 434.6 233.6 437.9 237.1 438 240.1 438 241.7 436.2 241.9 432.9 242 431.6 242.7 430.1 243.4 429.7 245.5 428.4 244.2 425.6 241 424.6 239.4 424.1 237.2 422.7 236.1 421.5 235.1 420.4 234 419.4 233.8 419.4 233.6 419.4 232.6 420.6 231.5 422.1ZM208.1 422.4C206.7 423.5 203.8 430.2 203.4 433.3 203.3 434.1 204.8 435.5 206.9 436.4 209 437.4 211.4 438.8 212.3 439.6 213.1 440.4 214 440.8 214.2 440.6 216.9 437 220.4 430.5 220.4 429 220.4 426.7 218.1 424.5 213.6 422.7 209.5 421 210 421 208.1 422.4ZM777.3 424.6C776.1 425.9 774.6 429 774.1 431.6 772.8 436.9 773.2 437.9 778.1 440.2 783.5 442.7 784.9 442.2 787.5 436.8 788.8 434 789.8 431.2 789.8 430.5 789.8 428.5 788 426.9 785.9 426.9 784.9 426.9 783.1 425.8 781.9 424.5L779.5 422.2 777.3 424.6ZM801.1 424.3C799.2 426.4 798 429 796.9 433.4 796.4 435.5 796.9 436 801.4 438.4L806.4 441.2 808.6 439.1C813.4 434.5 813.7 426.9 809.1 423.7 806.2 421.7 803.4 421.9 801.1 424.3ZM159.4 425.7C157.9 429.5 157.1 434.8 157.9 436.9 158.1 438 159.8 439.6 161.5 440.7 165.5 443.1 169.1 442 170 438.2 170.4 436.9 171.2 434.4 171.9 433 173.6 429.6 173 428.8 165.6 425.6L160.4 423.3 159.4 425.7ZM181.5 427C179.2 432.1 179.1 436 181.3 436.8 182.1 437 184.6 438.1 186.9 439.1 190.6 440.8 190.9 440.9 192.7 439.3 195.1 437.1 197.5 428.8 196.2 427.2 195.1 425.9 187.6 423.1 185 423.1 183.8 423.1 182.6 424.5 181.5 427ZM751.5 427.2C748.1 432.4 748.7 439.8 752.5 439.8 753.2 439.8 755.4 440.5 757.1 441.4 760.3 442.9 760.4 442.8 762.5 440.6 765.1 438.1 766.9 431.6 765.6 429.2 764.4 427.2 759.3 425 755.6 425 753.9 425 752.5 425.7 751.5 427.2ZM160.2 449.7C155.8 458.9 156 459.9 162.1 463.1 167.7 465.8 169.3 465.2 171.8 459.3 174.4 453.2 173.8 451.8 168.5 449.6 166.5 448.8 164.5 447.5 164.3 446.8 163.3 444.4 162.3 445.2 160.2 449.7ZM207.9 448.8C207.6 450.2 206.5 452.4 205.5 453.8 203.2 457 203.8 458.4 208.4 461 213.3 463.8 215.5 463.1 219.6 457.5L223 453 221 451.1C218.7 449 212.6 446.3 210.2 446.3 209.2 446.3 208.3 447.2 207.9 448.8ZM801.7 447.9C800.9 448.8 799.6 451.4 798.8 453.6 796.9 458.5 797.8 460.6 801.9 461.6 803.5 461.9 805.6 463 806.4 463.8 807.9 465.3 808.2 465 812.8 458.1 816.2 453.1 817.2 450.9 816.2 450.9 815.4 450.9 812.8 449.9 810.4 448.6 805.3 445.8 803.5 445.7 801.7 447.9ZM182.9 449.4C182 450.6 181.3 453.7 181.2 456L181 460.3 186.2 462.4C192.3 464.9 194 464.4 195.9 459.6 199 452.3 196.8 448.4 189.1 447.5 184.8 447 184.4 447.2 182.9 449.4ZM779.4 448.2C776.9 449.6 773.1 458.3 774.1 460.2 775.4 462.6 781.3 465.1 783.9 464.4 785.8 463.9 791.7 456.6 791.7 454.5 791.7 453.9 782.3 447.2 781.5 447.2 781.2 447.2 780.3 447.7 779.4 448.2ZM754.4 449.7C751.9 452.7 749.9 457.5 750.2 460 750.4 461.9 751.2 462.7 753.2 463.2 754.8 463.7 757.2 464.6 758.7 465.4 761.7 466.9 763.9 465.8 763.9 463 763.9 462 765 459.9 766.3 458.3 767.7 456.8 768.6 455.4 768.4 455.2 766 453.1 757.9 448.1 756.9 448.1 756.4 448.1 755.2 448.9 754.4 449.7ZM803 470.8C800.7 472.5 797.5 482.1 798.8 483.4 799.3 483.9 801.9 485 804.9 486 809.6 487.7 810.3 487.7 811.6 486.5 812.3 485.6 813 484.3 813 483.4 813 482.5 813.8 480.6 814.9 479.3 817.1 476.4 816.9 475.9 811.6 472.2 806.9 469.1 805.8 468.9 803 470.8ZM185.5 471.5C184.9 472.1 183.8 474.8 182.9 477.5 180.8 483.1 181.6 484.6 186.6 485.6 188.3 485.9 190.2 486.9 190.6 487.8 191.5 489.2 191.8 489.2 193.9 487.1 195.2 485.8 196.3 483.9 196.3 482.6 196.3 481.2 196.9 480.2 198.1 479.9 200.5 479.3 200.5 478.6 198.1 475.6 196.9 474.2 194.3 472.6 191.5 471.8 185.7 470.1 186.5 470.1 185.5 471.5ZM208.4 472C207.9 473.1 207.4 474.6 207.4 475.4 207.4 476.2 206.5 477.8 205.4 478.9 203.5 480.7 203.5 480.9 205.1 482.1 206.1 482.8 207.3 483.3 208 483.3 208.6 483.3 210.5 484.4 212 485.8 214.4 487.7 215.4 488.1 216.6 487.3 218.7 486 221 481.6 221.8 477.5 222.4 474.2 222.3 474 218.9 472.6 212.9 470.1 209.5 469.9 208.4 472ZM161.4 472.7C159.8 473.8 157.4 480.1 157.4 483.3 157.4 484.3 166.9 488.9 169 488.9 170.9 488.9 173 485.8 174.2 481.2 175.1 477.3 175 476.6 173.6 475 172.8 474.1 170.7 473 169.1 472.7 167.5 472.3 165.6 471.9 164.8 471.7 164 471.5 162.5 471.9 161.4 472.7ZM756.3 473.1C753.5 475.3 750.6 481.9 751.4 484.4 751.8 485.4 753.4 486.5 755.6 487 757.6 487.6 759.5 488.6 760 489.4 761.6 492.3 765.7 488 765.7 483.4 765.7 482.4 766.7 481.5 767.9 481.1 769.8 480.6 769.6 480.3 765.1 475.9 762.5 473.3 759.9 471.3 759.4 471.3 759 471.3 757.5 472.1 756.3 473.1ZM778.9 472.5C778.3 473.1 777.6 474.8 777.3 476.2 776.9 477.6 775.7 479.4 774.7 480.1 772.9 481.4 772.9 481.5 774.5 483.2 775.4 484.3 777 485.4 778.1 485.7 779.2 486 781 487.1 782.1 488.2 784.1 489.9 784.4 490 786.5 488.6 788.9 487 792.4 477.1 791 475.9 790.6 475.6 787.9 474.4 785 473.3 781 471.9 779.5 471.7 778.9 472.5ZM210.7 493.7C209.9 494.8 209.3 496.3 209.3 497 209.3 497.7 208.2 499.3 206.9 500.6 205.7 501.8 204.9 503.3 205.2 504 205.4 504.6 208.1 506.5 211.3 508.1 216.8 511 217.1 511 218.6 509.5 219.4 508.6 220.8 505.8 221.7 503.3 223.4 498 222.8 496.8 218 495.8 215.7 495.5 214.4 494.6 214.2 493.4 213.5 491.1 212.5 491.2 210.7 493.7ZM185.8 496.3C183.5 499 181.8 505.6 182.8 507.3 183.6 508.6 193.2 511.4 194.8 510.8 195.6 510.6 196.5 508.8 196.9 506.9 197.1 505.2 198.3 503.1 199.4 502.3 200.8 501.3 201 500.7 200.1 499.6 199.4 498.9 197.8 498 196.3 497.7 194.9 497.4 193 496.3 192 495.3 189.8 492.9 188.5 493.1 185.8 496.3ZM804 494.6C803.4 495.3 802.3 497.5 801.5 499.5 800.6 501.5 799.5 503.4 799 503.7 797 504.9 799.4 507.4 804.4 509.3 811.8 512 811.9 511.9 815.2 504.7 817.3 500.3 817.1 499.7 812.9 496.9 808.1 493.8 805.3 493.1 804 494.6ZM827 494.6C826.6 495.3 825.8 496.9 825.5 498.1 825.1 499.4 824.3 501.4 823.5 502.5 822.4 504.2 822.5 504.7 824.1 506.8 825.1 508.1 827 509.4 828.4 509.6 829.9 510 831.8 510.5 832.8 510.8 834.4 511.3 834.4 510.9 833.9 505 832.9 494.5 832.5 493.5 830.1 493.5 829 493.5 827.6 494.1 827 494.6ZM161.8 496C160.2 497.8 158 506.1 158.8 507.3 159 507.8 161.6 509.3 164.4 510.6L169.6 513.1 171.9 510.8C173.5 509.4 174.4 507.1 174.7 504.3 175.5 498.4 173.8 496.7 166.1 495 164.1 494.5 163 494.8 161.8 496ZM757.8 495.2C757.2 495.6 755.6 498.1 754.3 500.6 753 503.3 751.4 505.6 750.9 505.6 748.9 505.6 751.4 508.3 755.6 510.6 761.9 514.1 763.6 513.5 767 507.3 769.4 502.9 769.7 501.9 768.6 500.6 768 499.7 766.6 499.1 765.6 499.1 764.6 499.1 762.8 498.1 761.5 496.8 758.9 494.2 759.2 494.3 757.8 495.2ZM779.4 498.1C775.4 502.8 774.8 504.8 776.6 507.4 778.2 509.7 783.1 512 786.5 512 788.1 512 789 511.3 789.7 509.1 790.3 507.5 791.4 505.4 792.2 504.5 794.4 502.2 793.2 500.2 789.2 498.5 787.2 497.7 785 496.4 784.2 495.7 782.8 494.5 782.3 494.7 779.4 498.1ZM210.7 518.7C209.9 519.8 209.3 521.4 209.3 522.2 209.3 523 208.6 524.7 207.9 526.2 206.4 529 205.8 528.3 214.4 533.6L218.1 535.9 220.7 531.9C225.6 524 224.9 520.1 217.7 517.7 213.2 516.2 212.3 516.4 210.7 518.7ZM804.4 518.7C801.9 522.8 799.8 528.6 800.3 530 800.6 530.7 802.5 531.9 804.6 532.5 806.8 533.1 809 534.4 809.6 535.4 810.7 536.9 810.9 536.9 812.2 535.5 813.9 533.5 817.6 525.8 817.6 524.4 817.6 523.5 810.4 518.7 806.4 516.9 806.1 516.8 805.2 517.6 804.4 518.7ZM187.8 519.7C186.6 521 184.7 523.5 183.6 525.3L181.7 528.5 183.6 530.4C186 532.5 192 535.2 194.6 535.2 195.6 535.2 196.6 534.4 196.9 533.5 197.2 532.7 198.2 530.2 199.3 528 200.3 525.7 201 523.8 200.7 523.6 200.6 523.4 198.9 522.2 197 521 191.8 517.4 190.1 517.1 187.8 519.7ZM829.3 519.5C828 520.6 826 522.9 824.9 524.6L822.9 528.1 825.1 529.7C832.8 535.6 836.1 535.5 836.1 529.4 836.1 519.1 833.9 515.9 829.3 519.5ZM780.5 520.6C779.9 521.7 779.1 523.6 778.7 524.9 778.4 526.2 777.6 527.3 776.9 527.3 774.4 527.3 775.2 529.3 778.9 532.1 784.2 536.5 787.1 536.2 790.6 531.2 792 529.1 793.5 526.9 793.8 526.3 794.5 525 785.6 518.5 783.1 518.5 782.2 518.5 781 519.4 780.5 520.6ZM163.1 520.6C162.7 521.2 161.9 523.1 161.6 524.8 161.2 526.5 160.4 528.1 159.6 528.4 158.5 528.8 158.6 529.4 160.4 531.3 163.5 534.6 167.9 536.3 170.8 535.2 175.3 533.5 178.6 524.8 175.7 522.5 174.6 521.7 166.9 519.4 165 519.4 164.5 519.4 163.7 520 163.1 520.6ZM755.2 524.1C753.3 526.1 751.9 528.3 751.9 529.1 751.9 529.8 753.1 531.7 754.7 533.2 758.8 537.3 762.5 537.1 767.6 532.6 772.3 528.4 772.2 527.2 766.6 523.1 761.4 519.4 759.3 519.6 755.2 524.1ZM187 545.5C185.1 548.7 184.3 551.1 184.4 553.1 184.7 555.8 185.1 556.1 190.6 557.5 197 559.2 196.7 559.4 199.6 552.1 201.6 547.4 201.3 545.4 198.6 545.4 198.1 545.4 196.1 544.4 194.3 543.1 192.4 541.8 190.6 540.7 190.4 540.7 190.2 540.7 188.7 542.9 187 545.5ZM211.1 543.1C210.6 544.4 210.2 546 210.2 546.6 210.2 547.2 209.5 548.7 208.7 549.8 207.5 551.6 207.5 552.2 208.4 553.3 209.9 555.2 213.6 557 217.3 557.8 220.1 558.4 220.3 558.3 223 552.7L225.7 546.9 223.6 544.8C221.8 543 216.2 540.7 213.1 540.7 212.5 540.7 211.6 541.9 211.1 543.1ZM805.7 542.1C803.6 543.7 800.4 553 801.4 554.5 802.2 555.9 811.7 558.7 813.2 558.1 814.1 557.8 815.2 555.8 815.7 553.7 816.3 551.6 817.3 549.7 818.1 549.4 820 548.6 818.3 545.9 814.1 543.1 810.1 540.4 808.6 540.2 805.7 542.1ZM827.6 542.3C823.3 547.2 823.4 550 827.7 554.1 830.6 556.9 834.3 557.5 836.6 555.6 838.8 553.7 838.4 544.9 836.1 542.6 833.8 540.3 829.4 540.2 827.6 542.3ZM164.5 544.2C163.8 545.1 162.9 546.9 162.5 548.2 162.1 549.6 161.1 551.1 160.1 551.5 158.4 552.2 158.6 552.6 162.2 555.4 166.9 559 169.9 559.9 171.9 558.2 173.5 556.9 179.1 549.1 178.5 548.8 178.4 548.7 176.3 547.2 173.9 545.6 169.1 542.2 166.7 541.9 164.5 544.2ZM780.3 544.3C779.4 545.3 778.4 548.1 778.1 550.6 777.4 556.3 779.4 558.4 785.8 559L790.3 559.4 792.7 554.2C795 549.1 795 548.9 793.4 546.9 792.5 545.6 790.5 544.4 789 544.2 787.5 543.9 785.3 543.3 784.1 543.1 782.6 542.7 781.4 543.1 780.3 544.3ZM757.7 544.6C755.4 547.5 753.1 554.4 753.9 555.8 755.2 558.2 759.7 560.2 763.8 560.2 766.9 560.2 767.8 559.8 768.9 557.6 769.6 556.1 770.4 553.3 770.6 551.5 770.7 548.6 770.4 547.6 768.5 546.2 765.4 543.9 759.1 543 757.7 544.6ZM211.9 567.2C211.4 568.7 210.3 571.3 209.5 572.9 207.8 576.5 208.8 578.2 213.6 580.3 220.8 583.2 224.4 581.1 225.6 573 226.1 569.2 225.9 568.5 223.9 567.2 222.7 566.4 219.7 565.5 217.3 565.2 213.2 564.6 213 564.7 211.9 567.2ZM828.1 567.1C827.2 568.6 826.5 571.5 826.5 573.9 826.4 578 826.5 578.1 829.6 579 831.4 579.4 833.6 580.5 834.5 581.3 835.8 582.4 836.6 582.6 837.8 581.8 839.1 580.9 839.4 579.4 839.3 573.7 839.2 569.8 838.9 566.4 838.7 566.2 838.4 565.9 836.4 565.5 834.1 565.2 830.2 564.6 829.7 564.8 828.1 567.1ZM164.9 567.8C164.4 569 163.3 571.7 162.5 573.9 160.9 577.6 160.9 577.9 162.4 579.5 164.4 581.7 171.4 583.7 173.9 583 176.3 582.1 178.2 576.5 177.9 571 177.8 570 176.2 568.6 173.9 567.6 168.5 565.2 165.9 565.3 164.9 567.8ZM187.5 567.9C186.8 569.1 185.8 571.9 185.6 574.3L184.9 578.5 188.8 579.7C190.9 580.4 193.1 581.4 193.6 582.1 196.1 585 199.4 582.2 201.5 575.5 203.1 570 202.1 568.1 197.4 566.7 191.9 565.2 189.1 565.5 187.5 567.9ZM804.6 567.1C803 569.1 801.9 576 802.9 578 803.5 579.2 810.6 581.5 813.9 581.5 815.5 581.5 817.5 578.6 818.4 575.3 819.7 570.8 818 568.1 813.2 566.8 808.4 565.4 806 565.5 804.6 567.1ZM780.2 569.2C778.2 573.1 777.6 577.5 778.6 579.4 779.7 581.6 784.2 583.3 788.4 583.3 791.2 583.3 791.6 583 793.4 577.7 795.1 573.1 795.3 571.9 794.4 570.7 792.5 568.4 788.2 566.7 784.8 566.7 782.1 566.7 781.3 567.1 780.2 569.2ZM756.9 569.7C756.1 571 755.4 574.1 755.3 576.5L755.1 580.7 759.1 581.9C761.2 582.6 763.7 583.7 764.4 584.4 765.7 585.4 766.3 585.2 768.1 583.1 769.3 581.7 770.6 578.7 770.9 576.3 771.8 570.7 769.6 568.4 763.1 567.8 759 567.4 758.3 567.6 756.9 569.7ZM212.6 590C211.9 591.2 210.7 594 210.2 596.2 209.3 599.9 209.3 600.5 210.7 601.6 211.7 602.2 213.1 602.8 214 602.8 214.8 602.8 216.6 603.6 218 604.7L220.4 606.6 223.1 603.9C226 600.9 227.7 595.1 226.2 592.7 225.1 590.8 221.8 589.3 217.4 588.5 214.4 588 213.8 588.2 212.6 590ZM829 590.4C828.1 591.8 827.4 594.7 827.4 597 827.3 601.2 827.4 601.3 831.2 602.8 833.4 603.6 835.6 604.7 836.3 605.4 837.1 606.2 837.8 606.1 839.1 604.9 840.4 603.7 840.7 602 840.7 596.8L840.7 590 836.7 589C831 587.6 830.8 587.6 829 590.4ZM189.4 590.9C188.6 592 188 593.4 188 594 188 594.4 187.3 596.1 186.6 597.6 185.3 600.1 185.3 600.5 187.1 602.4 188.8 604.2 195 606.5 198.1 606.5 199.8 606.5 202.8 600.6 202.8 597 202.8 593.1 201.1 591.1 196.5 589.8 191.7 588.5 191 588.6 189.4 590.9ZM806.1 590.3C804.6 591.8 802.8 597.3 802.8 600.3 802.8 601.2 803.9 602.3 805.4 602.9 806.8 603.4 809.1 604.4 810.5 605.2 811.9 605.9 813.7 606.5 814.4 606.5 817.4 606.5 821.1 596.6 819.4 593.3 817.6 590.1 808.4 588 806.1 590.3ZM782.4 592.2C781.9 593.5 781.5 595.2 781.5 595.9 781.5 596.6 780.6 597.7 779.6 598.3 778.6 599 777.8 599.8 777.8 600.2 777.8 601.7 781.9 604.6 784.1 604.6 785.5 604.6 786.5 605.3 786.8 606.5 787.4 608.8 790 608.9 791.9 606.7 792.7 605.8 794.2 602.9 795.3 600.2L797.1 595.2 791.2 592.5C783.9 589.3 783.5 589.2 782.4 592.2ZM164.4 594.6C163.5 596.8 162.1 599 161.4 599.6 160 600.6 160.2 600.8 162.6 602.3 164.1 603.2 166.4 604.7 167.8 605.6 173.1 609.4 176.8 607.2 178.5 599.4 179.6 594.6 179.2 593.9 174.2 592.1 167.6 589.8 166.1 590.2 164.4 594.6ZM760 592.3C757.6 595.1 755.5 600 755.7 602.1 755.9 603.6 757.1 604.5 759.7 605.4 761.8 606 763.9 607.1 764.4 608 766.5 610.6 770.4 606.6 770.4 601.9 770.4 600.6 771 600 772.2 600 775.1 600 774.4 598.6 769.8 594.5 765.2 590.5 762.2 589.8 760 592.3ZM168.3 613.6C166.4 615.8 163 622.8 163 624.4 163 625.3 165.4 627.1 168.4 628.6 174.6 631.9 175.5 631.6 178.7 625.3 181 620.6 180.3 618.4 175.6 616.1 174 615.3 172 614 171.2 613.3 169.9 612.2 169.5 612.2 168.3 613.6ZM784.4 614.2C783.3 615.4 781.9 617.6 781.4 619.2 780.2 622.9 782.2 627.8 786.4 630.7L789.2 632.8 792.8 628.8C796.7 624.4 797.2 621.2 794.5 618.7 792.3 616.7 786.9 612 786.7 612 786.5 612 785.6 613 784.4 614.2ZM830 614.4C829.2 615.6 828.2 618.5 828 620.8 827.6 624.7 827.7 625 830.2 625.9 831.7 626.4 834.1 627.4 835.5 628.2 837.4 629.3 838.6 629.4 839.9 628.7 841.4 627.9 841.7 626.7 841.7 620.5 841.7 613.7 841.5 613.1 839.6 612.6 834.9 611.4 831.6 611.9 830 614.4ZM189.8 615.4C189.4 616.9 188.2 619.3 187.5 620.7 186.1 623.2 186.1 623.6 187.7 625.1 188.6 625.9 191.3 627.5 193.7 628.5L198.1 630.5 201.4 626.1C205.3 621.1 205.4 618.1 201.8 615.5 200.4 614.5 197.4 613.4 195 613.2 191 612.8 190.7 612.9 189.8 615.4ZM760.8 616.5C756.1 621.3 756.2 624.2 761.3 629.4 763.4 631.6 765.7 633.3 766.3 633.3 766.9 633.3 768.5 632 769.8 630.5 773.4 626.2 773.1 621.4 768.9 616.7 767 614.6 765.3 613 764.9 613 764.5 613 762.7 614.5 760.8 616.5ZM807.8 614.1C807.3 614.7 806 617.1 804.9 619.4L802.8 623.6 804.7 625.3C805.8 626.1 807.8 627.1 809.2 627.4 810.5 627.7 812.6 628.3 813.8 628.8 815.3 629.4 816.4 629.4 817.1 628.7 818.3 627.8 820.4 620.2 820.4 617.1 820.4 614 809.4 611.4 807.8 614.1ZM146.5 622.9C146.8 630.9 146.8 631 149.2 631.3 151.3 631.6 152 630.9 154.5 626.3 156.1 623.3 157.4 620.6 157.4 620.4 157.4 619.7 148.1 614.8 146.9 614.8 146.6 614.8 146.4 618.4 146.5 622.9ZM191.4 637.8C189.7 639.7 188 644.9 188 647.8 188 649.4 188.7 650.2 191.8 651.1 193.9 651.7 196 653 196.6 653.8 198.1 656.1 200 654.9 201.9 650.4 202.9 648.1 204.1 646.3 204.6 646.3 206.1 646.3 205.7 641.9 204.2 640.4 203.3 639.5 200.9 638.5 198.8 638 196.7 637.4 194.4 636.8 193.8 636.6 193.2 636.4 192.1 636.9 191.4 637.8ZM785.3 638.5C783.5 640.7 783.1 641.9 783.4 644.2 783.4 644.5 782.6 645.2 781.5 645.6 778.3 646.8 779.6 649.2 784.8 651.8 787.4 653.1 790.3 654.7 791.1 655.5 792.4 656.6 792.8 656.2 794.5 652.2 795.6 649.7 797 647.3 797.8 646.9 800.7 645.3 799.2 642.5 794 640.3 791.2 639 788.9 637.6 788.9 637 788.9 635.4 787.2 636 785.3 638.5ZM834.5 637.5C833.4 638.2 831.3 640.9 829.7 643.4L826.9 648.1 830.9 649.9C835.3 652 838.1 652.3 840.8 650.9 842.2 650.1 842.6 648.9 842.6 644.4 842.6 639.3 842.4 638.9 839.8 637.5 836.6 635.8 836.9 635.8 834.5 637.5ZM168.1 638.5C167.3 639.3 166.7 640.4 166.7 640.9 166.7 641.4 165.9 643.3 165.1 645.1 162.8 650 165.3 652.7 173.2 654.2 177.5 654.9 179.3 653.2 180.1 647.8 180.9 642.5 180.1 640.2 177 639.1 172 637.1 169.6 637 168.1 638.5ZM807.2 640.9C805.3 643.1 803.7 645 803.7 645.4 803.7 645.6 805.6 647.7 807.8 649.9 813.1 655.1 816.3 655 819 649.5 820 647.5 821.4 645.5 822 645.1 824.4 643.6 816.5 637 812.4 637 811.6 637 809.3 638.8 807.2 640.9ZM147 647.1L147.3 655.6 150.5 655.6C154.1 655.6 155.8 653.1 156.9 646.8 157.7 642.1 155.9 640.2 150.5 639.4L146.8 638.7 147 647.1ZM193.1 662.3C188.1 666.6 188.3 669.4 193.8 674.8 197.9 678.9 198.1 679 200.3 677.5 202.6 676 205.6 670.7 205.6 668 205.6 666.5 198.8 659.3 197.4 659.3 197 659.3 195.2 660.6 193.1 662.3ZM833.1 660.9C832.1 661.9 831.5 663.7 831.5 665 831.5 666.7 830.8 667.5 829.5 667.9 826.6 668.6 828.8 671.8 833.8 674 836.1 675 838 676.3 838 676.8 838 677.3 838.7 677.8 839.6 677.8 842 677.8 843.5 674 843.5 667.7L843.5 662.2 839.8 660.7C835.1 658.9 834.9 658.9 833.1 660.9ZM807.9 665.4C804.9 671.9 805 673 808.1 674.3 813.9 676.8 815.6 678.6 815.6 681.9 815.5 684.7 815.3 685 813.7 684.2 811.6 683.1 809.6 684.3 808.7 687.3 808.4 688.4 807.5 690.1 806.8 690.9 805.6 692.2 805.6 692.9 806.7 695 807.6 696.9 809.3 698.1 813.6 699.5L819.3 701.6 820.4 697.3C820.9 695 821.8 692.4 822.1 691.7 822.7 690.7 821.9 689.2 819.8 686.8 818 684.8 816.7 682.3 816.7 681 816.7 677.8 820.3 670 822.6 668.4 823.1 668.1 823.1 666.8 822.8 665.4 822.3 663.5 821.2 662.8 817.4 661.6 814.8 660.8 812 660.2 811.4 660.2 810.7 660.2 809.2 662.5 807.9 665.4ZM168.2 662.8C166.2 665 164.7 672.1 165.8 674.3 166.3 675.2 166.9 675.9 167 675.9 167.2 675.9 169.5 676.3 172.1 676.9 178 678 180 677.1 181.4 673.1 183.4 667.2 182.9 665.9 177.2 663.4 171 660.6 170.2 660.6 168.2 662.8ZM784.4 664.3C781.8 668.3 781.9 672.3 784.5 674.7 787.6 677.6 792.9 680.1 793.3 678.9 793.5 678.3 794.9 676.4 796.4 674.4 797.9 672.5 799.1 669.9 799.1 668.4 799.1 666.2 798.3 665.6 794.1 663.5 787.5 660.5 786.7 660.5 784.4 664.3ZM147.9 669.6C148.3 675 148.9 677.6 150.1 678.8 151.6 680.3 151.8 680.3 154 678 156.7 675.1 158.3 671.3 158.3 668 158.3 665.6 155.8 664.1 149.8 662.6L147.4 662 147.9 669.6ZM194.5 683.9C192 685.7 189.8 690.6 189.8 694.4 189.8 697.5 191.2 698.5 197 699.8 201.9 700.9 204.2 699.4 205 694.4 205.4 692.2 206.2 690.5 207.1 690.1 208.4 689.5 208.4 689.4 206.9 688.2 205.9 687.6 204.4 687 203.5 687 202.5 687 200.7 686 199.4 684.7 196.7 681.9 197.2 682 194.5 683.9ZM833.7 686.5C829.8 690.4 829.6 693.5 833 696.2 834.4 697.3 836 698.1 836.7 698.1 837.3 698.1 838.2 698.8 838.7 699.6 839.2 700.5 840.4 700.9 841.3 700.7 842.8 700.5 843.1 699.4 843.3 693.3L843.6 686.3 840.6 684.8C839 684 837.5 683.3 837.2 683.3 837 683.3 835.5 684.7 833.7 686.5ZM169.9 685.7C169.2 686.6 168.5 687.8 168.5 688.5 168.5 689.3 167.5 690.9 166.2 692.2 165 693.4 164.2 695 164.4 695.6 164.9 697 174.5 702.8 176.3 702.8 178.7 702.8 180.8 700.2 182 695.6 183.8 688.5 183.6 688.2 174.4 685.3 171.9 684.5 171 684.6 169.9 685.7ZM764.1 686.7C761.7 688.3 759.3 692.6 759.3 695.2 759.3 696.2 760.3 697.7 761.6 698.5 765.8 701.3 766.1 704 763 711.8 758.9 721.9 759.1 722.8 765.3 724.5 771.8 726.5 773.3 726.1 774.3 722.6 774.6 721 775.6 719.2 776.4 718.5 779.1 716.3 778 714.3 773.1 712.2 767.7 709.9 767.3 708.2 771.2 703.4 777 695.9 777.1 691.2 771.4 687.3 767.7 684.8 766.9 684.7 764.1 686.7ZM786.4 686.3C785.7 687.4 783.8 692.2 782.8 695.4 782.2 696.9 790.3 702.8 792.8 702.8 794.4 702.8 797.2 699.9 797.2 698.4 797.2 697.9 798.2 696 799.4 694.2 802 690.4 801.9 690.1 795.3 687.1 790.6 684.9 787.5 684.7 786.4 686.3ZM148.5 690.9C148.8 693.6 149.1 697.2 149.1 698.8 149.1 701.5 149.4 701.9 151.6 701.9 153.2 701.9 155.2 700.6 157.7 698L161.4 694.1 157.1 690.1C154.3 687.4 152 686.1 150.4 686.1 148 686.1 147.9 686.2 148.5 690.9ZM811.8 708.1C810.8 709.1 810.2 710.4 810.2 711.1 810.2 711.8 809.4 713.7 808.2 715.5 805.7 719.4 806.7 720.6 813.6 722.9 819.2 724.6 821.6 724 822 720.5 822.2 719.4 823.3 717.9 824.5 717 827.3 715.2 826.7 713.3 822.3 711.1 820.4 710.2 818.3 708.7 817.7 708 816 706 813.6 706.1 811.8 708.1ZM835.4 707.7C834.7 708.4 834 710.3 833.7 711.9 833.3 713.5 832.6 714.8 831.9 714.8 827.6 714.8 830.6 719.6 836 721.4 837.9 721.9 840.1 723.1 840.9 723.8 843.4 726 844.8 722.3 844.1 715.4 843.5 710.5 843.1 709.5 840.9 708.5 836.7 706.4 836.5 706.4 835.4 707.7ZM169.6 711.9C166.2 715.5 165.4 715.9 162.7 715.5 160.9 715.2 157.6 713.7 155.1 712.1 152.6 710.6 150.2 709.3 149.8 709.3 149.4 709.3 149.1 712.8 149.1 717 149.1 725.4 150 727.2 153.8 726.7 155.8 726.4 156.4 725.7 158.5 720.8 160 717.4 162.8 716.8 164.7 719.4 165.6 720.4 167.9 721.8 169.9 722.4 174.5 723.9 175 726.2 171.9 731.7 167.6 739.2 167.9 743.9 172.9 748.5 175.3 750.7 175.5 750.8 177.8 749.4 186.6 743.8 187.5 739.3 181 733.1 178.7 731 176.9 728.8 176.9 728.4 176.9 728 178.1 726.1 179.6 724.4 183.7 719.7 183.4 715.6 178.8 711 176.9 709 174.8 707.5 174.4 707.5 174 707.6 171.9 709.5 169.6 711.9ZM192.5 712.6C189.3 718.4 189.4 719.7 194 722.2 198.5 724.7 198.8 726.1 195.5 731.1 191.9 736.6 191.3 738.7 192.5 741.9 193.3 744.2 200.9 750 203 750 203.3 750 204.3 748.7 205.1 747.2 205.9 745.6 206.3 744.4 205.9 744.4 205.6 744.4 206.3 743.1 207.3 741.3 209.8 737.3 209.7 736.5 206.9 735.7 203.4 734.8 199.9 731 200.6 729 200.9 728.1 202.9 724.4 204.8 721 206.9 717.5 208.2 714.2 208.1 713.5 207.4 711.9 199.4 707.4 197.1 707.4 196.1 707.4 194.4 709.4 192.5 712.6ZM787.7 709C787.5 709.4 786.8 711.4 786.1 713.4 785.5 715.5 784.5 717.6 784.2 718.1 782.1 720.6 786.3 724 793.2 725.5 796 726 796.2 725.9 798.9 720.3L801.7 714.5 799.5 712.4C796.8 709.6 788.7 707.3 787.7 709ZM811.8 731.9C810.1 733.5 808.3 739 808.3 742.3 808.3 745 811.6 747 816.9 747.8 821 748.3 821.3 748.2 822.3 745.7 822.9 744.3 823.9 741.8 824.5 740.2 825.9 736.9 825.1 734.8 821.5 733 817 730.7 813.3 730.3 811.8 731.9ZM836.8 731.6C834.6 732.9 832.4 738 832.4 741.7 832.4 744.8 833.7 745.6 840.6 746.8L844.6 747.4 844 741.1C842.9 730.8 841.4 728.9 836.8 731.6ZM787.9 734.8C787.3 736.3 786.5 738.4 786 739.5 785.6 740.7 784.8 741.7 784.3 741.7 783.7 741.7 783.7 742.5 784.4 743.9 785.6 746.5 791.1 749.1 795.3 749.1 797.6 749.1 798.1 748.5 799.2 745.6 799.7 743.7 800.6 741.6 801.1 741 801.7 740.4 801.9 738.9 801.5 737.6 800.9 735.3 798.1 733.8 792.4 732.8 789.3 732.2 788.9 732.4 787.9 734.8ZM149.2 735.4C149.2 737.4 149.3 737.4 150 735.6 150.5 734.5 150.6 736.4 150.3 740.6 149.8 746.9 149.9 747.3 152.2 749.5L154.6 751.8 156.9 749.7C158.2 748.6 159.9 745.7 160.6 743.4 162.2 737.9 161 735.8 155.2 734.4 149.5 733 149.1 733.1 149.2 735.4ZM763.6 735C762.8 735.8 761.8 738.4 761.2 740.6 760.5 744.1 760.6 744.8 762.1 746.4 763.1 747.3 764.6 748.1 765.6 748.1 766.5 748.1 768.1 748.8 769.3 749.6 772.6 751.9 775.5 749.5 776.9 743.1 778.3 736.9 777.8 735.6 773.4 734.4 768.3 732.9 765.3 733.1 763.6 735ZM197.4 755.1C195.7 756.5 194 759.4 193.1 762.1 191.1 767.8 191.6 768.4 199 770.8 204 772.5 204.1 772.5 205.7 770.4 206.7 769.3 207.4 767.7 207.4 766.9 207.4 766 208.3 764.4 209.4 763.2 211.9 760.7 211.2 759.8 206 758.1 204 757.3 201.9 755.8 201.3 754.7L200.3 752.7 197.4 755.1ZM172.8 755.7C171.9 756.9 171.3 758.2 171.3 758.8 171.3 759.4 170.5 761.4 169.4 763.3 167.4 766.9 167.5 769.4 169.7 769.4 170.4 769.4 172.5 770.3 174.5 771.3 179.5 773.9 181.2 773.6 183.3 770.1 186.3 765.3 185.7 762.9 180.6 758.1 178.1 755.6 175.6 753.7 175.1 753.7 174.6 753.7 173.5 754.6 172.8 755.7ZM835.6 758.8C833.9 761.7 832.4 764.5 832.4 765.2 832.4 767.3 838.4 770.5 842.8 770.6L846.8 770.8 846.5 764.4C846.1 757.6 845.6 756.6 841.5 754.8 839 753.8 838.8 754 835.6 758.8ZM811.1 757.4C810.6 758.3 809.9 761 809.6 763.1 808.9 768.6 811.2 770.7 817.8 770.8 822.8 770.8 822.8 770.8 825.6 764.5 826.8 761.7 826.9 760.8 825.8 759.6 822.4 755.5 813 754 811.1 757.4ZM150.1 757.3C149.4 757.8 148.7 760.6 148.4 764.4 148 770.1 148.1 771 149.8 772.6 152.9 775.3 155.8 773.9 159.6 767.9L162.9 762.7 158.1 759.6C152.9 756.3 152 756.1 150.1 757.3ZM766.9 758.5C765.2 760.5 761.1 767.8 761.1 769 761.1 770.1 767.6 772.2 770.8 772.2 773.2 772.2 775 771.4 777.5 769.1L780.9 766 778.3 762.9C775.6 759.5 771.5 756.5 769.8 756.5 769.3 756.5 768 757.4 766.9 758.5ZM789.1 757.6C788.6 758.2 787.9 760.2 787.5 761.9 787.1 763.8 786.2 765.2 785.2 765.5 782.6 766.1 784 768.3 787.8 769.4 789.7 770.1 792.1 771.6 793.2 773L795.2 775.3 798 772.5C800.7 769.8 803.3 763 802.5 760.6 802 759.5 794 756.5 791.4 756.5 790.6 756.5 789.6 757 789.1 757.6ZM220.1 779.4C218.4 781.3 216.7 786.2 216.7 789.2 216.7 790.3 218.1 791.5 221.1 792.7 223.5 793.7 226.1 795.2 226.9 795.9 228.1 797 228.7 796.5 231.4 791.3 233.1 788 234.3 784.6 234.1 783.7 233.6 781.4 229.7 778.9 225.5 778.2 222.4 777.8 221.4 778.1 220.1 779.4ZM790.9 781C789.3 782.8 787.9 785 787.9 785.9 787.5 791 789.4 794.4 793.9 796.8 797.8 798.9 799.4 798 801 792.8 801.7 790.9 802.8 788.9 803.5 788.3 805.7 786.8 804.2 784.4 799.6 782.4 797.4 781.5 795.2 780 794.7 779.2 794 777.9 793.4 778.1 790.9 781ZM838.2 778.9C837.7 779.5 836.9 781.1 836.6 782.4 836.2 783.7 835.3 785.5 834.4 786.4 833.1 787.9 833.2 788.2 836.1 791.2 839.8 795 841.9 795.8 844.4 794.5 848.1 792.5 849.1 790.6 849.1 786.1 849.1 782.4 848.7 781.5 846.8 780.2 843.4 778 839.4 777.4 838.2 778.9ZM196.9 780.7C196 781.9 195.4 783.2 195.4 783.7 195.4 784.2 194.4 785.6 193.4 786.8 191.7 788.5 191.6 789.1 192.7 790.4 193.8 791.8 203 796.3 204.6 796.3 205.4 796.3 211.1 785.6 211.1 784.3 211.1 783.2 201.9 778.7 200 778.7 199 778.7 197.6 779.6 196.9 780.7ZM815.6 779.6C814.7 780.2 812.8 782.4 811.2 784.7L808.4 788.8 812.1 792C816.1 795.7 819.5 796.3 823 793.9 824.2 793.1 825 791.5 825 790.1 825 788.5 825.6 787.6 826.9 787.3 829.4 786.7 828.9 785.5 824.9 782.3 821.2 779.4 817.8 778.3 815.6 779.6ZM173.3 780.7C172.9 781.4 171.6 783.7 170.6 785.9L168.7 789.8 171.5 792.6C176.4 797.6 181.9 797.4 185.1 792.2 188.9 786.1 187.1 782.3 179.6 780.6 174.4 779.4 174.4 779.4 173.3 780.7ZM764.8 783.3C764.2 785 763.5 788.1 763.5 790.1 763.4 793.7 763.6 794 766.8 794.9 768.6 795.4 770.7 796.4 771.6 797 775 799.9 778.4 795.9 779.4 787.8 779.8 783.6 779.7 783.3 777.2 782.4 775.7 781.8 772.6 781.1 770.3 780.8 766.2 780.4 766 780.5 764.8 783.3ZM149.1 785.5C144.8 789.4 144.8 792.3 149 795.1 150.7 796.3 153 797.2 154.1 797.2 156.9 797.2 161.4 794.3 162.9 791.3 164.2 789 164.1 788.7 161.1 785.6 156.9 781.4 153.5 781.4 149.1 785.5ZM840.2 800.7C839.6 801.1 838.2 803.3 837.2 805.7 834.7 811.5 832.7 811.5 826.8 806 821.7 801.3 818 800.6 814.7 803.8 813.2 805.3 813 806.6 813.1 810.5 813.4 814.7 813.8 815.5 816.7 817.4 821 820.3 824.1 819.8 825.4 816 825.9 814.4 827.1 812.3 828 811.4 829.5 809.9 829.7 809.9 832.1 811.9 835.4 814.4 844.1 818.5 846.4 818.5 847.4 818.5 848.1 818 848.1 817.3 848.1 816.7 849 814.6 850 812.7 852.3 808.4 852.4 805.6 850.3 805 848.4 804.4 845.8 803.1 843.1 801.3 842 800.6 840.7 800.4 840.2 800.7ZM196.9 806.2C195 809.2 193.5 811.9 193.5 812.3 193.5 815 203.1 820.2 206 819.1 206.8 818.8 208.5 816.2 209.8 813.4 212.3 808 211.9 805.6 208.4 805.6 207.5 805.6 205.5 804.5 203.7 803.2 201.9 801.9 200.5 800.9 200.4 800.9 200.3 800.9 198.6 803.3 196.9 806.2ZM221.5 803.4C220.7 804.8 218.5 813.8 218.5 815.3 218.5 815.6 220.2 816 222.2 816.3 224.4 816.7 225.9 817.4 225.9 818.1 225.9 819.8 229.2 819.8 230.8 818.1 231.6 817.4 232.9 814.6 233.7 811.9 235.6 806.2 235.2 805.6 228.3 803.3 222.6 801.5 222.5 801.5 221.5 803.4ZM792.4 803.4C790.3 805.8 786.8 814.5 787.4 815.6 788.2 816.9 796.1 820.4 798.2 820.4 800.6 820.4 803 816.5 803.4 811.8 804 807.3 803 805.9 798.7 805.2 797.3 804.9 795.6 804.1 795 803.2 794 801.9 793.8 801.9 792.4 803.4ZM172.4 808.3C170.7 811.4 169.4 814.1 169.4 814.4 169.4 814.6 170.8 815.4 172.5 816 174.1 816.8 176.3 818.2 177.2 819.4 179 821.3 179 821.4 176.1 826.9 172.2 834.1 172.2 838.1 175.9 841.8 180 845.8 183.1 845.2 185.8 839.8 188.7 833.9 188.5 831.8 185 829.6 178.8 826 178.6 825.5 181.9 821.6 184.3 818.7 188.1 809.4 187.5 808.3 186.9 807.4 177.4 802.8 176.2 802.8 175.7 802.8 174 805.3 172.4 808.3ZM149.6 805.7C148 808.4 146 815.5 146.8 816.7 147 817 148.8 818 150.7 818.6 152.6 819.2 154.8 820.3 155.6 821 158.8 823.7 162.5 819.4 163.5 811.8 164.1 807.8 164.1 807.7 160.6 806.3 153.4 803.5 151.2 803.3 149.6 805.7ZM766.2 807.8C765.5 809.5 764.4 811.2 763.9 811.6 763.4 811.9 763 813.1 763 814.4 763 816.3 763.8 817.1 767.3 818.6 769.7 819.6 772 821 772.5 821.6 773.4 823.1 780.6 815 780.6 812.4 780.6 810.2 778.7 808.3 774.4 806.1 769.7 803.8 767.7 804.2 766.2 807.8ZM223.7 824.5C223 825.3 222.1 827.1 221.8 828.7 221.4 830.2 220.3 832.1 219.2 832.9 215.1 835.7 220.9 841.3 228.9 841.9 231.8 842.1 231.9 841.9 234 836.4 235.8 831.2 235.9 830.5 234.6 829.2 233.8 828.4 232.4 827.8 231.4 827.8 230.4 827.8 228.5 826.8 227.3 825.6 225.3 823.5 224.8 823.4 223.7 824.5ZM840 826.9C838.9 828 838 829.5 838 830.6 838 831.5 837.3 832.7 836.5 833.1 835.4 833.8 835.1 834.7 835.6 836.4 836 838.2 837 839.1 840.1 839.9 842.2 840.6 844.5 841.5 845.3 842 846.7 843.1 846.9 842.8 851.4 835.8 852.7 833.9 853.7 831.9 853.7 831.5 853.7 830.4 845.4 825 843.5 825 842.7 825 841.1 825.8 840 826.9ZM198.2 828.3C195.9 831.3 194.8 836.8 196 838.8 197.1 840.6 205 843.6 206.9 843 207.6 842.7 209 840.4 210 837.9 211.1 835.4 212.4 833.3 213 833.3 214.8 833.3 212.9 831.5 208.1 828.7 202.1 825.3 200.6 825.3 198.2 828.3ZM814.4 830.7C811.4 837.2 811.5 838.3 815.2 840.6 818.3 842.6 820.9 843.1 823.6 842 825.1 841.5 830.6 834.1 830.6 832.7 830.5 831.2 821.6 825.9 819.1 825.9 816.9 825.9 816.2 826.7 814.4 830.7ZM768.7 830.4C766.6 832.4 764.8 834.6 764.8 835.4 764.8 838.6 771.9 846.3 774.9 846.3 776.6 846.3 781.5 838.8 781.5 836.3 781.5 834.2 775.2 826.9 773.2 826.9 772.9 826.9 770.8 828.4 768.7 830.4ZM793.9 827.6C791.8 828.9 788.9 834.8 788.9 837.7 788.9 840.4 789.3 840.7 792.6 841.7 794.5 842.2 796.7 843.3 797.1 844.3 798 845.7 798.1 845.7 799.9 844 801.6 842.3 806.8 833.1 806.2 832.8 797.8 826.7 796.2 826 793.9 827.6ZM150.7 829.4C149.1 831.2 146.9 839.4 147.7 840.7 148 841.2 149.7 842 151.7 842.7 153.5 843.2 155.8 844.4 156.8 845.2 158.1 846.5 158.5 846.4 160.2 844.9 162.5 842.9 165.1 836.1 164.6 833.2 164.4 830.7 161.6 829.2 156 828.2 153.1 827.8 151.9 828.1 150.7 829.4ZM840.5 849.5C839.6 850.3 838.2 853.2 837.4 856.1 835.6 861.5 836.2 863.3 839.9 864.1 841.9 864.4 853.1 854 852.4 852.3 852.1 851.6 850.3 850.6 848.1 850 846 849.4 843.8 848.8 843.1 848.5 842.4 848.2 841.2 848.7 840.5 849.5ZM198.4 854.5C196.8 857.6 195.4 860.5 195.4 860.9 195.4 861.5 197.7 863.1 200.6 864.8 205 867.3 206.2 867.6 208 866.8 210.2 865.8 210.6 864.9 210.3 861.8 210.1 860.8 211 859.8 212.4 859.3 215.4 858.1 215.4 857.3 212.8 854.9 210.9 853.3 203 849.1 201.8 849.1 201.6 849.1 200 851.6 198.4 854.5ZM223.3 850.2C222.7 850.8 222.2 852.2 222.2 853.3 222.2 855.5 220.5 857.9 218.3 858.5 216.6 859.2 218.4 861.1 222.3 862.7 224.4 863.4 226.6 864.9 227.2 865.9 229.1 868.6 231.4 866.9 234.5 860.7 237.7 854.4 237.1 852.7 230.8 850.6 225.6 848.8 224.8 848.7 223.3 850.2ZM793 852.3C792.3 854.1 791.7 855.9 791.7 856.4 791.7 856.9 790.8 857.9 789.7 858.7 788.3 859.6 788 860.6 788.4 861.9 789.1 864.2 795.8 867.6 799.7 867.6 802.4 867.6 802.7 867.2 804.5 861.9 806.8 855.4 806.4 854.5 801 853 799.1 852.3 797.1 851.2 796.9 850.5 796 848.1 794.4 848.9 793 852.3ZM816.3 851.1C814.4 852.7 813.7 854.4 813.2 858.1L812.7 863 816.3 864.4C818.3 865.2 820.8 866.3 821.9 866.9 824.8 868.2 826.3 866.8 828.7 860.4 830.9 854.5 830.7 853.4 827.1 851.6 821.9 848.9 819 848.8 816.3 851.1ZM770.6 852C768 855.1 765.7 859.7 765.7 862.5 765.7 864.4 766.5 865.2 769.3 866.4 771.1 867.2 774.1 867.9 775.8 868 778.7 868.1 779.1 867.8 779.8 864.8 780.3 863.1 781.5 860.8 782.5 860 784.9 858 784.2 856.8 779.1 854.5 776.8 853.6 774.7 852.2 774.4 851.4 773.7 849.5 772.9 849.6 770.6 852ZM174.6 853C173.8 854.2 172.9 857 172.6 859.4L172 863.4 177.7 866C182.1 868.1 183.7 868.4 185.2 867.6 187.1 866.6 190.2 857.7 189.4 855.5 188.5 853.3 185.4 851.8 180.6 851.2 176.6 850.7 175.9 850.9 174.6 853ZM150.7 854.3C149.6 856.6 149.9 857 155.4 862.1 158.5 865.2 161.5 867.6 161.9 867.6 163.1 867.6 166 860.6 166 857.8 166 855.1 164.9 854.2 160.2 852.8 154.5 851.2 151.9 851.6 150.7 854.3ZM225.2 872.4C224.5 873.1 224.1 874.3 224.1 875.1 224.1 876 223.1 878 221.8 879.4 220.4 881.1 219.6 882.9 220 883.7 220.9 886 230.5 890.3 232.3 889.2 234.3 888 236.1 884.2 236.8 880 237.3 876.4 236.3 875 232.7 875 231.5 875 230.1 874.2 229.4 873.1 228.1 871 226.8 870.8 225.2 872.4ZM176.1 875.2C173.8 877.5 175.1 880.1 181 885 186.7 889.6 186.9 889.7 187.5 887.8 187.9 886.6 189.1 884.7 190.1 883.5L191.9 881.5 189.7 879.1C185.8 874.8 178.6 872.7 176.1 875.2ZM200.1 876.4C198.6 877.7 197 879.5 196.8 880.6 196 882.9 198.6 886.8 201.9 888.5 205 890.1 207.2 889.3 212.9 884.5 215.6 882.2 215.8 881.6 215 879.9 213.5 877.3 208.2 874.1 205.3 874.1 204 874.1 201.7 875.1 200.1 876.4ZM770.2 876.1C768.1 877.7 766.7 881.7 766.7 885.6 766.7 888.5 767 888.9 770.2 889.7 772 890.3 774.5 891.3 775.6 892.1 777.4 893.3 777.8 893.3 780 891.1 784.3 886.8 784.4 879 780.2 877 776.2 875.3 771.9 874.8 770.2 876.1ZM792.2 879.3C791.3 881.8 790.6 884.5 790.5 885.6 790.2 887.9 794.4 890.7 798.8 891.4 801.9 891.8 802.8 891.6 804.4 889.4 805.4 888.1 806.5 885.4 806.9 883.2 807.7 877.9 805.6 875.7 798.8 875.2L793.8 874.8 792.2 879.3ZM745.4 879.3C744.7 880.7 743.7 883.1 743 884.5 741.3 887.9 741.7 888.4 747.2 891.2 749.7 892.5 752 894 752.4 894.5 753.3 896.1 759.3 886.3 759.3 883.1 759.3 879.9 756.1 877.7 750.5 877 746.7 876.7 746.3 876.8 745.4 879.3ZM225.6 897.7C224.8 898.4 223.9 900.4 223.6 902 223.2 903.7 222.5 905.6 221.9 906.3 220.8 907.7 220.6 907.4 226.6 911.1 232 914.4 234.1 914.3 236.3 910.5 238.1 907.3 239.1 901.8 238.1 900.4 236.2 897.4 227.7 895.6 225.6 897.7ZM747.9 900.4C746.2 902.1 743.2 910 743.8 911.4 744.1 912 746.7 913.7 749.5 915.3L754.8 918.1 757 915.5C761.8 910 761.1 904.9 755.3 901.4 750.6 898.7 749.7 898.6 747.9 900.4ZM769.4 901.9C768.2 904.1 767.6 906.3 767.8 908.7 768.1 912 768.3 912.3 772.6 914L777.2 915.6 780.3 913.3C783.4 910.9 784.6 908.2 784.1 904.5 783.8 902 780.3 900 774.9 899.4 771.7 898.9 771.2 899.1 769.4 901.9Z",
+ "width": 1000
+ },
+ "search": [
+ "roboticon"
+ ]
}
]
}
\ No newline at end of file
diff --git a/assets/app_icons/fonts/DQIcons.ttf b/assets/app_icons/fonts/DQIcons.ttf
index 3cff7aa3..bc92c83d 100644
Binary files a/assets/app_icons/fonts/DQIcons.ttf and b/assets/app_icons/fonts/DQIcons.ttf differ
diff --git a/assets/images/gif/robot-idle.gif b/assets/images/gif/robot-idle.gif
new file mode 100644
index 00000000..89dee325
Binary files /dev/null and b/assets/images/gif/robot-idle.gif differ
diff --git a/assets/images/gif/robot-speaking.gif b/assets/images/gif/robot-speaking.gif
new file mode 100644
index 00000000..253d786b
Binary files /dev/null and b/assets/images/gif/robot-speaking.gif differ
diff --git a/assets/images/logo_HMG.png b/assets/images/logo_HMG.png
new file mode 100644
index 00000000..0d9e4a56
Binary files /dev/null and b/assets/images/logo_HMG.png differ
diff --git a/assets/images/pharmacy/Redheart.svg b/assets/images/pharmacy/Redheart.svg
new file mode 100644
index 00000000..3bba67fa
--- /dev/null
+++ b/assets/images/pharmacy/Redheart.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/pharmacy/heart-empty.svg b/assets/images/pharmacy/heart-empty.svg
new file mode 100644
index 00000000..a682a44e
--- /dev/null
+++ b/assets/images/pharmacy/heart-empty.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/pharmacy/sort.png b/assets/images/pharmacy/sort.png
new file mode 100644
index 00000000..0143d915
Binary files /dev/null and b/assets/images/pharmacy/sort.png differ
diff --git a/assets/images/roboticon.png b/assets/images/roboticon.png
new file mode 100644
index 00000000..5b04e287
Binary files /dev/null and b/assets/images/roboticon.png differ
diff --git a/assets/images/soundWaveAnimation.gif b/assets/images/soundWaveAnimation.gif
new file mode 100644
index 00000000..730e27eb
Binary files /dev/null and b/assets/images/soundWaveAnimation.gif differ
diff --git a/flutter_tts-voice_enhancement/.github/ISSUE_TEMPLATE/bug_report.md b/flutter_tts-voice_enhancement/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 00000000..614a6708
--- /dev/null
+++ b/flutter_tts-voice_enhancement/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,21 @@
+---
+name: Bug report
+about: Create a report to help us improve
+
+---
+
+## 🐛 Bug Report
+
+
+
+### Expected behavior
+
+### Reproduction steps
+
+### Configuration
+
+**Version:** 0.1.x
+
+**Platform:**
+- [ ] :iphone: iOS
+- [ ] :robot: Android
diff --git a/flutter_tts-voice_enhancement/.github/ISSUE_TEMPLATE/feature_request.md b/flutter_tts-voice_enhancement/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 00000000..35a881a3
--- /dev/null
+++ b/flutter_tts-voice_enhancement/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,19 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+
+---
+
+## 🚀 Feature Requests
+
+
+
+### Contextualize the feature
+
+
+### Describe the feature
+
+
+### Platforms affected (mark all that apply)
+- [ ] :iphone: iOS
+- [ ] :robot: Android
diff --git a/flutter_tts-voice_enhancement/.github/ISSUE_TEMPLATE/questions-and-help.md b/flutter_tts-voice_enhancement/.github/ISSUE_TEMPLATE/questions-and-help.md
new file mode 100644
index 00000000..ba501f3c
--- /dev/null
+++ b/flutter_tts-voice_enhancement/.github/ISSUE_TEMPLATE/questions-and-help.md
@@ -0,0 +1,9 @@
+---
+name: Questions and Help
+about: If you have questions, please use this for support
+
+---
+
+## 💬 Questions and Help
+
+Provide question related to this flutter plugin.
diff --git a/flutter_tts-voice_enhancement/.github/workflows/main.yml b/flutter_tts-voice_enhancement/.github/workflows/main.yml
new file mode 100644
index 00000000..832dd069
--- /dev/null
+++ b/flutter_tts-voice_enhancement/.github/workflows/main.yml
@@ -0,0 +1,34 @@
+name: github pages
+
+on:
+ push:
+ branches:
+ - master
+
+jobs:
+ deploy:
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Setup Flutter
+ run: |
+ git clone https://github.com/flutter/flutter.git --depth 1 -b beta _flutter
+ echo "::add-path::${GITHUB_WORKSPACE}/_flutter/bin"
+
+ - name: Install
+ run: |
+ cd example
+ flutter config --enable-web
+ flutter pub get
+
+ - name: Build
+ run: |
+ cd example
+ flutter build web
+
+ - name: Deploy
+ uses: peaceiris/actions-gh-pages@v3
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./example/build/web
diff --git a/flutter_tts-voice_enhancement/.gitignore b/flutter_tts-voice_enhancement/.gitignore
new file mode 100644
index 00000000..bc0883df
--- /dev/null
+++ b/flutter_tts-voice_enhancement/.gitignore
@@ -0,0 +1,94 @@
+# Miscellaneous
+*.class
+*.lock
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.project
+.svn/
+bin/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# Android Studio related
+android/.classpath
+android/.settings/
+
+# Visual Studio Code related
+.vscode/
+
+# Flutter repo-specific
+/bin/cache/
+/bin/mingit/
+/dev/benchmarks/mega_gallery/
+/dev/bots/.recipe_deps
+/dev/bots/android_tools/
+/dev/docs/doc/
+/dev/docs/lib/
+/dev/docs/pubspec.yaml
+/packages/flutter/coverage/
+version
+
+# Flutter/Dart/Pub related
+**/doc/api/
+.dart_tool/
+.flutter-plugins
+.packages
+.pub-cache/
+.pub/
+build/
+flutter_*.png
+linked_*.ds
+unlinked.ds
+unlinked_spec.ds
+
+# Android related
+**/android/**/gradle-wrapper.jar
+**/android/.gradle
+**/android/captures/
+**/android/gradlew
+**/android/gradlew.bat
+**/android/local.properties
+**/android/**/GeneratedPluginRegistrant.java
+
+# iOS/XCode related
+**/ios/**/*.mode1v3
+**/ios/**/*.mode2v3
+**/ios/**/*.moved-aside
+**/ios/**/*.pbxuser
+**/ios/**/*.perspectivev3
+**/ios/**/*sync/
+**/ios/**/.sconsign.dblite
+**/ios/**/.tags*
+**/ios/**/.vagrant/
+**/ios/**/DerivedData/
+**/ios/**/Icon?
+**/ios/**/Pods/
+**/ios/**/.symlinks/
+**/ios/**/profile
+**/ios/**/xcuserdata
+**/ios/.generated/
+**/ios/Flutter/App.framework
+**/ios/Flutter/Flutter.framework
+**/ios/Flutter/Generated.xcconfig
+**/ios/Flutter/app.flx
+**/ios/Flutter/app.zip
+**/ios/Flutter/flutter_assets/
+**/ios/ServiceDefinitions.json
+**/ios/Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!**/ios/**/default.mode1v3
+!**/ios/**/default.mode2v3
+!**/ios/**/default.pbxuser
+!**/ios/**/default.perspectivev3
+!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
+example/ios/Flutter/flutter_export_environment.sh
diff --git a/flutter_tts-voice_enhancement/CHANGELOG.md b/flutter_tts-voice_enhancement/CHANGELOG.md
new file mode 100644
index 00000000..bff8b759
--- /dev/null
+++ b/flutter_tts-voice_enhancement/CHANGELOG.md
@@ -0,0 +1,197 @@
+# ChangeLog
+
+## 1.3.0
+
+- All: Adding await speak completion
+
+## 1.2.7
+
+- iOS: Adding utterance settings to synthesizeToFile
+- Android: Fix crash when utterance completes after Engine is detached
+
+## 1.2.6
+
+- Android: Fixing new API onAttachedToEngine call
+
+## 1.2.5
+
+- macOS: Adding support
+
+## 1.2.4
+
+- iOS: Deactivate audio session only when needed
+- Android: Better exception handling for getLanguages
+- Android: Adding getEngines
+- Android: Adding new Android plugin APIs
+
+## 1.2.3
+
+- iOS: Adding synthesize to file
+- iOS: Fix set category ios
+
+## 1.2.2
+
+- Web: Adding pause and continue
+
+## 1.2.1
+
+- iOS: Fix setting iOS Category
+- iOS/Android: Adding additional platform calls
+
+## 1.2.0
+
+- iOS: Adding Set Audio Session Category
+- Android: Bug fixes
+
+## 1.1.0
+
+- iOS: Adding Pause
+- iOS: Adding set Shared Instance
+
+## 1.0.0
+
+- iOS/Android: Feature - Speech marks
+- iOS/Android: Breaking changes to Speech rate
+
+## 0.9.2
+
+- iOS: Changing audio session to playAndRecord
+
+## 0.9.1
+
+- Android: Fixing method call error
+
+## 0.9.0
+
+- Android: Adding synthesize to file
+
+## 0.8.7
+
+- Android: Fix sporadic ANR on initialization
+
+## 0.8.6
+
+- iOS: Reducing volume of other sessions while TTS is playing
+
+## 0.8.5
+
+- Android: Fix Android async platform initialization
+- Android: Removing initHandler
+
+## 0.8.2
+
+- Web: Adding isLanguageAvailable method
+- All: Fixing isLanguageAvailable platform channel and making it case insensitive
+
+## 0.8.0
+
+- Web: Adding Web Support
+
+## 0.7.0
+
+- iOS: Adding Swift version 4.2 to podspec and correct audio playback category
+
+## 0.6.0
+
+- Android: AndroidX support
+
+## 0.5.2
+
+- Android: Bug Fix on isLanguageAvailable
+
+## 0.5.1
+
+- Applying flutter format to fix health suggestion
+
+## 0.5.0
+
+- Android: Adding silence before speak
+- Android: Removing deprecated API
+
+## 0.2.6
+
+- IOS: Add voice selection implementation
+
+## 0.2.5
+
+- Android: Ensure invokeMethod runs on main thread
+
+## 0.2.4
+
+- Android: setting minSDK back to 21 and adding instructions to readme
+- Android: Adding fallback for getLanguages and defaultLanguage
+
+## 0.2.3
+
+- IOS: Audio continues with the Ring/Silent switch set to silent
+
+## 0.2.2
+
+- Android: Fixing Locale bug
+
+## 0.2.1
+
+- IOS: Fixing getLanguages bug
+
+## 0.2.0
+
+- Android: Adding exception catch for samsung devices
+- Android: Using default com.google.android.tts engine
+- Android: Get and Set Voice
+- Android: InitHandler
+- Cleaning up the example
+
+## 0.1.2
+
+- Support for Android background execution
+- Updating Android build gradle version to 3.2.1
+
+## 0.1.1
+
+- Fixing TTS bound error in the example
+- Fixing default voice language not found error on Android
+
+## 0.1.0
+
+- Updating version for improved maintenance score
+- Updating package description for improved maintenance score
+
+## 0.0.8
+
+- Adding analysis_options.yaml for improved health score
+- Fixing info/errors from flutter analyze
+
+## 0.0.7
+
+- Updating SDK version in pubspec.yaml
+- Adding package link to README
+- Fixing language string warning received from xcode
+
+## 0.0.6
+
+- Android: Upgrading Gradle 4.1 to 4.4
+- Android: Setting minSdk version to 21
+- Android: Adding try/catch to getAvailableLanguages & getDefaultVoice methods (Issues with API 21 & 22)
+
+## 0.0.5
+
+- Adding IOS/Android isLanguageAvailable
+- Rename setRate to setSpeechRate
+
+## 0.0.4
+
+- Simplify podspec for Cocoapods 1.5.0
+
+## 0.0.3
+
+- Adding IOS/Android speech pitch and volume
+
+## 0.0.2
+
+- Flutter formatting and fixing pubspec sdk versioning
+
+## 0.0.1
+
+- first POC :
+ - methods : speak, stop, setRate, setLangauge, getLanguages
+ - a globalHandler for completion
diff --git a/flutter_tts-voice_enhancement/CODE_OF_CONDUCT.md b/flutter_tts-voice_enhancement/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000..43989576
--- /dev/null
+++ b/flutter_tts-voice_enhancement/CODE_OF_CONDUCT.md
@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at eyedea32@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/flutter_tts-voice_enhancement/LICENSE b/flutter_tts-voice_enhancement/LICENSE
new file mode 100644
index 00000000..56dcdf22
--- /dev/null
+++ b/flutter_tts-voice_enhancement/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Daniel Lutton
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/flutter_tts-voice_enhancement/README.md b/flutter_tts-voice_enhancement/README.md
new file mode 100644
index 00000000..4e32d45d
--- /dev/null
+++ b/flutter_tts-voice_enhancement/README.md
@@ -0,0 +1,194 @@
+# Text To Speech
+
+[](https://pub.dartlang.org/packages/flutter_tts)
+
+A flutter text to speech plugin (Swift,Java)
+
+## Features
+
+- [x] Android, iOS, Web, & macOS
+ - [x] speak
+ - [x] stop
+ - [x] get languages
+ - [x] set language
+ - [x] set speech rate
+ - [x] set speech volume
+ - [x] set speech pitch
+ - [x] is language available
+- [x] Android, iOS
+ - [x] get voices
+ - [x] set voice
+ - [x] speech marks (requires iOS 7+ and Android 26+)
+ - [x] synthesize to file (requires iOS 13+)
+- [x] iOS, Web
+ - [x] pause
+- [x] Android
+ - [x] set Silence
+- [x] iOS
+ - [x] set shared instance
+ - [x] set audio session category
+
+## Usage
+
+## macOS
+
+```bash
+OSX version: 10.15
+```
+
+[Example App](https://github.com/dlutton/flutter_tts/tree/macOS_app) from the macOS_app branch
+
+## Web
+
+[Website](https://dlutton.github.io/flutter_tts) from the example directory.
+
+## Android
+
+Change the minimum Android sdk version to 21 (or higher) in your `android/app/build.gradle` file.
+
+```java
+minSdkVersion 21
+```
+
+## iOS
+
+There's a known issue with integrating plugins that use Swift into a Flutter project created with the Objective-C template. [Flutter#16049](https://github.com/flutter/flutter/issues/16049)
+
+[Example](https://github.com/dlutton/flutter_tts/blob/master/example/lib/main.dart)
+
+To use this plugin :
+
+- add the dependency to your [pubspec.yaml](https://github.com/dlutton/flutter_tts/blob/master/example/pubspec.yaml) file.
+
+```yaml
+ dependencies:
+ flutter:
+ sdk: flutter
+ flutter_tts:
+```
+
+- instantiate FlutterTts
+
+```dart
+FlutterTts flutterTts = FlutterTts();
+
+```
+
+To set shared audio [instance](https://developer.apple.com/documentation/avfoundation/avaudiosession/1616504-sharedinstance) (iOS only):
+
+```dart
+await flutterTts.setSharedInstance(true);
+```
+
+To set audio [category and options](https://developer.apple.com/documentation/avfoundation/avaudiosession) (iOS only):
+
+```dart
+await flutterTts
+ .setIosAudioCategory(IosTextToSpeechAudioCategory.playAndRecord, [
+ IosTextToSpeechAudioCategoryOptions.allowBluetooth,
+ IosTextToSpeechAudioCategoryOptions.allowBluetoothA2DP,
+ IosTextToSpeechAudioCategoryOptions.mixWithOthers
+ ]);
+```
+
+To await speak completion.
+
+```dart
+await flutterTts.awaitSpeakCompletion(true);
+```
+
+### speak, stop, getLanguages, setLanguage, setSpeechRate, setVoice, setVolume, setPitch, isLanguageAvailable, setSharedInstance
+
+```dart
+Future _speak() async{
+ var result = await flutterTts.speak("Hello World");
+ if (result == 1) setState(() => ttsState = TtsState.playing);
+}
+
+Future _stop() async{
+ var result = await flutterTts.stop();
+ if (result == 1) setState(() => ttsState = TtsState.stopped);
+}
+
+List languages = await flutterTts.getLanguages;
+
+await flutterTts.setLanguage("en-US");
+
+await flutterTts.setSpeechRate(1.0);
+
+await flutterTts.setVolume(1.0);
+
+await flutterTts.setPitch(1.0);
+
+await flutterTts.isLanguageAvailable("en-US");
+
+// iOS and Web only
+await flutterTts.pause();
+
+// iOS, macOS, and Android only
+await flutterTts.synthesizeToFile("Hello World", Platform.isAndroid ? "tts.wav" : "tts.caf");
+
+await flutterTts.setVoice({"name": "Karen", "locale": "en-AU"});
+
+// iOS only
+await flutterTts.setSharedInstance(true);
+
+// Android only
+await flutterTts.setSilence(2);
+
+await flutterTts.getEngines();
+```
+
+### Listening for platform calls
+
+```dart
+flutterTts.setStartHandler(() {
+ setState(() {
+ ttsState = TtsState.playing;
+ });
+});
+
+flutterTts.setCompletionHandler(() {
+ setState(() {
+ ttsState = TtsState.stopped;
+ });
+});
+
+flutterTts.setProgressHandler((String text, int startOffset, int endOffset, String word) {
+ setState(() {
+ _currentWord = word;
+ });
+});
+
+flutterTts.setErrorHandler((msg) {
+ setState(() {
+ ttsState = TtsState.stopped;
+ });
+});
+
+flutterTts.setCancelHandler((msg) {
+ setState(() {
+ ttsState = TtsState.stopped;
+ });
+});
+
+// iOS and Web
+flutterTts.setPauseHandler((msg) {
+ setState(() {
+ ttsState = TtsState.paused;
+ });
+});
+
+flutterTts.setContinueHandler((msg) {
+ setState(() {
+ ttsState = TtsState.continued;
+ });
+});
+```
+
+## Getting Started
+
+For help getting started with Flutter, view our online
+[documentation](https://flutter.dev/).
+
+For help on editing plugin code, view the [documentation](https://flutter.dev/platform-plugins/#edit-code).
diff --git a/flutter_tts-voice_enhancement/analysis_options.yaml b/flutter_tts-voice_enhancement/analysis_options.yaml
new file mode 100644
index 00000000..e8779c50
--- /dev/null
+++ b/flutter_tts-voice_enhancement/analysis_options.yaml
@@ -0,0 +1,35 @@
+analyzer:
+ strong-mode:
+ implicit-casts: false
+ errors:
+ unused_import: error
+ unused_local_variable: error
+ dead_code: error
+linter:
+ rules:
+ - avoid_empty_else
+ - comment_references
+ - control_flow_in_finally
+ - empty_statements
+ - hash_and_equals
+ - only_throw_errors
+ - test_types_in_equals
+ - throw_in_finally
+ - unrelated_type_equality_checks
+ - valid_regexps
+ - avoid_init_to_null
+ - avoid_return_types_on_setters
+ - await_only_futures
+ - camel_case_types
+ - directives_ordering
+ - empty_catches
+ - empty_constructor_bodies
+ - library_names
+ - library_prefixes
+ - non_constant_identifier_names
+ - omit_local_variable_types
+ - prefer_final_fields
+ - prefer_is_not_empty
+ - prefer_typing_uninitialized_variables
+ - slash_for_doc_comments
+ - type_init_formals
\ No newline at end of file
diff --git a/flutter_tts-voice_enhancement/android/.gitignore b/flutter_tts-voice_enhancement/android/.gitignore
new file mode 100644
index 00000000..c6cbe562
--- /dev/null
+++ b/flutter_tts-voice_enhancement/android/.gitignore
@@ -0,0 +1,8 @@
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
diff --git a/flutter_tts-voice_enhancement/android/build.gradle b/flutter_tts-voice_enhancement/android/build.gradle
new file mode 100644
index 00000000..1308c920
--- /dev/null
+++ b/flutter_tts-voice_enhancement/android/build.gradle
@@ -0,0 +1,48 @@
+def PLUGIN = "flutter_tts";
+def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning";
+gradle.buildFinished { buildResult ->
+ if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) {
+ println ' *********************************************************'
+ println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.'
+ println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.'
+ println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.'
+ println ' *********************************************************'
+ rootProject.ext.set(ANDROIDX_WARNING, true);
+ }
+}
+
+group 'com.tundralabs.fluttertts'
+version '1.0-SNAPSHOT'
+
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.4.2'
+ }
+}
+
+rootProject.allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+
+apply plugin: 'com.android.library'
+
+android {
+ compileSdkVersion 28
+
+ defaultConfig {
+ minSdkVersion 21
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ targetSdkVersion 27
+ }
+ lintOptions {
+ disable 'InvalidPackage'
+ }
+}
diff --git a/flutter_tts-voice_enhancement/android/gradle.properties b/flutter_tts-voice_enhancement/android/gradle.properties
new file mode 100644
index 00000000..a6738207
--- /dev/null
+++ b/flutter_tts-voice_enhancement/android/gradle.properties
@@ -0,0 +1,4 @@
+org.gradle.jvmargs=-Xmx1536M
+android.useAndroidX=true
+android.enableJetifier=true
+android.enableR8=true
diff --git a/flutter_tts-voice_enhancement/android/gradle/wrapper/gradle-wrapper.properties b/flutter_tts-voice_enhancement/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..8d9c8a3f
--- /dev/null
+++ b/flutter_tts-voice_enhancement/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri Sep 27 12:18:40 PDT 2019
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
diff --git a/flutter_tts-voice_enhancement/android/settings.gradle b/flutter_tts-voice_enhancement/android/settings.gradle
new file mode 100644
index 00000000..26aeb433
--- /dev/null
+++ b/flutter_tts-voice_enhancement/android/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = 'flutter_tts'
diff --git a/flutter_tts-voice_enhancement/android/src/main/AndroidManifest.xml b/flutter_tts-voice_enhancement/android/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..9cad3a1b
--- /dev/null
+++ b/flutter_tts-voice_enhancement/android/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/flutter_tts-voice_enhancement/android/src/main/java/com/tundralabs/fluttertts/FlutterTtsPlugin.java b/flutter_tts-voice_enhancement/android/src/main/java/com/tundralabs/fluttertts/FlutterTtsPlugin.java
new file mode 100644
index 00000000..92e6a092
--- /dev/null
+++ b/flutter_tts-voice_enhancement/android/src/main/java/com/tundralabs/fluttertts/FlutterTtsPlugin.java
@@ -0,0 +1,454 @@
+package com.tundralabs.fluttertts;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.UtteranceProgressListener;
+import android.speech.tts.Voice;
+import android.util.Log;
+import androidx.annotation.NonNull;
+import io.flutter.embedding.engine.plugins.FlutterPlugin;
+import io.flutter.plugin.common.BinaryMessenger;
+import io.flutter.plugin.common.MethodCall;
+import io.flutter.plugin.common.MethodChannel;
+import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
+import io.flutter.plugin.common.MethodChannel.Result;
+import io.flutter.plugin.common.PluginRegistry.Registrar;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.UUID;
+
+/** FlutterTtsPlugin */
+public class FlutterTtsPlugin implements MethodCallHandler, FlutterPlugin {
+ private Handler handler;
+ private MethodChannel methodChannel;
+ private MethodChannel.Result speakResult;
+ private boolean awaitSpeakCompletion = false;
+ private boolean speaking = false;
+ private Context context;
+ private TextToSpeech tts;
+ private final String tag = "TTS";
+ private final String googleTtsEngine = "com.google.android.tts";
+ private boolean isTtsInitialized = false;
+ private ArrayList pendingMethodCalls = new ArrayList<>();
+ private final HashMap utterances = new HashMap<>();
+ Bundle bundle;
+ private int silencems;
+ private static final String SILENCE_PREFIX = "SIL_";
+ private static final String SYNTHESIZE_TO_FILE_PREFIX = "STF_";
+
+ /** Plugin registration. */
+ public static void registerWith(Registrar registrar) {
+ FlutterTtsPlugin instance = new FlutterTtsPlugin();
+ instance.initInstance(registrar.messenger(), registrar.activeContext());
+ }
+
+ private void initInstance(BinaryMessenger messenger, Context context) {
+ this.context = context;
+ methodChannel = new MethodChannel(messenger, "flutter_tts");
+ methodChannel.setMethodCallHandler(this);
+ handler = new Handler(Looper.getMainLooper());
+ bundle = new Bundle();
+ tts = new TextToSpeech(context, onInitListener, googleTtsEngine);
+ }
+
+ /** Android Plugin APIs */
+ @Override
+ public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
+ initInstance(binding.getBinaryMessenger(), binding.getApplicationContext());
+ }
+
+ @Override
+ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
+ stop();
+ tts.shutdown();
+ context = null;
+ methodChannel.setMethodCallHandler(null);
+ methodChannel = null;
+ }
+
+ private UtteranceProgressListener utteranceProgressListener =
+ new UtteranceProgressListener() {
+ @Override
+ public void onStart(String utteranceId) {
+ if (utteranceId != null && utteranceId.startsWith(SYNTHESIZE_TO_FILE_PREFIX)) {
+ invokeMethod("synth.onStart", true);
+ } else {
+ Log.d(tag, "Utterance ID has started: " + utteranceId);
+ invokeMethod("speak.onStart", true);
+ }
+ if (Build.VERSION.SDK_INT < 26) {
+ this.onProgress(utteranceId, 0, utterances.get(utteranceId).length());
+ }
+ }
+
+ @Override
+ public void onDone(String utteranceId) {
+ if (utteranceId != null && utteranceId.startsWith(SILENCE_PREFIX)) return;
+ if (utteranceId != null && utteranceId.startsWith(SYNTHESIZE_TO_FILE_PREFIX)) {
+ invokeMethod("synth.onComplete", true);
+ } else {
+ Log.d(tag, "Utterance ID has completed: " + utteranceId);
+ if (awaitSpeakCompletion) {
+ speakCompletion(1);
+ }
+ invokeMethod("speak.onComplete", true);
+ }
+ utterances.remove(utteranceId);
+ }
+
+ @Override
+ public void onStop(String utteranceId, boolean interrupted) {
+ Log.d(
+ tag,
+ "Utterance ID has been stopped: " + utteranceId + ". Interrupted: " + interrupted);
+ if (awaitSpeakCompletion) {
+ speaking = false;
+ }
+ invokeMethod("speak.onCancel", true);
+ }
+
+ private void onProgress(String utteranceId, int startAt, int endAt) {
+ if (utteranceId != null && !utteranceId.startsWith(SYNTHESIZE_TO_FILE_PREFIX)) {
+ final String text = utterances.get(utteranceId);
+ final HashMap data = new HashMap<>();
+ data.put("text", text);
+ data.put("start", Integer.toString(startAt));
+ data.put("end", Integer.toString(endAt));
+ data.put("word", text.substring(startAt, endAt));
+ invokeMethod("speak.onProgress", data);
+ }
+ }
+
+ // Requires Android 26 or later
+ @Override
+ public void onRangeStart(String utteranceId, int startAt, int endAt, int frame) {
+ if (utteranceId != null && !utteranceId.startsWith(SYNTHESIZE_TO_FILE_PREFIX)) {
+ super.onRangeStart(utteranceId, startAt, endAt, frame);
+ this.onProgress(utteranceId, startAt, endAt);
+ }
+ }
+
+ @Override
+ @Deprecated
+ public void onError(String utteranceId) {
+ if (utteranceId != null && utteranceId.startsWith(SYNTHESIZE_TO_FILE_PREFIX)) {
+ invokeMethod("synth.onError", "Error from TextToSpeech (synth)");
+ } else {
+ if (awaitSpeakCompletion) {
+ speaking = false;
+ }
+ invokeMethod("speak.onError", "Error from TextToSpeech (speak)");
+ }
+ }
+
+ @Override
+ public void onError(String utteranceId, int errorCode) {
+ if (utteranceId != null && utteranceId.startsWith(SYNTHESIZE_TO_FILE_PREFIX)) {
+ invokeMethod("synth.onError", "Error from TextToSpeech (synth) - " + errorCode);
+ } else {
+ if (awaitSpeakCompletion) {
+ speaking = false;
+ }
+ invokeMethod("speak.onError", "Error from TextToSpeech (speak) - " + errorCode);
+ }
+ }
+ };
+
+ void speakCompletion(final int success) {
+ speaking = false;
+ handler.post(
+ new Runnable() {
+ @Override
+ public void run() {
+ speakResult.success(success);
+ }
+ });
+ }
+
+ private TextToSpeech.OnInitListener onInitListener =
+ new TextToSpeech.OnInitListener() {
+ @Override
+ public void onInit(int status) {
+ if (status == TextToSpeech.SUCCESS) {
+ tts.setOnUtteranceProgressListener(utteranceProgressListener);
+
+ try {
+ Locale locale = tts.getDefaultVoice().getLocale();
+ if (isLanguageAvailable(locale)) {
+ tts.setLanguage(locale);
+ }
+ } catch (NullPointerException | IllegalArgumentException e) {
+ Log.e(tag, "getDefaultLocale: " + e.getMessage());
+ }
+
+ // Handle pending method calls (sent while TTS was initializing)
+ isTtsInitialized = true;
+ for (Runnable call : pendingMethodCalls) {
+ call.run();
+ }
+ } else {
+ Log.e(tag, "Failed to initialize TextToSpeech");
+ }
+ }
+ };
+
+ @Override
+ public void onMethodCall(@NonNull final MethodCall call, @NonNull final Result result) {
+ // If TTS is still loading
+ if (!isTtsInitialized) {
+ // Suspend method call until the TTS engine is ready
+ final Runnable suspendedCall =
+ new Runnable() {
+ public void run() {
+ onMethodCall(call, result);
+ }
+ };
+ pendingMethodCalls.add(suspendedCall);
+ return;
+ }
+ switch (call.method) {
+ case "speak":
+ {
+ String text = call.arguments.toString();
+ if (this.speaking) {
+ result.success(0);
+ break;
+ }
+ speak(text);
+ if (this.awaitSpeakCompletion) {
+ this.speaking = true;
+ this.speakResult = result;
+ } else {
+ result.success(1);
+ }
+ break;
+ }
+ case "awaitSpeakCompletion":
+ {
+ this.awaitSpeakCompletion = Boolean.parseBoolean(call.arguments.toString());
+ result.success(1);
+ break;
+ }
+ case "synthesizeToFile":
+ {
+ String text = call.argument("text");
+ String fileName = call.argument("fileName");
+ synthesizeToFile(text, fileName);
+ result.success(1);
+ break;
+ }
+ case "stop":
+ stop();
+ result.success(1);
+ break;
+ case "setSpeechRate":
+ String rate = call.arguments.toString();
+ setSpeechRate(Float.parseFloat(rate));
+ result.success(1);
+ break;
+ case "setVolume":
+ String volume = call.arguments.toString();
+ setVolume(Float.parseFloat(volume), result);
+ break;
+ case "setPitch":
+ String pitch = call.arguments.toString();
+ setPitch(Float.parseFloat(pitch), result);
+ break;
+ case "setLanguage":
+ {
+ String language = call.arguments.toString();
+ setLanguage(language, result);
+ break;
+ }
+ case "getLanguages":
+ getLanguages(result);
+ break;
+ case "getVoices":
+ getVoices(result);
+ break;
+ case "getSpeechRateValidRange":
+ getSpeechRateValidRange(result);
+ break;
+ case "getEngines":
+ getEngines(result);
+ break;
+ case "setVoice":
+ HashMap voice = call.arguments();
+ setVoice(voice, result);
+ break;
+ case "isLanguageAvailable":
+ {
+ String language = call.arguments().toString();
+ Locale locale = Locale.forLanguageTag(language);
+ result.success(isLanguageAvailable(locale));
+ break;
+ }
+ case "setSilence":
+ String silencems = call.arguments.toString();
+ this.silencems = Integer.parseInt(silencems);
+ break;
+ case "setSharedInstance":
+ result.success(1);
+ break;
+ default:
+ result.notImplemented();
+ break;
+ }
+ }
+
+ void setSpeechRate(float rate) {
+ tts.setSpeechRate(rate);
+ }
+
+ Boolean isLanguageAvailable(Locale locale) {
+ return tts.isLanguageAvailable(locale) >= TextToSpeech.LANG_AVAILABLE;
+ }
+
+ void setLanguage(String language, Result result) {
+ Locale locale = Locale.forLanguageTag(language);
+ if (isLanguageAvailable(locale)) {
+ tts.setLanguage(locale);
+ result.success(1);
+ } else {
+ result.success(0);
+ }
+ }
+
+ void setVoice(HashMap voice, Result result) {
+ for (Voice ttsVoice : tts.getVoices()) {
+ if (ttsVoice.getName().equals(voice.get("name")) && ttsVoice.getLocale().toLanguageTag().equals(voice.get("locale"))) {
+ tts.setVoice(ttsVoice);
+ result.success(1);
+ return;
+ }
+ }
+ Log.d(tag, "Voice name not found: " + voice);
+ result.success(0);
+ }
+
+ void setVolume(float volume, Result result) {
+ if (volume >= 0.0F && volume <= 1.0F) {
+ bundle.putFloat(TextToSpeech.Engine.KEY_PARAM_VOLUME, volume);
+ result.success(1);
+ } else {
+ Log.d(tag, "Invalid volume " + volume + " value - Range is from 0.0 to 1.0");
+ result.success(0);
+ }
+ }
+
+ void setPitch(float pitch, Result result) {
+ if (pitch >= 0.5F && pitch <= 2.0F) {
+ tts.setPitch(pitch);
+ result.success(1);
+ } else {
+ Log.d(tag, "Invalid pitch " + pitch + " value - Range is from 0.5 to 2.0");
+ result.success(0);
+ }
+ }
+
+ void getVoices(Result result) {
+ ArrayList> voices = new ArrayList<>();
+ try {
+ for (Voice voice : tts.getVoices()) {
+ HashMap voiceMap = new HashMap<>();
+ voiceMap.put("name", voice.getName());
+ voiceMap.put("locale", voice.getLocale().toLanguageTag());
+ voices.add(voiceMap);
+ }
+ result.success(voices);
+ } catch (NullPointerException e) {
+ Log.d(tag, "getVoices: " + e.getMessage());
+ result.success(null);
+ }
+ }
+
+ void getLanguages(Result result) {
+ ArrayList locales = new ArrayList<>();
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ // While this method was introduced in API level 21, it seems that it
+ // has not been implemented in the speech service side until API Level 23.
+ for (Locale locale : tts.getAvailableLanguages()) {
+ locales.add(locale.toLanguageTag());
+ }
+ } else {
+ for (Locale locale : Locale.getAvailableLocales()) {
+ if (locale.getVariant().isEmpty() && isLanguageAvailable(locale)) {
+ locales.add(locale.toLanguageTag());
+ }
+ }
+ }
+ } catch (MissingResourceException | NullPointerException e) {
+ Log.d(tag, "getLanguages: " + e.getMessage());
+ }
+ result.success(locales);
+ }
+
+ void getEngines(Result result) {
+ ArrayList engines = new ArrayList<>();
+ try {
+ for (TextToSpeech.EngineInfo engineInfo : tts.getEngines()) {
+ engines.add(engineInfo.name);
+ }
+ } catch (Exception e) {
+ Log.d(tag, "getEngines: " + e.getMessage());
+ }
+ result.success(engines);
+ }
+
+ void getSpeechRateValidRange(Result result) {
+ // Valid values available in the android documentation.
+ // https://developer.android.com/reference/android/speech/tts/TextToSpeech#setSpeechRate(float)
+ final HashMap data = new HashMap();
+ data.put("min", "0");
+ data.put("normal", "1");
+ data.put("max", "3");
+ data.put("platform", "android");
+ result.success(data);
+ }
+
+ private void speak(String text) {
+ String uuid = UUID.randomUUID().toString();
+ utterances.put(uuid, text);
+ if (silencems > 0) {
+ tts.playSilentUtterance(silencems, TextToSpeech.QUEUE_FLUSH, SILENCE_PREFIX + uuid);
+ tts.speak(text, TextToSpeech.QUEUE_ADD, bundle, uuid);
+ } else {
+ tts.speak(text, TextToSpeech.QUEUE_FLUSH, bundle, uuid);
+ }
+ }
+
+ private void stop() {
+ tts.stop();
+ }
+
+ private void synthesizeToFile(String text, String fileName) {
+ File file = new File(context.getExternalFilesDir(null), fileName);
+ String uuid = UUID.randomUUID().toString();
+ bundle.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, SYNTHESIZE_TO_FILE_PREFIX + uuid);
+
+ int result = tts.synthesizeToFile(text, bundle, file, SYNTHESIZE_TO_FILE_PREFIX + uuid);
+ if (result == TextToSpeech.SUCCESS) {
+ Log.d(tag, "Successfully created file : " + file.getPath());
+ } else {
+ Log.d(tag, "Failed creating file : " + file.getPath());
+ }
+ }
+
+ private void invokeMethod(final String method, final Object arguments) {
+ handler.post(
+ new Runnable() {
+ @Override
+ public void run() {
+ if (methodChannel != null) methodChannel.invokeMethod(method, arguments);
+ }
+ });
+ }
+}
diff --git a/flutter_tts-voice_enhancement/example/.gitignore b/flutter_tts-voice_enhancement/example/.gitignore
new file mode 100644
index 00000000..7e6bbd47
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/.gitignore
@@ -0,0 +1,11 @@
+.DS_Store
+.dart_tool/
+
+.packages
+.pub/
+
+build/
+
+.flutter-plugins
+.flutter-plugins-dependencies
+lib/generated_plugin_registrant.dart
\ No newline at end of file
diff --git a/flutter_tts-voice_enhancement/example/.metadata b/flutter_tts-voice_enhancement/example/.metadata
new file mode 100644
index 00000000..3c0dd2c8
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/.metadata
@@ -0,0 +1,8 @@
+# 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: b397406561f5e7a9c94e28f58d9e49fca0dd58b7
+ channel: beta
diff --git a/flutter_tts-voice_enhancement/example/README.md b/flutter_tts-voice_enhancement/example/README.md
new file mode 100644
index 00000000..a1356260
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/README.md
@@ -0,0 +1,16 @@
+# example
+
+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://flutter.dev/docs/get-started/codelab)
+- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
+
+For help getting started with Flutter, view our
+[online documentation](https://flutter.dev/docs), which offers tutorials,
+samples, guidance on mobile development, and a full API reference.
diff --git a/flutter_tts-voice_enhancement/example/android/.gitignore b/flutter_tts-voice_enhancement/example/android/.gitignore
new file mode 100644
index 00000000..65b7315a
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+*.class
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
+GeneratedPluginRegistrant.java
diff --git a/flutter_tts-voice_enhancement/example/android/.settings/org.eclipse.buildship.core.prefs b/flutter_tts-voice_enhancement/example/android/.settings/org.eclipse.buildship.core.prefs
new file mode 100644
index 00000000..9f105273
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/.settings/org.eclipse.buildship.core.prefs
@@ -0,0 +1,2 @@
+#Sat Apr 14 11:55:40 PDT 2018
+connection.project.dir=
diff --git a/flutter_tts-voice_enhancement/example/android/app/.classpath b/flutter_tts-voice_enhancement/example/android/app/.classpath
new file mode 100644
index 00000000..8d8d85f1
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/app/.classpath
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/android/app/.settings/org.eclipse.buildship.core.prefs b/flutter_tts-voice_enhancement/example/android/app/.settings/org.eclipse.buildship.core.prefs
new file mode 100644
index 00000000..0601ea50
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/app/.settings/org.eclipse.buildship.core.prefs
@@ -0,0 +1,2 @@
+#Sat Apr 14 11:55:40 PDT 2018
+connection.project.dir=..
diff --git a/flutter_tts-voice_enhancement/example/android/app/build.gradle b/flutter_tts-voice_enhancement/example/android/app/build.gradle
new file mode 100644
index 00000000..563b8f89
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/app/build.gradle
@@ -0,0 +1,50 @@
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterRoot = localProperties.getProperty('flutter.sdk')
+if (flutterRoot == null) {
+ throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
+}
+
+apply plugin: 'com.android.application'
+apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+
+android {
+ compileSdkVersion 28
+
+ lintOptions {
+ disable 'InvalidPackage'
+ }
+
+ defaultConfig {
+ applicationId "com.tundralabs.flutterttsexample"
+ minSdkVersion 21
+ targetSdkVersion 28
+ versionCode 1
+ versionName "1.0"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ 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 {
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test:runner:1.1.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
+}
diff --git a/flutter_tts-voice_enhancement/example/android/app/src/debug/AndroidManifest.xml b/flutter_tts-voice_enhancement/example/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 00000000..49f10e46
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/android/app/src/main/AndroidManifest.xml b/flutter_tts-voice_enhancement/example/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..1caca009
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/android/app/src/main/res/drawable/launch_background.xml b/flutter_tts-voice_enhancement/example/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 00000000..304732f8
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000..db77bb4b
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000..17987b79
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..09d43914
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000..d5f1c8d3
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000..4d6372ee
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/flutter_tts-voice_enhancement/example/android/app/src/main/res/values/styles.xml b/flutter_tts-voice_enhancement/example/android/app/src/main/res/values/styles.xml
new file mode 100644
index 00000000..1f83a33f
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/android/app/src/profile/AndroidManifest.xml b/flutter_tts-voice_enhancement/example/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 00000000..49f10e46
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/android/build.gradle b/flutter_tts-voice_enhancement/example/android/build.gradle
new file mode 100644
index 00000000..cd23eff8
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/build.gradle
@@ -0,0 +1,29 @@
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:4.0.0'
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/flutter_tts-voice_enhancement/example/android/gradle.properties b/flutter_tts-voice_enhancement/example/android/gradle.properties
new file mode 100644
index 00000000..b6e61b62
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/gradle.properties
@@ -0,0 +1,4 @@
+android.enableJetifier=true
+android.useAndroidX=true
+org.gradle.jvmargs=-Xmx1536M
+android.enableR8=true
diff --git a/flutter_tts-voice_enhancement/example/android/gradle/wrapper/gradle-wrapper.properties b/flutter_tts-voice_enhancement/example/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..495eba36
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Tue Jul 07 01:11:38 PDT 2020
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
diff --git a/flutter_tts-voice_enhancement/example/android/settings.gradle b/flutter_tts-voice_enhancement/example/android/settings.gradle
new file mode 100644
index 00000000..5a2f14fb
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/settings.gradle
@@ -0,0 +1,15 @@
+include ':app'
+
+def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
+
+def plugins = new Properties()
+def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
+if (pluginsFile.exists()) {
+ pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
+}
+
+plugins.each { name, path ->
+ def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
+ include ":$name"
+ project(":$name").projectDir = pluginDirectory
+}
diff --git a/flutter_tts-voice_enhancement/example/android/settings_aar.gradle b/flutter_tts-voice_enhancement/example/android/settings_aar.gradle
new file mode 100644
index 00000000..e7b4def4
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/android/settings_aar.gradle
@@ -0,0 +1 @@
+include ':app'
diff --git a/flutter_tts-voice_enhancement/example/ios/.gitignore b/flutter_tts-voice_enhancement/example/ios/.gitignore
new file mode 100644
index 00000000..1e1aafd6
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/.gitignore
@@ -0,0 +1,42 @@
+.idea/
+.vagrant/
+.sconsign.dblite
+.svn/
+
+.DS_Store
+*.swp
+profile
+
+DerivedData/
+build/
+GeneratedPluginRegistrant.h
+GeneratedPluginRegistrant.m
+
+*.pbxuser
+*.mode1v3
+*.mode2v3
+*.perspectivev3
+
+!default.pbxuser
+!default.mode1v3
+!default.mode2v3
+!default.perspectivev3
+
+xcuserdata
+
+*.moved-aside
+
+*.pyc
+*sync/
+Icon?
+.tags*
+
+/Flutter/app.flx
+/Flutter/app.zip
+/Flutter/flutter_assets/
+/Flutter/App.framework
+/Flutter/Flutter.framework
+/Flutter/Generated.xcconfig
+/ServiceDefinitions.json
+
+Pods/
diff --git a/flutter_tts-voice_enhancement/example/ios/Flutter/.last_build_id b/flutter_tts-voice_enhancement/example/ios/Flutter/.last_build_id
new file mode 100644
index 00000000..bfaaeba1
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Flutter/.last_build_id
@@ -0,0 +1 @@
+b443c2d1b6b1e4df6c6fcc277a981410
\ No newline at end of file
diff --git a/flutter_tts-voice_enhancement/example/ios/Flutter/AppFrameworkInfo.plist b/flutter_tts-voice_enhancement/example/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 00000000..6c2de808
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ MinimumOSVersion
+ 8.0
+
+
diff --git a/flutter_tts-voice_enhancement/example/ios/Flutter/Debug.xcconfig b/flutter_tts-voice_enhancement/example/ios/Flutter/Debug.xcconfig
new file mode 100644
index 00000000..e8efba11
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Flutter/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "Generated.xcconfig"
diff --git a/flutter_tts-voice_enhancement/example/ios/Flutter/Flutter.podspec b/flutter_tts-voice_enhancement/example/ios/Flutter/Flutter.podspec
new file mode 100644
index 00000000..5ca30416
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Flutter/Flutter.podspec
@@ -0,0 +1,18 @@
+#
+# NOTE: This podspec is NOT to be published. It is only used as a local source!
+#
+
+Pod::Spec.new do |s|
+ s.name = 'Flutter'
+ s.version = '1.0.0'
+ s.summary = 'High-performance, high-fidelity mobile apps.'
+ s.description = <<-DESC
+Flutter provides an easy and productive way to build and deploy high-performance mobile apps for Android and iOS.
+ DESC
+ s.homepage = 'https://flutter.io'
+ s.license = { :type => 'MIT' }
+ s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' }
+ s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s }
+ s.ios.deployment_target = '8.0'
+ s.vendored_frameworks = 'Flutter.framework'
+end
diff --git a/flutter_tts-voice_enhancement/example/ios/Flutter/Release.xcconfig b/flutter_tts-voice_enhancement/example/ios/Flutter/Release.xcconfig
new file mode 100644
index 00000000..399e9340
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Flutter/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "Generated.xcconfig"
diff --git a/flutter_tts-voice_enhancement/example/ios/Podfile b/flutter_tts-voice_enhancement/example/ios/Podfile
new file mode 100644
index 00000000..1e8c3c90
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Podfile
@@ -0,0 +1,41 @@
+# Uncomment this line to define a global platform for your project
+# platform :ios, '9.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ end
+end
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.pbxproj b/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..28d4b795
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,488 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ 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 */; };
+ 72BCD356E80F9F5F32A2B586 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE3436CECE15DEA290DCD6B6 /* Pods_Runner.framework */; };
+ 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 */; };
+/* End PBXBuildFile 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 = ""; };
+ BE3436CECE15DEA290DCD6B6 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ CED86603210BC43D753C699B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ CF068A80D9BD19FC43D3FE99 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 72BCD356E80F9F5F32A2B586 /* Pods_Runner.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 04223708A30129901099FE16 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ BE3436CECE15DEA290DCD6B6 /* Pods_Runner.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 1ED2DC2A248FC04D7FB5EA8C /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ CF068A80D9BD19FC43D3FE99 /* Pods-Runner.debug.xcconfig */,
+ CED86603210BC43D753C699B /* Pods-Runner.release.xcconfig */,
+ );
+ name = Pods;
+ sourceTree = "";
+ };
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ 1ED2DC2A248FC04D7FB5EA8C /* Pods */,
+ 04223708A30129901099FE16 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 97C146F11CF9000F007C117D /* Supporting Files */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+ 97C146F11CF9000F007C117D /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 3B0CA933DCDA45D4F71410D4 /* [CP] Check Pods Manifest.lock */,
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ 46F7EA90EF3F4667EDB9E562 /* [CP] Embed Pods Frameworks */,
+ );
+ 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 = {
+ LastUpgradeCheck = 0940;
+ ORGANIZATIONNAME = "The Chromium Authors";
+ TargetAttributes = {
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 0910;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 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;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 3B0CA933DCDA45D4F71410D4 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 46F7EA90EF3F4667EDB9E562 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
+ "${PODS_ROOT}/../Flutter/Flutter.framework",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputPaths = (
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ 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 */
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase 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 */
+ 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 = 8.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 = 8.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+ 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 = 1;
+ ENABLE_BITCODE = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.tundralabs.flutterTtsExample;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_SWIFT3_OBJC_INFERENCE = On;
+ SWIFT_VERSION = 4.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 = 1;
+ ENABLE_BITCODE = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.tundralabs.flutterTtsExample;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_SWIFT3_OBJC_INFERENCE = On;
+ SWIFT_VERSION = 4.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..1d526a16
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 00000000..4bafc458
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/flutter_tts-voice_enhancement/example/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..21a3cc14
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/flutter_tts-voice_enhancement/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/flutter_tts-voice_enhancement/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/AppDelegate.swift b/flutter_tts-voice_enhancement/example/ios/Runner/AppDelegate.swift
new file mode 100644
index 00000000..71cc41e3
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..d36b1fab
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/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/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 00000000..3d43d11e
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 00000000..28c6bf03
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 00000000..2ccbfd96
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 00000000..f091b6b0
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 00000000..4cde1211
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 00000000..d0ef06e7
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 00000000..dcdc2306
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 00000000..2ccbfd96
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 00000000..c8f9ed8f
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 00000000..a6d6b860
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 00000000..a6d6b860
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 00000000..75b2d164
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 00000000..c4df70d3
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 00000000..6a84f41e
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 00000000..d0e1f585
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 00000000..0bedcf2f
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/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/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/flutter_tts-voice_enhancement/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 00000000..89c2725b
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/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/flutter_tts-voice_enhancement/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/flutter_tts-voice_enhancement/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 00000000..f2e259c7
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Base.lproj/Main.storyboard b/flutter_tts-voice_enhancement/example/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 00000000..f3c28516
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Info.plist b/flutter_tts-voice_enhancement/example/ios/Runner/Info.plist
new file mode 100644
index 00000000..dd2d9263
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner/Info.plist
@@ -0,0 +1,49 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ flutter_tts_example
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/ios/Runner/Runner-Bridging-Header.h b/flutter_tts-voice_enhancement/example/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 00000000..7335fdf9
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
\ No newline at end of file
diff --git a/flutter_tts-voice_enhancement/example/lib/main.dart b/flutter_tts-voice_enhancement/example/lib/main.dart
new file mode 100644
index 00000000..97530bbb
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/lib/main.dart
@@ -0,0 +1,292 @@
+import 'dart:async';
+import 'dart:io' show Platform;
+import 'package:flutter/foundation.dart' show kIsWeb;
+
+import 'package:flutter/material.dart';
+import 'package:flutter_tts/flutter_tts.dart';
+
+void main() => runApp(MyApp());
+
+class MyApp extends StatefulWidget {
+ @override
+ _MyAppState createState() => _MyAppState();
+}
+
+enum TtsState { playing, stopped, paused, continued }
+
+class _MyAppState extends State {
+ FlutterTts flutterTts;
+ dynamic languages;
+ String language;
+ double volume = 0.5;
+ double pitch = 1.0;
+ double rate = 0.5;
+
+ String _newVoiceText;
+
+ TtsState ttsState = TtsState.stopped;
+
+ get isPlaying => ttsState == TtsState.playing;
+
+ get isStopped => ttsState == TtsState.stopped;
+
+ get isPaused => ttsState == TtsState.paused;
+
+ get isContinued => ttsState == TtsState.continued;
+
+ @override
+ initState() {
+ super.initState();
+ initTts();
+ }
+
+ initTts() {
+ flutterTts = FlutterTts();
+
+ _getLanguages();
+
+ if (!kIsWeb) {
+ if (Platform.isAndroid) {
+ _getEngines();
+ }
+ }
+
+ flutterTts.setStartHandler(() {
+ setState(() {
+ print("Playing");
+ ttsState = TtsState.playing;
+ });
+ });
+
+ flutterTts.setCompletionHandler(() {
+ setState(() {
+ print("Complete");
+ ttsState = TtsState.stopped;
+ });
+ });
+
+ flutterTts.setCancelHandler(() {
+ setState(() {
+ print("Cancel");
+ ttsState = TtsState.stopped;
+ });
+ });
+
+ if (kIsWeb || Platform.isIOS) {
+ flutterTts.setPauseHandler(() {
+ setState(() {
+ print("Paused");
+ ttsState = TtsState.paused;
+ });
+ });
+
+ flutterTts.setContinueHandler(() {
+ setState(() {
+ print("Continued");
+ ttsState = TtsState.continued;
+ });
+ });
+ }
+
+ flutterTts.setErrorHandler((msg) {
+ setState(() {
+ print("error: $msg");
+ ttsState = TtsState.stopped;
+ });
+ });
+ }
+
+ Future _getLanguages() async {
+ languages = await flutterTts.getLanguages;
+ if (languages != null) setState(() => languages);
+ }
+
+ Future _getEngines() async {
+ var engines = await flutterTts.getEngines;
+ if (engines != null) {
+ for (dynamic engine in engines) {
+ print(engine);
+ }
+ }
+ }
+
+ Future _speak() async {
+ await flutterTts.setVolume(volume);
+ await flutterTts.setSpeechRate(rate);
+ await flutterTts.setPitch(pitch);
+
+ if (_newVoiceText != null) {
+ if (_newVoiceText.isNotEmpty) {
+ await flutterTts.awaitSpeakCompletion(true);
+ await flutterTts.speak(_newVoiceText);
+ }
+ }
+ }
+
+ Future _stop() async {
+ var result = await flutterTts.stop();
+ if (result == 1) setState(() => ttsState = TtsState.stopped);
+ }
+
+ Future _pause() async {
+ var result = await flutterTts.pause();
+ if (result == 1) setState(() => ttsState = TtsState.paused);
+ }
+
+ @override
+ void dispose() {
+ super.dispose();
+ flutterTts.stop();
+ }
+
+ List> getLanguageDropDownMenuItems() {
+ var items = List>();
+ for (dynamic type in languages) {
+ items.add(
+ DropdownMenuItem(value: type as String, child: Text(type as String)));
+ }
+ return items;
+ }
+
+ void changedLanguageDropDownItem(String selectedType) {
+ setState(() {
+ language = selectedType;
+ flutterTts.setLanguage(language);
+ });
+ }
+
+ void _onChange(String text) {
+ setState(() {
+ _newVoiceText = text;
+ });
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ home: Scaffold(
+ appBar: AppBar(
+ title: Text('Flutter TTS'),
+ ),
+ body: SingleChildScrollView(
+ scrollDirection: Axis.vertical,
+ child: Column(children: [
+ _inputSection(),
+ _btnSection(),
+ languages != null ? _languageDropDownSection() : Text(""),
+ _buildSliders()
+ ]))));
+ }
+
+ Widget _inputSection() => Container(
+ alignment: Alignment.topCenter,
+ padding: EdgeInsets.only(top: 25.0, left: 25.0, right: 25.0),
+ child: TextField(
+ onChanged: (String value) {
+ _onChange(value);
+ },
+ ));
+
+ Widget _btnSection() {
+ if (!kIsWeb && Platform.isAndroid) {
+ return Container(
+ padding: EdgeInsets.only(top: 50.0),
+ child:
+ Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
+ _buildButtonColumn(Colors.green, Colors.greenAccent,
+ Icons.play_arrow, 'PLAY', _speak),
+ _buildButtonColumn(
+ Colors.red, Colors.redAccent, Icons.stop, 'STOP', _stop),
+ ]));
+ } else {
+ return Container(
+ padding: EdgeInsets.only(top: 50.0),
+ child:
+ Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
+ _buildButtonColumn(Colors.green, Colors.greenAccent,
+ Icons.play_arrow, 'PLAY', _speak),
+ _buildButtonColumn(
+ Colors.red, Colors.redAccent, Icons.stop, 'STOP', _stop),
+ _buildButtonColumn(
+ Colors.blue, Colors.blueAccent, Icons.pause, 'PAUSE', _pause),
+ ]));
+ }
+ }
+
+ Widget _languageDropDownSection() => Container(
+ padding: EdgeInsets.only(top: 50.0),
+ child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
+ DropdownButton(
+ value: language,
+ items: getLanguageDropDownMenuItems(),
+ onChanged: changedLanguageDropDownItem,
+ )
+ ]));
+
+ Column _buildButtonColumn(Color color, Color splashColor, IconData icon,
+ String label, Function func) {
+ return Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ IconButton(
+ icon: Icon(icon),
+ color: color,
+ splashColor: splashColor,
+ onPressed: () => func()),
+ Container(
+ margin: const EdgeInsets.only(top: 8.0),
+ child: Text(label,
+ style: TextStyle(
+ fontSize: 12.0,
+ fontWeight: FontWeight.w400,
+ color: color)))
+ ]);
+ }
+
+ Widget _buildSliders() {
+ return Column(
+ children: [_volume(), _pitch(), _rate()],
+ );
+ }
+
+ Widget _volume() {
+ return Slider(
+ value: volume,
+ onChanged: (newVolume) {
+ setState(() => volume = newVolume);
+ },
+ min: 0.0,
+ max: 1.0,
+ divisions: 10,
+ label: "Volume: $volume");
+ }
+
+ Widget _pitch() {
+ return Slider(
+ value: pitch,
+ onChanged: (newPitch) {
+ setState(() => pitch = newPitch);
+ },
+ min: 0.5,
+ max: 2.0,
+ divisions: 15,
+ label: "Pitch: $pitch",
+ activeColor: Colors.red,
+ );
+ }
+
+ Widget _rate() {
+ return Slider(
+ value: rate,
+ onChanged: (newRate) {
+ setState(() => rate = newRate);
+ },
+ min: 0.0,
+ max: 1.0,
+ divisions: 10,
+ label: "Rate: $rate",
+ activeColor: Colors.green,
+ );
+ }
+}
diff --git a/flutter_tts-voice_enhancement/example/macos/.gitignore b/flutter_tts-voice_enhancement/example/macos/.gitignore
new file mode 100644
index 00000000..d2fd3772
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/.gitignore
@@ -0,0 +1,6 @@
+# Flutter-related
+**/Flutter/ephemeral/
+**/Pods/
+
+# Xcode-related
+**/xcuserdata/
diff --git a/flutter_tts-voice_enhancement/example/macos/Flutter/Flutter-Debug.xcconfig b/flutter_tts-voice_enhancement/example/macos/Flutter/Flutter-Debug.xcconfig
new file mode 100644
index 00000000..785633d3
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Flutter/Flutter-Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/flutter_tts-voice_enhancement/example/macos/Flutter/Flutter-Release.xcconfig b/flutter_tts-voice_enhancement/example/macos/Flutter/Flutter-Release.xcconfig
new file mode 100644
index 00000000..5fba960c
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Flutter/Flutter-Release.xcconfig
@@ -0,0 +1,2 @@
+#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/flutter_tts-voice_enhancement/example/macos/Flutter/GeneratedPluginRegistrant.swift b/flutter_tts-voice_enhancement/example/macos/Flutter/GeneratedPluginRegistrant.swift
new file mode 100644
index 00000000..1e6ac53b
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -0,0 +1,12 @@
+//
+// Generated file. Do not edit.
+//
+
+import FlutterMacOS
+import Foundation
+
+import flutter_tts
+
+func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+ FlutterTtsPlugin.register(with: registry.registrar(forPlugin: "FlutterTtsPlugin"))
+}
diff --git a/flutter_tts-voice_enhancement/example/macos/Podfile b/flutter_tts-voice_enhancement/example/macos/Podfile
new file mode 100644
index 00000000..5bf4307c
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Podfile
@@ -0,0 +1,82 @@
+platform :osx, '10.15'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def parse_KV_file(file, separator='=')
+ file_abs_path = File.expand_path(file)
+ if !File.exists? file_abs_path
+ return [];
+ end
+ pods_ary = []
+ skip_line_start_symbols = ["#", "/"]
+ File.foreach(file_abs_path) { |line|
+ next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
+ plugin = line.split(pattern=separator)
+ if plugin.length == 2
+ podname = plugin[0].strip()
+ path = plugin[1].strip()
+ podpath = File.expand_path("#{path}", file_abs_path)
+ pods_ary.push({:name => podname, :path => podpath});
+ else
+ puts "Invalid plugin specification: #{line}"
+ end
+ }
+ return pods_ary
+end
+
+def pubspec_supports_macos(file)
+ file_abs_path = File.expand_path(file)
+ if !File.exists? file_abs_path
+ return false;
+ end
+ File.foreach(file_abs_path) { |line|
+ return true if line =~ /^\s*macos:/
+ }
+ return false
+end
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
+ # referring to absolute paths on developers' machines.
+ ephemeral_dir = File.join('Flutter', 'ephemeral')
+ symlink_dir = File.join(ephemeral_dir, '.symlinks')
+ symlink_plugins_dir = File.join(symlink_dir, 'plugins')
+ system("rm -rf #{symlink_dir}")
+ system("mkdir -p #{symlink_plugins_dir}")
+
+ # Flutter Pods
+ generated_xcconfig = parse_KV_file(File.join(ephemeral_dir, 'Flutter-Generated.xcconfig'))
+ if generated_xcconfig.empty?
+ puts "Flutter-Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first."
+ end
+ generated_xcconfig.map { |p|
+ if p[:name] == 'FLUTTER_FRAMEWORK_DIR'
+ symlink = File.join(symlink_dir, 'flutter')
+ File.symlink(File.dirname(p[:path]), symlink)
+ pod 'FlutterMacOS', :path => File.join(symlink, File.basename(p[:path]))
+ end
+ }
+
+ # Plugin Pods
+ plugin_pods = parse_KV_file('../.flutter-plugins')
+ plugin_pods.map { |p|
+ symlink = File.join(symlink_plugins_dir, p[:name])
+ File.symlink(p[:path], symlink)
+ if pubspec_supports_macos(File.join(symlink, 'pubspec.yaml'))
+ pod p[:name], :path => File.join(symlink, 'macos')
+ end
+ }
+end
+
+# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system.
+install! 'cocoapods', :disable_input_output_paths => true
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner.xcodeproj/project.pbxproj b/flutter_tts-voice_enhancement/example/macos/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..39fbd18c
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,656 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 51;
+ 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 */
+ 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 */; };
+ 33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; };
+ 33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 3640FC23D5951A8FB0D6ECA0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A470206CCCE0007DE0E2807A /* Pods_Runner.framework */; };
+ D73912F022F37F9E000D13A0 /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; };
+ D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 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 = (
+ D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */,
+ 33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */,
+ );
+ name = "Bundle Framework";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.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 = ""; };
+ 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FlutterMacOS.framework; path = Flutter/ephemeral/FlutterMacOS.framework; sourceTree = SOURCE_ROOT; };
+ 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 = ""; };
+ 517AA5C8DE31A9B49D27971F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 66FE8AA741C2B7FC12BF1304 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.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 = ""; };
+ A470206CCCE0007DE0E2807A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ C15A67B64555E7FFE7AD8B76 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ D73912EF22F37F9E000D13A0 /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/ephemeral/App.framework; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 33CC10EA2044A3C60003C045 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D73912F022F37F9E000D13A0 /* App.framework in Frameworks */,
+ 33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */,
+ 3640FC23D5951A8FB0D6ECA0 /* Pods_Runner.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 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 */,
+ 33CC10EE2044A3C60003C045 /* Products */,
+ D73912EC22F37F3D000D13A0 /* Frameworks */,
+ 5F9F48FBDE9334256A3D8D1C /* Pods */,
+ );
+ sourceTree = "";
+ };
+ 33CC10EE2044A3C60003C045 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10ED2044A3C60003C045 /* example.app */,
+ );
+ 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 */,
+ D73912EF22F37F9E000D13A0 /* App.framework */,
+ 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */,
+ );
+ 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 = "";
+ };
+ 5F9F48FBDE9334256A3D8D1C /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 66FE8AA741C2B7FC12BF1304 /* Pods-Runner.debug.xcconfig */,
+ 517AA5C8DE31A9B49D27971F /* Pods-Runner.release.xcconfig */,
+ C15A67B64555E7FFE7AD8B76 /* Pods-Runner.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ D73912EC22F37F3D000D13A0 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ A470206CCCE0007DE0E2807A /* Pods_Runner.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 33CC10EC2044A3C60003C045 /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 9A62F257D3FF7C7C94E365B2 /* [CP] Check Pods Manifest.lock */,
+ 33CC10E92044A3C60003C045 /* Sources */,
+ 33CC10EA2044A3C60003C045 /* Frameworks */,
+ 33CC10EB2044A3C60003C045 /* Resources */,
+ 33CC110E2044A8840003C045 /* Bundle Framework */,
+ 3399D490228B24CF009A79C7 /* ShellScript */,
+ F7AADAC6A864E8BF8890B1EC /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */,
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 33CC10ED2044A3C60003C045 /* example.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 33CC10E52044A3C60003C045 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 0920;
+ LastUpgradeCheck = 1150;
+ ORGANIZATIONNAME = "The Flutter Authors";
+ TargetAttributes = {
+ 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 8.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 33CC10E42044A3C60003C045;
+ productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 33CC10EC2044A3C60003C045 /* Runner */,
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 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;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename\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\ntouch Flutter/ephemeral/tripwire\n";
+ };
+ 9A62F257D3FF7C7C94E365B2 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ F7AADAC6A864E8BF8890B1EC /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 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 */
+ 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 */
+ 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.15;
+ 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_IDENTITY = "-";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter/ephemeral",
+ );
+ 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.15;
+ 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.15;
+ 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_IDENTITY = "-";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter/ephemeral",
+ );
+ 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_IDENTITY = "-";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter/ephemeral",
+ );
+ 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 */
+ 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/flutter_tts-voice_enhancement/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/flutter_tts-voice_enhancement/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/flutter_tts-voice_enhancement/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 00000000..6111bd0a
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/flutter_tts-voice_enhancement/example/macos/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..21a3cc14
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/flutter_tts-voice_enhancement/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/AppDelegate.swift b/flutter_tts-voice_enhancement/example/macos/Runner/AppDelegate.swift
new file mode 100644
index 00000000..d53ef643
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/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/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..a2ec33f1
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/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/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
new file mode 100644
index 00000000..3c4935a7
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
new file mode 100644
index 00000000..ed4cc164
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
new file mode 100644
index 00000000..483be613
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
new file mode 100644
index 00000000..bcbf36df
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
new file mode 100644
index 00000000..9c0a6528
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
new file mode 100644
index 00000000..e71a7261
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
new file mode 100644
index 00000000..8a31fe2d
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Base.lproj/MainMenu.xib b/flutter_tts-voice_enhancement/example/macos/Runner/Base.lproj/MainMenu.xib
new file mode 100644
index 00000000..537341ab
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Runner/Base.lproj/MainMenu.xib
@@ -0,0 +1,339 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Configs/AppInfo.xcconfig b/flutter_tts-voice_enhancement/example/macos/Runner/Configs/AppInfo.xcconfig
new file mode 100644
index 00000000..f960fd48
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/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 = example
+
+// The application's bundle identifier
+PRODUCT_BUNDLE_IDENTIFIER = com.tundralabs.example
+
+// The copyright displayed in application information
+PRODUCT_COPYRIGHT = Copyright © 2020 com.tundralabs. All rights reserved.
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Configs/Debug.xcconfig b/flutter_tts-voice_enhancement/example/macos/Runner/Configs/Debug.xcconfig
new file mode 100644
index 00000000..36b0fd94
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Runner/Configs/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Debug.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Configs/Release.xcconfig b/flutter_tts-voice_enhancement/example/macos/Runner/Configs/Release.xcconfig
new file mode 100644
index 00000000..dff4f495
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Runner/Configs/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Release.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Configs/Warnings.xcconfig b/flutter_tts-voice_enhancement/example/macos/Runner/Configs/Warnings.xcconfig
new file mode 100644
index 00000000..42bcbf47
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/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/flutter_tts-voice_enhancement/example/macos/Runner/DebugProfile.entitlements b/flutter_tts-voice_enhancement/example/macos/Runner/DebugProfile.entitlements
new file mode 100644
index 00000000..dddb8a30
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/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/flutter_tts-voice_enhancement/example/macos/Runner/Info.plist b/flutter_tts-voice_enhancement/example/macos/Runner/Info.plist
new file mode 100644
index 00000000..4789daa6
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/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/flutter_tts-voice_enhancement/example/macos/Runner/MainFlutterWindow.swift b/flutter_tts-voice_enhancement/example/macos/Runner/MainFlutterWindow.swift
new file mode 100644
index 00000000..2722837e
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Runner/MainFlutterWindow.swift
@@ -0,0 +1,15 @@
+import Cocoa
+import FlutterMacOS
+
+class MainFlutterWindow: NSWindow {
+ override func awakeFromNib() {
+ let flutterViewController = FlutterViewController.init()
+ let windowFrame = self.frame
+ self.contentViewController = flutterViewController
+ self.setFrame(windowFrame, display: true)
+
+ RegisterGeneratedPlugins(registry: flutterViewController)
+
+ super.awakeFromNib()
+ }
+}
diff --git a/flutter_tts-voice_enhancement/example/macos/Runner/Release.entitlements b/flutter_tts-voice_enhancement/example/macos/Runner/Release.entitlements
new file mode 100644
index 00000000..852fa1a4
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/macos/Runner/Release.entitlements
@@ -0,0 +1,8 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/pubspec.yaml b/flutter_tts-voice_enhancement/example/pubspec.yaml
new file mode 100644
index 00000000..54cbe6ed
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/pubspec.yaml
@@ -0,0 +1,59 @@
+name: flutter_tts_example
+description: Demonstrates how to use the flutter_tts plugin.
+
+dependencies:
+ flutter:
+ sdk: flutter
+
+ # The following adds the Cupertino Icons font to your application.
+ # Use with the CupertinoIcons class for iOS style icons.
+ cupertino_icons: ^0.1.2
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+
+ flutter_tts:
+ path: ../
+
+# For information on the generic Dart part of this file, see the
+# following page: https://www.dartlang.org/tools/pub/pubspec
+
+# The following section is specific to Flutter.
+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:
+ # - images/a_dot_burr.jpeg
+ # - images/a_dot_ham.jpeg
+
+ # An image asset can refer to one or more resolution-specific "variants", see
+ # https://flutter.io/assets-and-images/#resolution-aware.
+
+ # For details regarding adding assets from package dependencies, see
+ # https://flutter.io/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.io/custom-fonts/#from-packages
diff --git a/flutter_tts-voice_enhancement/example/test/widget_test.dart b/flutter_tts-voice_enhancement/example/test/widget_test.dart
new file mode 100644
index 00000000..6db856cd
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/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 that Flutter provides. 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 '../lib/main.dart';
+
+void main() {
+ testWidgets('Counter increments smoke test', (WidgetTester tester) async {
+ // Build our app and trigger a frame.
+ await tester.pumpWidget(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/flutter_tts-voice_enhancement/example/web/favicon.png b/flutter_tts-voice_enhancement/example/web/favicon.png
new file mode 100644
index 00000000..8aaa46ac
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/web/favicon.png differ
diff --git a/flutter_tts-voice_enhancement/example/web/icons/Icon-192.png b/flutter_tts-voice_enhancement/example/web/icons/Icon-192.png
new file mode 100644
index 00000000..b749bfef
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/web/icons/Icon-192.png differ
diff --git a/flutter_tts-voice_enhancement/example/web/icons/Icon-512.png b/flutter_tts-voice_enhancement/example/web/icons/Icon-512.png
new file mode 100644
index 00000000..88cfd48d
Binary files /dev/null and b/flutter_tts-voice_enhancement/example/web/icons/Icon-512.png differ
diff --git a/flutter_tts-voice_enhancement/example/web/index.html b/flutter_tts-voice_enhancement/example/web/index.html
new file mode 100644
index 00000000..20b0c00a
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/web/index.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Flutter TTS example
+
+
+
+
+
diff --git a/flutter_tts-voice_enhancement/example/web/manifest.json b/flutter_tts-voice_enhancement/example/web/manifest.json
new file mode 100644
index 00000000..8c012917
--- /dev/null
+++ b/flutter_tts-voice_enhancement/example/web/manifest.json
@@ -0,0 +1,23 @@
+{
+ "name": "example",
+ "short_name": "example",
+ "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"
+ }
+ ]
+}
diff --git a/flutter_tts-voice_enhancement/ios/.gitignore b/flutter_tts-voice_enhancement/ios/.gitignore
new file mode 100644
index 00000000..956c87f3
--- /dev/null
+++ b/flutter_tts-voice_enhancement/ios/.gitignore
@@ -0,0 +1,31 @@
+.idea/
+.vagrant/
+.sconsign.dblite
+.svn/
+
+.DS_Store
+*.swp
+profile
+
+DerivedData/
+build/
+
+*.pbxuser
+*.mode1v3
+*.mode2v3
+*.perspectivev3
+
+!default.pbxuser
+!default.mode1v3
+!default.mode2v3
+!default.perspectivev3
+
+xcuserdata
+
+*.moved-aside
+
+*.pyc
+*sync/
+Icon?
+.tags*
+
diff --git a/flutter_tts-voice_enhancement/ios/Assets/.gitkeep b/flutter_tts-voice_enhancement/ios/Assets/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/flutter_tts-voice_enhancement/ios/Classes/AudioCategory.swift b/flutter_tts-voice_enhancement/ios/Classes/AudioCategory.swift
new file mode 100644
index 00000000..74e8ea0b
--- /dev/null
+++ b/flutter_tts-voice_enhancement/ios/Classes/AudioCategory.swift
@@ -0,0 +1,21 @@
+import AVFoundation
+
+enum AudioCategory: String {
+ case iosAudioCategoryAmbientSolo
+ case iosAudioCategoryAmbient
+ case iosAudioCategoryPlayback
+ case iosAudioCategoryPlaybackAndRecord
+
+ func toAVAudioSessionCategory() -> AVAudioSession.Category {
+ switch self {
+ case .iosAudioCategoryAmbientSolo:
+ return .soloAmbient
+ case .iosAudioCategoryAmbient:
+ return .ambient
+ case .iosAudioCategoryPlayback:
+ return .playback
+ case .iosAudioCategoryPlaybackAndRecord:
+ return .playAndRecord
+ }
+ }
+}
diff --git a/flutter_tts-voice_enhancement/ios/Classes/AudioCategoryOptions.swift b/flutter_tts-voice_enhancement/ios/Classes/AudioCategoryOptions.swift
new file mode 100644
index 00000000..f593bfdb
--- /dev/null
+++ b/flutter_tts-voice_enhancement/ios/Classes/AudioCategoryOptions.swift
@@ -0,0 +1,42 @@
+import AVFoundation
+
+enum AudioCategoryOptions: String {
+ case iosAudioCategoryOptionsMixWithOthers
+ case iosAudioCategoryOptionsDuckOthers
+ case iosAudioCategoryOptionsInterruptSpokenAudioAndMixWithOthers
+ case iosAudioCategoryOptionsAllowBluetooth
+ case iosAudioCategoryOptionsAllowBluetoothA2DP
+ case iosAudioCategoryOptionsAllowAirPlay
+ case iosAudioCategoryOptionsDefaultToSpeaker
+
+ func toAVAudioSessionCategoryOptions() -> AVAudioSession.CategoryOptions? {
+ switch self {
+ case .iosAudioCategoryOptionsMixWithOthers:
+ return .mixWithOthers
+ case .iosAudioCategoryOptionsDuckOthers:
+ return .duckOthers
+ case .iosAudioCategoryOptionsInterruptSpokenAudioAndMixWithOthers:
+ if #available(iOS 9.0, *) {
+ return .interruptSpokenAudioAndMixWithOthers
+ } else {
+ return nil
+ }
+ case .iosAudioCategoryOptionsAllowBluetooth:
+ return .allowBluetooth
+ case .iosAudioCategoryOptionsAllowBluetoothA2DP:
+ if #available(iOS 10.0, *) {
+ return .allowBluetoothA2DP
+ } else {
+ return nil
+ }
+ case .iosAudioCategoryOptionsAllowAirPlay:
+ if #available(iOS 10.0, *) {
+ return .allowAirPlay
+ } else {
+ return nil
+ }
+ case .iosAudioCategoryOptionsDefaultToSpeaker:
+ return .defaultToSpeaker
+ }
+ }
+}
diff --git a/flutter_tts-voice_enhancement/ios/Classes/FlutterTtsPlugin.h b/flutter_tts-voice_enhancement/ios/Classes/FlutterTtsPlugin.h
new file mode 100644
index 00000000..13e3a21a
--- /dev/null
+++ b/flutter_tts-voice_enhancement/ios/Classes/FlutterTtsPlugin.h
@@ -0,0 +1,4 @@
+#import
+
+@interface FlutterTtsPlugin : NSObject
+@end
diff --git a/flutter_tts-voice_enhancement/ios/Classes/FlutterTtsPlugin.m b/flutter_tts-voice_enhancement/ios/Classes/FlutterTtsPlugin.m
new file mode 100644
index 00000000..3a1f187c
--- /dev/null
+++ b/flutter_tts-voice_enhancement/ios/Classes/FlutterTtsPlugin.m
@@ -0,0 +1,8 @@
+#import "FlutterTtsPlugin.h"
+#import
+
+@implementation FlutterTtsPlugin
++ (void)registerWithRegistrar:(NSObject*)registrar {
+ [SwiftFlutterTtsPlugin registerWithRegistrar:registrar];
+}
+@end
diff --git a/flutter_tts-voice_enhancement/ios/Classes/SwiftFlutterTtsPlugin.swift b/flutter_tts-voice_enhancement/ios/Classes/SwiftFlutterTtsPlugin.swift
new file mode 100644
index 00000000..5c78c135
--- /dev/null
+++ b/flutter_tts-voice_enhancement/ios/Classes/SwiftFlutterTtsPlugin.swift
@@ -0,0 +1,386 @@
+import Flutter
+import UIKit
+import AVFoundation
+
+public class SwiftFlutterTtsPlugin: NSObject, FlutterPlugin, AVSpeechSynthesizerDelegate {
+ final var iosAudioCategoryKey = "iosAudioCategoryKey"
+ final var iosAudioCategoryOptionsKey = "iosAudioCategoryOptionsKey"
+
+ let synthesizer = AVSpeechSynthesizer()
+ var language: String = AVSpeechSynthesisVoice.currentLanguageCode()
+ var rate: Float = AVSpeechUtteranceDefaultSpeechRate
+ var languages = Set()
+ var volume: Float = 1.0
+ var pitch: Float = 1.0
+ var voice: AVSpeechSynthesisVoice?
+ var awaitSpeakCompletion: Bool = false
+ var speakResult: FlutterResult!
+
+ var channel = FlutterMethodChannel()
+ lazy var audioSession = AVAudioSession.sharedInstance()
+ init(channel: FlutterMethodChannel) {
+ super.init()
+ self.channel = channel
+ synthesizer.delegate = self
+ setLanguages()
+
+ // Allow audio playback when the Ring/Silent switch is set to silent
+ do {
+ try audioSession.setCategory(.playAndRecord, options: [.defaultToSpeaker])
+ } catch {
+ print(error)
+ }
+ }
+
+ private func setLanguages() {
+ for voice in AVSpeechSynthesisVoice.speechVoices(){
+ self.languages.insert(voice.language)
+ }
+ }
+
+ public static func register(with registrar: FlutterPluginRegistrar) {
+ let channel = FlutterMethodChannel(name: "flutter_tts", binaryMessenger: registrar.messenger())
+ let instance = SwiftFlutterTtsPlugin(channel: channel)
+ registrar.addMethodCallDelegate(instance, channel: channel)
+ }
+
+ public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
+ switch call.method {
+ case "speak":
+ let text: String = call.arguments as! String
+ self.speak(text: text, result: result)
+ break
+ case "awaitSpeakCompletion":
+ self.awaitSpeakCompletion = call.arguments as! Bool
+ result(1)
+ break
+ case "synthesizeToFile":
+ guard let args = call.arguments as? [String: Any] else {
+ result("iOS could not recognize flutter arguments in method: (sendParams)")
+ return
+ }
+ let text = args["text"] as! String
+ let fileName = args["fileName"] as! String
+ self.synthesizeToFile(text: text, fileName: fileName, result: result)
+ break
+ case "pause":
+ self.pause(result: result)
+ break
+ case "setLanguage":
+ let language: String = call.arguments as! String
+ self.setLanguage(language: language, result: result)
+ break
+ case "setSpeechRate":
+ let rate: Double = call.arguments as! Double
+ self.setRate(rate: Float(rate))
+ result(1)
+ break
+ case "setVolume":
+ let volume: Double = call.arguments as! Double
+ self.setVolume(volume: Float(volume), result: result)
+ break
+ case "setPitch":
+ let pitch: Double = call.arguments as! Double
+ self.setPitch(pitch: Float(pitch), result: result)
+ break
+ case "stop":
+ self.stop()
+ result(1)
+ break
+ case "getLanguages":
+ self.getLanguages(result: result)
+ break
+ case "getSpeechRateValidRange":
+ self.getSpeechRateValidRange(result: result)
+ break
+ case "isLanguageAvailable":
+ let language: String = call.arguments as! String
+ self.isLanguageAvailable(language: language, result: result)
+ break
+ case "getVoices":
+ self.getVoices(result: result)
+ break
+ case "setVoice":
+ guard let args = call.arguments as? [String: String] else {
+ result("iOS could not recognize flutter arguments in method: (sendParams)")
+ return
+ }
+ self.setVoice(voice: args, result: result)
+ break
+ case "setSharedInstance":
+ let sharedInstance = call.arguments as! Bool
+ self.setSharedInstance(sharedInstance: sharedInstance, result: result)
+ break
+ case "setIosAudioCategory":
+ guard let args = call.arguments as? [String: Any] else {
+ result("iOS could not recognize flutter arguments in method: (sendParams)")
+ return
+ }
+ let audioCategory = args["iosAudioCategoryKey"] as? String
+ let audioOptions = args[iosAudioCategoryOptionsKey] as? Array
+ self.setAudioCategory(audioCategory: audioCategory, audioOptions: audioOptions, result: result)
+ break
+ default:
+ result(FlutterMethodNotImplemented)
+ }
+ }
+
+ private func speak(text: String, result: @escaping FlutterResult) {
+ if (self.synthesizer.isPaused) {
+ if (self.synthesizer.continueSpeaking()) {
+ if self.awaitSpeakCompletion {
+ self.speakResult = result
+ } else {
+ result(1)
+ }
+ } else {
+ result(0)
+ }
+ } else {
+ let utterance = AVSpeechUtterance(string: text)
+ if self.voice != nil {
+ utterance.voice = self.voice!
+ } else {
+ utterance.voice = AVSpeechSynthesisVoice(language: self.language)
+ }
+ utterance.rate = self.rate
+ utterance.volume = self.volume
+ utterance.pitchMultiplier = self.pitch
+
+ self.synthesizer.speak(utterance)
+ if self.awaitSpeakCompletion {
+ self.speakResult = result
+ } else {
+ result(1)
+ }
+ }
+ }
+
+ private func synthesizeToFile(text: String, fileName: String, result: FlutterResult) {
+ var output: AVAudioFile?
+ var failed = false
+ let utterance = AVSpeechUtterance(string: text)
+
+ if self.voice != nil {
+ utterance.voice = self.voice!
+ } else {
+ utterance.voice = AVSpeechSynthesisVoice(language: self.language)
+ }
+ utterance.rate = self.rate
+ utterance.volume = self.volume
+ utterance.pitchMultiplier = self.pitch
+
+ if #available(iOS 13.0, *) {
+ self.synthesizer.write(utterance) { (buffer: AVAudioBuffer) in
+ guard let pcmBuffer = buffer as? AVAudioPCMBuffer else {
+ NSLog("unknow buffer type: \(buffer)")
+ failed = true
+ return
+ }
+ print(pcmBuffer.format)
+ if pcmBuffer.frameLength == 0 {
+ // finished
+ } else {
+ // append buffer to file
+ let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(fileName)
+ NSLog("Saving utterance to file: \(fileURL.absoluteString)")
+
+ if output == nil {
+ do {
+ output = try AVAudioFile(
+ forWriting: fileURL,
+ settings: pcmBuffer.format.settings,
+ commonFormat: .pcmFormatInt16,
+ interleaved: false)
+ } catch {
+ NSLog(error.localizedDescription)
+ failed = true
+ return
+ }
+ }
+
+ try! output!.write(from: pcmBuffer)
+ }
+ }
+ } else {
+ result("Unsupported iOS version")
+ }
+ if failed {
+ result(0)
+ }
+ result(1)
+ }
+
+ private func pause(result: FlutterResult) {
+ if (self.synthesizer.pauseSpeaking(at: AVSpeechBoundary.word)) {
+ result(1)
+ } else {
+ result(0)
+ }
+ }
+
+ private func setLanguage(language: String, result: FlutterResult) {
+ if !(self.languages.contains(where: {$0.range(of: language, options: [.caseInsensitive, .anchored]) != nil})) {
+ result(0)
+ } else {
+ self.language = language
+ self.voice = nil
+ result(1)
+ }
+ }
+
+ private func setRate(rate: Float) {
+ self.rate = rate
+ }
+
+ private func setVolume(volume: Float, result: FlutterResult) {
+ if (volume >= 0.0 && volume <= 1.0) {
+ self.volume = volume
+ result(1)
+ } else {
+ result(0)
+ }
+ }
+
+ private func setPitch(pitch: Float, result: FlutterResult) {
+ if (volume >= 0.5 && volume <= 2.0) {
+ self.pitch = pitch
+ result(1)
+ } else {
+ result(0)
+ }
+ }
+
+ private func setSharedInstance(sharedInstance: Bool, result: FlutterResult) {
+ do {
+ try AVAudioSession.sharedInstance().setActive(sharedInstance)
+ result(1)
+ } catch {
+ result(0)
+ }
+ }
+
+ private func setAudioCategory(audioCategory: String?, audioOptions: Array?, result: FlutterResult){
+ let category: AVAudioSession.Category = AudioCategory(rawValue: audioCategory ?? "")?.toAVAudioSessionCategory() ?? audioSession.category
+ let options: AVAudioSession.CategoryOptions = audioOptions?.reduce([], { (result, option) -> AVAudioSession.CategoryOptions in
+ return result.union(AudioCategoryOptions(rawValue: option)?.toAVAudioSessionCategoryOptions() ?? [])
+ }) ?? []
+
+ do {
+ try audioSession.setCategory(category, options: options)
+ result(1)
+ } catch {
+ print(error)
+ result(0)
+ }
+ }
+
+ private func stop() {
+ self.synthesizer.stopSpeaking(at: AVSpeechBoundary.immediate)
+ }
+
+ private func getLanguages(result: FlutterResult) {
+ result(Array(self.languages))
+ }
+
+ private func getSpeechRateValidRange(result: FlutterResult) {
+ let validSpeechRateRange: [String:String] = [
+ "min": String(AVSpeechUtteranceMinimumSpeechRate),
+ "normal": String(AVSpeechUtteranceDefaultSpeechRate),
+ "max": String(AVSpeechUtteranceMaximumSpeechRate),
+ "platform": "ios"
+ ]
+ result(validSpeechRateRange)
+ }
+
+ private func isLanguageAvailable(language: String, result: FlutterResult) {
+ var isAvailable: Bool = false
+ if (self.languages.contains(where: {$0.range(of: language, options: [.caseInsensitive, .anchored]) != nil})) {
+ isAvailable = true
+ }
+ result(isAvailable);
+ }
+
+ private func getVoices(result: FlutterResult) {
+ if #available(iOS 9.0, *) {
+ let voices = NSMutableArray()
+ var voiceDict: [String: String] = [:]
+ for voice in AVSpeechSynthesisVoice.speechVoices() {
+ voiceDict["name"] = voice.name
+ voiceDict["locale"] = voice.language
+ voices.add(voiceDict)
+ }
+ result(voices)
+ } else {
+ // Since voice selection is not supported below iOS 9, make voice getter and setter
+ // have the same bahavior as language selection.
+ getLanguages(result: result)
+ }
+ }
+
+ private func setVoice(voice: [String:String], result: FlutterResult) {
+ if #available(iOS 9.0, *) {
+ if let voice = AVSpeechSynthesisVoice.speechVoices().first(where: { $0.name == voice["name"]! && $0.language == voice["locale"]! }) {
+ self.voice = voice
+ self.language = voice.language
+ result(1)
+ return
+ }
+ result(0)
+ } else {
+ setLanguage(language: voice["name"]!, result: result)
+ }
+ }
+
+ private func shouldDeactivateAndNotifyOthers(_ session: AVAudioSession) -> Bool {
+ var options: AVAudioSession.CategoryOptions = .duckOthers
+ if #available(iOS 9.0, *) {
+ options.insert(.interruptSpokenAudioAndMixWithOthers)
+ }
+ options.remove(.mixWithOthers)
+
+ return !options.isDisjoint(with: session.categoryOptions)
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
+ if shouldDeactivateAndNotifyOthers(audioSession) {
+ do {
+ try audioSession.setActive(false, options: .notifyOthersOnDeactivation)
+ } catch {
+ print(error)
+ }
+ }
+ if self.awaitSpeakCompletion {
+ self.speakResult(1)
+ }
+ self.channel.invokeMethod("speak.onComplete", arguments: nil)
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) {
+ self.channel.invokeMethod("speak.onStart", arguments: nil)
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didPause utterance: AVSpeechUtterance) {
+ self.channel.invokeMethod("speak.onPause", arguments: nil)
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didContinue utterance: AVSpeechUtterance) {
+ self.channel.invokeMethod("speak.onContinue", arguments: nil)
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didCancel utterance: AVSpeechUtterance) {
+ self.channel.invokeMethod("speak.onCancel", arguments: nil)
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, willSpeakRangeOfSpeechString characterRange: NSRange, utterance: AVSpeechUtterance) {
+ let nsWord = utterance.speechString as NSString
+ let data: [String:String] = [
+ "text": utterance.speechString,
+ "start": String(characterRange.location),
+ "end": String(characterRange.location + characterRange.length),
+ "word": nsWord.substring(with: characterRange)
+ ]
+ self.channel.invokeMethod("speak.onProgress", arguments: data)
+ }
+
+}
diff --git a/flutter_tts-voice_enhancement/ios/flutter_tts.podspec b/flutter_tts-voice_enhancement/ios/flutter_tts.podspec
new file mode 100644
index 00000000..03099f45
--- /dev/null
+++ b/flutter_tts-voice_enhancement/ios/flutter_tts.podspec
@@ -0,0 +1,22 @@
+#
+# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
+#
+Pod::Spec.new do |s|
+ s.name = 'flutter_tts'
+ s.version = '0.0.1'
+ s.summary = 'A flutter text to speech plugin.'
+ s.description = <<-DESC
+A flutter text to speech plugin
+ DESC
+ s.homepage = 'https://github.com/dlutton/flutter_tts'
+ s.license = { :file => '../LICENSE' }
+ s.author = { 'tundralabs' => 'eyedea32@gmail.com' }
+ s.source = { :path => '.' }
+ s.source_files = 'Classes/**/*'
+ s.public_header_files = 'Classes/**/*.h'
+ s.dependency 'Flutter'
+ s.ios.deployment_target = '8.0'
+ s.swift_version = '4.2'
+ s.static_framework = true
+end
+
diff --git a/flutter_tts-voice_enhancement/lib/flutter_tts.dart b/flutter_tts-voice_enhancement/lib/flutter_tts.dart
new file mode 100644
index 00000000..c823a91d
--- /dev/null
+++ b/flutter_tts-voice_enhancement/lib/flutter_tts.dart
@@ -0,0 +1,342 @@
+import 'dart:async';
+import 'dart:io' show Platform;
+
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+
+typedef void ErrorHandler(dynamic message);
+typedef ProgressHandler = void Function(
+ String text, int start, int end, String word);
+
+const String iosAudioCategoryOptionsKey = 'iosAudioCategoryOptionsKey';
+const String iosAudioCategoryKey = 'iosAudioCategoryKey';
+const String iosAudioCategoryAmbientSolo = 'iosAudioCategoryAmbientSolo';
+const String iosAudioCategoryAmbient = 'iosAudioCategoryAmbient';
+const String iosAudioCategoryPlayback = 'iosAudioCategoryPlayback';
+const String iosAudioCategoryPlaybackAndRecord =
+ 'iosAudioCategoryPlaybackAndRecord';
+
+const String iosAudioCategoryOptionsMixWithOthers =
+ 'iosAudioCategoryOptionsMixWithOthers';
+const String iosAudioCategoryOptionsDuckOthers =
+ 'iosAudioCategoryOptionsDuckOthers';
+const String iosAudioCategoryOptionsInterruptSpokenAudioAndMixWithOthers =
+ 'iosAudioCategoryOptionsInterruptSpokenAudioAndMixWithOthers';
+const String iosAudioCategoryOptionsAllowBluetooth =
+ 'iosAudioCategoryOptionsAllowBluetooth';
+const String iosAudioCategoryOptionsAllowBluetoothA2DP =
+ 'iosAudioCategoryOptionsAllowBluetoothA2DP';
+const String iosAudioCategoryOptionsAllowAirPlay =
+ 'iosAudioCategoryOptionsAllowAirPlay';
+const String iosAudioCategoryOptionsDefaultToSpeaker =
+ 'iosAudioCategoryOptionsDefaultToSpeaker';
+
+enum TextToSpeechPlatform { android, ios }
+
+enum IosTextToSpeechAudioCategory {
+ /// Audio is silenced by screen lock and the silent switch; audio will not mix
+ /// with other apps' audio.
+ ambientSolo,
+
+ /// Audio is silenced by screen lock and the silent switch; audio will mix
+ /// with other apps' (mixable) audio.
+ ambient,
+
+ /// Audio is not silenced by screen lock or silent switch; audio will not mix
+ /// with other apps' audio.
+ ///
+ playback,
+
+ /// The category for recording (input) and playback (output) of audio,
+ /// such as for a Voice over Internet Protocol (VoIP) app.
+ /// The default value.
+ playAndRecord,
+}
+
+enum IosTextToSpeechAudioCategoryOptions {
+ /// An option that indicates whether audio from this session mixes with audio
+ /// from active sessions in other audio apps.
+ mixWithOthers,
+
+ /// An option that reduces the volume of other audio session while audio
+ /// from this session plays.
+ duckOthers,
+
+ /// An option that determines whether to pause spoken audio content
+ /// from other sessions when your app plays its audio.
+ interruptSpokenAudioAndMixWithOthers,
+
+ ///An option that determines whether Bluetooth hands-free devices
+ /// appear as available input routes.
+ allowBluetooth,
+
+ ///An option that determines whether you can stream audio
+ /// from this session to Bluetooth devices that support the Advanced Audio Distribution Profile (A2DP).
+ allowBluetoothA2DP,
+
+ ///An option that determines whether you can stream audio
+ /// from this session to AirPlay devices.
+ allowAirPlay,
+
+ ///An option that determines whether audio
+ /// from the session defaults to the built-in speaker instead of the receiver.
+ /// The default value.
+ defaultToSpeaker,
+}
+
+class SpeechRateValidRange {
+ final double min;
+ final double normal;
+ final double max;
+ final TextToSpeechPlatform platform;
+
+ SpeechRateValidRange(this.min, this.normal, this.max, this.platform);
+}
+
+// Provides Platform specific TTS services (Android: TextToSpeech, IOS: AVSpeechSynthesizer)
+class FlutterTts {
+ static const MethodChannel _channel = const MethodChannel('flutter_tts');
+
+ VoidCallback startHandler;
+ VoidCallback completionHandler;
+ VoidCallback pauseHandler;
+ VoidCallback continueHandler;
+ VoidCallback cancelHandler;
+ ProgressHandler progressHandler;
+ ErrorHandler errorHandler;
+
+ FlutterTts() {
+ _channel.setMethodCallHandler(platformCallHandler);
+ }
+
+ /// [Future] which sets speak's future to return on completion of the utterance
+ Future awaitSpeakCompletion(bool awaitCompletion) async =>
+ _channel.invokeMethod('awaitSpeakCompletion', awaitCompletion);
+
+ /// [Future] which invokes the platform specific method for speaking
+ Future speak(String text) async =>
+ _channel.invokeMethod('speak', text);
+
+ /// [Future] which invokes the platform specific method for pause
+ /// ***iOS supported only***
+ Future pause() async => _channel.invokeMethod('pause');
+
+ /// [Future] which invokes the platform specific method for synthesizeToFile
+ /// ***Android and iOS supported only***
+ Future synthesizeToFile(String text, String fileName) async =>
+ _channel.invokeMethod('synthesizeToFile', {
+ "text": text,
+ "fileName": fileName,
+ });
+
+ /// [Future] which invokes the platform specific method for setLanguage
+ Future setLanguage(String language) async =>
+ _channel.invokeMethod('setLanguage', language);
+
+ /// [Future] which invokes the platform specific method for setSpeechRate
+ /// Allowed values are in the range from 0.0 (slowest) to 1.0 (fastest)
+ Future setSpeechRate(double rate) async =>
+ _channel.invokeMethod('setSpeechRate', rate);
+
+ /// [Future] which invokes the platform specific method for setVolume
+ /// Allowed values are in the range from 0.0 (silent) to 1.0 (loudest)
+ Future setVolume(double volume) async =>
+ _channel.invokeMethod('setVolume', volume);
+
+ /// [Future] which invokes the platform specific method for shared instance
+ /// ***iOS supported only***
+ Future setSharedInstance(bool sharedSession) async =>
+ _channel.invokeMethod('setSharedInstance', sharedSession);
+
+ /// [Future] which invokes the platform specific method for setting audio category
+ /// ***Ios supported only***
+ Future setIosAudioCategory(IosTextToSpeechAudioCategory category,
+ List options) async {
+ const categoryToString = {
+ IosTextToSpeechAudioCategory.ambientSolo: iosAudioCategoryAmbientSolo,
+ IosTextToSpeechAudioCategory.ambient: iosAudioCategoryAmbient,
+ IosTextToSpeechAudioCategory.playback: iosAudioCategoryPlayback
+ };
+ const optionsToString = {
+ IosTextToSpeechAudioCategoryOptions.mixWithOthers:
+ 'iosAudioCategoryOptionsMixWithOthers',
+ IosTextToSpeechAudioCategoryOptions.duckOthers:
+ 'iosAudioCategoryOptionsDuckOthers',
+ IosTextToSpeechAudioCategoryOptions.interruptSpokenAudioAndMixWithOthers:
+ 'iosAudioCategoryOptionsInterruptSpokenAudioAndMixWithOthers',
+ IosTextToSpeechAudioCategoryOptions.allowBluetooth:
+ 'iosAudioCategoryOptionsAllowBluetooth',
+ IosTextToSpeechAudioCategoryOptions.allowBluetoothA2DP:
+ 'iosAudioCategoryOptionsAllowBluetoothA2DP',
+ IosTextToSpeechAudioCategoryOptions.allowAirPlay:
+ 'iosAudioCategoryOptionsAllowAirPlay',
+ IosTextToSpeechAudioCategoryOptions.defaultToSpeaker:
+ 'iosAudioCategoryOptionsDefaultToSpeaker',
+ };
+ if (!Platform.isIOS) return;
+ try {
+ return _channel
+ .invokeMethod('setIosAudioCategory', {
+ iosAudioCategoryKey: categoryToString[category],
+ iosAudioCategoryOptionsKey:
+ options.map((o) => optionsToString[o]).toList(),
+ });
+ } on PlatformException catch (e) {
+ print(
+ 'setIosAudioCategory error, category: $category, error: ${e.message}');
+ }
+ }
+
+ /// [Future] which invokes the platform specific method for setPitch
+ /// 1.0 is default and ranges from .5 to 2.0
+ Future setPitch(double pitch) async =>
+ _channel.invokeMethod('setPitch', pitch);
+
+ /// [Future] which invokes the platform specific method for setVoice
+ /// ***Android, iOS, and macOS supported only***
+ Future setVoice(Map voice) async =>
+ _channel.invokeMethod('setVoice', voice);
+
+ /// [Future] which invokes the platform specific method for stop
+ Future stop() async => _channel.invokeMethod('stop');
+
+ /// [Future] which invokes the platform specific method for getLanguages
+ /// Android issues with API 21 & 22
+ /// Returns a list of available languages
+ Future get getLanguages async {
+ final languages = await _channel.invokeMethod('getLanguages');
+ return languages;
+ }
+
+ /// [Future] which invokes the platform specific method for getEngines
+ /// Returns a list of installed TTS engines
+ /// ***Android supported only***
+ Future get getEngines async {
+ final engines = await _channel.invokeMethod('getEngines');
+ return engines;
+ }
+
+ /// [Future] which invokes the platform specific method for getVoices
+ /// Returns a `List` of `Maps` containing a voice name and locale
+ /// ***Android, iOS, and macOS supported only***
+ Future get getVoices async {
+ final voices = await _channel.invokeMethod('getVoices');
+ return voices;
+ }
+
+ /// [Future] which invokes the platform specific method for isLanguageAvailable
+ /// Returns `true` or `false`
+ Future isLanguageAvailable(String language) async =>
+ _channel.invokeMethod('isLanguageAvailable', language);
+
+ Future get getSpeechRateValidRange async {
+ final validRange = await _channel.invokeMethod('getSpeechRateValidRange')
+ as Map;
+ final min = double.parse(validRange['min'].toString());
+ final normal = double.parse(validRange['normal'].toString());
+ final max = double.parse(validRange['max'].toString());
+ final platformStr = validRange['platform'].toString();
+ final platform = TextToSpeechPlatform.values
+ .firstWhere((e) => describeEnum(e) == platformStr);
+
+ return SpeechRateValidRange(min, normal, max, platform);
+ }
+
+ /// [Future] which invokes the platform specific method for setSilence
+ /// 0 means start the utterance immediately. If the value is greater than zero a silence period in milliseconds is set according to the parameter
+ /// ***Android supported only***
+ Future setSilence(int timems) async =>
+ _channel.invokeMethod('setSilence', timems ?? 0);
+
+ void setStartHandler(VoidCallback callback) {
+ startHandler = callback;
+ }
+
+ void setCompletionHandler(VoidCallback callback) {
+ completionHandler = callback;
+ }
+
+ void setContinueHandler(VoidCallback callback) {
+ continueHandler = callback;
+ }
+
+ void setPauseHandler(VoidCallback callback) {
+ pauseHandler = callback;
+ }
+
+ void setCancelHandler(VoidCallback callback) {
+ cancelHandler = callback;
+ }
+
+ void setProgressHandler(ProgressHandler callback) {
+ progressHandler = callback;
+ }
+
+ void setErrorHandler(ErrorHandler handler) {
+ errorHandler = handler;
+ }
+
+ /// Platform listeners
+ Future platformCallHandler(MethodCall call) async {
+ switch (call.method) {
+ case "speak.onStart":
+ if (startHandler != null) {
+ startHandler();
+ }
+ break;
+ case "synth.onStart":
+ if (startHandler != null) {
+ startHandler();
+ }
+ break;
+ case "speak.onComplete":
+ if (completionHandler != null) {
+ completionHandler();
+ }
+ break;
+ case "synth.onComplete":
+ if (completionHandler != null) {
+ completionHandler();
+ }
+ break;
+ case "speak.onPause":
+ if (pauseHandler != null) {
+ pauseHandler();
+ }
+ break;
+ case "speak.onContinue":
+ if (continueHandler != null) {
+ continueHandler();
+ }
+ break;
+ case "speak.onCancel":
+ if (cancelHandler != null) {
+ cancelHandler();
+ }
+ break;
+ case "speak.onError":
+ if (errorHandler != null) {
+ errorHandler(call.arguments);
+ }
+ break;
+ case 'speak.onProgress':
+ if (progressHandler != null) {
+ final args = call.arguments as Map;
+ progressHandler(
+ args['text'].toString(),
+ int.parse(args['start'].toString()),
+ int.parse(args['end'].toString()),
+ args['word'].toString(),
+ );
+ }
+ break;
+ case "synth.onError":
+ if (errorHandler != null) {
+ errorHandler(call.arguments);
+ }
+ break;
+ default:
+ print('Unknowm method ${call.method}');
+ }
+ }
+}
diff --git a/flutter_tts-voice_enhancement/lib/flutter_tts_web.dart b/flutter_tts-voice_enhancement/lib/flutter_tts_web.dart
new file mode 100644
index 00000000..182e9dfa
--- /dev/null
+++ b/flutter_tts-voice_enhancement/lib/flutter_tts_web.dart
@@ -0,0 +1,184 @@
+import 'dart:async';
+import 'dart:html' as html;
+import 'dart:js';
+
+import 'package:flutter/services.dart';
+import 'package:flutter_web_plugins/flutter_web_plugins.dart';
+
+enum TtsState { playing, stopped, paused, continued }
+
+class FlutterTtsPlugin {
+ static const String PLATFORM_CHANNEL = "flutter_tts";
+ static MethodChannel channel;
+ bool awaitSpeakCompletion = false;
+
+ TtsState ttsState = TtsState.stopped;
+
+ get isPlaying => ttsState == TtsState.playing;
+
+ get isStopped => ttsState == TtsState.stopped;
+
+ get isPaused => ttsState == TtsState.paused;
+
+ get isContinued => ttsState == TtsState.continued;
+
+ static void registerWith(Registrar registrar) {
+ channel = MethodChannel(
+ PLATFORM_CHANNEL, const StandardMethodCodec(), registrar.messenger);
+ final instance = FlutterTtsPlugin();
+ channel.setMethodCallHandler(instance.handleMethodCall);
+ }
+
+ html.SpeechSynthesis synth;
+ html.SpeechSynthesisUtterance utterance;
+ List voices;
+ List languages;
+
+ FlutterTtsPlugin() {
+ utterance = html.SpeechSynthesisUtterance();
+ synth = html.window.speechSynthesis;
+
+ _listeners();
+ }
+
+ void _listeners() {
+ utterance.onStart.listen((e) {
+ ttsState = TtsState.playing;
+ channel.invokeMethod("speak.onStart", null);
+ });
+ utterance.onEnd.listen((e) {
+ ttsState = TtsState.stopped;
+ channel.invokeMethod("speak.onComplete", null);
+ if (awaitSpeakCompletion) {
+ return 1;
+ }
+ });
+ utterance.onPause.listen((e) {
+ ttsState = TtsState.paused;
+ channel.invokeMethod("speak.onPause", null);
+ });
+ utterance.onResume.listen((e) {
+ ttsState = TtsState.continued;
+ channel.invokeMethod("speak.onContinue", null);
+ });
+ utterance.onError.listen((e) {
+ channel.invokeMethod("speak.onError", e);
+ if (awaitSpeakCompletion) {
+ return 0;
+ }
+ });
+ }
+
+ Future handleMethodCall(MethodCall call) async {
+ switch (call.method) {
+ case 'speak':
+ final text = call.arguments as String;
+ _speak(text);
+ if (!awaitSpeakCompletion) {
+ return 1;
+ }
+ break;
+ case 'awaitSpeakCompletion':
+ awaitSpeakCompletion = call.arguments as bool;
+ return 1;
+ break;
+ case 'stop':
+ _stop();
+ return 1;
+ break;
+ case 'pause':
+ _pause();
+ return 1;
+ break;
+ case 'setLanguage':
+ final language = call.arguments as String;
+ _setLanguage(language);
+ return 1;
+ break;
+ case 'getLanguages':
+ return _getLanguages();
+ break;
+ case 'setSpeechRate':
+ final rate = call.arguments as num;
+ _setRate(rate);
+ return 1;
+ break;
+ case 'setVolume':
+ final volume = call.arguments as num;
+ _setVolume(volume);
+ return 1;
+ break;
+ case 'setPitch':
+ final pitch = call.arguments as num;
+ _setPitch(pitch);
+ return 1;
+ break;
+ case 'isLanguageAvailable':
+ final lang = call.arguments as String;
+ return _isLanguageAvailable(lang);
+ break;
+ default:
+ throw PlatformException(
+ code: 'Unimplemented',
+ details: "The flutter_tts plugin for web doesn't implement "
+ "the method '${call.method}'");
+ }
+ }
+
+ void _speak(String text) {
+ if (ttsState == TtsState.stopped || ttsState == TtsState.paused) {
+ utterance.text = text;
+ if (ttsState == TtsState.paused) {
+ synth.resume();
+ } else {
+ synth.speak(utterance);
+ }
+ }
+ }
+
+ void _stop() {
+ if (ttsState != TtsState.stopped) {
+ synth.cancel();
+ }
+ }
+
+ void _pause() {
+ if (ttsState == TtsState.playing || ttsState == TtsState.continued) {
+ synth.pause();
+ }
+ }
+
+ void _setRate(num rate) => utterance.rate = rate * 2.0;
+ void _setVolume(num volume) => utterance.volume = volume;
+ void _setPitch(num pitch) => utterance.pitch = pitch;
+ void _setLanguage(String language) => utterance.lang = language;
+
+ bool _isLanguageAvailable(String language) {
+ if (voices?.isEmpty ?? true) _setVoices();
+ if (languages?.isEmpty ?? true) _setLanguages();
+ for (var lang in languages) {
+ if (lang.toLowerCase() == language.toLowerCase()) return true;
+ }
+ return false;
+ }
+
+ List _getLanguages() {
+ if (voices?.isEmpty ?? true) _setVoices();
+ if (languages?.isEmpty ?? true) _setLanguages();
+ return languages;
+ }
+
+ void _setVoices() {
+ voices =
+ context['speechSynthesis'].callMethod('getVoices') as JsArray;
+ }
+
+ void _setLanguages() {
+ var langs = Set();
+ for (var v in voices) {
+ langs.add(v['lang'] as String);
+ }
+
+ languages = langs.toList();
+ }
+}
diff --git a/flutter_tts-voice_enhancement/macos/Classes/FlutterTtsPlugin.swift b/flutter_tts-voice_enhancement/macos/Classes/FlutterTtsPlugin.swift
new file mode 100644
index 00000000..ec4bffa1
--- /dev/null
+++ b/flutter_tts-voice_enhancement/macos/Classes/FlutterTtsPlugin.swift
@@ -0,0 +1,315 @@
+import FlutterMacOS
+import Foundation
+import AVFoundation
+
+public class FlutterTtsPlugin: NSObject, FlutterPlugin, AVSpeechSynthesizerDelegate {
+ final var iosAudioCategoryKey = "iosAudioCategoryKey"
+ final var iosAudioCategoryOptionsKey = "iosAudioCategoryOptionsKey"
+
+ let synthesizer = AVSpeechSynthesizer()
+ var language: String = AVSpeechSynthesisVoice.currentLanguageCode()
+ var rate: Float = AVSpeechUtteranceDefaultSpeechRate
+ var languages = Set()
+ var volume: Float = 1.0
+ var pitch: Float = 1.0
+ var voice: AVSpeechSynthesisVoice?
+ var awaitSpeakCompletion: Bool = false
+ var speakResult: FlutterResult!
+
+ var channel = FlutterMethodChannel()
+ init(channel: FlutterMethodChannel) {
+ super.init()
+ self.channel = channel
+ synthesizer.delegate = self
+ setLanguages()
+ }
+
+ private func setLanguages() {
+ for voice in AVSpeechSynthesisVoice.speechVoices(){
+ self.languages.insert(voice.language)
+ }
+ }
+
+ public static func register(with registrar: FlutterPluginRegistrar) {
+ let channel = FlutterMethodChannel(name: "flutter_tts", binaryMessenger: registrar.messenger)
+ let instance = FlutterTtsPlugin(channel: channel)
+ registrar.addMethodCallDelegate(instance, channel: channel)
+ }
+
+ public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
+ switch call.method {
+ case "speak":
+ let text: String = call.arguments as! String
+ self.speak(text: text, result: result)
+ break
+ case "awaitSpeakCompletion":
+ self.awaitSpeakCompletion = call.arguments as! Bool
+ result(1)
+ break
+ case "synthesizeToFile":
+ guard let args = call.arguments as? [String: Any] else {
+ result("iOS could not recognize flutter arguments in method: (sendParams)")
+ return
+ }
+ let text = args["text"] as! String
+ let fileName = args["fileName"] as! String
+ self.synthesizeToFile(text: text, fileName: fileName, result: result)
+ break
+ case "pause":
+ self.pause(result: result)
+ break
+ case "setLanguage":
+ let language: String = call.arguments as! String
+ self.setLanguage(language: language, result: result)
+ break
+ case "setSpeechRate":
+ let rate: Double = call.arguments as! Double
+ self.setRate(rate: Float(rate))
+ result(1)
+ break
+ case "setVolume":
+ let volume: Double = call.arguments as! Double
+ self.setVolume(volume: Float(volume), result: result)
+ break
+ case "setPitch":
+ let pitch: Double = call.arguments as! Double
+ self.setPitch(pitch: Float(pitch), result: result)
+ break
+ case "stop":
+ self.stop()
+ result(1)
+ break
+ case "getLanguages":
+ self.getLanguages(result: result)
+ break
+ case "getSpeechRateValidRange":
+ self.getSpeechRateValidRange(result: result)
+ break
+ case "isLanguageAvailable":
+ let language: String = call.arguments as! String
+ self.isLanguageAvailable(language: language, result: result)
+ break
+ case "getVoices":
+ self.getVoices(result: result)
+ break
+ case "setVoice":
+ guard let args = call.arguments as? [String: String] else {
+ result("iOS could not recognize flutter arguments in method: (sendParams)")
+ return
+ }
+ self.setVoice(voice: args, result: result)
+ break
+ default:
+ result(FlutterMethodNotImplemented)
+ }
+ }
+
+ private func speak(text: String, result: @escaping FlutterResult) {
+ if (self.synthesizer.isPaused) {
+ if (self.synthesizer.continueSpeaking()) {
+ if self.awaitSpeakCompletion {
+ self.speakResult = result
+ } else {
+ result(1)
+ }
+ } else {
+ result(0)
+ }
+ } else {
+ let utterance = AVSpeechUtterance(string: text)
+ if self.voice != nil {
+ utterance.voice = self.voice!
+ } else {
+ utterance.voice = AVSpeechSynthesisVoice(language: self.language)
+ }
+ utterance.rate = self.rate
+ utterance.volume = self.volume
+ utterance.pitchMultiplier = self.pitch
+
+ self.synthesizer.speak(utterance)
+ if self.awaitSpeakCompletion {
+ self.speakResult = result
+ } else {
+ result(1)
+ }
+ }
+ }
+
+ private func synthesizeToFile(text: String, fileName: String, result: FlutterResult) {
+ var output: AVAudioFile?
+ var failed = false
+ let utterance = AVSpeechUtterance(string: text)
+
+ if #available(iOS 13.0, *) {
+ self.synthesizer.write(utterance) { (buffer: AVAudioBuffer) in
+ guard let pcmBuffer = buffer as? AVAudioPCMBuffer else {
+ NSLog("unknow buffer type: \(buffer)")
+ failed = true
+ return
+ }
+ print(pcmBuffer.format)
+ if pcmBuffer.frameLength == 0 {
+ // finished
+ } else {
+ // append buffer to file
+ let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(fileName)
+ NSLog("Saving utterance to file: \(fileURL.absoluteString)")
+
+ if output == nil {
+ do {
+ output = try AVAudioFile(
+ forWriting: fileURL,
+ settings: pcmBuffer.format.settings,
+ commonFormat: .pcmFormatInt16,
+ interleaved: false)
+ } catch {
+ NSLog(error.localizedDescription)
+ failed = true
+ return
+ }
+ }
+
+ try! output!.write(from: pcmBuffer)
+ }
+ }
+ } else {
+ result("Unsupported iOS version")
+ }
+ if failed {
+ result(0)
+ }
+ result(1)
+ }
+
+ private func pause(result: FlutterResult) {
+ if (self.synthesizer.pauseSpeaking(at: AVSpeechBoundary.word)) {
+ result(1)
+ } else {
+ result(0)
+ }
+ }
+
+ private func setLanguage(language: String, result: FlutterResult) {
+ if !(self.languages.contains(where: {$0.range(of: language, options: [.caseInsensitive, .anchored]) != nil})) {
+ result(0)
+ } else {
+ self.language = language
+ self.voice = nil
+ result(1)
+ }
+ }
+
+ private func setRate(rate: Float) {
+ self.rate = rate
+ }
+
+ private func setVolume(volume: Float, result: FlutterResult) {
+ if (volume >= 0.0 && volume <= 1.0) {
+ self.volume = volume
+ result(1)
+ } else {
+ result(0)
+ }
+ }
+
+ private func setPitch(pitch: Float, result: FlutterResult) {
+ if (volume >= 0.5 && volume <= 2.0) {
+ self.pitch = pitch
+ result(1)
+ } else {
+ result(0)
+ }
+ }
+
+ private func stop() {
+ self.synthesizer.stopSpeaking(at: AVSpeechBoundary.immediate)
+ }
+
+ private func getLanguages(result: FlutterResult) {
+ result(Array(self.languages))
+ }
+
+ private func getSpeechRateValidRange(result: FlutterResult) {
+ let validSpeechRateRange: [String:String] = [
+ "min": String(AVSpeechUtteranceMinimumSpeechRate),
+ "normal": String(AVSpeechUtteranceDefaultSpeechRate),
+ "max": String(AVSpeechUtteranceMaximumSpeechRate),
+ "platform": "ios"
+ ]
+ result(validSpeechRateRange)
+ }
+
+ private func isLanguageAvailable(language: String, result: FlutterResult) {
+ var isAvailable: Bool = false
+ if (self.languages.contains(where: {$0.range(of: language, options: [.caseInsensitive, .anchored]) != nil})) {
+ isAvailable = true
+ }
+ result(isAvailable);
+ }
+
+ private func getVoices(result: FlutterResult) {
+ if #available(iOS 9.0, *) {
+ let voices = NSMutableArray()
+ var voiceDict: [String: String] = [:]
+ for voice in AVSpeechSynthesisVoice.speechVoices() {
+ voiceDict["name"] = voice.name
+ voiceDict["locale"] = voice.language
+ voices.add(voiceDict)
+ }
+ result(voices)
+ } else {
+ // Since voice selection is not supported below iOS 9, make voice getter and setter
+ // have the same bahavior as language selection.
+ getLanguages(result: result)
+ }
+ }
+
+ private func setVoice(voice: [String:String], result: FlutterResult) {
+ if #available(iOS 9.0, *) {
+ if let voice = AVSpeechSynthesisVoice.speechVoices().first(where: { $0.name == voice["name"]! && $0.language == voice["locale"]! }) {
+ self.voice = voice
+ self.language = voice.language
+ result(1)
+ return
+ }
+ result(0)
+ } else {
+ setLanguage(language: voice["name"]!, result: result)
+ }
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
+ if self.awaitSpeakCompletion {
+ self.speakResult(1)
+ }
+ self.channel.invokeMethod("speak.onComplete", arguments: nil)
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) {
+ self.channel.invokeMethod("speak.onStart", arguments: nil)
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didPause utterance: AVSpeechUtterance) {
+ self.channel.invokeMethod("speak.onPause", arguments: nil)
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didContinue utterance: AVSpeechUtterance) {
+ self.channel.invokeMethod("speak.onContinue", arguments: nil)
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didCancel utterance: AVSpeechUtterance) {
+ self.channel.invokeMethod("speak.onCancel", arguments: nil)
+ }
+
+ public func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, willSpeakRangeOfSpeechString characterRange: NSRange, utterance: AVSpeechUtterance) {
+ let nsWord = utterance.speechString as NSString
+ let data: [String:String] = [
+ "text": utterance.speechString,
+ "start": String(characterRange.location),
+ "end": String(characterRange.location + characterRange.length),
+ "word": nsWord.substring(with: characterRange)
+ ]
+ self.channel.invokeMethod("speak.onProgress", arguments: data)
+ }
+
+}
diff --git a/flutter_tts-voice_enhancement/macos/flutter_tts.podspec b/flutter_tts-voice_enhancement/macos/flutter_tts.podspec
new file mode 100644
index 00000000..2838eb07
--- /dev/null
+++ b/flutter_tts-voice_enhancement/macos/flutter_tts.podspec
@@ -0,0 +1,22 @@
+#
+# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
+#
+Pod::Spec.new do |s|
+ s.name = 'flutter_tts'
+ s.version = '0.0.1'
+ s.summary = 'macOS implementation of the flutter_tts plugin.'
+ s.description = <<-DESC
+ A flutter text to speech plugin
+ DESC
+ s.homepage = 'https://github.com/dlutton/flutter_tts'
+ s.license = { :file => '../LICENSE' }
+ s.author = { 'Daniel Lutton' => 'eyedea32@gmail.com' }
+ s.source = { :path => '.' }
+ s.source_files = 'Classes/**/*'
+ s.dependency 'FlutterMacOS'
+
+ s.platform = :osx, '10.15'
+ s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
+ s.swift_version = '5.0'
+
+ end
\ No newline at end of file
diff --git a/flutter_tts-voice_enhancement/pubspec.yaml b/flutter_tts-voice_enhancement/pubspec.yaml
new file mode 100644
index 00000000..06e93f33
--- /dev/null
+++ b/flutter_tts-voice_enhancement/pubspec.yaml
@@ -0,0 +1,28 @@
+name: flutter_tts
+description: A flutter plugin for Text to Speech. This plugin is supported on iOS, Android, Web, & macOS.
+version: 1.3.0
+homepage: https://github.com/dlutton/flutter_tts
+
+dependencies:
+ flutter:
+ sdk: flutter
+ flutter_web_plugins:
+ sdk: flutter
+
+flutter:
+ plugin:
+ platforms:
+ android:
+ package: com.tundralabs.fluttertts
+ pluginClass: FlutterTtsPlugin
+ ios:
+ pluginClass: FlutterTtsPlugin
+ macos:
+ pluginClass: FlutterTtsPlugin
+ web:
+ pluginClass: FlutterTtsPlugin
+ fileName: flutter_tts_web.dart
+
+environment:
+ sdk: ">=2.1.0 <3.0.0"
+ flutter: ">=1.12.13+hotfix.5 <2.0.0"
diff --git a/ios/Podfile b/ios/Podfile
index 5579d926..d68afba2 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
- platform :ios, '11.0'
+# platform :ios, '11.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 0d6f024b..b09a4a0c 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -462,6 +462,8 @@ PODS:
- Flutter
- shared_preferences_windows (0.0.1):
- Flutter
+ - sms_otp_auto_verify (0.0.1):
+ - Flutter
- speech_to_text (0.0.1):
- Flutter
- Try
@@ -546,6 +548,7 @@ DEPENDENCIES:
- shared_preferences_macos (from `.symlinks/plugins/shared_preferences_macos/ios`)
- shared_preferences_web (from `.symlinks/plugins/shared_preferences_web/ios`)
- shared_preferences_windows (from `.symlinks/plugins/shared_preferences_windows/ios`)
+ - sms_otp_auto_verify (from `.symlinks/plugins/sms_otp_auto_verify/ios`)
- speech_to_text (from `.symlinks/plugins/speech_to_text/ios`)
- sqflite (from `.symlinks/plugins/sqflite/ios`)
- twilio_programmable_video (from `.symlinks/plugins/twilio_programmable_video/ios`)
@@ -683,6 +686,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/shared_preferences_web/ios"
shared_preferences_windows:
:path: ".symlinks/plugins/shared_preferences_windows/ios"
+ sms_otp_auto_verify:
+ :path: ".symlinks/plugins/sms_otp_auto_verify/ios"
speech_to_text:
:path: ".symlinks/plugins/speech_to_text/ios"
sqflite:
@@ -784,6 +789,7 @@ SPEC CHECKSUMS:
shared_preferences_macos: f3f29b71ccbb56bf40c9dd6396c9acf15e214087
shared_preferences_web: 141cce0c3ed1a1c5bf2a0e44f52d31eeb66e5ea9
shared_preferences_windows: 36b76d6f54e76ead957e60b49e2f124b4cd3e6ae
+ sms_otp_auto_verify: 201803ac25e13feedaae96eda8b70b10c55b3338
speech_to_text: b43a7d99aef037bd758ed8e45d79bbac035d2dfe
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
SwiftyGif: 5d4af95df24caf1c570dbbcb32a3b8a0763bc6d7
@@ -804,6 +810,6 @@ SPEC CHECKSUMS:
webview_flutter: d2b4d6c66968ad042ad94cbb791f5b72b4678a96
wifi: d7d77c94109e36c4175d845f0a5964eadba71060
-PODFILE CHECKSUM: 5a17be3f8af73a757fa4439c77cf6ab2db29a6e7
+PODFILE CHECKSUM: ac5efa1ac3c9555d0008dc18004313c84746da62
COCOAPODS: 1.10.1
diff --git a/ios/Runner/WifiConnect/GoogleService-Info.plist b/ios/Runner/WifiConnect/GoogleService-Info.plist
new file mode 100644
index 00000000..633037cb
--- /dev/null
+++ b/ios/Runner/WifiConnect/GoogleService-Info.plist
@@ -0,0 +1,38 @@
+
+
+
+
+ CLIENT_ID
+ 815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt.apps.googleusercontent.com
+ REVERSED_CLIENT_ID
+ com.googleusercontent.apps.815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt
+ ANDROID_CLIENT_ID
+ 815750722565-m14h8mkosm7cnq6uh6rhqr54dn02d705.apps.googleusercontent.com
+ API_KEY
+ AIzaSyDiXnCO00li4V7Ioa2YZ_M4ECxRsu_P9tA
+ GCM_SENDER_ID
+ 815750722565
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ com.HMG.HMG-Smartphone
+ PROJECT_ID
+ api-project-815750722565
+ STORAGE_BUCKET
+ api-project-815750722565.appspot.com
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:815750722565:ios:328ec247a81a2ca23c186c
+ DATABASE_URL
+ https://api-project-815750722565.firebaseio.com
+
+
\ No newline at end of file
diff --git a/key b/key
new file mode 100644
index 00000000..15b9f5d1
Binary files /dev/null and b/key differ
diff --git a/lib/config/config.dart b/lib/config/config.dart
index 3c7e1e9a..6a96b76d 100644
--- a/lib/config/config.dart
+++ b/lib/config/config.dart
@@ -1,9 +1,7 @@
import 'dart:io';
-import 'package:diplomaticquarterapp/core/service/geofencing/GeofencingServices.dart';
import 'package:diplomaticquarterapp/models/Request.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
-import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart';
const MAX_SMALL_SCREEN = 660;
@@ -18,11 +16,15 @@ const PACKAGES_ORDERS = '/api/orders';
const BASE_URL = 'https://uat.hmgwebservices.com/';
// const BASE_URL = 'https://hmgwebservices.com/';
-//const BASE_PHARMACY_URL = 'http://swd-pharapp-01:7200/api/';
-const BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/';
-const PHARMACY_BASE_URL = 'https://uat.hmgwebservices.com/epharmacy/api/';
-const PING_SERVICE = 'Services/Weather.svc/REST/CheckConnectivity';
+// Pharmacy UAT URLs
+// const BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/';
+// const PHARMACY_BASE_URL = 'https://uat.hmgwebservices.com/epharmacy/api/';
+
+// Pharmacy Production URLs
+const BASE_PHARMACY_URL = 'https://mdlaboratories.com/exacartapi/api/';
+const PHARMACY_BASE_URL = 'https://mdlaboratories.com/exacartapi/api/';
+const PING_SERVICE = 'Services/Weather.svc/REST/CheckConnectivity';
const GET_PROJECT = 'Services/Lists.svc/REST/GetProject';
@@ -38,38 +40,52 @@ const WEATHER_INDICATOR = 'Services/Weather.svc/REST/GetCityInfo';
const GET_PRIVILEGE = 'Services/Patients.svc/REST/Service_Privilege';
-
// Wifi Credentials
-const WIFI_CREDENTIALS = "Services/Patients.svc/Hmg_SMS_Get_By_ProjectID_And_PatientID";
+const WIFI_CREDENTIALS =
+ "Services/Patients.svc/Hmg_SMS_Get_By_ProjectID_And_PatientID";
///Doctor
-const GET_MY_DOCTOR = 'Services/Doctors.svc/REST/GetPatientDoctorAppointmentResult';
+const GET_MY_DOCTOR =
+ 'Services/Doctors.svc/REST/GetPatientDoctorAppointmentResult';
const GET_DOCTOR_PROFILE = 'Services/Doctors.svc/REST/GetDocProfiles';
-const GET_DOCTOR_RATING_NOTES = 'Services/Doctors.svc/REST/dr_GetNotesDoctorRating';
-const GET_DOCTOR_RATING_DETAILS = 'Services/Doctors.svc/REST/dr_GetDoctorRatingDetails';
+const GET_DOCTOR_RATING_NOTES =
+ 'Services/Doctors.svc/REST/dr_GetNotesDoctorRating';
+const GET_DOCTOR_RATING_DETAILS =
+ 'Services/Doctors.svc/REST/dr_GetDoctorRatingDetails';
const GET_DOCTOR_RATING = 'Services/Doctors.svc/REST/dr_GetAvgDoctorRating';
///Prescriptions
const PRESCRIPTIONS = 'Services/Patients.svc/REST/GetPrescriptionApptList';
-const GET_PRESCRIPTIONS_ALL_ORDERS = 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders';
-const GET_PRESCRIPTION_REPORT = 'Services/Patients.svc/REST/INP_GetPrescriptionReport';
-const SEND_PRESCRIPTION_EMAIL = 'Services/Notifications.svc/REST/SendPrescriptionEmail';
-const GET_PRESCRIPTION_REPORT_ENH = 'Services/Patients.svc/REST/GetPrescriptionReport_enh';
+const GET_PRESCRIPTIONS_ALL_ORDERS =
+ 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders';
+const GET_PRESCRIPTION_REPORT =
+ 'Services/Patients.svc/REST/INP_GetPrescriptionReport';
+const SEND_PRESCRIPTION_EMAIL =
+ 'Services/Notifications.svc/REST/SendPrescriptionEmail';
+const GET_PRESCRIPTION_REPORT_ENH =
+ 'Services/Patients.svc/REST/GetPrescriptionReport_enh';
///Lab Order
const GET_Patient_LAB_ORDERS = 'Services/Patients.svc/REST/GetPatientLabOrders';
-const GET_Patient_LAB_SPECIAL_RESULT = 'Services/Patients.svc/REST/GetPatientLabSpecialResults';
-const SEND_LAB_RESULT_EMAIL = 'Services/Notifications.svc/REST/SendLabReportEmail';
-const GET_Patient_LAB_RESULT = 'Services/Patients.svc/REST/GetPatientLabResults';
-const GET_Patient_LAB_ORDERS_RESULT = 'Services/Patients.svc/REST/GetPatientLabOrdersResults';
+const GET_Patient_LAB_SPECIAL_RESULT =
+ 'Services/Patients.svc/REST/GetPatientLabSpecialResults';
+const SEND_LAB_RESULT_EMAIL =
+ 'Services/Notifications.svc/REST/SendLabReportEmail';
+const GET_Patient_LAB_RESULT =
+ 'Services/Patients.svc/REST/GetPatientLabResults';
+const GET_Patient_LAB_ORDERS_RESULT =
+ 'Services/Patients.svc/REST/GetPatientLabOrdersResults';
///
const GET_PATIENT_ORDERS = 'Services/Patients.svc/REST/GetPatientRadOrders';
-const GET_PATIENT_LAB_ORDERS_BY_APPOINTMENT = 'Services/Patients.svc/REST/GetPatientLabResultsByAppointmentNo';
+const GET_PATIENT_LAB_ORDERS_BY_APPOINTMENT =
+ 'Services/Patients.svc/REST/GetPatientLabResultsByAppointmentNo';
-const GET_PATIENT_ORDERS_DETAILS = 'Services/Patients.svc/REST/Rad_UpdatePatientRadOrdersToRead';
+const GET_PATIENT_ORDERS_DETAILS =
+ 'Services/Patients.svc/REST/Rad_UpdatePatientRadOrdersToRead';
const GET_RAD_IMAGE_URL = 'Services/Patients.svc/Rest/GetRadImageURL';
-const SEND_RAD_REPORT_EMAIL = 'Services/Notifications.svc/REST/SendRadReportEmail';
+const SEND_RAD_REPORT_EMAIL =
+ 'Services/Notifications.svc/REST/SendRadReportEmail';
///Feedback
const SEND_FEEDBACK = 'Services/COCWS.svc/REST/InsertCOCItemInSPList';
@@ -78,17 +94,29 @@ const GET_PATIENT_AppointmentHistory = 'Services'
'/Doctors.svc/REST/PateintHasAppoimentHistory';
///VITAL SIGN
-const GET_PATIENT_VITAL_SIGN = 'Services/Doctors.svc/REST/Doctor_GetPatientVitalSign';
+const GET_PATIENT_VITAL_SIGN =
+ 'Services/Doctors.svc/REST/Doctor_GetPatientVitalSign';
///Er Nearest
-const GET_NEAREST_HOSPITAL = 'Services/Patients.svc/REST/Patient_GetProjectAvgERWaitingTime';
+const GET_NEAREST_HOSPITAL =
+ 'Services/Patients.svc/REST/Patient_GetProjectAvgERWaitingTime';
+
+///ED Online
+const ER_GET_VISUAL_TRIAGE_QUESTIONS = "services/Doctors.svc/REST/ER_GetVisualTriageQuestions";
+const ER_SAVE_TRIAGE_INFORMATION = "services/Doctors.svc/REST/ER_SaveTriageInformation";
+const ER_GetPatientPaymentInformationForERClinic = "services/Doctors.svc/REST/ER_GetPatientPaymentInformationForERClinic";
///Er Nearest
-const GET_AMBULANCE_REQUEST = 'Services/Patients.svc/REST/PatientER_RRT_GetAllTransportationMethod';
-const GET_PATIENT_ALL_PRES_ORDERS = 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders';
-const GET_PICK_UP_REQUEST_BY_PRES_ORDER_ID = 'Services/Patients.svc/REST/PatientER_RRT_GetPickUpRequestByPresOrderID';
-const UPDATE_PRESS_ORDER = 'Services/Patients.svc/REST/PatientER_UpdatePresOrder';
-const INSERT_ER_INERT_PRES_ORDER = 'Services/Patients.svc/REST/PatientER_InsertPresOrder';
+const GET_AMBULANCE_REQUEST =
+ 'Services/Patients.svc/REST/PatientER_RRT_GetAllTransportationMethod';
+const GET_PATIENT_ALL_PRES_ORDERS =
+ 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders';
+const GET_PICK_UP_REQUEST_BY_PRES_ORDER_ID =
+ 'Services/Patients.svc/REST/PatientER_RRT_GetPickUpRequestByPresOrderID';
+const UPDATE_PRESS_ORDER =
+ 'Services/Patients.svc/REST/PatientER_UpdatePresOrder';
+const INSERT_ER_INERT_PRES_ORDER =
+ 'Services/Patients.svc/REST/PatientER_InsertPresOrder';
///FindUs
const GET_FINDUS_REQUEST = 'Services/Lists.svc/REST/Get_HMG_Locations';
@@ -97,13 +125,15 @@ const GET_FINDUS_REQUEST = 'Services/Lists.svc/REST/Get_HMG_Locations';
const GET_LIVECHAT_REQUEST = 'Services/Patients.svc/REST/GetPatientICProjects';
///babyInformation
-const GET_BABYINFORMATION_REQUEST = 'Services/Community.svc/REST/GetBabyByUserID';
+const GET_BABYINFORMATION_REQUEST =
+ 'Services/Community.svc/REST/GetBabyByUserID';
///Get Baby By User ID
const GET_BABY_BY_USER_ID = 'Services/Community.svc/REST/GetBabyByUserID';
///userInformation
-const GET_USERINFORMATION_REQUEST = 'Services/Community.svc/REST/GetUserInformation_New';
+const GET_USERINFORMATION_REQUEST =
+ 'Services/Community.svc/REST/GetUserInformation_New';
///Update email
const UPDATE_PATENT_EMAIL = 'Services/Patients.svc/REST/UpdatePateintEmail';
@@ -125,16 +155,29 @@ const GET_TABLE_REQUEST = 'Services/Community.svc/REST/CreateVaccinationTable';
const GET_CITIES_REQUEST = 'Services/Lists.svc/REST/GetAllCities';
///BloodDetails
-const GET_BLOOD_REQUEST = 'services/PatientVarification.svc/REST/BloodDonation_GetBloodGroupDetails';
+const GET_BLOOD_REQUEST =
+ 'services/PatientVarification.svc/REST/BloodDonation_GetBloodGroupDetails';
+
+const SAVE_BLOOD_REQUEST =
+ 'Services/PatientVarification.svc/REST/BloodDonation_RegisterBloodType';
+
+const GET_BLOOD_AGREEMENT =
+ 'Services/PatientVarification.svc/REST/CheckUserAgreementForBloodDonation';
+const SAVE_BLOOD_AGREEMENT =
+ 'Services/PatientVarification.svc/REST/AddUserAgreementForBloodDonation';
///Reports
const REPORTS = 'Services/Doctors.svc/REST/GetPatientMedicalReportStatusInfo';
-const INSERT_REQUEST_FOR_MEDICAL_REPORT = 'Services/Doctors.svc/REST/InsertRequestForMedicalReport';
-const SEND_MEDICAL_REPORT_EMAIL = 'Services/Notifications.svc/REST/SendMedicalReportEmail';
+const INSERT_REQUEST_FOR_MEDICAL_REPORT =
+ 'Services/Doctors.svc/REST/InsertRequestForMedicalReport';
+const SEND_MEDICAL_REPORT_EMAIL =
+ 'Services/Notifications.svc/REST/SendMedicalReportEmail';
///Rate
-const IS_LAST_APPOITMENT_RATED = 'Services/Doctors.svc/REST/IsLastAppoitmentRated';
-const GET_APPOINTMENT_DETAILS_BY_NO = 'Services/MobileNotifications.svc/REST/GetAppointmentDetailsByApptNo';
+const IS_LAST_APPOITMENT_RATED =
+ 'Services/Doctors.svc/REST/IsLastAppoitmentRated';
+const GET_APPOINTMENT_DETAILS_BY_NO =
+ 'Services/MobileNotifications.svc/REST/GetAppointmentDetailsByApptNo';
const GET_QR_PARKING = 'Services/SWP.svc/REST/GetQRParkingByID';
@@ -146,7 +189,8 @@ const GET_QR_PARKING = 'Services/SWP.svc/REST/GetQRParkingByID';
const GET_CLINICS_LIST_URL = "Services/lists.svc/REST/GetClinicCentralized";
//URL to get active appointment list
-const GET_ACTIVE_APPOINTMENTS_LIST_URL = "Services/Doctors.svc/Rest/Dr_GetAppointmentActiveNumber";
+const GET_ACTIVE_APPOINTMENTS_LIST_URL =
+ "Services/Doctors.svc/Rest/Dr_GetAppointmentActiveNumber";
//URL to get projects list
const GET_PROJECTS_LIST = 'Services/Lists.svc/REST/GetProject';
@@ -155,86 +199,115 @@ const GET_PROJECTS_LIST = 'Services/Lists.svc/REST/GetProject';
const GET_DOCTORS_LIST_URL = "Services/Doctors.svc/REST/SearchDoctorsByTime";
//URL to dental doctors list
-const GET_DENTAL_DOCTORS_LIST_URL = "Services/Doctors.svc/REST/Dental_DoctorChiefComplaintMapping";
+const GET_DENTAL_DOCTORS_LIST_URL =
+ "Services/Doctors.svc/REST/Dental_DoctorChiefComplaintMapping";
//URL to get doctor free slots
const GET_DOCTOR_FREE_SLOTS = "Services/Doctors.svc/REST/GetDoctorFreeSlots";
//URL to insert appointment
-const INSERT_SPECIFIC_APPOINTMENT = "Services/Doctors.svc/REST/InsertSpecificAppointment";
+const INSERT_SPECIFIC_APPOINTMENT =
+ "Services/Doctors.svc/REST/InsertSpecificAppointment";
//URL to get patient share
-const GET_PATIENT_SHARE = "Services/Doctors.svc/REST/GetCheckinScreenAppointmentDetailsByAppointmentNO";
+const GET_PATIENT_SHARE =
+ "Services/Doctors.svc/REST/GetCheckinScreenAppointmentDetailsByAppointmentNO";
//URL to get patient appointment history
-const GET_PATIENT_APPOINTMENT_HISTORY = "Services/Doctors.svc/REST/PateintHasAppoimentHistory";
+const GET_PATIENT_APPOINTMENT_HISTORY =
+ "Services/Doctors.svc/REST/PateintHasAppoimentHistory";
//URL to get patient appointment curfew history
-const GET_PATIENT_APPOINTMENT_CURFEW_HISTORY = "Services/Doctors.svc/REST/AppoimentHistoryForCurfew";
+const GET_PATIENT_APPOINTMENT_CURFEW_HISTORY =
+ "Services/Doctors.svc/REST/AppoimentHistoryForCurfew";
//URL to confirm appointment
-const CONFIRM_APPOINTMENT = "Services/MobileNotifications.svc/REST/ConfirmAppointment";
+const CONFIRM_APPOINTMENT =
+ "Services/MobileNotifications.svc/REST/ConfirmAppointment";
-const INSERT_VIDA_REQUEST = "Services/ER_VirtualCall.svc/REST/PatientER_VidaRequestInseart";
+const INSERT_VIDA_REQUEST =
+ "Services/ER_VirtualCall.svc/REST/PatientER_VidaRequestInseart";
//URL to cancel appointment
const CANCEL_APPOINTMENT = "Services/Doctors.svc/REST/CancelAppointment";
//URL get appointment QR
-const GENERATE_QR_APPOINTMENT = "Services/Doctors.svc/REST/GenerateQRAppointmentNo";
+const GENERATE_QR_APPOINTMENT =
+ "Services/Doctors.svc/REST/GenerateQRAppointmentNo";
//URL send email appointment QR
-const EMAIL_QR_APPOINTMENT = "Services/Notifications.svc/REST/sendEmailForOnLineCheckin";
+const EMAIL_QR_APPOINTMENT =
+ "Services/Notifications.svc/REST/sendEmailForOnLineCheckin";
//URL check payment status
-const CHECK_PAYMENT_STATUS = "Services/PayFort_Serv.svc/REST/GetRequestStatusByRequestID";
+const CHECK_PAYMENT_STATUS =
+ "Services/PayFort_Serv.svc/REST/GetRequestStatusByRequestID";
//URL create advance payment
const CREATE_ADVANCE_PAYMENT = "Services/Doctors.svc/REST/CreateAdvancePayment";
-const HIS_CREATE_ADVANCE_PAYMENT = "Services/Patients.svc/REST/HIS_CreateAdvancePayment";
+const HIS_CREATE_ADVANCE_PAYMENT =
+ "Services/Patients.svc/REST/HIS_CreateAdvancePayment";
-const ADD_ADVANCE_NUMBER_REQUEST = 'Services/PayFort_Serv.svc/REST/AddAdvancedNumberRequest';
+const ADD_ADVANCE_NUMBER_REQUEST =
+ 'Services/PayFort_Serv.svc/REST/AddAdvancedNumberRequest';
-const ADD_VIDA_REQUEST = 'Services/ER_VirtualCall.svc/REST/PatientER_VidaRequestInseart';
+const IS_ALLOW_ASK_DOCTOR =
+ 'Services/Doctors.svc/REST/GetPatientDoctorAppointmentResult';
+const GET_CALL_REQUEST_TYPE =
+ 'Services/Doctors.svc/REST/GetCallRequestType_LOV';
+const ADD_VIDA_REQUEST =
+ 'Services/ER_VirtualCall.svc/REST/PatientER_VidaRequestInseart';
-const IS_ALLOW_ASK_DOCTOR = 'Services/Doctors.svc/REST/GetPatientDoctorAppointmentResult';
-const GET_CALL_REQUEST_TYPE = 'Services/Doctors.svc/REST/GetCallRequestType_LOV';
const SEND_CALL_REQUEST = 'Services/Doctors.svc/REST/InsertCallInfo';
-const GET_LIVECARE_CLINICS = 'Services/ER_VirtualCall.svc/REST/PatientER_GetClinics';
+const GET_LIVECARE_CLINICS =
+ 'Services/ER_VirtualCall.svc/REST/PatientER_GetClinics';
-const GET_LIVECARE_SCHEDULE_CLINICS = 'Services/Doctors.svc/REST/PatientER_GetClinicsHaveSchedule';
+const GET_LIVECARE_SCHEDULE_CLINICS =
+ 'Services/Doctors.svc/REST/PatientER_GetClinicsHaveSchedule';
-const GET_LIVECARE_SCHEDULE_CLINIC_DOCTOR_LIST = 'Services/Doctors.svc/REST/PatientER_GetDoctorByClinicID';
+const GET_LIVECARE_SCHEDULE_CLINIC_DOCTOR_LIST =
+ 'Services/Doctors.svc/REST/PatientER_GetDoctorByClinicID';
-const GET_LIVECARE_SCHEDULE_DOCTOR_TIME_SLOTS = 'Services/Doctors.svc/REST/PatientER_GetDoctorFreeSlots';
+const GET_LIVECARE_SCHEDULE_DOCTOR_TIME_SLOTS =
+ 'Services/Doctors.svc/REST/PatientER_GetDoctorFreeSlots';
-const INSERT_LIVECARE_SCHEDULE_APPOINTMENT = 'Services/Doctors.svc/REST/InsertSpecificAppoitmentForSchedule';
+const INSERT_LIVECARE_SCHEDULE_APPOINTMENT =
+ 'Services/Doctors.svc/REST/InsertSpecificAppoitmentForSchedule';
-const GET_PATIENT_SHARE_LIVECARE = "Services/Doctors.svc/REST/GetCheckinScreenAppointmentDetailsByAppointmentNOForLiveCare";
+const GET_PATIENT_SHARE_LIVECARE =
+ "Services/Doctors.svc/REST/GetCheckinScreenAppointmentDetailsByAppointmentNOForLiveCare";
-const GET_LIVECARE_CLINIC_TIMING = 'Services/ER_VirtualCall.svc/REST/PatientER_GetClinicsServiceTimingsSchedule';
+const GET_LIVECARE_CLINIC_TIMING =
+ 'Services/ER_VirtualCall.svc/REST/PatientER_GetClinicsServiceTimingsSchedule';
-const GET_ER_APPOINTMENT_FEES = 'Services/DoctorApplication.svc/REST/GetERAppointmentFees';
+const GET_ER_APPOINTMENT_FEES =
+ 'Services/DoctorApplication.svc/REST/GetERAppointmentFees';
const GET_ER_APPOINTMENT_TIME = 'Services/ER_VirtualCall.svc/REST/GetRestTime';
-const ADD_NEW_CALL_FOR_PATIENT_ER = 'Services/DoctorApplication.svc/REST/NewCallForPatientER';
+const ADD_NEW_CALL_FOR_PATIENT_ER =
+ 'Services/DoctorApplication.svc/REST/NewCallForPatientER';
-const GET_LIVECARE_HISTORY = 'Services/ER_VirtualCall.svc/REST/GetPatientErVirtualHistory';
-const CANCEL_LIVECARE_REQUEST = 'Services/ER_VirtualCall.svc/REST/DeleteErRequest';
-const SEND_LIVECARE_INVOICE_EMAIL = 'Services/Notifications.svc/REST/SendInvoiceForLiveCare';
+const GET_LIVECARE_HISTORY =
+ 'Services/ER_VirtualCall.svc/REST/GetPatientErVirtualHistory';
+const CANCEL_LIVECARE_REQUEST =
+ 'Services/ER_VirtualCall.svc/REST/DeleteErRequest';
+const SEND_LIVECARE_INVOICE_EMAIL =
+ 'Services/Notifications.svc/REST/SendInvoiceForLiveCare';
const GET_USER_TERMS = 'Services/Patients.svc/REST/GetUserTermsAndConditions';
-const UPDATE_HEALTH_TERMS = 'services/Patients.svc/REST/UpdatePateintHealthSummaryReport';
+const UPDATE_HEALTH_TERMS =
+ 'services/Patients.svc/REST/UpdatePateintHealthSummaryReport';
-const GET_PATIENT_HEALTH_STATS = 'Services/Patients.svc/REST/Med_GetTransactionsSts';
+const GET_PATIENT_HEALTH_STATS =
+ 'Services/Patients.svc/REST/Med_GetTransactionsSts';
//URL to get medicine and pharmacies list
const CHANNEL = 3;
const GENERAL_ID = 'Cs2020@2016\$2958';
const IP_ADDRESS = '10.20.10.20';
-const VERSION_ID = 6.1;
+const VERSION_ID = 8.8;
const SETUP_ID = '91877';
const LANGUAGE = 2;
const PATIENT_OUT_SA = 0;
@@ -243,20 +316,27 @@ const IS_DENTAL_ALLOWED_BACKEND = false;
const PATIENT_TYPE = 1;
const PATIENT_TYPE_ID = 1;
var DEVICE_TOKEN = "";
+var IS_VOICE_COMMAND_CLOSED = false;
+var IS_TEXT_COMPLETED = false;
var DeviceTypeID = Platform.isIOS ? 1 : 2;
const LANGUAGE_ID = 1;
const GET_PHARMCY_ITEMS = "Services/Lists.svc/REST/GetPharmcyItems_Region";
const GET_PHARMACY_LIST = "Services/Patients.svc/REST/GetPharmcyList";
-const GET_PAtIENTS_INSURANCE = "Services/Patients.svc/REST/Get_PatientInsuranceDetails";
-const GET_PAtIENTS_INSURANCE_UPDATED = "Services/Patients.svc/REST/PatientER_GetPatientInsuranceCardUpdateHistory";
+const GET_PAtIENTS_INSURANCE =
+ "Services/Patients.svc/REST/Get_PatientInsuranceDetails";
+const GET_PAtIENTS_INSURANCE_UPDATED =
+ "Services/Patients.svc/REST/PatientER_GetPatientInsuranceCardUpdateHistory";
const INSURANCE_DETAILS = "Services/Patients.svc/REST/Get_InsuranceCheckList";
-const GET_PATIENT_INSURANCE_DETAILS = "Services/Patients.svc/REST/PatientER_GetPatientInsuranceDetails";
-const UPLOAD_INSURANCE_CARD = 'Services/Patients.svc/REST/PatientER_PatientInfoForInsuranceCardUpdate';
+const GET_PATIENT_INSURANCE_DETAILS =
+ "Services/Patients.svc/REST/PatientER_GetPatientInsuranceDetails";
+const UPLOAD_INSURANCE_CARD =
+ 'Services/Patients.svc/REST/PatientER_PatientInfoForInsuranceCardUpdate';
const GET_VACCINES = "Services/Patients.svc/REST/GetDoneVaccinesByPatientID";
const GET_VACCINES_EMAIL = "Services/Notifications.svc/REST/SendVaccinesEmail";
-const GET_PAtIENTS_INSURANCE_APPROVALS = "Services/Patients.svc/REST/GetApprovalStatus";
+const GET_PAtIENTS_INSURANCE_APPROVALS =
+ "Services/Patients.svc/REST/GetApprovalStatus";
const SEARCH_BOT = 'HabibiChatBotApi/BotInterface/GetVoiceCommandResponse';
const GET_VACCINATIONS_ITEMS = "/Services/ERP.svc/REST/GET_VACCINATIONS_ITEMS";
@@ -266,48 +346,81 @@ const GET_PATIENT_SICK_LEAVE = 'Services/Patients.svc/REST/GetPatientSickLeave';
const SendSickLeaveEmail = 'Services/Notifications.svc/REST/SendSickLeaveEmail';
-const GET_PATIENT_AdVANCE_BALANCE_AMOUNT = 'Services/Patients.svc/REST/GetPatientAdvanceBalanceAmount';
-const GET_PATIENT_INFO_BY_ID = 'Services/Doctors.svc/REST/GetPatientInfoByPatientID';
-const GET_PATIENT_INFO_BY_ID_AND_MOBILE_NUMBER = 'Services/Patients.svc/REST/AP_GetPatientInfoByPatientIDandMobileNumber';
-const SEND_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = 'Services/Authentication.svc/REST/SendActivationCodeForAdvancePayment';
-const CHECK_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = 'Services/Authentication.svc/REST/CheckActivationCodeForAdvancePayment';
+const GET_PATIENT_AdVANCE_BALANCE_AMOUNT =
+ 'Services/Patients.svc/REST/GetPatientAdvanceBalanceAmount';
+const GET_PATIENT_INFO_BY_ID =
+ 'Services/Doctors.svc/REST/GetPatientInfoByPatientID';
+const GET_PATIENT_INFO_BY_ID_AND_MOBILE_NUMBER =
+ 'Services/Patients.svc/REST/AP_GetPatientInfoByPatientIDandMobileNumber';
+const SEND_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT =
+ 'Services/Authentication.svc/REST/SendActivationCodeForAdvancePayment';
+const CHECK_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT =
+ 'Services/Authentication.svc/REST/CheckActivationCodeForAdvancePayment';
-const GET_COVID_DRIVETHRU_PROJECT_LIST = 'Services/Doctors.svc/REST/COVID19_ProjectDriveThroughTestingCenter';
+const GET_COVID_DRIVETHRU_PROJECT_LIST =
+ 'Services/Doctors.svc/REST/COVID19_ProjectDriveThroughTestingCenter';
-const GET_COVID_DRIVETHRU_PAYMENT_INFO = 'Services/Doctors.svc/REST/COVID19_GetPatientPaymentInormation';
+const GET_COVID_DRIVETHRU_PAYMENT_INFO =
+ 'Services/Doctors.svc/REST/COVID19_GetPatientPaymentInormation';
-const GET_COVID_DRIVETHRU_FREE_SLOTS = 'Services/Doctors.svc/REST/COVID19_GetFreeSlots';
+const GET_COVID_DRIVETHRU_FREE_SLOTS =
+ 'Services/Doctors.svc/REST/COVID19_GetFreeSlots';
///Smartwatch Integration Services
-const GET_PATIENT_LAST_RECORD = 'Services/Patients.svc/REST/Med_GetPatientLastRecord';
+const GET_PATIENT_LAST_RECORD =
+ 'Services/Patients.svc/REST/Med_GetPatientLastRecord';
///My Trackers
-const GET_DIABETIC_RESULT_AVERAGE = 'Services/Patients.svc/REST/Patient_GetDiabeticResultAverage';
-const GET_DIABTEC_RESULT = 'Services/Patients.svc/REST/Patient_GetDiabtecResults';
-const ADD_DIABTEC_RESULT = 'Services/Patients.svc/REST/Patient_AddDiabtecResult';
-const SEND_AVERAGE_BLOOD_SUGAR_REPORT = 'Services/Notifications.svc/REST/SendAverageBloodSugarReport';
-const DEACTIVATE_DIABETIC_STATUS = 'services/Patients.svc/REST/Patient_DeactivateDiabeticStatus';
-const DEACTIVATE_BLOOD_PRESSURES_STATUS = 'services/Patients.svc/REST/Patient_DeactivateBloodPressureStatus';
-
-const GET_BLOOD_PRESSURE_RESULT_AVERAGE = 'Services/Patients.svc/REST/Patient_GetBloodPressureResultAverage';
-const GET_BLOOD_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_GetBloodPressureResult';
-const ADD_BLOOD_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_AddBloodPressureResult';
-const UPDATE_BLOOD_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_UpdateBloodPressureResult';
-const SEND_AVERAGE_BLOOD_WEIGHT_REPORT = 'Services/Notifications.svc/REST/SendAverageBodyWeightReport';
-const SEND_AVERAGE_BLOOD_PRESSURE_REPORT = 'Services/Notifications.svc/REST/SendAverageBloodPressureReport';
-const UPDATE_DIABETIC_RESULT = 'Services/Patients.svc/REST/Patient_UpdateDiabeticResult';
-
-const GET_WEIGHT_PRESSURE_RESULT_AVERAGE = 'Services/Patients.svc/REST/Patient_GetWeightMeasurementResultAverage';
-const GET_WEIGHT_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_GetWeightMeasurementResult';
-const ADD_WEIGHT_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_AddWeightMeasurementResult';
-
-const UPDATE_WEIGHT_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_UpdateWeightMeasurementResult';
-const DEACTIVATE_WEIGHT_PRESSURE_RESULT = 'services/Patients.svc/REST/Patient_DeactivateWeightMeasurementStatus';
-
-const ADD_ACTIVE_PRESCRIPTIONS_REPORT_BY_PATIENT_ID = 'Services/Patients.svc/Rest/GetActivePrescriptionReportByPatientID';
-
-const GET_CALL_INFO_HOURS_RESULT = 'Services/Doctors.svc/REST/GetCallInfoHoursResult';
-const GET_CALL_REQUEST_TYPE_LOV = 'Services/Doctors.svc/REST/GetCallRequestType_LOV';
+const GET_DIABETIC_RESULT_AVERAGE =
+ 'Services/Patients.svc/REST/Patient_GetDiabeticResultAverage';
+const GET_DIABTEC_RESULT =
+ 'Services/Patients.svc/REST/Patient_GetDiabtecResults';
+const ADD_DIABTEC_RESULT =
+ 'Services/Patients.svc/REST/Patient_AddDiabtecResult';
+
+const GET_BLOOD_PRESSURE_RESULT_AVERAGE =
+ 'Services/Patients.svc/REST/Patient_GetBloodPressureResultAverage';
+const GET_BLOOD_PRESSURE_RESULT =
+ 'Services/Patients.svc/REST/Patient_GetBloodPressureResult';
+const ADD_BLOOD_PRESSURE_RESULT =
+ 'Services/Patients.svc/REST/Patient_AddBloodPressureResult';
+
+const GET_WEIGHT_PRESSURE_RESULT_AVERAGE =
+ 'Services/Patients.svc/REST/Patient_GetWeightMeasurementResultAverage';
+const GET_WEIGHT_PRESSURE_RESULT =
+ 'Services/Patients.svc/REST/Patient_GetWeightMeasurementResult';
+const ADD_WEIGHT_PRESSURE_RESULT =
+ 'Services/Patients.svc/REST/Patient_AddWeightMeasurementResult';
+
+const ADD_ACTIVE_PRESCRIPTIONS_REPORT_BY_PATIENT_ID =
+ 'Services/Patients.svc/Rest/GetActivePrescriptionReportByPatientID';
+
+const GET_CALL_INFO_HOURS_RESULT =
+ 'Services/Doctors.svc/REST/GetCallInfoHoursResult';
+const GET_CALL_REQUEST_TYPE_LOV =
+ 'Services/Doctors.svc/REST/GetCallRequestType_LOV';
+
+const UPDATE_DIABETIC_RESULT =
+ 'Services/Patients.svc/REST/Patient_UpdateDiabeticResult';
+
+const SEND_AVERAGE_BLOOD_SUGAR_REPORT =
+ 'Services/Notifications.svc/REST/SendAverageBloodSugarReport';
+const DEACTIVATE_DIABETIC_STATUS =
+ 'services/Patients.svc/REST/Patient_DeactivateDiabeticStatus';
+const DEACTIVATE_BLOOD_PRESSURES_STATUS =
+ 'services/Patients.svc/REST/Patient_DeactivateBloodPressureStatus';
+
+const UPDATE_BLOOD_PRESSURE_RESULT =
+ 'Services/Patients.svc/REST/Patient_UpdateBloodPressureResult';
+const SEND_AVERAGE_BLOOD_WEIGHT_REPORT =
+ 'Services/Notifications.svc/REST/SendAverageBodyWeightReport';
+const SEND_AVERAGE_BLOOD_PRESSURE_REPORT =
+ 'Services/Notifications.svc/REST/SendAverageBloodPressureReport';
+
+const UPDATE_WEIGHT_PRESSURE_RESULT =
+ 'Services/Patients.svc/REST/Patient_UpdateWeightMeasurementResult';
+const DEACTIVATE_WEIGHT_PRESSURE_RESULT =
+ 'services/Patients.svc/REST/Patient_DeactivateWeightMeasurementStatus';
const GET_DOCTOR_RESPONSE = 'Services/Patients.svc/REST/GetDoctorResponse';
const UPDATE_READ_STATUS = 'Services/Patients.svc/REST/UpdateReadStatus';
const INSERT_CALL_INFO = 'Services/Doctors.svc/REST/InsertCallInfo';
@@ -315,25 +428,41 @@ const INSERT_CALL_INFO = 'Services/Doctors.svc/REST/InsertCallInfo';
const GET_PATIENT_ALLERGIES = 'Services/Patients.svc/REST/GetPatientAllergies';
// H2O
-const H2O_GET_USER_DETAIL = "Services/H2ORemainder.svc/REST/H2O_GetUserDetails_New";
-const H2O_UPDATE_USER_DETAIL = "Services/H2ORemainder.svc/REST/H2O_UpdateUserDetails_New";
-const H2O_GET_USER_PROGRESS = "Services/H2ORemainder.svc/REST/H2O_GetUserProgress";
-const H2O_INSERT_USER_ACTIVITY = "Services/H2ORemainder.svc/REST/H2O_InsertUserActivity";
-const H2O_UNDO_USER_ACTIVITY = "Services/H2ORemainder.svc/REST/H2o_UndoUserActivity";
+const H2O_GET_USER_PROGRESS =
+ "Services/H2ORemainder.svc/REST/H2O_GetUserProgress";
+const H2O_INSERT_USER_ACTIVITY =
+ "Services/H2ORemainder.svc/REST/H2O_InsertUserActivity";
+const H2O_GET_USER_DETAIL =
+ "Services/H2ORemainder.svc/REST/H2O_GetUserDetails_New";
+const H2O_UPDATE_USER_DETAIL =
+ "Services/H2ORemainder.svc/REST/H2O_UpdateUserDetails_New";
+const H2O_UNDO_USER_ACTIVITY =
+ "Services/H2ORemainder.svc/REST/H2o_UndoUserActivity";
//E_Referral Services
-const GET_ALL_RELATIONSHIP_TYPES = "Services/Patients.svc/REST/GetAllRelationshipTypes";
-const SEND_ACTIVATION_CODE_FOR_E_REFERRAL = 'Services/Authentication.svc/REST/SendActivationCodeForEReferral';
-const CHECK_ACTIVATION_CODE_FOR_E_REFERRAL = 'Services/Authentication.svc/REST/CheckActivationCodeForEReferral';
+const GET_ALL_RELATIONSHIP_TYPES =
+ "Services/Patients.svc/REST/GetAllRelationshipTypes";
+const SEND_ACTIVATION_CODE_FOR_E_REFERRAL =
+ 'Services/Authentication.svc/REST/SendActivationCodeForEReferral';
+const CHECK_ACTIVATION_CODE_FOR_E_REFERRAL =
+ 'Services/Authentication.svc/REST/CheckActivationCodeForEReferral';
const GET_ALL_CITIES = 'services/Lists.svc/rest/GetAllCities';
const CREATE_E_REFERRAL = "Services/Patients.svc/REST/CreateEReferral";
const GET_E_REFERRALS = "Services/Patients.svc/REST/GetEReferrals";
+// Encillary Orders
+
+const GET_ANCILLARY_ORDERS =
+ 'Services/Doctors.svc/REST/GetOnlineAncillaryOrderList';
+
+const GET_ANCILLARY_ORDERS_DETAILS =
+ 'Services/Doctors.svc/REST/GetOnlineAncillaryOrderProcList';
+
//Pharmacy wishlist
// const GET_WISHLIST = "http://swd-pharapp-01:7200/api/shopping_cart_items/";
// pharmacy
-const PHARMACY_AUTORZIE_CUSTOMER = "epharmacy/api/AutorizeCustomer";
+const PHARMACY_AUTORZIE_CUSTOMER = "AutorizeCustomer";
const PHARMACY_VERIFY_CUSTOMER = "VerifyCustomer";
const PHARMACY_GET_COUNTRY = "countries";
const PHARMACY_CREATE_CUSTOMER = "epharmacy/api/CreateCustomer";
@@ -354,32 +483,51 @@ const GET_Cancel_ORDER = "cancelorder/";
const WRITE_REVIEW = "Content-Type" + "text/plain; charset=utf-8";
const GET_SHOPPING_CART = "shopping_cart_items/";
const GET_SHIPPING_OPTIONS = "get_shipping_option/";
-const DELETE_SHOPPING_CART = "epharmacy/api/delete_shopping_cart_items/";
+const DELETE_SHOPPING_CART = "delete_shopping_cart_items/";
const DELETE_SHOPPING_CART_ALL = "delete_shopping_cart_item_by_customer/";
-const ORDER_SHOPPING_CART = "epharmacy/api/orders";
-const GET_LACUM_ACCOUNT_INFORMATION = "Services/Patients.svc/REST/GetLakumAccountInformation";
-const GET_LACUM_GROUP_INFORMATION = "Services/Patients.svc/REST/GetlakumInQueryInfoGrouping";
-const LACUM_ACCOUNT_ACTIVATE = "Services/Patients.svc/REST/LakumAccountActivation";
-const LACUM_ACCOUNT_DEACTIVATE = "Services/Patients.svc/REST/LakumAccountDeactivation";
-const CREATE_LAKUM_ACCOUNT = "Services/Patients.svc/REST/PHR_CreateLakumAccount";
-const TRANSFER_YAHALA_LOYALITY_POINTS = "Services/Patients.svc/REST/TransferYaHalaLoyaltyPoints";
-const LAKUM_GET_USER_TERMS_AND_CONDITIONS = "Services/ERP.svc/REST/GetUserTermsAndConditionsForEPharmcy";
+const ORDER_SHOPPING_CART = "orders";
+const GET_LACUM_ACCOUNT_INFORMATION =
+ "Services/Patients.svc/REST/GetLakumAccountInformation";
+const GET_LACUM_GROUP_INFORMATION =
+ "Services/Patients.svc/REST/GetlakumInQueryInfoGrouping";
+const LACUM_ACCOUNT_ACTIVATE =
+ "Services/Patients.svc/REST/LakumAccountActivation";
+const LACUM_ACCOUNT_DEACTIVATE =
+ "Services/Patients.svc/REST/LakumAccountDeactivation";
+const CREATE_LAKUM_ACCOUNT =
+ "Services/Patients.svc/REST/PHR_CreateLakumAccount";
+const TRANSFER_YAHALA_LOYALITY_POINTS =
+ "Services/Patients.svc/REST/TransferYaHalaLoyaltyPoints";
+const LAKUM_GET_USER_TERMS_AND_CONDITIONS =
+ "Services/ERP.svc/REST/GetUserTermsAndConditionsForEPharmcy";
const PRESCRIPTION = 'Services/Patients.svc/REST/GetPrescriptionApptList';
+const GET_RECOMMENDED_PRODUCT = 'alsoProduct/';
// Home Health Care
-const HHC_GET_ALL_SERVICES = "Services/Patients.svc/REST/PatientER_HHC_GetAllServices";
-const HHC_GET_ALL_CMC_SERVICES = "Services/Patients.svc/REST/PatientER_CMC_GetAllServices";
-const PATIENT_ER_UPDATE_PRES_ORDER = "Services/Patients.svc/REST/PatientER_UpdatePresOrder";
-const GET_ORDER_DETAIL_BY_ID = "Services/Patients.svc/REST/PatientER_HHC_GetTransactionsForOrder";
-const GET_CMC_ORDER_DETAIL_BY_ID = "Services/Patients.svc/REST/PatientER_CMC_GetTransactionsForOrder";
+const HHC_GET_ALL_SERVICES =
+ "Services/Patients.svc/REST/PatientER_HHC_GetAllServices";
+const HHC_GET_ALL_CMC_SERVICES =
+ "Services/Patients.svc/REST/PatientER_CMC_GetAllServices";
+const PATIENT_ER_UPDATE_PRES_ORDER =
+ "Services/Patients.svc/REST/PatientER_UpdatePresOrder";
+const GET_ORDER_DETAIL_BY_ID =
+ "Services/Patients.svc/REST/PatientER_HHC_GetTransactionsForOrder";
+const GET_CMC_ORDER_DETAIL_BY_ID =
+ "Services/Patients.svc/REST/PatientER_CMC_GetTransactionsForOrder";
const GET_CHECK_UP_ITEMS = "Services/Patients.svc/REST/GetCheckUpItems";
-const PUSH_NOTIFICATION_GET_ALL_NOTIFICATIONS = 'Services/MobileNotifications.svc/REST/PushNotification_GetAllNotifications';
-const PUSH_NOTIFICATION_SET_MESSAGES_FROM_POOL_AS_READ = 'Services/MobileNotifications.svc/REST/PushNotification_SetMessagesFromPoolAsRead';
-const GET_PATIENT_ALL_PRES_ORD = 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders';
-const PATIENT_ER_INSERT_PRES_ORDER = 'Services/Patients.svc/REST/PatientER_InsertPresOrder';
+const PUSH_NOTIFICATION_GET_ALL_NOTIFICATIONS =
+ 'Services/MobileNotifications.svc/REST/PushNotification_GetAllNotifications';
+const PUSH_NOTIFICATION_SET_MESSAGES_FROM_POOL_AS_READ =
+ 'Services/MobileNotifications.svc/REST/PushNotification_SetMessagesFromPoolAsRead';
+const GET_PATIENT_ALL_PRES_ORD =
+ 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders';
+const PATIENT_ER_INSERT_PRES_ORDER =
+ 'Services/Patients.svc/REST/PatientER_InsertPresOrder';
const PHARMACY_MAKE_REVIEW = 'epharmacy/api/insertreviews';
-const BLOOD_DONATION_REGISTER_BLOOD_TYPE = 'Services/PatientVarification.svc/REST/BloodDonation_RegisterBloodType';
-const ADD_USER_AGREEMENT_FOR_BLOOD_DONATION = 'Services/PatientVarification.svc/REST/AddUserAgreementForBloodDonation';
+const BLOOD_DONATION_REGISTER_BLOOD_TYPE =
+ 'Services/PatientVarification.svc/REST/BloodDonation_RegisterBloodType';
+const ADD_USER_AGREEMENT_FOR_BLOOD_DONATION =
+ 'Services/PatientVarification.svc/REST/AddUserAgreementForBloodDonation';
//Pharmacy wishlist
const GET_WISHLIST = "shopping_cart_items/";
@@ -390,25 +538,33 @@ const GET_TOP_BRANDS = "topmanufacturer?page=1&limit=8";
const GET_PRODUCT_DETAIL = "products/";
const GET_LOCATION = "Services/Patients.svc/REST/GetPharmcyListBySKU";
const GET_SPECIFICATION = "productspecification/";
-const GET_BRAND_ITEMS = "products?ManufacturerId=";
+const GET_BRAND_ITEMS = "products";
// External API
-const ADD_ADDRESS_INFO = "https://mdlaboratories.com/exacartapi/api/addcustomeraddress";
-const GET_CUSTOMER_ADDRESSES = "https://mdlaboratories.com/exacartapi/api/Customers/";
-const GET_CUSTOMER_INFO = "https://mdlaboratories.com/exacartapi/api/VerifyCustomer";
+const ADD_ADDRESS_INFO =
+ "addcustomeraddress";
+const GET_CUSTOMER_ADDRESSES =
+ "Customers/";
+const GET_CUSTOMER_INFO =
+ "VerifyCustomer";
//Pharmacy
-const GET_PHARMACY_CATEGORISE = 'categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id=0';
+const GET_PHARMACY_CATEGORISE =
+ 'categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id=0';
const GET_OFFERS_CATEGORISE = 'discountcategories';
const GET_OFFERS_PRODUCTS = 'offerproducts/';
-const GET_CATEGORISE_PARENT = 'categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id=';
+const GET_CATEGORISE_PARENT =
+ 'categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id=';
const GET_PARENT_PRODUCTS = 'products?categoryid=';
-const GET_SUB_CATEGORISE = 'categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id=';
+const GET_SUB_CATEGORISE =
+ 'categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id=';
const GET_SUB_PRODUCTS = 'products?categoryid=';
const GET_FINAL_PRODUCTS =
- 'products?fields=id,reviews,discount_ids,name,namen,localized_names,display_order,short_description,full_description,full_descriptionn,sku,order_minimum_quantity,order_maximum_quantity,price,old_price,images,is_rx,rx_message,rx_messagen,discount_name,discount_namen,approved_rating_sum,approved_total_reviews,allow_back_in_stock_subscriptions,stock_quantity,stock_availability,stock_availabilityn,discount_percentage&CategoryId=';const GET_CLINIC_CATEGORY = 'Services/Doctors.svc/REST/DP_GetClinicCategory';
-const GET_DISEASE_BY_CLINIC_ID = 'Services/Doctors.svc/REST/DP_GetDiseasesByClinicID';
+ 'products?fields=id,reviews,discount_ids,name,namen,localized_names,display_order,short_description,full_description,full_descriptionn,sku,order_minimum_quantity,order_maximum_quantity,price,old_price,images,is_rx,rx_message,rx_messagen,discount_name,discount_namen,approved_rating_sum,approved_total_reviews,allow_back_in_stock_subscriptions,stock_quantity,stock_availability,stock_availabilityn,discount_percentage&CategoryId=';
+const GET_CLINIC_CATEGORY = 'Services/Doctors.svc/REST/DP_GetClinicCategory';
+const GET_DISEASE_BY_CLINIC_ID =
+ 'Services/Doctors.svc/REST/DP_GetDiseasesByClinicID';
const SEARCH_DOCTOR_BY_TIME = 'Services/Doctors.svc/REST/SearchDoctorsByTime';
const TIMER_MIN = 10;
@@ -422,6 +578,8 @@ const GET_SEARCH_PRODUCTS =
const SCAN_QR_CODE = 'productbysku/';
+const FILTERED_PRODUCTS = 'products?categoryids=';
+
class AppGlobal {
static var context;
diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart
index fa4d06f7..6e2bc9ad 100644
--- a/lib/config/localized_values.dart
+++ b/lib/config/localized_values.dart
@@ -2,32 +2,45 @@
// Used for Native through Platform Method Channel
// --------- - -- - - - - - - - - ----------------
const Map platformLocalizedValues = {
- "errorConnectingHmgNetwork": {"en": "Sorry you are not connecting to HMG network", "ar": "نعتذر لست متصل في شكبة مستشفى د.سليمان الحبيب"},
+ "errorConnectingHmgNetwork": {
+ "en": "Sorry you are not connecting to HMG network",
+ "ar": "نعتذر لست متصل في شكبة مستشفى د.سليمان الحبيب"
+ },
"successConnectingHmgNetwork": {
"en": "You connected to HMG network successfully, you can access the app",
- "ar": "تم التصال بشبكة د.سليمان الحبيب بنجاح, تستطيع الان استخدام تطبيق الحبيب"
+ "ar":
+ "تم التصال بشبكة د.سليمان الحبيب بنجاح, تستطيع الان استخدام تطبيق الحبيب"
},
"failedConnectingHmgNetwork": {
- "en": "Sorry the connection to HMG network had been failed, make sure you are in range of HMG network",
- "ar": "نعتذر لقد فشل الاتصال بشبكة د.سليمان الحبيب, تاكد من وجودك داخل نطاق الشبكة"
+ "en":
+ "Sorry the connection to HMG network had been failed, make sure you are in range of HMG network",
+ "ar":
+ "نعتذر لقد فشل الاتصال بشبكة د.سليمان الحبيب, تاكد من وجودك داخل نطاق الشبكة"
},
"alreadyConnectedHmgNetwork": {
"en": " You already connected to HMG network to access Alhabib app",
"ar": "انت متصل مسبقاً بالشبكة تستطيع استخدام تطبيق الحبيب"
},
- "somethingWentWrong": {"en": "Sorry something went wrong please try again later", "ar": "نعتذر لخدمتكم يرجى المحاولة لاحقا"},
+ "somethingWentWrong": {
+ "en": "Sorry something went wrong please try again later",
+ "ar": "نعتذر لخدمتكم يرجى المحاولة لاحقا"
+ },
"enablingWifi": {"en": "Enabling wifi...", "ar": "Enabling wifi..."},
"connectedHmgNetworkWithInternet": {
"en": "Successfully connected to the HMG network to access internet",
"ar": "Successfully connected to the HMG network to access internet"
},
"connectedToHmgNetworkWithNoInternet": {
- "en": "Successfully connected to the HMG network but it have no internet access",
- "ar": "Successfully connected to the HMG network but it have no internet access"
+ "en":
+ "Successfully connected to the HMG network but it have no internet access",
+ "ar":
+ "Successfully connected to the HMG network but it have no internet access"
},
"notConnectedToHmgNetworkSecurityIssue": {
- "en": "We are not able to connect you to HMG network due to security reasons",
- "ar": "We are not able to connect you to HMG network due to security reasons"
+ "en":
+ "We are not able to connect you to HMG network due to security reasons",
+ "ar":
+ "We are not able to connect you to HMG network due to security reasons"
}
};
@@ -54,7 +67,10 @@ const Map localizedValues = {
'clinicName': {'en': 'Clinic Name', 'ar': 'اسم العيادة'},
'doctorName': {'en': 'Doctor Name', 'ar': 'إسم الطبيب'},
'nearestAppo': {'en': 'Nearest appointment', 'ar': 'أقرب موعد'},
- 'searchByDocText': {'en': 'Type the name of the doctor to help you find him', 'ar': 'اكتب اسم الطبيب لمساعدتك في العثور عليه'},
+ 'searchByDocText': {
+ 'en': 'Type the name of the doctor to help you find him',
+ 'ar': 'اكتب اسم الطبيب لمساعدتك في العثور عليه'
+ },
'enterDocName': {'en': 'Enter Doctor name', 'ar': 'أدخل إسم الطبيب'},
'search': {'en': 'Search', 'ar': 'بحث'},
'bookNow': {'en': 'BOOK NOW', 'ar': 'احجز الآن'},
@@ -64,11 +80,17 @@ const Map localizedValues = {
'gender': {'en': 'Gender', 'ar': 'الجنس'},
'nationality': {'en': 'Nationality', 'ar': 'الجنسية'},
'docQualifications': {'en': 'Doctor Qualifications', 'ar': 'مؤهلات الطبيب'},
- 'confirmAppoHeading': {'en': 'Kindly confirm your Appointment', 'ar': 'يرجى تأكيد موعدك'},
+ 'confirmAppoHeading': {
+ 'en': 'Kindly confirm your Appointment',
+ 'ar': 'يرجى تأكيد موعدك'
+ },
'patientInfo': {'en': 'Patient Information', 'ar': 'معلومات المريض'},
'bookSuccess': {'en': 'Book Success', 'ar': 'تم حجز الموعد بنجاح'},
'patientShare': {'en': 'Patient Share', 'ar': 'المبلغ المستحق'},
- 'patientShareWithTax': {'en': 'Patient Share with Tax', 'ar': 'المبلغ الإجمالي المستحق'},
+ 'patientShareWithTax': {
+ 'en': 'Patient Share with Tax',
+ 'ar': 'المبلغ الإجمالي المستحق'
+ },
'confirmAppo': {'en': 'Confirm Appointment', 'ar': 'تأكيد الموعد'},
'confirm': {'en': 'Confirm', 'ar': 'تأكيد'},
'confirmLiveCare': {'en': 'Confirm LiveCare', 'ar': 'تأكيد لايف كير'},
@@ -85,25 +107,46 @@ const Map localizedValues = {
'instruction': {'en': 'Instructions', 'ar': 'تعليمات'},
'livecare': {'en': 'LiveCare', 'ar': 'لايف كير'},
'livecareAppo': {'en': 'LiveCare Appointment', 'ar': 'الموعد لايف كير'},
- 'cancelAppoMsg': {'en': 'Are you sure you want to cancel this appointment?', 'ar': 'هل أنت متأكد أنك تريد إلغاء هذا الموعد؟'},
+ 'cancelAppoMsg': {
+ 'en': 'Are you sure you want to cancel this appointment?',
+ 'ar': 'هل أنت متأكد أنك تريد إلغاء هذا الموعد؟'
+ },
- 'upcoming-noAction': {'en': 'No Action Required', 'ar': 'لا يوجد إجراء مطلوب'},
- 'upcoming-confirm': {'en': 'Please confirm the appointment to avoid cancellation', 'ar': 'يرجى تأكيد الموعد لتفادي الإلغاء'},
+ 'upcoming-noAction': {
+ 'en': 'No Action Required',
+ 'ar': 'لا يوجد إجراء مطلوب'
+ },
+ 'upcoming-confirm': {
+ 'en': 'Please confirm the appointment to avoid cancellation',
+ 'ar': 'يرجى تأكيد الموعد لتفادي الإلغاء'
+ },
"book-success-confirm-more-24-1-2": {
- "en": "The online payment process will be available 24 hours before the appointment.",
+ "en":
+ "The online payment process will be available 24 hours before the appointment.",
"ar": "- عملية الدفع الالكتروني ستكون متاحة قبل الموعد ب 24 ساعة."
},
'upcoming-payment-pending': {
- 'en': 'Online Payment will be Activated before 24 Hours of Appointment Time',
+ 'en':
+ 'Online Payment will be Activated before 24 Hours of Appointment Time',
'ar': 'سيتم تفعيل خدمة الدفع الالكتروني قبل 24 ساعة من موعد الحجز'
},
- 'upcoming-payment-now': {'en': 'Pay Online now to avoid long waiting queue', 'ar': 'ادفع الآن لتفادي الانتظار'},
- 'upcoming-QR': {'en': 'Use the QR Code to Check-In in hospital', 'ar': 'استخدم الرمز لتسجيل الحضور في المستشفى'},
+ 'upcoming-payment-now': {
+ 'en': 'Pay Online now to avoid long waiting queue',
+ 'ar': 'ادفع الآن لتفادي الانتظار'
+ },
+ 'upcoming-QR': {
+ 'en': 'Use the QR Code to Check-In in hospital',
+ 'ar': 'استخدم الرمز لتسجيل الحضور في المستشفى'
+ },
'upcoming-virtual': {
- 'en': 'This is a virtual appointment, Please adhere to the instructions for a seamless experience.',
+ 'en':
+ 'This is a virtual appointment, Please adhere to the instructions for a seamless experience.',
'ar': 'هذا موعد اتصال مرئي عن بعد ، يرجى اتباع تعليمات الخدمة.'
},
- 'upcoming-livecare': {'en': 'This is a LiveCare appointment', 'ar': 'هذا موعد لايف كير'},
+ 'upcoming-livecare': {
+ 'en': 'This is a LiveCare appointment',
+ 'ar': 'هذا موعد لايف كير'
+ },
'upcoming-details': {'en': 'More Details', 'ar': 'المزيد'},
'reschedule': {'en': 'Reschedule', 'ar': 'إعادة جدولة'},
'raise': {'en': 'Raise', 'ar': 'رفع'},
@@ -120,21 +163,42 @@ const Map localizedValues = {
'loginregister': {'en': 'Login / Register', 'ar': 'تسجيل الدخول'},
'poweredBy': {'en': 'Powered By', 'ar': 'مشغل بواسطة'},
"welcome": {"en": "Welcome", "ar": "مرحبا"},
- "welcome_text": {"en": "Dr. Sulaiman Al Habib Mobile Application", "ar": "الدكتور سليمان الحبيب لتطبيقات الهاتف المتحرك"},
- 'welcome_text2': {'en': 'Have you visited AlHabib Medical Group before? ', 'ar': 'هل قمت بزيارة مجموعة الحبيب الطبية من قبل؟'},
+ "welcome_text": {
+ "en": "Dr. Sulaiman Al Habib Mobile Application",
+ "ar": "الدكتور سليمان الحبيب لتطبيقات الهاتف المتحرك"
+ },
+ 'welcome_text2': {
+ 'en': 'Have you visited AlHabib Medical Group before? ',
+ 'ar': 'هل قمت بزيارة مجموعة الحبيب الطبية من قبل؟'
+ },
'yes': {'en': 'Yes', 'ar': 'نعم'},
'no': {'en': 'No', 'ar': 'لا'},
- "logintyperadio": {"en": "Choose from below options to login to your medical file.", "ar": "اختر من الخيارات أدناه لتسجيل الدخول إلى ملفك الطبي."},
+ "logintyperadio": {
+ "en": "Choose from below options to login to your medical file.",
+ "ar": "اختر من الخيارات أدناه لتسجيل الدخول إلى ملفك الطبي."
+ },
"registernow": {"en": "Register Now", "ar": "تسجيل الان"},
- "nationalID": {"en": "Enter the Identification Number", "ar": "أدخل رقم الهوية الوطنية او الاقامة"},
+ "nationalID": {
+ "en": "Enter the Identification Number",
+ "ar": "أدخل رقم الهوية الوطنية او الاقامة"
+ },
"national-id": {"en": "National ID", "ar": "رقم الهوية"},
"fileNo": {"en": "File Number", "ar": "رقم الملف"},
"fileno": {"en": "File No", "ar": "رقم الملف"},
"forgotFileNo": {"en": "Forgot file Number?", "ar": "نسيت رقم الملف الطبي؟"},
- "forgotFileNoTitle": {"en": "Forgot medical file Number", "ar": "نسيت رقم الملف"},
+ "forgotFileNoTitle": {
+ "en": "Forgot medical file Number",
+ "ar": "نسيت رقم الملف"
+ },
- "enter-national-id": {"en": "Please enter mobile number and identification number", "ar": "الرجاء إدخال رقم الجوال ورقم الهوية"},
- "profile-info": {"en": "Please enter profile information", "ar": "الرجاء إدخال معلومات الملف الشخصي"},
+ "enter-national-id": {
+ "en": "Please enter mobile number and identification number",
+ "ar": "الرجاء إدخال رقم الجوال ورقم الهوية"
+ },
+ "profile-info": {
+ "en": "Please enter profile information",
+ "ar": "الرجاء إدخال معلومات الملف الشخصي"
+ },
"submit": {"en": "Submit", "ar": "ارسال"},
"forgot-desc": {
"en": "Enter the mobile number to receive the Medical file Number via SMS",
@@ -143,7 +207,10 @@ const Map localizedValues = {
"dob": {"en": "Birth Date:", "ar": "تاريخ الميلاد"},
"hijri-date": {"en": "Hijri Date", "ar": "التاريخ الهجري"},
"gregorian-date": {"en": "Gregorian Date", "ar": "التاريخ الميلادي"},
- "verify-login-with": {"en": "Please choose one of the following options to verify", "ar": "الرجاء اختيار احدى الخيارات التالية للتحقق من البيانات"},
+ "verify-login-with": {
+ "en": "Please choose one of the following options to verify",
+ "ar": "الرجاء اختيار احدى الخيارات التالية للتحقق من البيانات"
+ },
"register-user": {"en": "Register", "ar": "تسجيل"},
"verify-with-fingerprint": {"en": "Fingerprint", "ar": "بصمة"},
"verify-with-faceid": {"en": "Face ID", "ar": "معرف الوجه"},
@@ -152,19 +219,33 @@ const Map localizedValues = {
"last-login": {"en": "LAST LOGIN AT:", "ar": "آخر تسجيل دخول"},
"last-login-with": {"en": "VERIFICATION TYPE:", "ar": "نوع التحقق:"},
"verify-fingerprint": {
- "en": "To activate the fingerprint login service, please verify data by using one of the following options.",
- "ar": "لتفعيل خدمة الدخول بالبصمة، يرجى اختيار احدى القنوات التالية للتحقق من البيانات"
+ "en":
+ "To activate the fingerprint login service, please verify data by using one of the following options.",
+ "ar":
+ "لتفعيل خدمة الدخول بالبصمة، يرجى اختيار احدى القنوات التالية للتحقق من البيانات"
},
'searchMedicine': {'en': 'Search Medicine', 'ar': 'البحث عن الدواء'},
'pharmaciesList': {'en': 'Pharmacies List', 'ar': 'قائمة الصيدلايات'},
- 'searchMedicineHere': {'en': 'Search Medicine Here', 'ar': 'ابحث عن الدواء هنا'},
+ 'searchMedicineHere': {
+ 'en': 'Search Medicine Here',
+ 'ar': 'ابحث عن الدواء هنا'
+ },
'description': {'en': 'Description', 'ar': 'الوصف'},
'howToUse': {'en': 'How to Use', 'ar': 'طريقة الأستخدام'},
'price': {'en': 'Price', 'ar': 'السعر'},
'youCanFindItIn': {'en': 'You can find it in', 'ar': 'يمكنكة ان تجده في'},
- 'pleaseEnterMedicineName': {'en': 'Please Enter Medicine Name', 'ar': 'الرجائ ادخال اسم الدواء'},
- "verification_message": {"en": "Please enter the Verification Code sent to", "ar": "الرجاء ادخال رمز التحقق الذي تم إرساله إلى"},
- "validation_message": {"en": "The verification code expires in", "ar": "تنتهي صلاحية رمز التحقق خلال"},
+ 'pleaseEnterMedicineName': {
+ 'en': 'Please Enter Medicine Name',
+ 'ar': 'الرجائ ادخال اسم الدواء'
+ },
+ "verification_message": {
+ "en": "Please enter the Verification Code sent to",
+ "ar": "الرجاء ادخال رمز التحقق الذي تم إرساله إلى"
+ },
+ "validation_message": {
+ "en": "The verification code expires in",
+ "ar": "تنتهي صلاحية رمز التحقق خلال"
+ },
"arabic-change": {"en": "عربي", "ar": "English"},
"notification": {"en": "Notifications", "ar": "إشعارات"},
"app-settings": {"en": "App Settings", "ar": "إعدادات التطبيق"},
@@ -172,32 +253,63 @@ const Map localizedValues = {
"before": {"en": "Before", "ar": "قبل"},
"minute": {"en": "Minutes", "ar": "دقيقة"},
"hour": {"en": "Hour", "ar": "ساعة"},
- "reminderSuccess": {"en": "The reminder has been added successfully", "ar": "يضاف التذكير بنجاح"},
- "patientShareToDo": {"en": "Amount before tax: ", "ar": "المبلغ قبل الضريبة:"},
+ "reminderSuccess": {
+ "en": "The reminder has been added successfully",
+ "ar": "يضاف التذكير بنجاح"
+ },
+ "patientShareToDo": {
+ "en": "Amount before tax: ",
+ "ar": "المبلغ قبل الضريبة:"
+ },
"patientTaxToDo": {"en": "Tax amount: ", "ar": "قيمة الضريبة:"},
- "patientShareTotalToDo": {"en": "Total amount Due: ", "ar": "المبلغ الإجمالي المستحق:"},
+ "patientShareTotalToDo": {
+ "en": "Total amount Due: ",
+ "ar": "المبلغ الإجمالي المستحق:"
+ },
'paymentMethod': {'en': 'Payment Method', 'ar': 'طريقة الدفع او السداد'},
- 'noNeedToWaitInLine': {'en': 'No need to stand in line.', 'ar': 'لا داعي للوقوف في الطابور.'},
- 'useQRAppoAttend': {'en': 'Use the QR code to register the appointment attendance.', 'ar': 'استخدم الكود لتسجيل الحضور في المستشفى.'},
+ 'noNeedToWaitInLine': {
+ 'en': 'No need to stand in line.',
+ 'ar': 'لا داعي للوقوف في الطابور.'
+ },
+ 'useQRAppoAttend': {
+ 'en': 'Use the QR code to register the appointment attendance.',
+ 'ar': 'استخدم الكود لتسجيل الحضور في المستشفى.'
+ },
'passQRAppoAttend': {
- 'en': 'Pass the QR code through the attendance devices available in the Hospital.',
+ 'en':
+ 'Pass the QR code through the attendance devices available in the Hospital.',
'ar': 'تمرير الكود من خلال اجهزة تسجيل الحضور المتوفرة في الفرع.'
},
- 'sitWaitingQR': {'en': 'Sit in the waiting rooms until called by the nurse.', 'ar': 'الجلوس في غرف الانتظار لحين منادتك من قبل الممرضة.'},
- 'attendRegisterCode': {'en': 'Attendance registration code', 'ar': 'رمز تسجيل الحضور'},
+ 'sitWaitingQR': {
+ 'en': 'Sit in the waiting rooms until called by the nurse.',
+ 'ar': 'الجلوس في غرف الانتظار لحين منادتك من قبل الممرضة.'
+ },
+ 'attendRegisterCode': {
+ 'en': 'Attendance registration code',
+ 'ar': 'رمز تسجيل الحضور'
+ },
'scanQRHospital': {
'en': 'Scan above QR Code to Check-In on the Machine in Hospital',
'ar': 'مسح فوق رمز الاستجابة السريعة للتحقق في الجهاز في المستشفى'
},
"sendEmail": {"en": "Send Email", "ar": "ارسال نسخة"},
"success": {"en": "Done successfully", "ar": "تم تنفذ الطلب بنجاح"},
- "EmailSentSuccessfully": {"en": "Email Sent Successfully", "ar": "تم إرسال البريد الإلكتروني بنجاح"},
- "EmailSentError": {"en": "Error Sending Email", "ar": "خطأ في إرسال البريد الإلكتروني"},
+ "EmailSentSuccessfully": {
+ "en": "Email Sent Successfully",
+ "ar": "تم إرسال البريد الإلكتروني بنجاح"
+ },
+ "EmailSentError": {
+ "en": "Error Sending Email",
+ "ar": "خطأ في إرسال البريد الإلكتروني"
+ },
"close": {"en": "Close", "ar": "مغلق"},
"booked": {"en": "Booked", "ar": "محجوز"},
"confirmed": {"en": "Confirmed", "ar": "مؤكد"},
"arrived": {"en": "Arrived", "ar": "تم الحضور"},
- "payNowBookSuccess": {"en": "Pay now via Al Habib App", "ar": "ادفع الآن عبر تطبيق الحبيب"},
+ "payNowBookSuccess": {
+ "en": "Pay now via Al Habib App",
+ "ar": "ادفع الآن عبر تطبيق الحبيب"
+ },
"payNowBookSuccesstext1": {
"en": "Pay Now using online payment service From secure payment gateways",
"ar": "ادفع الآن باستخدام خدمة الدفع عبر الإنترنت من بوابات الدفع الآمنة"
@@ -211,9 +323,15 @@ const Map localizedValues = {
'en': 'This service will be available for last 15 days doctor Visit only',
'ar': 'هذه الخدمة متاحة للزيارات خلال اخر 15 يوم فقط'
},
- "more-verify": {"en": "More Verification Options", "ar": "المزيد من خيارات التحقق"},
+ "more-verify": {
+ "en": "More Verification Options",
+ "ar": "المزيد من خيارات التحقق"
+ },
"welcome-back": {"en": "Welcome back!", "ar": "مرحبا بعودتك!"},
- "account-info": {"en": "Would you like to login with current username?", "ar": "هل ترغب في تسجيل الدخول باسم المستخدم الحالي؟"},
+ "account-info": {
+ "en": "Would you like to login with current username?",
+ "ar": "هل ترغب في تسجيل الدخول باسم المستخدم الحالي؟"
+ },
"another-acc": {"en": "Use Another Account", "ar": "استخدم حسابا آخر"},
"next": {"en": "Next", "ar": 'التالى'},
"first-name": {"en": "First Name", "ar": "الاسم الأول"},
@@ -224,7 +342,10 @@ const Map localizedValues = {
"preferred-language": {"en": "Preferred Language", "ar": "اللغة المفضلة"},
"english": {"en": "English", "ar": "الإنجليزية"},
"arabic": {"en": "Arabic", "ar": "العربية"},
- "locations-register": {"en": "Where do you want to create this file?", "ar": "أين تريد فتح هذا الملف؟"},
+ "locations-register": {
+ "en": "Where do you want to create this file?",
+ "ar": "أين تريد فتح هذا الملف؟"
+ },
"ksa": {"en": "KSA", "ar": "السعودية"},
"dubai": {"en": "Dubai", "ar": "دبي"},
"enter-email": {"en": "Please Enter Email", "ar": "ادخل البريد الالكتروني"},
@@ -244,7 +365,7 @@ const Map localizedValues = {
'painScale': {'en': 'Pain Scale', 'ar': 'مقياس الألم'},
'weight': {'en': 'Weight', 'ar': 'الوزن'},
'height': {'en': 'Height', 'ar': 'الطول'},
- 'heart': {'en': 'Heart', 'ar': 'قلب'},
+ 'heart': {'en': 'Heart Rate', 'ar': 'معدل النبض'},
"heightUnit": {"en": "height unit", "ar": "وحدة الطول"},
"weightUnit": {"en": "Weight Unit", "ar": "وحدة الوزن"},
"request": {"en": "Request", "ar": "طلبات الاضافة"},
@@ -264,7 +385,10 @@ const Map localizedValues = {
"procedureStatus": {"en": "Procedure Status: ", "ar": "حالة الاجراء"},
"usageStatus": {"en": "Usage Status", "ar": "جالة الاستخدام"},
"unusedCount": {"en": "Unused Count: ", "ar": "غير مستخدم: "},
- "totalApproval": {"en": "Total approval unused", "ar": "اجمالي الموافقات الغير مستخدمة"},
+ "totalApproval": {
+ "en": "Total approval unused",
+ "ar": "اجمالي الموافقات الغير مستخدمة"
+ },
"category": {"en": "Category: ", "ar": "الفئة"},
"expirationDate": {"en": "Expiration Date: ", "ar": "تاريخ الانتهاء"},
"patientCard": {"en": "Patient Card ID: ", "ar": "رقم الاشتراك"},
@@ -272,35 +396,70 @@ const Map localizedValues = {
"seeDetails": {"en": "SEE DETAILS", "ar": "منافعك التامينية"},
"insuranceCards": {"en": "Insurance Cards", "ar": "بطاقات التأمين"},
"requestType": {"en": "Request Type", "ar": "نوع الاستفسار"},
- "register-info-family": {"en": "How would like to add the new member?", "ar": "كيف ترغب باضافة العضو الجديد؟"},
- "remove-family-member": {"en": "Remove this member?", "ar": "إزالة ملف العضو؟"},
+ "register-info-family": {
+ "en": "How would like to add the new member?",
+ "ar": "كيف ترغب باضافة العضو الجديد؟"
+ },
+ "remove-family-member": {
+ "en": "Remove this member?",
+ "ar": "إزالة ملف العضو؟"
+ },
"MyMedicalFile": {"en": "My Medical File", 'ar': 'ملف الطبي الالكتروني'},
- "myMedicalFileSubTitle": {"en": "All your medical records", 'ar': 'جميع سجلاتك الطبية'},
+ "myMedicalFileSubTitle": {
+ "en": "All your medical records",
+ 'ar': 'جميع سجلاتك الطبية'
+ },
"viewMore": {"en": "View More", 'ar': 'عرض المزيد'},
- "homeHealthCareService": {"en": "Home Health Care Service", 'ar': 'الرعاية الصحية المنزلية'},
+ "homeHealthCareService": {
+ "en": "Home Health Care Service",
+ 'ar': 'الرعاية الصحية المنزلية'
+ },
"OnlinePharmacy": {"en": "Online Pharmacy", 'ar': 'صيدليات الحبيب'},
"EmergencyService": {"en": "Emergency Service", 'ar': 'الفحص الطبي الشامل'},
- "OnlinePaymentService": {"en": "Online Payment Service", 'ar': 'خدمة الدفع الإلكتدوني'},
- "OffersAndPackages": {"en": "Online transfer request", 'ar': 'طلب التحويل الالكتروني'},
- "ComprehensiveMedicalCheckup": {"en": "Comprehensive Medical Check up", 'ar': 'فحص طبي شامل'},
+ "OnlinePaymentService": {
+ "en": "Online Payment Service",
+ 'ar': 'خدمة الدفع الإلكتدوني'
+ },
+ "OffersAndPackages": {
+ "en": "Online transfer request",
+ 'ar': 'طلب التحويل الالكتروني'
+ },
+ "ComprehensiveMedicalCheckup": {
+ "en": "Comprehensive Medical Check up",
+ 'ar': 'فحص طبي شامل'
+ },
"HMGService": {"en": "HMG Service", 'ar': 'جميع خدمات الحبيب'},
- "ViewAllHabibMedicalService": {"en": "View All Habib Medical Service", 'ar': 'عرض خدمات الحبيب الطبية'},
+ "ViewAllHabibMedicalService": {
+ "en": "View All Habib Medical Service",
+ 'ar': 'عرض خدمات الحبيب الطبية'
+ },
"viewAll": {"en": "View All", 'ar': 'عرض الكل'},
"view": {"en": "View", 'ar': 'عرض'},
"ContactUs": {"en": "Contact Us", 'ar': 'الوصول إلينا'},
- "ViewAllWaysReachUs": {"en": "View All Ways Reach Us", 'ar': 'جميع طرق الاتصال بنا'},
+ "ViewAllWaysReachUs": {
+ "en": "View All Ways Reach Us",
+ 'ar': 'جميع طرق الاتصال بنا'
+ },
"medicalProfile": {"en": "Medical Profile", 'ar': 'الملف الطبي'},
"consultation": {"en": "Consultation", "ar": "استشارة"},
"logs": {"en": "Logs", "ar": "السجلات"},
"textToSpeech": {"en": "How May I Help You?", "ar": "كيف يمكنني مساعدتك؟"},
"locationDialogMessage": {
- "en": "Allow the HMG app to access your location will assist you in showing the hospitals according to the nearest to you.",
- "ar": "السماح لتطبيق مجموعة الحبيب الطبية بالوصول إلى موقعك سيساعدك في إظهار المستشفيات وفقًا للأقرب إليك."
+ "en":
+ "Allow the HMG app to access your location will assist you in showing the hospitals according to the nearest to you.",
+ "ar":
+ "السماح لتطبيق مجموعة الحبيب الطبية بالوصول إلى موقعك سيساعدك في إظهار المستشفيات وفقًا للأقرب إليك."
},
- "user-view-requester": {"en": "User Wants To View Your Medical File", "ar": "أشخاص يرغبون الاطلاع على ملفك الطبي"},
- "user-view": {"en": "User Can View Your Medical File", "ar": "أشخاص يمكنهم الاطلاع على ملفك الطبي"},
+ "user-view-requester": {
+ "en": "User Wants To View Your Medical File",
+ "ar": "أشخاص يرغبون الاطلاع على ملفك الطبي"
+ },
+ "user-view": {
+ "en": "User Can View Your Medical File",
+ "ar": "أشخاص يمكنهم الاطلاع على ملفك الطبي"
+ },
"parking": {"en": "Parking", "ar": "مواقف"},
"alhabiServices": {"en": "HMG Service", "ar": "خدمات الحبيب"},
@@ -323,9 +482,18 @@ const Map localizedValues = {
"ambulancerequest": {"en": "Ambulance :", "ar": "طلب نقل "},
"requestA": {"en": "Request:", "ar": "اسعاف"},
"MyAppointments": {"en": "Appointments", "ar": "مواعيدي"},
- "NoBookedAppointments": {"en": "No Booked Appointments", "ar": "لا توجد مواعيد محجوزة"},
- "NoConfirmedAppointments": {"en": "No Confirmed Appointments", "ar": "لا توجد مواعيد مؤكدة"},
- "noArrivedAppointments": {"en": "No Arrived Appointments", "ar": "لم تصل المواعيد"},
+ "NoBookedAppointments": {
+ "en": "No Booked Appointments",
+ "ar": "لا توجد مواعيد محجوزة"
+ },
+ "NoConfirmedAppointments": {
+ "en": "No Confirmed Appointments",
+ "ar": "لا توجد مواعيد مؤكدة"
+ },
+ "noArrivedAppointments": {
+ "en": "No Arrived Appointments",
+ "ar": "لم تصل المواعيد"
+ },
"MyAppointmentsList": {"en": "List", "ar": "قائمة بمواعدي"},
"Radiology": {"en": "Radiology", "ar": "الأشعة"},
"RadiologySubtitle": {"en": "Result", "ar": "صور وتقارير"},
@@ -384,10 +552,19 @@ const Map localizedValues = {
"VitalSign": {"en": "Vital Sign", "ar": "العلامة حيوية"},
"MonthlyReports": {"en": "Monthly Reports", "ar": "تقارير شهرية"},
"km": {"en": "KMs:", "ar": "كم"},
- "PatientHealthSummaryReport": {"en": "Patient Health Summary Report", "ar": " ملخص التقارير الشهرية"},
- "ToViewTheTermsAndConditions": {"en": "To View The Terms And Conditions Report", "ar": " عرض الشروط والأحكام "},
+ "PatientHealthSummaryReport": {
+ "en": "Patient Health Summary Report",
+ "ar": " ملخص التقارير الشهرية"
+ },
+ "ToViewTheTermsAndConditions": {
+ "en": "To View The Terms And Conditions Report",
+ "ar": " عرض الشروط والأحكام "
+ },
"ClickHere": {"en": "Click here", "ar": "أنقر هنا"},
- "IAgreeToTheTermsAndConditions": {"en": "I agree to the terms and conditions ", "ar": "أوافق على الشروط والاحكام "},
+ "IAgreeToTheTermsAndConditions": {
+ "en": "I agree to the terms and conditions ",
+ "ar": "أوافق على الشروط والاحكام "
+ },
"IAgreeToTheTermsAndConditionsSubtitle": {
"en": "I agree to the terms and conditions ",
"ar":
@@ -396,23 +573,34 @@ const Map localizedValues = {
"Save": {"en": "Save", "ar": "حفظ "},
"UserAgreement": {"en": "User Agreement", "ar": "اتفاقية الخصوصية "},
"UpdateSuccessfully": {"en": "Update Successfully", "ar": "تم التحديث بنجاح"},
- "CHECK_VACCINE_AVAILABILITY": {"en": "CHECK VACCINE AVAILABILITY", "ar": "تحقق من توافر اللقاح"},
- "MyVaccinesAvailability": {"en": "MyVaccinesAvailability", "ar": "توفر لقاحي"},
+ "CHECK_VACCINE_AVAILABILITY": {
+ "en": "CHECK VACCINE AVAILABILITY",
+ "ar": "تحقق من توافر اللقاح"
+ },
+ "MyVaccinesAvailability": {
+ "en": "MyVaccinesAvailability",
+ "ar": "توفر لقاحي"
+ },
"PaymentService": {"en": "Payment Service", "ar": "خدمة المدفوعات"},
"PaymentOnline": {"en": "Service", "ar": "الالكتروني"},
"OnlineCheckIn": {"en": "Online Check-In", "ar": "مدفوعات معلقة"},
"MyBalances": {"en": "My Balances", "ar": "رصيدي"},
- "BalanceAmount": {"en": "Balance Amount", "ar": "رصيدالحساب"},
- "TotalBalance": {"en": "Total Balance", "ar": "الرصيد الكلي"},
- "CreateAdvancedPayment": {"en": "Create Advanced Payment", "ar": "إنشاء دفعة مقدمة"},
+ "BalanceAmount": {"en": "Wallet Amount", "ar": "مبلغ المحفظة"},
+ "TotalBalance": {"en": "Total Amount", "ar": "المبلغ الإجمالي"},
+ "CreateAdvancedPayment": {"en": "Recharge Wallet", "ar": "إعادة شحن المحفظة"},
+
"AdvancePayment": {"en": "Advance Payment", "ar": "الدفع مقدما"},
"AdvancePaymentLabel": {
- "en": "You can create and add an Advanced Payment for you account or other accounts.",
+ "en":
+ "You can create and add an Advanced Payment for you account or other accounts.",
"ar": "يمكنك تحويل مبلغ لحسابك لدى المجموعة أو لحساب احد المراجعين"
},
"FileNumber": {"en": "File Number", "ar": "رقم الملف"},
"Amount": {"en": "Amount *", "ar": "المبلغ *"},
- "DepositorEmail": {"en": "Depositor Email *", "ar": "البريد الإلكتروني للمودع *"},
+ "DepositorEmail": {
+ "en": "Depositor Email *",
+ "ar": "البريد الإلكتروني للمودع *"
+ },
"Notes": {"en": "Notes", "ar": "ملاحظات"},
"SelectPatientName": {"en": "Select Patient Name", "ar": "اختر اسم المريض"},
"SelectFamilyPatientName": {"en": "Family Members", "ar": "أفراد الأسرة"},
@@ -425,10 +613,22 @@ const Map localizedValues = {
"DepositorName": {"en": "Depositor Name", "ar": "اسم المودع *"},
"MobileNumber": {"en": "Mobile Number", "ar": "رقم الجوال"},
"Ok": {"en": "Ok", "ar": "حسنا"},
- "WaterConsumedInWeek": {"en": "Water consumed in a week", "ar": "معدل شرب الماء خلال الاسبوع"},
- "WaterConsumedInMonth": {"en": "Water consumed in a month", "ar": "معدل شرب الماء خلال الشهر"},
- "TheVerificationCodeExpiresIn": {"en": "The Verification Code Expires In", "ar": "تنتهي صلاحية رمز التحقق في"},
- "PleaseEnterTheVerificationCode": {"en": "Please enter the verification code send to", "ar": "الرجاء إدخال رمز التحقق المرسل إلى"},
+ "WaterConsumedInWeek": {
+ "en": "Water consumed in a week",
+ "ar": "معدل شرب الماء خلال الاسبوع"
+ },
+ "WaterConsumedInMonth": {
+ "en": "Water consumed in a month",
+ "ar": "معدل شرب الماء خلال الشهر"
+ },
+ "TheVerificationCodeExpiresIn": {
+ "en": "The Verification Code Expires In",
+ "ar": "تنتهي صلاحية رمز التحقق في"
+ },
+ "PleaseEnterTheVerificationCode": {
+ "en": "Please enter the verification code send to",
+ "ar": "الرجاء إدخال رمز التحقق المرسل إلى"
+ },
"EyeMeasurements": {"en": "Eye Measurements", "ar": "قياسات النظر"},
"Measurements": {"en": "Measurements", "ar": "قياسات"},
"Classes": {"en": "Classes", "ar": "نظارات"},
@@ -451,8 +651,10 @@ const Map localizedValues = {
"DailyQuantity": {"en": "Daily Quantity :", "ar": "جرعات يومية"},
"AddReminder": {"en": "Add Reminder", "ar": "إضافة تذكير"},
"reminderDes": {
- "en": "Please select treatment start day and time to be notified when it\'s time to take the medicine",
- "ar": " يرجى تحديد يوم بدء العلاج والوقت ليتم ارسال تنبيه عندما يحين الوقت لتناول الدواء"
+ "en":
+ "Please select treatment start day and time to be notified when it\'s time to take the medicine",
+ "ar":
+ " يرجى تحديد يوم بدء العلاج والوقت ليتم ارسال تنبيه عندما يحين الوقت لتناول الدواء"
},
"StartDay": {"en": "Start Day", "ar": "يوم البداية"},
"EndDay": {"en": "End Day", "ar": "يوم الانتهاء"},
@@ -462,12 +664,24 @@ const Map localizedValues = {
"DoctorResponses": {"en": "Doctor Responses", "ar": "ردود الأطباء"},
"New": {"en": "New", "ar": "جديد"},
"All": {"en": "All", "ar": "الكل"},
- "QuestionHere": {"en": "Enter the question here...", "ar": "اضف الاستفسار هنا"},
- "ViewDoctorResponses": {"en": "View Doctor Responses", "ar": "الاطلاع على ردود الأطباء"},
+ "QuestionHere": {
+ "en": "Enter the question here...",
+ "ar": "اضف الاستفسار هنا"
+ },
+ "ViewDoctorResponses": {
+ "en": "View Doctor Responses",
+ "ar": "الاطلاع على ردود الأطباء"
+ },
"ServiceInformationButton": {"en": "LOGIN / REGISTER", "ar": "دخول / تسجيل"},
- "ServiceInformationTitle": {"en": "Service Information", "ar": "معلومات الخدمة"},
+ "ServiceInformationTitle": {
+ "en": "Service Information",
+ "ar": "معلومات الخدمة"
+ },
"ServiceInformation": {"en": "Service Information", "ar": "معلومات الخدمة"},
- "HomeHealthCare": {"en": "Home Health Care", "ar": " الرعاية الصحية المنزلية "},
+ "HomeHealthCare": {
+ "en": "Home Health Care",
+ "ar": " الرعاية الصحية المنزلية "
+ },
"HomeHealthCareText": {
"en":
"This service provides a set of home health care services, continuous and comprehensive follow-up in their places of residence for those who cannot access health facilities, such as (laboratory analyzes - radiology - vaccinations - physical therapy), etc.",
@@ -479,11 +693,14 @@ const Map localizedValues = {
"info-lab": {
"en":
"This service allows you to view the results of all laboratory tests performed in Al Habib Medical Group as well as sending the report via e-mail.",
- "ar": "خدمة نتائج المختبر: هذه الخدمة تمكنك من الاطلاع على نتائج جميع الفحوصات المخبرية التي تمت في مجموعة الحبيب الطبية."
+ "ar":
+ "خدمة نتائج المختبر: هذه الخدمة تمكنك من الاطلاع على نتائج جميع الفحوصات المخبرية التي تمت في مجموعة الحبيب الطبية."
},
"info-radiology": {
- "en": "This service allows you to view the reports and photos of radiology in Al Habib Medical Group as well as send the report by e-mail.",
- "ar": "خدمة الاشعة: هذه الخدمة تمكنك من الاطلاع على تقارير وصور الاشعة التي تمت في مجموعة الحبيب الطبية وكذلك ارسال التقرير عن طريق الايميل."
+ "en":
+ "This service allows you to view the reports and photos of radiology in Al Habib Medical Group as well as send the report by e-mail.",
+ "ar":
+ "خدمة الاشعة: هذه الخدمة تمكنك من الاطلاع على تقارير وصور الاشعة التي تمت في مجموعة الحبيب الطبية وكذلك ارسال التقرير عن طريق الايميل."
},
"orders": {"en": "Orders", "ar": "الطلبات"},
"lakum": {"en": "Lakum", "ar": "لكم"},
@@ -517,10 +734,19 @@ const Map localizedValues = {
"recommended": {"en": " Recommended For You", "ar": "موصى لك"},
"myPrescription": {"en": " My Prescriptions", "ar": "وصفاتي"},
"quantity": {"en": " QTY ", "ar": "الكمية"},
- "backMyAccount": {"en": "BACK TO MY ACCOUNT ", "ar": " الرجوع لحسابي الشخصي"},
+ "backMyAccount": {
+ "en": "BACK TO MY ACCOUNT ",
+ "ar": " الرجوع لحسابي الشخصي"
+ },
"reviewSuccessful": {"en": "Review Successful", "ar": " تقييم ناجح"},
- "reviewShared": {"en": "Your review has been shared on product review section", "ar": " تمت مشاركة تقييمك في قسم تقييم المنتج"},
- "reviewComment": {"en": "Your reviews help other to choose better product", "ar": " تقييمك سوف يساعد الأخرين في اختيار المنتج الأفضل"},
+ "reviewShared": {
+ "en": "Your review has been shared on product review section",
+ "ar": " تمت مشاركة تقييمك في قسم تقييم المنتج"
+ },
+ "reviewComment": {
+ "en": "Your reviews help other to choose better product",
+ "ar": " تقييمك سوف يساعد الأخرين في اختيار المنتج الأفضل"
+ },
"shippedMethod": {"en": "SHIP BY:", "ar": " الشحن بواسطة:"},
"orderDetail": {"en": "Order Details", "ar": " تفاصيل الطلب"},
"orderSummary": {"en": "Order Summary", "ar": " تفاصيل المنتج"},
@@ -541,38 +767,73 @@ const Map localizedValues = {
"confirmLocation": {"en": "CONFIRM LOCATION ", "ar": " تأكيد الموقع "},
"conditionsHMG": {"en": "Terms & Conditions ", "ar": "الشروط و الأحكام "},
"conditions": {"en": "Terms & Conditions of Lakum", "ar": "شروط و احكام لكم"},
- "confirmDeleteMsg": {"en": "Are you sure! want to delete ", "ar": "هل انت متأكد تريد الحذف "},
+ "confirmDeleteMsg": {
+ "en": "Are you sure! want to delete ",
+ "ar": "هل انت متأكد تريد الحذف "
+ },
"confirmDelete": {"en": "DELETE", "ar": "حذف"},
- "confirmCancellation": {"en": "Are you sure! want to cancel this order ", "ar": "هل انت متأكد تريد حذف هذا المنتج "},
+ "confirmCancellation": {
+ "en": "Are you sure! want to cancel this order ",
+ "ar": "هل انت متأكد تريد حذف هذا المنتج "
+ },
"orderNumber": {"en": "Order#: ", "ar": "الطلب: "},
"orderDate": {"en": "Date", "ar": "التاريخ:"},
"itemsNo": {"en": "items(s)", "ar": "عناصر"},
"noOrder": {"en": "You Don't have any orders.", "ar": "ليس لديك طلبات"},
"TermsService": {"en": "Terms of Service", "ar": "شروط الخدمه"},
- "Beforeusing": {"en": "Before using the checkup, please read Terms of Service.", "ar": "قبل استخدام الفحص ، يرجى قراءة شروط الخدمة"},
- "accept": {"en": "I read and accept Terms of Service and Privacy Policy", "ar": "قرأت ووافقت على شروط الخدمة وسياسة الخصوصية"},
+ "Beforeusing": {
+ "en": "Before using the checkup, please read Terms of Service.",
+ "ar": "قبل استخدام الفحص ، يرجى قراءة شروط الخدمة"
+ },
+ "accept": {
+ "en": "I read and accept Terms of Service and Privacy Policy",
+ "ar": "قرأت ووافقت على شروط الخدمة وسياسة الخصوصية"
+ },
"data-safe-info": {
- "en": "Information that you provide is anonymous and not shared with anyone.",
+ "en":
+ "Information that you provide is anonymous and not shared with anyone.",
"ar": "المعلومات التي تقدمها لا تتم مشاركتها مع أي شخص"
},
"data-safe": {"en": " Your data is safe.", "ar": "بياناتك آمنة"},
"informational": {
- "en": "Checkup is for informational purposes and is not a qualified medical opinion",
+ "en":
+ "Checkup is for informational purposes and is not a qualified medical opinion",
"ar": "الفحص هو لأغراض معلوماتية وليس رأي طبي مؤهل"
},
- "not-use-in-emerbency": {"en": "Do not use in emergencies.", "ar": "لا تستخدم في حالات الطوارئ"},
- "not-use-in-emerbency-details": {"en": "In case of health emergency, ", "ar": "في حالة الطوارئ اتصل بأقرب رقم للطوارئ على الفور"},
- "not-use-in-emerbency-details-call": {"en": "call the nearest emergency number immediately", "ar": " اتصل بأقرب رقم للطوارئ على الفور"},
- "check-diagnosis": {"en": "Checkup is not a diagnosis.", "ar": "الفحص ليس تشخيص."},
+ "not-use-in-emerbency": {
+ "en": "Do not use in emergencies.",
+ "ar": "لا تستخدم في حالات الطوارئ"
+ },
+ "not-use-in-emerbency-details": {
+ "en": "In case of health emergency, ",
+ "ar": "في حالة الطوارئ اتصل بأقرب رقم للطوارئ على الفور"
+ },
+ "not-use-in-emerbency-details-call": {
+ "en": "call the nearest emergency number immediately",
+ "ar": " اتصل بأقرب رقم للطوارئ على الفور"
+ },
+ "check-diagnosis": {
+ "en": "Checkup is not a diagnosis.",
+ "ar": "الفحص ليس تشخيص."
+ },
"remeberthat": {"en": "Remember that", "ar": "تذكر ذلك:"},
- "loginToUseService": {"en": "You need to login to use this service", "ar": "هذة الخدمة تتطلب تسجيل الدخول"},
+ "loginToUseService": {
+ "en": "You need to login to use this service",
+ "ar": "هذة الخدمة تتطلب تسجيل الدخول"
+ },
// pharmacy module
"medicationRefill": {"en": "MEDICATION REFILL", "ar": "إعادة تعبئة الدواء"},
- "offersAndPromotions": {"en": "OFFERS & SPECIAL PROMOTIONS", "ar": "العروض والترقيات الخاصة"},
+ "offersAndPromotions": {
+ "en": "OFFERS & SPECIAL PROMOTIONS",
+ "ar": "العروض والترقيات الخاصة"
+ },
"myPrescriptions": {"en": "MY PRESCRIPTIONS", "ar": "وصفاتي"},
- "searchAndScanMedication": {"en": "SEARCH & SCAN FOR MEDICATION", "ar": "البحث والمسح للأدوية"},
+ "searchAndScanMedication": {
+ "en": "SEARCH & SCAN FOR MEDICATION",
+ "ar": "البحث والمسح للأدوية"
+ },
"shopByBrands": {"en": "Shop By Brands", "ar": "تسوق حسب الماركات"},
"recentlyViewed": {"en": "Recently Viewed", "ar": "شوهدت مؤخرا"},
"bestSellers": {"en": "Best Sellers", "ar": "أفضل البائعين"},
@@ -582,7 +843,10 @@ const Map localizedValues = {
"selectAddress": {"en": "Select Address", "ar": "حدد العنوان"},
"shippingAddress": {"en": "SHIPPING ADDRESS", "ar": "عنوان الشحن"},
"changeAddress": {"en": "Change Address", "ar": "تغيير العنوان"},
- "selectPaymentOption": {"en": "Select Payment Option", "ar": "حدد خيار الدفع"},
+ "selectPaymentOption": {
+ "en": "Select Payment Option",
+ "ar": "حدد خيار الدفع"
+ },
"changeMethod": {"en": "Change Method", "ar": "تغيير خيار الدفع"},
"reviewOrder": {"en": "Review Order", "ar": "مراجعة الطلب"},
"active": {"en": "ACTIVE", "ar": "فعال"},
@@ -594,23 +858,31 @@ const Map localizedValues = {
"checkBeneficiary": {"en": "CHECK BENEFICIARY", "ar": "تحقق من المستفيد"},
"beneficiaryName": {"en": "Beneficiary Name", "ar": "اسم المستفيد"},
"accountActivation": {"en": "Account Activation", "ar": "تفعيل الحساب"},
+ "lakumTransfer": {"en": "Lakum Transfer", "ar": "تفعيل الحساب"},
"acceptLbl": {"en": "Accept", "ar": "موافقة"},
"select-gender": {"en": "Select Gender", "ar": "اختر الجنس"},
"i-am-a": {"en": "I am a ...", "ar": "أنا ..."},
"select-age": {"en": "Select Your Age", "ar": "حدد العمر"},
"i-am": {"en": "I am", "ar": "أنا"},
"years-old": {"en": "years old", "ar": "سنة"},
- "drag-point": {"en": "Drag point to change your age", "ar": "اسحب لتغيير عمرك"},
+ "drag-point": {
+ "en": "Drag point to change your age",
+ "ar": "اسحب لتغيير عمرك"
+ },
"categorise": {"en": "Categories", "ar": "التطبيقات"},
"wishList": {"en": "WishList", "ar": "الرغبات"},
"myAccount": {"en": "My Account", "ar": "حسابي"},
"cart": {"en": "Cart", "ar": "التسوق"},
- "searchProductHere": {"en": "Search Product here", "ar": "ابحث في الطلب الخاص بك"},
+ "searchProductHere": {
+ "en": "Search Product here",
+ "ar": "ابحث في الطلب الخاص بك"
+ },
"HHCNotAuthMsg": {
"en":
"This service provides a set of home health care services, continuous and comprehensive follow-up in their places of residence for those who cannot access health facilities, such as (laboratory analyzes - radiology - vaccinations - physical therapy), etc.",
- "ar": "توفر هذه الخدمة مجموعه من خدمات الرعايه الصحيه المنزلية و متابعه مستمره وشامله للذين لا يستطيعون الوصول للمنشات الصحيه في اماكن اقامتهم (التحاليل المخبرية – الاشعة – التطعيمات – العلاج الطبيعي)..."
+ "ar":
+ "توفر هذه الخدمة مجموعه من خدمات الرعايه الصحيه المنزلية و متابعه مستمره وشامله للذين لا يستطيعون الوصول للمنشات الصحيه في اماكن اقامتهم (التحاليل المخبرية – الاشعة – التطعيمات – العلاج الطبيعي)..."
},
"email": {"en": "Email", "ar": "البريد الالكتروني"},
"Book": {"en": "Book", "ar": "احجز"},
@@ -621,7 +893,10 @@ const Map localizedValues = {
"profile": {"en": "Profile", "ar": "ملفي"},
"notifications": {"en": "Notifications", "ar": "إشعارات"},
"notificationDetails": {"en": "Notification Details", "ar": "تفاصيل الاشعار"},
- "notificationDetailsa": {"en": "Notification Details", "ar": "تفاصيل الاشعار"},
+ "notificationDetailsa": {
+ "en": "Notification Details",
+ "ar": "تفاصيل الاشعار"
+ },
"info-my-doctor-points": {
"en": [
@@ -638,11 +913,14 @@ const Map localizedValues = {
]
},
"info-my-doctor": {
- "en": "This service allows you to see all the doctors you have visited in Al Habib Medical Group, and through this service:",
- "ar": "خدمة اطبائي: هذه الخدمة تمكنك من الاطلاع على جميع الاطباء الذين قمت بزيارتهم في مجموعة الحبيب الطبية, كما تستطيع من خلال هذه الخدمة:"
+ "en":
+ "This service allows you to see all the doctors you have visited in Al Habib Medical Group, and through this service:",
+ "ar":
+ "خدمة اطبائي: هذه الخدمة تمكنك من الاطلاع على جميع الاطباء الذين قمت بزيارتهم في مجموعة الحبيب الطبية, كما تستطيع من خلال هذه الخدمة:"
},
"info-prescriptions": {
- "en": "This service allows you to view all the medical prescriptions issued by Al Habib Medical Group, and through this service, you can:",
+ "en":
+ "This service allows you to view all the medical prescriptions issued by Al Habib Medical Group, and through this service, you can:",
"ar":
"خدمة الوصفات الطبية: هذه الخدمة تمكنك من الاطلاع على جميع الوصفات الطبية التي تم اصدارها في مجموعة الحبيب الطبية، كما تستطيع من خلال هذه الخدمة:"
},
@@ -668,7 +946,8 @@ const Map localizedValues = {
},
"info-insurance-cards": {
- "en": "This service allows you to view all the insurance cards that recorded during your visits to Al Habib Medical Group in addition to:",
+ "en":
+ "This service allows you to view all the insurance cards that recorded during your visits to Al Habib Medical Group in addition to:",
"ar":
"خدمة بطاقات التامين: هذه الخدمة تمكنك من الاطلاع على جميع بطاقات التامين والتي تم تسجيلها اثناء زياراتك لمجموعة الحبيب الطبية بالاضافة الى:"
},
@@ -693,15 +972,19 @@ const Map localizedValues = {
},
"info-allergies": {
- "en": "This service allows you to view all types of allergies recorded during your visits to Al Habib Medical Group.",
- "ar": "خدمة الحساسية: هذه الخدمة تمكنك من الاطلاع على جميع انواع الحساسية التي تم تسجيلها خلال زياراتك في مجموعة الحبيب الطبية."
+ "en":
+ "This service allows you to view all types of allergies recorded during your visits to Al Habib Medical Group.",
+ "ar":
+ "خدمة الحساسية: هذه الخدمة تمكنك من الاطلاع على جميع انواع الحساسية التي تم تسجيلها خلال زياراتك في مجموعة الحبيب الطبية."
},
"sick-leaves": {"en": "Sick Leaves", "ar": "الاجازات المرضية"},
"info-sick-leaves": {
- "en": "This service allows you to view all sick leaves that were taken in Al Habib Medical Group in addition to:",
- "ar": "الاجازات المرضية: هذه الخدمة تمكنك من الاطلاع على جميع الاجازات المرضية والتي تم اصدارها في مجموعة الحبيب الطبية بالاضافة الى:"
+ "en":
+ "This service allows you to view all sick leaves that were taken in Al Habib Medical Group in addition to:",
+ "ar":
+ "الاجازات المرضية: هذه الخدمة تمكنك من الاطلاع على جميع الاجازات المرضية والتي تم اصدارها في مجموعة الحبيب الطبية بالاضافة الى:"
},
"info-sick-leave-points": {
"en": [
@@ -721,8 +1004,10 @@ const Map localizedValues = {
},
"info-approvals": {
- "en": "This service allows you to view all approvals requests that have been sent to the insurance companies in addition to:",
- "ar": "خدمة الموافقات: هذه الخدمة تمكنك من الاطلاع على جميع طلبات الموافقات والتي تم ارسالها الى شركات التامين بالاضافة الى:"
+ "en":
+ "This service allows you to view all approvals requests that have been sent to the insurance companies in addition to:",
+ "ar":
+ "خدمة الموافقات: هذه الخدمة تمكنك من الاطلاع على جميع طلبات الموافقات والتي تم ارسالها الى شركات التامين بالاضافة الى:"
},
"info-approval-points": {
@@ -743,16 +1028,34 @@ const Map localizedValues = {
"ar":
"خدمة التقارير الشهرية: عند تفعيل هذه الخدمة سيقوم النظام بارسال تقرير شهري بشكل آلي على الايميل المسجل والذي يسرد المؤشرات الحيوية ونتائج التحاليل لآخر زيارات تمت بمجموعة الحبيب الطبية."
},
- "language-setting": {"en": "SMS and Confirmation Calls Language", "ar": "لغة الرسائل القصيرة و الاتصال الآلي"},
+ "language-setting": {
+ "en": "SMS and Confirmation Calls Language",
+ "ar": "لغة الرسائل القصيرة و الاتصال الآلي"
+ },
"alert": {"en": "Alerts", "ar": "التنبيهات"},
- "email-alert": {"en": "Alert By Email", "ar": "استلام التنبيهات بالبريد الالكتروني"},
- "sms-alert": {"en": "Alert By SMS", "ar": "استلام التنبيهات بالرسائل القصيرة"},
+ "email-alert": {
+ "en": "Alert By Email",
+ "ar": "استلام التنبيهات بالبريد الالكتروني"
+ },
+ "sms-alert": {
+ "en": "Alert By SMS",
+ "ar": "استلام التنبيهات بالرسائل القصيرة"
+ },
"contact-info": {"en": "Contact Information", "ar": "معلومات التواصل"},
- "emrg-name": {"en": "Emergency Contact Name", "ar": "اسم للتواصل في حالة الطوارئ"},
- "emrg-no": {"en": "Emergency Contact Number", "ar": "رقم للتواصل في حالة الطوارئ"},
+ "emrg-name": {
+ "en": "Emergency Contact Name",
+ "ar": "اسم للتواصل في حالة الطوارئ"
+ },
+ "emrg-no": {
+ "en": "Emergency Contact Number",
+ "ar": "رقم للتواصل في حالة الطوارئ"
+ },
"modes": {"en": "Modes", "ar": "الاوضاع"},
"vibration": {"en": "Vibration Touch Feedback", "ar": "الاهتزاز عند اللمس"},
- "blind-modes": {"en": "Modes for Partially Blind", "ar": "تأثيرات لدعم ضعاف البصر"},
+ "blind-modes": {
+ "en": "Modes for Partially Blind",
+ "ar": "تأثيرات لدعم ضعاف البصر"
+ },
"invert-theme": {"en": "Invert", "ar": "ألوان سلبية"},
"off-theme": {"en": "Off", "ar": "إيقاف"},
"dim-theme": {"en": "Dim", "ar": "ضوء خافت"},
@@ -769,8 +1072,14 @@ const Map localizedValues = {
"LiveChat": {"en": "Live Chat", "ar": "محادثة مباشرة"},
"Service": {"en": "Service", "ar": "خدمة"},
"HMGServiceLabel": {"en": "HMG Service", 'ar': 'خدمات الحبيب'},
- "HealthWeatherIndicators": {"en": "Health Weather Indicators", 'ar': ' مؤشرات الطقس الصحية '},
- "HealthTipsBasedOnCurrentWeather": {"en": "Health Tips Based On Current Weather", 'ar': ' نصائح صحية على أساس الطقس الحالي '},
+ "HealthWeatherIndicators": {
+ "en": "Health Weather Indicators",
+ 'ar': ' مؤشرات الطقس الصحية '
+ },
+ "HealthTipsBasedOnCurrentWeather": {
+ "en": "Health Tips Based On Current Weather",
+ 'ar': ' نصائح صحية على أساس الطقس الحالي '
+ },
"MoreDetails": {"en": "More details", "ar": " المزيد من التفاصيل "},
"SendCopy": {"en": "Send Copy", "ar": "ارسال نسخة"},
"ResendOrder": {"en": "Resend order & deliver", "ar": "إعادة طلب و توصيل"},
@@ -794,28 +1103,55 @@ const Map localizedValues = {
"send": {"en": "Send", "ar": "أرسل"},
"status": {"en": "Status", "ar": "الحالة"},
"like-to-hear": {
- "en": "We would love to hear the feedback, concerns on healthcare services and eServices experience. Please use the below form",
- "ar": "يسعدنا سماع ملاحظاتك حول خدمات الرعاية الصحية والخدمات الإلكترونية. يرجى تعبئة الحقول المطلوبة"
+ "en":
+ "We would love to hear the feedback, concerns on healthcare services and eServices experience. Please use the below form",
+ "ar":
+ "يسعدنا سماع ملاحظاتك حول خدمات الرعاية الصحية والخدمات الإلكترونية. يرجى تعبئة الحقول المطلوبة"
},
"subject": {"en": "Subject", "ar": "الموضوع"},
"message": {"en": "Message", "ar": "رسالة"},
- "empty-subject": {"en": "Please enter the subject", "ar": "يرجى ادخال الموضوع"},
+ "empty-subject": {
+ "en": "Please enter the subject",
+ "ar": "يرجى ادخال الموضوع"
+ },
"empty-message": {"en": "Please enter message", "ar": "يرجى ادخال الرسالة"},
"select-attachment": {"en": "Select Attachment", "ar": "إختر المرفق"},
"complain-appo": {"en": "Complaint for appointment", "ar": "شكوى على موعد"},
- "complain-without-appo": {"en": "Complaint without appointment", "ar": "شكوى بدون موعد"},
+ "complain-without-appo": {
+ "en": "Complaint without appointment",
+ "ar": "شكوى بدون موعد"
+ },
"question": {"en": "Question", "ar": "سؤال"},
"message-type": {"en": "Message Type", "ar": "نوع الرسالة"},
"compliment": {"en": "compliment", "ar": "ثناء"},
"suggestion": {"en": "Suggestion", "ar": "إقتراح"},
- "your-feedback": {"en": "Your feedback was sent", "ar": "لقد تم ارسال اقراحك شكرا لك"},
- "select-part": {"en": "Please select the part that complain about", "ar": "يرجى تحديد الجزء الذي تشكو منه"},
+ "your-feedback": {
+ "en": "Your feedback was sent",
+ "ar": "لقد تم ارسال اقراحك شكرا لك"
+ },
+ "select-part": {
+ "en": "Please select the part that complain about",
+ "ar": "يرجى تحديد الجزء الذي تشكو منه"
+ },
"number": {"en": "Number", "ar": "الرقم"},
"not-classified": {"en": "Not classified", "ar": "غير محدد"},
"selectClinic": {"en": "Select Clinic", "ar": " بحث بالعيادة"},
- "searchItemError": {"en": "Item name should be more than 3 character ", "ar": "يجب أن يكون اسم العنصر أكثر من 3 أحرف"},
+ "searchItemError": {
+ "en": "Item name should be more than 3 character ",
+ "ar": "يجب أن يكون اسم العنصر أكثر من 3 أحرف"
+ },
"YouCanFind": {"en": "You Can Find ", "ar": "باستطاعتك العثور على "},
"ItemInSearch": {"en": " Item In Search", "ar": " عنصر في البحث "},
+ "blood-donation": {"en": "Blood Donation", "ar": "التبرع بالدم"},
+ "blood-instruction": {
+ "en":
+ "Enter the required information, In order to register for Blood Donation Service",
+ "ar": "ادخل المعلومات المطلوبة للتسجيل بخدمة التبرع بالدم"
+ },
+ "view-terms": {
+ "en": "To view the terms and conditions",
+ "ar": "عرض الشروط والأحكام"
+ },
"wantConnectHmgNetwork": {
"en":
"Dear customer there is no internet access, Do you want to connect with HMG network to use our app, make sure you are in range of HMG network",
@@ -827,7 +1163,7 @@ const Map localizedValues = {
"ar": "Connected with HMG Network,\n\nBut failed to access HMG services"
},
"offerAndPackages": {"en": "Offers And Packages", "ar": "العروض والباقات"},
- "InvoiceNo": {"en": " Invoice No", "ar": "رقم الفاتورة"},
+ "InvoiceNo": {"en": "Invoice No", "ar": "رقم الفاتورة"},
"SpecialResult": {"en": " Special Result", "ar": "نتيجة خاصة"},
"GeneralResult": {"en": "General Result", "ar": "نتيجة عامة"},
"show-more-btn": {"en": "Flow Chart", "ar": "النتائج التراكمية"},
@@ -857,20 +1193,31 @@ const Map localizedValues = {
"info-advance-payment": {
"en":
"This service designed so that you can deposit an amount in advance either in your account or in someone else's account with Al Habib Medical Group.",
- "ar": "تم تصميم هذه الخدمة حتى تتمكن من دفع مبلغ مقدما او تحت الحساب سواء في حسابك او في حساب شخص اخر لدى مجموعة الحبيب الطبية."
+ "ar":
+ "تم تصميم هذه الخدمة حتى تتمكن من دفع مبلغ مقدما او تحت الحساب سواء في حسابك او في حساب شخص اخر لدى مجموعة الحبيب الطبية."
+ },
+ "info-my-balance": {
+ "en": "This service allows you to check your balance in all branchs",
+ "ar": "هذه الخدمه تتيح لك الاطلاع رصيدك في كل الفروع"
},
- "info-my-balance": {"en": "This service allows you to check your balance in all branchs", "ar": "هذه الخدمه تتيح لك الاطلاع رصيدك في كل الفروع"},
"er-contant": {
- "en": "This service displays nearest branch among all the branches of Al Habib Medical Group based on your current location.",
- "ar": "تعرض هذه الخدمة أقرب فرع من بين جميع فروع مجموعة الحبيب الطبية بناءً على موقعك الحالي."
+ "en":
+ "This service displays nearest branch among all the branches of Al Habib Medical Group based on your current location.",
+ "ar":
+ "تعرض هذه الخدمة أقرب فرع من بين جميع فروع مجموعة الحبيب الطبية بناءً على موقعك الحالي."
},
"er": {"en": "ER", "ar": "الطوارىء"},
"transportation-Service": {"en": "Ambulance Request", "ar": "طلب نقل اسعاف"},
"info-ambulance": {
- "en": "Through this service, you can request evacuation by ambulance, whether from home or to home, in addition to a set of other services",
- "ar": "عن طريق هذه الخدمة يمكنك طلب اخلاء بواسطة سيارة اسعاف سواء من المزل او الى المنزل بالاضافة الى مجموعة من الخدمات الاخرى"
+ "en":
+ "Through this service, you can request evacuation by ambulance, whether from home or to home, in addition to a set of other services",
+ "ar":
+ "عن طريق هذه الخدمة يمكنك طلب اخلاء بواسطة سيارة اسعاف سواء من المزل او الى المنزل بالاضافة الى مجموعة من الخدمات الاخرى"
+ },
+ "RRT-transport-heading": {
+ "en": "Select Transportation Method",
+ "ar": "حدد طريقة النقل"
},
- "RRT-transport-heading": {"en": "Select Transportation Method", "ar": "حدد طريقة النقل"},
"RRT-direction-heading": {"en": "Select Direction", "ar": "حدد الاتجاه"},
"to-hospital": {"en": "To Hospital", "ar": "الى المستشفى"},
"from-hospital": {"en": "From Hospital", "ar": "من المستشفى"},
@@ -881,12 +1228,21 @@ const Map localizedValues = {
"inside-home": {"en": "Inside Home", "ar": "داخل المنزل"},
"have-appo": {"en": "Do you have an appointment ?", "ar": "هل لديك موعد ؟"},
"dropoff-location": {"en": "Dropoff Location", "ar": "نقطة الوصول"},
- "select-all": {"en": "Please select all fields", "ar": "يرجى تحديد جميع الحقول"},
+ "select-all": {
+ "en": "Please select all fields",
+ "ar": "يرجى تحديد جميع الحقول"
+ },
"select-map": {"en": "Select From Map", "ar": "حدد من الخريطة"},
- "no-appointment": {"en": "You don't have any appointments yet", "ar": "ليس لديك أي مواعيد حتى الآن"},
+ "no-appointment": {
+ "en": "You don't have any appointments yet",
+ "ar": "ليس لديك أي مواعيد حتى الآن"
+ },
"patient-share": {"en": "Amount before tax: ", "ar": "المبلغ قبل الضريبة:"},
"patient-share-tax": {"en": "Tax amount: ", "ar": "قيمة الضريبة:"},
- "patient-share-total": {"en": "Total amount payable: ", "ar": "المبلغ الإجمالي المستحق:"},
+ "patient-share-total": {
+ "en": "Total amount payable: ",
+ "ar": "المبلغ الإجمالي المستحق:"
+ },
"select-ambulate": {"en": "Select Ambulate", "ar": "بحاجة للتنقل بواسطة"},
"wheelchair": {"en": "Wheelchair", "ar": "كرسي متحرك"},
"walker": {"en": "Walker", "ar": "مشاية"},
@@ -897,28 +1253,57 @@ const Map localizedValues = {
"transport-method": {"en": "Transportation Method", "ar": "طريقة النقل"},
"directions": {"en": "Directions", "ar": "الاتجاهات"},
"info-my-appointments": {
- "en": "This service allows you to see all the appointment you have visited in Al Habib Medical Group, and through this service:",
- "ar": "خدمة مواعيدي: هذه الخدمة تمكنك من الاطلاع على جميع المواعيد التي قمت بزيارتهم في مجموعة الحبيب الطبية, كما تستطيع من خلال هذه الخدمة:"
+ "en":
+ "This service allows you to see all the appointment you have visited in Al Habib Medical Group, and through this service:",
+ "ar":
+ "خدمة مواعيدي: هذه الخدمة تمكنك من الاطلاع على جميع المواعيد التي قمت بزيارتهم في مجموعة الحبيب الطبية, كما تستطيع من خلال هذه الخدمة:"
},
"info-todo": {
- "en": "This service is designed to enable you to have a quick link to the list of tasks that need to be done",
- "ar": "هذه الخدمة تم تصميمها لتمكنك من الوصول الى رابط سريع لقائمة المهام التي يجب القيام بها"
+ "en":
+ "This service is designed to enable you to have a quick link to the list of tasks that need to be done",
+ "ar":
+ "هذه الخدمة تم تصميمها لتمكنك من الوصول الى رابط سريع لقائمة المهام التي يجب القيام بها"
},
"family-info": {
"en":
"Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.",
- "ar": "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي."
+ "ar":
+ "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي."
+ },
+ "update-succ": {
+ "en": "Successfully updated profile",
+ "ar": "تم تحديث البيانات بنجاح"
},
- "update-succ": {"en": "Successfully updated profile", "ar": "تم تحديث البيانات بنجاح"},
"dental-complains": {"en": "Symptoms", "ar": "الأعراض"},
- "empty-result": {"en": "There is no search results found", "ar": "لايوجد نتائج"},
+ "empty-result": {
+ "en": "There is no search results found",
+ "ar": "لايوجد نتائج"
+ },
- "no-booked-appointment": {"en": "No booked appointments", "ar": "لا يوجد مواعيد محجوزة"},
- "no-confirmed-appointment": {"en": "No confirmed appointments", "ar": "لا توجد مواعيد مؤكدة"},
- "no-arrived-appointment": {"en": "No arrived appointments", "ar": "لا يوجد مواعيد"},
- "upcoming-empty": {"en": "You do not have any Todo actions yet.", "ar": "ليس لديك أي إجراءات الآن."},
- "upcoming-timeLeft": {"en": "time left for appointment", "ar": "الوقت المتبقي للموعد"},
- "covid-test-all-services": {"en": "Covid-19 Drive-Thru Test", "ar": "فحص كورونا من داخل السيارة"},
+ "no-booked-appointment": {
+ "en": "No booked appointments",
+ "ar": "لا يوجد مواعيد محجوزة"
+ },
+ "no-confirmed-appointment": {
+ "en": "No confirmed appointments",
+ "ar": "لا توجد مواعيد مؤكدة"
+ },
+ "no-arrived-appointment": {
+ "en": "No arrived appointments",
+ "ar": "لا يوجد مواعيد"
+ },
+ "upcoming-empty": {
+ "en": "You do not have any Todo actions yet.",
+ "ar": "ليس لديك أي إجراءات الآن."
+ },
+ "upcoming-timeLeft": {
+ "en": "time left for appointment",
+ "ar": "الوقت المتبقي للموعد"
+ },
+ "covid-test-all-services": {
+ "en": "Covid-19 Drive-Thru Test",
+ "ar": "فحص كورونا من داخل السيارة"
+ },
"pharmacy": {"en": "Pharmacy", "ar": "الصيدلية"},
"ereferral": {"en": "E-Referral", "ar": "طلب التحويل"},
"child-vaccine": {"en": "Child Vaccines", "ar": "تطعيمات الأطفال"},
@@ -941,7 +1326,10 @@ const Map localizedValues = {
"ready": {"en": "Ready", "ar": "جاهز"},
"completed": {"en": "Completed", "ar": "مكتمل"},
- "request-medical-report": {"en": "Request medical report", "ar": "طلب تقرير طبي"},
+ "request-medical-report": {
+ "en": "Request medical report",
+ "ar": "طلب تقرير طبي"
+ },
"insur-cards": {"en": "Insurance Cards", "ar": "بطاقات التأمين"},
'labResult': {"en": "Lab results", "ar": "نتائج التحاليل المخبرية"},
'details': {'en': 'Details', 'ar': 'التفاصيل'},
@@ -951,37 +1339,76 @@ const Map localizedValues = {
"card-detail": {"en": "Insurance Details", "ar": "منافعك التامينية"},
"Dr": {"en": "Dr. ", "ar": "الدكتور."},
"empty": {"en": "You do not have any records.", "ar": "ليس لديك أي سجلات"},
- "last-visit": {"en": "How was your last visit with doctor?", "ar": "كيف تقيم زيارتك الأخيرة للطبيب؟"},
+ "last-visit": {
+ "en": "How was your last visit with doctor?",
+ "ar": "كيف تقيم زيارتك الأخيرة للطبيب؟"
+ },
"tap-title": {"en": "Please rate the doctor", "ar": "يرجى تقييم الطبيب"},
"later": {"en": "Later", "ar": "لاحقاً"},
- "sendSuc": {"en": "A copy has been sent to the email", "ar": "تم إرسال نسخة إلى البريد الإلكتروني"},
+ "sendSuc": {
+ "en": "A copy has been sent to the email",
+ "ar": "تم إرسال نسخة إلى البريد الإلكتروني"
+ },
"instructions": {
- "en": "You can now talk directly to the appointments department by chat or request a call back",
- "ar": "يمكنك الان التحدث مباشرة مع قسم المواعيد عن طريق خدمة المحادثة النصية أو طلب معاودة الاتصال"
+ "en":
+ "You can now talk directly to the appointments department by chat or request a call back",
+ "ar":
+ "يمكنك الان التحدث مباشرة مع قسم المواعيد عن طريق خدمة المحادثة النصية أو طلب معاودة الاتصال"
},
"instructions-pharmacies": {
- "en": "You can now talk directly to the pharmacist by chat or request a call back",
- "ar": "يمكنك الآن التحدث مباشرة إلى الصيدلي عن طريق الدردشة أو طلب معاودة الاتصال"
+ "en":
+ "You can now talk directly to the pharmacist by chat or request a call back",
+ "ar":
+ "يمكنك الآن التحدث مباشرة إلى الصيدلي عن طريق الدردشة أو طلب معاودة الاتصال"
},
"select-hospital": {"en": "Choose Hospital", "ar": "اختر المستشفى"},
"start": {"en": "Start", "ar": "ابدأ"},
"info-chat": {
- "en": "This service allows you to chat with customer service directly without the need to call.",
- "ar": "المحادثة المباشرة: هذه الخدمة تمكنك التحدث كتابياً مع خدمة العملاء مباشرة دون الحاجة الى الاتصال هاتفياً."
+ "en":
+ "This service allows you to chat with customer service directly without the need to call.",
+ "ar":
+ "المحادثة المباشرة: هذه الخدمة تمكنك التحدث كتابياً مع خدمة العملاء مباشرة دون الحاجة الى الاتصال هاتفياً."
+ },
+ "last-appointment": {
+ "en": "How was your appointment?",
+ "ar": "كيف كان موعدك الطبي ؟"
},
- "last-appointment": {"en": "How was your appointment?", "ar": "كيف كان موعدك الطبي ؟"},
"rate-clinic": {"en": "Please rate the clinic", "ar": "يرجى تقييم العيادة"},
"fetch-data": {"en": "Fetch Data", "ar": "تحديث الان"},
"rate": {"en": "Rate", "ar": "تقييم"},
- "send-email": {"en": "Send a copy of this report to the email", "ar": "أرسل نسخة من هذا التقرير إلى البريد الإلكتروني"},
- "update-email-msg": {"en": "Email updated", "ar": "تم تحديث البريد الالكتروني"},
+ "send-email": {
+ "en": "Send a copy of this report to the email",
+ "ar": "أرسل نسخة من هذا التقرير إلى البريد الإلكتروني"
+ },
+ "update-email-msg": {
+ "en": "Email updated",
+ "ar": "تم تحديث البريد الالكتروني"
+ },
"update-email": {"en": "Update Email", "ar": "تحديث البريد الالكتروني"},
- "booked-success": {"en": "The appointment has been successfully booked.", "ar": "لقد تم حجز الموعد بنجاح"},
- "appo-reminder-select-option-30": {"en": "Before 30 Mins", "ar": "قبل 30 دقيقة"},
- "appo-reminder-select-option-60": {"en": "Before 1 Hour", "ar": "قبل ساعة واحدة"},
- "appo-reminder-select-option-90": {"en": "Before 1 Hour and 30 mins", "ar": "قبل ساعة و 30 دقيقة"},
- "appo-reminder-select-option-120": {"en": "Before 2 Hours", "ar": "قبل ساعتين"},
- "noDataAvailable": {"en": "No data available", "ar": " لا يوجد بيانات متاحة "},
+ "booked-success": {
+ "en": "The appointment has been successfully booked.",
+ "ar": "لقد تم حجز الموعد بنجاح"
+ },
+ "appo-reminder-select-option-30": {
+ "en": "Before 30 Mins",
+ "ar": "قبل 30 دقيقة"
+ },
+ "appo-reminder-select-option-60": {
+ "en": "Before 1 Hour",
+ "ar": "قبل ساعة واحدة"
+ },
+ "appo-reminder-select-option-90": {
+ "en": "Before 1 Hour and 30 mins",
+ "ar": "قبل ساعة و 30 دقيقة"
+ },
+ "appo-reminder-select-option-120": {
+ "en": "Before 2 Hours",
+ "ar": "قبل ساعتين"
+ },
+ "noDataAvailable": {
+ "en": "No data available",
+ "ar": " لا يوجد بيانات متاحة "
+ },
"thename": {"en": "The Name", "ar": "الاسم"},
"noSearchResult": {"en": "No Search Result", "ar": "لا توجد نتيجة بحث"},
"selectFileSouse": {"en": "Select file souse", "ar": "حدد الملف"},
@@ -990,35 +1417,60 @@ const Map localizedValues = {
"med-report": {"en": "Medical Reports", "ar": "التقارير الطبية"},
"new-med-report": {"en": "Requests", "ar": "الطلبات"},
"requestReport": {"en": "Request a report", "ar": " طلب تقرير"},
- "confirm-msg-report": {"en": "Request for medical report?", "ar": "طلب تقرير طبي؟"},
- "successSendReport": {"en": "The request has been submitted successfully", "ar": "تم تنفيذ طلبك بنجاح"},
+ "confirm-msg-report": {
+ "en": "Request for medical report?",
+ "ar": "طلب تقرير طبي؟"
+ },
+ "successSendReport": {
+ "en": "The request has been submitted successfully",
+ "ar": "تم تنفيذ طلبك بنجاح"
+ },
"pulseTitle": {"en": "Heart rate", "ar": "معدل النبض بالدقيقة"},
"systolic-lng": {"en": "Systolic", "ar": "الإنقباض"},
"diastolic-lng": {"en": "Diastolic", "ar": "الإنبساط"},
"policy-holder": {"en": "Policy Holder", "ar": "حامل بطاقة التأمين"},
"policy-no": {"en": "Policy Number", "ar": "رقم سياسات"},
- "agree": {"en": "I agree, this is the correct information", "ar": "موافق، هذه المعلومات صحيحة"},
- "disagree": {"en": "No, this is not the correct information", "ar": "غير موافق، هذه المعلومات غير الصحيحة"},
+ "agree": {
+ "en": "I agree, this is the correct information",
+ "ar": "موافق، هذه المعلومات صحيحة"
+ },
+ "disagree": {
+ "en": "No, this is not the correct information",
+ "ar": "غير موافق، هذه المعلومات غير الصحيحة"
+ },
"expiry-date": {"en": "Expiry Date", "ar": "تاريخ انتهاء الصلاحية"},
"class": {"en": "Class", "ar": "فئة"},
"approval": {"en": "Approval", "ar": "موافقة"},
"no-data": {"en": "No data found", "ar": "لاتوجد بيانات"},
"insurance-details": {"en": "Insurance Details", "ar": "تفاصيل التأمين"},
"nearest-hospital": {"en": "Nearest Hospital", "ar": "أقرب مستشفى"},
- "request-sent": {"en": "Request sent successfully", "ar": "تم إرسال الطلب بنجاح"},
- "message-sent": {"en": "Message sent successfully", "ar": "تم إرسال الرسالة بنجاح"},
+ "request-sent": {
+ "en": "Request sent successfully",
+ "ar": "تم إرسال الطلب بنجاح"
+ },
+ "message-sent": {
+ "en": "Message sent successfully",
+ "ar": "تم إرسال الرسالة بنجاح"
+ },
"sent-on": {"en": "Sent on", "ar": "أرسلت في"},
- "attach-insurace-image": {"en": "Attach insurance card image", "ar": "إرفاق صورة بطاقة التأمين"},
+ "attach-insurace-image": {
+ "en": "Attach insurance card image",
+ "ar": "إرفاق صورة بطاقة التأمين"
+ },
"upload-without-image": {
"en": "You can still submit, if you don't have Insurance Image",
"ar": "لا يزال بإمكانك الإرسال ، إذا لم يكن لديك صورة تأمين"
},
"info-insur-cards": {
- "en": "This service allows you to view all the insurance cards that recorded during your visits to Al Habib Medical Group in addition to:",
+ "en":
+ "This service allows you to view all the insurance cards that recorded during your visits to Al Habib Medical Group in addition to:",
"ar":
"خدمة بطاقات التامين: هذه الخدمة تمكنك من الاطلاع على جميع بطاقات التامين والتي تم تسجيلها اثناء زياراتك لمجموعة الحبيب الطبية بالاضافة الى:"
},
- "scan-now": {"en": "If you have a card / Document Scan now", "ar": "إذا كانت لديك بطاقة / مستند ارفقها الان"},
+ "scan-now": {
+ "en": "If you have a card / Document Scan now",
+ "ar": "إذا كانت لديك بطاقة / مستند ارفقها الان"
+ },
"liveCare": {"en": "Live Care", "ar": "لايف كير"},
"topBrands": {"en": "Top Brands", "ar": "اعلى العلامات التجارية"},
@@ -1027,13 +1479,16 @@ const Map localizedValues = {
"availability": {"en": "Availability", "ar": "التوفر"},
+ "vaccination": {"en": "Vaccination", "ar": "جدول التطعيمات"},
+ "welcomeBack": {"en": "Welcome back", "ar": "مرحبا مرة أخرى"},
"quantitySize": {"en": "Quantity", "ar": "كميه"},
"addToCart": {"en": "add to cart", "ar": "إضفة للسلة"},
"buyNow": {"en": "buy now", "ar": "إشتري الان"},
"quantityShortcut": {"en": "QTY", "ar": "كمية"},
"pharmacyServiceTermsCondition": {
- "en": "I agree with the terms of service and I adhere to them unconditionally",
+ "en":
+ "I agree with the terms of service and I adhere to them unconditionally",
"ar": " أوافق على شروط الخدمة وألتزم بها دون قيد أو شرط"
},
"Year": {"en": "YEAR", "ar": "السنة"},
@@ -1043,6 +1498,16 @@ const Map localizedValues = {
"termOfService": {"en": "Terms of service", "ar": "شروط الخدمة"},
"shoppingCart": {"en": "Shopping Cart", "ar": "عربة التسوق"},
+ "add-child": {"en": "Add New Child", "ar": "اضافة طفل"},
+ "child-name": {"en": "Child Name", "ar": "اسم الطفل"},
+ "childDob": {"en": "Birth Date", "ar": "تاريخ الولادة"},
+ "deleted-child-mes": {
+ "en":
+ "The request was successful. The children have removed from the vaccination schedule subscription service.",
+ "ar": "تم حذف الطفل بنجاح"
+ },
+ "deleted-child": {"en": "Delete child", "ar": "إالغاء الطفل"},
+ "visit": {"en": "Visit", "ar": "زيارة"},
"referralStatus": {"en": "Referral Status", "ar": "حالة الإحالة"},
"referralDate": {"en": "Referral Date", "ar": "تاريخ الإحالة"},
"patientName": {"en": "Patient Name", "ar": "اسم المريض"},
@@ -1054,32 +1519,90 @@ const Map localizedValues = {
"orderLocation": {"en": "Location", "ar": "الموقع"},
"selectService": {"en": "Select Service", "ar": "حدد الخدمة"},
"coveredService": {"en": "Covered Service : ", "ar": " الخدمات المغطاة : "},
- "selectedService": {"en": "Selected Service : ", "ar": " الخدمات المختارة : "},
- "cancelOrderMsg": {"en": "Are you sure!! want to cancel this order", "ar": "هل أنت واثق!! تريد إلغاء هذا الطلب"},
- "processDoneSuccessfully": {"en": "Process Done Successfully", "ar": "تمت العملية بنجاح"},
- "selectHomeHealthCareServices": {"en": "Select Home Health Care Services", "ar": " حدد خدمات الرعاية الصحية المنزلية"},
+ "selectedService": {
+ "en": "Selected Service : ",
+ "ar": " الخدمات المختارة : "
+ },
+ "cancelOrderMsg": {
+ "en": "Are you sure!! want to cancel this order",
+ "ar": "هل أنت واثق!! تريد إلغاء هذا الطلب"
+ },
+ "processDoneSuccessfully": {
+ "en": "Process Done Successfully",
+ "ar": "تمت العملية بنجاح"
+ },
+ "selectHomeHealthCareServices": {
+ "en": "Select Home Health Care Services",
+ "ar": " حدد خدمات الرعاية الصحية المنزلية"
+ },
"description-vaccination": {"en": "Description", "ar": "وصف"},
"due-date": {"en": "Due date", "ar": "تاريخ الاستحقاق"},
- "valid-email": {"en": "Please enter valid email", "ar": "الرجاء إدخال عنوان بريد صحيح"},
- "confirm-send": {"en": "Send the child's schedule to the email?", "ar": "ارسال جدول التطعيمات الى بريدك الالكتروني؟"},
- "vaccination": {"en": "Vaccination", "ar": "جدول التطعيمات"},
- "welcomeBack": {"en": "Welcome back", "ar": "مرحبا مرة أخرى"},
+ "valid-email": {
+ "en": "Please enter valid email",
+ "ar": "الرجاء إدخال عنوان بريد صحيح"
+ },
+ "confirm-send": {
+ "en": "Send the child's schedule to the email?",
+ "ar": "ارسال جدول التطعيمات الى بريدك الالكتروني؟"
+ },
+ "email-success": {
+ "en":
+ " The request was successful. You will receive the Schedule in moments.",
+ "ar": "تم ارسال جدول التطعيمات "
+ },
+ "add-instructions": {
+ "en":
+ "Add the child's information below to recieve the schedule of vaccinations.",
+ "ar": "أضف معلومات الطفل لاستلام جدول التطعيمات"
+ },
+ "added-child": {
+ "en":
+ "The request was successful. You have added a child to the vaccination schedule subscription service.",
+ "ar": "تمت الاضافة بنجاح."
+ },
+ "appUpdate": {"en": "UPDATE THE APP", "ar": "تحديث التطبيق"},
+ "ereferralSaveSuccess": {
+ "en":
+ "The referral request has been submitted successfully, you will be contacted ASAP to complete the process. Referral request no is ",
+ "ar":
+ " تم إرسال طلب الإحالة بنجاح ، وسيتم الاتصال بك في أسرع وقت ممكن لإكمال العملية. رقم طلب الإحالة"
+ },
- "updated-email": {"en": "Updated email successfully", "ar": "تم تحديث البريد الالكتروني"},
+ "help": {"en": "Help", "ar": "مساعدة"},
- "view-list-children": {"en": "View List of Children", "ar": "عرض قائمة الأطفال"},
- "trackDeliveryDriver": {"en": "Track Delivery Driver", "ar": "trackDeliveryDriver"},
+ "habibRobotText": {
+ "en":
+ "Hi, This is HABIB, your personal assistant. I'm here to assist you by voice commands. How can I help?",
+ "ar": "مرحباً ، معك حبيب مساعدك الشخصي. أنا هنا لمساعدتك بالأوامر الصوتية."
+ },
+ "updated-email": {
+ "en": "Updated email successfully",
+ "ar": "تم تحديث البريد الالكتروني"
+ },
+
+ "view-list-children": {
+ "en": "View List of Children",
+ "ar": "عرض قائمة الأطفال"
+ },
"covidTest": {"en": "COVID-19 TEST", "ar": "فحص كورونا"},
"driveThru": {"en": "Drive-Thru", "ar": "من السيارة"},
+ "trackDeliveryDriver": {
+ "en": "Track Delivery Driver",
+ "ar": "trackDeliveryDriver"
+ },
+
"NearestErDesc": {
- "en": "\nThis service Displays nearest branch\n among all the branches of All Habib \n medical Group based on your current Location",
- "ar": "\nتعرض هذه الخدمة أقرب فرع\n من بين جميع فروع مجموعة \nالحبيب الطبية بناءً على موقعك الحالي."
+ "en":
+ "\nThis service Displays nearest branch\n among all the branches of All Habib \n medical Group based on your current Location",
+ "ar":
+ "\nتعرض هذه الخدمة أقرب فرع\n من بين جميع فروع مجموعة \nالحبيب الطبية بناءً على موقعك الحالي."
},
"NearestEr": {"en": "Nearest ER", "ar": "أقرب ER"},
"infoCMC": {
"en":
"Through this service, you can request a set of tests that help you and your doctor to understand the current health condition and then identify potential risks.",
- "ar": "من خلال هذه الخدمة يمكنك طلب مجموعة من الفحوصات التي تساعدك وتساعد طبيبك في فهم حالتك الصحية الحالية ومن ثم تحديد المخاطر المحتملة"
+ "ar":
+ "من خلال هذه الخدمة يمكنك طلب مجموعة من الفحوصات التي تساعدك وتساعد طبيبك في فهم حالتك الصحية الحالية ومن ثم تحديد المخاطر المحتملة"
},
"instructionAgree": {
"en":
@@ -1091,22 +1614,35 @@ const Map localizedValues = {
"RRT-orders-log": {"en": "Orders Log", "ar": "سجل الطلبات"},
"blood-sugar": {"en": "Blood Sugar", "ar": "سكر الدم"},
- "covid19_driveThrueTest": {"en": "'Covid-19- Drive-Thru Test'", "ar": "Covid-19- الفحص من خلال القيادة"},
+ "covid19_driveThrueTest": {
+ "en": "'Covid-19- Drive-Thru Test'",
+ "ar": "Covid-19- الفحص من خلال القيادة"
+ },
"E-Referral": {"en": "'E-Referral'", "ar": "الإحالة الإلكترونية"},
"childName": {"en": "'CHILD NAME'", "ar": "إسم الطفل"},
"recordDeleted": {"en": "'Record Deleted'", "ar": "تم حذف السجل"},
"msg_email_address_up_to_date": {
- "en": "Please ensure that the email address is up-to-date and process to view the schedule",
- "ar": "يرجى التأكد من أن عنوان البريد الإلكتروني محدث وأن العملية لعرض الجدول الزمني"
+ "en":
+ "Please ensure that the email address is up-to-date and process to view the schedule",
+ "ar":
+ "يرجى التأكد من أن عنوان البريد الإلكتروني محدث وأن العملية لعرض الجدول الزمني"
},
"add-new-child": {"en": "ADD NEW CHILD", "ar": "إضافة طفل جديد"},
- "visit": {"en": "Visit", "ar": "الزيارة"},
- "send-child-email-msg": {"en": "Send the child's schedule to the email", "ar": "أرسل جدول الطفل إلى البريد الإلكتروني"},
+
+ "send-child-email-msg": {
+ "en": "Send the child's schedule to the email",
+ "ar": "أرسل جدول الطفل إلى البريد الإلكتروني"
+ },
+
"vaccination-add-child-msg": {
- "en": "Add the child's information below to receive the schedule of vaccinations.",
+ "en":
+ "Add the child's information below to receive the schedule of vaccinations.",
"ar": "أضف معلومات الطفل أدناه للحصول على جدول التطعيمات."
},
- "child_added_successfully": {"en": "Child added successfully", "ar": "تمت إضافة الطفل بنجاح"},
+ "child_added_successfully": {
+ "en": "Child added successfully",
+ "ar": "تمت إضافة الطفل بنجاح"
+ },
"bloodSugar": {"en": "Blood", "ar": "السكر في الدم"},
"sugar": {"en": "Sugar", "ar": ""},
"bloodCholesterol": {"en": "Blood", "ar": " الكولسترول في الدم"},
@@ -1119,18 +1655,26 @@ const Map localizedValues = {
"calculate": {"en": "calculate", "ar": "حساب"},
"enterReadingValue": {"en": "Enter the reading value", "ar": "ادخل القيمة"},
"result": {"en": "Result", "ar": "النتيجة"},
- "bloodSugarConversion": {"en": "Blood Sugar Conversion", "ar": "السكر في الدم"},
+ "sort": {"en": "Sort", "ar": "فرز"},
+ "bloodSugarConversion": {
+ "en": "Blood Sugar Conversion",
+ "ar": "السكر في الدم"
+ },
"convertBloodSugarStatement": {
- "en": "Convert blood sugar/glucose from mmol/l (UK standard) to mg/dlt (US standard) and vice versa.",
- "ar": "تحويل مستوى السكر في الدم من مليمول/ لتر (مقياس المملكة المتحدة) الى ملغ/ ديسيلتر (مقياس الولايات المتحدة) والعكس"
+ "en":
+ "Convert blood sugar/glucose from mmol/l (UK standard) to mg/dlt (US standard) and vice versa.",
+ "ar":
+ "تحويل مستوى السكر في الدم من مليمول/ لتر (مقياس المملكة المتحدة) الى ملغ/ ديسيلتر (مقياس الولايات المتحدة) والعكس"
},
"convertCholesterolStatement": {
"en": "Convert blood cholesterol from\n mmol/l to mg/dlt and vice versa.",
- "ar": "تحويل مستوى الكولسترول في الدم من مليمول/ لتر (مقياس المملكة المتحدة) الى ملغ/ ديسيلتر (مقياس الولايات المتحدة) والعكس"
+ "ar":
+ "تحويل مستوى الكولسترول في الدم من مليمول/ لتر (مقياس المملكة المتحدة) الى ملغ/ ديسيلتر (مقياس الولايات المتحدة) والعكس"
},
"triglyceridesConvertStatement": {
"en": "Convert Triglycerides from mmol/l to mg/dlt and vice versa.",
- "ar": "تحويل مستوى الدهون الثلاثية في الدم من مليمول/ لتر (مقياس المملكة المتحدة) الى ملغ/ ديسيلتر (مقياس الولايات المتحدة) والعكس"
+ "ar":
+ "تحويل مستوى الدهون الثلاثية في الدم من مليمول/ لتر (مقياس المملكة المتحدة) الى ملغ/ ديسيلتر (مقياس الولايات المتحدة) والعكس"
},
"my-tracker": {"en": "My Tracker", "ar": "قراءاتي"},
"weekly": {"en": "Weekly", "ar": "أسبوعي"},
@@ -1143,7 +1687,8 @@ const Map localizedValues = {
"measure-time": {"en": "Measure time", "ar": "وقت القياس"},
"update": {"en": "Update", "ar": "تعديل"},
"bloodD-enter-desc": {
- "en": "Enter the required information, In order to register for Blood Donation Service",
+ "en":
+ "Enter the required information, In order to register for Blood Donation Service",
"ar": "أدخل المعلومات المطلوبة ، للتسجيل في خدمة التبرع بالدم"
},
"viewTermsConditions": {
@@ -1154,10 +1699,9 @@ const Map localizedValues = {
"en": "Hospital Visit Appointment",
"ar": "موعد زيارة للمستشفى"
},
- "videoAppo": {
- "en": "Video Call Appointment",
- "ar": "موعد اتصال فيديو"
- },
+
+ "videoAppo": {"en": "Video Call Appointment", "ar": "موعد اتصال فيديو"},
+
"generalHealth": {"en": "General Health", "ar": "صحة عامة"},
"womanHealth": {"en": "Women's Health", "ar": "صحة المرأة"},
"bmi": {"en": "BMI", "ar": "الكتلة"},
@@ -1185,16 +1729,49 @@ const Map localizedValues = {
"overWeight": {"en": "OverWeight", "ar": "وزن زائد"},
"healthy": {"en": "Healthy", "ar": "صحي"},
"underWeight": {"en": "UnderWeight", "ar": "نقص الوزن"},
- "bmiCalcMsgObese": {"en" : "A BMI of over 30 indicates that are heavily overweight. Health may be at risk if not lose weight. Recommended talking to a doctor or a dietician for advice. To book an appointment, click below to get started.", "ar": "يشير مؤشر كتلة الجسم الذي يزيد عن 30 إلى زيادة الوزن بشكل كبير. قد تكون الصحة في خطر إذا لم تفقد الوزن. يوصى بالتحدث إلى الطبيب أو أخصائي التغذية للحصول على المشورة. لحجز موعد ، انقر أدناه للبدء."},
- "bmiCalcMsgOverweight": {"en" : 'A BMI of 25 - 30 indicates that are slightly overweight. May be advised to lose some weight for health reasons. Recommended talking to a doctor or a dietician for advice. To book an appointment, click below to get ', "ar": "يشير مؤشر كتلة الجسم من 25 إلى 30 إلى زيادة الوزن قليلاً. قد ينصح بفقدان بعض الوزن لأسباب صحية. يوصى بالتحدث إلى الطبيب أو أخصائي التغذية للحصول على المشورة. لحجز موعد ، انقر أدناه للحصول على"},
- "bmiCalcMsgHealthy": {"en" : "A BMI of 18.5 - 25 indicates that are at a healthy weight for the height. By maintaining a healthy weight, lower the risk of developing severe health problems. To book an appointment, click below to get started.", "ar": "يشير مؤشر كتلة الجسم من 18.5 - 25 إلى وزن صحي بالنسبة للطول. بالحفاظ على وزن صحي ، قلل من خطر الإصابة بمشاكل صحية خطيرة. لحجز موعد ، انقر أدناه للبدء."},
- "bmiCalcMsgUnderWeight": {"en" : "A BMI of less than 18.5 indicates that are underweight, so may need to put on some weight. Recommended talking to a doctor or a dietician for advice. To book an appointment, click below to get started.", "ar": "يشير مؤشر كتلة الجسم الذي يقل عن 18.5 إلى أنك تعاني من نقص الوزن ، لذلك قد تحتاج إلى زيادة الوزن. يوصى بالتحدث إلى الطبيب أو أخصائي التغذية للحصول على المشورة. لحجز موعد ، انقر أدناه للبدء."},
- "bariatrics": {"en" : "Bariatrics", "ar": "طب السمنة"},
- "bariatricsHeaderMsg": {"en" : "Choose one of the following symptoms to show the right doctors or choose a consultation to show all", "ar": "اختر أحد الأعراض التالية لتظهر للأطباء المناسبين أو اختر استشارة لإظهار الكل"},
- "continue": {"en" : "CONTINUE", "ar": "إستمرار"},
- "skip": {"en" : "SKIP", "ar": "تخطى"},
- "calorieCalcDesc": {"en" : "Calculates daily calorie intake based on several factors, like height, weight, age, gender and daily physical activity ", "ar": "يحسب السعرات الحرارية اليومية بناءً على عدة عوامل ، مثل الطول والوزن والعمر والجنس والنشاط البدني اليومي"},
- "age11_120_years": {"en" : "The Age ( 11 - 120 ) yrs", "ar": "العمر (11 - 120) سنة"},
+ "bmiCalcMsgObese": {
+ "en":
+ "A BMI of over 30 indicates that are heavily overweight. Health may be at risk if not lose weight. Recommended talking to a doctor or a dietician for advice. To book an appointment, click below to get started.",
+ "ar":
+ "يشير مؤشر كتلة الجسم الذي يزيد عن 30 إلى زيادة الوزن بشكل كبير. قد تكون الصحة في خطر إذا لم تفقد الوزن. يوصى بالتحدث إلى الطبيب أو أخصائي التغذية للحصول على المشورة. لحجز موعد ، انقر أدناه للبدء."
+ },
+ "bmiCalcMsgOverweight": {
+ "en":
+ 'A BMI of 25 - 30 indicates that are slightly overweight. May be advised to lose some weight for health reasons. Recommended talking to a doctor or a dietician for advice. To book an appointment, click below to get ',
+ "ar":
+ "يشير مؤشر كتلة الجسم من 25 إلى 30 إلى زيادة الوزن قليلاً. قد ينصح بفقدان بعض الوزن لأسباب صحية. يوصى بالتحدث إلى الطبيب أو أخصائي التغذية للحصول على المشورة. لحجز موعد ، انقر أدناه للحصول على"
+ },
+ "bmiCalcMsgHealthy": {
+ "en":
+ "A BMI of 18.5 - 25 indicates that are at a healthy weight for the height. By maintaining a healthy weight, lower the risk of developing severe health problems. To book an appointment, click below to get started.",
+ "ar":
+ "يشير مؤشر كتلة الجسم من 18.5 - 25 إلى وزن صحي بالنسبة للطول. بالحفاظ على وزن صحي ، قلل من خطر الإصابة بمشاكل صحية خطيرة. لحجز موعد ، انقر أدناه للبدء."
+ },
+ "bmiCalcMsgUnderWeight": {
+ "en":
+ "A BMI of less than 18.5 indicates that are underweight, so may need to put on some weight. Recommended talking to a doctor or a dietician for advice. To book an appointment, click below to get started.",
+ "ar":
+ "يشير مؤشر كتلة الجسم الذي يقل عن 18.5 إلى أنك تعاني من نقص الوزن ، لذلك قد تحتاج إلى زيادة الوزن. يوصى بالتحدث إلى الطبيب أو أخصائي التغذية للحصول على المشورة. لحجز موعد ، انقر أدناه للبدء."
+ },
+ "bariatrics": {"en": "Bariatrics", "ar": "طب السمنة"},
+ "bariatricsHeaderMsg": {
+ "en":
+ "Choose one of the following symptoms to show the right doctors or choose a consultation to show all",
+ "ar":
+ "اختر أحد الأعراض التالية لتظهر للأطباء المناسبين أو اختر استشارة لإظهار الكل"
+ },
+ "continue": {"en": "CONTINUE", "ar": "إستمرار"},
+ "skip": {"en": "SKIP", "ar": "تخطى"},
+ "calorieCalcDesc": {
+ "en":
+ "Calculates daily calorie intake based on several factors, like height, weight, age, gender and daily physical activity ",
+ "ar":
+ "يحسب السعرات الحرارية اليومية بناءً على عدة عوامل ، مثل الطول والوزن والعمر والجنس والنشاط البدني اليومي"
+ },
+ "age11_120_years": {
+ "en": "The Age ( 11 - 120 ) yrs",
+ "ar": "العمر (11 - 120) سنة"
+ },
"weight-add": {"en": "Enter Weight Value", "ar": "أدخل الوزن "},
"systolic-add": {"en": "Enter Systolic Value", "ar": "أدخل قيمة الإنقباض "},
"diastolic-add": {"en": "Enter Diastolic Value", "ar": "أدخل قيمة الإنبساط "},
@@ -1202,18 +1779,30 @@ const Map localizedValues = {
"today": {"en": "Today", "ar": "اليوم"},
"week": {"en": "Week", "ar": "أسبوع"},
"month": {"en": "Month", "ar": "شهر"},
- "h2o-amount-of-water": {"en": "Enter the amount of water:", "ar": "ادخل كمية الماء:"},
+ "h2o-amount-of-water": {
+ "en": "Enter the amount of water:",
+ "ar": "ادخل كمية الماء:"
+ },
"update-user": {"en": "Update Information", "ar": "تحديث بيانات"},
"editname": {"en": "Enter the name here", "ar": "أدخل الاسم هنا"},
"activity-level": {"en": "Activity Level", "ar": "مستوى النشاط"},
"light-active": {"en": "Lightly Active", "ar": " قليل النشاط"},
"mod-active": {"en": "Moderately Active", "ar": "متوسط النشاط"},
- "reminder-label": {"en": "Activate the reminder of drink water?", "ar": "تفعيل خاصية تذكير شرب الماء؟"},
- "reminder-times-label": {"en": "How many times do you want to be reminded?", "ar": "عدد مرات التذكير"},
+ "reminder-label": {
+ "en": "Activate the reminder of drink water?",
+ "ar": "تفعيل خاصية تذكير شرب الماء؟"
+ },
+ "reminder-times-label": {
+ "en": "How many times do you want to be reminded?",
+ "ar": "عدد مرات التذكير"
+ },
"times": {"en": "Times", "ar": "مرات"},
"WaterCalculate": {"en": "Save", "ar": "حفظ"},
"notif-title": {"en": "Water Reminder", "ar": "تذكير"},
- "notif-text": {"en": " Don't forget to drink water.", "ar": "لا تنسى شرب الماء"},
+ "notif-text": {
+ "en": " Don't forget to drink water.",
+ "ar": "لا تنسى شرب الماء"
+ },
"custom": {"en": "Custom", "ar": "خاص"},
"undo": {"en": "Undo", "ar": "تراجع"},
"drinking": {"en": "Drinkning", "ar": "الشرب"},
@@ -1222,28 +1811,50 @@ const Map localizedValues = {
"ml": {"en": "ml", "ar": "مل"},
"l": {"en": "L", "ar": "لتر"},
"custom-label": {"en": "Enter amount", "ar": "أدخل كمية الماء"},
- "custom-label-in-litres": {"en": "Enter amount in liters", "ar": "أدخل الكمية باللتر"},
- "custom-label-in-mililitres": {"en": "Enter amount in millilitres", "ar": "أدخل الكمية بالملليتر"},
+ "custom-label-in-litres": {
+ "en": "Enter amount in liters",
+ "ar": "أدخل الكمية باللتر"
+ },
+ "custom-label-in-mililitres": {
+ "en": "Enter amount in millilitres",
+ "ar": "أدخل الكمية بالملليتر"
+ },
"amount": {"en": "Amount", "ar": "الكمية"},
- "target-reach": {"en": "You have reached the target for the day!", "ar": "لقد حققت هدفك اليومي! مبروك"},
- "week-header": {"en": "Water consumed in a week", "ar": "معدل شرب الماء خلال الاسبوع"},
- "month-header": {"en": "Water consumed in a month", "ar": "معدل شرب الماء خلال الشهر"},
- "notif-permission-title": {"en": "Could not set the water reminders", "ar": "لا يمكن ضبط اشعار شرب الماء"},
+ "target-reach": {
+ "en": "You have reached the target for the day!",
+ "ar": "لقد حققت هدفك اليومي! مبروك"
+ },
+ "week-header": {
+ "en": "Water consumed in a week",
+ "ar": "معدل شرب الماء خلال الاسبوع"
+ },
+ "month-header": {
+ "en": "Water consumed in a month",
+ "ar": "معدل شرب الماء خلال الشهر"
+ },
+ "notif-permission-title": {
+ "en": "Could not set the water reminders",
+ "ar": "لا يمكن ضبط اشعار شرب الماء"
+ },
"notif-permission-msg": {
- "en": "To recieve water reminders, please turn on notifications in the system settings",
+ "en":
+ "To recieve water reminders, please turn on notifications in the system settings",
"ar": "الرجاء تفعيل الاشعارات في الاعدادات"
},
- "select-location": {
- "en": "Select Location",
- "ar": "اختر موقعا"
+ "verification_message_code": {
+ "en": "Please enter verification code",
+ "ar": "الرجاء إدخال رمز التحقق"
},
+ "select-location": {"en": "Select Location", "ar": "اختر موقعا"},
"result-header": {
"en": "Get The Result During 8 Hours",
"ar": "احصل على النتيجة خلال 8 ساعة"
},
"covid-info": {
- "en": "We are using the advance technology to test COVID-19, The sample for examination is taking between the nose and mouth (nasopharyngeal swab), the examination is done by ELITE In Genius of the company ELITECH GROUP MOLECULAR DIAGNOSTICS, Note that the device belongs to an Italian company and is manufactured in Japan with RC- PCR",
- "ar": "يتوفر لدينا أحدث جهاز خاص بفحص مرض الكورونا (COVID-19) طريقة الفحص تؤخذ مسحة من البلعوم الأنفي ( عن طريف الأنف) ويتم الفحص بواسطة جهاز ELITE In Genius التابع لشركة ELITECH GROUP MOLECULAR DIAGNOSTICS علما بأن الجهاز تابع لشركة إيطالية ومصنع في اليابان بتقينة RC-PCR"
+ "en":
+ "We are using the advance technology to test COVID-19, The sample for examination is taking between the nose and mouth (nasopharyngeal swab), the examination is done by ELITE In Genius of the company ELITECH GROUP MOLECULAR DIAGNOSTICS, Note that the device belongs to an Italian company and is manufactured in Japan with RC- PCR",
+ "ar":
+ "يتوفر لدينا أحدث جهاز خاص بفحص مرض الكورونا (COVID-19) طريقة الفحص تؤخذ مسحة من البلعوم الأنفي ( عن طريف الأنف) ويتم الفحص بواسطة جهاز ELITE In Genius التابع لشركة ELITECH GROUP MOLECULAR DIAGNOSTICS علما بأن الجهاز تابع لشركة إيطالية ومصنع في اليابان بتقينة RC-PCR"
},
"select-appo": {
"en": "Kindly select one of the available appointments from below:",
@@ -1254,48 +1865,32 @@ const Map localizedValues = {
"ar": "الرجاء اتمام عملية الدفع خلال 15 دقيقه لتاكيد الموعد"
},
"covid-alert-info": {
- "en": "Payment for Covid-19 Test should Be made with-in 15 mins otherwise The system will Cancel the Scheduled appointment automatically",
- "ar": "سيتم الغاء الموعد عن طريق النظام بشكل الي في حال عدم اتمام عمليه الدفع خلال 15 دقيقة"
- },
- "covid-alert-mins": {
- "en": "Pay With-in 15 mins",
- "ar": "ادفع خلال 15 دقيقة"
- },
- "back": {
- "en": "Back",
- "ar": "رجوع"
- },
- "get-directions": {
- "en": "Get Directions",
- "ar": "احصل على الاتجاهات"
- },
- "selected-location": {
- "en": "Selected Location:",
- "ar": "الموقع المحدد:"
- },
- "test-fee": {
- "en": "Test Fee",
- "ar": "رسوم الاختبار"
+ "en":
+ "Payment for Covid-19 Test should Be made with-in 15 mins otherwise The system will Cancel the Scheduled appointment automatically",
+ "ar":
+ "سيتم الغاء الموعد عن طريق النظام بشكل الي في حال عدم اتمام عمليه الدفع خلال 15 دقيقة"
},
+ "covid-alert-mins": {"en": "Pay With-in 15 mins", "ar": "ادفع خلال 15 دقيقة"},
+ "back": {"en": "Back", "ar": "رجوع"},
+ "get-directions": {"en": "Get Directions", "ar": "احصل على الاتجاهات"},
+ "selected-location": {"en": "Selected Location:", "ar": "الموقع المحدد:"},
+ "test-fee": {"en": "Test Fee", "ar": "رسوم الاختبار"},
"pay-options": {
"en": "You can pay by the following Options:",
"ar": "يمكنك الدفع عن طريق الخيارات التالية:"
},
- "livecare-service": {
- "en": "LiveCare Service",
- "ar": "خدمة لايف كير"
- },
+ "livecare-service": {"en": "LiveCare Service", "ar": "خدمة لايف كير"},
"livecare-service-desc": {
- "en": "is to obtain medical advice with a specialist doctor Via a video call",
+ "en":
+ "is to obtain medical advice with a specialist doctor Via a video call",
"ar": "هي الحصول على استشارة طبية مع طبيب مختص عن طريق اتصال فيديو"
},
- "why-livecare": {
- "en": "WHY LIVECARE",
- "ar": "لماذا خدمة اللايف كير"
- },
+ "why-livecare": {"en": "WHY LIVECARE", "ar": "لماذا خدمة اللايف كير"},
"livecare-point-1": {
- "en": "No need to wait you will get Medical consultation immediately via Video call",
- "ar": "لا داعي للانتظار سوف تحصل على الاستشارة الطبية فورا عن طريق مكالمة الفيديو"
+ "en":
+ "No need to wait you will get Medical consultation immediately via Video call",
+ "ar":
+ "لا داعي للانتظار سوف تحصل على الاستشارة الطبية فورا عن طريق مكالمة الفيديو"
},
"doc-virtual-appo-ins4": {
"en": "The doctor will see your medical file",
@@ -1306,36 +1901,98 @@ const Map localizedValues = {
"ar": "خدمة توصيل الادوية مجانا"
},
"livecare-summary": {
- "en": "** The service is included with some insurance companies according to the terms and conditions With our best wishes for health and wellness",
- "ar": "** الخدمة مشمولة لدى بعض شركات التامين على حسب الشروط والاحكام مع تمنياتنا لكم بدوام الصحة والعافية"
+ "en":
+ "** The service is included with some insurance companies according to the terms and conditions With our best wishes for health and wellness",
+ "ar":
+ "** الخدمة مشمولة لدى بعض شركات التامين على حسب الشروط والاحكام مع تمنياتنا لكم بدوام الصحة والعافية"
},
"livecare-option-1": {
"en": "Get Medical consultation immediately",
"ar": "الحصول على الاستشارة فورا"
},
- "livecare-option-2": {
- "en": "Instant video call",
- "ar": "اتصال فيديو فوري"
- },
- "livecare-option-3": {
- "en": "Book Appointment",
- "ar": "حجز موعد"
- },
- "livecare-option-4": {
- "en": "Schedule video call",
- "ar": "اتصال فيديو مجدول"
- },
- "verification_message_code": {"en": "Please enter verification code", "ar": "الرجاء إدخال رمز التحقق"},
+ "livecare-option-2": {"en": "Instant video call", "ar": "اتصال فيديو فوري"},
+ "livecare-option-3": {"en": "Book Appointment", "ar": "حجز موعد"},
+ "livecare-option-4": {"en": "Schedule video call", "ar": "اتصال فيديو مجدول"},
"sms_code": {"en": "Enter SMS Code here", "ar": "أدخل رمز التحقق هنا"},
- "code_failure": {"en": "Didn’t received the code", "ar": "لم أستلم رمز التحقق"},
+ "code_failure": {
+ "en": "Didn’t received the code",
+ "ar": "لم أستلم رمز التحقق"
+ },
"resend": {"en": "Resend", "ar": "إعادة إرسال"},
"submitncontinue": {"en": "Submit and continue", "ar": "إرسال ومتابعة"},
- "areyousure": {"en": "Are you sure you want to Add", "ar": "هل أنت متأكد أنك تريد إضافة"},
- "preferredunit": {"en": "Select the preferred unit", "ar": "اختر الوحدة المفضلة"},
+ "areyousure": {
+ "en": "Are you sure you want to Add",
+ "ar": "هل أنت متأكد أنك تريد إضافة"
+ },
+ "preferredunit": {
+ "en": "Select the preferred unit",
+ "ar": "اختر الوحدة المفضلة"
+ },
"select-unit": {"en": "Select unit", "ar": "اختر وحدة القياس"},
- "app-update": {
- "en": "UPDATE THE APP",
- "ar": "تحديث التطبيق"
+ "try-saying": {"en": "Try saying something", "ar": 'حاول قول شيء ما'},
+
+ "app-update": {"en": "UPDATE THE APP", "ar": "تحديث التطبيق"},
+ "covid-alert": {"en": "Alert", "ar": "تنبيه"},
+ "enterIdentificationNumber": {
+ "en": "Enter Identification Number",
+ "ar": "أدخل رقم التعريف"
+ },
+ "accountActivationDesc": {
+ "en":
+ "This service allows you to activate your LAKUM account after registering through the Vida system.",
+ "ar":
+ "تتيح لك هذه الخدمة تفعيل حساب LAKUM الخاص بك بعد التسجيل من خلال نظام Vida."
},
- // "visit": {"en" : "Visit", "ar": "الزيارة"},
+ "pointsToTransfer": {
+ "en": "Point's to Transfer :",
+ "ar": "النقاط المراد تحويلها:"
+ },
+ "enterBeneficiaryAccountNo": {
+ "en": "Enter Beneficiary Account No.",
+ "ar": "أدخل رقم حساب المستفيد"
+ },
+ "confirm-prescription": {
+ "en": "Are you sure !! you want to send this request",
+ "ar": "تاكيد ارسال الطلب؟"
+ },
+ "you-already-have-order": {
+ "en": "You already have this order! do you want to view it?",
+ "ar": "لديك هذا الطلب بالفعل! هل تريد مشاهدته؟"
+ },
+ "order-overview": {"en": "Order Overview", "ar": "ملخص الطلب"},
+ "shipping-address": {"en": "Delivery Address", "ar": "عنوان التوصيل"},
+ "pharmacy-relogin": {
+ "en": "Your session has timed out, Please try again",
+ "ar": "انتهت مهلة جلسة الخاص بها. يرجى المحاولة مرة أخرى"
+ },
+ "ancillary-orders": {"en": "Ancillary Orders", "ar": "الأوامر التبعية"},
+
+ "onlineCheckInAgreement": {
+ "en":
+ "The online check-in is for non-life threatening situationCall the red crescent (number) or go to the nearest emergency department if there are:signs of stroke or heart attack history of seizure or syncope there is limb or life threatening injury picture of severe injuries",
+ "ar":
+ "تسجيل الذهاب الى الطوارئ عبر الإنترنت هو فقط للحالات التي لا تهدد الحياة يجب الاتصل بالهلال الأحمر (رقم) أو الذهاب إلى أقرب قسم طوارئ إذا كان هناك علامات السكتة الدماغية أو النوبة القلبية او هناك نوبة تشنج او حالة فقدان الوعي او وجود إصابة تهدد أحد الأطراف او تهدد الحياة او وجود إصابات خطيرة"
+ },
+ "MRN": {"en": "MRN", "ar": "ایم آر این"},
+ "appointment-date": {"en": "Appointment Date", "ar": "تقرری کی تاریخ"},
+ "appointment-no": {"en": "Appointment No", "ar": "تقرری نمبر"},
+ "insurance-id": {"en": "Insurance ID", "ar": "انشورنس ID"},
+ "chiefComplaints": {"en": "Chief Complaints", "ar": "الشكوى الرئيسة"},
+ "errorChiefComplaints": {
+ "en": "Please Chief Complaints",
+ "ar": "يرجى ادخال الشكوى الرئيسة"
+ },
+ "errorExpectedArrivalTimes": {
+ "en": "Please Expected arrival time",
+ "ar": "يرجى ادخال الوقت المتوقع للوصول"
+ },
+ "expectedArrivalTime": {
+ "en": "Expected arrival time",
+ "ar": "الوقت المتوقع للوصول"
+ },
+ "add-address": {"en": "Add new address", "ar": "اضف عنوان جديد"},
+ "enter-file": {
+ "en": "Please enter the mobile number and the medical file number",
+ "ar": "الرجاء إدخال رقم الجوال ورقم الملف الطبي"
+ }
};
diff --git a/lib/config/shared_pref_kay.dart b/lib/config/shared_pref_kay.dart
index 0e56e30b..caada21f 100644
--- a/lib/config/shared_pref_kay.dart
+++ b/lib/config/shared_pref_kay.dart
@@ -20,8 +20,10 @@ const IS_VIBRATION = 'is_vibration';
const THEME_VALUE = 'is_vibration';
const MAIN_USER = 'main-user';
const PHARMACY_LAST_VISITED_PRODUCTS = 'last-visited';
-const HMG_GEOFENCES = 'hmg-geo-fences';
const PHARMACY_CUSTOMER_ID = 'costumer-id';
+const IS_ROBOT_VISIBLE = 'robot-visible';
+const IS_ROBOT_INIT = 'robot-init';
+const HMG_GEOFENCES = 'hmg-geo-fences';
const WEATHER = 'weather';
const BLOOD_TYPE = 'blood-type';
const NOTIFICATION_COUNT = 'notification-count';
diff --git a/lib/core/model/er/ErPatientShareModel.dart b/lib/core/model/er/ErPatientShareModel.dart
new file mode 100644
index 00000000..4c6a4165
--- /dev/null
+++ b/lib/core/model/er/ErPatientShareModel.dart
@@ -0,0 +1,92 @@
+class ErPatientShareModel {
+ int cashPrice;
+ int cashPriceTax;
+ int cashPriceWithTax;
+ int companyId;
+ String companyName;
+ int companyShareWithTax;
+ dynamic errCode;
+ int groupID;
+ dynamic insurancePolicyNo;
+ String message;
+ dynamic patientCardID;
+ double patientShare;
+ double patientShareWithTax;
+ double patientTaxAmount;
+ int policyId;
+ String policyName;
+ String procedureName;
+ dynamic setupID;
+ int statusCode;
+ dynamic subPolicyNo;
+
+ ErPatientShareModel(
+ {this.cashPrice,
+ this.cashPriceTax,
+ this.cashPriceWithTax,
+ this.companyId,
+ this.companyName,
+ this.companyShareWithTax,
+ this.errCode,
+ this.groupID,
+ this.insurancePolicyNo,
+ this.message,
+ this.patientCardID,
+ this.patientShare,
+ this.patientShareWithTax,
+ this.patientTaxAmount,
+ this.policyId,
+ this.policyName,
+ this.procedureName,
+ this.setupID,
+ this.statusCode,
+ this.subPolicyNo});
+
+ ErPatientShareModel.fromJson(Map json) {
+ cashPrice = json['CashPrice'];
+ cashPriceTax = json['CashPriceTax'];
+ cashPriceWithTax = json['CashPriceWithTax'];
+ companyId = json['CompanyId'];
+ companyName = json['CompanyName'];
+ companyShareWithTax = json['CompanyShareWithTax'];
+ errCode = json['ErrCode'];
+ groupID = json['GroupID'];
+ insurancePolicyNo = json['InsurancePolicyNo'];
+ message = json['Message'];
+ patientCardID = json['PatientCardID'];
+ patientShare = json['PatientShare'];
+ patientShareWithTax = json['PatientShareWithTax'];
+ patientTaxAmount = json['PatientTaxAmount'];
+ policyId = json['PolicyId'];
+ policyName = json['PolicyName'];
+ procedureName = json['ProcedureName'];
+ setupID = json['SetupID'];
+ statusCode = json['StatusCode'];
+ subPolicyNo = json['SubPolicyNo'];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['CashPrice'] = this.cashPrice;
+ data['CashPriceTax'] = this.cashPriceTax;
+ data['CashPriceWithTax'] = this.cashPriceWithTax;
+ data['CompanyId'] = this.companyId;
+ data['CompanyName'] = this.companyName;
+ data['CompanyShareWithTax'] = this.companyShareWithTax;
+ data['ErrCode'] = this.errCode;
+ data['GroupID'] = this.groupID;
+ data['InsurancePolicyNo'] = this.insurancePolicyNo;
+ data['Message'] = this.message;
+ data['PatientCardID'] = this.patientCardID;
+ data['PatientShare'] = this.patientShare;
+ data['PatientShareWithTax'] = this.patientShareWithTax;
+ data['PatientTaxAmount'] = this.patientTaxAmount;
+ data['PolicyId'] = this.policyId;
+ data['PolicyName'] = this.policyName;
+ data['ProcedureName'] = this.procedureName;
+ data['SetupID'] = this.setupID;
+ data['StatusCode'] = this.statusCode;
+ data['SubPolicyNo'] = this.subPolicyNo;
+ return data;
+ }
+}
diff --git a/lib/core/model/er/TriageInformationRequest.dart b/lib/core/model/er/TriageInformationRequest.dart
new file mode 100644
index 00000000..a9717d3d
--- /dev/null
+++ b/lib/core/model/er/TriageInformationRequest.dart
@@ -0,0 +1,147 @@
+import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
+
+class TriageInformationRequest {
+ double versionID;
+ int channel;
+ int languageID;
+ String iPAdress;
+ String sessionID;
+ int patientID;
+ String tokenID;
+ String generalid;
+ int patientOutSA;
+ int patientTypeID;
+ int patientType;
+ int projectID;
+ ERTriageInformation eRTriageInformation;
+ HospitalsModel selectedHospital;
+ TriageInformationRequest(
+ {this.versionID,
+ this.channel,
+ this.languageID,
+ this.iPAdress,
+ this.sessionID,
+ this.patientID,
+ this.tokenID,
+ this.generalid,
+ this.patientOutSA,
+ this.patientTypeID,
+ this.patientType,
+ this.projectID,
+ this.eRTriageInformation,this.selectedHospital});
+
+ TriageInformationRequest.fromJson(Map json) {
+ versionID = json['VersionID'];
+ channel = json['Channel'];
+ languageID = json['LanguageID'];
+ iPAdress = json['IPAdress'];
+ sessionID = json['SessionID'];
+ patientID = json['PatientID'];
+ tokenID = json['TokenID'];
+ generalid = json['generalid'];
+ patientOutSA = json['PatientOutSA'];
+ patientTypeID = json['PatientTypeID'];
+ patientType = json['PatientType'];
+ projectID = json['ProjectID'];
+ eRTriageInformation = json['ERTriageInformation'] != null
+ ? new ERTriageInformation.fromJson(json['ERTriageInformation'])
+ : null;
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['VersionID'] = this.versionID;
+ data['Channel'] = this.channel;
+ data['LanguageID'] = this.languageID;
+ data['IPAdress'] = this.iPAdress;
+ data['SessionID'] = this.sessionID;
+ data['PatientID'] = this.patientID;
+ data['TokenID'] = this.tokenID;
+ data['generalid'] = this.generalid;
+ data['PatientOutSA'] = this.patientOutSA;
+ data['PatientTypeID'] = this.patientTypeID;
+ data['PatientType'] = this.patientType;
+ data['ProjectID'] = this.projectID;
+ if (this.eRTriageInformation != null) {
+ data['ERTriageInformation'] = this.eRTriageInformation.toJson();
+ }
+ return data;
+ }
+}
+
+class ERTriageInformation {
+ String notes;
+ String chiefComplaint;
+ int patientId;
+ int projectId;
+ int riskScore;
+ List checklist;
+
+ ERTriageInformation(
+ {this.notes,
+ this.chiefComplaint,
+ this.patientId,
+ this.projectId,
+ this.riskScore,
+ this.checklist});
+
+ ERTriageInformation.fromJson(Map json) {
+ notes = json['Notes'];
+ chiefComplaint = json['ChiefComplaint'];
+ patientId = json['PatientId'];
+ projectId = json['ProjectId'];
+ riskScore = json['RiskScore'];
+ if (json['checklist'] != null) {
+ checklist = new List();
+ json['checklist'].forEach((v) {
+ checklist.add(new Checklist.fromJson(v));
+ });
+ }
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['Notes'] = this.notes;
+ data['ChiefComplaint'] = this.chiefComplaint;
+ data['PatientId'] = this.patientId;
+ data['ProjectId'] = this.projectId;
+ data['RiskScore'] = this.riskScore;
+ if (this.checklist != null) {
+ data['checklist'] = this.checklist.map((v) => v.toJson()).toList();
+ }
+ return data;
+ }
+}
+
+class Checklist {
+ int isSelected;
+ int parameterCode;
+ int parameterGroup;
+ int parameterType;
+ int score;
+
+ Checklist(
+ {this.isSelected,
+ this.parameterCode,
+ this.parameterGroup,
+ this.parameterType,
+ this.score});
+
+ Checklist.fromJson(Map json) {
+ isSelected = json['IsSelected'];
+ parameterCode = json['ParameterCode'];
+ parameterGroup = json['ParameterGroup'];
+ parameterType = json['ParameterType'];
+ score = json['Score'];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['IsSelected'] = this.isSelected;
+ data['ParameterCode'] = this.parameterCode;
+ data['ParameterGroup'] = this.parameterGroup;
+ data['ParameterType'] = this.parameterType;
+ data['Score'] = this.score;
+ return data;
+ }
+}
diff --git a/lib/core/model/er/TriageQuestionsModel.dart b/lib/core/model/er/TriageQuestionsModel.dart
new file mode 100644
index 00000000..8960973e
--- /dev/null
+++ b/lib/core/model/er/TriageQuestionsModel.dart
@@ -0,0 +1,52 @@
+class TriageQuestionsModel {
+ String adultPoints;
+ String headerSequence;
+ int parameterCode;
+ int parameterGroup;
+ int parameterType;
+ String pediaPoints;
+ String question;
+ String questionN;
+ String scoreGroup;
+ String titles;
+
+ TriageQuestionsModel(
+ {this.adultPoints,
+ this.headerSequence,
+ this.parameterCode,
+ this.parameterGroup,
+ this.parameterType,
+ this.pediaPoints,
+ this.question,
+ this.questionN,
+ this.scoreGroup,
+ this.titles});
+
+ TriageQuestionsModel.fromJson(Map json) {
+ adultPoints = json['AdultPoints'];
+ headerSequence = json['HeaderSequence'];
+ parameterCode = json['ParameterCode'];
+ parameterGroup = json['ParameterGroup'];
+ parameterType = json['ParameterType'];
+ pediaPoints = json['PediaPoints'];
+ question = json['Question'];
+ questionN = json['QuestionN'];
+ scoreGroup = json['ScoreGroup'];
+ titles = json['Titles'];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['AdultPoints'] = this.adultPoints;
+ data['HeaderSequence'] = this.headerSequence;
+ data['ParameterCode'] = this.parameterCode;
+ data['ParameterGroup'] = this.parameterGroup;
+ data['ParameterType'] = this.parameterType;
+ data['PediaPoints'] = this.pediaPoints;
+ data['Question'] = this.question;
+ data['QuestionN'] = this.questionN;
+ data['ScoreGroup'] = this.scoreGroup;
+ data['Titles'] = this.titles;
+ return data;
+ }
+}
diff --git a/lib/core/model/hospitals/hospitals_model.dart b/lib/core/model/hospitals/hospitals_model.dart
index 264528c7..246de0b1 100644
--- a/lib/core/model/hospitals/hospitals_model.dart
+++ b/lib/core/model/hospitals/hospitals_model.dart
@@ -1,11 +1,11 @@
class HospitalsModel {
String desciption;
- Null desciptionN;
+ dynamic desciptionN;
dynamic iD;
String legalName;
String legalNameN;
String name;
- Null nameN;
+ dynamic nameN;
String phoneNumber;
String setupID;
dynamic distanceInKilometers;
@@ -13,7 +13,7 @@ class HospitalsModel {
String latitude;
String longitude;
dynamic mainProjectID;
- Null projectOutSA;
+ dynamic projectOutSA;
bool usingInDoctorApp;
HospitalsModel(
diff --git a/lib/core/model/pharmacies/BillingAddress.dart b/lib/core/model/pharmacies/BillingAddress.dart
index 765ac54d..418b28a7 100644
--- a/lib/core/model/pharmacies/BillingAddress.dart
+++ b/lib/core/model/pharmacies/BillingAddress.dart
@@ -1,3 +1,5 @@
+import 'package:google_maps_flutter/google_maps_flutter.dart';
+
class BillingAddress {
String id;
String firstName;
@@ -81,4 +83,19 @@ class BillingAddress {
data['lat_long'] = this.latLong;
return data;
}
+
+ LatLng getLocation(){
+ if(latLong.contains(',')){
+ var parts = latLong.trim().split(',');
+ if(parts.length == 2){
+ var lat = double.tryParse(parts.first);
+ var lng = double.tryParse(parts.last);
+ if(lat != null || lng != null) {
+ var location = LatLng(lat, lng);
+ return location;
+ }
+ }
+ }
+ return null;
+ }
}
diff --git a/lib/core/model/pharmacies/Customer.dart b/lib/core/model/pharmacies/Customer.dart
index e3defbbe..9042930e 100644
--- a/lib/core/model/pharmacies/Customer.dart
+++ b/lib/core/model/pharmacies/Customer.dart
@@ -32,6 +32,7 @@ class Customer {
String lastLoginDateUtc;
String lastActivityDateUtc;
int registeredInStoreId;
+ List roleIds;
Customer(
{this.billingAddress,
@@ -63,7 +64,8 @@ class Customer {
this.createdOnUtc,
this.lastLoginDateUtc,
this.lastActivityDateUtc,
- this.registeredInStoreId});
+ this.registeredInStoreId,
+ this.roleIds});
Customer.fromJson(Map json) {
billingAddress = json['billing_address'] != null
@@ -105,6 +107,12 @@ class Customer {
lastLoginDateUtc = json['last_login_date_utc'];
lastActivityDateUtc = json['last_activity_date_utc'];
registeredInStoreId = json['registered_in_store_id'];
+ if (json['role_ids'] != null) {
+ roleIds = new List();
+ json['role_ids'].forEach((v) {
+ roleIds.add(v);
+ });
+ }
}
Map toJson() {
@@ -145,6 +153,7 @@ class Customer {
data['last_login_date_utc'] = this.lastLoginDateUtc;
data['last_activity_date_utc'] = this.lastActivityDateUtc;
data['registered_in_store_id'] = this.registeredInStoreId;
+ data['role_ids'] = this.roleIds;
return data;
}
}
diff --git a/lib/core/model/pharmacies/PharmacyProduct.dart b/lib/core/model/pharmacies/PharmacyProduct.dart
index c472cb4c..f69d035b 100644
--- a/lib/core/model/pharmacies/PharmacyProduct.dart
+++ b/lib/core/model/pharmacies/PharmacyProduct.dart
@@ -4,29 +4,29 @@ import 'PharmacyImageObject.dart';
import 'Reviews.dart';
class PharmacyProduct {
- String id;
+ dynamic id;
bool visibleIndividually;
- String name;
- String namen;
- String shortDescription;
- String shortDescriptionn;
- String fullDescription;
- String fullDescriptionn;
+ dynamic name;
+ dynamic namen;
+ dynamic shortDescription;
+ dynamic shortDescriptionn;
+ dynamic fullDescription;
+ dynamic fullDescriptionn;
bool markasNew;
bool showOnHomePage;
- String metaKeywords;
- String metaDescription;
- String metaTitle;
+ dynamic metaKeywords;
+ dynamic metaDescription;
+ dynamic metaTitle;
bool allowCustomerReviews;
int approvedRatingSum;
int notApprovedRatingSum;
int approvedTotalReviews;
int notApprovedTotalReviews;
- String sku;
+ dynamic sku;
bool isRx;
bool prescriptionRequired;
- String rxMessage;
- String rxMessagen;
+ dynamic rxMessage;
+ dynamic rxMessagen;
String manufacturerPartNumber;
String gtin;
bool isGiftCard;
@@ -115,118 +115,117 @@ class PharmacyProduct {
int vendorId;
String seName;
-
PharmacyProduct(
{this.id,
- this.visibleIndividually,
- this.name,
- this.namen,
- this.shortDescription,
- this.shortDescriptionn,
- this.fullDescription,
- this.fullDescriptionn,
- this.markasNew,
- this.showOnHomePage,
- this.metaKeywords,
- this.metaDescription,
- this.metaTitle,
- this.allowCustomerReviews,
- this.approvedRatingSum,
- this.notApprovedRatingSum,
- this.approvedTotalReviews,
- this.notApprovedTotalReviews,
- this.sku,
- this.isRx,
- this.prescriptionRequired,
- this.rxMessage,
- this.rxMessagen,
- this.manufacturerPartNumber,
- this.gtin,
- this.isGiftCard,
- this.requireOtherProducts,
- this.automaticallyAddRequiredProducts,
- this.isDownload,
- this.unlimitedDownloads,
- this.maxNumberOfDownloads,
- this.downloadExpirationDays,
- this.hasSampleDownload,
- this.hasUserAgreement,
- this.isRecurring,
- this.recurringCycleLength,
- this.recurringTotalCycles,
- this.isRental,
- this.rentalPriceLength,
- this.isShipEnabled,
- this.isFreeShipping,
- this.shipSeparately,
- this.additionalShippingCharge,
- this.isTaxExempt,
- this.isTelecommunicationsOrBroadcastingOrElectronicServices,
- this.useMultipleWarehouses,
- this.manageInventoryMethodId,
- this.stockQuantity,
- this.stockAvailability,
- this.stockAvailabilityn,
- this.displayStockAvailability,
- this.displayStockQuantity,
- this.minStockQuantity,
- this.notifyAdminForQuantityBelow,
- this.allowBackInStockSubscriptions,
- this.orderMinimumQuantity,
- this.orderMaximumQuantity,
- this.allowedQuantities,
- this.allowAddingOnlyExistingAttributeCombinations,
- this.disableBuyButton,
- this.disableWishlistButton,
- this.availableForPreOrder,
- this.preOrderAvailabilityStartDateTimeUtc,
- this.callForPrice,
- this.price,
- this.oldPrice,
- this.productCost,
- this.specialPrice,
- this.specialPriceStartDateTimeUtc,
- this.specialPriceEndDateTimeUtc,
- this.customerEntersPrice,
- this.minimumCustomerEnteredPrice,
- this.maximumCustomerEnteredPrice,
- this.basepriceEnabled,
- this.basepriceAmount,
- this.basepriceBaseAmount,
- this.hasTierPrices,
- this.hasDiscountsApplied,
- this.discountName,
- this.discountNamen,
- this.discountDescription,
- this.discountDescriptionn,
- this.discountPercentage,
- this.currency,
- this.currencyn,
- this.weight,
- this.length,
- this.width,
- this.height,
- this.availableStartDateTimeUtc,
- this.availableEndDateTimeUtc,
- this.displayOrder,
- this.published,
- this.deleted,
- this.createdOnUtc,
- this.updatedOnUtc,
- this.productType,
- this.parentGroupedProductId,
- this.roleIds,
- this.discountIds,
- this.storeIds,
- this.manufacturerIds,
- this.reviews,
- this.images,
- this.attributes,
- this.specifications,
- this.associatedProductIds,
- this.tags,
- this.vendorId,
- this.seName});
+ this.visibleIndividually,
+ this.name,
+ this.namen,
+ this.shortDescription,
+ this.shortDescriptionn,
+ this.fullDescription,
+ this.fullDescriptionn,
+ this.markasNew,
+ this.showOnHomePage,
+ this.metaKeywords,
+ this.metaDescription,
+ this.metaTitle,
+ this.allowCustomerReviews,
+ this.approvedRatingSum,
+ this.notApprovedRatingSum,
+ this.approvedTotalReviews,
+ this.notApprovedTotalReviews,
+ this.sku,
+ this.isRx,
+ this.prescriptionRequired,
+ this.rxMessage,
+ this.rxMessagen,
+ this.manufacturerPartNumber,
+ this.gtin,
+ this.isGiftCard,
+ this.requireOtherProducts,
+ this.automaticallyAddRequiredProducts,
+ this.isDownload,
+ this.unlimitedDownloads,
+ this.maxNumberOfDownloads,
+ this.downloadExpirationDays,
+ this.hasSampleDownload,
+ this.hasUserAgreement,
+ this.isRecurring,
+ this.recurringCycleLength,
+ this.recurringTotalCycles,
+ this.isRental,
+ this.rentalPriceLength,
+ this.isShipEnabled,
+ this.isFreeShipping,
+ this.shipSeparately,
+ this.additionalShippingCharge,
+ this.isTaxExempt,
+ this.isTelecommunicationsOrBroadcastingOrElectronicServices,
+ this.useMultipleWarehouses,
+ this.manageInventoryMethodId,
+ this.stockQuantity,
+ this.stockAvailability,
+ this.stockAvailabilityn,
+ this.displayStockAvailability,
+ this.displayStockQuantity,
+ this.minStockQuantity,
+ this.notifyAdminForQuantityBelow,
+ this.allowBackInStockSubscriptions,
+ this.orderMinimumQuantity,
+ this.orderMaximumQuantity,
+ this.allowedQuantities,
+ this.allowAddingOnlyExistingAttributeCombinations,
+ this.disableBuyButton,
+ this.disableWishlistButton,
+ this.availableForPreOrder,
+ this.preOrderAvailabilityStartDateTimeUtc,
+ this.callForPrice,
+ this.price,
+ this.oldPrice,
+ this.productCost,
+ this.specialPrice,
+ this.specialPriceStartDateTimeUtc,
+ this.specialPriceEndDateTimeUtc,
+ this.customerEntersPrice,
+ this.minimumCustomerEnteredPrice,
+ this.maximumCustomerEnteredPrice,
+ this.basepriceEnabled,
+ this.basepriceAmount,
+ this.basepriceBaseAmount,
+ this.hasTierPrices,
+ this.hasDiscountsApplied,
+ this.discountName,
+ this.discountNamen,
+ this.discountDescription,
+ this.discountDescriptionn,
+ this.discountPercentage,
+ this.currency,
+ this.currencyn,
+ this.weight,
+ this.length,
+ this.width,
+ this.height,
+ this.availableStartDateTimeUtc,
+ this.availableEndDateTimeUtc,
+ this.displayOrder,
+ this.published,
+ this.deleted,
+ this.createdOnUtc,
+ this.updatedOnUtc,
+ this.productType,
+ this.parentGroupedProductId,
+ this.roleIds,
+ this.discountIds,
+ this.storeIds,
+ this.manufacturerIds,
+ this.reviews,
+ this.images,
+ this.attributes,
+ this.specifications,
+ this.associatedProductIds,
+ this.tags,
+ this.vendorId,
+ this.seName});
PharmacyProduct.fromJson(Map json) {
id = json['id'];
@@ -257,7 +256,7 @@ class PharmacyProduct {
isGiftCard = json['is_gift_card'];
requireOtherProducts = json['require_other_products'];
automaticallyAddRequiredProducts =
- json['automatically_add_required_products'];
+ json['automatically_add_required_products'];
isDownload = json['is_download'];
unlimitedDownloads = json['unlimited_downloads'];
maxNumberOfDownloads = json['max_number_of_downloads'];
@@ -275,7 +274,7 @@ class PharmacyProduct {
additionalShippingCharge = json['additional_shipping_charge'];
isTaxExempt = json['is_tax_exempt'];
isTelecommunicationsOrBroadcastingOrElectronicServices =
- json['is_telecommunications_or_broadcasting_or_electronic_services'];
+ json['is_telecommunications_or_broadcasting_or_electronic_services'];
useMultipleWarehouses = json['use_multiple_warehouses'];
manageInventoryMethodId = json['manage_inventory_method_id'];
stockQuantity = json['stock_quantity'];
@@ -290,12 +289,12 @@ class PharmacyProduct {
orderMaximumQuantity = json['order_maximum_quantity'];
allowedQuantities = json['allowed_quantities'];
allowAddingOnlyExistingAttributeCombinations =
- json['allow_adding_only_existing_attribute_combinations'];
+ json['allow_adding_only_existing_attribute_combinations'];
disableBuyButton = json['disable_buy_button'];
disableWishlistButton = json['disable_wishlist_button'];
availableForPreOrder = json['available_for_pre_order'];
preOrderAvailabilityStartDateTimeUtc =
- json['pre_order_availability_start_date_time_utc'];
+ json['pre_order_availability_start_date_time_utc'];
callForPrice = json['call_for_price'];
price = json['price'];
oldPrice = json['old_price'];
diff --git a/lib/core/model/pharmacies/Reviews.dart b/lib/core/model/pharmacies/Reviews.dart
index f924dce3..2c767cdd 100644
--- a/lib/core/model/pharmacies/Reviews.dart
+++ b/lib/core/model/pharmacies/Reviews.dart
@@ -10,13 +10,13 @@ class Reviews {
bool isApproved;
String title;
String reviewText;
- Null replyText;
+ String replyText;
int rating;
int helpfulYesTotal;
int helpfulNoTotal;
String createdOnUtc;
Customer customer;
- Null product;
+ //Null product;
Reviews(
{this.id,
@@ -34,7 +34,8 @@ class Reviews {
this.helpfulNoTotal,
this.createdOnUtc,
this.customer,
- this.product});
+ // this.product
+ });
Reviews.fromJson(Map json) {
id = json['id'];
@@ -54,7 +55,7 @@ class Reviews {
customer = json['customer'] != null
? new Customer.fromJson(json['customer'])
: null;
- product = json['product'];
+ // product = json['product'];
}
Map toJson() {
@@ -76,7 +77,7 @@ class Reviews {
if (this.customer != null) {
data['customer'] = this.customer.toJson();
}
- data['product'] = this.product;
+ // data['product'] = this.product;
return data;
}
}
\ No newline at end of file
diff --git a/lib/core/model/pharmacies/ShoppingCart.dart b/lib/core/model/pharmacies/ShoppingCart.dart
index f965203a..4bd460aa 100644
--- a/lib/core/model/pharmacies/ShoppingCart.dart
+++ b/lib/core/model/pharmacies/ShoppingCart.dart
@@ -7,22 +7,33 @@ class ShoppingCart {
// List productAttributes;
double customerEnteredPrice;
int quantity;
- String discountAmountInclTax;
- String subtotal;
- String subtotalWithVat;
- String subtotalVatAmount;
- String subtotalVatRate;
- String currency;
- String currencyn;
- String rentalStartDateUtc;
- String rentalEndDateUtc;
- String createdOnUtc;
- String updatedOnUtc;
- String shoppingCartType;
+ dynamic discountAmountInclTax;
+ dynamic subtotal;
+ dynamic subtotalWithVat;
+ dynamic subtotalVatAmount;
+ dynamic subtotalVatRate;
+ dynamic currency;
+ dynamic currencyn;
+ dynamic rentalStartDateUtc;
+ dynamic rentalEndDateUtc;
+ dynamic createdOnUtc;
+ dynamic updatedOnUtc;
+ dynamic shoppingCartType;
int productId;
PharmacyProduct product;
int customerId;
Customer customer;
+ double unitPriceInclTax;
+ double unitPriceExclTax;
+ double priceInclTax;
+ double priceExclTax;
+ dynamic discountAmountExclTax;
+ double originalProductCost;
+ String attributeDescription;
+ int downloadCount;
+ bool isDownloadActivated;
+ int licenseDownloadId;
+ double itemWeight;
ShoppingCart(
{this.languageId,
@@ -45,7 +56,19 @@ class ShoppingCart {
this.productId,
this.product,
this.customerId,
- this.customer});
+ this.customer,
+ this.unitPriceInclTax,
+ this.unitPriceExclTax,
+ this.priceInclTax,
+ this.priceExclTax,
+ this.discountAmountExclTax,
+ this.originalProductCost,
+ this.attributeDescription,
+ this.downloadCount,
+ this.isDownloadActivated,
+ this.licenseDownloadId,
+ this.itemWeight,
+ });
ShoppingCart.fromJson(Map json) {
languageId = json['language_id'];
@@ -78,6 +101,18 @@ class ShoppingCart {
customer = json['customer'] != null
? new Customer.fromJson(json['customer'])
: null;
+
+ unitPriceInclTax = json['unit_price_incl_tax'];
+ unitPriceExclTax = json['unit_price_excl_tax'];
+ priceInclTax = json['price_incl_tax'];
+ priceExclTax = json['price_excl_tax'];
+ discountAmountExclTax = json['discount_amount_excl_tax'];
+ originalProductCost = json['original_product_cost'];
+ attributeDescription = json['attribute_description'];
+ downloadCount = json['download_count'];
+ isDownloadActivated = json['isDownload_activated'];
+ licenseDownloadId = json['license_download_id'];
+ itemWeight = json['item_weight'];
}
Map toJson() {
@@ -110,6 +145,18 @@ class ShoppingCart {
if (this.customer != null) {
data['customer'] = this.customer.toJson();
}
+ data['unit_price_incl_tax'] = this.unitPriceInclTax;
+ data['unit_price_excl_tax'] = this.unitPriceExclTax;
+ data['price_incl_tax'] = this.priceInclTax;
+ data['price_excl_tax'] = this.priceExclTax;
+ data['discount_amount_excl_tax'] = this.discountAmountExclTax;
+ data['original_product_cost'] = this.originalProductCost;
+ data['attribute_description'] = this.attributeDescription;
+ data['download_count'] = this.downloadCount;
+ data['isDownload_activated'] = this.isDownloadActivated;
+ data['license_download_id'] = this.licenseDownloadId;
+ data['item_weight'] = this.itemWeight;
+
return data;
}
}
diff --git a/lib/core/model/pharmacies/order_detail.dart b/lib/core/model/pharmacies/order_detail.dart
new file mode 100644
index 00000000..74e89295
--- /dev/null
+++ b/lib/core/model/pharmacies/order_detail.dart
@@ -0,0 +1,305 @@
+import 'package:diplomaticquarterapp/core/model/pharmacies/BillingAddress.dart';
+import 'package:diplomaticquarterapp/core/model/pharmacies/Customer.dart';
+import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart';
+
+class OrderDetailModel {
+ String id;
+ int storeId;
+ String orderGuid;
+ bool pickUpInStore;
+ String paymentMethodSystemName;
+ String paymentName;
+ String paymentNamen;
+ String customerCurrencyCode;
+ dynamic currencyRate;
+ dynamic customerTaxDisplayTypeId;
+ dynamic vatNumber;
+ double orderSubtotalInclTax;
+ double orderSubtotalExclTax;
+ dynamic orderSubTotalDiscountInclTax;
+ dynamic orderSubTotalDiscountExclTax;
+ double orderShippingInclTax;
+ dynamic orderShippingExclTax;
+ dynamic paymentMethodAdditionalFeeInclTax;
+ dynamic paymentMethodAdditionalFeeExclTax;
+ String taxRates;
+ double orderTax;
+ dynamic orderDiscount;
+ dynamic productCount;
+ dynamic orderTotal;
+ dynamic refundedAmount;
+ dynamic rewardPointsWereAdded;
+ dynamic rxAttachments;
+ String checkoutAttributeDescription;
+ int customerLanguageId;
+ int affiliateId;
+ String customerIp;
+ dynamic authorizationTransactionId;
+ dynamic authorizationTransactionCode;
+ dynamic authorizationTransactionResult;
+ dynamic captureTransactionId;
+ dynamic captureTransactionResult;
+ dynamic subscriptionTransactionId;
+ dynamic paidDateUtc;
+ String shippingMethod;
+ String shippingRateComputationMethodSystemName;
+ String customValuesXml;
+ bool deleted;
+ String createdOnUtc;
+ Customer customer;
+ int customerId;
+ BillingAddress billingAddress;
+ BillingAddress shippingAddress;
+ List orderItems;
+ int orderStatusId;
+ String orderStatus;
+ String orderStatusn;
+ int paymentStatusId;
+ String paymentStatus;
+ String paymentStatusn;
+ String shippingStatus;
+ String shippingStatusn;
+ String customerTaxDisplayType;
+ bool canCancel;
+ bool canRefund;
+ dynamic lakumAmount;
+ String preferDeliveryDate;
+ String preferDeliveryTime;
+ String preferDeliveryTimen;
+ String driverOTP;
+ String driverID;
+
+ OrderDetailModel(
+ {this.id,
+ this.storeId,
+ this.orderGuid,
+ this.pickUpInStore,
+ this.paymentMethodSystemName,
+ this.paymentName,
+ this.paymentNamen,
+ this.customerCurrencyCode,
+ this.currencyRate,
+ this.customerTaxDisplayTypeId,
+ this.vatNumber,
+ this.orderSubtotalInclTax,
+ this.orderSubtotalExclTax,
+ this.orderSubTotalDiscountInclTax,
+ this.orderSubTotalDiscountExclTax,
+ this.orderShippingInclTax,
+ this.orderShippingExclTax,
+ this.paymentMethodAdditionalFeeInclTax,
+ this.paymentMethodAdditionalFeeExclTax,
+ this.taxRates,
+ this.orderTax,
+ this.orderDiscount,
+ this.productCount,
+ this.orderTotal,
+ this.refundedAmount,
+ this.rewardPointsWereAdded,
+ this.rxAttachments,
+ this.checkoutAttributeDescription,
+ this.customerLanguageId,
+ this.affiliateId,
+ this.customerIp,
+ this.authorizationTransactionId,
+ this.authorizationTransactionCode,
+ this.authorizationTransactionResult,
+ this.captureTransactionId,
+ this.captureTransactionResult,
+ this.subscriptionTransactionId,
+ this.paidDateUtc,
+ this.shippingMethod,
+ this.shippingRateComputationMethodSystemName,
+ this.customValuesXml,
+ this.deleted,
+ this.createdOnUtc,
+ this.customer,
+ this.customerId,
+ this.billingAddress,
+ this.shippingAddress,
+ this.orderItems,
+ this.orderStatusId,
+ this.orderStatus,
+ this.orderStatusn,
+ this.paymentStatusId,
+ this.paymentStatus,
+ this.paymentStatusn,
+ this.shippingStatus,
+ this.shippingStatusn,
+ this.customerTaxDisplayType,
+ this.canCancel,
+ this.canRefund,
+ this.lakumAmount,
+ this.preferDeliveryDate,
+ this.preferDeliveryTime,
+ this.preferDeliveryTimen,
+ this.driverID,
+ this.driverOTP,});
+
+ OrderDetailModel.fromJson(Map json) {
+ id = json['id'];
+ storeId = json['store_id'];
+ orderGuid = json['order_guid'];
+ pickUpInStore = json['pick_up_in_store'];
+ paymentMethodSystemName = json['payment_method_system_name'];
+ paymentName = json['payment_name'];
+ paymentNamen = json['payment_namen'];
+ customerCurrencyCode = json['customer_currency_code'];
+ currencyRate = json['currency_rate'];
+ customerTaxDisplayTypeId = json['customer_tax_display_type_id'];
+ vatNumber = json['vat_number'];
+ orderSubtotalInclTax = json['order_subtotal_incl_tax'];
+ orderSubtotalExclTax = json['order_subtotal_excl_tax'];
+ orderSubTotalDiscountInclTax = json['order_sub_total_discount_incl_tax'];
+ orderSubTotalDiscountExclTax = json['order_sub_total_discount_excl_tax'];
+ orderShippingInclTax = json['order_shipping_incl_tax'];
+ orderShippingExclTax = json['order_shipping_excl_tax'];
+ paymentMethodAdditionalFeeInclTax =
+ json['payment_method_additional_fee_incl_tax'];
+ paymentMethodAdditionalFeeExclTax =
+ json['payment_method_additional_fee_excl_tax'];
+ taxRates = json['tax_rates'];
+ orderTax = json['order_tax'];
+ orderDiscount = json['order_discount'];
+ productCount = json['product_count'];
+ orderTotal = json['order_total'];
+ refundedAmount = json['refunded_amount'];
+ rewardPointsWereAdded = json['reward_points_were_added'];
+ rxAttachments = json['rx_attachments'];
+ checkoutAttributeDescription = json['checkout_attribute_description'];
+ customerLanguageId = json['customer_language_id'];
+ affiliateId = json['affiliate_id'];
+ customerIp = json['customer_ip'];
+ authorizationTransactionId = json['authorization_transaction_id'];
+ authorizationTransactionCode = json['authorization_transaction_code'];
+ authorizationTransactionResult = json['authorization_transaction_result'];
+ captureTransactionId = json['capture_transaction_id'];
+ captureTransactionResult = json['capture_transaction_result'];
+ subscriptionTransactionId = json['subscription_transaction_id'];
+ paidDateUtc = json['paid_date_utc'];
+ shippingMethod = json['shipping_method'];
+ shippingRateComputationMethodSystemName =
+ json['shipping_rate_computation_method_system_name'];
+ customValuesXml = json['custom_values_xml'];
+ deleted = json['deleted'];
+ createdOnUtc = json['created_on_utc'];
+ customer = json['customer'] != null
+ ? new Customer.fromJson(json['customer'])
+ : null;
+ customerId = json['customer_id'];
+ billingAddress = json['billing_address'] != null
+ ? new BillingAddress.fromJson(json['billing_address'])
+ : null;
+ shippingAddress = json['shipping_address'] != null
+ ? new BillingAddress.fromJson(json['shipping_address'])
+ : null;
+ if (json['order_items'] != null) {
+ orderItems = new List();
+ json['order_items'].forEach((v) {
+ orderItems.add(new ShoppingCart.fromJson(v));
+ });
+ }
+ orderStatusId = json['order_status_id'];
+ orderStatus = json['order_status'];
+ orderStatusn = json['order_statusn'];
+ paymentStatusId = json['payment_status_id'];
+ paymentStatus = json['payment_status'];
+ paymentStatusn = json['payment_statusn'];
+ shippingStatus = json['shipping_status'];
+ shippingStatusn = json['shipping_statusn'];
+ customerTaxDisplayType = json['customer_tax_display_type'];
+ canCancel = json['can_cancel'];
+ canRefund = json['can_refund'];
+ lakumAmount = json['lakum_amount'];
+ preferDeliveryDate = json['prefer_delivery_date'];
+ preferDeliveryTime = json['prefer_delivery_time'];
+ preferDeliveryTimen = json['prefer_delivery_timen'];
+
+ // Driver Detail
+ driverID: json["DriverID"];
+ driverOTP: json["DriverOTP"];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['id'] = this.id;
+ data['store_id'] = this.storeId;
+ data['order_guid'] = this.orderGuid;
+ data['pick_up_in_store'] = this.pickUpInStore;
+ data['payment_method_system_name'] = this.paymentMethodSystemName;
+ data['payment_name'] = this.paymentName;
+ data['payment_namen'] = this.paymentNamen;
+ data['customer_currency_code'] = this.customerCurrencyCode;
+ data['currency_rate'] = this.currencyRate;
+ data['customer_tax_display_type_id'] = this.customerTaxDisplayTypeId;
+ data['vat_number'] = this.vatNumber;
+ data['order_subtotal_incl_tax'] = this.orderSubtotalInclTax;
+ data['order_subtotal_excl_tax'] = this.orderSubtotalExclTax;
+ data['order_sub_total_discount_incl_tax'] =
+ this.orderSubTotalDiscountInclTax;
+ data['order_sub_total_discount_excl_tax'] =
+ this.orderSubTotalDiscountExclTax;
+ data['order_shipping_incl_tax'] = this.orderShippingInclTax;
+ data['order_shipping_excl_tax'] = this.orderShippingExclTax;
+ data['payment_method_additional_fee_incl_tax'] =
+ this.paymentMethodAdditionalFeeInclTax;
+ data['payment_method_additional_fee_excl_tax'] =
+ this.paymentMethodAdditionalFeeExclTax;
+ data['tax_rates'] = this.taxRates;
+ data['order_tax'] = this.orderTax;
+ data['order_discount'] = this.orderDiscount;
+ data['product_count'] = this.productCount;
+ data['order_total'] = this.orderTotal;
+ data['refunded_amount'] = this.refundedAmount;
+ data['reward_points_were_added'] = this.rewardPointsWereAdded;
+ data['rx_attachments'] = this.rxAttachments;
+ data['checkout_attribute_description'] = this.checkoutAttributeDescription;
+ data['customer_language_id'] = this.customerLanguageId;
+ data['affiliate_id'] = this.affiliateId;
+ data['customer_ip'] = this.customerIp;
+ data['authorization_transaction_id'] = this.authorizationTransactionId;
+ data['authorization_transaction_code'] = this.authorizationTransactionCode;
+ data['authorization_transaction_result'] =
+ this.authorizationTransactionResult;
+ data['capture_transaction_id'] = this.captureTransactionId;
+ data['capture_transaction_result'] = this.captureTransactionResult;
+ data['subscription_transaction_id'] = this.subscriptionTransactionId;
+ data['paid_date_utc'] = this.paidDateUtc;
+ data['shipping_method'] = this.shippingMethod;
+ data['shipping_rate_computation_method_system_name'] =
+ this.shippingRateComputationMethodSystemName;
+ data['custom_values_xml'] = this.customValuesXml;
+ data['deleted'] = this.deleted;
+ data['created_on_utc'] = this.createdOnUtc;
+ if (this.customer != null) {
+ data['customer'] = this.customer.toJson();
+ }
+ data['customer_id'] = this.customerId;
+ if (this.billingAddress != null) {
+ data['billing_address'] = this.billingAddress.toJson();
+ }
+ if (this.shippingAddress != null) {
+ data['shipping_address'] = this.shippingAddress.toJson();
+ }
+ if (this.orderItems != null) {
+ data['order_items'] = this.orderItems.map((v) => v.toJson()).toList();
+ }
+ data['order_status_id'] = this.orderStatusId;
+ data['order_status'] = this.orderStatus;
+ data['order_statusn'] = this.orderStatusn;
+ data['payment_status_id'] = this.paymentStatusId;
+ data['payment_status'] = this.paymentStatus;
+ data['payment_statusn'] = this.paymentStatusn;
+ data['shipping_status'] = this.shippingStatus;
+ data['shipping_statusn'] = this.shippingStatusn;
+ data['customer_tax_display_type'] = this.customerTaxDisplayType;
+ data['can_cancel'] = this.canCancel;
+ data['can_refund'] = this.canRefund;
+ data['lakum_amount'] = this.lakumAmount;
+ data['prefer_delivery_date'] = this.preferDeliveryDate;
+ data['prefer_delivery_time'] = this.preferDeliveryTime;
+ data['prefer_delivery_timen'] = this.preferDeliveryTimen;
+ return data;
+ }
+
+}
\ No newline at end of file
diff --git a/lib/core/model/pharmacies/order_model.dart b/lib/core/model/pharmacies/order_model.dart
index 776c21ec..d025faa6 100644
--- a/lib/core/model/pharmacies/order_model.dart
+++ b/lib/core/model/pharmacies/order_model.dart
@@ -9,6 +9,73 @@ List orderModelFromJson(String str) => List.from(json.de
String orderModelToJson(List data) => json.encode(List.from(data.map((x) => x.toJson())));
class OrderModel {
+
+ String id;
+ dynamic storeId;
+ String orderGuid;
+ bool pickUpInStore;
+ PaymentMethodSystemName paymentMethodSystemName;
+ PaymentName paymentName;
+ PaymentName paymentNamen;
+ CustomerCurrencyCode customerCurrencyCode;
+ dynamic currencyRate;
+ dynamic customerTaxDisplayTypeId;
+ dynamic vatNumber;
+ double orderSubtotalInclTax;
+ double orderSubtotalExclTax;
+ dynamic orderSubTotalDiscountInclTax;
+ dynamic orderSubTotalDiscountExclTax;
+ double orderShippingInclTax;
+ dynamic orderShippingExclTax;
+ dynamic paymentMethodAdditionalFeeInclTax;
+ dynamic paymentMethodAdditionalFeeExclTax;
+ String taxRates;
+ double orderTax;
+ dynamic orderDiscount;
+ dynamic productCount;
+ double orderTotal;
+ dynamic refundedAmount;
+ dynamic rewardPointsWereAdded;
+ String rxAttachments;
+ CheckoutAttributeDescription checkoutAttributeDescription;
+ dynamic customerLanguageId;
+ dynamic affiliateId;
+ CustomerIp customerIp;
+ String authorizationTransactionId;
+ dynamic authorizationTransactionCode;
+ dynamic authorizationTransactionResult;
+ dynamic captureTransactionId;
+ dynamic captureTransactionResult;
+ dynamic subscriptionTransactionId;
+ DateTime paidDateUtc;
+ ShippingMethod shippingMethod;
+ ShippingRateComputationMethodSystemName shippingRateComputationMethodSystemName;
+ String customValuesXml;
+ bool deleted;
+ DateTime createdOnUtc;
+ OrderModelCustomer customer;
+ dynamic customerId;
+ IngAddress billingAddress;
+ IngAddress shippingAddress;
+ List orderItems;
+ dynamic orderStatusId;
+ OrderStatus orderStatus;
+ OrderStatusn orderStatusn;
+ dynamic paymentStatusId;
+ PaymentStatus paymentStatus;
+ PaymentStatusn paymentStatusn;
+ ShippingStatus shippingStatus;
+ ShippingStatusn shippingStatusn;
+ CustomerTaxDisplayType customerTaxDisplayType;
+ bool canCancel;
+ bool canRefund;
+ dynamic lakumAmount;
+ DateTime preferDeliveryDate;
+ PreferDeliveryTime preferDeliveryTime;
+ PreferDeliveryTimen preferDeliveryTimen;
+ String driverOTP;
+ String driverID;
+
OrderModel({
this.id,
this.storeId,
@@ -77,72 +144,6 @@ class OrderModel {
this.driverOTP,
});
- String id;
- dynamic storeId;
- String orderGuid;
- bool pickUpInStore;
- PaymentMethodSystemName paymentMethodSystemName;
- PaymentName paymentName;
- PaymentName paymentNamen;
- CustomerCurrencyCode customerCurrencyCode;
- dynamic currencyRate;
- dynamic customerTaxDisplayTypeId;
- dynamic vatNumber;
- double orderSubtotalInclTax;
- double orderSubtotalExclTax;
- dynamic orderSubTotalDiscountInclTax;
- dynamic orderSubTotalDiscountExclTax;
- double orderShippingInclTax;
- dynamic orderShippingExclTax;
- dynamic paymentMethodAdditionalFeeInclTax;
- dynamic paymentMethodAdditionalFeeExclTax;
- String taxRates;
- double orderTax;
- dynamic orderDiscount;
- dynamic productCount;
- double orderTotal;
- dynamic refundedAmount;
- dynamic rewardPointsWereAdded;
- String rxAttachments;
- CheckoutAttributeDescription checkoutAttributeDescription;
- dynamic customerLanguageId;
- dynamic affiliateId;
- CustomerIp customerIp;
- String authorizationTransactionId;
- dynamic authorizationTransactionCode;
- dynamic authorizationTransactionResult;
- dynamic captureTransactionId;
- dynamic captureTransactionResult;
- dynamic subscriptionTransactionId;
- DateTime paidDateUtc;
- ShippingMethod shippingMethod;
- ShippingRateComputationMethodSystemName shippingRateComputationMethodSystemName;
- String customValuesXml;
- bool deleted;
- DateTime createdOnUtc;
- OrderModelCustomer customer;
- dynamic customerId;
- IngAddress billingAddress;
- IngAddress shippingAddress;
- List orderItems;
- dynamic orderStatusId;
- OrderStatus orderStatus;
- OrderStatusn orderStatusn;
- dynamic paymentStatusId;
- PaymentStatus paymentStatus;
- PaymentStatusn paymentStatusn;
- ShippingStatus shippingStatus;
- ShippingStatusn shippingStatusn;
- CustomerTaxDisplayType customerTaxDisplayType;
- bool canCancel;
- bool canRefund;
- dynamic lakumAmount;
- DateTime preferDeliveryDate;
- PreferDeliveryTime preferDeliveryTime;
- PreferDeliveryTimen preferDeliveryTimen;
- String driverOTP;
- String driverID;
-
factory OrderModel.fromJson(Map json) => OrderModel(
id: json["id"],
storeId: json["store_id"],
@@ -320,7 +321,7 @@ class IngAddress {
DateTime createdOnUtc;
dynamic province;
String latLong;
-
+
LatLng getLocation(){
if(latLong.contains(',')){
var parts = latLong.trim().split(',');
@@ -485,10 +486,10 @@ class OrderModelCustomer {
});
String id;
- Username username;
- BillingAddressEmail email;
- FirstName firstName;
- LastName lastName;
+ dynamic username;
+ dynamic email;
+ dynamic firstName;
+ dynamic lastName;
String languageId;
dynamic adminComment;
bool isTaxExempt;
@@ -497,10 +498,10 @@ class OrderModelCustomer {
bool deleted;
bool isSystemAccount;
dynamic systemName;
- LastIpAddress lastIpAddress;
- DateTime createdOnUtc;
- DateTime lastLoginDateUtc;
- DateTime lastActivityDateUtc;
+ dynamic lastIpAddress;
+ dynamic createdOnUtc;
+ dynamic lastLoginDateUtc;
+ dynamic lastActivityDateUtc;
dynamic registeredInStoreId;
List roleIds;
@@ -586,6 +587,7 @@ final customerTaxDisplayTypeValues = EnumValues({
"ExcludingTax": CustomerTaxDisplayType.EXCLUDING_TAX
});
+
class OrderItem {
OrderItem({
this.quantity,
@@ -876,9 +878,9 @@ class Product {
dynamic displayOrder;
bool published;
bool deleted;
- DateTime createdOnUtc;
- DateTime updatedOnUtc;
- ProductType productType;
+ dynamic createdOnUtc;
+ dynamic updatedOnUtc;
+ dynamic productType;
dynamic parentGroupedProductId;
dynamic roleIds;
dynamic discountIds;
@@ -1155,14 +1157,14 @@ class Review {
dynamic productId;
dynamic storeId;
bool isApproved;
- Title title;
- ReviewText reviewText;
+ dynamic title;
+ dynamic reviewText;
dynamic replyText;
dynamic rating;
dynamic helpfulYesTotal;
dynamic helpfulNoTotal;
- DateTime createdOnUtc;
- ReviewCustomer customer;
+ dynamic createdOnUtc;
+ dynamic customer;
dynamic product;
factory Review.fromJson(Map json) => Review(
@@ -1244,7 +1246,7 @@ class ReviewCustomer {
dynamic isOutSa;
dynamic patientType;
dynamic gender;
- DateTime birthDate;
+ dynamic birthDate;
dynamic phone;
dynamic countryCode;
dynamic yahalaAccountno;
@@ -1253,7 +1255,7 @@ class ReviewCustomer {
List addresses;
String id;
String username;
- PurpleEmail email;
+ dynamic email;
dynamic firstName;
dynamic lastName;
dynamic languageId;
@@ -1480,7 +1482,4 @@ class EnumValues {
}
return reverseMap;
}
-}
-
-
-
+}
\ No newline at end of file
diff --git a/lib/core/model/pharmacies/orders_model.dart b/lib/core/model/pharmacies/orders_model.dart
index a97bda98..0ad94767 100644
--- a/lib/core/model/pharmacies/orders_model.dart
+++ b/lib/core/model/pharmacies/orders_model.dart
@@ -32,6 +32,10 @@ class Orders {
bool canCancel;
bool canRefund;
dynamic customerId;
+ double orderSubtotalExclTax;
+ dynamic orderShippingExclTax;
+ double orderTax;
+
Orders(
{this.id,
@@ -43,7 +47,10 @@ class Orders {
this.orderStatusn,
this.canCancel,
this.canRefund,
- this.customerId,});
+ this.customerId,
+ this.orderShippingExclTax,
+ this.orderSubtotalExclTax,
+ this.orderTax,});
Orders.fromJson(Map json) {
try {
@@ -57,6 +64,9 @@ class Orders {
canCancel = json['can_cancel'];
canRefund = json['can_refund'];
customerId = json['customer_id'];
+ orderSubtotalExclTax= json["order_subtotal_excl_tax"].toDouble();
+ orderShippingExclTax= json["order_shipping_excl_tax"];
+ orderTax= json["order_tax"].toDouble();
}catch(e){
print(e);
}
@@ -72,6 +82,9 @@ class Orders {
data['order_status_id'] = this.orderStatusId;
data['order_status'] = this.orderStatus;
data['order_statusn'] = this.orderStatusn;
+ data ["order_subtotal_excl_tax"] = this.orderSubtotalExclTax;
+ data ["order_shipping_excl_tax"]= this.orderShippingExclTax;
+ data ["order_tax"]= this.orderTax;
return data;
}
}
diff --git a/lib/core/model/pharmacies/recommendedProduct_model.dart b/lib/core/model/pharmacies/recommendedProduct_model.dart
new file mode 100644
index 00000000..e1e88cd8
--- /dev/null
+++ b/lib/core/model/pharmacies/recommendedProduct_model.dart
@@ -0,0 +1,486 @@
+class RecommendedProductModel {
+ List products;
+
+ RecommendedProductModel({this.products});
+
+ RecommendedProductModel.fromJson(Map json) {
+ if (json['products'] != null) {
+ products = new List();
+ json['products'].forEach((v) {
+ products.add(new Products.fromJson(v));
+ });
+ }
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ if (this.products != null) {
+ data['products'] = this.products.map((v) => v.toJson()).toList();
+ }
+ return data;
+ }
+}
+
+class Products {
+ String id;
+ bool visibleIndividually;
+ String name;
+ String namen;
+ String shortDescription;
+ String shortDescriptionn;
+ String fullDescription;
+ String fullDescriptionn;
+ bool markasNew;
+ bool showOnHomePage;
+ dynamic metaKeywords;
+ dynamic metaDescription;
+ dynamic metaTitle;
+ bool allowCustomerReviews;
+ dynamic approvedRatingSum;
+ dynamic notApprovedRatingSum;
+ dynamic approvedTotalReviews;
+ dynamic notApprovedTotalReviews;
+ String sku;
+ bool isRx;
+ bool prescriptionRequired;
+ dynamic rxMessage;
+ dynamic rxMessagen;
+ dynamic manufacturerPartNumber;
+ dynamic gtin;
+ bool isGiftCard;
+ bool requireOtherProducts;
+ bool automaticallyAddRequiredProducts;
+ bool isDownload;
+ bool unlimitedDownloads;
+ dynamic maxNumberOfDownloads;
+ dynamic downloadExpirationDays;
+ bool hasSampleDownload;
+ bool hasUserAgreement;
+ bool isRecurring;
+ dynamic recurringCycleLength;
+ dynamic recurringTotalCycles;
+ bool isRental;
+ dynamic rentalPriceLength;
+ bool isShipEnabled;
+ bool isFreeShipping;
+ bool shipSeparately;
+ dynamic additionalShippingCharge;
+ bool isTaxExempt;
+ bool isTelecommunicationsOrBroadcastingOrElectronicServices;
+ bool useMultipleWarehouses;
+ dynamic manageInventoryMethodId;
+ dynamic stockQuantity;
+ String stockAvailability;
+ String stockAvailabilityn;
+ bool displayStockAvailability;
+ bool displayStockQuantity;
+ dynamic minStockQuantity;
+ dynamic notifyAdminForQuantityBelow;
+ bool allowBackInStockSubscriptions;
+ dynamic orderMinimumQuantity;
+ dynamic orderMaximumQuantity;
+ dynamic allowedQuantities;
+ bool allowAddingOnlyExistingAttributeCombinations;
+ bool disableBuyButton;
+ bool disableWishlistButton;
+ bool availableForPreOrder;
+ dynamic preOrderAvailabilityStartDateTimeUtc;
+ bool callForPrice;
+ dynamic price;
+ dynamic oldPrice;
+ dynamic productCost;
+ dynamic specialPrice;
+ dynamic specialPriceStartDateTimeUtc;
+ dynamic specialPriceEndDateTimeUtc;
+ bool customerEntersPrice;
+ dynamic minimumCustomerEnteredPrice;
+ dynamic maximumCustomerEnteredPrice;
+ bool basepriceEnabled;
+ dynamic basepriceAmount;
+ dynamic basepriceBaseAmount;
+ bool hasTierPrices;
+ bool hasDiscountsApplied;
+ dynamic discountName;
+ dynamic discountNamen;
+ dynamic discountDescription;
+ dynamic discountDescriptionn;
+ dynamic discountPercentage;
+ String currency;
+ String currencyn;
+ double weight;
+ dynamic length;
+ dynamic width;
+ dynamic height;
+ dynamic availableStartDateTimeUtc;
+ dynamic availableEndDateTimeUtc;
+ dynamic displayOrder;
+ bool published;
+ bool deleted;
+ String createdOnUtc;
+ String updatedOnUtc;
+ String productType;
+ dynamic parentGroupedProductId;
+ dynamic vendorId;
+ String seName;
+ List images;
+
+ Products({
+ this.id,
+ this.visibleIndividually,
+ this.name,
+ this.namen,
+ this.shortDescription,
+ this.shortDescriptionn,
+ this.fullDescription,
+ this.fullDescriptionn,
+ this.markasNew,
+ this.showOnHomePage,
+ this.metaKeywords,
+ this.metaDescription,
+ this.metaTitle,
+ this.allowCustomerReviews,
+ this.approvedRatingSum,
+ this.notApprovedRatingSum,
+ this.approvedTotalReviews,
+ this.notApprovedTotalReviews,
+ this.sku,
+ this.isRx,
+ this.prescriptionRequired,
+ this.rxMessage,
+ this.rxMessagen,
+ this.manufacturerPartNumber,
+ this.gtin,
+ this.isGiftCard,
+ this.requireOtherProducts,
+ this.automaticallyAddRequiredProducts,
+ this.isDownload,
+ this.unlimitedDownloads,
+ this.maxNumberOfDownloads,
+ this.downloadExpirationDays,
+ this.hasSampleDownload,
+ this.hasUserAgreement,
+ this.isRecurring,
+ this.recurringCycleLength,
+ this.recurringTotalCycles,
+ this.isRental,
+ this.rentalPriceLength,
+ this.isShipEnabled,
+ this.isFreeShipping,
+ this.shipSeparately,
+ this.additionalShippingCharge,
+ this.isTaxExempt,
+ this.isTelecommunicationsOrBroadcastingOrElectronicServices,
+ this.useMultipleWarehouses,
+ this.manageInventoryMethodId,
+ this.stockQuantity,
+ this.stockAvailability,
+ this.stockAvailabilityn,
+ this.displayStockAvailability,
+ this.displayStockQuantity,
+ this.minStockQuantity,
+ this.notifyAdminForQuantityBelow,
+ this.allowBackInStockSubscriptions,
+ this.orderMinimumQuantity,
+ this.orderMaximumQuantity,
+ this.allowedQuantities,
+ this.allowAddingOnlyExistingAttributeCombinations,
+ this.disableBuyButton,
+ this.disableWishlistButton,
+ this.availableForPreOrder,
+ this.preOrderAvailabilityStartDateTimeUtc,
+ this.callForPrice,
+ this.price,
+ this.oldPrice,
+ this.productCost,
+ this.specialPrice,
+ this.specialPriceStartDateTimeUtc,
+ this.specialPriceEndDateTimeUtc,
+ this.customerEntersPrice,
+ this.minimumCustomerEnteredPrice,
+ this.maximumCustomerEnteredPrice,
+ this.basepriceEnabled,
+ this.basepriceAmount,
+ this.basepriceBaseAmount,
+ this.hasTierPrices,
+ this.hasDiscountsApplied,
+ this.discountName,
+ this.discountNamen,
+ this.discountDescription,
+ this.discountDescriptionn,
+ this.discountPercentage,
+ this.currency,
+ this.currencyn,
+ this.weight,
+ this.length,
+ this.width,
+ this.height,
+ this.availableStartDateTimeUtc,
+ this.availableEndDateTimeUtc,
+ this.displayOrder,
+ this.published,
+ this.deleted,
+ this.createdOnUtc,
+ this.updatedOnUtc,
+ this.productType,
+ this.parentGroupedProductId,
+ this.vendorId,
+ this.seName,
+ this.images,
+ });
+
+ Products.fromJson(Map json) {
+ id = json['id'];
+ visibleIndividually = json['visible_individually'];
+ name = json['name'];
+ namen = json['namen'];
+ shortDescription = json['short_description'];
+ shortDescriptionn = json['short_descriptionn'];
+ fullDescription = json['full_description'];
+ fullDescriptionn = json['full_descriptionn'];
+ markasNew = json['markas_new'];
+ showOnHomePage = json['show_on_home_page'];
+ metaKeywords = json['meta_keywords'];
+ metaDescription = json['meta_description'];
+ metaTitle = json['meta_title'];
+ allowCustomerReviews = json['allow_customer_reviews'];
+ approvedRatingSum = json['approved_rating_sum'];
+ notApprovedRatingSum = json['not_approved_rating_sum'];
+ approvedTotalReviews = json['approved_total_reviews'];
+ notApprovedTotalReviews = json['not_approved_total_reviews'];
+ sku = json['sku'];
+ isRx = json['is_rx'];
+ prescriptionRequired = json['prescription_required'];
+ rxMessage = json['rx_message'];
+ rxMessagen = json['rx_messagen'];
+ manufacturerPartNumber = json['manufacturer_part_number'];
+ gtin = json['gtin'];
+ isGiftCard = json['is_gift_card'];
+ requireOtherProducts = json['require_other_products'];
+ automaticallyAddRequiredProducts =
+ json['automatically_add_required_products'];
+ isDownload = json['is_download'];
+ unlimitedDownloads = json['unlimited_downloads'];
+ maxNumberOfDownloads = json['max_number_of_downloads'];
+ downloadExpirationDays = json['download_expiration_days'];
+ hasSampleDownload = json['has_sample_download'];
+ hasUserAgreement = json['has_user_agreement'];
+ isRecurring = json['is_recurring'];
+ recurringCycleLength = json['recurring_cycle_length'];
+ recurringTotalCycles = json['recurring_total_cycles'];
+ isRental = json['is_rental'];
+ rentalPriceLength = json['rental_price_length'];
+ isShipEnabled = json['is_ship_enabled'];
+ isFreeShipping = json['is_free_shipping'];
+ shipSeparately = json['ship_separately'];
+ additionalShippingCharge = json['additional_shipping_charge'];
+ isTaxExempt = json['is_tax_exempt'];
+ isTelecommunicationsOrBroadcastingOrElectronicServices =
+ json['is_telecommunications_or_broadcasting_or_electronic_services'];
+ useMultipleWarehouses = json['use_multiple_warehouses'];
+ manageInventoryMethodId = json['manage_inventory_method_id'];
+ stockQuantity = json['stock_quantity'];
+ stockAvailability = json['stock_availability'];
+ stockAvailabilityn = json['stock_availabilityn'];
+ displayStockAvailability = json['display_stock_availability'];
+ displayStockQuantity = json['display_stock_quantity'];
+ minStockQuantity = json['min_stock_quantity'];
+ notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below'];
+ allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions'];
+ orderMinimumQuantity = json['order_minimum_quantity'];
+ orderMaximumQuantity = json['order_maximum_quantity'];
+ allowedQuantities = json['allowed_quantities'];
+ allowAddingOnlyExistingAttributeCombinations =
+ json['allow_adding_only_existing_attribute_combinations'];
+ disableBuyButton = json['disable_buy_button'];
+ disableWishlistButton = json['disable_wishlist_button'];
+ availableForPreOrder = json['available_for_pre_order'];
+ preOrderAvailabilityStartDateTimeUtc =
+ json['pre_order_availability_start_date_time_utc'];
+ callForPrice = json['call_for_price'];
+ price = json['price'];
+ oldPrice = json['old_price'];
+ productCost = json['product_cost'];
+ specialPrice = json['special_price'];
+ specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc'];
+ specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc'];
+ customerEntersPrice = json['customer_enters_price'];
+ minimumCustomerEnteredPrice = json['minimum_customer_entered_price'];
+ maximumCustomerEnteredPrice = json['maximum_customer_entered_price'];
+ basepriceEnabled = json['baseprice_enabled'];
+ basepriceAmount = json['baseprice_amount'];
+ basepriceBaseAmount = json['baseprice_base_amount'];
+ hasTierPrices = json['has_tier_prices'];
+ hasDiscountsApplied = json['has_discounts_applied'];
+ discountName = json['discount_name'];
+ discountNamen = json['discount_namen'];
+ discountDescription = json['discount_description'];
+ discountDescriptionn = json['discount_Descriptionn'];
+ discountPercentage = json['discount_percentage'];
+ currency = json['currency'];
+ currencyn = json['currencyn'];
+ weight = json['weight'];
+ length = json['length'];
+ width = json['width'];
+ height = json['height'];
+ availableStartDateTimeUtc = json['available_start_date_time_utc'];
+ availableEndDateTimeUtc = json['available_end_date_time_utc'];
+ displayOrder = json['display_order'];
+ published = json['published'];
+ deleted = json['deleted'];
+ createdOnUtc = json['created_on_utc'];
+ updatedOnUtc = json['updated_on_utc'];
+ productType = json['product_type'];
+ parentGroupedProductId = json['parent_grouped_product_id'];
+ vendorId = json['vendor_id'];
+ seName = json['se_name'];
+ if (json['images'] != null) {
+ images = new List();
+ json['images'].forEach((v) {
+ images.add(new Images.fromJson(v));
+ });
+ }
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['id'] = this.id;
+ data['visible_individually'] = this.visibleIndividually;
+ data['name'] = this.name;
+ data['namen'] = this.namen;
+ data['short_description'] = this.shortDescription;
+ data['short_descriptionn'] = this.shortDescriptionn;
+ data['full_description'] = this.fullDescription;
+ data['full_descriptionn'] = this.fullDescriptionn;
+ data['markas_new'] = this.markasNew;
+ data['show_on_home_page'] = this.showOnHomePage;
+ data['meta_keywords'] = this.metaKeywords;
+ data['meta_description'] = this.metaDescription;
+ data['meta_title'] = this.metaTitle;
+ data['allow_customer_reviews'] = this.allowCustomerReviews;
+ data['approved_rating_sum'] = this.approvedRatingSum;
+ data['not_approved_rating_sum'] = this.notApprovedRatingSum;
+ data['approved_total_reviews'] = this.approvedTotalReviews;
+ data['not_approved_total_reviews'] = this.notApprovedTotalReviews;
+ data['sku'] = this.sku;
+ data['is_rx'] = this.isRx;
+ data['prescription_required'] = this.prescriptionRequired;
+ data['rx_message'] = this.rxMessage;
+ data['rx_messagen'] = this.rxMessagen;
+ data['manufacturer_part_number'] = this.manufacturerPartNumber;
+ data['gtin'] = this.gtin;
+ data['is_gift_card'] = this.isGiftCard;
+ data['require_other_products'] = this.requireOtherProducts;
+ data['automatically_add_required_products'] =
+ this.automaticallyAddRequiredProducts;
+ data['is_download'] = this.isDownload;
+ data['unlimited_downloads'] = this.unlimitedDownloads;
+ data['max_number_of_downloads'] = this.maxNumberOfDownloads;
+ data['download_expiration_days'] = this.downloadExpirationDays;
+ data['has_sample_download'] = this.hasSampleDownload;
+ data['has_user_agreement'] = this.hasUserAgreement;
+ data['is_recurring'] = this.isRecurring;
+ data['recurring_cycle_length'] = this.recurringCycleLength;
+ data['recurring_total_cycles'] = this.recurringTotalCycles;
+ data['is_rental'] = this.isRental;
+ data['rental_price_length'] = this.rentalPriceLength;
+ data['is_ship_enabled'] = this.isShipEnabled;
+ data['is_free_shipping'] = this.isFreeShipping;
+ data['ship_separately'] = this.shipSeparately;
+ data['additional_shipping_charge'] = this.additionalShippingCharge;
+ data['is_tax_exempt'] = this.isTaxExempt;
+ data['is_telecommunications_or_broadcasting_or_electronic_services'] =
+ this.isTelecommunicationsOrBroadcastingOrElectronicServices;
+ data['use_multiple_warehouses'] = this.useMultipleWarehouses;
+ data['manage_inventory_method_id'] = this.manageInventoryMethodId;
+ data['stock_quantity'] = this.stockQuantity;
+ data['stock_availability'] = this.stockAvailability;
+ data['stock_availabilityn'] = this.stockAvailabilityn;
+ data['display_stock_availability'] = this.displayStockAvailability;
+ data['display_stock_quantity'] = this.displayStockQuantity;
+ data['min_stock_quantity'] = this.minStockQuantity;
+ data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow;
+ data['allow_back_in_stock_subscriptions'] =
+ this.allowBackInStockSubscriptions;
+ data['order_minimum_quantity'] = this.orderMinimumQuantity;
+ data['order_maximum_quantity'] = this.orderMaximumQuantity;
+ data['allowed_quantities'] = this.allowedQuantities;
+ data['allow_adding_only_existing_attribute_combinations'] =
+ this.allowAddingOnlyExistingAttributeCombinations;
+ data['disable_buy_button'] = this.disableBuyButton;
+ data['disable_wishlist_button'] = this.disableWishlistButton;
+ data['available_for_pre_order'] = this.availableForPreOrder;
+ data['pre_order_availability_start_date_time_utc'] =
+ this.preOrderAvailabilityStartDateTimeUtc;
+ data['call_for_price'] = this.callForPrice;
+ data['price'] = this.price;
+ data['old_price'] = this.oldPrice;
+ data['product_cost'] = this.productCost;
+ data['special_price'] = this.specialPrice;
+ data['special_price_start_date_time_utc'] =
+ this.specialPriceStartDateTimeUtc;
+ data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc;
+ data['customer_enters_price'] = this.customerEntersPrice;
+ data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice;
+ data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice;
+ data['baseprice_enabled'] = this.basepriceEnabled;
+ data['baseprice_amount'] = this.basepriceAmount;
+ data['baseprice_base_amount'] = this.basepriceBaseAmount;
+ data['has_tier_prices'] = this.hasTierPrices;
+ data['has_discounts_applied'] = this.hasDiscountsApplied;
+ data['discount_name'] = this.discountName;
+ data['discount_namen'] = this.discountNamen;
+ data['discount_description'] = this.discountDescription;
+ data['discount_Descriptionn'] = this.discountDescriptionn;
+ data['discount_percentage'] = this.discountPercentage;
+ data['currency'] = this.currency;
+ data['currencyn'] = this.currencyn;
+ data['weight'] = this.weight;
+ data['length'] = this.length;
+ data['width'] = this.width;
+ data['height'] = this.height;
+ data['available_start_date_time_utc'] = this.availableStartDateTimeUtc;
+ data['available_end_date_time_utc'] = this.availableEndDateTimeUtc;
+ data['display_order'] = this.displayOrder;
+ data['published'] = this.published;
+ data['deleted'] = this.deleted;
+ data['created_on_utc'] = this.createdOnUtc;
+ data['updated_on_utc'] = this.updatedOnUtc;
+ data['product_type'] = this.productType;
+ data['parent_grouped_product_id'] = this.parentGroupedProductId;
+ data['vendor_id'] = this.vendorId;
+ data['se_name'] = this.seName;
+ if (this.images != null) {
+ data['images'] = this.images.map((v) => v.toJson()).toList();
+ }
+
+ return data;
+ }
+}
+
+class Images {
+ int id;
+ int position;
+ String src;
+ String thumb;
+ String attachment;
+
+ Images({this.id, this.position, this.src, this.thumb, this.attachment});
+
+ Images.fromJson(Map json) {
+ id = json['id'];
+ position = json['position'];
+ src = json['src'];
+ thumb = json['thumb'];
+ attachment = json['attachment'];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['id'] = this.id;
+ data['position'] = this.position;
+ data['src'] = this.src;
+ data['thumb'] = this.thumb;
+ data['attachment'] = this.attachment;
+ return data;
+ }
+}
diff --git a/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart b/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart
index 12d7eab3..34fa4bbb 100644
--- a/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart
+++ b/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart
@@ -25,7 +25,7 @@ class CustomerAddressesService extends BaseService {
var date = f.format(DateTime.now().toUtc()) + " GMT";
addNewAddressRequestModel.customer.addresses[0].createdOnUtc = date;
hasError = false;
- await baseAppClient.post(ADD_ADDRESS_INFO,
+ await baseAppClient.post(BASE_PHARMACY_URL+ADD_ADDRESS_INFO,
onSuccess: (dynamic response, int statusCode) {
addressesList.clear();
response["customers"][0]["addresses"].forEach((data) {
@@ -43,7 +43,7 @@ class CustomerAddressesService extends BaseService {
'fields':'addresses'
};
hasError = false;
- await baseAppClient.getPharmacy("$GET_CUSTOMER_ADDRESSES${customerInfo.customerId}",
+ await baseAppClient.getPharmacy("$BASE_PHARMACY_URL$GET_CUSTOMER_ADDRESSES${customerInfo.customerId}",
onSuccess: (dynamic response, int statusCode) {
addressesList.clear();
response["customers"][0]["addresses"].forEach((data) {
@@ -63,7 +63,7 @@ class CustomerAddressesService extends BaseService {
};
hasError = false;
- await baseAppClient.getPharmacy(GET_CUSTOMER_INFO,
+ await baseAppClient.getPharmacy(BASE_PHARMACY_URL+GET_CUSTOMER_INFO,
onSuccess: (dynamic response, int statusCode) {
customerInfo= CustomerInfo.fromJson(response);
}, onFailure: (String error, int statusCode) {
diff --git a/lib/core/service/PrescriptionDeliveryService.dart b/lib/core/service/PrescriptionDeliveryService.dart
new file mode 100644
index 00000000..c36efe89
--- /dev/null
+++ b/lib/core/service/PrescriptionDeliveryService.dart
@@ -0,0 +1,30 @@
+import 'package:diplomaticquarterapp/config/config.dart';
+import 'package:diplomaticquarterapp/core/service/base_service.dart';
+
+class PrescriptionDeliveryService extends BaseService {
+ Future insertDeliveryOrder(
+ {int lineItemNo,
+ double latitude,
+ double longitude,
+ int appointmentNo,
+ int createdBy,
+ int dischargeID}) async {
+ hasError = false;
+ Map body = Map();
+ body['LineItemNo'] = lineItemNo;
+ body['Latitude'] = latitude;
+ body['Longitude'] = longitude;
+ body['AppointmentNo'] = appointmentNo;
+ body['CreatedBy'] = createdBy;
+ body['DischargeID'] = dischargeID;
+ await baseAppClient.post(INSERT_ER_INERT_PRES_ORDER,
+ onSuccess: (dynamic response, int statusCode) {
+ var asd="";
+ },
+ onFailure: (String error, int statusCode) {
+ hasError = true;
+ print(error);
+ super.error = error;
+ }, body: body);
+ }
+}
diff --git a/lib/core/service/ancillary_orders_service.dart b/lib/core/service/ancillary_orders_service.dart
new file mode 100644
index 00000000..b9d14a06
--- /dev/null
+++ b/lib/core/service/ancillary_orders_service.dart
@@ -0,0 +1,204 @@
+import 'package:diplomaticquarterapp/config/config.dart';
+import 'package:diplomaticquarterapp/core/service/base_service.dart';
+import 'package:diplomaticquarterapp/models/anicllary-orders/ancillary_order_list_model.dart';
+import 'package:diplomaticquarterapp/models/anicllary-orders/ancillary_order_proc_model.dart';
+
+class AncillaryOrdersService extends BaseService {
+ List _ancillaryLists = List();
+ List get ancillaryLists => _ancillaryLists;
+ List _ancillaryProcLists = List();
+ List get ancillaryProcLists =>
+ _ancillaryProcLists;
+
+ Future getOrders() async {
+ Map body = Map();
+
+ hasError = false;
+
+ await baseAppClient.post(GET_ANCILLARY_ORDERS,
+ onSuccess: (dynamic response, int statusCode) {
+ _ancillaryLists = [];
+ response['AncillaryOrderList'].forEach((item) {
+ ancillaryLists.add(AncillaryOrdersListModel.fromJson(item));
+ });
+ }, onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ }, body: body);
+ }
+
+ Future getOrdersDetails(appointmentNo, orderNo) async {
+ Map body = Map();
+
+ hasError = false;
+
+ await baseAppClient.post(GET_ANCILLARY_ORDERS_DETAILS,
+ onSuccess: (dynamic response, int statusCode) {
+ _ancillaryProcLists = [];
+ response['AncillaryOrderProcList'] = [
+ {
+ "AncillaryOrderProcList": [
+ {
+ "ApprovalLineItemNo": 0,
+ "ApprovalNo": 0,
+ "ApprovalStatus": "",
+ "ApprovalStatusID": 0,
+ "CompanyShare": 501.3,
+ "CompanyShareWithTax": 576.5,
+ "CompanyTaxAmount": 75.19,
+ "DiscountAmount": 55.7,
+ "DiscountCategory": 1,
+ "DiscountType": "P",
+ "DiscountTypeValue": 10,
+ "IsApprovalCreated": false,
+ "IsApprovalRequired": false,
+ "IsCovered": false,
+ "OrderDate": "/Date(1601758800000+0300)/",
+ "OrderLineItemNo": 1,
+ "OrderNo": 2020000001,
+ "PartnerID": 0,
+ "PartnerShare": 0,
+ "PartnerShareType": "P",
+ "PatientShare": 0,
+ "PatientShareWithTax": 0,
+ "PatientTaxAmount": 0,
+ "ProcPrice": 557,
+ "ProcedureCategoryID": 2,
+ "ProcedureCategoryName": "LABORATORY",
+ "ProcedureID": "02013001",
+ "ProcedureName": "11-DESOXYCORTISOL (COMPOUND S) - S.O",
+ "TaxAmount": 75.19,
+ "TaxPct": 15
+ },
+ {
+ "ApprovalLineItemNo": 0,
+ "ApprovalNo": 0,
+ "ApprovalStatus": "",
+ "ApprovalStatusID": 0,
+ "CompanyShare": 90,
+ "CompanyShareWithTax": 103.5,
+ "CompanyTaxAmount": 13.5,
+ "DiscountAmount": 10,
+ "DiscountCategory": 1,
+ "DiscountType": "P",
+ "DiscountTypeValue": 10,
+ "IsApprovalCreated": false,
+ "IsApprovalRequired": true,
+ "IsCovered": false,
+ "OrderDate": "/Date(1601758800000+0300)/",
+ "OrderLineItemNo": 4,
+ "OrderNo": 2020000001,
+ "PartnerID": 0,
+ "PartnerShare": 0,
+ "PartnerShareType": "P",
+ "PatientShare": 0,
+ "PatientShareWithTax": 0,
+ "PatientTaxAmount": 0,
+ "ProcPrice": 100,
+ "ProcedureCategoryID": 2,
+ "ProcedureCategoryName": "LABORATORY",
+ "ProcedureID": "02014011",
+ "ProcedureName": "CBC (COMPLETE BLOOD COUNT PROFILE)",
+ "TaxAmount": 13.5,
+ "TaxPct": 15
+ },
+ {
+ "ApprovalLineItemNo": 0,
+ "ApprovalNo": 0,
+ "ApprovalStatus": "",
+ "ApprovalStatusID": 0,
+ "CompanyShare": 347.76,
+ "CompanyShareWithTax": 399.92,
+ "CompanyTaxAmount": 52.16,
+ "DiscountAmount": 38.64,
+ "DiscountCategory": 1,
+ "DiscountType": "P",
+ "DiscountTypeValue": 10,
+ "IsApprovalCreated": false,
+ "IsApprovalRequired": false,
+ "IsCovered": false,
+ "OrderDate": "/Date(1601758800000+0300)/",
+ "OrderLineItemNo": 3,
+ "OrderNo": 2020000001,
+ "PartnerID": 0,
+ "PartnerShare": 0,
+ "PartnerShareType": "P",
+ "PatientShare": 0,
+ "PatientShareWithTax": 0,
+ "PatientTaxAmount": 0,
+ "ProcPrice": 386.4,
+ "ProcedureCategoryID": 2,
+ "ProcedureCategoryName": "LABORATORY",
+ "ProcedureID": "02019302",
+ "ProcedureName": "21-HYDROXYLASE ABS - S.O",
+ "TaxAmount": 52.16,
+ "TaxPct": 15
+ },
+ {
+ "ApprovalLineItemNo": 0,
+ "ApprovalNo": 0,
+ "ApprovalStatus": "",
+ "ApprovalStatusID": 0,
+ "CompanyShare": 1323,
+ "CompanyShareWithTax": 1521.45,
+ "CompanyTaxAmount": 198.45,
+ "DiscountAmount": 147,
+ "DiscountCategory": 1,
+ "DiscountType": "P",
+ "DiscountTypeValue": 10,
+ "IsApprovalCreated": false,
+ "IsApprovalRequired": true,
+ "IsCovered": false,
+ "OrderDate": "/Date(1601758800000+0300)/",
+ "OrderLineItemNo": 5,
+ "OrderNo": 2020000001,
+ "PartnerID": 0,
+ "PartnerShare": 0,
+ "PartnerShareType": "P",
+ "PatientShare": 0,
+ "PatientShareWithTax": 0,
+ "PatientTaxAmount": 0,
+ "ProcPrice": 1470,
+ "ProcedureCategoryID": 3,
+ "ProcedureCategoryName": "RADIOLOGY",
+ "ProcedureID": "03033065",
+ "ProcedureName": "CT SCAN - ABDOMEN (WITH CONTRAST)",
+ "TaxAmount": 198.45,
+ "TaxPct": 15
+ }
+ ],
+ "AppointmentDate": "/Date(1601499600000+0300)/",
+ "AppointmentNo": 2016053756,
+ "ClinicID": 1,
+ "ClinicName": "INTERNAL MEDICINE CLINIC",
+ "CompanyID": 0,
+ "CompanyName": "Blood Donation Investigation",
+ "DoctorID": 1485,
+ "DoctorName": "ANAS ABDULLAH",
+ "ErrCode": null,
+ "GroupID": 2,
+ "InsurancePolicyNo": "45976500",
+ "Message": "Success",
+ "PatientCardID": "232332323",
+ "PatientID": 3072055,
+ "PatientName": "MAYA KHALED SADDIQ",
+ "PatientType": 1,
+ "PolicyID": 2,
+ "PolicyName": "Test",
+ "ProjectID": 15,
+ "SetupID": "010266",
+ "StatusCode": 1,
+ "SubCategoryID": 2,
+ "SubPolicyNo": "234234"
+ }
+ ];
+
+ response['AncillaryOrderProcList'].forEach((item) {
+ ancillaryProcLists.add(AncillaryOrdersListProcListModel.fromJson(item));
+ });
+ }, onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ }, body: body);
+ }
+}
diff --git a/lib/core/service/blood/blood_donation_service.dart b/lib/core/service/blood/blood_donation_service.dart
index 326407a3..9fc11c04 100644
--- a/lib/core/service/blood/blood_donation_service.dart
+++ b/lib/core/service/blood/blood_donation_service.dart
@@ -1,4 +1,5 @@
import 'package:diplomaticquarterapp/config/config.dart';
+import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/model/blooddonation/get_all_cities.dart';
import '../base_service.dart';
@@ -25,4 +26,52 @@ class BloodDonationService extends BaseService {
super.error = error;
}, body: body);
}
+ Future bloodDonationSave(request) async {
+ var localRes;
+ try {
+ await baseAppClient.post(SAVE_BLOOD_REQUEST,
+ onSuccess: (dynamic response, int statusCode) {
+ localRes = response;
+ }, onFailure: (String error, int statusCode) {
+ localRes = error;
+ return Future.value(error);
+ }, body: request);
+ return Future.value(localRes);
+ } catch (error) {
+ throw error;
+ }
+ }
+
+ Future getAgreement() async {
+ var localRes;
+ try {
+ await baseAppClient.post(GET_BLOOD_AGREEMENT,
+ onSuccess: (dynamic response, int statusCode) {
+ localRes = response;
+ }, onFailure: (String error, int statusCode) {
+ localRes = error;
+ return Future.value(error);
+ }, body: {});
+ return Future.value(localRes);
+ } catch (error) {
+ throw error;
+ }
+ }
+
+
+ Future saveAgreement(request) async {
+ var localRes;
+ try {
+ await baseAppClient.post(SAVE_BLOOD_AGREEMENT,
+ onSuccess: (dynamic response, int statusCode) {
+ localRes = response;
+ }, onFailure: (String error, int statusCode) {
+ localRes = error;
+ return Future.value(error);
+ }, body: request);
+ return Future.value(localRes);
+ } catch (error) {
+ throw error;
+ }
+ }
}
diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart
index 24fd202f..ca12a1e6 100644
--- a/lib/core/service/client/base_app_client.dart
+++ b/lib/core/service/client/base_app_client.dart
@@ -5,9 +5,12 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart';
-import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/pages/appUpdatePage/app_update_page.dart';
+import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
+import 'package:diplomaticquarterapp/uitl/app_toast.dart';
+import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
+import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
@@ -46,7 +49,7 @@ class BaseAppClient {
//Map profile = await sharedPref.getObj(DOCTOR_PROFILE);
var pharmacyToken = await sharedPref.getString(PHARMACY_AUTORZIE_TOKEN);
var user = await sharedPref.getObject(USER_PROFILE);
- Map headers = {
+ Map headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
};
@@ -125,14 +128,14 @@ class BaseAppClient {
if (await Utils.checkConnection()) {
final response = await http.post(url.trim(),
- body: json.encode(body),
- headers: headers);
+ body: json.encode(body), headers: headers);
final int statusCode = response.statusCode;
print("statusCode :$statusCode");
if (statusCode < 200 || statusCode >= 400 || json == null) {
onFailure('Error While Fetching data', statusCode);
} else {
- var parsed = json.decode(response.body.toString());
+ // var parsed = json.decode(response.body.toString());
+ var parsed = json.decode(utf8.decode(response.bodyBytes));
if (parsed['Response_Message'] != null) {
onSuccess(parsed, statusCode);
} else {
@@ -164,21 +167,214 @@ class BaseAppClient {
onSuccess(parsed, statusCode);
} else if (parsed['MessageStatus'] == 2 &&
parsed['IsAuthenticated']) {
- if (parsed['message'] == null &&
- parsed['ErrorEndUserMessage'] == null) {
- if(parsed['ErrorSearchMsg'] == null ){
- onFailure("Server Error found with no available message",
+ if (parsed['SameClinicApptList'] != null) {
+ onSuccess(parsed, statusCode);
+ } else {
+ if (parsed['message'] == null &&
+ parsed['ErrorEndUserMessage'] == null) {
+ if (parsed['ErrorSearchMsg'] == null) {
+ onFailure("Server Error found with no available message",
+ statusCode);
+ } else {
+ onFailure(parsed['ErrorSearchMsg'], statusCode);
+ }
+ } else {
+ onFailure(
+ parsed['message'] ??
+ parsed['ErrorEndUserMessage'] ??
+ parsed['ErrorMessage'],
statusCode);
- }else {
- onFailure(parsed['ErrorSearchMsg'],
+ }
+ }
+ } else if (!parsed['IsAuthenticated']) {
+ await logout();
+
+ //helpers.showErrorToast('Your session expired Please login agian');
+ } else {
+ if (parsed['SameClinicApptList'] != null) {
+ onSuccess(parsed, statusCode);
+ } else {
+ if (parsed['message'] != null) {
+ onFailure(parsed['message'] ?? parsed['message'], statusCode);
+ } else {
+ onFailure(
+ parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'],
statusCode);
}
+ }
+ }
+ }
+ }
+ } else {
+ onFailure('Please Check The Internet Connection', -1);
+ }
+ } catch (e) {
+ print(e);
+ onFailure(e.toString(), -1);
+ }
+ }
+
+ postPharmacy(String endPoint,
+ {Map body,
+ Function(dynamic response, int statusCode) onSuccess,
+ Function(String error, int statusCode) onFailure,
+ bool isAllowAny = false,
+ bool isExternal = false}) async {
+
+ var token = await sharedPref.getString(PHARMACY_AUTORZIE_TOKEN);
+ var user = await sharedPref.getObject(USER_PROFILE);
+ String url;
+ if (isExternal) {
+ url = endPoint;
+ } else {
+ url = PHARMACY_BASE_URL + endPoint;
+ }
+ try {
+ //Map profile = await sharedPref.getObj(DOCTOR_PROFILE);
+ var pharmacyToken = await sharedPref.getString(PHARMACY_AUTORZIE_TOKEN);
+ var user = await sharedPref.getObject(USER_PROFILE);
+ Map headers = {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': token ?? '',
+ 'Mobilenumber': user != null
+ ? getPhoneNumberWithoutZero(user['MobileNumber'].toString())
+ : "",
+ 'Statictoken': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9',
+ 'Username': user != null ? user['PatientID'].toString() : "",
+ };
+ if (!isExternal) {
+ String token = await sharedPref.getString(TOKEN);
+ var languageID =
+ await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar');
+ if (body.containsKey('SetupID')) {
+ body['SetupID'] = body.containsKey('SetupID')
+ ? body['SetupID'] != null
+ ? body['SetupID']
+ : SETUP_ID
+ : SETUP_ID;
+ }
+
+ body['VersionID'] = VERSION_ID;
+ body['Channel'] = CHANNEL;
+ body['LanguageID'] = languageID == 'ar' ? 1 : 2;
+
+ body['IPAdress'] = IP_ADDRESS;
+ body['generalid'] = GENERAL_ID;
+ body['PatientOutSA'] = body.containsKey('PatientOutSA')
+ ? body['PatientOutSA'] != null
+ ? body['PatientOutSA']
+ : PATIENT_OUT_SA
+ : PATIENT_OUT_SA;
+
+ if (body.containsKey('isDentalAllowedBackend')) {
+ body['isDentalAllowedBackend'] =
+ body.containsKey('isDentalAllowedBackend')
+ ? body['isDentalAllowedBackend'] != null
+ ? body['isDentalAllowedBackend']
+ : IS_DENTAL_ALLOWED_BACKEND
+ : IS_DENTAL_ALLOWED_BACKEND;
+ }
+
+ body['DeviceTypeID'] = DeviceTypeID;
+
+ if (!body.containsKey('IsPublicRequest')) {
+ body['PatientType'] = body.containsKey('PatientType')
+ ? body['PatientType'] != null
+ ? body['PatientType']
+ : user['PatientType'] != null
+ ? user['PatientType']
+ : PATIENT_TYPE
+ : PATIENT_TYPE;
+
+ body['PatientTypeID'] = body.containsKey('PatientTypeID')
+ ? body['PatientTypeID'] != null
+ ? body['PatientTypeID']
+ : user['PatientType'] != null
+ ? user['PatientType']
+ : PATIENT_TYPE_ID
+ : PATIENT_TYPE_ID;
+ if (user != null) {
+ body['TokenID'] = token;
+ body['PatientID'] = body['PatientID'] != null
+ ? body['PatientID']
+ : user['PatientID'];
+ body['PatientOutSA'] = user['OutSA'];
+ body['SessionID'] = SESSION_ID; //getSe
+ headers = {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': pharmacyToken,
+ 'Mobilenumber': user['MobileNumber'].toString(),
+ 'Statictoken': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9',
+ 'Username': user['PatientID'].toString(),
+ };
+ }
+ }
+ }
+
+ print("URL : $url");
+ print("Body : ${json.encode(body)}");
+
+ if (await Utils.checkConnection()) {
+ final response = await http.post(url.trim(),
+ body: json.encode(body), headers: headers);
+ final int statusCode = response.statusCode;
+ print("statusCode :$statusCode");
+ if (statusCode < 200 || statusCode >= 400 || json == null) {
+ onFailure('Error While Fetching data', statusCode);
+ } else {
+ // var parsed = json.decode(response.body.toString());
+ var parsed = json.decode(utf8.decode(response.bodyBytes));
+ if (parsed['Response_Message'] != null) {
+ onSuccess(parsed, statusCode);
+ } else {
+ if (parsed['ErrorType'] == 4) {
+ navigateToAppUpdate(
+ AppGlobal.context, parsed['ErrorEndUserMessage']);
+ }
+ if (isAllowAny) {
+ onSuccess(parsed, statusCode);
+ } else if (parsed['IsAuthenticated'] == null) {
+ if (parsed['isSMSSent'] == true) {
+ onSuccess(parsed, statusCode);
+ } else if (parsed['MessageStatus'] == 1) {
+ onSuccess(parsed, statusCode);
+ } else if (parsed['Result'] == 'OK') {
+ onSuccess(parsed, statusCode);
} else {
- onFailure(
- parsed['message'] ??
- parsed['ErrorEndUserMessage'] ??
- parsed['ErrorMessage'],
- statusCode);
+ if (parsed != null) {
+ onSuccess(parsed, statusCode);
+ } else {
+ onFailure(
+ parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'],
+ statusCode);
+ logout();
+ }
+ }
+ } else if (parsed['MessageStatus'] == 1 ||
+ parsed['SMSLoginRequired'] == true) {
+ onSuccess(parsed, statusCode);
+ } else if (parsed['MessageStatus'] == 2 &&
+ parsed['IsAuthenticated']) {
+ if (parsed['SameClinicApptList'] != null) {
+ onSuccess(parsed, statusCode);
+ } else {
+ if (parsed['message'] == null &&
+ parsed['ErrorEndUserMessage'] == null) {
+ if (parsed['ErrorSearchMsg'] == null) {
+ onFailure("Server Error found with no available message",
+ statusCode);
+ } else {
+ onFailure(parsed['ErrorSearchMsg'], statusCode);
+ }
+ } else {
+ onFailure(
+ parsed['message'] ??
+ parsed['ErrorEndUserMessage'] ??
+ parsed['ErrorMessage'],
+ statusCode);
+ }
}
} else if (!parsed['IsAuthenticated']) {
await logout();
@@ -210,9 +406,7 @@ class BaseAppClient {
Future navigateToAppUpdate(context, String text) async {
Navigator.pushReplacement(
- context,
- MaterialPageRoute(
- builder: (context) => AppUpdatePage(appUpdateText: text)));
+ context, FadePage(page: AppUpdatePage(appUpdateText: text)));
}
get(String endPoint,
@@ -247,7 +441,8 @@ class BaseAppClient {
if (statusCode < 200 || statusCode >= 400 || json == null) {
onFailure('Error While Fetching data', statusCode);
} else {
- var parsed = json.decode(response.body.toString());
+ // var parsed = json.decode(response.body.toString());
+ var parsed = json.decode(utf8.decode(response.bodyBytes));
onSuccess(parsed, statusCode);
}
} else {
@@ -260,7 +455,9 @@ class BaseAppClient {
Function(String error, int statusCode) onFailure,
bool isAllowAny = false,
bool isExternal = false,
- Map queryParams}) async {
+ Map queryParams}) async {
+ var token = await sharedPref.getString(PHARMACY_AUTORZIE_TOKEN);
+ var user = await sharedPref.getObject(USER_PROFILE);
String url;
if (isExternal) {
@@ -274,26 +471,33 @@ class BaseAppClient {
}
print("URL : $url");
- var token = await sharedPref.getString(PHARMACY_AUTORZIE_TOKEN);
- var user = await sharedPref.getObject(USER_PROFILE);
if (await Utils.checkConnection()) {
final response = await http.get(url.trim(), headers: {
- 'Content-Type': 'application/json',
+ 'Content-Type': 'text/html; charset=utf-8',
'Accept': 'application/json',
- 'Authorization': token,
- 'Mobilenumber': user['MobileNumber'].toString(),
+ 'Authorization': token ?? '',
+ 'Mobilenumber': user != null
+ ? getPhoneNumberWithoutZero(user['MobileNumber'].toString())
+ : "",
'Statictoken': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9',
- 'Username': user['PatientID'].toString(),
+ 'Username': user != null ? user['PatientID'].toString() : "",
});
final int statusCode = response.statusCode;
print("statusCode :$statusCode");
if (statusCode < 200 || statusCode >= 400 || json == null) {
- onFailure('Error While Fetching data', statusCode);
+ if (statusCode == 401) {
+ AppToast.showErrorToast(
+ message: TranslationBase.of(AppGlobal.context).pharmacyRelogin);
+ Navigator.of(AppGlobal.context).pushNamed(HOME);
+ } else {
+ onFailure('Error While Fetching data', statusCode);
+ }
} else {
- var parsed = json.decode(response.body.toString());
- onSuccess(parsed, statusCode);
+ // var parsed = json.decode(response.body.toString());
+ var bodyUtf = json.decode(utf8.decode(response.bodyBytes));
+ onSuccess(bodyUtf, statusCode);
}
} else {
onFailure('Please Check The Internet Connection', -1);
@@ -304,7 +508,6 @@ class BaseAppClient {
{ Map body,
Function(dynamic response, int statusCode) onSuccess,
Function(String error, int statusCode) onFailure,}) async {
-
String url = fullUrl;
print("URL Query String: $url");
@@ -477,4 +680,192 @@ class BaseAppClient {
return params;
}
+
+
+ pharmacyPost(String endPoint,
+ {Map body,
+ Function(dynamic response, int statusCode) onSuccess,
+ Function(String error, int statusCode) onFailure,
+ bool isAllowAny = false,
+ bool isExternal = false}) async {
+ var token = await sharedPref.getString(PHARMACY_AUTORZIE_TOKEN);
+ var user = await sharedPref.getObject(USER_PROFILE);
+ String url;
+ if (isExternal) {
+ url = endPoint;
+ } else {
+ url = BASE_PHARMACY_URL + endPoint;
+ }
+ try {
+ if (isExternal) {
+ String token = await sharedPref.getString(TOKEN);
+ var languageID =
+ await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar');
+ var user = await sharedPref.getObject(USER_PROFILE);
+ if (body.containsKey('SetupID')) {
+ body['SetupID'] = body.containsKey('SetupID')
+ ? body['SetupID'] != null
+ ? body['SetupID']
+ : SETUP_ID
+ : SETUP_ID;
+ }
+
+ body['VersionID'] = VERSION_ID;
+ body['Channel'] = CHANNEL;
+ body['LanguageID'] = languageID == 'ar' ? 1 : 2;
+
+ body['IPAdress'] = IP_ADDRESS;
+ body['generalid'] = GENERAL_ID;
+ body['PatientOutSA'] = body.containsKey('PatientOutSA')
+ ? body['PatientOutSA'] != null
+ ? body['PatientOutSA']
+ : PATIENT_OUT_SA
+ : PATIENT_OUT_SA;
+
+ if (body.containsKey('isDentalAllowedBackend')) {
+ body['isDentalAllowedBackend'] =
+ body.containsKey('isDentalAllowedBackend')
+ ? body['isDentalAllowedBackend'] != null
+ ? body['isDentalAllowedBackend']
+ : IS_DENTAL_ALLOWED_BACKEND
+ : IS_DENTAL_ALLOWED_BACKEND;
+ }
+
+ body['DeviceTypeID'] = DeviceTypeID;
+
+ if (!body.containsKey('IsPublicRequest')) {
+ body['PatientType'] = body.containsKey('PatientType')
+ ? body['PatientType'] != null
+ ? body['PatientType']
+ : user['PatientType'] != null
+ ? user['PatientType']
+ : PATIENT_TYPE
+ : PATIENT_TYPE;
+
+ body['PatientTypeID'] = body.containsKey('PatientTypeID')
+ ? body['PatientTypeID'] != null
+ ? body['PatientTypeID']
+ : user['PatientType'] != null
+ ? user['PatientType']
+ : PATIENT_TYPE_ID
+ : PATIENT_TYPE_ID;
+ if (user != null) {
+ body['TokenID'] = token;
+ body['PatientID'] = body['PatientID'] != null
+ ? body['PatientID']
+ : user['PatientID'];
+ body['PatientOutSA'] = user['OutSA'];
+ body['SessionID'] = SESSION_ID; //getSessionId(token);
+ }
+ }
+ }
+
+ print("URL : $url");
+ print("Body : ${json.encode(body)}");
+ var ss = json.encode(body);
+
+ if (await Utils.checkConnection()) {
+ final response =
+ await http.post(url.trim(), body: json.encode(body), headers: {
+ // 'Content-Type': 'application/json',
+ // 'Accept': 'application/json',
+ // 'Statictoken': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9',
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': token ?? '',
+ 'Mobilenumber': user != null
+ ? getPhoneNumberWithoutZero(user['MobileNumber'].toString())
+ : "",
+ 'Statictoken': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9',
+ 'Username': user != null ? user['PatientID'].toString() : "",
+ });
+ final int statusCode = response.statusCode;
+ print("statusCode :$statusCode");
+ if (statusCode < 200 || statusCode >= 400 || json == null) {
+ onFailure('Error While Fetching data', statusCode);
+ } else {
+ // var parsed = json.decode(response.body.toString());
+ var parsed = json.decode(utf8.decode(response.bodyBytes));
+ if (parsed['Response_Message'] != null) {
+ onSuccess(parsed, statusCode);
+ } else {
+ if (parsed['ErrorType'] == 4) {
+ navigateToAppUpdate(
+ AppGlobal.context, parsed['ErrorEndUserMessage']);
+ }
+ if (isAllowAny) {
+ onSuccess(parsed, statusCode);
+ } else if (parsed['IsAuthenticated'] == null) {
+ if (parsed['isSMSSent'] == true) {
+ onSuccess(parsed, statusCode);
+ } else if (parsed['MessageStatus'] == 1) {
+ onSuccess(parsed, statusCode);
+ } else if (parsed['Result'] == 'OK') {
+ onSuccess(parsed, statusCode);
+ } else {
+ if (parsed != null) {
+ onSuccess(parsed, statusCode);
+ } else {
+ onFailure(
+ parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'],
+ statusCode);
+ logout();
+ }
+ }
+ } else if (parsed['MessageStatus'] == 1 ||
+ parsed['SMSLoginRequired'] == true) {
+ onSuccess(parsed, statusCode);
+ } else if (parsed['MessageStatus'] == 2 &&
+ parsed['IsAuthenticated']) {
+ if (parsed['message'] == null &&
+ parsed['ErrorEndUserMessage'] == null) {
+ if (parsed['ErrorSearchMsg'] == null) {
+ onFailure("Server Error found with no available message",
+ statusCode);
+ } else {
+ onFailure(parsed['ErrorSearchMsg'], statusCode);
+ }
+ } else {
+ onFailure(
+ parsed['message'] ??
+ parsed['ErrorEndUserMessage'] ??
+ parsed['ErrorMessage'],
+ statusCode);
+ }
+ } else if (!parsed['IsAuthenticated']) {
+ await logout();
+
+ //helpers.showErrorToast('Your session expired Please login agian');
+ } else {
+ if (parsed['SameClinicApptList'] != null) {
+ onSuccess(parsed, statusCode);
+ } else {
+ if (parsed['message'] != null) {
+ onFailure(parsed['message'] ?? parsed['message'], statusCode);
+ } else {
+ onFailure(
+ parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'],
+ statusCode);
+ }
+ }
+ }
+ }
+ }
+ } else {
+ onFailure('Please Check The Internet Connection', -1);
+ }
+ } catch (e) {
+ print(e);
+ onFailure(e.toString(), -1);
+ }
+ }
+}
+
+
+getPhoneNumberWithoutZero(String number) {
+ String newNumber = number;
+ if (number.startsWith('0')) {
+ newNumber = number.substring(1);
+ }
+ return newNumber;
}
diff --git a/lib/core/service/er/EdOnlineServices.dart b/lib/core/service/er/EdOnlineServices.dart
new file mode 100644
index 00000000..2df92d8a
--- /dev/null
+++ b/lib/core/service/er/EdOnlineServices.dart
@@ -0,0 +1,96 @@
+import 'package:diplomaticquarterapp/config/config.dart';
+import 'package:diplomaticquarterapp/core/model/er/ErPatientShareModel.dart';
+import 'package:diplomaticquarterapp/core/model/er/TriageQuestionsModel.dart';
+import 'package:diplomaticquarterapp/core/service/base_service.dart';
+
+class EdOnlineServices extends BaseService {
+ List triageQuestionsModelList = List();
+ ErPatientShareModel erPatientShareModel;
+
+ Future getQuestions() async {
+ hasError =false;
+ triageQuestionsModelList.clear();
+ Map body = Map();
+ body['ProjectID'] = 15;
+ await baseAppClient.post(ER_GET_VISUAL_TRIAGE_QUESTIONS,
+ onSuccess: (dynamic response, int statusCode) {
+ triageQuestionsModelList.clear();
+ response['ER_TriageQuestionsList'].forEach((questions) {
+ triageQuestionsModelList.add(TriageQuestionsModel.fromJson(questions));
+ });
+ }, onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ }, body: body);
+ }
+
+
+ Future getPatientPaymentInformation({var id}) async {
+ hasError =false;
+ await baseAppClient.post(ER_GetPatientPaymentInformationForERClinic,
+ onSuccess: (dynamic response, int statusCode) {
+ erPatientShareModel =
+ ErPatientShareModel.fromJson(response['ER_PatientShare']);
+ }, onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ }, body: Map.from({"ProjectID":15,"ClinicID":10}));
+ }
+
+ Future saveQuestionsInformation(
+ {String notes,
+ String chiefComplaint,
+ int projectId,
+ DateTime selectedTime,
+ List selectedQuestions}) async {
+ hasError =false;
+ Map body = Map();
+ List