Snap for 10453563 from 7aa49b99213f1c50d3cd97837cf72b35280fdef4 to mainline-sdkext-release

Change-Id: Ica0764ba86931054aa5527a1634c87efdc60ea84
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7eb3721
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.iml
+*.idea
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6633d14..891e36f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -41,6 +41,8 @@
     <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
     <!-- Allows accessing the messages on ICC -->
     <uses-permission android:name="android.permission.ACCESS_MESSAGES_ON_ICC" />
+    <!-- Needed to query user associated with a subscription. -->
+    <uses-permission android:name="android.permission.MANAGE_SUBSCRIPTION_USER_ASSOCIATION"/>
 
     <application android:process="com.android.phone"
                  android:allowClearUserData="false"
@@ -124,6 +126,13 @@
                   android:singleUser="true"
                   android:multiprocess="false" />
 
+        <provider android:name="SatelliteProvider"
+                  android:authorities="satellite"
+                  android:exported="false"
+                  android:singleUser="true"
+                  android:multiprocess="false"
+                  android:writePermission="android.permission.MODIFY_PHONE_STATE" />
+
         <service
             android:name=".TelephonyBackupAgent$DeferredSmsMmsRestoreService"
             android:exported="false" />
diff --git a/assets/latest_carrier_id/carrier_list.pb b/assets/latest_carrier_id/carrier_list.pb
index 7c46449..b1b0112 100644
--- a/assets/latest_carrier_id/carrier_list.pb
+++ b/assets/latest_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/latest_carrier_id/carrier_list.textpb b/assets/latest_carrier_id/carrier_list.textpb
index 5b521f2..63173d9 100644
--- a/assets/latest_carrier_id/carrier_list.textpb
+++ b/assets/latest_carrier_id/carrier_list.textpb
Binary files differ
diff --git a/assets/sdk28_carrier_id/carrier_list.pb b/assets/sdk28_carrier_id/carrier_list.pb
index ff06545..57258ac 100644
--- a/assets/sdk28_carrier_id/carrier_list.pb
+++ b/assets/sdk28_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/sdk28_carrier_id/carrier_list.textpb b/assets/sdk28_carrier_id/carrier_list.textpb
index 881a66a..eba7e44 100644
--- a/assets/sdk28_carrier_id/carrier_list.textpb
+++ b/assets/sdk28_carrier_id/carrier_list.textpb
Binary files differ
diff --git a/assets/sdk29_carrier_id/carrier_list.pb b/assets/sdk29_carrier_id/carrier_list.pb
index fd32451..83663df 100644
--- a/assets/sdk29_carrier_id/carrier_list.pb
+++ b/assets/sdk29_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/sdk29_carrier_id/carrier_list.textpb b/assets/sdk29_carrier_id/carrier_list.textpb
index 4a2a263..d45c3cf 100644
--- a/assets/sdk29_carrier_id/carrier_list.textpb
+++ b/assets/sdk29_carrier_id/carrier_list.textpb
Binary files differ
diff --git a/assets/sdk30_carrier_id/carrier_list.pb b/assets/sdk30_carrier_id/carrier_list.pb
index be5d8f5..5881668 100644
--- a/assets/sdk30_carrier_id/carrier_list.pb
+++ b/assets/sdk30_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/sdk30_carrier_id/carrier_list.textpb b/assets/sdk30_carrier_id/carrier_list.textpb
index ef71379..f8e185c 100644
--- a/assets/sdk30_carrier_id/carrier_list.textpb
+++ b/assets/sdk30_carrier_id/carrier_list.textpb
Binary files differ
diff --git a/assets/sdk31_carrier_id/carrier_list.pb b/assets/sdk31_carrier_id/carrier_list.pb
index 11e2628..ece4a3c 100644
--- a/assets/sdk31_carrier_id/carrier_list.pb
+++ b/assets/sdk31_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/sdk31_carrier_id/carrier_list.textpb b/assets/sdk31_carrier_id/carrier_list.textpb
index fe1806f..359ebef 100644
--- a/assets/sdk31_carrier_id/carrier_list.textpb
+++ b/assets/sdk31_carrier_id/carrier_list.textpb
Binary files differ
diff --git a/assets/sdk33_carrier_id/carrier_list.pb b/assets/sdk33_carrier_id/carrier_list.pb
new file mode 100644
index 0000000..f537693
--- /dev/null
+++ b/assets/sdk33_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/sdk33_carrier_id/carrier_list.textpb b/assets/sdk33_carrier_id/carrier_list.textpb
new file mode 100644
index 0000000..bfb6359
--- /dev/null
+++ b/assets/sdk33_carrier_id/carrier_list.textpb
@@ -0,0 +1,11913 @@
+carrier_id {
+  canonical_id: 1
+  carrier_name: "T-Mobile - US"
+  carrier_attribute {
+    mccmnc_tuple: "310026"
+    mccmnc_tuple: "310160"
+    mccmnc_tuple: "310200"
+    mccmnc_tuple: "310210"
+    mccmnc_tuple: "310220"
+    mccmnc_tuple: "310230"
+    mccmnc_tuple: "310240"
+    mccmnc_tuple: "310250"
+    mccmnc_tuple: "310260"
+    mccmnc_tuple: "31026"
+    mccmnc_tuple: "310270"
+    mccmnc_tuple: "310300"
+    mccmnc_tuple: "310310"
+    mccmnc_tuple: "310490"
+    mccmnc_tuple: "310530"
+    mccmnc_tuple: "310640"
+    mccmnc_tuple: "310660"
+    mccmnc_tuple: "310800"
+    mccmnc_tuple: "311490"
+    mccmnc_tuple: "311660"
+    mccmnc_tuple: "311882"
+    mccmnc_tuple: "312250"
+  }
+}
+carrier_id {
+  canonical_id: 2
+  carrier_name: "EE"
+  carrier_attribute {
+    mccmnc_tuple: "23430"
+    imsi_prefix_xpattern: "2343041"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "23430"
+    gid1: "ee"
+    gid1: "eeff"
+  }
+}
+carrier_id {
+  canonical_id: 3
+  carrier_name: "Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "26201"
+    mccmnc_tuple: "26206"
+    gid1: "01"
+    gid1: "02"
+    gid1: "03"
+    gid1: "04"
+    gid1: "99"
+    gid1: "4B"
+    gid1: "4b"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "26201"
+    mccmnc_tuple: "26206"
+    spn: "Telekom.de"
+    spn: "T-Campus"
+    spn: "T-Mobile D"
+    spn: "Business"
+    spn: "Privat"
+  }
+}
+carrier_id {
+  canonical_id: 4
+  carrier_name: "Magenta Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "23203"
+    gid1: "01"
+    gid1: "31"
+    gid1: "32"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "23207"
+    imsi_prefix_xpattern: "999999"
+  }
+}
+carrier_id {
+  canonical_id: 5
+  carrier_name: "T-Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "20416"
+    gid1: "FF"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20416"
+    spn: "T-Mobile NL"
+  }
+}
+carrier_id {
+  canonical_id: 6
+  carrier_name: "T-Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "23001"
+    spn: "T-Mobile CZ"
+    spn: "KAKTUS"
+    spn: "Mobil CZ"
+    spn: "RWE Mobil"
+    spn: "innogy"
+    spn: "PREmobil"
+  }
+}
+carrier_id {
+  canonical_id: 7
+  carrier_name: "T-Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "26002"
+    gid1: "11"
+    gid1: "12"
+    gid1: "16"
+    gid1: "17"
+    gid1: "21"
+    gid1: "22"
+    gid1: "23"
+    gid1: "24"
+    gid1: "26"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "26002"
+    spn: "T-Mobile.pl"
+    spn: "T-Mobile.pl Q"
+    spn: "heyah"
+    spn: "tu biedronka"
+  }
+}
+carrier_id {
+  canonical_id: 8
+  carrier_name: "Magyar Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "21630"
+    spn: "Telekom HU"
+    spn: "T-Mobile H"
+  }
+}
+carrier_id {
+  canonical_id: 9
+  carrier_name: "Hrvatski Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "21901"
+    mccmnc_tuple: "21920"
+    spn: "HT-Campus"
+    spn: "HT HR"
+    spn: "R&D Network"
+    spn: "T-Mobile HR"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21901"
+    mccmnc_tuple: "21920"
+    gid1: "01"
+    gid1: "02"
+    gid1: "03"
+    gid1: "99"
+    gid1: "FF"
+  }
+}
+carrier_id {
+  canonical_id: 11
+  carrier_name: "Slovak Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "23102"
+    spn: "Telekom SK"
+    spn: "Juro.sk"
+  }
+}
+carrier_id {
+  canonical_id: 12
+  carrier_name: "T-Mobile - UA"
+  carrier_attribute {
+    mccmnc_tuple: "25502"
+  }
+}
+carrier_id {
+  canonical_id: 13
+  carrier_name: "Mkedonski Telecom AD Skopje"
+  carrier_attribute {
+    mccmnc_tuple: "29401"
+    spn: "T-Mobile MK"
+    spn: "Telekom.mk"
+    spn: "Telekom MK"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "29401"
+    gid1: "FF"
+  }
+}
+carrier_id {
+  canonical_id: 14
+  carrier_name: "A1"
+  carrier_attribute {
+    mccmnc_tuple: "23201"
+    mccmnc_tuple: "23202"
+    mccmnc_tuple: "23209"
+    mccmnc_tuple: "23211"
+    mccmnc_tuple: "23212"
+    spn: ""
+  }
+}
+carrier_id {
+  canonical_id: 15
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "50503"
+  }
+}
+carrier_id {
+  canonical_id: 16
+  carrier_name: "Swisscom"
+  carrier_attribute {
+    mccmnc_tuple: "22801"
+    spn: "Swisscom"
+  }
+}
+carrier_id {
+  canonical_id: 18
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "20205"
+    spn: "vodafone GR"
+    spn: "CU"
+    spn: "CU-X"
+  }
+}
+carrier_id {
+  canonical_id: 19
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "27201"
+    spn: "vodafone IE"
+    spn: "Vodafone IE"
+  }
+}
+carrier_id {
+  canonical_id: 20
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "20404"
+    imsi_prefix_xpattern: "204040"
+    imsi_prefix_xpattern: "204041"
+    imsi_prefix_xpattern: "204042"
+    imsi_prefix_xpattern: "204044"
+    imsi_prefix_xpattern: "204045"
+    imsi_prefix_xpattern: "204047"
+    imsi_prefix_xpattern: "204048"
+    imsi_prefix_xpattern: "204049"
+    spn: ""
+    spn: "vodafone NL"
+    spn: "Vodafone"
+  }
+}
+carrier_id {
+  canonical_id: 21
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "53001"
+    spn: "vodafone NZ"
+  }
+}
+carrier_id {
+  canonical_id: 22
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "26801"
+    spn: ""
+    spn: "vodafone P"
+    spn: "Vodafone"
+  }
+}
+carrier_id {
+  canonical_id: 23
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "22601"
+    spn: "Vodafone RO"
+  }
+}
+carrier_id {
+  canonical_id: 24
+  carrier_name: "Vodacom"
+  carrier_attribute {
+    mccmnc_tuple: "65501"
+  }
+}
+carrier_id {
+  canonical_id: 25
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "26202"
+    imsi_prefix_xpattern: "262020"
+    imsi_prefix_xpattern: "2620211"
+    imsi_prefix_xpattern: "2620212"
+    imsi_prefix_xpattern: "2620213"
+    imsi_prefix_xpattern: "2620214"
+    imsi_prefix_xpattern: "2620215"
+    imsi_prefix_xpattern: "2620216"
+    imsi_prefix_xpattern: "2620217"
+    imsi_prefix_xpattern: "2620218"
+    imsi_prefix_xpattern: "26202190"
+    imsi_prefix_xpattern: "262021910"
+    imsi_prefix_xpattern: "262021911"
+    imsi_prefix_xpattern: "262021912"
+    imsi_prefix_xpattern: "2620219130"
+    imsi_prefix_xpattern: "2620219131"
+    imsi_prefix_xpattern: "2620219132"
+    imsi_prefix_xpattern: "2620219133"
+    imsi_prefix_xpattern: "2620219134"
+    imsi_prefix_xpattern: "2620219141"
+    imsi_prefix_xpattern: "2620219142"
+    imsi_prefix_xpattern: "2620219143"
+    imsi_prefix_xpattern: "2620219144"
+    imsi_prefix_xpattern: "2620219149"
+    imsi_prefix_xpattern: "262021915"
+    imsi_prefix_xpattern: "262021916"
+    imsi_prefix_xpattern: "262021917"
+    imsi_prefix_xpattern: "262021918"
+    imsi_prefix_xpattern: "262021919"
+    imsi_prefix_xpattern: "26202192"
+    imsi_prefix_xpattern: "26202193"
+    imsi_prefix_xpattern: "26202194"
+    imsi_prefix_xpattern: "26202195"
+    imsi_prefix_xpattern: "26202196"
+    imsi_prefix_xpattern: "26202197"
+    imsi_prefix_xpattern: "26202198"
+    imsi_prefix_xpattern: "26202199"
+    imsi_prefix_xpattern: "262022"
+    imsi_prefix_xpattern: "262023"
+    imsi_prefix_xpattern: "262024"
+    imsi_prefix_xpattern: "262025"
+    imsi_prefix_xpattern: "262026"
+    imsi_prefix_xpattern: "262027"
+    imsi_prefix_xpattern: "262028"
+    imsi_prefix_xpattern: "262029"
+    spn: ""
+    spn: "Vodafone"
+    spn: "Vodafone.de"
+    spn: "vodafone.de"
+  }
+}
+carrier_id {
+  canonical_id: 26
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "21401"
+    spn: ""
+    spn: "vodafone"
+    spn: "vodafone ES"
+    spn: "Vodafone"
+    spn: "Personal"
+    spn: "Profesional"
+  }
+}
+carrier_id {
+  canonical_id: 27
+  carrier_name: "SFR"
+  carrier_attribute {
+    mccmnc_tuple: "20809"
+    mccmnc_tuple: "20810"
+    mccmnc_tuple: "20811"
+    mccmnc_tuple: "20813"
+  }
+}
+carrier_id {
+  canonical_id: 28
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "23415"
+    mccmnc_tuple: "23491"
+    spn: ""
+    spn: "Vodafone"
+    spn: "vodafone UK"
+  }
+}
+carrier_id {
+  canonical_id: 29
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "22210"
+    spn: ""
+    spn: "vodafone IT"
+    spn: "Vodafone"
+  }
+}
+carrier_id {
+  canonical_id: 30
+  carrier_name: "Optus"
+  carrier_attribute {
+    mccmnc_tuple: "50502"
+    mccmnc_tuple: "50590"
+  }
+}
+carrier_id {
+  canonical_id: 31
+  carrier_name: "Singtel"
+  carrier_attribute {
+    mccmnc_tuple: "52501"
+    mccmnc_tuple: "52502"
+  }
+}
+carrier_id {
+  canonical_id: 32
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "20800"
+    mccmnc_tuple: "20801"
+    mccmnc_tuple: "20802"
+    spn: "Orange F"
+  }
+}
+carrier_id {
+  canonical_id: 33
+  carrier_name: "TIM"
+  carrier_attribute {
+    mccmnc_tuple: "22201"
+  }
+}
+carrier_id {
+  canonical_id: 34
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "21405"
+    mccmnc_tuple: "21407"
+  }
+}
+carrier_id {
+  canonical_id: 450
+  carrier_name: "Mobiland"
+  carrier_attribute {
+    mccmnc_tuple: "21303"
+  }
+}
+carrier_id {
+  canonical_id: 451
+  carrier_name: "Etisalat"
+  carrier_attribute {
+    mccmnc_tuple: "42402"
+  }
+}
+carrier_id {
+  canonical_id: 452
+  carrier_name: "AWCC"
+  carrier_attribute {
+    mccmnc_tuple: "41201"
+  }
+}
+carrier_id {
+  canonical_id: 453
+  carrier_name: "Roshan"
+  carrier_attribute {
+    mccmnc_tuple: "41220"
+  }
+}
+carrier_id {
+  canonical_id: 454
+  carrier_name: "New1"
+  carrier_attribute {
+    mccmnc_tuple: "41230"
+  }
+}
+carrier_id {
+  canonical_id: 455
+  carrier_name: "Areeba Afghanistan"
+  carrier_attribute {
+    mccmnc_tuple: "41240"
+  }
+}
+carrier_id {
+  canonical_id: 456
+  carrier_name: "Afghan Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "41288"
+  }
+}
+carrier_id {
+  canonical_id: 457
+  carrier_name: "APUA PCS"
+  carrier_attribute {
+    mccmnc_tuple: "344030"
+  }
+}
+carrier_id {
+  canonical_id: 491
+  carrier_name: "Advanced Communications Technologies Pty. Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "50524"
+  }
+}
+carrier_id {
+  canonical_id: 492
+  carrier_name: "Localstar Holding Pty. Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "50588"
+  }
+}
+carrier_id {
+  canonical_id: 493
+  carrier_name: "Setar GSM"
+  carrier_attribute {
+    mccmnc_tuple: "36301"
+  }
+}
+carrier_id {
+  canonical_id: 495
+  carrier_name: "Bakcell Limited Liabil ity Company"
+  carrier_attribute {
+    mccmnc_tuple: "40002"
+  }
+}
+carrier_id {
+  canonical_id: 529
+  carrier_name: "Claro BR"
+  carrier_attribute {
+    mccmnc_tuple: "72405"
+    mccmnc_tuple: "72438"
+  }
+}
+carrier_id {
+  canonical_id: 530
+  carrier_name: "Vivo"
+  carrier_attribute {
+    mccmnc_tuple: "72406"
+    mccmnc_tuple: "72410"
+    mccmnc_tuple: "72411"
+    mccmnc_tuple: "72423"
+  }
+}
+carrier_id {
+  canonical_id: 532
+  carrier_name: "Maxitel MG"
+  carrier_attribute {
+    mccmnc_tuple: "72408"
+  }
+}
+carrier_id {
+  canonical_id: 533
+  carrier_name: "Telepar Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72409"
+  }
+}
+carrier_id {
+  canonical_id: 536
+  carrier_name: "Americel"
+  carrier_attribute {
+    mccmnc_tuple: "72412"
+  }
+}
+carrier_id {
+  canonical_id: 537
+  carrier_name: "Telesp Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72413"
+  }
+}
+carrier_id {
+  canonical_id: 538
+  carrier_name: "Maxitel BA"
+  carrier_attribute {
+    mccmnc_tuple: "72414"
+  }
+}
+carrier_id {
+  canonical_id: 539
+  carrier_name: "Sercomtel"
+  carrier_attribute {
+    mccmnc_tuple: "72415"
+  }
+}
+carrier_id {
+  canonical_id: 540
+  carrier_name: "Brasil Telecom GSM"
+  carrier_attribute {
+    mccmnc_tuple: "72416"
+  }
+}
+carrier_id {
+  canonical_id: 541
+  carrier_name: "Ceterp Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72417"
+  }
+}
+carrier_id {
+  canonical_id: 542
+  carrier_name: "Datora"
+  carrier_attribute {
+    mccmnc_tuple: "72418"
+  }
+}
+carrier_id {
+  canonical_id: 543
+  carrier_name: "Telemig Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72419"
+  }
+}
+carrier_id {
+  canonical_id: 544
+  carrier_name: "Telerj Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72421"
+  }
+}
+carrier_id {
+  canonical_id: 546
+  carrier_name: "Telebrasilia Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72425"
+  }
+}
+carrier_id {
+  canonical_id: 547
+  carrier_name: "Telegoias Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72427"
+  }
+}
+carrier_id {
+  canonical_id: 548
+  carrier_name: "Telemat Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72429"
+  }
+}
+carrier_id {
+  canonical_id: 562
+  carrier_name: "Teleamapa Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72457"
+  }
+}
+carrier_id {
+  canonical_id: 563
+  carrier_name: "Telaima Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72459"
+  }
+}
+carrier_id {
+  canonical_id: 564
+  carrier_name: "Bhutan Telecom Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "40211"
+  }
+}
+carrier_id {
+  canonical_id: 566
+  carrier_name: "Mascom Wireless (Pty) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "65201"
+  }
+}
+carrier_id {
+  canonical_id: 567
+  carrier_name: "Orange Botswana (Pty) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "65202"
+  }
+}
+carrier_id {
+  canonical_id: 568
+  carrier_name: "A1 BY"
+  carrier_attribute {
+    mccmnc_tuple: "25701"
+  }
+}
+carrier_id {
+  canonical_id: 569
+  carrier_name: "MTS"
+  carrier_attribute {
+    mccmnc_tuple: "25702"
+  }
+}
+carrier_id {
+  canonical_id: 570
+  carrier_name: "Belize Telecommunications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "70267"
+  }
+}
+carrier_id {
+  canonical_id: 571
+  carrier_name: "International Telecommunications Ltd. (INTELCO)"
+  carrier_attribute {
+    mccmnc_tuple: "70268"
+  }
+}
+carrier_id {
+  canonical_id: 572
+  carrier_name: "Clearnet"
+  carrier_attribute {
+    mccmnc_tuple: "30236"
+  }
+}
+carrier_id {
+  canonical_id: 574
+  carrier_name: "Ice Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "30262"
+  }
+}
+carrier_id {
+  canonical_id: 575
+  carrier_name: "Aliant Mobility"
+  carrier_attribute {
+    mccmnc_tuple: "30263"
+  }
+}
+carrier_id {
+  canonical_id: 576
+  carrier_name: "Bell Mobility"
+  carrier_attribute {
+    mccmnc_tuple: "30264"
+    mccmnc_tuple: "302610"
+    mccmnc_tuple: "302630"
+    mccmnc_tuple: "302640"
+  }
+}
+carrier_id {
+  canonical_id: 577
+  carrier_name: "Tbay Mobility"
+  carrier_attribute {
+    mccmnc_tuple: "302656"
+  }
+}
+carrier_id {
+  canonical_id: 578
+  carrier_name: "MTS Mobility"
+  carrier_attribute {
+    mccmnc_tuple: "302660"
+    mccmnc_tuple: "302370"
+    gid1: "2c"
+    gid1: "4d"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "302660"
+    spn: "MTS"
+  }
+}
+carrier_id {
+  canonical_id: 579
+  carrier_name: "CityTel Mobility"
+  carrier_attribute {
+    mccmnc_tuple: "30267"
+  }
+}
+carrier_id {
+  canonical_id: 580
+  carrier_name: "Sask Tel Mobility"
+  carrier_attribute {
+    mccmnc_tuple: "30268"
+    mccmnc_tuple: "302654"
+    mccmnc_tuple: "302680"
+    mccmnc_tuple: "302780"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20404"
+    gid1: "5a"
+  }
+}
+carrier_id {
+  canonical_id: 581
+  carrier_name: "Globalstar"
+  carrier_attribute {
+    mccmnc_tuple: "30271"
+  }
+}
+carrier_id {
+  canonical_id: 624
+  carrier_name: "Colombia Móvil S.A."
+  carrier_attribute {
+    mccmnc_tuple: "732103"
+    mccmnc_tuple: "732111"
+  }
+}
+carrier_id {
+  canonical_id: 625
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "732123"
+  }
+}
+carrier_id {
+  canonical_id: 626
+  carrier_name: "WOM"
+  carrier_attribute {
+    mccmnc_tuple: "732130"
+    mccmnc_tuple: "732360"
+  }
+}
+carrier_id {
+  canonical_id: 627
+  carrier_name: "KOLBI ICE"
+  carrier_attribute {
+    mccmnc_tuple: "71201"
+    mccmnc_tuple: "71202"
+  }
+}
+carrier_id {
+  canonical_id: 655
+  carrier_name: "Barablu Mobile Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "23807"
+  }
+}
+carrier_id {
+  canonical_id: 656
+  carrier_name: "Telia"
+  carrier_attribute {
+    mccmnc_tuple: "23820"
+    mccmnc_tuple: "23830"
+  }
+}
+carrier_id {
+  canonical_id: 657
+  carrier_name: "Tele2"
+  carrier_attribute {
+    mccmnc_tuple: "23877"
+  }
+}
+carrier_id {
+  canonical_id: 658
+  carrier_name: "Altice Dominicana"
+  carrier_attribute {
+    mccmnc_tuple: "37001"
+  }
+}
+carrier_id {
+  canonical_id: 667
+  carrier_name: "Telia"
+  carrier_attribute {
+    mccmnc_tuple: "24801"
+  }
+}
+carrier_id {
+  canonical_id: 668
+  carrier_name: "Elisa"
+  carrier_attribute {
+    mccmnc_tuple: "24802"
+  }
+}
+carrier_id {
+  canonical_id: 669
+  carrier_name: "Tele2"
+  carrier_attribute {
+    mccmnc_tuple: "24803"
+  }
+}
+carrier_id {
+  canonical_id: 670
+  carrier_name: "OY Top Connect"
+  carrier_attribute {
+    mccmnc_tuple: "24804"
+  }
+}
+carrier_id {
+  canonical_id: 671
+  carrier_name: "AS Bravocom Mobiil"
+  carrier_attribute {
+    mccmnc_tuple: "24805"
+  }
+}
+carrier_id {
+  canonical_id: 672
+  carrier_name: "OY ViaTel"
+  carrier_attribute {
+    mccmnc_tuple: "24806"
+  }
+}
+carrier_id {
+  canonical_id: 673
+  carrier_name: "Televõrgu AS"
+  carrier_attribute {
+    mccmnc_tuple: "24807"
+  }
+}
+carrier_id {
+  canonical_id: 674
+  carrier_name: "Siseministeerium (Ministry of Interior)"
+  carrier_attribute {
+    mccmnc_tuple: "24871"
+  }
+}
+carrier_id {
+  canonical_id: 675
+  carrier_name: "Orange Egypt"
+  carrier_attribute {
+    mccmnc_tuple: "60201"
+  }
+}
+carrier_id {
+  canonical_id: 676
+  carrier_name: "Vodafone Egypt"
+  carrier_attribute {
+    mccmnc_tuple: "60202"
+    spn: "vodafone"
+  }
+}
+carrier_id {
+  canonical_id: 678
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+    spn: "Orange"
+  }
+}
+carrier_id {
+  canonical_id: 679
+  carrier_name: "Yoigo"
+  carrier_attribute {
+    mccmnc_tuple: "21404"
+    spn: "Yoigo"
+    spn: "Pepephone"
+    spn: "MASMOVIL"
+    spn: "LLAMAYA"
+    spn: "Guuk"
+    spn: "Cablemovil"
+    spn: "Sweno"
+    spn: "Lebara"
+    spn: "Lycamobile"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21404"
+    imsi_prefix_xpattern: "2140423"
+    spn: "EUSKALTEL"
+    spn: "RACC"
+    spn: "mobilR"
+    spn: "Virgin telco"
+    spn: "telecable"
+  }
+}
+carrier_id {
+  canonical_id: 681
+  carrier_name: "ETH MTN"
+  carrier_attribute {
+    mccmnc_tuple: "63601"
+  }
+}
+carrier_id {
+  canonical_id: 682
+  carrier_name: "Finnet Networks Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "24404"
+  }
+}
+carrier_id {
+  canonical_id: 717
+  carrier_name: "Virgin"
+  carrier_attribute {
+    mccmnc_tuple: "23430"
+    mccmnc_tuple: "23433"
+    mccmnc_tuple: "23438"
+    gid1: "2800000000000000"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20601"
+    gid1: "2800000000000000"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20620"
+    gid1: "2800000000000000"
+  }
+}
+carrier_id {
+  canonical_id: 718
+  carrier_name: "EE"
+  carrier_attribute {
+    mccmnc_tuple: "23431"
+    mccmnc_tuple: "23432"
+    mccmnc_tuple: "23430"
+    mccmnc_tuple: "23433"
+    mccmnc_tuple: "23486"
+  }
+}
+carrier_id {
+  canonical_id: 720
+  carrier_name: "Cable and Wireless Guensey Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "23455"
+  }
+}
+carrier_id {
+  canonical_id: 733
+  carrier_name: "Gibtelecom GSM"
+  carrier_attribute {
+    mccmnc_tuple: "26601"
+  }
+}
+carrier_id {
+  canonical_id: 734
+  carrier_name: "Cloud9 Mobile Communications"
+  carrier_attribute {
+    mccmnc_tuple: "26609"
+  }
+}
+carrier_id {
+  canonical_id: 735
+  carrier_name: "Tele Greenland"
+  carrier_attribute {
+    mccmnc_tuple: "29001"
+  }
+}
+carrier_id {
+  canonical_id: 736
+  carrier_name: "Gamcel"
+  carrier_attribute {
+    mccmnc_tuple: "60701"
+  }
+}
+carrier_id {
+  canonical_id: 737
+  carrier_name: "Africell"
+  carrier_attribute {
+    mccmnc_tuple: "60702"
+  }
+}
+carrier_id {
+  canonical_id: 738
+  carrier_name: "Comium Services Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "60703"
+  }
+}
+carrier_id {
+  canonical_id: 739
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "61101"
+  }
+}
+carrier_id {
+  canonical_id: 740
+  carrier_name: "Sotelgui"
+  carrier_attribute {
+    mccmnc_tuple: "61102"
+  }
+}
+carrier_id {
+  canonical_id: 741
+  carrier_name: "Cellcom Guinée SA"
+  carrier_attribute {
+    mccmnc_tuple: "61105"
+  }
+}
+carrier_id {
+  canonical_id: 742
+  carrier_name: "Orange Caraïbe Mobiles"
+  carrier_attribute {
+    mccmnc_tuple: "34001"
+  }
+}
+carrier_id {
+  canonical_id: 743
+  carrier_name: "Outremer Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "34002"
+  }
+}
+carrier_id {
+  canonical_id: 744
+  carrier_name: "Saint Martin et Saint Barthelemy Telcell Sarl"
+  carrier_attribute {
+    mccmnc_tuple: "34003"
+  }
+}
+carrier_id {
+  canonical_id: 745
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "34020"
+  }
+}
+carrier_id {
+  canonical_id: 746
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "62701"
+  }
+}
+carrier_id {
+  canonical_id: 747
+  carrier_name: "COSMOTE"
+  carrier_attribute {
+    mccmnc_tuple: "20201"
+    gid1: "FFFF"
+    gid1: "FF"
+  }
+}
+carrier_id {
+  canonical_id: 749
+  carrier_name: "Info Quest S.A."
+  carrier_attribute {
+    mccmnc_tuple: "20209"
+  }
+}
+carrier_id {
+  canonical_id: 759
+  carrier_name: "3G Radio System/HKCSL3G"
+  carrier_attribute {
+    mccmnc_tuple: "45402"
+  }
+}
+carrier_id {
+  canonical_id: 760
+  carrier_name: "3HK/SUPREME"
+  carrier_attribute {
+    mccmnc_tuple: "45403"
+  }
+}
+carrier_id {
+  canonical_id: 761
+  carrier_name: "SmarTone HK"
+  carrier_attribute {
+    mccmnc_tuple: "45406"
+    mccmnc_tuple: "45417"
+    mccmnc_tuple: "45415"
+  }
+}
+carrier_id {
+  canonical_id: 762
+  carrier_name: "MVNO/China Unicom International Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "45407"
+  }
+}
+carrier_id {
+  canonical_id: 763
+  carrier_name: "MVNO/Trident"
+  carrier_attribute {
+    mccmnc_tuple: "45408"
+  }
+}
+carrier_id {
+  canonical_id: 764
+  carrier_name: "MVNO/China Motion Telecom (HK) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "45409"
+  }
+}
+carrier_id {
+  canonical_id: 765
+  carrier_name: "GSM1800New World PCS Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "45410"
+  }
+}
+carrier_id {
+  canonical_id: 766
+  carrier_name: "MVNO/CHKTL"
+  carrier_attribute {
+    mccmnc_tuple: "45411"
+  }
+}
+carrier_id {
+  canonical_id: 767
+  carrier_name: "中國移動香港 China Mobile HK"
+  carrier_attribute {
+    mccmnc_tuple: "45412"
+    mccmnc_tuple: "45413"
+  }
+}
+carrier_id {
+  canonical_id: 769
+  carrier_name: "PCCW"
+  carrier_attribute {
+    mccmnc_tuple: "45416"
+  }
+}
+carrier_id {
+  canonical_id: 770
+  carrier_name: "GSM7800/Hong Kong CSL Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "45418"
+  }
+}
+carrier_id {
+  canonical_id: 772
+  carrier_name: "Public Mobile Networks/Reserved"
+  carrier_attribute {
+    mccmnc_tuple: "45420"
+    mccmnc_tuple: "45421"
+    mccmnc_tuple: "45422"
+    mccmnc_tuple: "45423"
+    mccmnc_tuple: "45424"
+    mccmnc_tuple: "45425"
+    mccmnc_tuple: "45426"
+    mccmnc_tuple: "45427"
+    mccmnc_tuple: "45428"
+    mccmnc_tuple: "45429"
+    mccmnc_tuple: "45430"
+    mccmnc_tuple: "45431"
+    mccmnc_tuple: "45432"
+    mccmnc_tuple: "45433"
+    mccmnc_tuple: "45434"
+    mccmnc_tuple: "45435"
+    mccmnc_tuple: "45436"
+    mccmnc_tuple: "45437"
+    mccmnc_tuple: "45438"
+    mccmnc_tuple: "45439"
+  }
+}
+carrier_id {
+  canonical_id: 773
+  carrier_name: "Claro HN"
+  carrier_attribute {
+    mccmnc_tuple: "708001"
+    mccmnc_tuple: "70801"
+  }
+}
+carrier_id {
+  canonical_id: 787
+  carrier_name: "Telkomsel"
+  carrier_attribute {
+    mccmnc_tuple: "51010"
+  }
+}
+carrier_id {
+  canonical_id: 788
+  carrier_name: "XL/AXIS"
+  carrier_attribute {
+    mccmnc_tuple: "51008"
+    mccmnc_tuple: "51011"
+  }
+}
+carrier_id {
+  canonical_id: 789
+  carrier_name: "Indosat - M3"
+  carrier_attribute {
+    mccmnc_tuple: "51021"
+  }
+}
+carrier_id {
+  canonical_id: 792
+  carrier_name: "3"
+  carrier_attribute {
+    mccmnc_tuple: "27202"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "27211"
+    imsi_prefix_xpattern: "272110200677368"
+  }
+}
+carrier_id {
+  canonical_id: 793
+  carrier_name: "Meteor Mobile Communications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "27203"
+  }
+}
+carrier_id {
+  canonical_id: 794
+  carrier_name: "Eircom"
+  carrier_attribute {
+    mccmnc_tuple: "27207"
+  }
+}
+carrier_id {
+  canonical_id: 795
+  carrier_name: "Clever Communications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "27209"
+  }
+}
+carrier_id {
+  canonical_id: 796
+  carrier_name: "Partner Communications Co. Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "42501"
+    mccmnc_tuple: "42510"
+  }
+}
+carrier_id {
+  canonical_id: 797
+  carrier_name: "Cellcom Israel Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "42502"
+  }
+}
+carrier_id {
+  canonical_id: 798
+  carrier_name: "Pelephone Communications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "42503"
+  }
+}
+carrier_id {
+  canonical_id: 802
+  carrier_name: "Vi"
+  carrier_attribute {
+    mccmnc_tuple: "40404"
+    mccmnc_tuple: "40407"
+    mccmnc_tuple: "40412"
+    mccmnc_tuple: "40414"
+    mccmnc_tuple: "40419"
+    mccmnc_tuple: "40422"
+    mccmnc_tuple: "40424"
+    mccmnc_tuple: "40444"
+    mccmnc_tuple: "40456"
+    mccmnc_tuple: "40478"
+    mccmnc_tuple: "40482"
+    mccmnc_tuple: "40487"
+    mccmnc_tuple: "40489"
+    mccmnc_tuple: "40570"
+    mccmnc_tuple: "40545"
+    mccmnc_tuple: "405799"
+    mccmnc_tuple: "405845"
+    mccmnc_tuple: "405846"
+    mccmnc_tuple: "405847"
+    mccmnc_tuple: "405848"
+    mccmnc_tuple: "405849"
+    mccmnc_tuple: "405850"
+    mccmnc_tuple: "405851"
+    mccmnc_tuple: "405852"
+    mccmnc_tuple: "405853"
+    mccmnc_tuple: "405908"
+    mccmnc_tuple: "405909"
+    mccmnc_tuple: "405910"
+    mccmnc_tuple: "405911"
+  }
+}
+carrier_id {
+  canonical_id: 849
+  carrier_name: "Orange Jordan"
+  carrier_attribute {
+    mccmnc_tuple: "41677"
+    mccmnc_tuple: "416770"
+  }
+}
+carrier_id {
+  canonical_id: 850
+  carrier_name: "NTT DOCOMO"
+  carrier_attribute {
+    mccmnc_tuple: "44010"
+    gid1: "00FFFF"
+    gid1: "01FFFF"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "44010"
+    preferred_apn: "spmode.ne.jp"
+    preferred_apn: "mopera.net"
+  }
+}
+carrier_id {
+  canonical_id: 865
+  carrier_name: "Safaricom"
+  carrier_attribute {
+    mccmnc_tuple: "63902"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "63902"
+    spn: "Safaricom"
+  }
+}
+carrier_id {
+  canonical_id: 866
+  carrier_name: "Airtel Kenya"
+  carrier_attribute {
+    mccmnc_tuple: "63903"
+  }
+}
+carrier_id {
+  canonical_id: 867
+  carrier_name: "Beeline"
+  carrier_attribute {
+    mccmnc_tuple: "43701"
+  }
+}
+carrier_id {
+  canonical_id: 868
+  carrier_name: "Mobitel (Cam GSM)"
+  carrier_attribute {
+    mccmnc_tuple: "45601"
+  }
+}
+carrier_id {
+  canonical_id: 869
+  carrier_name: "Smart"
+  carrier_attribute {
+    mccmnc_tuple: "45602"
+    mccmnc_tuple: "45605"
+    mccmnc_tuple: "45606"
+  }
+}
+carrier_id {
+  canonical_id: 870
+  carrier_name: "S Telecom (CDMA) (reserved)"
+  carrier_attribute {
+    mccmnc_tuple: "45603"
+  }
+}
+carrier_id {
+  canonical_id: 871
+  carrier_name: "Camshin (Shinawatra)"
+  carrier_attribute {
+    mccmnc_tuple: "45618"
+  }
+}
+carrier_id {
+  canonical_id: 872
+  carrier_name: "HURI - SNPT"
+  carrier_attribute {
+    mccmnc_tuple: "65401"
+  }
+}
+carrier_id {
+  canonical_id: 892
+  carrier_name: "Telia"
+  carrier_attribute {
+    mccmnc_tuple: "24601"
+  }
+}
+carrier_id {
+  canonical_id: 893
+  carrier_name: "BITĖ"
+  carrier_attribute {
+    mccmnc_tuple: "24602"
+  }
+}
+carrier_id {
+  canonical_id: 894
+  carrier_name: "Tele2"
+  carrier_attribute {
+    mccmnc_tuple: "24603"
+  }
+}
+carrier_id {
+  canonical_id: 895
+  carrier_name: "P&T Luxembourg"
+  carrier_attribute {
+    mccmnc_tuple: "27001"
+  }
+}
+carrier_id {
+  canonical_id: 896
+  carrier_name: "Tango"
+  carrier_attribute {
+    mccmnc_tuple: "27077"
+  }
+}
+carrier_id {
+  canonical_id: 897
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "27099"
+  }
+}
+carrier_id {
+  canonical_id: 898
+  carrier_name: "LMT"
+  carrier_attribute {
+    mccmnc_tuple: "24701"
+  }
+}
+carrier_id {
+  canonical_id: 899
+  carrier_name: "Tele2/ZZ"
+  carrier_attribute {
+    mccmnc_tuple: "24702"
+  }
+}
+carrier_id {
+  canonical_id: 900
+  carrier_name: "Telekom Baltija"
+  carrier_attribute {
+    mccmnc_tuple: "24703"
+  }
+}
+carrier_id {
+  canonical_id: 901
+  carrier_name: "Beta Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "24704"
+  }
+}
+carrier_id {
+  canonical_id: 902
+  carrier_name: "Méditélécom"
+  carrier_attribute {
+    mccmnc_tuple: "60400"
+  }
+}
+carrier_id {
+  canonical_id: 903
+  carrier_name: "Maroc"
+  carrier_attribute {
+    mccmnc_tuple: "60401"
+  }
+}
+carrier_id {
+  canonical_id: 904
+  carrier_name: "Orange Moldova GSM"
+  carrier_attribute {
+    mccmnc_tuple: "25901"
+  }
+}
+carrier_id {
+  canonical_id: 905
+  carrier_name: "Moldcell GSM"
+  carrier_attribute {
+    mccmnc_tuple: "25902"
+  }
+}
+carrier_id {
+  canonical_id: 906
+  carrier_name: "Eventis Mobile GSM"
+  carrier_attribute {
+    mccmnc_tuple: "25904"
+  }
+}
+carrier_id {
+  canonical_id: 941
+  carrier_name: "Mobile Telecommunications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "64901"
+  }
+}
+carrier_id {
+  canonical_id: 942
+  carrier_name: "Powercom Pty Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "64903"
+  }
+}
+carrier_id {
+  canonical_id: 943
+  carrier_name: "OPT Mobilis"
+  carrier_attribute {
+    mccmnc_tuple: "54601"
+  }
+}
+carrier_id {
+  canonical_id: 945
+  carrier_name: "Airtel Niger"
+  carrier_attribute {
+    mccmnc_tuple: "61402"
+  }
+}
+carrier_id {
+  canonical_id: 958
+  carrier_name: "Telenor"
+  carrier_attribute {
+    mccmnc_tuple: "24201"
+    mccmnc_tuple: "24212"
+  }
+}
+carrier_id {
+  canonical_id: 959
+  carrier_name: "Telia"
+  carrier_attribute {
+    mccmnc_tuple: "24202"
+  }
+}
+carrier_id {
+  canonical_id: 960
+  carrier_name: "Teletopia Mobile Communications AS"
+  carrier_attribute {
+    mccmnc_tuple: "24203"
+  }
+}
+carrier_id {
+  canonical_id: 961
+  carrier_name: "Tele2 Norge AS"
+  carrier_attribute {
+    mccmnc_tuple: "24204"
+  }
+}
+carrier_id {
+  canonical_id: 962
+  carrier_name: "Nepal Telecommunications"
+  carrier_attribute {
+    mccmnc_tuple: "42901"
+    mccmnc_tuple: "42903"
+  }
+}
+carrier_id {
+  canonical_id: 963
+  carrier_name: "Reserved for AMPS MIN based IMSI's"
+  carrier_attribute {
+    mccmnc_tuple: "53000"
+  }
+}
+carrier_id {
+  canonical_id: 965
+  carrier_name: "Teleom New Zealand CDMA Network"
+  carrier_attribute {
+    mccmnc_tuple: "53002"
+  }
+}
+carrier_id {
+  canonical_id: 966
+  carrier_name: "Woosh Wireless - CDMA Network"
+  carrier_attribute {
+    mccmnc_tuple: "53003"
+  }
+}
+carrier_id {
+  canonical_id: 968
+  carrier_name: "Spark"
+  carrier_attribute {
+    mccmnc_tuple: "53005"
+  }
+}
+carrier_id {
+  canonical_id: 969
+  carrier_name: "2degrees"
+  carrier_attribute {
+    mccmnc_tuple: "53024"
+  }
+}
+carrier_id {
+  canonical_id: 970
+  carrier_name: "Omantel"
+  carrier_attribute {
+    mccmnc_tuple: "42202"
+    mccmnc_tuple: "42204"
+  }
+}
+carrier_id {
+  canonical_id: 971
+  carrier_name: "Ooredoo"
+  carrier_attribute {
+    mccmnc_tuple: "42203"
+  }
+}
+carrier_id {
+  canonical_id: 973
+  carrier_name: "Cable & Wireless Panama S.A."
+  carrier_attribute {
+    mccmnc_tuple: "71401"
+  }
+}
+carrier_id {
+  canonical_id: 974
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "71402"
+    mccmnc_tuple: "714020"
+  }
+}
+carrier_id {
+  canonical_id: 1008
+  carrier_name: "Société Réunionnaise du Radiotéléphone"
+  carrier_attribute {
+    mccmnc_tuple: "64710"
+  }
+}
+carrier_id {
+  canonical_id: 1010
+  carrier_name: "Telekom Romania"
+  carrier_attribute {
+    mccmnc_tuple: "22603"
+    mccmnc_tuple: "22606"
+    spn: "TELEKOM.RO"
+    spn: "COSMOTE"
+    spn: "frog"
+    spn: "MTV Mobile"
+  }
+}
+carrier_id {
+  canonical_id: 1011
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "22610"
+  }
+}
+carrier_id {
+  canonical_id: 1012
+  carrier_name: "Yettel"
+  carrier_attribute {
+    mccmnc_tuple: "22001"
+    mccmnc_tuple: "22002"
+  }
+}
+carrier_id {
+  canonical_id: 1013
+  carrier_name: "Telekom Srbija a.d."
+  carrier_attribute {
+    mccmnc_tuple: "22003"
+  }
+}
+carrier_id {
+  canonical_id: 1014
+  carrier_name: "Vip mobile d.o.o."
+  carrier_attribute {
+    mccmnc_tuple: "22005"
+  }
+}
+carrier_id {
+  canonical_id: 1016
+  carrier_name: "MegaFon"
+  carrier_attribute {
+    mccmnc_tuple: "25002"
+  }
+}
+carrier_id {
+  canonical_id: 1018
+  carrier_name: "Sibchallenge"
+  carrier_attribute {
+    mccmnc_tuple: "25004"
+  }
+}
+carrier_id {
+  canonical_id: 1020
+  carrier_name: "BM Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "25007"
+  }
+}
+carrier_id {
+  canonical_id: 1021
+  carrier_name: "Don Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "25010"
+  }
+}
+carrier_id {
+  canonical_id: 1022
+  carrier_name: "Orensot"
+  carrier_attribute {
+    mccmnc_tuple: "25011"
+  }
+}
+carrier_id {
+  canonical_id: 1024
+  carrier_name: "Kuban GSM"
+  carrier_attribute {
+    mccmnc_tuple: "25013"
+  }
+}
+carrier_id {
+  canonical_id: 1025
+  carrier_name: "New Telephone Company"
+  carrier_attribute {
+    mccmnc_tuple: "25016"
+  }
+}
+carrier_id {
+  canonical_id: 1027
+  carrier_name: "Volgograd Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "25019"
+  }
+}
+carrier_id {
+  canonical_id: 1028
+  carrier_name: "Tele2"
+  carrier_attribute {
+    mccmnc_tuple: "25003"
+    mccmnc_tuple: "25005"
+    mccmnc_tuple: "25012"
+    mccmnc_tuple: "25017"
+    mccmnc_tuple: "25020"
+    mccmnc_tuple: "25039"
+  }
+}
+carrier_id {
+  canonical_id: 1029
+  carrier_name: "Extel"
+  carrier_attribute {
+    mccmnc_tuple: "25028"
+  }
+}
+carrier_id {
+  canonical_id: 1031
+  carrier_name: "Stuvtelesot"
+  carrier_attribute {
+    mccmnc_tuple: "25044"
+  }
+}
+carrier_id {
+  canonical_id: 1074
+  carrier_name: "Comium (Sierra Leone) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "61904"
+  }
+}
+carrier_id {
+  canonical_id: 1075
+  carrier_name: "Lintel (Sierra Leone) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "61905"
+  }
+}
+carrier_id {
+  canonical_id: 1076
+  carrier_name: "Mobitel"
+  carrier_attribute {
+    mccmnc_tuple: "61925"
+  }
+}
+carrier_id {
+  canonical_id: 1077
+  carrier_name: "Datatel (SL) Ltd GSM"
+  carrier_attribute {
+    mccmnc_tuple: "61940"
+  }
+}
+carrier_id {
+  canonical_id: 1082
+  carrier_name: "Golis Telecommunications Company"
+  carrier_attribute {
+    mccmnc_tuple: "63730"
+  }
+}
+carrier_id {
+  canonical_id: 1083
+  carrier_name: "Telesur"
+  carrier_attribute {
+    mccmnc_tuple: "74602"
+  }
+}
+carrier_id {
+  canonical_id: 1084
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "74603"
+  }
+}
+carrier_id {
+  canonical_id: 1085
+  carrier_name: "Intelsur"
+  carrier_attribute {
+    mccmnc_tuple: "74604"
+  }
+}
+carrier_id {
+  canonical_id: 1086
+  carrier_name: "Companhia Santomese de Telecomunicaçôes"
+  carrier_attribute {
+    mccmnc_tuple: "62601"
+  }
+}
+carrier_id {
+  canonical_id: 1087
+  carrier_name: "Digicel, S.A. de C.V."
+  carrier_attribute {
+    mccmnc_tuple: "70602"
+  }
+}
+carrier_id {
+  canonical_id: 1088
+  carrier_name: "Syriatel"
+  carrier_attribute {
+    mccmnc_tuple: "41701"
+  }
+}
+carrier_id {
+  canonical_id: 1089
+  carrier_name: "Spacetel Syria"
+  carrier_attribute {
+    mccmnc_tuple: "41702"
+  }
+}
+carrier_id {
+  canonical_id: 1090
+  carrier_name: "Syrian Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "41709"
+  }
+}
+carrier_id {
+  canonical_id: 1091
+  carrier_name: "Swazi MTN"
+  carrier_attribute {
+    mccmnc_tuple: "65310"
+  }
+}
+carrier_id {
+  canonical_id: 1092
+  carrier_name: "IslandCom Communications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "376352"
+  }
+}
+carrier_id {
+  canonical_id: 1093
+  carrier_name: "Airtel Chad"
+  carrier_attribute {
+    mccmnc_tuple: "62201"
+  }
+}
+carrier_id {
+  canonical_id: 1094
+  carrier_name: "Tchad Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "62202"
+  }
+}
+carrier_id {
+  canonical_id: 1095
+  carrier_name: "Togo Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "61501"
+  }
+}
+carrier_id {
+  canonical_id: 1096
+  carrier_name: "CAT CDMA"
+  carrier_attribute {
+    mccmnc_tuple: "52000"
+    mccmnc_tuple: "52002"
+  }
+}
+carrier_id {
+  canonical_id: 1097
+  carrier_name: "AIS GSM"
+  carrier_attribute {
+    mccmnc_tuple: "52001"
+  }
+}
+carrier_id {
+  canonical_id: 1098
+  carrier_name: "AIS"
+  carrier_attribute {
+    mccmnc_tuple: "52003"
+  }
+}
+carrier_id {
+  canonical_id: 1136
+  carrier_name: "Iridium Satellite, LLC (GMSS)"
+  carrier_attribute {
+    mccmnc_tuple: "90103"
+  }
+}
+carrier_id {
+  canonical_id: 1137
+  carrier_name: "Globalstar"
+  carrier_attribute {
+    mccmnc_tuple: "90104"
+  }
+}
+carrier_id {
+  canonical_id: 1138
+  carrier_name: "Thuraya RMSS Network"
+  carrier_attribute {
+    mccmnc_tuple: "90105"
+  }
+}
+carrier_id {
+  canonical_id: 1139
+  carrier_name: "Thuraya Satellite Telecommunications Company"
+  carrier_attribute {
+    mccmnc_tuple: "90106"
+  }
+}
+carrier_id {
+  canonical_id: 1166
+  carrier_name: "Consolidated Telcom"
+  carrier_attribute {
+    mccmnc_tuple: "310060"
+  }
+}
+carrier_id {
+  canonical_id: 1168
+  carrier_name: "Corr Wireless Communications LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310080"
+  }
+}
+carrier_id {
+  canonical_id: 1170
+  carrier_name: "New Mexico RSA 4 East Ltd. Partnership"
+  carrier_attribute {
+    mccmnc_tuple: "310100"
+  }
+}
+carrier_id {
+  canonical_id: 1183
+  carrier_name: "High Plains Midwest LLC, dba Wetlink Communications"
+  carrier_attribute {
+    mccmnc_tuple: "310340"
+  }
+}
+carrier_id {
+  canonical_id: 1184
+  carrier_name: "Mohave Cellular L.P."
+  carrier_attribute {
+    mccmnc_tuple: "310350"
+  }
+}
+carrier_id {
+  canonical_id: 1185
+  carrier_name: "Cellular Network Partnership dba Pioneer Cellular"
+  carrier_attribute {
+    mccmnc_tuple: "310360"
+  }
+}
+carrier_id {
+  canonical_id: 1186
+  carrier_name: "Guamcell Cellular and Paging"
+  carrier_attribute {
+    mccmnc_tuple: "310370"
+  }
+}
+carrier_id {
+  canonical_id: 1187
+  carrier_name: "AT&T"
+  carrier_attribute {
+    mccmnc_tuple: "310030"
+    mccmnc_tuple: "310070"
+    mccmnc_tuple: "310170"
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310380"
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310560"
+    mccmnc_tuple: "310680"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+  }
+}
+carrier_id {
+  canonical_id: 1188
+  carrier_name: "TX-11 Acquistion LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310390"
+  }
+}
+carrier_id {
+  canonical_id: 1189
+  carrier_name: "Wave Runner LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310400"
+    mccmnc_tuple: "311250"
+  }
+}
+carrier_id {
+  canonical_id: 1190
+  carrier_name: "Cincinnati Bell Wireless LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310420"
+  }
+}
+carrier_id {
+  canonical_id: 1191
+  carrier_name: "Alaska Digitel LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310430"
+  }
+}
+carrier_id {
+  canonical_id: 1192
+  carrier_name: "Numerex Corp."
+  carrier_attribute {
+    mccmnc_tuple: "310440"
+  }
+}
+carrier_id {
+  canonical_id: 1193
+  carrier_name: "North East Cellular Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310450"
+  }
+}
+carrier_id {
+  canonical_id: 1194
+  carrier_name: "TMP Corporation"
+  carrier_attribute {
+    mccmnc_tuple: "310460"
+  }
+}
+carrier_id {
+  canonical_id: 1195
+  carrier_name: "Choice Phone LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310480"
+    mccmnc_tuple: "311120"
+  }
+}
+carrier_id {
+  canonical_id: 1196
+  carrier_name: "Public Service Cellular, Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310500"
+  }
+}
+carrier_id {
+  canonical_id: 1197
+  carrier_name: "Airtel Wireless LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310510"
+  }
+}
+carrier_id {
+  canonical_id: 1198
+  carrier_name: "VeriSign"
+  carrier_attribute {
+    mccmnc_tuple: "310520"
+  }
+}
+carrier_id {
+  canonical_id: 1199
+  carrier_name: "Oklahoma Western Telephone Company"
+  carrier_attribute {
+    mccmnc_tuple: "310540"
+  }
+}
+carrier_id {
+  canonical_id: 1234
+  carrier_name: "UBET Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310960"
+  }
+}
+carrier_id {
+  canonical_id: 1235
+  carrier_name: "Globalstar USA"
+  carrier_attribute {
+    mccmnc_tuple: "310970"
+  }
+}
+carrier_id {
+  canonical_id: 1236
+  carrier_name: "Mid-Tex Cellular Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "311000"
+  }
+}
+carrier_id {
+  canonical_id: 1237
+  carrier_name: "Chariton Valley Communications Corp., Inc."
+  carrier_attribute {
+    mccmnc_tuple: "311010"
+  }
+}
+carrier_id {
+  canonical_id: 1238
+  carrier_name: "Missouri RSA No. 5 Partnership"
+  carrier_attribute {
+    mccmnc_tuple: "311020"
+  }
+}
+carrier_id {
+  canonical_id: 1239
+  carrier_name: "Indigo Wireless, Inc."
+  carrier_attribute {
+    mccmnc_tuple: "311030"
+  }
+}
+carrier_id {
+  canonical_id: 1240
+  carrier_name: "Commet Wireless, LLC"
+  carrier_attribute {
+    mccmnc_tuple: "311040"
+  }
+}
+carrier_id {
+  canonical_id: 1241
+  carrier_name: "Thumb Cellular Limited Partnership"
+  carrier_attribute {
+    mccmnc_tuple: "311050"
+  }
+}
+carrier_id {
+  canonical_id: 1242
+  carrier_name: "Space Data Corporation"
+  carrier_attribute {
+    mccmnc_tuple: "311060"
+  }
+}
+carrier_id {
+  canonical_id: 1243
+  carrier_name: "Easterbrooke Cellular Corporation"
+  carrier_attribute {
+    mccmnc_tuple: "311070"
+  }
+}
+carrier_id {
+  canonical_id: 1244
+  carrier_name: "Pine Telephone Company dba Pine Cellular"
+  carrier_attribute {
+    mccmnc_tuple: "311080"
+  }
+}
+carrier_id {
+  canonical_id: 1245
+  carrier_name: "Siouxland PCS"
+  carrier_attribute {
+    mccmnc_tuple: "311090"
+  }
+}
+carrier_id {
+  canonical_id: 1246
+  carrier_name: "Alltel Communications Inc."
+  carrier_attribute {
+    mccmnc_tuple: "311110"
+    mccmnc_tuple: "311271"
+    mccmnc_tuple: "311272"
+    mccmnc_tuple: "311273"
+    mccmnc_tuple: "311274"
+    mccmnc_tuple: "311275"
+    mccmnc_tuple: "311276"
+    mccmnc_tuple: "311277"
+    mccmnc_tuple: "311278"
+    mccmnc_tuple: "311279"
+  }
+}
+carrier_id {
+  canonical_id: 1247
+  carrier_name: "MBO Wireless Inc./Cross Telephone Company"
+  carrier_attribute {
+    mccmnc_tuple: "311140"
+  }
+}
+carrier_id {
+  canonical_id: 1248
+  carrier_name: "Wilkes Cellular Inc."
+  carrier_attribute {
+    mccmnc_tuple: "311150"
+  }
+}
+carrier_id {
+  canonical_id: 1261
+  carrier_name: "Commnet Wireless LLC"
+  carrier_attribute {
+    mccmnc_tuple: "311320"
+  }
+}
+carrier_id {
+  canonical_id: 1262
+  carrier_name: "Bag Tussel Wireless LLC"
+  carrier_attribute {
+    mccmnc_tuple: "311330"
+  }
+}
+carrier_id {
+  canonical_id: 1263
+  carrier_name: "Illinois Valley Cellular"
+  carrier_attribute {
+    mccmnc_tuple: "311340"
+  }
+}
+carrier_id {
+  canonical_id: 1264
+  carrier_name: "Torrestar Networks Inc"
+  carrier_attribute {
+    mccmnc_tuple: "311350"
+  }
+}
+carrier_id {
+  canonical_id: 1265
+  carrier_name: "Stelera Wireless LLC"
+  carrier_attribute {
+    mccmnc_tuple: "311360"
+  }
+}
+carrier_id {
+  canonical_id: 1299
+  carrier_name: "Mobifone"
+  carrier_attribute {
+    mccmnc_tuple: "45201"
+  }
+}
+carrier_id {
+  canonical_id: 1300
+  carrier_name: "Vinaphone"
+  carrier_attribute {
+    mccmnc_tuple: "45202"
+  }
+}
+carrier_id {
+  canonical_id: 1301
+  carrier_name: "SMILE"
+  carrier_attribute {
+    mccmnc_tuple: "54101"
+  }
+}
+carrier_id {
+  canonical_id: 1302
+  carrier_name: "Telecom Samoa Cellular Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "54901"
+  }
+}
+carrier_id {
+  canonical_id: 1307
+  carrier_name: "Sentech (Pty) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "65506"
+  }
+}
+carrier_id {
+  canonical_id: 1308
+  carrier_name: "Cell C (Pty) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "65507"
+  }
+}
+carrier_id {
+  canonical_id: 1309
+  carrier_name: "MTN"
+  carrier_attribute {
+    mccmnc_tuple: "65510"
+    mccmnc_tuple: "65512"
+  }
+}
+carrier_id {
+  canonical_id: 1310
+  carrier_name: "SAPS Gauteng"
+  carrier_attribute {
+    mccmnc_tuple: "65511"
+  }
+}
+carrier_id {
+  canonical_id: 1311
+  carrier_name: "Cape Town Metropolitan Council"
+  carrier_attribute {
+    mccmnc_tuple: "65521"
+  }
+}
+carrier_id {
+  canonical_id: 1312
+  carrier_name: "Bokamoso Consortium"
+  carrier_attribute {
+    mccmnc_tuple: "65530"
+  }
+}
+carrier_id {
+  canonical_id: 1313
+  carrier_name: "Karabo Telecoms (Pty) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "65531"
+  }
+}
+carrier_id {
+  canonical_id: 1314
+  carrier_name: "Ilizwi Telecommunications"
+  carrier_attribute {
+    mccmnc_tuple: "65532"
+  }
+}
+carrier_id {
+  canonical_id: 1315
+  carrier_name: "Thinta Thinta Telecommunications"
+  carrier_attribute {
+    mccmnc_tuple: "65533"
+  }
+}
+carrier_id {
+  canonical_id: 1316
+  carrier_name: "Bokone Telecoms"
+  carrier_attribute {
+    mccmnc_tuple: "65534"
+  }
+}
+carrier_id {
+  canonical_id: 1317
+  carrier_name: "Kingdom Communications"
+  carrier_attribute {
+    mccmnc_tuple: "65535"
+  }
+}
+carrier_id {
+  canonical_id: 1318
+  carrier_name: "Amatole Telecommunication Services"
+  carrier_attribute {
+    mccmnc_tuple: "65536"
+  }
+}
+carrier_id {
+  canonical_id: 1319
+  carrier_name: "Airtel Zambia"
+  carrier_attribute {
+    mccmnc_tuple: "64501"
+  }
+}
+carrier_id {
+  canonical_id: 1320
+  carrier_name: "Telecel Zambia Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "64502"
+  }
+}
+carrier_id {
+  canonical_id: 1321
+  carrier_name: "Zamtel"
+  carrier_attribute {
+    mccmnc_tuple: "64503"
+  }
+}
+carrier_id {
+  canonical_id: 1322
+  carrier_name: "Net One"
+  carrier_attribute {
+    mccmnc_tuple: "64801"
+  }
+}
+carrier_id {
+  canonical_id: 1325
+  carrier_name: "Cable & Wireless (Antigua)"
+  carrier_attribute {
+    mccmnc_tuple: "344920"
+  }
+}
+carrier_id {
+  canonical_id: 1326
+  carrier_name: "AT&T Wireless (Antigua)"
+  carrier_attribute {
+    mccmnc_tuple: "344930"
+  }
+}
+carrier_id {
+  canonical_id: 1327
+  carrier_name: "Weblinks Limited"
+  carrier_attribute {
+    mccmnc_tuple: "365010"
+  }
+}
+carrier_id {
+  canonical_id: 1328
+  carrier_name: "One Telecommunications"
+  carrier_attribute {
+    mccmnc_tuple: "27601"
+    gid1: "01"
+  }
+}
+carrier_id {
+  canonical_id: 1329
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "27602"
+    spn: "VODAFONE AL"
+  }
+}
+carrier_id {
+  canonical_id: 1330
+  carrier_name: "Eagle Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "27603"
+  }
+}
+carrier_id {
+  canonical_id: 1331
+  carrier_name: "TELCELL GSM"
+  carrier_attribute {
+    mccmnc_tuple: "36251"
+  }
+}
+carrier_id {
+  canonical_id: 1332
+  carrier_name: "CT GSM"
+  carrier_attribute {
+    mccmnc_tuple: "36269"
+  }
+}
+carrier_id {
+  canonical_id: 1333
+  carrier_name: "SETEL GSM"
+  carrier_attribute {
+    mccmnc_tuple: "36291"
+  }
+}
+carrier_id {
+  canonical_id: 1334
+  carrier_name: "Unitel"
+  carrier_attribute {
+    mccmnc_tuple: "63102"
+  }
+}
+carrier_id {
+  canonical_id: 1336
+  carrier_name: "Nextel Argentina srl"
+  carrier_attribute {
+    mccmnc_tuple: "722020"
+  }
+}
+carrier_id {
+  canonical_id: 1337
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "72207"
+  }
+}
+carrier_id {
+  canonical_id: 1338
+  carrier_name: "Claro AR"
+  carrier_attribute {
+    mccmnc_tuple: "722310"
+    mccmnc_tuple: "72231"
+  }
+}
+carrier_id {
+  canonical_id: 1339
+  carrier_name: "Compañía de Telefonos del Interior Norte S.A."
+  carrier_attribute {
+    mccmnc_tuple: "722320"
+  }
+}
+carrier_id {
+  canonical_id: 1340
+  carrier_name: "Compañía de Telefonos del Interior S.A."
+  carrier_attribute {
+    mccmnc_tuple: "722330"
+  }
+}
+carrier_id {
+  canonical_id: 1341
+  carrier_name: "Telecom Personal S.A."
+  carrier_attribute {
+    mccmnc_tuple: "722340"
+    mccmnc_tuple: "72234"
+    mccmnc_tuple: "722341"
+  }
+}
+carrier_id {
+  canonical_id: 1343
+  carrier_name: "Telefonica Austria"
+  carrier_attribute {
+    mccmnc_tuple: "23208"
+  }
+}
+carrier_id {
+  canonical_id: 1344
+  carrier_name: "Drei"
+  carrier_attribute {
+    mccmnc_tuple: "23205"
+    mccmnc_tuple: "23210"
+  }
+}
+carrier_id {
+  canonical_id: 1345
+  carrier_name: "Telstra"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    mccmnc_tuple: "50571"
+    mccmnc_tuple: "50572"
+  }
+}
+carrier_id {
+  canonical_id: 1346
+  carrier_name: "Department of Defence"
+  carrier_attribute {
+    mccmnc_tuple: "50504"
+  }
+}
+carrier_id {
+  canonical_id: 1347
+  carrier_name: "The Ozitel Network Pty. Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "50505"
+  }
+}
+carrier_id {
+  canonical_id: 1348
+  carrier_name: "Hutchison 3G Australia Pty. Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "50506"
+  }
+}
+carrier_id {
+  canonical_id: 1349
+  carrier_name: "One.Tel GSM 1800 Pty. Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "50508"
+    mccmnc_tuple: "50599"
+  }
+}
+carrier_id {
+  canonical_id: 1350
+  carrier_name: "Airnet Commercial Australia Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "50509"
+  }
+}
+carrier_id {
+  canonical_id: 1351
+  carrier_name: "Hutchison Telecommunications (Australia) Pty. Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "50512"
+  }
+}
+carrier_id {
+  canonical_id: 1352
+  carrier_name: "AAPT Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "50514"
+  }
+}
+carrier_id {
+  canonical_id: 1354
+  carrier_name: "Azercell Limited Liability Joint Venture"
+  carrier_attribute {
+    mccmnc_tuple: "40001"
+  }
+}
+carrier_id {
+  canonical_id: 1355
+  carrier_name: "Catel JV"
+  carrier_attribute {
+    mccmnc_tuple: "40003"
+  }
+}
+carrier_id {
+  canonical_id: 1356
+  carrier_name: "Azerphone LLC"
+  carrier_attribute {
+    mccmnc_tuple: "40004"
+  }
+}
+carrier_id {
+  canonical_id: 1357
+  carrier_name: "Eronet Mobile Communications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "21803"
+  }
+}
+carrier_id {
+  canonical_id: 1358
+  carrier_name: "MOBI'S (Mobilina Srpske)"
+  carrier_attribute {
+    mccmnc_tuple: "21805"
+  }
+}
+carrier_id {
+  canonical_id: 1359
+  carrier_name: "GSMBIH"
+  carrier_attribute {
+    mccmnc_tuple: "21890"
+  }
+}
+carrier_id {
+  canonical_id: 1360
+  carrier_name: "Cable & Wireless (Barbados) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "342600"
+  }
+}
+carrier_id {
+  canonical_id: 1361
+  carrier_name: "Sunbeach Communications"
+  carrier_attribute {
+    mccmnc_tuple: "342820"
+  }
+}
+carrier_id {
+  canonical_id: 1362
+  carrier_name: "GramenPhone"
+  carrier_attribute {
+    mccmnc_tuple: "47001"
+  }
+}
+carrier_id {
+  canonical_id: 1363
+  carrier_name: "Aktel"
+  carrier_attribute {
+    mccmnc_tuple: "47002"
+  }
+}
+carrier_id {
+  canonical_id: 1364
+  carrier_name: "Mobile 2000"
+  carrier_attribute {
+    mccmnc_tuple: "47003"
+  }
+}
+carrier_id {
+  canonical_id: 1365
+  carrier_name: "Proximus"
+  carrier_attribute {
+    mccmnc_tuple: "20601"
+  }
+}
+carrier_id {
+  canonical_id: 1366
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "20610"
+  }
+}
+carrier_id {
+  canonical_id: 1367
+  carrier_name: "BASE"
+  carrier_attribute {
+    mccmnc_tuple: "20620"
+  }
+}
+carrier_id {
+  canonical_id: 1368
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "61302"
+  }
+}
+carrier_id {
+  canonical_id: 1369
+  carrier_name: "Telecel"
+  carrier_attribute {
+    mccmnc_tuple: "61303"
+  }
+}
+carrier_id {
+  canonical_id: 1370
+  carrier_name: "A1"
+  carrier_attribute {
+    mccmnc_tuple: "28401"
+  }
+}
+carrier_id {
+  canonical_id: 1371
+  carrier_name: "Yettel"
+  carrier_attribute {
+    mccmnc_tuple: "28405"
+  }
+}
+carrier_id {
+  canonical_id: 1372
+  carrier_name: "Batelco"
+  carrier_attribute {
+    mccmnc_tuple: "42601"
+    mccmnc_tuple: "42605"
+  }
+}
+carrier_id {
+  canonical_id: 1373
+  carrier_name: "Spacetel Burundi"
+  carrier_attribute {
+    mccmnc_tuple: "64201"
+  }
+}
+carrier_id {
+  canonical_id: 1374
+  carrier_name: "Safaris"
+  carrier_attribute {
+    mccmnc_tuple: "64202"
+  }
+}
+carrier_id {
+  canonical_id: 1375
+  carrier_name: "Telecel Burundi Company"
+  carrier_attribute {
+    mccmnc_tuple: "64203"
+  }
+}
+carrier_id {
+  canonical_id: 1376
+  carrier_name: "Libercom"
+  carrier_attribute {
+    mccmnc_tuple: "61601"
+  }
+}
+carrier_id {
+  canonical_id: 1377
+  carrier_name: "Telecel"
+  carrier_attribute {
+    mccmnc_tuple: "61602"
+  }
+}
+carrier_id {
+  canonical_id: 1378
+  carrier_name: "Spacetel Benin"
+  carrier_attribute {
+    mccmnc_tuple: "61603"
+  }
+}
+carrier_id {
+  canonical_id: 1379
+  carrier_name: "DST Com"
+  carrier_attribute {
+    mccmnc_tuple: "52811"
+  }
+}
+carrier_id {
+  canonical_id: 1380
+  carrier_name: "Nuevatel S.A."
+  carrier_attribute {
+    mccmnc_tuple: "73601"
+  }
+}
+carrier_id {
+  canonical_id: 1381
+  carrier_name: "ENTEL S.A."
+  carrier_attribute {
+    mccmnc_tuple: "73602"
+  }
+}
+carrier_id {
+  canonical_id: 1382
+  carrier_name: "Telecel S.A."
+  carrier_attribute {
+    mccmnc_tuple: "73603"
+  }
+}
+carrier_id {
+  canonical_id: 1383
+  carrier_name: "Nextel"
+  carrier_attribute {
+    mccmnc_tuple: "72400"
+    mccmnc_tuple: "72439"
+  }
+}
+carrier_id {
+  canonical_id: 1384
+  carrier_name: "CRT Cellular"
+  carrier_attribute {
+    mccmnc_tuple: "72401"
+  }
+}
+carrier_id {
+  canonical_id: 1385
+  carrier_name: "TIM"
+  carrier_attribute {
+    mccmnc_tuple: "72402"
+    mccmnc_tuple: "72403"
+    mccmnc_tuple: "72404"
+    mccmnc_tuple: "72454"
+  }
+}
+carrier_id {
+  canonical_id: 1388
+  carrier_name: "Sercontel Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72407"
+  }
+}
+carrier_id {
+  canonical_id: 1389
+  carrier_name: "Oi"
+  carrier_attribute {
+    mccmnc_tuple: "72430"
+    mccmnc_tuple: "72431"
+    mccmnc_tuple: "72424"
+  }
+}
+carrier_id {
+  canonical_id: 1390
+  carrier_name: "Algar Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "72432"
+    mccmnc_tuple: "72433"
+    mccmnc_tuple: "72434"
+  }
+}
+carrier_id {
+  canonical_id: 1391
+  carrier_name: "Telebahia Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72435"
+  }
+}
+carrier_id {
+  canonical_id: 1392
+  carrier_name: "Telergipe Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72437"
+  }
+}
+carrier_id {
+  canonical_id: 1394
+  carrier_name: "Telpe Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72441"
+  }
+}
+carrier_id {
+  canonical_id: 1395
+  carrier_name: "Telepisa Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72443"
+  }
+}
+carrier_id {
+  canonical_id: 1396
+  carrier_name: "Telpa Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72445"
+  }
+}
+carrier_id {
+  canonical_id: 1397
+  carrier_name: "Telern Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72447"
+  }
+}
+carrier_id {
+  canonical_id: 1398
+  carrier_name: "Teleceara Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72448"
+  }
+}
+carrier_id {
+  canonical_id: 1399
+  carrier_name: "Telma Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72451"
+  }
+}
+carrier_id {
+  canonical_id: 1400
+  carrier_name: "Telepara Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72453"
+  }
+}
+carrier_id {
+  canonical_id: 1401
+  carrier_name: "Teleamazon Cel"
+  carrier_attribute {
+    mccmnc_tuple: "72455"
+  }
+}
+carrier_id {
+  canonical_id: 1402
+  carrier_name: "B-Mobile of Bhutan Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "40217"
+  }
+}
+carrier_id {
+  canonical_id: 1403
+  carrier_name: "Rogers"
+  carrier_attribute {
+    mccmnc_tuple: "302720"
+    mccmnc_tuple: "30272"
+  }
+}
+carrier_id {
+  canonical_id: 1404
+  carrier_name: "TELUS Mobility"
+  carrier_attribute {
+    mccmnc_tuple: "302220"
+    mccmnc_tuple: "302221"
+    mccmnc_tuple: "30222"
+    mccmnc_tuple: "30286"
+    gid1: "5455"
+  }
+}
+carrier_id {
+  canonical_id: 1405
+  carrier_name: "Vodacom Congo RDC sprl"
+  carrier_attribute {
+    mccmnc_tuple: "63001"
+  }
+}
+carrier_id {
+  canonical_id: 1406
+  carrier_name: "Supercell Sprl"
+  carrier_attribute {
+    mccmnc_tuple: "63005"
+  }
+}
+carrier_id {
+  canonical_id: 1407
+  carrier_name: "Orange RDC"
+  carrier_attribute {
+    mccmnc_tuple: "63086"
+  }
+}
+carrier_id {
+  canonical_id: 1408
+  carrier_name: "Centrafrique Telecom Plus (CTP)"
+  carrier_attribute {
+    mccmnc_tuple: "62301"
+  }
+}
+carrier_id {
+  canonical_id: 1409
+  carrier_name: "Telecel Centrafrique (TC)"
+  carrier_attribute {
+    mccmnc_tuple: "62302"
+  }
+}
+carrier_id {
+  canonical_id: 1410
+  carrier_name: "Orange Centrafricaine"
+  carrier_attribute {
+    mccmnc_tuple: "62303"
+  }
+}
+carrier_id {
+  canonical_id: 1411
+  carrier_name: "Airtel Congo"
+  carrier_attribute {
+    mccmnc_tuple: "62901"
+  }
+}
+carrier_id {
+  canonical_id: 1412
+  carrier_name: "Libertis Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "62910"
+  }
+}
+carrier_id {
+  canonical_id: 1413
+  carrier_name: "Sunrise"
+  carrier_attribute {
+    mccmnc_tuple: "22802"
+    mccmnc_tuple: "22812"
+  }
+}
+carrier_id {
+  canonical_id: 1414
+  carrier_name: "Salt"
+  carrier_attribute {
+    mccmnc_tuple: "22803"
+  }
+}
+carrier_id {
+  canonical_id: 1415
+  carrier_name: "Comfone AG"
+  carrier_attribute {
+    mccmnc_tuple: "22805"
+  }
+}
+carrier_id {
+  canonical_id: 1416
+  carrier_name: "SBB AG"
+  carrier_attribute {
+    mccmnc_tuple: "22806"
+  }
+}
+carrier_id {
+  canonical_id: 1417
+  carrier_name: "IN&Phone SA"
+  carrier_attribute {
+    mccmnc_tuple: "22807"
+  }
+}
+carrier_id {
+  canonical_id: 1418
+  carrier_name: "Tele2 Telecommunications AG"
+  carrier_attribute {
+    mccmnc_tuple: "22808"
+  }
+}
+carrier_id {
+  canonical_id: 1419
+  carrier_name: "Bebbicell AG"
+  carrier_attribute {
+    mccmnc_tuple: "22851"
+  }
+}
+carrier_id {
+  canonical_id: 1420
+  carrier_name: "Atlantique Cellulaire"
+  carrier_attribute {
+    mccmnc_tuple: "61202"
+  }
+}
+carrier_id {
+  canonical_id: 1421
+  carrier_name: "Orange Côte d'Ivoire"
+  carrier_attribute {
+    mccmnc_tuple: "61203"
+  }
+}
+carrier_id {
+  canonical_id: 1422
+  carrier_name: "Comium Côte d'Ivoire"
+  carrier_attribute {
+    mccmnc_tuple: "61204"
+  }
+}
+carrier_id {
+  canonical_id: 1423
+  carrier_name: "Loteny Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "61205"
+  }
+}
+carrier_id {
+  canonical_id: 1424
+  carrier_name: "Oricel Côte d'Ivoire"
+  carrier_attribute {
+    mccmnc_tuple: "61206"
+  }
+}
+carrier_id {
+  canonical_id: 1425
+  carrier_name: "Aircomm Côte d'Ivoire"
+  carrier_attribute {
+    mccmnc_tuple: "61207"
+  }
+}
+carrier_id {
+  canonical_id: 1426
+  carrier_name: "Telecom Cook"
+  carrier_attribute {
+    mccmnc_tuple: "54801"
+  }
+}
+carrier_id {
+  canonical_id: 1427
+  carrier_name: "Entel"
+  carrier_attribute {
+    mccmnc_tuple: "73001"
+    mccmnc_tuple: "73010"
+    mccmnc_tuple: "73026"
+  }
+}
+carrier_id {
+  canonical_id: 1428
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "73002"
+    mccmnc_tuple: "73007"
+  }
+}
+carrier_id {
+  canonical_id: 1429
+  carrier_name: "Claro CL"
+  carrier_attribute {
+    mccmnc_tuple: "73003"
+  }
+}
+carrier_id {
+  canonical_id: 1430
+  carrier_name: "WOM"
+  carrier_attribute {
+    mccmnc_tuple: "73004"
+    mccmnc_tuple: "73009"
+  }
+}
+carrier_id {
+  canonical_id: 1431
+  carrier_name: "Multikom S.A."
+  carrier_attribute {
+    mccmnc_tuple: "73005"
+  }
+}
+carrier_id {
+  canonical_id: 1433
+  carrier_name: "Mobile Telephone Networks Cameroon"
+  carrier_attribute {
+    mccmnc_tuple: "62401"
+  }
+}
+carrier_id {
+  canonical_id: 1434
+  carrier_name: "Orange Cameroun"
+  carrier_attribute {
+    mccmnc_tuple: "62402"
+  }
+}
+carrier_id {
+  canonical_id: 1435
+  carrier_name: "China Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "46000"
+    mccmnc_tuple: "46002"
+    mccmnc_tuple: "46004"
+    mccmnc_tuple: "46007"
+    mccmnc_tuple: "46008"
+  }
+}
+carrier_id {
+  canonical_id: 1436
+  carrier_name: "China Unicom"
+  carrier_attribute {
+    mccmnc_tuple: "46001"
+    mccmnc_tuple: "46006"
+    mccmnc_tuple: "46009"
+  }
+}
+carrier_id {
+  canonical_id: 1438
+  carrier_name: "Colombia Telecomunicaciones S.A. - Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "732001"
+  }
+}
+carrier_id {
+  canonical_id: 1439
+  carrier_name: "Edatel S.A."
+  carrier_attribute {
+    mccmnc_tuple: "732002"
+  }
+}
+carrier_id {
+  canonical_id: 1440
+  carrier_name: "Emtelsa"
+  carrier_attribute {
+    mccmnc_tuple: "732020"
+  }
+}
+carrier_id {
+  canonical_id: 1441
+  carrier_name: "Emcali"
+  carrier_attribute {
+    mccmnc_tuple: "732099"
+  }
+}
+carrier_id {
+  canonical_id: 1442
+  carrier_name: "Claro CO"
+  carrier_attribute {
+    mccmnc_tuple: "732101"
+  }
+}
+carrier_id {
+  canonical_id: 1443
+  carrier_name: "Bellsouth Colombia S.A."
+  carrier_attribute {
+    mccmnc_tuple: "732102"
+  }
+}
+carrier_id {
+  canonical_id: 1444
+  carrier_name: "ETECSA"
+  carrier_attribute {
+    mccmnc_tuple: "36801"
+  }
+}
+carrier_id {
+  canonical_id: 1445
+  carrier_name: "Cabo Verde Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "62501"
+  }
+}
+carrier_id {
+  canonical_id: 1446
+  carrier_name: "T+Telecomunicaçôes"
+  carrier_attribute {
+    mccmnc_tuple: "62502"
+  }
+}
+carrier_id {
+  canonical_id: 1447
+  carrier_name: "CYTA"
+  carrier_attribute {
+    mccmnc_tuple: "28001"
+  }
+}
+carrier_id {
+  canonical_id: 1448
+  carrier_name: "epic"
+  carrier_attribute {
+    mccmnc_tuple: "28010"
+  }
+}
+carrier_id {
+  canonical_id: 1449
+  carrier_name: "O2"
+  carrier_attribute {
+    mccmnc_tuple: "23002"
+  }
+}
+carrier_id {
+  canonical_id: 1450
+  carrier_name: "Mobilkom a.s."
+  carrier_attribute {
+    mccmnc_tuple: "23004"
+  }
+}
+carrier_id {
+  canonical_id: 1451
+  carrier_name: "Sprava Zeleznicni Dopravni Cesty"
+  carrier_attribute {
+    mccmnc_tuple: "23098"
+  }
+}
+carrier_id {
+  canonical_id: 1452
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "23003"
+    spn: "Vodafone CZ"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "23099"
+    imsi_prefix_xpattern: "x"
+  }
+}
+carrier_id {
+  canonical_id: 1453
+  carrier_name: "Telefonica"
+  carrier_attribute {
+    mccmnc_tuple: "26203"
+    mccmnc_tuple: "26205"
+    mccmnc_tuple: "26277"
+  }
+}
+carrier_id {
+  canonical_id: 1454
+  carrier_name: "o2"
+  carrier_attribute {
+    mccmnc_tuple: "26207"
+    mccmnc_tuple: "26208"
+  }
+}
+carrier_id {
+  canonical_id: 1455
+  carrier_name: "Arcor AG & Co."
+  carrier_attribute {
+    mccmnc_tuple: "26210"
+  }
+}
+carrier_id {
+  canonical_id: 1456
+  carrier_name: "O2 (Germany) GmbH & Co. OHG"
+  carrier_attribute {
+    mccmnc_tuple: "26211"
+  }
+}
+carrier_id {
+  canonical_id: 1457
+  carrier_name: "Dolphin Telecom (Deutschland) GmbH"
+  carrier_attribute {
+    mccmnc_tuple: "26212"
+  }
+}
+carrier_id {
+  canonical_id: 1458
+  carrier_name: "Mobilcom Multimedia GmbH"
+  carrier_attribute {
+    mccmnc_tuple: "26213"
+  }
+}
+carrier_id {
+  canonical_id: 1459
+  carrier_name: "Group 3G UMTS GmbH (Quam)"
+  carrier_attribute {
+    mccmnc_tuple: "26214"
+  }
+}
+carrier_id {
+  canonical_id: 1460
+  carrier_name: "Airdata AG"
+  carrier_attribute {
+    mccmnc_tuple: "26215"
+  }
+}
+carrier_id {
+  canonical_id: 1461
+  carrier_name: "Siemens AG, ICMNPGUSTA"
+  carrier_attribute {
+    mccmnc_tuple: "26276"
+  }
+}
+carrier_id {
+  canonical_id: 1462
+  carrier_name: "Evatis"
+  carrier_attribute {
+    mccmnc_tuple: "63801"
+  }
+}
+carrier_id {
+  canonical_id: 1463
+  carrier_name: "TDC Mobil"
+  carrier_attribute {
+    mccmnc_tuple: "23801"
+    mccmnc_tuple: "23810"
+  }
+}
+carrier_id {
+  canonical_id: 1464
+  carrier_name: "Telenor"
+  carrier_attribute {
+    mccmnc_tuple: "23802"
+    mccmnc_tuple: "23866"
+  }
+}
+carrier_id {
+  canonical_id: 1465
+  carrier_name: "MIGway A/S"
+  carrier_attribute {
+    mccmnc_tuple: "23803"
+  }
+}
+carrier_id {
+  canonical_id: 1466
+  carrier_name: "3"
+  carrier_attribute {
+    mccmnc_tuple: "23806"
+  }
+}
+carrier_id {
+  canonical_id: 1467
+  carrier_name: "Claro RD"
+  carrier_attribute {
+    mccmnc_tuple: "37002"
+    mccmnc_tuple: "370020"
+  }
+}
+carrier_id {
+  canonical_id: 1468
+  carrier_name: "Tricom S.A."
+  carrier_attribute {
+    mccmnc_tuple: "37003"
+  }
+}
+carrier_id {
+  canonical_id: 1469
+  carrier_name: "CentennialDominicana"
+  carrier_attribute {
+    mccmnc_tuple: "37004"
+  }
+}
+carrier_id {
+  canonical_id: 1470
+  carrier_name: "Algérie Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "60301"
+  }
+}
+carrier_id {
+  canonical_id: 1471
+  carrier_name: "Orascom Telecom Algérie"
+  carrier_attribute {
+    mccmnc_tuple: "60302"
+  }
+}
+carrier_id {
+  canonical_id: 1472
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "74000"
+  }
+}
+carrier_id {
+  canonical_id: 1473
+  carrier_name: "Claro EC"
+  carrier_attribute {
+    mccmnc_tuple: "74001"
+    mccmnc_tuple: "740010"
+  }
+}
+carrier_id {
+  canonical_id: 1474
+  carrier_name: "Telecsa S.A."
+  carrier_attribute {
+    mccmnc_tuple: "74002"
+  }
+}
+carrier_id {
+  canonical_id: 1475
+  carrier_name: "Elisa"
+  carrier_attribute {
+    mccmnc_tuple: "24405"
+    mccmnc_tuple: "24421"
+  }
+}
+carrier_id {
+  canonical_id: 1476
+  carrier_name: "Finnet Group"
+  carrier_attribute {
+    mccmnc_tuple: "24409"
+  }
+}
+carrier_id {
+  canonical_id: 1477
+  carrier_name: "Alands Mobiltelefon AB"
+  carrier_attribute {
+    mccmnc_tuple: "24414"
+  }
+}
+carrier_id {
+  canonical_id: 1478
+  carrier_name: "Oy Finland Tele2 AB"
+  carrier_attribute {
+    mccmnc_tuple: "24416"
+  }
+}
+carrier_id {
+  canonical_id: 1480
+  carrier_name: "Telia"
+  carrier_attribute {
+    mccmnc_tuple: "24491"
+  }
+}
+carrier_id {
+  canonical_id: 1481
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "54201"
+  }
+}
+carrier_id {
+  canonical_id: 1482
+  carrier_name: "FSM Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "55001"
+  }
+}
+carrier_id {
+  canonical_id: 1483
+  carrier_name: "Faroese Telecom - GSM"
+  carrier_attribute {
+    mccmnc_tuple: "28801"
+  }
+}
+carrier_id {
+  canonical_id: 1484
+  carrier_name: "Kall GSM"
+  carrier_attribute {
+    mccmnc_tuple: "28802"
+  }
+}
+carrier_id {
+  canonical_id: 1486
+  carrier_name: "Globalstar Europe"
+  carrier_attribute {
+    mccmnc_tuple: "20805"
+    mccmnc_tuple: "20806"
+    mccmnc_tuple: "20807"
+  }
+}
+carrier_id {
+  canonical_id: 1487
+  carrier_name: "Bouygues Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "20820"
+    mccmnc_tuple: "20821"
+    mccmnc_tuple: "20888"
+  }
+}
+carrier_id {
+  canonical_id: 1488
+  carrier_name: "Libertis S.A."
+  carrier_attribute {
+    mccmnc_tuple: "62801"
+  }
+}
+carrier_id {
+  canonical_id: 1489
+  carrier_name: "Telecel Gabon S.A."
+  carrier_attribute {
+    mccmnc_tuple: "62802"
+  }
+}
+carrier_id {
+  canonical_id: 1490
+  carrier_name: "Airtel Gabon"
+  carrier_attribute {
+    mccmnc_tuple: "62803"
+  }
+}
+carrier_id {
+  canonical_id: 1491
+  carrier_name: "Mapesbury Communications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "23401"
+  }
+}
+carrier_id {
+  canonical_id: 1492
+  carrier_name: "O2"
+  carrier_attribute {
+    mccmnc_tuple: "23410"
+  }
+}
+carrier_id {
+  canonical_id: 1493
+  carrier_name: "Jersey Telenet Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "23403"
+  }
+}
+carrier_id {
+  canonical_id: 1494
+  carrier_name: "FMS Solutions Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "23404"
+  }
+}
+carrier_id {
+  canonical_id: 1495
+  carrier_name: "Colt Mobile Telecommunications Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "23405"
+  }
+}
+carrier_id {
+  canonical_id: 1496
+  carrier_name: "Internet One Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "23406"
+  }
+}
+carrier_id {
+  canonical_id: 1497
+  carrier_name: "Cable and Wireless plc"
+  carrier_attribute {
+    mccmnc_tuple: "23407"
+  }
+}
+carrier_id {
+  canonical_id: 1498
+  carrier_name: "Wire9 Telecom plc"
+  carrier_attribute {
+    mccmnc_tuple: "23409"
+    mccmnc_tuple: "23418"
+  }
+}
+carrier_id {
+  canonical_id: 1500
+  carrier_name: "Ntework Rail Infrastructure Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "23412"
+    mccmnc_tuple: "23413"
+  }
+}
+carrier_id {
+  canonical_id: 1501
+  carrier_name: "Hay Systems Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "23414"
+  }
+}
+carrier_id {
+  canonical_id: 1502
+  carrier_name: "Opal Telecom Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "23416"
+  }
+}
+carrier_id {
+  canonical_id: 1503
+  carrier_name: "Flextel Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "23417"
+  }
+}
+carrier_id {
+  canonical_id: 1504
+  carrier_name: "Teleware plc"
+  carrier_attribute {
+    mccmnc_tuple: "23419"
+  }
+}
+carrier_id {
+  canonical_id: 1505
+  carrier_name: "Three Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "23420"
+    mccmnc_tuple: "23494"
+    mccmnc_tuple: "23594"
+  }
+}
+carrier_id {
+  canonical_id: 1506
+  carrier_name: "Jersey Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "23450"
+  }
+}
+carrier_id {
+  canonical_id: 1507
+  carrier_name: "Manx Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "23458"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "23410"
+    gid1: "519"
+  }
+}
+carrier_id {
+  canonical_id: 1508
+  carrier_name: "Inquam Telecom (Holdings) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "23475"
+  }
+}
+carrier_id {
+  canonical_id: 1509
+  carrier_name: "British Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "23400"
+    mccmnc_tuple: "23476"
+  }
+}
+carrier_id {
+  canonical_id: 1510
+  carrier_name: "Airwave mmO2 Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "23478"
+  }
+}
+carrier_id {
+  canonical_id: 1511
+  carrier_name: "Geocell Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "28201"
+  }
+}
+carrier_id {
+  canonical_id: 1512
+  carrier_name: "Magti GSM Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "28202"
+  }
+}
+carrier_id {
+  canonical_id: 1513
+  carrier_name: "Iberiatel Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "28203"
+  }
+}
+carrier_id {
+  canonical_id: 1514
+  carrier_name: "Mobitel Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "28204"
+  }
+}
+carrier_id {
+  canonical_id: 1515
+  carrier_name: "MTN"
+  carrier_attribute {
+    mccmnc_tuple: "62001"
+  }
+}
+carrier_id {
+  canonical_id: 1516
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "62002"
+    spn: "Vodafone GH"
+  }
+}
+carrier_id {
+  canonical_id: 1518
+  carrier_name: "Kasapa Telecom Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "62004"
+  }
+}
+carrier_id {
+  canonical_id: 1519
+  carrier_name: "Telestet"
+  carrier_attribute {
+    mccmnc_tuple: "20210"
+  }
+}
+carrier_id {
+  canonical_id: 1520
+  carrier_name: "Claro GT"
+  carrier_attribute {
+    mccmnc_tuple: "70401"
+  }
+}
+carrier_id {
+  canonical_id: 1521
+  carrier_name: "Comunicaciones Celulares S.A."
+  carrier_attribute {
+    mccmnc_tuple: "70402"
+  }
+}
+carrier_id {
+  canonical_id: 1522
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "70403"
+    mccmnc_tuple: "704030"
+  }
+}
+carrier_id {
+  canonical_id: 1523
+  carrier_name: "Guinétel S.A."
+  carrier_attribute {
+    mccmnc_tuple: "63201"
+  }
+}
+carrier_id {
+  canonical_id: 1524
+  carrier_name: "Spacetel Guiné-Bissau S.A."
+  carrier_attribute {
+    mccmnc_tuple: "63202"
+  }
+}
+carrier_id {
+  canonical_id: 1525
+  carrier_name: "Cel*Star (Guyana) Inc."
+  carrier_attribute {
+    mccmnc_tuple: "73801"
+  }
+}
+carrier_id {
+  canonical_id: 1526
+  carrier_name: "1O1O / csl / Club Sim"
+  carrier_attribute {
+    mccmnc_tuple: "45400"
+    mccmnc_tuple: "45419"
+  }
+}
+carrier_id {
+  canonical_id: 1527
+  carrier_name: "MVNO/CITIC"
+  carrier_attribute {
+    mccmnc_tuple: "45401"
+  }
+}
+carrier_id {
+  canonical_id: 1528
+  carrier_name: "Celtel"
+  carrier_attribute {
+    mccmnc_tuple: "708002"
+    mccmnc_tuple: "70802"
+    mccmnc_tuple: "708020"
+  }
+}
+carrier_id {
+  canonical_id: 1529
+  carrier_name: "Telemach"
+  carrier_attribute {
+    mccmnc_tuple: "21902"
+  }
+}
+carrier_id {
+  canonical_id: 1530
+  carrier_name: "A1/Tomato"
+  carrier_attribute {
+    mccmnc_tuple: "21910"
+  }
+}
+carrier_id {
+  canonical_id: 1531
+  carrier_name: "Comcel"
+  carrier_attribute {
+    mccmnc_tuple: "37201"
+  }
+}
+carrier_id {
+  canonical_id: 1532
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "37202"
+  }
+}
+carrier_id {
+  canonical_id: 1533
+  carrier_name: "Rectel"
+  carrier_attribute {
+    mccmnc_tuple: "37203"
+  }
+}
+carrier_id {
+  canonical_id: 1534
+  carrier_name: "Yettel"
+  carrier_attribute {
+    mccmnc_tuple: "21601"
+  }
+}
+carrier_id {
+  canonical_id: 1535
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "21670"
+    spn: ""
+    spn: "vodafone HU"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21670"
+    imsi_prefix_xpattern: "21670xx2"
+  }
+}
+carrier_id {
+  canonical_id: 1536
+  carrier_name: "PSN"
+  carrier_attribute {
+    mccmnc_tuple: "51000"
+  }
+}
+carrier_id {
+  canonical_id: 1537
+  carrier_name: "Indosat"
+  carrier_attribute {
+    mccmnc_tuple: "51001"
+  }
+}
+carrier_id {
+  canonical_id: 1543
+  carrier_name: "Reliance"
+  carrier_attribute {
+    mccmnc_tuple: "40409"
+    mccmnc_tuple: "40418"
+    mccmnc_tuple: "40436"
+    mccmnc_tuple: "40450"
+    mccmnc_tuple: "40452"
+    mccmnc_tuple: "40467"
+    mccmnc_tuple: "40485"
+    mccmnc_tuple: "40501"
+    mccmnc_tuple: "40503"
+    mccmnc_tuple: "40504"
+    mccmnc_tuple: "40505"
+    mccmnc_tuple: "40506"
+    mccmnc_tuple: "40507"
+    mccmnc_tuple: "40508"
+    mccmnc_tuple: "40509"
+    mccmnc_tuple: "40510"
+    mccmnc_tuple: "40511"
+    mccmnc_tuple: "40512"
+    mccmnc_tuple: "40513"
+    mccmnc_tuple: "40514"
+    mccmnc_tuple: "40515"
+    mccmnc_tuple: "40517"
+    mccmnc_tuple: "40518"
+    mccmnc_tuple: "40519"
+    mccmnc_tuple: "40520"
+    mccmnc_tuple: "40521"
+    mccmnc_tuple: "40522"
+    mccmnc_tuple: "40523"
+  }
+}
+carrier_id {
+  canonical_id: 1545
+  carrier_name: "BPL Mobile Communications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "40421"
+  }
+}
+carrier_id {
+  canonical_id: 1549
+  carrier_name: "Bharat Sanchar Nigam Ltd. (BSNL)"
+  carrier_attribute {
+    mccmnc_tuple: "40434"
+    mccmnc_tuple: "40438"
+    mccmnc_tuple: "40451"
+    mccmnc_tuple: "40453"
+    mccmnc_tuple: "40454"
+    mccmnc_tuple: "40455"
+    mccmnc_tuple: "40457"
+    mccmnc_tuple: "40458"
+    mccmnc_tuple: "40459"
+    mccmnc_tuple: "40462"
+    mccmnc_tuple: "40464"
+    mccmnc_tuple: "40466"
+    mccmnc_tuple: "40471"
+    mccmnc_tuple: "40472"
+    mccmnc_tuple: "40473"
+    mccmnc_tuple: "40474"
+    mccmnc_tuple: "40475"
+    mccmnc_tuple: "40476"
+    mccmnc_tuple: "40477"
+    mccmnc_tuple: "40479"
+    mccmnc_tuple: "40480"
+    mccmnc_tuple: "40481"
+  }
+}
+carrier_id {
+  canonical_id: 1550
+  carrier_name: "RPG Cellular"
+  carrier_attribute {
+    mccmnc_tuple: "40441"
+  }
+}
+carrier_id {
+  canonical_id: 1551
+  carrier_name: "Aircel Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "40442"
+    mccmnc_tuple: "40425"
+    mccmnc_tuple: "40428"
+    mccmnc_tuple: "40429"
+    mccmnc_tuple: "40437"
+    mccmnc_tuple: "40491"
+    mccmnc_tuple: "405800"
+    mccmnc_tuple: "405801"
+    mccmnc_tuple: "405802"
+    mccmnc_tuple: "405803"
+    mccmnc_tuple: "405804"
+    mccmnc_tuple: "405805"
+    mccmnc_tuple: "405806"
+    mccmnc_tuple: "405807"
+    mccmnc_tuple: "405808"
+    mccmnc_tuple: "405809"
+    mccmnc_tuple: "405810"
+    mccmnc_tuple: "405811"
+    mccmnc_tuple: "405812"
+  }
+}
+carrier_id {
+  canonical_id: 1556
+  carrier_name: "Mahanagar Telephone Nigam Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "40468"
+    mccmnc_tuple: "40469"
+  }
+}
+carrier_id {
+  canonical_id: 1559
+  carrier_name: "Reliable Internet Services Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "40483"
+  }
+}
+carrier_id {
+  canonical_id: 1562
+  carrier_name: "IR-MCI (Hamrahe Avval)"
+  carrier_attribute {
+    mccmnc_tuple: "43211"
+  }
+}
+carrier_id {
+  canonical_id: 1563
+  carrier_name: "Telecommunication Kish Co. (KIFZO)"
+  carrier_attribute {
+    mccmnc_tuple: "43214"
+  }
+}
+carrier_id {
+  canonical_id: 1564
+  carrier_name: "MTCE (Espadan)"
+  carrier_attribute {
+    mccmnc_tuple: "43219"
+  }
+}
+carrier_id {
+  canonical_id: 1565
+  carrier_name: "Iceland Telecom Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "27401"
+  }
+}
+carrier_id {
+  canonical_id: 1566
+  carrier_name: "Tal hf"
+  carrier_attribute {
+    mccmnc_tuple: "27402"
+  }
+}
+carrier_id {
+  canonical_id: 1567
+  carrier_name: "Islandssimi GSM ehf"
+  carrier_attribute {
+    mccmnc_tuple: "27403"
+  }
+}
+carrier_id {
+  canonical_id: 1568
+  carrier_name: "IMC Islande ehf"
+  carrier_attribute {
+    mccmnc_tuple: "27404"
+  }
+}
+carrier_id {
+  canonical_id: 1569
+  carrier_name: "IceCell ehf"
+  carrier_attribute {
+    mccmnc_tuple: "27407"
+  }
+}
+carrier_id {
+  canonical_id: 1571
+  carrier_name: "Elsacom"
+  carrier_attribute {
+    mccmnc_tuple: "22202"
+  }
+}
+carrier_id {
+  canonical_id: 1572
+  carrier_name: "IPSE 2000"
+  carrier_attribute {
+    mccmnc_tuple: "22277"
+  }
+}
+carrier_id {
+  canonical_id: 1573
+  carrier_name: "WINDTRE"
+  carrier_attribute {
+    mccmnc_tuple: "22288"
+  }
+}
+carrier_id {
+  canonical_id: 1574
+  carrier_name: "Blu"
+  carrier_attribute {
+    mccmnc_tuple: "22298"
+  }
+}
+carrier_id {
+  canonical_id: 1575
+  carrier_name: "WINDTRE"
+  carrier_attribute {
+    mccmnc_tuple: "22299"
+  }
+}
+carrier_id {
+  canonical_id: 1576
+  carrier_name: "Cable & Wireless Jamaica Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "338020"
+  }
+}
+carrier_id {
+  canonical_id: 1577
+  carrier_name: "Mossel (Jamaica) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "338050"
+    mccmnc_tuple: "33805"
+  }
+}
+carrier_id {
+  canonical_id: 1578
+  carrier_name: "Fastlink"
+  carrier_attribute {
+    mccmnc_tuple: "41601"
+  }
+}
+carrier_id {
+  canonical_id: 1579
+  carrier_name: "Xpress"
+  carrier_attribute {
+    mccmnc_tuple: "41602"
+  }
+}
+carrier_id {
+  canonical_id: 1580
+  carrier_name: "Umniah"
+  carrier_attribute {
+    mccmnc_tuple: "41603"
+  }
+}
+carrier_id {
+  canonical_id: 1581
+  carrier_name: "au"
+  carrier_attribute {
+    mccmnc_tuple: "44050"
+    mccmnc_tuple: "44051"
+    mccmnc_tuple: "44052"
+    mccmnc_tuple: "44054"
+    gid1: "10"
+  }
+}
+carrier_id {
+  canonical_id: 1585
+  carrier_name: "Zain"
+  carrier_attribute {
+    mccmnc_tuple: "41902"
+  }
+}
+carrier_id {
+  canonical_id: 1586
+  carrier_name: "Ooredoo"
+  carrier_attribute {
+    mccmnc_tuple: "41903"
+  }
+}
+carrier_id {
+  canonical_id: 1587
+  carrier_name: "Cable & Wireless (Cayman)"
+  carrier_attribute {
+    mccmnc_tuple: "346140"
+  }
+}
+carrier_id {
+  canonical_id: 1588
+  carrier_name: "Beeline"
+  carrier_attribute {
+    mccmnc_tuple: "40101"
+  }
+}
+carrier_id {
+  canonical_id: 1589
+  carrier_name: "Kcell/activ"
+  carrier_attribute {
+    mccmnc_tuple: "40102"
+  }
+}
+carrier_id {
+  canonical_id: 1590
+  carrier_name: "Lao Telecommunications"
+  carrier_attribute {
+    mccmnc_tuple: "45701"
+  }
+}
+carrier_id {
+  canonical_id: 1591
+  carrier_name: "ETL Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "45702"
+  }
+}
+carrier_id {
+  canonical_id: 1592
+  carrier_name: "Millicom"
+  carrier_attribute {
+    mccmnc_tuple: "45708"
+  }
+}
+carrier_id {
+  canonical_id: 1593
+  carrier_name: "Cellis"
+  carrier_attribute {
+    mccmnc_tuple: "41532"
+    mccmnc_tuple: "41533"
+    mccmnc_tuple: "41534"
+    mccmnc_tuple: "41535"
+  }
+}
+carrier_id {
+  canonical_id: 1594
+  carrier_name: "Libancell"
+  carrier_attribute {
+    mccmnc_tuple: "41536"
+    mccmnc_tuple: "41537"
+    mccmnc_tuple: "41538"
+    mccmnc_tuple: "41539"
+  }
+}
+carrier_id {
+  canonical_id: 1595
+  carrier_name: "Telecom FL AG"
+  carrier_attribute {
+    mccmnc_tuple: "29501"
+  }
+}
+carrier_id {
+  canonical_id: 1596
+  carrier_name: "Viag Europlatform AG"
+  carrier_attribute {
+    mccmnc_tuple: "29502"
+  }
+}
+carrier_id {
+  canonical_id: 1597
+  carrier_name: "Mobilkom (Liechstein) AG"
+  carrier_attribute {
+    mccmnc_tuple: "29505"
+  }
+}
+carrier_id {
+  canonical_id: 1598
+  carrier_name: "Tele2 AG"
+  carrier_attribute {
+    mccmnc_tuple: "29577"
+  }
+}
+carrier_id {
+  canonical_id: 1599
+  carrier_name: "Dialog Sri Lanka"
+  carrier_attribute {
+    mccmnc_tuple: "41302"
+  }
+}
+carrier_id {
+  canonical_id: 1600
+  carrier_name: "Celtel Lanka Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "41303"
+  }
+}
+carrier_id {
+  canonical_id: 1601
+  carrier_name: "Comium Liberia"
+  carrier_attribute {
+    mccmnc_tuple: "61804"
+  }
+}
+carrier_id {
+  canonical_id: 1602
+  carrier_name: "Vodacom Lesotho (pty) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "65101"
+    spn: "Vodacom"
+  }
+}
+carrier_id {
+  canonical_id: 1603
+  carrier_name: "Econet Ezin-cel"
+  carrier_attribute {
+    mccmnc_tuple: "65102"
+  }
+}
+carrier_id {
+  canonical_id: 1604
+  carrier_name: "MTEL d.o.o. Podgorica"
+  carrier_attribute {
+    mccmnc_tuple: "29703"
+  }
+}
+carrier_id {
+  canonical_id: 1605
+  carrier_name: "Airtel Madagascar"
+  carrier_attribute {
+    mccmnc_tuple: "64601"
+  }
+}
+carrier_id {
+  canonical_id: 1606
+  carrier_name: "Orange Madagascar"
+  carrier_attribute {
+    mccmnc_tuple: "64602"
+  }
+}
+carrier_id {
+  canonical_id: 1607
+  carrier_name: "Telecom Malagasy Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "64604"
+  }
+}
+carrier_id {
+  canonical_id: 1608
+  carrier_name: "Cosmofon"
+  carrier_attribute {
+    mccmnc_tuple: "29402"
+  }
+}
+carrier_id {
+  canonical_id: 1609
+  carrier_name: "Nov Operator"
+  carrier_attribute {
+    mccmnc_tuple: "29403"
+  }
+}
+carrier_id {
+  canonical_id: 1610
+  carrier_name: "Malitel"
+  carrier_attribute {
+    mccmnc_tuple: "61001"
+  }
+}
+carrier_id {
+  canonical_id: 1611
+  carrier_name: "Myanmar Post and Telecommunication"
+  carrier_attribute {
+    mccmnc_tuple: "41401"
+  }
+}
+carrier_id {
+  canonical_id: 1612
+  carrier_name: "Mobicom"
+  carrier_attribute {
+    mccmnc_tuple: "42899"
+  }
+}
+carrier_id {
+  canonical_id: 1613
+  carrier_name: "Smartone Mobile Communications (Macao) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "45500"
+  }
+}
+carrier_id {
+  canonical_id: 1614
+  carrier_name: "CTM"
+  carrier_attribute {
+    mccmnc_tuple: "45501"
+    mccmnc_tuple: "45504"
+  }
+}
+carrier_id {
+  canonical_id: 1615
+  carrier_name: "Hutchison Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "45503"
+  }
+}
+carrier_id {
+  canonical_id: 1616
+  carrier_name: "Mattel S.A."
+  carrier_attribute {
+    mccmnc_tuple: "60901"
+  }
+}
+carrier_id {
+  canonical_id: 1617
+  carrier_name: "Chinguitel S.A."
+  carrier_attribute {
+    mccmnc_tuple: "60902"
+  }
+}
+carrier_id {
+  canonical_id: 1618
+  carrier_name: "Mauritel Mobiles"
+  carrier_attribute {
+    mccmnc_tuple: "60910"
+  }
+}
+carrier_id {
+  canonical_id: 1619
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "27801"
+    spn: "vodafone MT"
+  }
+}
+carrier_id {
+  canonical_id: 1620
+  carrier_name: "go mobile"
+  carrier_attribute {
+    mccmnc_tuple: "27821"
+  }
+}
+carrier_id {
+  canonical_id: 1621
+  carrier_name: "Orange Mauritius"
+  carrier_attribute {
+    mccmnc_tuple: "61701"
+  }
+}
+carrier_id {
+  canonical_id: 1622
+  carrier_name: "Mahanagar Telephone (Mauritius) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "61702"
+  }
+}
+carrier_id {
+  canonical_id: 1623
+  carrier_name: "Emtel"
+  carrier_attribute {
+    mccmnc_tuple: "61710"
+  }
+}
+carrier_id {
+  canonical_id: 1624
+  carrier_name: "DhiMobile"
+  carrier_attribute {
+    mccmnc_tuple: "47201"
+  }
+}
+carrier_id {
+  canonical_id: 1625
+  carrier_name: "Telekom Network Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "65001"
+  }
+}
+carrier_id {
+  canonical_id: 1626
+  carrier_name: "Airtel Malawi"
+  carrier_attribute {
+    mccmnc_tuple: "65010"
+  }
+}
+carrier_id {
+  canonical_id: 1627
+  carrier_name: "Art900"
+  carrier_attribute {
+    mccmnc_tuple: "50200"
+  }
+}
+carrier_id {
+  canonical_id: 1628
+  carrier_name: "Maxis/Hotlink"
+  carrier_attribute {
+    mccmnc_tuple: "50212"
+  }
+}
+carrier_id {
+  canonical_id: 1630
+  carrier_name: "Digi"
+  carrier_attribute {
+    mccmnc_tuple: "50210"
+    mccmnc_tuple: "502143"
+    mccmnc_tuple: "502146"
+    mccmnc_tuple: "50216"
+  }
+}
+carrier_id {
+  canonical_id: 1631
+  carrier_name: "TimeCel"
+  carrier_attribute {
+    mccmnc_tuple: "50217"
+  }
+}
+carrier_id {
+  canonical_id: 1632
+  carrier_name: "U Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "50218"
+  }
+}
+carrier_id {
+  canonical_id: 1633
+  carrier_name: "Celcom"
+  carrier_attribute {
+    mccmnc_tuple: "50213"
+    mccmnc_tuple: "50219"
+  }
+}
+carrier_id {
+  canonical_id: 1634
+  carrier_name: "T.D.M. GSM"
+  carrier_attribute {
+    mccmnc_tuple: "64301"
+  }
+}
+carrier_id {
+  canonical_id: 1635
+  carrier_name: "Vodacom"
+  carrier_attribute {
+    mccmnc_tuple: "64304"
+    spn: "Vodacom"
+  }
+}
+carrier_id {
+  canonical_id: 1636
+  carrier_name: "Sahel.Com"
+  carrier_attribute {
+    mccmnc_tuple: "61401"
+  }
+}
+carrier_id {
+  canonical_id: 1637
+  carrier_name: "Telecel"
+  carrier_attribute {
+    mccmnc_tuple: "61403"
+  }
+}
+carrier_id {
+  canonical_id: 1638
+  carrier_name: "Airtel Nigeria"
+  carrier_attribute {
+    mccmnc_tuple: "62120"
+  }
+}
+carrier_id {
+  canonical_id: 1639
+  carrier_name: "MTN Nigeria Communications"
+  carrier_attribute {
+    mccmnc_tuple: "62130"
+  }
+}
+carrier_id {
+  canonical_id: 1640
+  carrier_name: "Nigeria Telecommunications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "62140"
+  }
+}
+carrier_id {
+  canonical_id: 1641
+  carrier_name: "Claro NI"
+  carrier_attribute {
+    mccmnc_tuple: "71021"
+  }
+}
+carrier_id {
+  canonical_id: 1642
+  carrier_name: "Servicios de Comunicaciones, S.A. (SERCOM)"
+  carrier_attribute {
+    mccmnc_tuple: "71073"
+    mccmnc_tuple: "710730"
+  }
+}
+carrier_id {
+  canonical_id: 1644
+  carrier_name: "KPN Mobiel"
+  carrier_attribute {
+    mccmnc_tuple: "20408"
+    mccmnc_tuple: "20412"
+  }
+}
+carrier_id {
+  canonical_id: 1646
+  carrier_name: "NS Railinfrabeheer B.V."
+  carrier_attribute {
+    mccmnc_tuple: "20421"
+  }
+}
+carrier_id {
+  canonical_id: 1647
+  carrier_name: "Claro PE"
+  carrier_attribute {
+    mccmnc_tuple: "71610"
+  }
+}
+carrier_id {
+  canonical_id: 1648
+  carrier_name: "Tikiphone"
+  carrier_attribute {
+    mccmnc_tuple: "54720"
+  }
+}
+carrier_id {
+  canonical_id: 1649
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "53701"
+    mccmnc_tuple: "53702"
+  }
+}
+carrier_id {
+  canonical_id: 1651
+  carrier_name: "Digicel Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "53703"
+  }
+}
+carrier_id {
+  canonical_id: 1652
+  carrier_name: "Islacom"
+  carrier_attribute {
+    mccmnc_tuple: "51501"
+  }
+}
+carrier_id {
+  canonical_id: 1653
+  carrier_name: "Globe Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "51502"
+  }
+}
+carrier_id {
+  canonical_id: 1654
+  carrier_name: "Smart Communications"
+  carrier_attribute {
+    mccmnc_tuple: "51503"
+  }
+}
+carrier_id {
+  canonical_id: 1655
+  carrier_name: "Smart"
+  carrier_attribute {
+    mccmnc_tuple: "51503"
+    imsi_prefix_xpattern: "5150363"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "51505"
+  }
+}
+carrier_id {
+  canonical_id: 1656
+  carrier_name: "Jazz"
+  carrier_attribute {
+    mccmnc_tuple: "41001"
+    mccmnc_tuple: "41007"
+  }
+}
+carrier_id {
+  canonical_id: 1657
+  carrier_name: "PAK Telecom Mobile Ltd. (UFONE)"
+  carrier_attribute {
+    mccmnc_tuple: "41003"
+  }
+}
+carrier_id {
+  canonical_id: 1658
+  carrier_name: "Plus"
+  carrier_attribute {
+    mccmnc_tuple: "26001"
+  }
+}
+carrier_id {
+  canonical_id: 1659
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "26003"
+  }
+}
+carrier_id {
+  canonical_id: 1660
+  carrier_name: "Tele2 Polska (Tele2 Polska Sp. Z.o.o.)"
+  carrier_attribute {
+    mccmnc_tuple: "26004"
+  }
+}
+carrier_id {
+  canonical_id: 1661
+  carrier_name: "IDEA (UMTS)/PTK Centertel sp. Z.o.o."
+  carrier_attribute {
+    mccmnc_tuple: "26005"
+  }
+}
+carrier_id {
+  canonical_id: 1662
+  carrier_name: "PLAY"
+  carrier_attribute {
+    mccmnc_tuple: "26006"
+  }
+}
+carrier_id {
+  canonical_id: 1663
+  carrier_name: "Premium internet"
+  carrier_attribute {
+    mccmnc_tuple: "26007"
+  }
+}
+carrier_id {
+  canonical_id: 1664
+  carrier_name: "E-Telko"
+  carrier_attribute {
+    mccmnc_tuple: "26008"
+  }
+}
+carrier_id {
+  canonical_id: 1665
+  carrier_name: "Telekomunikacja Kolejowa (GSM-R)"
+  carrier_attribute {
+    mccmnc_tuple: "26009"
+  }
+}
+carrier_id {
+  canonical_id: 1666
+  carrier_name: "Telefony Opalenickie"
+  carrier_attribute {
+    mccmnc_tuple: "26010"
+  }
+}
+carrier_id {
+  canonical_id: 1667
+  carrier_name: "St. Pierre-et-Miquelon Télécom"
+  carrier_attribute {
+    mccmnc_tuple: "30801"
+  }
+}
+carrier_id {
+  canonical_id: 1668
+  carrier_name: "NOS"
+  carrier_attribute {
+    mccmnc_tuple: "26803"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "26897"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "26898"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "26899"
+  }
+}
+carrier_id {
+  canonical_id: 1669
+  carrier_name: "Oniway - Inforcomunicaçôes, S.A."
+  carrier_attribute {
+    mccmnc_tuple: "26805"
+  }
+}
+carrier_id {
+  canonical_id: 1670
+  carrier_name: "MEO"
+  carrier_attribute {
+    mccmnc_tuple: "26802"
+    mccmnc_tuple: "26806"
+    mccmnc_tuple: "26880"
+  }
+}
+carrier_id {
+  canonical_id: 1671
+  carrier_name: "Palau National Communications Corp. (a.k.a. PNCC)"
+  carrier_attribute {
+    mccmnc_tuple: "55201"
+  }
+}
+carrier_id {
+  canonical_id: 1672
+  carrier_name: "Hola Paraguay S.A."
+  carrier_attribute {
+    mccmnc_tuple: "74401"
+    mccmnc_tuple: "74406"
+  }
+}
+carrier_id {
+  canonical_id: 1673
+  carrier_name: "Claro PY"
+  carrier_attribute {
+    mccmnc_tuple: "74402"
+  }
+}
+carrier_id {
+  canonical_id: 1674
+  carrier_name: "Compañia Privada de Comunicaciones S.A."
+  carrier_attribute {
+    mccmnc_tuple: "74403"
+  }
+}
+carrier_id {
+  canonical_id: 1675
+  carrier_name: "Ooredoo"
+  carrier_attribute {
+    mccmnc_tuple: "42701"
+  }
+}
+carrier_id {
+  canonical_id: 1676
+  carrier_name: "Orange La Réunion"
+  carrier_attribute {
+    mccmnc_tuple: "64700"
+  }
+}
+carrier_id {
+  canonical_id: 1677
+  carrier_name: "Telco OI"
+  carrier_attribute {
+    mccmnc_tuple: "64702"
+  }
+}
+carrier_id {
+  canonical_id: 1678
+  carrier_name: "МТС"
+  carrier_attribute {
+    mccmnc_tuple: "25001"
+  }
+}
+carrier_id {
+  canonical_id: 1679
+  carrier_name: "Printelefone"
+  carrier_attribute {
+    mccmnc_tuple: "25092"
+  }
+}
+carrier_id {
+  canonical_id: 1680
+  carrier_name: "Telecom XXI"
+  carrier_attribute {
+    mccmnc_tuple: "25093"
+  }
+}
+carrier_id {
+  canonical_id: 1681
+  carrier_name: "Билайн"
+  carrier_attribute {
+    mccmnc_tuple: "25099"
+  }
+}
+carrier_id {
+  canonical_id: 1682
+  carrier_name: "MTN Rwandacell"
+  carrier_attribute {
+    mccmnc_tuple: "63510"
+  }
+}
+carrier_id {
+  canonical_id: 1683
+  carrier_name: "STC"
+  carrier_attribute {
+    mccmnc_tuple: "42001"
+  }
+}
+carrier_id {
+  canonical_id: 1684
+  carrier_name: "Mobily"
+  carrier_attribute {
+    mccmnc_tuple: "42003"
+  }
+}
+carrier_id {
+  canonical_id: 1685
+  carrier_name: "Cable & Wireless (Seychelles) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "63301"
+  }
+}
+carrier_id {
+  canonical_id: 1686
+  carrier_name: "Mediatech International Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "63302"
+  }
+}
+carrier_id {
+  canonical_id: 1687
+  carrier_name: "Airtel Seychelles"
+  carrier_attribute {
+    mccmnc_tuple: "63310"
+  }
+}
+carrier_id {
+  canonical_id: 1688
+  carrier_name: "SD Mobitel"
+  carrier_attribute {
+    mccmnc_tuple: "63401"
+  }
+}
+carrier_id {
+  canonical_id: 1689
+  carrier_name: "Areeba-Sudan"
+  carrier_attribute {
+    mccmnc_tuple: "63402"
+  }
+}
+carrier_id {
+  canonical_id: 1690
+  carrier_name: "Telia Sverige AB"
+  carrier_attribute {
+    mccmnc_tuple: "24001"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "24005"
+    spn: "Telia"
+  }
+}
+carrier_id {
+  canonical_id: 1691
+  carrier_name: "3 (Hi3G Access AB)"
+  carrier_attribute {
+    mccmnc_tuple: "24002"
+  }
+}
+carrier_id {
+  canonical_id: 1692
+  carrier_name: "Nordisk Mobiltelefon AS"
+  carrier_attribute {
+    mccmnc_tuple: "24003"
+  }
+}
+carrier_id {
+  canonical_id: 1693
+  carrier_name: "3G Infrastructure Services AB"
+  carrier_attribute {
+    mccmnc_tuple: "24004"
+  }
+}
+carrier_id {
+  canonical_id: 1694
+  carrier_name: "Svenska UMTS-Nät AB"
+  carrier_attribute {
+    mccmnc_tuple: "24005"
+  }
+}
+carrier_id {
+  canonical_id: 1695
+  carrier_name: "Telenor Sverige AB"
+  carrier_attribute {
+    mccmnc_tuple: "24008"
+  }
+}
+carrier_id {
+  canonical_id: 1696
+  carrier_name: "Tele2/Comviq Sverige/Com Hem"
+  carrier_attribute {
+    mccmnc_tuple: "24007"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "24024"
+    spn: "Tele2"
+  }
+}
+carrier_id {
+  canonical_id: 1697
+  carrier_name: "Spring Mobil AB"
+  carrier_attribute {
+    mccmnc_tuple: "24010"
+  }
+}
+carrier_id {
+  canonical_id: 1698
+  carrier_name: "Linholmen Science Park AB"
+  carrier_attribute {
+    mccmnc_tuple: "24011"
+  }
+}
+carrier_id {
+  canonical_id: 1699
+  carrier_name: "Barablu Mobile Scandinavia Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "24012"
+  }
+}
+carrier_id {
+  canonical_id: 1700
+  carrier_name: "Ventelo Sverige AB"
+  carrier_attribute {
+    mccmnc_tuple: "24013"
+  }
+}
+carrier_id {
+  canonical_id: 1701
+  carrier_name: "TDC Mobil A/S"
+  carrier_attribute {
+    mccmnc_tuple: "24014"
+  }
+}
+carrier_id {
+  canonical_id: 1702
+  carrier_name: "Wireless Maingate Nordic AB"
+  carrier_attribute {
+    mccmnc_tuple: "24015"
+  }
+}
+carrier_id {
+  canonical_id: 1703
+  carrier_name: "42IT AB"
+  carrier_attribute {
+    mccmnc_tuple: "24016"
+  }
+}
+carrier_id {
+  canonical_id: 1704
+  carrier_name: "Wireless Maingate Message Services AB"
+  carrier_attribute {
+    mccmnc_tuple: "24020"
+  }
+}
+carrier_id {
+  canonical_id: 1705
+  carrier_name: "Banverket"
+  carrier_attribute {
+    mccmnc_tuple: "24021"
+  }
+}
+carrier_id {
+  canonical_id: 1706
+  carrier_name: "M1"
+  carrier_attribute {
+    mccmnc_tuple: "52503"
+  }
+}
+carrier_id {
+  canonical_id: 1707
+  carrier_name: "StarHub"
+  carrier_attribute {
+    mccmnc_tuple: "52505"
+  }
+}
+carrier_id {
+  canonical_id: 1708
+  carrier_name: "Digital Trunked Radio Network"
+  carrier_attribute {
+    mccmnc_tuple: "52512"
+  }
+}
+carrier_id {
+  canonical_id: 1709
+  carrier_name: "SI Mobil"
+  carrier_attribute {
+    mccmnc_tuple: "29340"
+  }
+}
+carrier_id {
+  canonical_id: 1710
+  carrier_name: "Telekom Slovenije"
+  carrier_attribute {
+    mccmnc_tuple: "29341"
+  }
+}
+carrier_id {
+  canonical_id: 1711
+  carrier_name: "T-2 d.o.o."
+  carrier_attribute {
+    mccmnc_tuple: "29364"
+  }
+}
+carrier_id {
+  canonical_id: 1712
+  carrier_name: "Tusmobil d.o.o."
+  carrier_attribute {
+    mccmnc_tuple: "29370"
+  }
+}
+carrier_id {
+  canonical_id: 1713
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "23101"
+    spn: "Orange"
+  }
+}
+carrier_id {
+  canonical_id: 1714
+  carrier_name: "Eurotel, UMTS"
+  carrier_attribute {
+    mccmnc_tuple: "23104"
+  }
+}
+carrier_id {
+  canonical_id: 1715
+  carrier_name: "Orange, UMTS"
+  carrier_attribute {
+    mccmnc_tuple: "23105"
+  }
+}
+carrier_id {
+  canonical_id: 1716
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "61901"
+  }
+}
+carrier_id {
+  canonical_id: 1717
+  carrier_name: "Millicom"
+  carrier_attribute {
+    mccmnc_tuple: "61902"
+  }
+}
+carrier_id {
+  canonical_id: 1718
+  carrier_name: "Africell"
+  carrier_attribute {
+    mccmnc_tuple: "61903"
+  }
+}
+carrier_id {
+  canonical_id: 1719
+  carrier_name: "Dtatel (SL) Ltd CDMA"
+  carrier_attribute {
+    mccmnc_tuple: "61950"
+  }
+}
+carrier_id {
+  canonical_id: 1720
+  carrier_name: "SMT - San  Marino Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "29201"
+  }
+}
+carrier_id {
+  canonical_id: 1721
+  carrier_name: "Orange Senegal"
+  carrier_attribute {
+    mccmnc_tuple: "60801"
+  }
+}
+carrier_id {
+  canonical_id: 1722
+  carrier_name: "Sentel GSM"
+  carrier_attribute {
+    mccmnc_tuple: "60802"
+  }
+}
+carrier_id {
+  canonical_id: 1723
+  carrier_name: "ACT Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "52015"
+  }
+}
+carrier_id {
+  canonical_id: 1724
+  carrier_name: "JC Somoncom"
+  carrier_attribute {
+    mccmnc_tuple: "43601"
+  }
+}
+carrier_id {
+  canonical_id: 1725
+  carrier_name: "CJSC Indigo Tajikistan"
+  carrier_attribute {
+    mccmnc_tuple: "43602"
+  }
+}
+carrier_id {
+  canonical_id: 1726
+  carrier_name: "TT mobile"
+  carrier_attribute {
+    mccmnc_tuple: "43603"
+  }
+}
+carrier_id {
+  canonical_id: 1727
+  carrier_name: "Josa Babilon-T"
+  carrier_attribute {
+    mccmnc_tuple: "43604"
+  }
+}
+carrier_id {
+  canonical_id: 1728
+  carrier_name: "CTJTHSC Tajik-tel"
+  carrier_attribute {
+    mccmnc_tuple: "43605"
+  }
+}
+carrier_id {
+  canonical_id: 1729
+  carrier_name: "Barash Communication Technologies (BCTI)"
+  carrier_attribute {
+    mccmnc_tuple: "43801"
+  }
+}
+carrier_id {
+  canonical_id: 1730
+  carrier_name: "TM-Cell"
+  carrier_attribute {
+    mccmnc_tuple: "43802"
+  }
+}
+carrier_id {
+  canonical_id: 1731
+  carrier_name: "Tunisie Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "60502"
+  }
+}
+carrier_id {
+  canonical_id: 1732
+  carrier_name: "Ooredoo Tunisia"
+  carrier_attribute {
+    mccmnc_tuple: "60503"
+  }
+}
+carrier_id {
+  canonical_id: 1733
+  carrier_name: "Tonga Communications Corporation"
+  carrier_attribute {
+    mccmnc_tuple: "53901"
+  }
+}
+carrier_id {
+  canonical_id: 1734
+  carrier_name: "Shoreline Communication"
+  carrier_attribute {
+    mccmnc_tuple: "53943"
+  }
+}
+carrier_id {
+  canonical_id: 1735
+  carrier_name: "Paycell | Turkcell"
+  carrier_attribute {
+    mccmnc_tuple: "28601"
+  }
+}
+carrier_id {
+  canonical_id: 1736
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "28602"
+  }
+}
+carrier_id {
+  canonical_id: 1737
+  carrier_name: "Türk Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "28603"
+    mccmnc_tuple: "28604"
+  }
+}
+carrier_id {
+  canonical_id: 1739
+  carrier_name: "TSTT Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "37412"
+    mccmnc_tuple: "374122"
+    mccmnc_tuple: "374123"
+    mccmnc_tuple: "374124"
+    mccmnc_tuple: "374125"
+    mccmnc_tuple: "374126"
+    mccmnc_tuple: "374127"
+    mccmnc_tuple: "374128"
+    mccmnc_tuple: "374129"
+  }
+}
+carrier_id {
+  canonical_id: 1740
+  carrier_name: "Digicel Trinidad and Tobago Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "374130"
+    mccmnc_tuple: "37413"
+  }
+}
+carrier_id {
+  canonical_id: 1741
+  carrier_name: "LaqTel Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "374140"
+  }
+}
+carrier_id {
+  canonical_id: 1742
+  carrier_name: "TIGO"
+  carrier_attribute {
+    mccmnc_tuple: "64002"
+  }
+}
+carrier_id {
+  canonical_id: 1743
+  carrier_name: "Zantel"
+  carrier_attribute {
+    mccmnc_tuple: "64003"
+  }
+}
+carrier_id {
+  canonical_id: 1744
+  carrier_name: "Vodacom (T) Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "64004"
+    spn: "VodaCom Tanzania"
+  }
+}
+carrier_id {
+  canonical_id: 1745
+  carrier_name: "Airtel"
+  carrier_attribute {
+    mccmnc_tuple: "64005"
+  }
+}
+carrier_id {
+  canonical_id: 1746
+  carrier_name: "Ukrainian Mobile Communication, UMC"
+  carrier_attribute {
+    mccmnc_tuple: "25501"
+  }
+}
+carrier_id {
+  canonical_id: 1747
+  carrier_name: "Kyivstar GSM"
+  carrier_attribute {
+    mccmnc_tuple: "25503"
+  }
+}
+carrier_id {
+  canonical_id: 1748
+  carrier_name: "International Telecommunications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "25504"
+  }
+}
+carrier_id {
+  canonical_id: 1749
+  carrier_name: "Golden Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "25505"
+  }
+}
+carrier_id {
+  canonical_id: 1750
+  carrier_name: "Astelit"
+  carrier_attribute {
+    mccmnc_tuple: "25506"
+  }
+}
+carrier_id {
+  canonical_id: 1751
+  carrier_name: "Ukrtelecom"
+  carrier_attribute {
+    mccmnc_tuple: "25507"
+  }
+}
+carrier_id {
+  canonical_id: 1752
+  carrier_name: "CJSC - Telesystems of Ukraine"
+  carrier_attribute {
+    mccmnc_tuple: "25521"
+  }
+}
+carrier_id {
+  canonical_id: 1753
+  carrier_name: "Airtel Uganda"
+  carrier_attribute {
+    mccmnc_tuple: "64101"
+    mccmnc_tuple: "64122"
+  }
+}
+carrier_id {
+  canonical_id: 1754
+  carrier_name: "MTN Uganda Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "64110"
+  }
+}
+carrier_id {
+  canonical_id: 1755
+  carrier_name: "Uganda Telecom Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "64111"
+  }
+}
+carrier_id {
+  canonical_id: 1756
+  carrier_name: "House of Integrated Technology and Systems Uganda Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "64114"
+  }
+}
+carrier_id {
+  canonical_id: 1758
+  carrier_name: "ICO Global Communications"
+  carrier_attribute {
+    mccmnc_tuple: "90101"
+  }
+}
+carrier_id {
+  canonical_id: 1759
+  carrier_name: "Sense Communications International AS"
+  carrier_attribute {
+    mccmnc_tuple: "90102"
+  }
+}
+carrier_id {
+  canonical_id: 1760
+  carrier_name: "Ellipso"
+  carrier_attribute {
+    mccmnc_tuple: "90107"
+  }
+}
+carrier_id {
+  canonical_id: 1761
+  carrier_name: "Tele1 Europe"
+  carrier_attribute {
+    mccmnc_tuple: "90109"
+  }
+}
+carrier_id {
+  canonical_id: 1762
+  carrier_name: "Asia Cellular Satellite (AceS)"
+  carrier_attribute {
+    mccmnc_tuple: "90110"
+  }
+}
+carrier_id {
+  canonical_id: 1763
+  carrier_name: "Inmarsat Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "90111"
+  }
+}
+carrier_id {
+  canonical_id: 1764
+  carrier_name: "Maritime Communications Partner AS (MCP network)"
+  carrier_attribute {
+    mccmnc_tuple: "90112"
+  }
+}
+carrier_id {
+  canonical_id: 1765
+  carrier_name: "Global Networks, Inc."
+  carrier_attribute {
+    mccmnc_tuple: "90113"
+  }
+}
+carrier_id {
+  canonical_id: 1766
+  carrier_name: "Telenor GSM - services in aircraft"
+  carrier_attribute {
+    mccmnc_tuple: "90114"
+  }
+}
+carrier_id {
+  canonical_id: 1767
+  carrier_name: "SITA GSM services in aircraft (On Air)"
+  carrier_attribute {
+    mccmnc_tuple: "90115"
+  }
+}
+carrier_id {
+  canonical_id: 1768
+  carrier_name: "Jasper Systems, Inc."
+  carrier_attribute {
+    mccmnc_tuple: "90116"
+  }
+}
+carrier_id {
+  canonical_id: 1769
+  carrier_name: "Jersey Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "90117"
+  }
+}
+carrier_id {
+  canonical_id: 1770
+  carrier_name: "AT&T Mobility (Wireless Maritime Services)"
+  carrier_attribute {
+    mccmnc_tuple: "90118"
+  }
+}
+carrier_id {
+  canonical_id: 1771
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "90119"
+  }
+}
+carrier_id {
+  canonical_id: 1772
+  carrier_name: "Intermatica"
+  carrier_attribute {
+    mccmnc_tuple: "90120"
+  }
+}
+carrier_id {
+  canonical_id: 1773
+  carrier_name: "Seanet Maritime Communications"
+  carrier_attribute {
+    mccmnc_tuple: "90121"
+  }
+}
+carrier_id {
+  canonical_id: 1774
+  carrier_name: "Denver Consultants Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "90122"
+  }
+}
+carrier_id {
+  canonical_id: 1775
+  carrier_name: "Telecommunications for Disaster Relief (TDR) (OCHA)"
+  carrier_attribute {
+    mccmnc_tuple: "90188"
+  }
+}
+carrier_id {
+  canonical_id: 1776
+  carrier_name: "MCI"
+  carrier_attribute {
+    mccmnc_tuple: "310010"
+  }
+}
+carrier_id {
+  canonical_id: 1778
+  carrier_name: "Mobile Tel Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310013"
+  }
+}
+carrier_id {
+  canonical_id: 1779
+  carrier_name: "Cricket Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310150"
+  }
+}
+carrier_id {
+  canonical_id: 1780
+  carrier_name: "North Sight Communications Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310017"
+  }
+}
+carrier_id {
+  canonical_id: 1781
+  carrier_name: "Union Telephone Company"
+  carrier_attribute {
+    mccmnc_tuple: "310020"
+  }
+}
+carrier_id {
+  canonical_id: 1783
+  carrier_name: "Nevada Wireless LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310034"
+  }
+}
+carrier_id {
+  canonical_id: 1784
+  carrier_name: "MTA Communications dba MTA Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310040"
+  }
+}
+carrier_id {
+  canonical_id: 1785
+  carrier_name: "ACS Wireless Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310050"
+  }
+}
+carrier_id {
+  canonical_id: 1787
+  carrier_name: "Pacific Telecom Inc"
+  carrier_attribute {
+    mccmnc_tuple: "310110"
+  }
+}
+carrier_id {
+  canonical_id: 1788
+  carrier_name: "Sprint"
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    mccmnc_tuple: "312530"
+  }
+}
+carrier_id {
+  canonical_id: 1789
+  carrier_name: "Carolina West Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310130"
+  }
+}
+carrier_id {
+  canonical_id: 1790
+  carrier_name: "GTA Wireless LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310140"
+  }
+}
+carrier_id {
+  canonical_id: 1792
+  carrier_name: "West Central Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310180"
+  }
+}
+carrier_id {
+  canonical_id: 1793
+  carrier_name: "Alaska Wireless Communications LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310190"
+  }
+}
+carrier_id {
+  canonical_id: 1795
+  carrier_name: "Nep Cellcorp Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310290"
+  }
+}
+carrier_id {
+  canonical_id: 1796
+  carrier_name: "Smith Bagley Inc, dba Cellular One"
+  carrier_attribute {
+    mccmnc_tuple: "310320"
+  }
+}
+carrier_id {
+  canonical_id: 1797
+  carrier_name: "AN Subsidiary LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310330"
+  }
+}
+carrier_id {
+  canonical_id: 1798
+  carrier_name: "Wireless Solutions International"
+  carrier_attribute {
+    mccmnc_tuple: "310550"
+  }
+}
+carrier_id {
+  canonical_id: 1800
+  carrier_name: "MTPCS LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310570"
+  }
+}
+carrier_id {
+  canonical_id: 1802
+  carrier_name: "cellcom"
+  carrier_attribute {
+    mccmnc_tuple: "310600"
+    gid1: "BA00040000000000"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "311480"
+    gid1: "BA00040000000000"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "311850"
+    gid1: "BA00040000000000"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "311840"
+    gid1: "c1000000"
+  }
+}
+carrier_id {
+  canonical_id: 1803
+  carrier_name: "Elkhart Telephone Co. Inc. dba Epic Touch Co."
+  carrier_attribute {
+    mccmnc_tuple: "310610"
+  }
+}
+carrier_id {
+  canonical_id: 1804
+  carrier_name: "Coleman County Telecommunications Inc. (Trans Texas PCS)"
+  carrier_attribute {
+    mccmnc_tuple: "310620"
+  }
+}
+carrier_id {
+  canonical_id: 1806
+  carrier_name: "Jasper Wireless Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310650"
+  }
+}
+carrier_id {
+  canonical_id: 1807
+  carrier_name: "AT&T Mobility Vanguard Services"
+  carrier_attribute {
+    mccmnc_tuple: "310670"
+  }
+}
+carrier_id {
+  canonical_id: 1808
+  carrier_name: "Limitless Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "310690"
+  }
+}
+carrier_id {
+  canonical_id: 1809
+  carrier_name: "Cross Valiant Cellular Partnership"
+  carrier_attribute {
+    mccmnc_tuple: "310700"
+  }
+}
+carrier_id {
+  canonical_id: 1810
+  carrier_name: "Arctic Slopo Telephone Association Cooperative"
+  carrier_attribute {
+    mccmnc_tuple: "310710"
+  }
+}
+carrier_id {
+  canonical_id: 1811
+  carrier_name: "Wireless Solutions International Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310720"
+  }
+}
+carrier_id {
+  canonical_id: 1812
+  carrier_name: "Sea Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "310730"
+  }
+}
+carrier_id {
+  canonical_id: 1813
+  carrier_name: "East Kentucky Network LLC dba Appalachian Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310750"
+  }
+}
+carrier_id {
+  canonical_id: 1814
+  carrier_name: "Panhandle Telecommunications Systems Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310760"
+  }
+}
+carrier_id {
+  canonical_id: 1815
+  carrier_name: "Iowa Wireless Services LLC dba I Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310770"
+  }
+}
+carrier_id {
+  canonical_id: 1816
+  carrier_name: "Connect Net Inc"
+  carrier_attribute {
+    mccmnc_tuple: "310780"
+  }
+}
+carrier_id {
+  canonical_id: 1817
+  carrier_name: "PinPoint Communications Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310790"
+  }
+}
+carrier_id {
+  canonical_id: 1818
+  carrier_name: "Brazos Cellular Communications Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "310810"
+  }
+}
+carrier_id {
+  canonical_id: 1819
+  carrier_name: "South Canaan Cellular Communications Co. LP"
+  carrier_attribute {
+    mccmnc_tuple: "310820"
+  }
+}
+carrier_id {
+  canonical_id: 1820
+  carrier_name: "Caprock Cellular Ltd. Partnership"
+  carrier_attribute {
+    mccmnc_tuple: "310830"
+  }
+}
+carrier_id {
+  canonical_id: 1821
+  carrier_name: "Edge Mobile LLC"
+  carrier_attribute {
+    mccmnc_tuple: "310840"
+  }
+}
+carrier_id {
+  canonical_id: 1822
+  carrier_name: "Aeris Communications, Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310850"
+  }
+}
+carrier_id {
+  canonical_id: 1823
+  carrier_name: "TX RSA 15B2, LP dba Five Star Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310860"
+  }
+}
+carrier_id {
+  canonical_id: 1824
+  carrier_name: "Kaplan Telephone Company Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310870"
+  }
+}
+carrier_id {
+  canonical_id: 1825
+  carrier_name: "Advantage Cellular Systems, Inc."
+  carrier_attribute {
+    mccmnc_tuple: "310880"
+  }
+}
+carrier_id {
+  canonical_id: 1827
+  carrier_name: "Mid-Rivers"
+  carrier_attribute {
+    mccmnc_tuple: "310900"
+  }
+}
+carrier_id {
+  canonical_id: 1828
+  carrier_name: "Southern IL RSA Partnership dba First Cellular of Southern Illinois"
+  carrier_attribute {
+    mccmnc_tuple: "310910"
+  }
+}
+carrier_id {
+  canonical_id: 1829
+  carrier_name: "James Valley"
+  carrier_attribute {
+    mccmnc_tuple: "310920"
+  }
+}
+carrier_id {
+  canonical_id: 1830
+  carrier_name: "Copper Valley Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310930"
+    mccmnc_tuple: "312380"
+  }
+}
+carrier_id {
+  canonical_id: 1831
+  carrier_name: "PetroCom LLC"
+  carrier_attribute {
+    mccmnc_tuple: "311170"
+  }
+}
+carrier_id {
+  canonical_id: 1833
+  carrier_name: "Cellular Properties Inc."
+  carrier_attribute {
+    mccmnc_tuple: "311190"
+  }
+}
+carrier_id {
+  canonical_id: 1834
+  carrier_name: "ARINC"
+  carrier_attribute {
+    mccmnc_tuple: "311200"
+  }
+}
+carrier_id {
+  canonical_id: 1835
+  carrier_name: "Farmers Cellular Telephone"
+  carrier_attribute {
+    mccmnc_tuple: "311210"
+  }
+}
+carrier_id {
+  canonical_id: 1836
+  carrier_name: "C Spire"
+  carrier_attribute {
+    mccmnc_tuple: "311230"
+    mccmnc_tuple: "310023"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20404"
+    spn: "C Spire"
+  }
+}
+carrier_id {
+  canonical_id: 1837
+  carrier_name: "Cordova Wireless Communications Inc"
+  carrier_attribute {
+    mccmnc_tuple: "311240"
+  }
+}
+carrier_id {
+  canonical_id: 1838
+  carrier_name: "SLO Cellular Inc. dba CellularOne of San Luis Obispo"
+  carrier_attribute {
+    mccmnc_tuple: "311260"
+  }
+}
+carrier_id {
+  canonical_id: 1839
+  carrier_name: "Verizon Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "20404"
+    gid1: "BAE0000000000000"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310012"
+    mccmnc_tuple: "310590"
+    mccmnc_tuple: "310591"
+    mccmnc_tuple: "310592"
+    mccmnc_tuple: "310593"
+    mccmnc_tuple: "310594"
+    mccmnc_tuple: "310595"
+    mccmnc_tuple: "310596"
+    mccmnc_tuple: "310597"
+    mccmnc_tuple: "310598"
+    mccmnc_tuple: "310599"
+    mccmnc_tuple: "310890"
+    mccmnc_tuple: "311270"
+    mccmnc_tuple: "311280"
+    mccmnc_tuple: "311281"
+    mccmnc_tuple: "311282"
+    mccmnc_tuple: "311283"
+    mccmnc_tuple: "311284"
+    mccmnc_tuple: "311285"
+    mccmnc_tuple: "311286"
+    mccmnc_tuple: "311287"
+    mccmnc_tuple: "311288"
+    mccmnc_tuple: "311289"
+    mccmnc_tuple: "311480"
+    mccmnc_tuple: "311481"
+    mccmnc_tuple: "311482"
+    mccmnc_tuple: "311483"
+    mccmnc_tuple: "311484"
+    mccmnc_tuple: "311485"
+    mccmnc_tuple: "311486"
+    mccmnc_tuple: "311487"
+    mccmnc_tuple: "311488"
+    mccmnc_tuple: "311489"
+  }
+}
+carrier_id {
+  canonical_id: 1840
+  carrier_name: "Pinpoint Wireless Inc."
+  carrier_attribute {
+    mccmnc_tuple: "311290"
+  }
+}
+carrier_id {
+  canonical_id: 1841
+  carrier_name: "Rutal Cellular Corporation"
+  carrier_attribute {
+    mccmnc_tuple: "311300"
+  }
+}
+carrier_id {
+  canonical_id: 1842
+  carrier_name: "Leaco Rural Telephone Company Inc"
+  carrier_attribute {
+    mccmnc_tuple: "311310"
+  }
+}
+carrier_id {
+  canonical_id: 1843
+  carrier_name: "GCI Communications Corp."
+  carrier_attribute {
+    mccmnc_tuple: "311370"
+  }
+}
+carrier_id {
+  canonical_id: 1844
+  carrier_name: "GreenFly LLC"
+  carrier_attribute {
+    mccmnc_tuple: "311380"
+  }
+}
+carrier_id {
+  canonical_id: 1845
+  carrier_name: "Midwest Wireless Holdings LLC"
+  carrier_attribute {
+    mccmnc_tuple: "311390"
+  }
+}
+carrier_id {
+  canonical_id: 1846
+  carrier_name: "Iowa RSA No.2 Ltd Partnership"
+  carrier_attribute {
+    mccmnc_tuple: "311410"
+  }
+}
+carrier_id {
+  canonical_id: 1847
+  carrier_name: "northwestcell"
+  carrier_attribute {
+    mccmnc_tuple: "311420"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "311480"
+    gid1: "BA00150000000000"
+  }
+}
+carrier_id {
+  canonical_id: 1848
+  carrier_name: "Chat Mobility"
+  carrier_attribute {
+    mccmnc_tuple: "311430"
+    mccmnc_tuple: "312160"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "311480"
+    gid1: "BA00130000000000"
+  }
+}
+carrier_id {
+  canonical_id: 1849
+  carrier_name: "Bluegrass Cellular LLC"
+  carrier_attribute {
+    mccmnc_tuple: "311440"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "311480"
+    gid1: "BA00010000000000"
+  }
+}
+carrier_id {
+  canonical_id: 1850
+  carrier_name: "PTCI"
+  carrier_attribute {
+    mccmnc_tuple: "311450"
+  }
+}
+carrier_id {
+  canonical_id: 1851
+  carrier_name: "Fisher Wireless Services Inc"
+  carrier_attribute {
+    mccmnc_tuple: "311460"
+  }
+}
+carrier_id {
+  canonical_id: 1852
+  carrier_name: "Vitelcom Cellular Inc dba Innovative Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "311470"
+  }
+}
+carrier_id {
+  canonical_id: 1853
+  carrier_name: "Virgin Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    mccmnc_tuple: "312530"
+    gid1: "000003"
+  }
+}
+carrier_id {
+  canonical_id: 1854
+  carrier_name: "CTC Telecom Inc"
+  carrier_attribute {
+    mccmnc_tuple: "311500"
+  }
+}
+carrier_id {
+  canonical_id: 1855
+  carrier_name: "Benton-Lian Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "311510"
+  }
+}
+carrier_id {
+  canonical_id: 1856
+  carrier_name: "Crossroads Wireless Inc"
+  carrier_attribute {
+    mccmnc_tuple: "311520"
+  }
+}
+carrier_id {
+  canonical_id: 1857
+  carrier_name: "Wireless Communications Venture"
+  carrier_attribute {
+    mccmnc_tuple: "311530"
+  }
+}
+carrier_id {
+  canonical_id: 1858
+  carrier_name: "Keystone Wireless Inc"
+  carrier_attribute {
+    mccmnc_tuple: "311540"
+  }
+}
+carrier_id {
+  canonical_id: 1859
+  carrier_name: "Commnet Midwest LLC"
+  carrier_attribute {
+    mccmnc_tuple: "311550"
+  }
+}
+carrier_id {
+  canonical_id: 1860
+  carrier_name: "Nextel Communications Inc."
+  carrier_attribute {
+    mccmnc_tuple: "316010"
+  }
+}
+carrier_id {
+  canonical_id: 1861
+  carrier_name: "Southern Communications Services Inc."
+  carrier_attribute {
+    mccmnc_tuple: "316011"
+  }
+}
+carrier_id {
+  canonical_id: 1862
+  carrier_name: "Ancel"
+  carrier_attribute {
+    mccmnc_tuple: "74800"
+    mccmnc_tuple: "74801"
+    mccmnc_tuple: "74803"
+  }
+}
+carrier_id {
+  canonical_id: 1863
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "74807"
+  }
+}
+carrier_id {
+  canonical_id: 1864
+  carrier_name: "Claro UY"
+  carrier_attribute {
+    mccmnc_tuple: "74810"
+  }
+}
+carrier_id {
+  canonical_id: 1865
+  carrier_name: "Buztel"
+  carrier_attribute {
+    mccmnc_tuple: "43401"
+  }
+}
+carrier_id {
+  canonical_id: 1866
+  carrier_name: "Uzmacom"
+  carrier_attribute {
+    mccmnc_tuple: "43402"
+  }
+}
+carrier_id {
+  canonical_id: 1867
+  carrier_name: "Daewoo Unitel"
+  carrier_attribute {
+    mccmnc_tuple: "43404"
+  }
+}
+carrier_id {
+  canonical_id: 1868
+  carrier_name: "Coscom"
+  carrier_attribute {
+    mccmnc_tuple: "43405"
+  }
+}
+carrier_id {
+  canonical_id: 1869
+  carrier_name: "Uzdunrobita"
+  carrier_attribute {
+    mccmnc_tuple: "43407"
+  }
+}
+carrier_id {
+  canonical_id: 1870
+  carrier_name: "Infonet"
+  carrier_attribute {
+    mccmnc_tuple: "73401"
+  }
+}
+carrier_id {
+  canonical_id: 1871
+  carrier_name: "Corporación Digitel"
+  carrier_attribute {
+    mccmnc_tuple: "73402"
+  }
+}
+carrier_id {
+  canonical_id: 1872
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "73403"
+  }
+}
+carrier_id {
+  canonical_id: 1873
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "73404"
+  }
+}
+carrier_id {
+  canonical_id: 1874
+  carrier_name: "Telecomunicaciones Movilnet, C.A."
+  carrier_attribute {
+    mccmnc_tuple: "73406"
+  }
+}
+carrier_id {
+  canonical_id: 1875
+  carrier_name: "Caribbean Cellular Telephone, Boatphone Ltd."
+  carrier_attribute {
+    mccmnc_tuple: "348570"
+  }
+}
+carrier_id {
+  canonical_id: 1876
+  carrier_name: "GoMobile SamoaTel Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "54927"
+  }
+}
+carrier_id {
+  canonical_id: 1877
+  carrier_name: "SabaFon"
+  carrier_attribute {
+    mccmnc_tuple: "42101"
+  }
+}
+carrier_id {
+  canonical_id: 1878
+  carrier_name: "Spacetel Yemen"
+  carrier_attribute {
+    mccmnc_tuple: "42102"
+  }
+}
+carrier_id {
+  canonical_id: 1879
+  carrier_name: "Telecel"
+  carrier_attribute {
+    mccmnc_tuple: "64803"
+  }
+}
+carrier_id {
+  canonical_id: 1880
+  carrier_name: "Econet"
+  carrier_attribute {
+    mccmnc_tuple: "64804"
+  }
+}
+carrier_id {
+  canonical_id: 1881
+  carrier_name: "遠傳電信 Far EasTone Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "46601"
+    mccmnc_tuple: "46602"
+    mccmnc_tuple: "46603"
+  }
+}
+carrier_id {
+  canonical_id: 1882
+  carrier_name: "亞太電信 Asia Pacific Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "46605"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "46601"
+    imsi_prefix_xpattern: "4660116090"
+    imsi_prefix_xpattern: "4660116091"
+  }
+}
+carrier_id {
+  canonical_id: 1883
+  carrier_name: "Tuntex Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "46606"
+  }
+}
+carrier_id {
+  canonical_id: 1884
+  carrier_name: "中華電信_Chunghwa Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "46611"
+    mccmnc_tuple: "46692"
+  }
+}
+carrier_id {
+  canonical_id: 1886
+  carrier_name: "台灣之星 T Star"
+  carrier_attribute {
+    mccmnc_tuple: "46689"
+  }
+}
+carrier_id {
+  canonical_id: 1887
+  carrier_name: "MobiTai Communications"
+  carrier_attribute {
+    mccmnc_tuple: "46693"
+  }
+}
+carrier_id {
+  canonical_id: 1888
+  carrier_name: "台灣大哥大 Taiwan Mobile Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "46697"
+  }
+}
+carrier_id {
+  canonical_id: 1889
+  carrier_name: "TransAsia Telecoms"
+  carrier_attribute {
+    mccmnc_tuple: "46699"
+  }
+}
+carrier_id {
+  canonical_id: 1890
+  carrier_name: "KT"
+  carrier_attribute {
+    mccmnc_tuple: "45002"
+    mccmnc_tuple: "45004"
+    mccmnc_tuple: "45008"
+  }
+}
+carrier_id {
+  canonical_id: 1891
+  carrier_name: "SK Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "45005"
+  }
+}
+carrier_id {
+  canonical_id: 1892
+  carrier_name: "LG U+"
+  carrier_attribute {
+    mccmnc_tuple: "45006"
+    mccmnc_tuple: "450006"
+  }
+}
+carrier_id {
+  canonical_id: 1893
+  carrier_name: "nTelos"
+  carrier_attribute {
+    mccmnc_tuple: "310470"
+  }
+}
+carrier_id {
+  canonical_id: 1894
+  carrier_name: "SoftBank"
+  carrier_attribute {
+    mccmnc_tuple: "44020"
+  }
+}
+carrier_id {
+  canonical_id: 1895
+  carrier_name: "Freedom Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "302490"
+  }
+}
+carrier_id {
+  canonical_id: 1896
+  carrier_name: "dtac"
+  carrier_attribute {
+    mccmnc_tuple: "52018"
+  }
+}
+carrier_id {
+  canonical_id: 1897
+  carrier_name: "dtac "
+  carrier_attribute {
+    mccmnc_tuple: "52005"
+  }
+}
+carrier_id {
+  canonical_id: 1898
+  carrier_name: "True Move"
+  carrier_attribute {
+    mccmnc_tuple: "52099"
+  }
+}
+carrier_id {
+  canonical_id: 1899
+  carrier_name: "Viettel Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "45204"
+  }
+}
+carrier_id {
+  canonical_id: 1900
+  carrier_name: "OneCall"
+  carrier_attribute {
+    mccmnc_tuple: "24205"
+  }
+}
+carrier_id {
+  canonical_id: 1901
+  carrier_name: "Android Emulator"
+  carrier_attribute {
+    mccmnc_tuple: "310995"
+  }
+}
+carrier_id {
+  canonical_id: 1902
+  carrier_name: "Access Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "27204"
+  }
+}
+carrier_id {
+  canonical_id: 1903
+  carrier_name: "3"
+  carrier_attribute {
+    mccmnc_tuple: "27205"
+  }
+}
+carrier_id {
+  canonical_id: 1904
+  carrier_name: "DNA"
+  carrier_attribute {
+    mccmnc_tuple: "24403"
+    mccmnc_tuple: "24412"
+    mccmnc_tuple: "24413"
+  }
+}
+carrier_id {
+  canonical_id: 1905
+  carrier_name: "Nokia Test Network"
+  carrier_attribute {
+    mccmnc_tuple: "24407"
+  }
+}
+carrier_id {
+  canonical_id: 1906
+  carrier_name: "Unknown"
+  carrier_attribute {
+    mccmnc_tuple: "24408"
+  }
+}
+carrier_id {
+  canonical_id: 1907
+  carrier_name: "TDC"
+  carrier_attribute {
+    mccmnc_tuple: "24410"
+  }
+}
+carrier_id {
+  canonical_id: 1908
+  carrier_name: "Scnl Truphone"
+  carrier_attribute {
+    mccmnc_tuple: "24429"
+  }
+}
+carrier_id {
+  canonical_id: 1909
+  carrier_name: "Euskaltel"
+  carrier_attribute {
+    mccmnc_tuple: "21406"
+    mccmnc_tuple: "21408"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+    imsi_prefix_xpattern: "2140359"
+  }
+}
+carrier_id {
+  canonical_id: 1910
+  carrier_name: "COX"
+  carrier_attribute {
+    mccmnc_tuple: "311480"
+    spn: "Cox Mobile"
+    gid1: "BA01570000000000"
+    gid2: "B100000000000000"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "311600"
+  }
+}
+carrier_id {
+  canonical_id: 1911
+  carrier_name: "Test Network, Used by GSM test equipment"
+  carrier_attribute {
+    mccmnc_tuple: "00101"
+  }
+}
+carrier_id {
+  canonical_id: 1912
+  carrier_name: "AT&T MX"
+  carrier_attribute {
+    mccmnc_tuple: "33401"
+    mccmnc_tuple: "334090"
+    mccmnc_tuple: "33409"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "22201"
+    spn: "IUSACELL"
+    spn: "UNEFON"
+  }
+}
+carrier_id {
+  canonical_id: 1913
+  carrier_name: "Telcel"
+  carrier_attribute {
+    mccmnc_tuple: "334020"
+    mccmnc_tuple: "33402"
+  }
+}
+carrier_id {
+  canonical_id: 1914
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "334030"
+    mccmnc_tuple: "33403"
+  }
+}
+carrier_id {
+  canonical_id: 1915
+  carrier_name: "AT&T MX"
+  carrier_attribute {
+    mccmnc_tuple: "334040"
+    mccmnc_tuple: "334050"
+    mccmnc_tuple: "334070"
+    mccmnc_tuple: "334080"
+  }
+}
+carrier_id {
+  canonical_id: 1916
+  carrier_name: "Dauphin Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "34080"
+  }
+}
+carrier_id {
+  canonical_id: 1917
+  carrier_name: "eMobile"
+  carrier_attribute {
+    mccmnc_tuple: "44000"
+  }
+}
+carrier_id {
+  canonical_id: 1918
+  carrier_name: "Hondutel"
+  carrier_attribute {
+    mccmnc_tuple: "70830"
+  }
+}
+carrier_id {
+  canonical_id: 1919
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "70840"
+  }
+}
+carrier_id {
+  canonical_id: 1920
+  carrier_name: "Alfa"
+  carrier_attribute {
+    mccmnc_tuple: "41501"
+  }
+}
+carrier_id {
+  canonical_id: 1921
+  carrier_name: "MTC Touch"
+  carrier_attribute {
+    mccmnc_tuple: "41503"
+  }
+}
+carrier_id {
+  canonical_id: 1922
+  carrier_name: "Ogero Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "41505"
+  }
+}
+carrier_id {
+  canonical_id: 1923
+  carrier_name: "Ncell"
+  carrier_attribute {
+    mccmnc_tuple: "42902"
+  }
+}
+carrier_id {
+  canonical_id: 1924
+  carrier_name: "Smart Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "42904"
+  }
+}
+carrier_id {
+  canonical_id: 1925
+  carrier_name: "Claro PA"
+  carrier_attribute {
+    mccmnc_tuple: "71403"
+  }
+}
+carrier_id {
+  canonical_id: 1926
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "71404"
+    mccmnc_tuple: "714040"
+  }
+}
+carrier_id {
+  canonical_id: 1927
+  carrier_name: "Telecel"
+  carrier_attribute {
+    mccmnc_tuple: "74404"
+  }
+}
+carrier_id {
+  canonical_id: 1928
+  carrier_name: "Personal"
+  carrier_attribute {
+    mccmnc_tuple: "74405"
+  }
+}
+carrier_id {
+  canonical_id: 1929
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "71606"
+  }
+}
+carrier_id {
+  canonical_id: 1930
+  carrier_name: "Entel"
+  carrier_attribute {
+    mccmnc_tuple: "71617"
+  }
+}
+carrier_id {
+  canonical_id: 1931
+  carrier_name: "Sri Lanka Telecom Mobitel"
+  carrier_attribute {
+    mccmnc_tuple: "41301"
+  }
+}
+carrier_id {
+  canonical_id: 1932
+  carrier_name: "Airtel Lanka"
+  carrier_attribute {
+    mccmnc_tuple: "41305"
+  }
+}
+carrier_id {
+  canonical_id: 1933
+  carrier_name: "Hutchison Telecommunications Lanka"
+  carrier_attribute {
+    mccmnc_tuple: "41308"
+  }
+}
+carrier_id {
+  canonical_id: 1934
+  carrier_name: "Sasatel Tanzania"
+  carrier_attribute {
+    mccmnc_tuple: "64006"
+  }
+}
+carrier_id {
+  canonical_id: 1935
+  carrier_name: "Life Tanzania"
+  carrier_attribute {
+    mccmnc_tuple: "64007"
+  }
+}
+carrier_id {
+  canonical_id: 1936
+  carrier_name: "Orange Tunisie"
+  carrier_attribute {
+    mccmnc_tuple: "60501"
+  }
+}
+carrier_id {
+  canonical_id: 1937
+  carrier_name: "ArmenTel"
+  carrier_attribute {
+    mccmnc_tuple: "28301"
+  }
+}
+carrier_id {
+  canonical_id: 1938
+  carrier_name: "Karabakh Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "28304"
+  }
+}
+carrier_id {
+  canonical_id: 1939
+  carrier_name: "K Telecom CJSC"
+  carrier_attribute {
+    mccmnc_tuple: "28305"
+  }
+}
+carrier_id {
+  canonical_id: 1940
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "28310"
+  }
+}
+carrier_id {
+  canonical_id: 1941
+  carrier_name: "Bahamas Telecommunications"
+  carrier_attribute {
+    mccmnc_tuple: "364390"
+  }
+}
+carrier_id {
+  canonical_id: 1942
+  carrier_name: "Open Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "33000"
+  }
+}
+carrier_id {
+  canonical_id: 1943
+  carrier_name: "Orange Niger"
+  carrier_attribute {
+    mccmnc_tuple: "61404"
+  }
+}
+carrier_id {
+  canonical_id: 1944
+  carrier_name: "Bell Benin Communications"
+  carrier_attribute {
+    mccmnc_tuple: "61604"
+  }
+}
+carrier_id {
+  canonical_id: 1945
+  carrier_name: "Glo Communications Benin"
+  carrier_attribute {
+    mccmnc_tuple: "61605"
+  }
+}
+carrier_id {
+  canonical_id: 1946
+  carrier_name: "Onatal (Telmob)"
+  carrier_attribute {
+    mccmnc_tuple: "61301"
+  }
+}
+carrier_id {
+  canonical_id: 1947
+  carrier_name: "Moov Togo"
+  carrier_attribute {
+    mccmnc_tuple: "61503"
+  }
+}
+carrier_id {
+  canonical_id: 1948
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "63203"
+  }
+}
+carrier_id {
+  canonical_id: 1949
+  carrier_name: "MetroPCS"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    mccmnc_tuple: "310800"
+    mccmnc_tuple: "310660"
+    mccmnc_tuple: "310640"
+    mccmnc_tuple: "310530"
+    mccmnc_tuple: "310490"
+    mccmnc_tuple: "310310"
+    mccmnc_tuple: "310300"
+    mccmnc_tuple: "310270"
+    mccmnc_tuple: "310250"
+    mccmnc_tuple: "310240"
+    mccmnc_tuple: "310230"
+    mccmnc_tuple: "310220"
+    mccmnc_tuple: "310210"
+    mccmnc_tuple: "310200"
+    mccmnc_tuple: "310160"
+    mccmnc_tuple: "311490"
+    mccmnc_tuple: "311660"
+    mccmnc_tuple: "311882"
+    mccmnc_tuple: "312250"
+    gid1: "6D38"
+  }
+}
+carrier_id {
+  canonical_id: 1950
+  carrier_name: "life:)"
+  carrier_attribute {
+    mccmnc_tuple: "25704"
+  }
+}
+carrier_id {
+  canonical_id: 1951
+  carrier_name: "Boost Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "311870"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    mccmnc_tuple: "312530"
+    gid1: "000002"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310240"
+    gid1: "0000b0"
+    gid1: "6230"
+  }
+}
+carrier_id {
+  canonical_id: 1952
+  carrier_name: "U.S. Cellular"
+  carrier_attribute {
+    mccmnc_tuple: "311580"
+    mccmnc_tuple: "311581"
+    mccmnc_tuple: "311582"
+    mccmnc_tuple: "311583"
+    mccmnc_tuple: "311584"
+    mccmnc_tuple: "311585"
+    mccmnc_tuple: "311586"
+    mccmnc_tuple: "311587"
+    mccmnc_tuple: "311588"
+    mccmnc_tuple: "311589"
+    mccmnc_tuple: "311220"
+    mccmnc_tuple: "311221"
+    mccmnc_tuple: "311222"
+    mccmnc_tuple: "311223"
+    mccmnc_tuple: "311224"
+    mccmnc_tuple: "311225"
+    mccmnc_tuple: "311226"
+    mccmnc_tuple: "311227"
+    mccmnc_tuple: "311228"
+    mccmnc_tuple: "311229"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20404"
+    spn: "U.S. Cellular"
+  }
+}
+carrier_id {
+  canonical_id: 1953
+  carrier_name: "Claro CR"
+  carrier_attribute {
+    mccmnc_tuple: "71203"
+  }
+}
+carrier_id {
+  canonical_id: 1954
+  carrier_name: "Claro SV"
+  carrier_attribute {
+    mccmnc_tuple: "70601"
+  }
+}
+carrier_id {
+  canonical_id: 1955
+  carrier_name: "Claro PR"
+  carrier_attribute {
+    mccmnc_tuple: "330110"
+    mccmnc_tuple: "33011"
+  }
+}
+carrier_id {
+  canonical_id: 1956
+  carrier_name: "Telenor Sweden (not used)"
+  carrier_attribute {
+    mccmnc_tuple: "24009"
+  }
+}
+carrier_id {
+  canonical_id: 1957
+  carrier_name: "Bluesky"
+  carrier_attribute {
+    mccmnc_tuple: "54411"
+  }
+}
+carrier_id {
+  canonical_id: 1958
+  carrier_name: "Free"
+  carrier_attribute {
+    mccmnc_tuple: "20815"
+  }
+}
+carrier_id {
+  canonical_id: 1959
+  carrier_name: "Digi.Mobil"
+  carrier_attribute {
+    mccmnc_tuple: "22605"
+  }
+}
+carrier_id {
+  canonical_id: 1960
+  carrier_name: "Hutchison 2G"
+  carrier_attribute {
+    mccmnc_tuple: "45404"
+    mccmnc_tuple: "45405"
+  }
+}
+carrier_id {
+  canonical_id: 1961
+  carrier_name: "Airtel"
+  carrier_attribute {
+    mccmnc_tuple: "40402"
+    mccmnc_tuple: "40403"
+    mccmnc_tuple: "40410"
+    mccmnc_tuple: "40416"
+    mccmnc_tuple: "40431"
+    mccmnc_tuple: "40440"
+    mccmnc_tuple: "40445"
+    mccmnc_tuple: "40449"
+    mccmnc_tuple: "40470"
+    mccmnc_tuple: "40490"
+    mccmnc_tuple: "40492"
+    mccmnc_tuple: "40493"
+    mccmnc_tuple: "40494"
+    mccmnc_tuple: "40495"
+    mccmnc_tuple: "40496"
+    mccmnc_tuple: "40497"
+    mccmnc_tuple: "40498"
+    mccmnc_tuple: "40551"
+    mccmnc_tuple: "40552"
+    mccmnc_tuple: "40553"
+    mccmnc_tuple: "40554"
+    mccmnc_tuple: "40555"
+    mccmnc_tuple: "40556"
+  }
+}
+carrier_id {
+  canonical_id: 1962
+  carrier_name: "Fido"
+  carrier_attribute {
+    mccmnc_tuple: "302370"
+    gid1: "DD"
+  }
+}
+carrier_id {
+  canonical_id: 1963
+  carrier_name: "Vi"
+  carrier_attribute {
+    mccmnc_tuple: "40401"
+    mccmnc_tuple: "40405"
+    mccmnc_tuple: "40411"
+    mccmnc_tuple: "40413"
+    mccmnc_tuple: "40415"
+    mccmnc_tuple: "40420"
+    mccmnc_tuple: "40427"
+    mccmnc_tuple: "40430"
+    mccmnc_tuple: "40443"
+    mccmnc_tuple: "40446"
+    mccmnc_tuple: "40460"
+    mccmnc_tuple: "40484"
+    mccmnc_tuple: "40486"
+    mccmnc_tuple: "40488"
+    mccmnc_tuple: "40566"
+    mccmnc_tuple: "40567"
+    mccmnc_tuple: "405750"
+    mccmnc_tuple: "405751"
+    mccmnc_tuple: "405752"
+    mccmnc_tuple: "405753"
+    mccmnc_tuple: "405754"
+    mccmnc_tuple: "405755"
+    mccmnc_tuple: "405756"
+    spn: "Vodafone IN"
+  }
+}
+carrier_id {
+  canonical_id: 1965
+  carrier_name: "Telkom"
+  carrier_attribute {
+    mccmnc_tuple: "65502"
+  }
+}
+carrier_id {
+  canonical_id: 1966
+  carrier_name: "3"
+  carrier_attribute {
+    mccmnc_tuple: "51089"
+  }
+}
+carrier_id {
+  canonical_id: 1967
+  carrier_name: "Irancell"
+  carrier_attribute {
+    mccmnc_tuple: "43235"
+  }
+}
+carrier_id {
+  canonical_id: 1968
+  carrier_name: "Etisalat"
+  carrier_attribute {
+    mccmnc_tuple: "60203"
+  }
+}
+carrier_id {
+  canonical_id: 1969
+  carrier_name: "Asiacell"
+  carrier_attribute {
+    mccmnc_tuple: "41805"
+  }
+}
+carrier_id {
+  canonical_id: 1970
+  carrier_name: "du"
+  carrier_attribute {
+    mccmnc_tuple: "42403"
+  }
+}
+carrier_id {
+  canonical_id: 1971
+  carrier_name: "Zain Iraq"
+  carrier_attribute {
+    mccmnc_tuple: "41820"
+    mccmnc_tuple: "41830"
+  }
+}
+carrier_id {
+  canonical_id: 1972
+  carrier_name: "Zain Saudi Arabia"
+  carrier_attribute {
+    mccmnc_tuple: "42004"
+  }
+}
+carrier_id {
+  canonical_id: 1973
+  carrier_name: "Libyana"
+  carrier_attribute {
+    mccmnc_tuple: "60600"
+  }
+}
+carrier_id {
+  canonical_id: 1974
+  carrier_name: "Jazztel"
+  carrier_attribute {
+    mccmnc_tuple: "21421"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+    spn: "JAZZTEL"
+    spn: "Jazztel"
+  }
+}
+carrier_id {
+  canonical_id: 1975
+  carrier_name: "Telenor"
+  carrier_attribute {
+    mccmnc_tuple: "41006"
+  }
+}
+carrier_id {
+  canonical_id: 1976
+  carrier_name: "ONO"
+  carrier_attribute {
+    mccmnc_tuple: "21418"
+  }
+}
+carrier_id {
+  canonical_id: 1977
+  carrier_name: "Ooredoo"
+  carrier_attribute {
+    mccmnc_tuple: "60303"
+  }
+}
+carrier_id {
+  canonical_id: 1978
+  carrier_name: "Smartfren"
+  carrier_attribute {
+    mccmnc_tuple: "51009"
+    mccmnc_tuple: "51028"
+  }
+}
+carrier_id {
+  canonical_id: 1979
+  carrier_name: "9Pay"
+  carrier_attribute {
+    mccmnc_tuple: "62160"
+  }
+}
+carrier_id {
+  canonical_id: 1980
+  carrier_name: "Zong"
+  carrier_attribute {
+    mccmnc_tuple: "41004"
+  }
+}
+carrier_id {
+  canonical_id: 1982
+  carrier_name: "TATA DOCOMO"
+  carrier_attribute {
+    mccmnc_tuple: "405025"
+    mccmnc_tuple: "405026"
+    mccmnc_tuple: "405027"
+    mccmnc_tuple: "405028"
+    mccmnc_tuple: "405029"
+    mccmnc_tuple: "405030"
+    mccmnc_tuple: "405031"
+    mccmnc_tuple: "405032"
+    mccmnc_tuple: "405033"
+    mccmnc_tuple: "405034"
+    mccmnc_tuple: "405035"
+    mccmnc_tuple: "405036"
+    mccmnc_tuple: "405037"
+    mccmnc_tuple: "405038"
+    mccmnc_tuple: "405039"
+    mccmnc_tuple: "405040"
+    mccmnc_tuple: "405041"
+    mccmnc_tuple: "405042"
+    mccmnc_tuple: "405043"
+    mccmnc_tuple: "405044"
+    mccmnc_tuple: "405045"
+    mccmnc_tuple: "405046"
+    mccmnc_tuple: "405047"
+  }
+}
+carrier_id {
+  canonical_id: 1983
+  carrier_name: "Korek"
+  carrier_attribute {
+    mccmnc_tuple: "41840"
+  }
+}
+carrier_id {
+  canonical_id: 1984
+  carrier_name: "Virgin"
+  carrier_attribute {
+    mccmnc_tuple: "20823"
+  }
+}
+carrier_id {
+  canonical_id: 1985
+  carrier_name: "inwi"
+  carrier_attribute {
+    mccmnc_tuple: "60402"
+  }
+}
+carrier_id {
+  canonical_id: 1986
+  carrier_name: "Tele2/Altel"
+  carrier_attribute {
+    mccmnc_tuple: "40107"
+    mccmnc_tuple: "40177"
+  }
+}
+carrier_id {
+  canonical_id: 1987
+  carrier_name: "Rightel"
+  carrier_attribute {
+    mccmnc_tuple: "43220"
+  }
+}
+carrier_id {
+  canonical_id: 1988
+  carrier_name: "O2"
+  carrier_attribute {
+    mccmnc_tuple: "23106"
+  }
+}
+carrier_id {
+  canonical_id: 1989
+  carrier_name: "Google Fi"
+  carrier_attribute {
+    mccmnc_tuple: "23420"
+    gid1: "0306"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "45403"
+    gid1: "0206"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "23210"
+    gid1: "0306"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    spn: "Fi Network"
+    spn: "nova"
+    spn: "Google Fi"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    gid1: "A00184"
+    gid1: "A00184FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    privilege_access_rule: "4C36AF4A5BDAD97C1F3D8B283416D244496C2AC5EAFE8226079EF6F676FD1859"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "312530"
+    gid1: "A00184"
+    gid1: "A00184FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    imsi_prefix_xpattern: "31026097"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "4276"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310240"
+    gid1: "4276"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "311580"
+    imsi_prefix_xpattern: "3115801"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "312580"
+    gid1: "0001"
+  }
+}
+carrier_id {
+  canonical_id: 1990
+  carrier_name: "Golan Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "42508"
+  }
+}
+carrier_id {
+  canonical_id: 1991
+  carrier_name: "Hot Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "42507"
+    mccmnc_tuple: "42577"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20404"
+    spn: "HOT mobile"
+  }
+}
+carrier_id {
+  canonical_id: 1992
+  carrier_name: "STC"
+  carrier_attribute {
+    mccmnc_tuple: "41904"
+  }
+}
+carrier_id {
+  canonical_id: 1994
+  carrier_name: "Vietnamobile"
+  carrier_attribute {
+    mccmnc_tuple: "45205"
+  }
+}
+carrier_id {
+  canonical_id: 1996
+  carrier_name: "Ooredoo Myanmar"
+  carrier_attribute {
+    mccmnc_tuple: "41405"
+  }
+}
+carrier_id {
+  canonical_id: 1997
+  carrier_name: "TrueMove H 4G LTE"
+  carrier_attribute {
+    mccmnc_tuple: "52004"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "52000"
+    gid1: "01"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "52000"
+    gid1: "01FF"
+  }
+}
+carrier_id {
+  canonical_id: 1998
+  carrier_name: "Tigo"
+  carrier_attribute {
+    mccmnc_tuple: "70603"
+  }
+}
+carrier_id {
+  canonical_id: 1999
+  carrier_name: "VIVACOM"
+  carrier_attribute {
+    mccmnc_tuple: "28403"
+  }
+}
+carrier_id {
+  canonical_id: 2001
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "42702"
+    spn: "Vodafone Qatar"
+  }
+}
+carrier_id {
+  canonical_id: 2002
+  carrier_name: "Uninor"
+  carrier_attribute {
+    mccmnc_tuple: "405813"
+    mccmnc_tuple: "405814"
+    mccmnc_tuple: "405815"
+    mccmnc_tuple: "405816"
+    mccmnc_tuple: "405817"
+    mccmnc_tuple: "405818"
+    mccmnc_tuple: "405819"
+    mccmnc_tuple: "405820"
+    mccmnc_tuple: "405821"
+    mccmnc_tuple: "405822"
+    mccmnc_tuple: "405844"
+    mccmnc_tuple: "405875"
+    mccmnc_tuple: "405876"
+    mccmnc_tuple: "405877"
+    mccmnc_tuple: "405878"
+    mccmnc_tuple: "405879"
+    mccmnc_tuple: "405880"
+    mccmnc_tuple: "405925"
+    mccmnc_tuple: "405926"
+    mccmnc_tuple: "405927"
+    mccmnc_tuple: "405928"
+    mccmnc_tuple: "405929"
+  }
+}
+carrier_id {
+  canonical_id: 2003
+  carrier_name: "Liberty"
+  carrier_attribute {
+    mccmnc_tuple: "71204"
+  }
+}
+carrier_id {
+  canonical_id: 2004
+  carrier_name: "Airtel BD"
+  carrier_attribute {
+    mccmnc_tuple: "47007"
+  }
+}
+carrier_id {
+  canonical_id: 2005
+  carrier_name: "EURO INFORMATION TELECOM"
+  carrier_attribute {
+    mccmnc_tuple: "20601"
+    gid1: "4E524A31"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20801"
+    gid1: "4E524A31"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20826"
+    gid1: "4E524A31"
+  }
+}
+carrier_id {
+  canonical_id: 2006
+  carrier_name: "Madar"
+  carrier_attribute {
+    mccmnc_tuple: "60601"
+  }
+}
+carrier_id {
+  canonical_id: 2007
+  carrier_name: "Telenor Myanmar"
+  carrier_attribute {
+    mccmnc_tuple: "41406"
+  }
+}
+carrier_id {
+  canonical_id: 2008
+  carrier_name: "Videotron"
+  carrier_attribute {
+    mccmnc_tuple: "302500"
+    mccmnc_tuple: "302510"
+    mccmnc_tuple: "302520"
+  }
+}
+carrier_id {
+  canonical_id: 2009
+  carrier_name: "Movistar"
+  carrier_attribute {
+    mccmnc_tuple: "70604"
+    mccmnc_tuple: "706040"
+  }
+}
+carrier_id {
+  canonical_id: 2010
+  carrier_name: "Movistar (Telefonía Celular de Nicaragua)"
+  carrier_attribute {
+    mccmnc_tuple: "71030"
+    mccmnc_tuple: "710300"
+  }
+}
+carrier_id {
+  canonical_id: 2011
+  carrier_name: "Inland Cellular"
+  carrier_attribute {
+    mccmnc_tuple: "310580"
+  }
+}
+carrier_id {
+  canonical_id: 2014
+  carrier_name: "Zain Bahrain"
+  carrier_attribute {
+    mccmnc_tuple: "42602"
+  }
+}
+carrier_id {
+  canonical_id: 2015
+  carrier_name: "stc BH"
+  carrier_attribute {
+    mccmnc_tuple: "42604"
+  }
+}
+carrier_id {
+  canonical_id: 2017
+  carrier_name: "Yes 5G"
+  carrier_attribute {
+    mccmnc_tuple: "502152"
+  }
+}
+carrier_id {
+  canonical_id: 2018
+  carrier_name: "Reliance Jio"
+  carrier_attribute {
+    mccmnc_tuple: "405840"
+    mccmnc_tuple: "405854"
+    mccmnc_tuple: "405855"
+    mccmnc_tuple: "405856"
+    mccmnc_tuple: "405857"
+    mccmnc_tuple: "405858"
+    mccmnc_tuple: "405859"
+    mccmnc_tuple: "405860"
+    mccmnc_tuple: "405861"
+    mccmnc_tuple: "405862"
+    mccmnc_tuple: "405863"
+    mccmnc_tuple: "405864"
+    mccmnc_tuple: "405865"
+    mccmnc_tuple: "405866"
+    mccmnc_tuple: "405867"
+    mccmnc_tuple: "405868"
+    mccmnc_tuple: "405869"
+    mccmnc_tuple: "405870"
+    mccmnc_tuple: "405871"
+    mccmnc_tuple: "405872"
+    mccmnc_tuple: "405873"
+    mccmnc_tuple: "405874"
+  }
+}
+carrier_id {
+  canonical_id: 2020
+  carrier_name: "Koodo Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "302220"
+    mccmnc_tuple: "302221"
+    mccmnc_tuple: "30222"
+    mccmnc_tuple: "30286"
+    gid1: "4B4F"
+  }
+}
+carrier_id {
+  canonical_id: 2021
+  carrier_name: "Virgin Mobile Canada"
+  carrier_attribute {
+    mccmnc_tuple: "30264"
+    mccmnc_tuple: "302610"
+    mccmnc_tuple: "302630"
+    mccmnc_tuple: "302640"
+    gid1: "3e"
+  }
+}
+carrier_id {
+  canonical_id: 2022
+  carrier_name: "TracFone"
+  carrier_attribute {
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+    gid1: "DDFF"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310240"
+    mccmnc_tuple: "310260"
+    mccmnc_tuple: "311180"
+    mccmnc_tuple: "330110"
+    gid1: "DEFF"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "534D"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "4D4B"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310590"
+    mccmnc_tuple: "310591"
+    mccmnc_tuple: "310592"
+    mccmnc_tuple: "310593"
+    mccmnc_tuple: "310594"
+    mccmnc_tuple: "310595"
+    mccmnc_tuple: "310596"
+    mccmnc_tuple: "310597"
+    mccmnc_tuple: "310598"
+    mccmnc_tuple: "310599"
+    mccmnc_tuple: "311480"
+    gid1: "BA01270000000000"
+  }
+}
+carrier_id {
+  canonical_id: 2023
+  carrier_name: "Consumer Cellular"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+    gid1: "2AC9"
+  }
+}
+carrier_id {
+  canonical_id: 2024
+  carrier_name: "Locus Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310410"
+    gid1: "49FF"
+  }
+}
+carrier_id {
+  canonical_id: 2025
+  carrier_name: "Telrite/Pure Talk"
+  carrier_attribute {
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+    gid1: "62FF"
+  }
+}
+carrier_id {
+  canonical_id: 2026
+  carrier_name: "Red Pocket"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+    gid1: "4201"
+  }
+}
+carrier_id {
+  canonical_id: 2027
+  carrier_name: "Airvoice"
+  carrier_attribute {
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+    gid1: "44FF"
+  }
+}
+carrier_id {
+  canonical_id: 2028
+  carrier_name: "Ztar"
+  carrier_attribute {
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+    gid1: "4102"
+  }
+}
+carrier_id {
+  canonical_id: 2029
+  carrier_name: "Defense Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "310410"
+    gid1: "60FF"
+  }
+}
+carrier_id {
+  canonical_id: 2030
+  carrier_name: "AGMS"
+  carrier_attribute {
+    mccmnc_tuple: "310380"
+    gid1: "50FF"
+  }
+}
+carrier_id {
+  canonical_id: 2031
+  carrier_name: "Kore"
+  carrier_attribute {
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+    gid1: "69FF"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "4B4F"
+  }
+}
+carrier_id {
+  canonical_id: 2032
+  carrier_name: "Xfinity Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "310590"
+    mccmnc_tuple: "310599"
+    mccmnc_tuple: "311480"
+    mccmnc_tuple: "311481"
+    mccmnc_tuple: "311482"
+    mccmnc_tuple: "311483"
+    mccmnc_tuple: "311484"
+    mccmnc_tuple: "311485"
+    mccmnc_tuple: "311486"
+    mccmnc_tuple: "311487"
+    mccmnc_tuple: "311488"
+    mccmnc_tuple: "311489"
+    gid1: "BA01450000000000"
+  }
+}
+carrier_id {
+  canonical_id: 2033
+  carrier_name: "Ooredoo"
+  carrier_attribute {
+    mccmnc_tuple: "47202"
+  }
+}
+carrier_id {
+  canonical_id: 2034
+  carrier_name: "Orange Mali"
+  carrier_attribute {
+    mccmnc_tuple: "61002"
+  }
+}
+carrier_id {
+  canonical_id: 2035
+  carrier_name: "Celcom"
+  carrier_attribute {
+    mccmnc_tuple: "61807"
+  }
+}
+carrier_id {
+  canonical_id: 2036
+  carrier_name: "Tigo"
+  carrier_attribute {
+    mccmnc_tuple: "63089"
+  }
+}
+carrier_id {
+  canonical_id: 2037
+  carrier_name: "Bite"
+  carrier_attribute {
+    mccmnc_tuple: "24705"
+  }
+}
+carrier_id {
+  canonical_id: 2038
+  carrier_name: "unifi mobile"
+  carrier_attribute {
+    mccmnc_tuple: "50211"
+    mccmnc_tuple: "502153"
+  }
+}
+carrier_id {
+  canonical_id: 2052
+  carrier_name: "Virgin"
+  carrier_attribute {
+    mccmnc_tuple: "42005"
+  }
+}
+carrier_id {
+  canonical_id: 2053
+  carrier_name: "PC mobile"
+  carrier_attribute {
+    mccmnc_tuple: "30264"
+    mccmnc_tuple: "302610"
+    mccmnc_tuple: "302630"
+    mccmnc_tuple: "302640"
+    gid1: "40"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "302220"
+    mccmnc_tuple: "302221"
+    gid1: "5043"
+  }
+}
+carrier_id {
+  canonical_id: 2054
+  carrier_name: "Solo Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "30264"
+    mccmnc_tuple: "302610"
+    mccmnc_tuple: "302630"
+    mccmnc_tuple: "302640"
+    gid1: "3f"
+  }
+}
+carrier_id {
+  canonical_id: 2055
+  carrier_name: "Chatr Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "302320"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "302720"
+    imsi_prefix_xpattern: "302720x94"
+    imsi_prefix_xpattern: "302720x84"
+    imsi_prefix_xpattern: "302720x83"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "302720"
+    gid1: "d2"
+  }
+}
+carrier_id {
+  canonical_id: 2056
+  carrier_name: "Ztar Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "302720"
+    imsi_prefix_xpattern: "302720x98"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "302720"
+    gid1: "d4"
+  }
+}
+carrier_id {
+  canonical_id: 2057
+  carrier_name: "Cityfone"
+  carrier_attribute {
+    mccmnc_tuple: "302720"
+    imsi_prefix_xpattern: "302720x97"
+    gid1: "cc"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "302720"
+    spn: "CITYFONE"
+  }
+}
+carrier_id {
+  canonical_id: 2060
+  carrier_name: "Amaysim (MVNE2)"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "6133"
+  }
+}
+carrier_id {
+  canonical_id: 2062
+  carrier_name: "Bright Spot (Leto)"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "4C45"
+  }
+}
+carrier_id {
+  canonical_id: 2064
+  carrier_name: "GoSmart"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "4753"
+  }
+}
+carrier_id {
+  canonical_id: 2065
+  carrier_name: "IDT"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "AB"
+  }
+}
+carrier_id {
+  canonical_id: 2066
+  carrier_name: "Kajeet (Arterra)"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "6136"
+  }
+}
+carrier_id {
+  canonical_id: 2067
+  carrier_name: "Lyca Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "6C79"
+  }
+}
+carrier_id {
+  canonical_id: 2068
+  carrier_name: "M2M"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "3201"
+  }
+}
+carrier_id {
+  canonical_id: 2069
+  carrier_name: "MVNE2/AMDOCS"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "6132"
+  }
+}
+carrier_id {
+  canonical_id: 2070
+  carrier_name: "Nest"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "4E45"
+  }
+}
+carrier_id {
+  canonical_id: 2071
+  carrier_name: "Plintron"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "7031"
+  }
+}
+carrier_id {
+  canonical_id: 2073
+  carrier_name: "PWG/Cintex"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "4358"
+  }
+}
+carrier_id {
+  canonical_id: 2074
+  carrier_name: "Ready Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "8234"
+  }
+}
+carrier_id {
+  canonical_id: 2075
+  carrier_name: "Republic Wireless (MVNE2)"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "6134"
+  }
+}
+carrier_id {
+  canonical_id: 2076
+  carrier_name: "Roam Mobility"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "726D"
+    gid1: "524D"
+  }
+}
+carrier_id {
+  canonical_id: 2077
+  carrier_name: "Rock Island"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "6137"
+  }
+}
+carrier_id {
+  canonical_id: 2079
+  carrier_name: "Solavei"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "7376"
+  }
+}
+carrier_id {
+  canonical_id: 2080
+  carrier_name: "Ting"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "6135"
+  }
+}
+carrier_id {
+  canonical_id: 2081
+  carrier_name: "Twilio M2M"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "7477"
+  }
+}
+carrier_id {
+  canonical_id: 2083
+  carrier_name: "Ultra/Univision"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "354D"
+    gid1: "364D"
+    gid1: "4153"
+    gid1: "554D"
+  }
+}
+carrier_id {
+  canonical_id: 2086
+  carrier_name: "Vodafone US"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "2801"
+  }
+}
+carrier_id {
+  canonical_id: 2087
+  carrier_name: "Wyless"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "574D"
+  }
+}
+carrier_id {
+  canonical_id: 2088
+  carrier_name: "Crnogorski Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "29702"
+    spn: "Telekom.me"
+  }
+}
+carrier_id {
+  canonical_id: 2089
+  carrier_name: "Public Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "302220"
+    mccmnc_tuple: "302221"
+    gid1: "4D4F"
+  }
+}
+carrier_id {
+  canonical_id: 2090
+  carrier_name: "Tbaytel"
+  carrier_attribute {
+    mccmnc_tuple: "302720"
+    imsi_prefix_xpattern: "302720x92"
+    gid1: "ba"
+  }
+}
+carrier_id {
+  canonical_id: 2091
+  carrier_name: "Bonbon"
+  carrier_attribute {
+    mccmnc_tuple: "21901"
+    mccmnc_tuple: "21920"
+    spn: "bonbon"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21901"
+    mccmnc_tuple: "21920"
+    gid1: "10"
+    gid1: "11"
+    gid1: "12"
+  }
+}
+carrier_id {
+  canonical_id: 2092
+  carrier_name: "congstar"
+  carrier_attribute {
+    mccmnc_tuple: "26201"
+    mccmnc_tuple: "26206"
+    spn: "congstar"
+    spn: "congstar.de"
+    gid1: "44"
+  }
+}
+carrier_id {
+  canonical_id: 2093
+  carrier_name: "Tesco"
+  carrier_attribute {
+    mccmnc_tuple: "23410"
+    gid1: "0A"
+    gid1: "0AFFFF"
+    gid1: "0AFFFFFFFFFF544553434F202020202020202020"
+  }
+}
+carrier_id {
+  canonical_id: 2094
+  carrier_name: "tele.ring"
+  carrier_attribute {
+    mccmnc_tuple: "23207"
+    gid1: "07"
+    gid1: "FF"
+    gid1: "30"
+  }
+}
+carrier_id {
+  canonical_id: 2095
+  carrier_name: "Ben"
+  carrier_attribute {
+    mccmnc_tuple: "20416"
+    gid1: "5F"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20416"
+    spn: "Ben NL"
+  }
+}
+carrier_id {
+  canonical_id: 2100
+  carrier_name: "Y!mobile"
+  carrier_attribute {
+    mccmnc_tuple: "44020"
+    gid1: "01ffff"
+    gid1: "16ffff"
+  }
+}
+carrier_id {
+  canonical_id: 2101
+  carrier_name: "BT"
+  carrier_attribute {
+    mccmnc_tuple: "23430"
+    gid1: "c3"
+    gid1: "c3ff"
+  }
+}
+carrier_id {
+  canonical_id: 2102
+  carrier_name: "BT Business"
+  carrier_attribute {
+    mccmnc_tuple: "23430"
+    gid1: "b3"
+    gid1: "b3ff"
+  }
+}
+carrier_id {
+  canonical_id: 2103
+  carrier_name: "BT One Phone"
+  carrier_attribute {
+    mccmnc_tuple: "23430"
+    mccmnc_tuple: "23408"
+    gid1: "b2"
+    gid1: "b2ff"
+  }
+}
+carrier_id {
+  canonical_id: 2105
+  carrier_name: "Skinny"
+  carrier_attribute {
+    mccmnc_tuple: "53005"
+    spn: "Skinny"
+  }
+}
+carrier_id {
+  canonical_id: 2106
+  carrier_name: "IIJmio"
+  carrier_attribute {
+    mccmnc_tuple: "44010"
+    preferred_apn: "iijmio.jp"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "44051"
+    preferred_apn: "iijmio.jp"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20601"
+    spn: "IIJ"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "44003"
+  }
+}
+carrier_id {
+  canonical_id: 2107
+  carrier_name: "ONE"
+  carrier_attribute {
+    mccmnc_tuple: "29701"
+  }
+}
+carrier_id {
+  canonical_id: 2108
+  carrier_name: "AirtelTigo"
+  carrier_attribute {
+    mccmnc_tuple: "62003"
+    mccmnc_tuple: "62006"
+  }
+}
+carrier_id {
+  canonical_id: 2109
+  carrier_name: "Rakuten Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "44010"
+    preferred_apn: "rmobile.co"
+    preferred_apn: "rmobile.jp"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "44051"
+    preferred_apn: "a.rmobile.jp"
+  }
+}
+carrier_id {
+  canonical_id: 2110
+  carrier_name: "UQ mobile"
+  carrier_attribute {
+    mccmnc_tuple: "44050"
+    mccmnc_tuple: "44051"
+    mccmnc_tuple: "44054"
+    gid1: "20"
+  }
+}
+carrier_id {
+  canonical_id: 2111
+  carrier_name: "Euskaltel"
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+    mccmnc_tuple: "21408"
+    spn: "EUSKALTEL"
+  }
+}
+carrier_id {
+  canonical_id: 2112
+  carrier_name: "Telecable"
+  carrier_attribute {
+    mccmnc_tuple: "21416"
+    spn: "telecable"
+    spn: "Telecable"
+    spn: "TeleCable"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21405"
+    imsi_prefix_xpattern: "214050111"
+    spn: "telecable"
+    spn: "Telecable"
+    spn: "TeleCable"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21406"
+    imsi_prefix_xpattern: "2140613"
+    spn: "telecable"
+    spn: "Telecable"
+    spn: "TeleCable"
+  }
+}
+carrier_id {
+  canonical_id: 2113
+  carrier_name: "mobilR"
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+    mccmnc_tuple: "21408"
+    mccmnc_tuple: "21417"
+    spn: "mobilR"
+    spn: "mobil R"
+    spn: "Mobil R"
+  }
+}
+carrier_id {
+  canonical_id: 2114
+  carrier_name: "EWE"
+  carrier_attribute {
+    mccmnc_tuple: "26202"
+    spn: "ewe.de"
+  }
+}
+carrier_id {
+  canonical_id: 2115
+  carrier_name: "Glo"
+  carrier_attribute {
+    mccmnc_tuple: "62150"
+  }
+}
+carrier_id {
+  canonical_id: 2116
+  carrier_name: "Ratel"
+  carrier_attribute {
+    mccmnc_tuple: "44010"
+    preferred_apn: "ratel.com"
+  }
+}
+carrier_id {
+  canonical_id: 2117
+  carrier_name: "TalkTalk"
+  carrier_attribute {
+    mccmnc_tuple: "23410"
+    gid1: "537"
+  }
+}
+carrier_id {
+  canonical_id: 2118
+  carrier_name: "giffgaff"
+  carrier_attribute {
+    mccmnc_tuple: "23410"
+    gid1: "508"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "23410"
+    spn: "giffgaff"
+  }
+}
+carrier_id {
+  canonical_id: 2119
+  carrier_name: "FirstNet"
+  carrier_attribute {
+    mccmnc_tuple: "313100"
+    mccmnc_tuple: "313110"
+    mccmnc_tuple: "313120"
+    mccmnc_tuple: "313130"
+    mccmnc_tuple: "313140"
+  }
+}
+carrier_id {
+  canonical_id: 2120
+  carrier_name: "FirstNet (Lab)"
+  carrier_attribute {
+    mccmnc_tuple: "312670"
+  }
+}
+carrier_id {
+  canonical_id: 2121
+  carrier_name: "mineo"
+  carrier_attribute {
+    mccmnc_tuple: "44010"
+    preferred_apn: "mineo-d.jp"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "44051"
+    preferred_apn: "mineo.jp"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "44020"
+    preferred_apn: "mineo-s.jp"
+  }
+}
+carrier_id {
+  canonical_id: 2122
+  carrier_name: "Lucky Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "30264"
+    mccmnc_tuple: "302610"
+    mccmnc_tuple: "302630"
+    mccmnc_tuple: "302640"
+    gid1: "42"
+  }
+}
+carrier_id {
+  canonical_id: 2123
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "54002"
+  }
+}
+carrier_id {
+  canonical_id: 2124
+  carrier_name: "Iliad"
+  carrier_attribute {
+    mccmnc_tuple: "22250"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20815"
+    gid1: "F003"
+  }
+}
+carrier_id {
+  canonical_id: 2125
+  carrier_name: "Simyo"
+  carrier_attribute {
+    mccmnc_tuple: "21419"
+    spn: "simyo"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+    spn: "simyo"
+  }
+}
+carrier_id {
+  canonical_id: 2126
+  carrier_name: "Spectrum Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "311480"
+    gid1: "BA01490000000000"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "313450"
+  }
+}
+carrier_id {
+  canonical_id: 2127
+  carrier_name: "Free RE"
+  carrier_attribute {
+    mccmnc_tuple: "64703"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20815"
+    gid1: "F2330002"
+  }
+}
+carrier_id {
+  canonical_id: 2128
+  carrier_name: "Sprint Wholesale"
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    gid1: "A00022FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00209FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00250FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00207FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00105FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00263FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00271FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00151FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00058FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00301FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00143FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00247FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00274FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00042FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00092FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00312FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "A00034FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+  }
+}
+carrier_id {
+  canonical_id: 2129
+  carrier_name: "ALDI mobile"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "ALDImobile"
+  }
+}
+carrier_id {
+  canonical_id: 2130
+  carrier_name: "ALIV BS"
+  carrier_attribute {
+    mccmnc_tuple: "20809"
+    imsi_prefix_xpattern: "208090021"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "36449"
+  }
+}
+carrier_id {
+  canonical_id: 2131
+  carrier_name: "Altecom"
+  carrier_attribute {
+    mccmnc_tuple: "21402"
+  }
+}
+carrier_id {
+  canonical_id: 2132
+  carrier_name: "Bics"
+  carrier_attribute {
+    mccmnc_tuple: "20628"
+    mccmnc_tuple: "90158"
+  }
+}
+carrier_id {
+  canonical_id: 2133
+  carrier_name: "Carrefour"
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+    imsi_prefix_xpattern: "2140352"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20801"
+    gid1: "33"
+  }
+}
+carrier_id {
+  canonical_id: 2134
+  carrier_name: "com4"
+  carrier_attribute {
+    mccmnc_tuple: "24209"
+  }
+}
+carrier_id {
+  canonical_id: 2135
+  carrier_name: "Coriolis"
+  carrier_attribute {
+    mccmnc_tuple: "20801"
+    imsi_prefix_xpattern: "208011511"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20809"
+    imsi_prefix_xpattern: "208090036"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20827"
+    spn: "Coriolis"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20810"
+    mccmnc_tuple: "64710"
+    gid1: "12"
+  }
+}
+carrier_id {
+  canonical_id: 2136
+  carrier_name: "Fibracat"
+  carrier_attribute {
+    mccmnc_tuple: "21402"
+    spn: "fibracat"
+  }
+}
+carrier_id {
+  canonical_id: 2137
+  carrier_name: "Gamma"
+  carrier_attribute {
+    mccmnc_tuple: "23439"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "24007"
+    imsi_prefix_xpattern: "240075610"
+  }
+}
+carrier_id {
+  canonical_id: 2138
+  carrier_name: "Jump"
+  carrier_attribute {
+    mccmnc_tuple: "23410"
+    mccmnc_tuple: "23439"
+    mccmnc_tuple: "24007"
+    spn: "jump"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20404"
+    spn: "Jump"
+  }
+}
+carrier_id {
+  canonical_id: 2139
+  carrier_name: "Sky"
+  carrier_attribute {
+    mccmnc_tuple: "23457"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "24007"
+    gid1: "0c"
+  }
+}
+carrier_id {
+  canonical_id: 2140
+  carrier_name: "Smarty"
+  carrier_attribute {
+    mccmnc_tuple: "23420"
+    gid1: "0309"
+  }
+}
+carrier_id {
+  canonical_id: 2141
+  carrier_name: "Superdrug"
+  carrier_attribute {
+    mccmnc_tuple: "23420"
+    gid1: "0310"
+  }
+}
+carrier_id {
+  canonical_id: 2142
+  carrier_name: "Tinkoff"
+  carrier_attribute {
+    mccmnc_tuple: "25062"
+  }
+}
+carrier_id {
+  canonical_id: 2143
+  carrier_name: "Truphone"
+  carrier_attribute {
+    mccmnc_tuple: "20404"
+    mccmnc_tuple: "20408"
+    mccmnc_tuple: "20433"
+    mccmnc_tuple: "20809"
+    mccmnc_tuple: "20812"
+    mccmnc_tuple: "21427"
+    mccmnc_tuple: "23425"
+    mccmnc_tuple: "26033"
+    mccmnc_tuple: "26242"
+    mccmnc_tuple: "310300"
+    mccmnc_tuple: "310690"
+    mccmnc_tuple: "45400"
+    mccmnc_tuple: "45408"
+    mccmnc_tuple: "50538"
+    gid1: "547275554b3030656e"
+  }
+}
+carrier_id {
+  canonical_id: 2144
+  carrier_name: "Unleashed"
+  carrier_attribute {
+    mccmnc_tuple: "20630"
+  }
+}
+carrier_id {
+  canonical_id: 2145
+  carrier_name: "Virgin"
+  carrier_attribute {
+    mccmnc_tuple: "50502"
+    imsi_prefix_xpattern: "505029"
+  }
+}
+carrier_id {
+  canonical_id: 2146
+  carrier_name: "Visible"
+  carrier_attribute {
+    mccmnc_tuple: "311480"
+    gid1: "bae1000000000000"
+    gid2: "1A00000000000000"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "311480"
+    gid1: "bae2000000000000"
+    gid2: "1C00000000000000"
+  }
+}
+carrier_id {
+  canonical_id: 2147
+  carrier_name: "Vodafone Lab"
+  carrier_attribute {
+    mccmnc_tuple: "26209"
+  }
+}
+carrier_id {
+  canonical_id: 2148
+  carrier_name: "BIGLOBE"
+  carrier_attribute {
+    mccmnc_tuple: "44010"
+    preferred_apn: "biglobe.jp"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "44051"
+    mccmnc_tuple: "44054"
+    gid1: "24"
+  }
+}
+carrier_id {
+  canonical_id: 2149
+  carrier_name: "Voiceworks NL"
+  carrier_attribute {
+    mccmnc_tuple: "20403"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20408"
+    imsi_prefix_xpattern: "204080950"
+  }
+}
+carrier_id {
+  canonical_id: 2150
+  carrier_name: "Telenet"
+  carrier_attribute {
+    mccmnc_tuple: "20605"
+  }
+}
+carrier_id {
+  canonical_id: 2151
+  carrier_name: "Legos"
+  carrier_attribute {
+    mccmnc_tuple: "20817"
+  }
+}
+carrier_id {
+  canonical_id: 2152
+  carrier_name: "Lycamobile"
+  carrier_attribute {
+    mccmnc_tuple: "23426"
+    spn: "Lycamobile"
+  }
+}
+carrier_id {
+  canonical_id: 2153
+  carrier_name: "Unité"
+  carrier_attribute {
+    mccmnc_tuple: "25905"
+  }
+}
+carrier_id {
+  canonical_id: 2154
+  carrier_name: "Tesco"
+  carrier_attribute {
+    mccmnc_tuple: "27211"
+    gid1: "0A"
+  }
+}
+carrier_id {
+  canonical_id: 2155
+  carrier_name: "Nova"
+  carrier_attribute {
+    mccmnc_tuple: "27411"
+  }
+}
+carrier_id {
+  canonical_id: 2156
+  carrier_name: "PrimeTel"
+  carrier_attribute {
+    mccmnc_tuple: "28020"
+  }
+}
+carrier_id {
+  canonical_id: 2157
+  carrier_name: "IT&E OverSeas"
+  carrier_attribute {
+    mccmnc_tuple: "310032"
+    spn: "CdmaNai"
+  }
+}
+carrier_id {
+  canonical_id: 2158
+  carrier_name: "North Dakota Network Company"
+  carrier_attribute {
+    mccmnc_tuple: "311610"
+    spn: "srtcomm"
+  }
+}
+carrier_id {
+  canonical_id: 2159
+  carrier_name: "United Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "311650"
+    spn: "unitedwireless"
+  }
+}
+carrier_id {
+  canonical_id: 2160
+  carrier_name: "Pine Belt"
+  carrier_attribute {
+    mccmnc_tuple: "311670"
+    spn: "pinebelt"
+  }
+}
+carrier_id {
+  canonical_id: 2161
+  carrier_name: "Missouri RSA No 5 Partnership"
+  carrier_attribute {
+    mccmnc_tuple: "311920"
+    spn: "CdmaNai"
+  }
+}
+carrier_id {
+  canonical_id: 2162
+  carrier_name: "Custer"
+  carrier_attribute {
+    mccmnc_tuple: "312040"
+    spn: "custer"
+  }
+}
+carrier_id {
+  canonical_id: 2163
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "36302"
+    mccmnc_tuple: "363020"
+  }
+}
+carrier_id {
+  canonical_id: 2165
+  carrier_name: "TashiCell"
+  carrier_attribute {
+    mccmnc_tuple: "40277"
+  }
+}
+carrier_id {
+  canonical_id: 2166
+  carrier_name: "SanaTel"
+  carrier_attribute {
+    mccmnc_tuple: "41808"
+  }
+}
+carrier_id {
+  canonical_id: 2167
+  carrier_name: "Omnnea"
+  carrier_attribute {
+    mccmnc_tuple: "41892"
+  }
+}
+carrier_id {
+  canonical_id: 2168
+  carrier_name: "HiTS-UNITEL"
+  carrier_attribute {
+    mccmnc_tuple: "42104"
+  }
+}
+carrier_id {
+  canonical_id: 2169
+  carrier_name: "Alon Cellular Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "42514"
+  }
+}
+carrier_id {
+  canonical_id: 2170
+  carrier_name: "Home Cellular"
+  carrier_attribute {
+    mccmnc_tuple: "42515"
+  }
+}
+carrier_id {
+  canonical_id: 2171
+  carrier_name: "Rami Levy"
+  carrier_attribute {
+    mccmnc_tuple: "42516"
+  }
+}
+carrier_id {
+  canonical_id: 2172
+  carrier_name: "Skytel"
+  carrier_attribute {
+    mccmnc_tuple: "42891"
+  }
+}
+carrier_id {
+  canonical_id: 2173
+  carrier_name: "G.Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "42898"
+  }
+}
+carrier_id {
+  canonical_id: 2174
+  carrier_name: "Tcell"
+  carrier_attribute {
+    mccmnc_tuple: "43612"
+  }
+}
+carrier_id {
+  canonical_id: 2175
+  carrier_name: "AkTel LLC"
+  carrier_attribute {
+    mccmnc_tuple: "43703"
+  }
+}
+carrier_id {
+  canonical_id: 2176
+  carrier_name: "MegaCom"
+  carrier_attribute {
+    mccmnc_tuple: "43705"
+  }
+}
+carrier_id {
+  canonical_id: 2177
+  carrier_name: "O!"
+  carrier_attribute {
+    mccmnc_tuple: "43709"
+  }
+}
+carrier_id {
+  canonical_id: 2178
+  carrier_name: "Gmobile"
+  carrier_attribute {
+    mccmnc_tuple: "45207"
+  }
+}
+carrier_id {
+  canonical_id: 2179
+  carrier_name: "Viettel Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "45208"
+  }
+}
+carrier_id {
+  canonical_id: 2180
+  carrier_name: "qb"
+  carrier_attribute {
+    mccmnc_tuple: "45604"
+  }
+}
+carrier_id {
+  canonical_id: 2181
+  carrier_name: "Metfone"
+  carrier_attribute {
+    mccmnc_tuple: "45608"
+  }
+}
+carrier_id {
+  canonical_id: 2182
+  carrier_name: "Telkomcel"
+  carrier_attribute {
+    mccmnc_tuple: "51401"
+  }
+}
+carrier_id {
+  canonical_id: 2183
+  carrier_name: "Timor Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "51402"
+  }
+}
+carrier_id {
+  canonical_id: 2184
+  carrier_name: "Redinternet"
+  carrier_attribute {
+    mccmnc_tuple: "51518"
+  }
+}
+carrier_id {
+  canonical_id: 2185
+  carrier_name: "BREEZE"
+  carrier_attribute {
+    mccmnc_tuple: "54001"
+  }
+}
+carrier_id {
+  canonical_id: 2186
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "54202"
+  }
+}
+carrier_id {
+  canonical_id: 2187
+  carrier_name: "Kiribati Frigate"
+  carrier_attribute {
+    mccmnc_tuple: "54509"
+  }
+}
+carrier_id {
+  canonical_id: 2188
+  carrier_name: "Palau Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "55280"
+  }
+}
+carrier_id {
+  canonical_id: 2189
+  carrier_name: "Al-Jeel"
+  carrier_attribute {
+    mccmnc_tuple: "60602"
+  }
+}
+carrier_id {
+  canonical_id: 2190
+  carrier_name: "Hatef"
+  carrier_attribute {
+    mccmnc_tuple: "60606"
+  }
+}
+carrier_id {
+  canonical_id: 2191
+  carrier_name: "QCell"
+  carrier_attribute {
+    mccmnc_tuple: "60704"
+  }
+}
+carrier_id {
+  canonical_id: 2192
+  carrier_name: "Expresso"
+  carrier_attribute {
+    mccmnc_tuple: "60803"
+  }
+}
+carrier_id {
+  canonical_id: 2193
+  carrier_name: "Intercel"
+  carrier_attribute {
+    mccmnc_tuple: "61103"
+  }
+}
+carrier_id {
+  canonical_id: 2194
+  carrier_name: "Lonestar"
+  carrier_attribute {
+    mccmnc_tuple: "61801"
+  }
+}
+carrier_id {
+  canonical_id: 2195
+  carrier_name: "Libercell"
+  carrier_attribute {
+    mccmnc_tuple: "61802"
+  }
+}
+carrier_id {
+  canonical_id: 2196
+  carrier_name: "LIBTELCO"
+  carrier_attribute {
+    mccmnc_tuple: "61820"
+  }
+}
+carrier_id {
+  canonical_id: 2197
+  carrier_name: "Salam"
+  carrier_attribute {
+    mccmnc_tuple: "62204"
+  }
+}
+carrier_id {
+  canonical_id: 2198
+  carrier_name: "Nationlink"
+  carrier_attribute {
+    mccmnc_tuple: "62304"
+  }
+}
+carrier_id {
+  canonical_id: 2199
+  carrier_name: "Hits-GE"
+  carrier_attribute {
+    mccmnc_tuple: "62703"
+  }
+}
+carrier_id {
+  canonical_id: 2200
+  carrier_name: "Azur"
+  carrier_attribute {
+    mccmnc_tuple: "62804"
+  }
+}
+carrier_id {
+  canonical_id: 2201
+  carrier_name: "MOVICEL"
+  carrier_attribute {
+    mccmnc_tuple: "63104"
+  }
+}
+carrier_id {
+  canonical_id: 2202
+  carrier_name: "Sudani"
+  carrier_attribute {
+    mccmnc_tuple: "63407"
+  }
+}
+carrier_id {
+  canonical_id: 2203
+  carrier_name: "Airtel Rwanda"
+  carrier_attribute {
+    mccmnc_tuple: "63513"
+    mccmnc_tuple: "63514"
+  }
+}
+carrier_id {
+  canonical_id: 2205
+  carrier_name: "Telesom"
+  carrier_attribute {
+    mccmnc_tuple: "63701"
+  }
+}
+carrier_id {
+  canonical_id: 2206
+  carrier_name: "Nationlink"
+  carrier_attribute {
+    mccmnc_tuple: "63710"
+  }
+}
+carrier_id {
+  canonical_id: 2207
+  carrier_name: "Somtel"
+  carrier_attribute {
+    mccmnc_tuple: "63771"
+  }
+}
+carrier_id {
+  canonical_id: 2208
+  carrier_name: "Telcom"
+  carrier_attribute {
+    mccmnc_tuple: "63782"
+  }
+}
+carrier_id {
+  canonical_id: 2209
+  carrier_name: "Yu"
+  carrier_attribute {
+    mccmnc_tuple: "63905"
+  }
+}
+carrier_id {
+  canonical_id: 2210
+  carrier_name: "Telkom"
+  carrier_attribute {
+    mccmnc_tuple: "63907"
+  }
+}
+carrier_id {
+  canonical_id: 2211
+  carrier_name: "Lumitel/Viettel"
+  carrier_attribute {
+    mccmnc_tuple: "64208"
+  }
+}
+carrier_id {
+  canonical_id: 2212
+  carrier_name: "Leo"
+  carrier_attribute {
+    mccmnc_tuple: "64282"
+  }
+}
+carrier_id {
+  canonical_id: 2213
+  carrier_name: "Movitel"
+  carrier_attribute {
+    mccmnc_tuple: "64303"
+  }
+}
+carrier_id {
+  canonical_id: 2214
+  carrier_name: "switch"
+  carrier_attribute {
+    mccmnc_tuple: "64902"
+  }
+}
+carrier_id {
+  canonical_id: 2216
+  carrier_name: "VTR Banda Ancha SA"
+  carrier_attribute {
+    mccmnc_tuple: "73008"
+  }
+}
+carrier_id {
+  canonical_id: 2217
+  carrier_name: "GT&T Cellink Plus"
+  carrier_attribute {
+    mccmnc_tuple: "73802"
+    mccmnc_tuple: "738002"
+  }
+}
+carrier_id {
+  canonical_id: 2218
+  carrier_name: "ETB 4G"
+  carrier_attribute {
+    mccmnc_tuple: "732187"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "732103"
+    spn: "ETB MOVI"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "732111"
+    spn: "ETB MOVIL"
+  }
+}
+carrier_id {
+  canonical_id: 2219
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "54105"
+  }
+}
+carrier_id {
+  canonical_id: 2220
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "53988"
+  }
+}
+carrier_id {
+  canonical_id: 2221
+  carrier_name: "Etisalat"
+  carrier_attribute {
+    mccmnc_tuple: "41250"
+  }
+}
+carrier_id {
+  canonical_id: 2222
+  carrier_name: "Globacom"
+  carrier_attribute {
+    mccmnc_tuple: "62007"
+  }
+}
+carrier_id {
+  canonical_id: 2223
+  carrier_name: "Grenada:Lime"
+  carrier_attribute {
+    mccmnc_tuple: "352110"
+  }
+}
+carrier_id {
+  canonical_id: 2224
+  carrier_name: "Cable & Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "33818"
+    mccmnc_tuple: "338180"
+  }
+}
+carrier_id {
+  canonical_id: 2225
+  carrier_name: "MTN/Areeba"
+  carrier_attribute {
+    mccmnc_tuple: "61104"
+  }
+}
+carrier_id {
+  canonical_id: 2227
+  carrier_name: "Tigo/Milicom/Tchad Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "62203"
+  }
+}
+carrier_id {
+  canonical_id: 2229
+  carrier_name: "Rebtel"
+  carrier_attribute {
+    mccmnc_tuple: "26044"
+  }
+}
+carrier_id {
+  canonical_id: 2230
+  carrier_name: "bulsatcom"
+  carrier_attribute {
+    mccmnc_tuple: "28411"
+  }
+}
+carrier_id {
+  canonical_id: 2231
+  carrier_name: "MAX TELECOM"
+  carrier_attribute {
+    mccmnc_tuple: "28413"
+  }
+}
+carrier_id {
+  canonical_id: 2232
+  carrier_name: "BICS"
+  carrier_attribute {
+    mccmnc_tuple: "29509"
+    spn: "BICS"
+  }
+}
+carrier_id {
+  canonical_id: 2233
+  carrier_name: "EMnify"
+  carrier_attribute {
+    mccmnc_tuple: "29509"
+  }
+}
+carrier_id {
+  canonical_id: 2234
+  carrier_name: "Itisaluna"
+  carrier_attribute {
+    mccmnc_tuple: "41862"
+  }
+}
+carrier_id {
+  canonical_id: 2235
+  carrier_name: "Perfectum Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "43406"
+  }
+}
+carrier_id {
+  canonical_id: 2236
+  carrier_name: "SEATEL"
+  carrier_attribute {
+    mccmnc_tuple: "45611"
+  }
+}
+carrier_id {
+  canonical_id: 2237
+  carrier_name: "China Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "46003"
+    mccmnc_tuple: "46011"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20404"
+    spn: "中国电信"
+  }
+}
+carrier_id {
+  canonical_id: 2238
+  carrier_name: "Sunsurf"
+  carrier_attribute {
+    mccmnc_tuple: "52504"
+  }
+}
+carrier_id {
+  canonical_id: 2239
+  carrier_name: "AIL"
+  carrier_attribute {
+    mccmnc_tuple: "54100"
+  }
+}
+carrier_id {
+  canonical_id: 2240
+  carrier_name: "Kiribati - TSKL"
+  carrier_attribute {
+    mccmnc_tuple: "54501"
+  }
+}
+carrier_id {
+  canonical_id: 2241
+  carrier_name: "Guinetel"
+  carrier_attribute {
+    mccmnc_tuple: "63207"
+  }
+}
+carrier_id {
+  canonical_id: 2242
+  carrier_name: "Privet"
+  carrier_attribute {
+    mccmnc_tuple: "63409"
+  }
+}
+carrier_id {
+  canonical_id: 2243
+  carrier_name: "Rwandatel"
+  carrier_attribute {
+    mccmnc_tuple: "63512"
+  }
+}
+carrier_id {
+  canonical_id: 2244
+  carrier_name: "Somafone"
+  carrier_attribute {
+    mccmnc_tuple: "63704"
+  }
+}
+carrier_id {
+  canonical_id: 2245
+  carrier_name: "Hormuud"
+  carrier_attribute {
+    mccmnc_tuple: "63725"
+  }
+}
+carrier_id {
+  canonical_id: 2246
+  carrier_name: "Unitel"
+  carrier_attribute {
+    mccmnc_tuple: "63757"
+  }
+}
+carrier_id {
+  canonical_id: 2247
+  carrier_name: "Eritel"
+  carrier_attribute {
+    mccmnc_tuple: "65701"
+  }
+}
+carrier_id {
+  canonical_id: 2248
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "70804"
+    mccmnc_tuple: "708040"
+  }
+}
+carrier_id {
+  canonical_id: 2249
+  carrier_name: "Tuenti"
+  carrier_attribute {
+    mccmnc_tuple: "72201"
+    gid1: "02"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "722010"
+    spn: "Tuenti"
+    gid1: "01"
+  }
+}
+carrier_id {
+  canonical_id: 2250
+  carrier_name: "Argentina:Nuestro"
+  carrier_attribute {
+    mccmnc_tuple: "72236"
+  }
+}
+carrier_id {
+  canonical_id: 2251
+  carrier_name: "Sberbank-Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "250050"
+  }
+}
+carrier_id {
+  canonical_id: 2252
+  carrier_name: "EastLink"
+  carrier_attribute {
+    mccmnc_tuple: "302270"
+  }
+}
+carrier_id {
+  canonical_id: 2253
+  carrier_name: "ALU Test-SIM"
+  carrier_attribute {
+    mccmnc_tuple: "310028"
+  }
+}
+carrier_id {
+  canonical_id: 2254
+  carrier_name: "etex"
+  carrier_attribute {
+    mccmnc_tuple: "310035"
+    spn: "etex"
+  }
+}
+carrier_id {
+  canonical_id: 2255
+  carrier_name: "NexTech Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "311100"
+  }
+}
+carrier_id {
+  canonical_id: 2256
+  carrier_name: "TelAlaska Cellular"
+  carrier_attribute {
+    mccmnc_tuple: "311740"
+  }
+}
+carrier_id {
+  canonical_id: 2257
+  carrier_name: "Cleartalk"
+  carrier_attribute {
+    mccmnc_tuple: "311750"
+  }
+}
+carrier_id {
+  canonical_id: 2258
+  carrier_name: "MobileNation"
+  carrier_attribute {
+    mccmnc_tuple: "311910"
+  }
+}
+carrier_id {
+  canonical_id: 2259
+  carrier_name: "Syringa"
+  carrier_attribute {
+    mccmnc_tuple: "311930"
+  }
+}
+carrier_id {
+  canonical_id: 2260
+  carrier_name: "NexTech Ota"
+  carrier_attribute {
+    mccmnc_tuple: "312420"
+  }
+}
+carrier_id {
+  canonical_id: 2261
+  carrier_name: "Blue Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "312570"
+  }
+}
+carrier_id {
+  canonical_id: 2262
+  carrier_name: "Open Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "330000"
+    spn: "openmobile"
+  }
+}
+carrier_id {
+  canonical_id: 2263
+  carrier_name: "Claro"
+  carrier_attribute {
+    mccmnc_tuple: "338070"
+  }
+}
+carrier_id {
+  canonical_id: 2264
+  carrier_name: "Videocon"
+  carrier_attribute {
+    mccmnc_tuple: "405823"
+    mccmnc_tuple: "405824"
+    mccmnc_tuple: "405825"
+    mccmnc_tuple: "405826"
+    mccmnc_tuple: "405827"
+    mccmnc_tuple: "405828"
+    mccmnc_tuple: "405829"
+    mccmnc_tuple: "405830"
+    mccmnc_tuple: "405832"
+    mccmnc_tuple: "405833"
+    mccmnc_tuple: "405834"
+    mccmnc_tuple: "405835"
+    mccmnc_tuple: "405836"
+    mccmnc_tuple: "405837"
+    mccmnc_tuple: "405838"
+    mccmnc_tuple: "405841"
+    mccmnc_tuple: "405842"
+    mccmnc_tuple: "405843"
+    mccmnc_tuple: "405932"
+  }
+}
+carrier_id {
+  canonical_id: 2265
+  carrier_name: "STEL"
+  carrier_attribute {
+    mccmnc_tuple: "405881"
+    mccmnc_tuple: "405882"
+    mccmnc_tuple: "405883"
+    mccmnc_tuple: "405884"
+    mccmnc_tuple: "405885"
+    mccmnc_tuple: "405886"
+  }
+}
+carrier_id {
+  canonical_id: 2266
+  carrier_name: "Cheers"
+  carrier_attribute {
+    mccmnc_tuple: "405912"
+    mccmnc_tuple: "405913"
+    mccmnc_tuple: "405914"
+    mccmnc_tuple: "405915"
+    mccmnc_tuple: "405916"
+    mccmnc_tuple: "405917"
+    mccmnc_tuple: "405918"
+    mccmnc_tuple: "405919"
+    mccmnc_tuple: "405920"
+    mccmnc_tuple: "405921"
+    mccmnc_tuple: "405922"
+    mccmnc_tuple: "405923"
+    mccmnc_tuple: "405930"
+  }
+}
+carrier_id {
+  canonical_id: 2267
+  carrier_name: "Tuyo"
+  carrier_attribute {
+    mccmnc_tuple: "712019"
+    mccmnc_tuple: "712190"
+  }
+}
+carrier_id {
+  canonical_id: 2268
+  carrier_name: "Viettel"
+  carrier_attribute {
+    mccmnc_tuple: "51403"
+  }
+}
+carrier_id {
+  canonical_id: 2270
+  carrier_name: "Telenet"
+  carrier_attribute {
+    mccmnc_tuple: "20601"
+    imsi_prefix_xpattern: "20601889"
+  }
+}
+carrier_id {
+  canonical_id: 2271
+  carrier_name: "Transatel"
+  carrier_attribute {
+    mccmnc_tuple: "20610"
+    spn: "BE-Transatel"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20610"
+    gid1: "BB00"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "22803"
+    spn: "CH-Transatel"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "22803"
+    gid1: "BB00"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "27077"
+    gid1: "BB00"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "27077"
+    spn: "LU-Transatel"
+  }
+}
+carrier_id {
+  canonical_id: 2272
+  carrier_name: "Auchan"
+  carrier_attribute {
+    mccmnc_tuple: "20810"
+    spn: "A MOBILE"
+  }
+}
+carrier_id {
+  canonical_id: 2273
+  carrier_name: "Reglo"
+  carrier_attribute {
+    mccmnc_tuple: "20810"
+    spn: "LeclercMobile"
+    spn: "RegloMobile"
+  }
+}
+carrier_id {
+  canonical_id: 2274
+  carrier_name: "La Poste"
+  carrier_attribute {
+    mccmnc_tuple: "20810"
+    gid1: "4C"
+  }
+}
+carrier_id {
+  canonical_id: 2275
+  carrier_name: "Darty"
+  carrier_attribute {
+    mccmnc_tuple: "20810"
+    gid1: "44"
+  }
+}
+carrier_id {
+  canonical_id: 2276
+  carrier_name: "Keyyo"
+  carrier_attribute {
+    mccmnc_tuple: "20810"
+    spn: "Keyyo Mobile"
+  }
+}
+carrier_id {
+  canonical_id: 2277
+  carrier_name: "Zero forfait"
+  carrier_attribute {
+    mccmnc_tuple: "20810"
+    spn: "ZERO FORFAIT"
+  }
+}
+carrier_id {
+  canonical_id: 2278
+  carrier_name: "R"
+  carrier_attribute {
+    mccmnc_tuple: "21406"
+    imsi_prefix_xpattern: "2140612"
+  }
+}
+carrier_id {
+  canonical_id: 2279
+  carrier_name: "eroskimovil"
+  carrier_attribute {
+    mccmnc_tuple: "21406"
+    imsi_prefix_xpattern: "2140606"
+  }
+}
+carrier_id {
+  canonical_id: 2282
+  carrier_name: "Noverca"
+  carrier_attribute {
+    mccmnc_tuple: "22201"
+    spn: "Noverca"
+  }
+}
+carrier_id {
+  canonical_id: 2283
+  carrier_name: "LIFE"
+  carrier_attribute {
+    mccmnc_tuple: "23433"
+    spn: "LIFE"
+  }
+}
+carrier_id {
+  canonical_id: 2284
+  carrier_name: "Telmore"
+  carrier_attribute {
+    mccmnc_tuple: "23801"
+    spn: "TELMORE"
+  }
+}
+carrier_id {
+  canonical_id: 2285
+  carrier_name: "Call Me"
+  carrier_attribute {
+    mccmnc_tuple: "23820"
+    spn: "Call me"
+  }
+}
+carrier_id {
+  canonical_id: 2286
+  carrier_name: "DLG Tele"
+  carrier_attribute {
+    mccmnc_tuple: "23820"
+    spn: "DLG Tele"
+  }
+}
+carrier_id {
+  canonical_id: 2287
+  carrier_name: "Halebop"
+  carrier_attribute {
+    mccmnc_tuple: "24001"
+    spn: "halebop"
+  }
+}
+carrier_id {
+  canonical_id: 2288
+  carrier_name: "GSC"
+  carrier_attribute {
+    mccmnc_tuple: "311590"
+    spn: "gsc"
+  }
+}
+carrier_id {
+  canonical_id: 2289
+  carrier_name: "Cable & Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "348170"
+  }
+}
+carrier_id {
+  canonical_id: 2290
+  carrier_name: "Cable & Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "366110"
+  }
+}
+carrier_id {
+  canonical_id: 2291
+  carrier_name: "Cable & Wireless West Indies Ltd (Turks & Caicos)"
+  carrier_attribute {
+    mccmnc_tuple: "376350"
+  }
+}
+carrier_id {
+  canonical_id: 2292
+  carrier_name: "Cable & Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "354860"
+  }
+}
+carrier_id {
+  canonical_id: 2293
+  carrier_name: "Cable & Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "358110"
+  }
+}
+carrier_id {
+  canonical_id: 2294
+  carrier_name: "Cable & Wireless (St. Vincent & the Grenadines) Ltd"
+  carrier_attribute {
+    mccmnc_tuple: "360110"
+  }
+}
+carrier_id {
+  canonical_id: 2295
+  carrier_name: "Cable & Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "365840"
+  }
+}
+carrier_id {
+  canonical_id: 2297
+  carrier_name: "Happy"
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+    spn: "Happy"
+  }
+}
+carrier_id {
+  canonical_id: 2298
+  carrier_name: "RACC"
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+    spn: "RACC"
+  }
+}
+carrier_id {
+  canonical_id: 2299
+  carrier_name: "CABLE movil"
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+    spn: "CABLE movil"
+  }
+}
+carrier_id {
+  canonical_id: 2301
+  carrier_name: "Ibercom"
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+    spn: "Ibercom"
+  }
+}
+carrier_id {
+  canonical_id: 2303
+  carrier_name: "PosteMobile"
+  carrier_attribute {
+    mccmnc_tuple: "22210"
+    spn: "PosteMobile"
+  }
+}
+carrier_id {
+  canonical_id: 2304
+  carrier_name: "ERG"
+  carrier_attribute {
+    mccmnc_tuple: "22210"
+    spn: "ERG"
+  }
+}
+carrier_id {
+  canonical_id: 2308
+  carrier_name: "Sainsbury's"
+  carrier_attribute {
+    mccmnc_tuple: "23415"
+    spn: "Sainsbury's"
+  }
+}
+carrier_id {
+  canonical_id: 2309
+  carrier_name: "Lebara"
+  carrier_attribute {
+    mccmnc_tuple: "23415"
+    spn: "Lebara"
+  }
+}
+carrier_id {
+  canonical_id: 2310
+  carrier_name: "Debitel"
+  carrier_attribute {
+    mccmnc_tuple: "26201"
+    spn: "debitel"
+  }
+}
+carrier_id {
+  canonical_id: 2315
+  carrier_name: "Norvado"
+  carrier_attribute {
+    mccmnc_tuple: "311500"
+    spn: "Norvado Wireless"
+    spn: "Norvado Wireless RPA"
+    spn: "Norvado Wireless RPT"
+    spn: "Norvado Wireless RPO"
+  }
+}
+carrier_id {
+  canonical_id: 2316
+  carrier_name: "Mosaic Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "311500"
+    spn: "Mosaic RPA"
+    spn: "Mosaic Mobile"
+    spn: "Mosaic RPT"
+    spn: "Mosaic RPO"
+  }
+}
+carrier_id {
+  canonical_id: 2317
+  carrier_name: "Nemont"
+  carrier_attribute {
+    mccmnc_tuple: "311350"
+    spn: "nemont"
+  }
+}
+carrier_id {
+  canonical_id: 2318
+  carrier_name: "Bravado wireless"
+  carrier_attribute {
+    mccmnc_tuple: "311140"
+    spn: "sprocket"
+  }
+}
+carrier_id {
+  canonical_id: 2319
+  carrier_name: "Element Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "311070"
+    spn: "elementmobile"
+  }
+}
+carrier_id {
+  canonical_id: 2320
+  carrier_name: "strata"
+  carrier_attribute {
+    mccmnc_tuple: "310960"
+    spn: "strata"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "312290"
+  }
+}
+carrier_id {
+  canonical_id: 2321
+  carrier_name: "southcentral"
+  carrier_attribute {
+    mccmnc_tuple: "310960"
+    spn: "southcentral"
+  }
+}
+carrier_id {
+  canonical_id: 2322
+  carrier_name: "snakeriver"
+  carrier_attribute {
+    mccmnc_tuple: "310960"
+    spn: "snakeriver"
+  }
+}
+carrier_id {
+  canonical_id: 2323
+  carrier_name: "silverstar"
+  carrier_attribute {
+    mccmnc_tuple: "310960"
+    spn: "silverstar"
+  }
+}
+carrier_id {
+  canonical_id: 2324
+  carrier_name: "NNTC Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310960"
+    spn: "nntcwire"
+  }
+}
+carrier_id {
+  canonical_id: 2325
+  carrier_name: "Clear Sky Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310820"
+    spn: "nepa"
+  }
+}
+carrier_id {
+  canonical_id: 2326
+  carrier_name: "EMnify"
+  carrier_attribute {
+    mccmnc_tuple: "53703"
+    mccmnc_tuple: "29505"
+    spn: "EMnify"
+  }
+}
+carrier_id {
+  canonical_id: 2327
+  carrier_name: "Telemach"
+  carrier_attribute {
+    mccmnc_tuple: "29370"
+    imsi_prefix_xpattern: "29370029"
+  }
+}
+carrier_id {
+  canonical_id: 2328
+  carrier_name: "Fonic Prepaid"
+  carrier_attribute {
+    mccmnc_tuple: "26207"
+    imsi_prefix_xpattern: "26207520"
+  }
+}
+carrier_id {
+  canonical_id: 2330
+  carrier_name: "Tchibo"
+  carrier_attribute {
+    mccmnc_tuple: "26207"
+    imsi_prefix_xpattern: "26207500"
+  }
+}
+carrier_id {
+  canonical_id: 2331
+  carrier_name: "Djuice"
+  carrier_attribute {
+    mccmnc_tuple: "25503"
+    spn: "djuice"
+  }
+}
+carrier_id {
+  canonical_id: 2332
+  carrier_name: "Send"
+  carrier_attribute {
+    mccmnc_tuple: "24801"
+    imsi_prefix_xpattern: "248010x2"
+    imsi_prefix_xpattern: "248010x3"
+  }
+}
+carrier_id {
+  canonical_id: 2333
+  carrier_name: "Ventelo"
+  carrier_attribute {
+    mccmnc_tuple: "24201"
+    imsi_prefix_xpattern: "24201700"
+  }
+}
+carrier_id {
+  canonical_id: 2334
+  carrier_name: "Chess"
+  carrier_attribute {
+    mccmnc_tuple: "24202"
+    imsi_prefix_xpattern: "2420256"
+  }
+}
+carrier_id {
+  canonical_id: 2335
+  carrier_name: "Virgin"
+  carrier_attribute {
+    mccmnc_tuple: "65507"
+    imsi_prefix_xpattern: "6550710"
+  }
+}
+carrier_id {
+  canonical_id: 2337
+  carrier_name: "Movil exito"
+  carrier_attribute {
+    mccmnc_tuple: "732103"
+    mccmnc_tuple: "732111"
+    spn: "movil exito"
+  }
+}
+carrier_id {
+  canonical_id: 2338
+  carrier_name: "UNE"
+  carrier_attribute {
+    mccmnc_tuple: "732103"
+    mccmnc_tuple: "732111"
+    spn: "UNE"
+  }
+}
+carrier_id {
+  canonical_id: 2339
+  carrier_name: "Virgin Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "732123"
+    spn: "Virgin Mobile"
+  }
+}
+carrier_id {
+  canonical_id: 2340
+  carrier_name: "Google CBRS"
+  carrier_attribute {
+    mccmnc_tuple: "312580"
+  }
+}
+carrier_id {
+  canonical_id: 2345
+  carrier_name: "Mobitel"
+  carrier_attribute {
+    mccmnc_tuple: "41845"
+  }
+}
+carrier_id {
+  canonical_id: 2346
+  carrier_name: "Unitel"
+  carrier_attribute {
+    mccmnc_tuple: "45703"
+  }
+}
+carrier_id {
+  canonical_id: 2347
+  carrier_name: "Unitel"
+  carrier_attribute {
+    mccmnc_tuple: "42888"
+  }
+}
+carrier_id {
+  canonical_id: 2348
+  carrier_name: "Libya Phone"
+  carrier_attribute {
+    mccmnc_tuple: "60603"
+  }
+}
+carrier_id {
+  canonical_id: 2349
+  carrier_name: "YemenMobile"
+  carrier_attribute {
+    mccmnc_tuple: "42103"
+    mccmnc_tuple: "42111"
+    mccmnc_tuple: "42122"
+  }
+}
+carrier_id {
+  canonical_id: 2350
+  carrier_name: "B-Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "52802"
+  }
+}
+carrier_id {
+  canonical_id: 2351
+  carrier_name: "AGMS"
+  carrier_attribute {
+    mccmnc_tuple: "20465"
+  }
+}
+carrier_id {
+  canonical_id: 2352
+  carrier_name: "MTCE"
+  carrier_attribute {
+    mccmnc_tuple: "43270"
+  }
+}
+carrier_id {
+  canonical_id: 2353
+  carrier_name: "SK Telink"
+  carrier_attribute {
+    mccmnc_tuple: "45011"
+  }
+}
+carrier_id {
+  canonical_id: 2354
+  carrier_name: "Smart"
+  carrier_attribute {
+    mccmnc_tuple: "70299"
+  }
+}
+carrier_id {
+  canonical_id: 2355
+  carrier_name: "Smart Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "64207"
+  }
+}
+carrier_id {
+  canonical_id: 2356
+  carrier_name: "Digicel"
+  carrier_attribute {
+    mccmnc_tuple: "34877"
+    mccmnc_tuple: "348770"
+  }
+}
+carrier_id {
+  canonical_id: 2357
+  carrier_name: "Tuenti"
+  carrier_attribute {
+    mccmnc_tuple: "21405"
+    spn: "Tuenti"
+  }
+}
+carrier_id {
+  canonical_id: 2358
+  carrier_name: "Farzanegan Pars"
+  carrier_attribute {
+    mccmnc_tuple: "43293"
+  }
+}
+carrier_id {
+  canonical_id: 2359
+  carrier_name: "Bitel"
+  carrier_attribute {
+    mccmnc_tuple: "71615"
+  }
+}
+carrier_id {
+  canonical_id: 2360
+  carrier_name: "Telefonica"
+  carrier_attribute {
+    mccmnc_tuple: "26203"
+    gid1: "010301FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "010901FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+  }
+}
+carrier_id {
+  canonical_id: 2361
+  carrier_name: "o2"
+  carrier_attribute {
+    mccmnc_tuple: "26207"
+    gid1: "010301FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+    gid1: "010901FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+  }
+}
+carrier_id {
+  canonical_id: 2362
+  carrier_name: "Vodacom"
+  carrier_attribute {
+    mccmnc_tuple: "64004"
+  }
+}
+carrier_id {
+  canonical_id: 2363
+  carrier_name: "Crnogorski Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "29702"
+  }
+}
+carrier_id {
+  canonical_id: 2364
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "53001"
+  }
+}
+carrier_id {
+  canonical_id: 2365
+  carrier_name: "Hrvatski Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "21901"
+    mccmnc_tuple: "21920"
+  }
+}
+carrier_id {
+  canonical_id: 2366
+  carrier_name: "Swisscom"
+  carrier_attribute {
+    mccmnc_tuple: "22801"
+  }
+}
+carrier_id {
+  canonical_id: 2367
+  carrier_name: "T-Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "26002"
+  }
+}
+carrier_id {
+  canonical_id: 2368
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "27801"
+  }
+}
+carrier_id {
+  canonical_id: 2369
+  carrier_name: "Orange"
+  carrier_attribute {
+    mccmnc_tuple: "21403"
+  }
+}
+carrier_id {
+  canonical_id: 2378
+  carrier_name: "Vi"
+  carrier_attribute {
+    mccmnc_tuple: "40401"
+    mccmnc_tuple: "40405"
+    mccmnc_tuple: "40411"
+    mccmnc_tuple: "40413"
+    mccmnc_tuple: "40415"
+    mccmnc_tuple: "40420"
+    mccmnc_tuple: "40427"
+    mccmnc_tuple: "40430"
+    mccmnc_tuple: "40443"
+    mccmnc_tuple: "40446"
+    mccmnc_tuple: "40460"
+    mccmnc_tuple: "40484"
+    mccmnc_tuple: "40486"
+    mccmnc_tuple: "40488"
+    mccmnc_tuple: "40566"
+    mccmnc_tuple: "40567"
+    mccmnc_tuple: "405750"
+    mccmnc_tuple: "405751"
+    mccmnc_tuple: "405752"
+    mccmnc_tuple: "405753"
+    mccmnc_tuple: "405754"
+    mccmnc_tuple: "405755"
+    mccmnc_tuple: "405756"
+  }
+}
+carrier_id {
+  canonical_id: 2380
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "60202"
+  }
+}
+carrier_id {
+  canonical_id: 2381
+  carrier_name: "Vodacom"
+  carrier_attribute {
+    mccmnc_tuple: "64304"
+  }
+}
+carrier_id {
+  canonical_id: 2383
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "62002"
+  }
+}
+carrier_id {
+  canonical_id: 2385
+  carrier_name: "Slovak Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "23102"
+  }
+}
+carrier_id {
+  canonical_id: 2386
+  carrier_name: "T-Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "20416"
+  }
+}
+carrier_id {
+  canonical_id: 2387
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "27201"
+  }
+}
+carrier_id {
+  canonical_id: 2391
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "22601"
+  }
+}
+carrier_id {
+  canonical_id: 2392
+  carrier_name: "VCL"
+  carrier_attribute {
+    mccmnc_tuple: "65101"
+  }
+}
+carrier_id {
+  canonical_id: 2393
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "42702"
+  }
+}
+carrier_id {
+  canonical_id: 2394
+  carrier_name: "T-Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "23001"
+  }
+}
+carrier_id {
+  canonical_id: 2395
+  carrier_name: "Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "26201"
+    mccmnc_tuple: "26206"
+  }
+}
+carrier_id {
+  canonical_id: 2396
+  carrier_name: "Mkedonski Telecom AD Skopje"
+  carrier_attribute {
+    mccmnc_tuple: "29401"
+  }
+}
+carrier_id {
+  canonical_id: 2397
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "26202"
+  }
+}
+carrier_id {
+  canonical_id: 2398
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "23003"
+  }
+}
+carrier_id {
+  canonical_id: 2399
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "20205"
+  }
+}
+carrier_id {
+  canonical_id: 2401
+  carrier_name: "Magyar Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "21630"
+  }
+}
+carrier_id {
+  canonical_id: 2403
+  carrier_name: "Lycamobile"
+  carrier_attribute {
+    mccmnc_tuple: "26009"
+    spn: "Lycamobile"
+  }
+}
+carrier_id {
+  canonical_id: 2404
+  carrier_name: "Lycamobile"
+  carrier_attribute {
+    mccmnc_tuple: "23208"
+    spn: "Lycamobile"
+  }
+}
+carrier_id {
+  canonical_id: 2405
+  carrier_name: "Lycamobile"
+  carrier_attribute {
+    mccmnc_tuple: "24012"
+    spn: "Lycamobile"
+  }
+}
+carrier_id {
+  canonical_id: 2406
+  carrier_name: "Rabo Mobiel Int."
+  carrier_attribute {
+    mccmnc_tuple: "20408"
+    spn: "Rabo Mobiel"
+  }
+}
+carrier_id {
+  canonical_id: 2407
+  carrier_name: "OCN MOBILE ONE"
+  carrier_attribute {
+    mccmnc_tuple: "44010"
+    preferred_apn: "lte-d.ocn.ne.jp"
+    preferred_apn: "lte.ocn.ne.jp"
+    preferred_apn: "ocn.ne.jp"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "44013"
+  }
+}
+carrier_id {
+  canonical_id: 2408
+  carrier_name: "Vmax Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "46609"
+  }
+}
+carrier_id {
+  canonical_id: 2409
+  carrier_name: "Dishnet Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "40448"
+  }
+}
+carrier_id {
+  canonical_id: 2411
+  carrier_name: "Wireless City Planning"
+  carrier_attribute {
+    mccmnc_tuple: "44100"
+  }
+}
+carrier_id {
+  canonical_id: 2412
+  carrier_name: "ACeS"
+  carrier_attribute {
+    mccmnc_tuple: "52020"
+  }
+}
+carrier_id {
+  canonical_id: 2413
+  carrier_name: "TOT"
+  carrier_attribute {
+    mccmnc_tuple: "52047"
+  }
+}
+carrier_id {
+  canonical_id: 2414
+  carrier_name: "Airtel Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "302290"
+  }
+}
+carrier_id {
+  canonical_id: 2415
+  carrier_name: "Fonyou Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "21420"
+  }
+}
+carrier_id {
+  canonical_id: 2416
+  carrier_name: "Fastweb SpA"
+  carrier_attribute {
+    mccmnc_tuple: "22208"
+  }
+}
+carrier_id {
+  canonical_id: 2417
+  carrier_name: "FIZZ"
+  carrier_attribute {
+    mccmnc_tuple: "302500"
+    gid1: "55"
+  }
+}
+carrier_id {
+  canonical_id: 2418
+  carrier_name: "TalkMobile"
+  carrier_attribute {
+    mccmnc_tuple: "23415"
+    spn: ""
+    spn: "Talkmobile"
+    gid1: "C1"
+  }
+}
+carrier_id {
+  canonical_id: 2419
+  carrier_name: "EE Business"
+  carrier_attribute {
+    mccmnc_tuple: "23433"
+    gid1: "ec"
+    gid1: "ecff"
+  }
+}
+carrier_id {
+  canonical_id: 2420
+  carrier_name: "ION Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "21434"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21405"
+    imsi_prefix_xpattern: "214050104"
+  }
+}
+carrier_id {
+  canonical_id: 2421
+  carrier_name: "Testing US"
+  carrier_attribute {
+    mccmnc_tuple: "310014"
+    mccmnc_tuple: "311400"
+  }
+}
+carrier_id {
+  canonical_id: 2422
+  carrier_name: "MTX"
+  carrier_attribute {
+    mccmnc_tuple: "27002"
+  }
+}
+carrier_id {
+  canonical_id: 2423
+  carrier_name: "Plintron IT"
+  carrier_attribute {
+    mccmnc_tuple: "22254"
+    spn: "Plintron"
+  }
+}
+carrier_id {
+  canonical_id: 2424
+  carrier_name: "Plintron AT"
+  carrier_attribute {
+    mccmnc_tuple: "23222"
+    spn: "Plintron"
+  }
+}
+carrier_id {
+  canonical_id: 2425
+  carrier_name: "iD Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "23420"
+    gid1: "0305"
+  }
+}
+carrier_id {
+  canonical_id: 2427
+  carrier_name: "京东通信"
+  carrier_attribute {
+    mccmnc_tuple: "46000"
+    spn: "京东通信"
+  }
+}
+carrier_id {
+  canonical_id: 2428
+  carrier_name: "Telin"
+  carrier_attribute {
+    mccmnc_tuple: "45400"
+    imsi_prefix_xpattern: "454006081"
+  }
+}
+carrier_id {
+  canonical_id: 2429
+  carrier_name: "Rakuten Mobile(MNO)"
+  carrier_attribute {
+    mccmnc_tuple: "44011"
+  }
+}
+carrier_id {
+  canonical_id: 2430
+  carrier_name: "Syma Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "20801"
+    spn: "SYMA"
+  }
+}
+carrier_id {
+  canonical_id: 2432
+  carrier_name: "nuromobile"
+  carrier_attribute {
+    mccmnc_tuple: "44010"
+    preferred_apn: "so-net.jp"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "44051"
+    preferred_apn: "so-net.jp"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "44020"
+    preferred_apn: "so-net.jp"
+  }
+}
+carrier_id {
+  canonical_id: 2433
+  carrier_name: "Assurance Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    mccmnc_tuple: "311490"
+    mccmnc_tuple: "312530"
+    gid1: "000006"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310240"
+    mccmnc_tuple: "311490"
+    mccmnc_tuple: "311660"
+    mccmnc_tuple: "311882"
+    mccmnc_tuple: "312250"
+    gid1: "1A53"
+  }
+}
+carrier_id {
+  canonical_id: 2434
+  carrier_name: "giga_sg"
+  carrier_attribute {
+    mccmnc_tuple: "52505"
+    spn: "giga"
+  }
+}
+carrier_id {
+  canonical_id: 2435
+  carrier_name: "Xplornet"
+  carrier_attribute {
+    mccmnc_tuple: "302130"
+    mccmnc_tuple: "302131"
+  }
+}
+carrier_id {
+  canonical_id: 2436
+  carrier_name: "izi"
+  carrier_attribute {
+    mccmnc_tuple: "40101"
+    imsi_prefix_xpattern: "40101568"
+  }
+}
+carrier_id {
+  canonical_id: 2437
+  carrier_name: "Wind Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "37005"
+  }
+}
+carrier_id {
+  canonical_id: 2438
+  carrier_name: "Daily Telecom Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "22210"
+    spn: "Daily Telecom"
+  }
+}
+carrier_id {
+  canonical_id: 2439
+  carrier_name: "VERY"
+  carrier_attribute {
+    mccmnc_tuple: "22288"
+    mccmnc_tuple: "22299"
+    gid1: "0000000099"
+  }
+}
+carrier_id {
+  canonical_id: 2442
+  carrier_name: "Digi Spain"
+  carrier_attribute {
+    mccmnc_tuple: "21422"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21405"
+    mccmnc_tuple: "22605"
+    gid1: "44474553"
+  }
+}
+carrier_id {
+  canonical_id: 2443
+  carrier_name: "Digi Italy"
+  carrier_attribute {
+    mccmnc_tuple: "22236"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "21405"
+    mccmnc_tuple: "22605"
+    gid1: "44474954"
+  }
+}
+carrier_id {
+  canonical_id: 2444
+  carrier_name: "Next Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "25047"
+  }
+}
+carrier_id {
+  canonical_id: 2445
+  carrier_name: "rain"
+  carrier_attribute {
+    mccmnc_tuple: "65538"
+    mccmnc_tuple: "65519"
+    mccmnc_tuple: "65573"
+    mccmnc_tuple: "65574"
+  }
+}
+carrier_id {
+  canonical_id: 2446
+  carrier_name: "Sberbank"
+  carrier_attribute {
+    mccmnc_tuple: "25050"
+  }
+}
+carrier_id {
+  canonical_id: 2447
+  carrier_name: "IDC"
+  carrier_attribute {
+    mccmnc_tuple: "25915"
+    spn: "IDC"
+  }
+}
+carrier_id {
+  canonical_id: 2448
+  carrier_name: "VTB Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "25026"
+  }
+}
+carrier_id {
+  canonical_id: 2449
+  carrier_name: "Spectrum+"
+  carrier_attribute {
+    mccmnc_tuple: "314020"
+  }
+}
+carrier_id {
+  canonical_id: 2450
+  carrier_name: "SUN Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "45400"
+    gid1: "01030000FFFFFFFF"
+  }
+}
+carrier_id {
+  canonical_id: 2451
+  carrier_name: "Tune Talk"
+  carrier_attribute {
+    mccmnc_tuple: "50219"
+    imsi_prefix_xpattern: "5021955"
+  }
+}
+carrier_id {
+  canonical_id: 2452
+  carrier_name: "WEB CoopVoce"
+  carrier_attribute {
+    mccmnc_tuple: "22253"
+  }
+}
+carrier_id {
+  canonical_id: 2453
+  carrier_name: "Connect"
+  carrier_attribute {
+    mccmnc_tuple: "41515"
+  }
+}
+carrier_id {
+  canonical_id: 2454
+  carrier_name: "Annatel"
+  carrier_attribute {
+    mccmnc_tuple: "42526"
+  }
+}
+carrier_id {
+  canonical_id: 2455
+  carrier_name: "homobile_it"
+  carrier_attribute {
+    mccmnc_tuple: "22210"
+    spn: "ho."
+  }
+}
+carrier_id {
+  canonical_id: 2457
+  carrier_name: "Nordic Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "23004"
+    imsi_prefix_xpattern: "230040"
+  }
+}
+carrier_id {
+  canonical_id: 2458
+  carrier_name: "Yota Nicaragua"
+  carrier_attribute {
+    mccmnc_tuple: "71070"
+  }
+}
+carrier_id {
+  canonical_id: 2459
+  carrier_name: "GigSky"
+  carrier_attribute {
+    mccmnc_tuple: "312870"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "22201"
+    spn: "GigSky"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310380"
+    imsi_prefix_xpattern: "3103805"
+    spn: "GigSky"
+    gid1: "6F"
+    gid1: "6E"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "23801"
+    imsi_prefix_xpattern: "23801395"
+    spn: "GigSky"
+    gid1: "6F"
+    gid1: "6E"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "24007"
+    imsi_prefix_xpattern: "240075614"
+    spn: "GigSky"
+    gid1: "6F"
+    gid1: "6E"
+  }
+}
+carrier_id {
+  canonical_id: 2460
+  carrier_name: "Shaw Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "302490"
+    imsi_prefix_xpattern: "3024904"
+    gid1: "53"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "302490"
+    imsi_prefix_xpattern: "3024905"
+    gid1: "53"
+  }
+}
+carrier_id {
+  canonical_id: 2461
+  carrier_name: "Voiceworks DE"
+  carrier_attribute {
+    mccmnc_tuple: "26220"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "26203"
+    imsi_prefix_xpattern: "26203483"
+  }
+}
+carrier_id {
+  canonical_id: 2463
+  carrier_name: "SevenNet Layers"
+  carrier_attribute {
+    mccmnc_tuple: "41877"
+  }
+}
+carrier_id {
+  canonical_id: 2464
+  carrier_name: "Mobi"
+  carrier_attribute {
+    mccmnc_tuple: "313460"
+  }
+}
+carrier_id {
+  canonical_id: 2467
+  carrier_name: "Emergency Services Network"
+  carrier_attribute {
+    mccmnc_tuple: "23471"
+  }
+}
+carrier_id {
+  canonical_id: 2468
+  carrier_name: "Tele2"
+  carrier_attribute {
+    mccmnc_tuple: "20416"
+    gid1: "8F"
+    gid1: "4E4C"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20416"
+    spn: "Tele2 NL"
+  }
+}
+carrier_id {
+  canonical_id: 2469
+  carrier_name: "ALTAN - Internal Use"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+  }
+}
+carrier_id {
+  canonical_id: 2470
+  carrier_name: "ALTAN - IENTC"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "IENTC"
+  }
+}
+carrier_id {
+  canonical_id: 2471
+  carrier_name: "ALTAN - NeWWW"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "NeWWW"
+  }
+}
+carrier_id {
+  canonical_id: 2472
+  carrier_name: "Travelfy"
+  carrier_attribute {
+    mccmnc_tuple: "52505"
+    imsi_prefix_xpattern: "5250530996"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "23410"
+    imsi_prefix_xpattern: "2341040991"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "732123"
+    imsi_prefix_xpattern: "7321232010"
+  }
+}
+carrier_id {
+  canonical_id: 2473
+  carrier_name: "MEGACABLE"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "Mega4.5 G"
+  }
+}
+carrier_id {
+  canonical_id: 2474
+  carrier_name: "NETWEY"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "NETWEY"
+  }
+}
+carrier_id {
+  canonical_id: 2475
+  carrier_name: "RETEMEX"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "RETEMEX"
+  }
+}
+carrier_id {
+  canonical_id: 2476
+  carrier_name: "WALMART"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "BAIT"
+  }
+}
+carrier_id {
+  canonical_id: 2477
+  carrier_name: "IUSACOMM"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "IUSATEL"
+  }
+}
+carrier_id {
+  canonical_id: 2478
+  carrier_name: "CFE"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "CFE TEIPT"
+  }
+}
+carrier_id {
+  canonical_id: 2479
+  carrier_name: "INTEN"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "INTEN"
+  }
+}
+carrier_id {
+  canonical_id: 2480
+  carrier_name: "DIVERACY"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "NEMI"
+  }
+}
+carrier_id {
+  canonical_id: 2481
+  carrier_name: "DIRI"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "DIRI"
+  }
+}
+carrier_id {
+  canonical_id: 2482
+  carrier_name: "TOPOS"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "TURBORED"
+  }
+}
+carrier_id {
+  canonical_id: 2483
+  carrier_name: "GURUWEB"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "Gurucomm"
+  }
+}
+carrier_id {
+  canonical_id: 2484
+  carrier_name: "UBIX"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "Ubix"
+  }
+}
+carrier_id {
+  canonical_id: 2485
+  carrier_name: "ROCKETEL"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "PagaPhone"
+  }
+}
+carrier_id {
+  canonical_id: 2486
+  carrier_name: "Redpotencia"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "Redpotencia"
+  }
+}
+carrier_id {
+  canonical_id: 2487
+  carrier_name: "ADDINTELI"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "CHAMO-MOVIL"
+    spn: "BYPLUS"
+  }
+}
+carrier_id {
+  canonical_id: 2488
+  carrier_name: "IZZI"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "izzi"
+  }
+}
+carrier_id {
+  canonical_id: 2489
+  carrier_name: "ADM"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "MISTRAL"
+  }
+}
+carrier_id {
+  canonical_id: 2490
+  carrier_name: "ADS"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "MEXFON"
+  }
+}
+carrier_id {
+  canonical_id: 2491
+  carrier_name: "YONDER"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "YO"
+  }
+}
+carrier_id {
+  canonical_id: 2492
+  carrier_name: "Arlonet"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "Arlonet"
+  }
+}
+carrier_id {
+  canonical_id: 2493
+  carrier_name: "TRIDEX"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "VALOR"
+  }
+}
+carrier_id {
+  canonical_id: 2494
+  carrier_name: "WiMO"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "WiMO"
+  }
+}
+carrier_id {
+  canonical_id: 2495
+  carrier_name: "OUI"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "OUI"
+  }
+}
+carrier_id {
+  canonical_id: 2496
+  carrier_name: "FREEDOMPOP"
+  carrier_attribute {
+    mccmnc_tuple: "334140"
+    spn: "FreedomPop"
+  }
+}
+carrier_id {
+  canonical_id: 2497
+  carrier_name: "Vodafone GDSP"
+  carrier_attribute {
+    mccmnc_tuple: "90128"
+  }
+}
+carrier_id {
+  canonical_id: 2498
+  carrier_name: "Optimum"
+  carrier_attribute {
+    mccmnc_tuple: "313390"
+  }
+}
+carrier_id {
+  canonical_id: 2499
+  carrier_name: "Belong"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "Belong"
+  }
+}
+carrier_id {
+  canonical_id: 2500
+  carrier_name: "Telechoice"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "TeleChoice"
+  }
+}
+carrier_id {
+  canonical_id: 2501
+  carrier_name: "Woolworths"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "Woolworths"
+  }
+}
+carrier_id {
+  canonical_id: 2502
+  carrier_name: "NuMobile"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "nu mobile"
+  }
+}
+carrier_id {
+  canonical_id: 2503
+  carrier_name: "Boost"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "BOOST"
+  }
+}
+carrier_id {
+  canonical_id: 2504
+  carrier_name: "Liberty Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "313790"
+  }
+}
+carrier_id {
+  canonical_id: 2505
+  carrier_name: "OptimERA Wireless"
+  carrier_attribute {
+    mccmnc_tuple: "313380"
+    spn: "OptimERA"
+  }
+}
+carrier_id {
+  canonical_id: 2506
+  carrier_name: "Alestra Servicios Moviles"
+  carrier_attribute {
+    mccmnc_tuple: "334130"
+  }
+}
+carrier_id {
+  canonical_id: 2507
+  carrier_name: "UPC"
+  carrier_attribute {
+    mccmnc_tuple: "22853"
+    gid1: "75636831FFFFFFFFFF"
+  }
+}
+carrier_id {
+  canonical_id: 2508
+  carrier_name: "Virgin Media Ireland"
+  carrier_attribute {
+    mccmnc_tuple: "27215"
+    gid1: "75696531FFFFFFFFFF"
+    gid2: "75696532FFFFFFFFFF"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20601"
+    imsi_prefix_xpattern: "206018016"
+  }
+}
+carrier_id {
+  canonical_id: 2509
+  carrier_name: "Evolve"
+  carrier_attribute {
+    mccmnc_tuple: "310990"
+  }
+}
+carrier_id {
+  canonical_id: 2510
+  carrier_name: "Melita"
+  carrier_attribute {
+    mccmnc_tuple: "27877"
+  }
+}
+carrier_id {
+  canonical_id: 2511
+  carrier_name: "Kena"
+  carrier_attribute {
+    mccmnc_tuple: "22207"
+  }
+}
+carrier_id {
+  canonical_id: 2512
+  carrier_name: "Goodspeed"
+  carrier_attribute {
+    mccmnc_tuple: "24042"
+    gid1: "C5"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "23203"
+    gid1: "C5"
+  }
+}
+carrier_id {
+  canonical_id: 2514
+  carrier_name: "povo"
+  carrier_attribute {
+    mccmnc_tuple: "44051"
+    mccmnc_tuple: "44054"
+    gid1: "26"
+  }
+}
+carrier_id {
+  canonical_id: 2515
+  carrier_name: "J:COM MOBILE"
+  carrier_attribute {
+    mccmnc_tuple: "44051"
+    mccmnc_tuple: "44054"
+    gid1: "22"
+  }
+}
+carrier_id {
+  canonical_id: 2516
+  carrier_name: "HMD Connect Pro"
+  carrier_attribute {
+    mccmnc_tuple: "22201"
+    spn: "hmd connect"
+  }
+}
+carrier_id {
+  canonical_id: 2517
+  carrier_name: "Dish"
+  carrier_attribute {
+    mccmnc_tuple: "313340"
+    gid1: "6530"
+  }
+}
+carrier_id {
+  canonical_id: 2518
+  carrier_name: "Boost Mobile - MNO"
+  carrier_attribute {
+    mccmnc_tuple: "313340"
+    gid1: "6332"
+  }
+}
+carrier_id {
+  canonical_id: 2519
+  carrier_name: "Boost Mobile - MVNO1"
+  carrier_attribute {
+    mccmnc_tuple: "310240"
+    gid1: "6432"
+  }
+}
+carrier_id {
+  canonical_id: 2520
+  carrier_name: "Republic - MNO"
+  carrier_attribute {
+    mccmnc_tuple: "313340"
+    gid1: "6630"
+  }
+}
+carrier_id {
+  canonical_id: 2521
+  carrier_name: "Ting - MNO"
+  carrier_attribute {
+    mccmnc_tuple: "313340"
+    gid1: "7330"
+  }
+}
+carrier_id {
+  canonical_id: 2522
+  carrier_name: "Republic - MVNO1"
+  carrier_attribute {
+    mccmnc_tuple: "310240"
+    gid1: "6436"
+  }
+}
+carrier_id {
+  canonical_id: 2523
+  carrier_name: "Ting - MVNO1"
+  carrier_attribute {
+    mccmnc_tuple: "310240"
+    gid1: "6430"
+  }
+}
+carrier_id {
+  canonical_id: 2524
+  carrier_name: "Erate"
+  carrier_attribute {
+    mccmnc_tuple: "24215"
+    gid1: "0e"
+  }
+}
+carrier_id {
+  canonical_id: 2525
+  carrier_name: "Boost Mobile - MVNO2"
+  carrier_attribute {
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "311180"
+    gid1: "3432"
+  }
+}
+carrier_id {
+  canonical_id: 2526
+  carrier_name: "Ting - MVNO2"
+  carrier_attribute {
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "311180"
+    gid1: "3430"
+  }
+}
+carrier_id {
+  canonical_id: 2527
+  carrier_name: "Republic - MVNO2"
+  carrier_attribute {
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "311180"
+    gid1: "3436"
+  }
+}
+carrier_id {
+  canonical_id: 2528
+  carrier_name: "Project Genesis - MNO"
+  carrier_attribute {
+    mccmnc_tuple: "313340"
+    gid1: "6538"
+  }
+}
+carrier_id {
+  canonical_id: 2529
+  carrier_name: "DOCOMO MVNO"
+  carrier_attribute {
+    mccmnc_tuple: "44010"
+  }
+}
+carrier_id {
+  canonical_id: 2530
+  carrier_name: "Simpel"
+  carrier_attribute {
+    mccmnc_tuple: "20416"
+    gid1: "2F"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "20416"
+    spn: "Simpel"
+  }
+}
+carrier_id {
+  canonical_id: 2531
+  carrier_name: "TANGO"
+  carrier_attribute {
+    mccmnc_tuple: "23453"
+    mccmnc_tuple: "313770"
+  }
+}
+carrier_id {
+  canonical_id: 2532
+  carrier_name: "Xfinity MSO"
+  carrier_attribute {
+    mccmnc_tuple: "314200"
+  }
+}
+carrier_id {
+  canonical_id: 2533
+  carrier_name: "ASTCA"
+  carrier_attribute {
+    mccmnc_tuple: "311780"
+  }
+}
+carrier_id {
+  canonical_id: 2534
+  carrier_name: "Boost Infinite - MVNO"
+  carrier_attribute {
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "311180"
+    gid1: "3434"
+  }
+}
+carrier_id {
+  canonical_id: 2535
+  carrier_name: "OptiTel"
+  carrier_attribute {
+    mccmnc_tuple: "50552"
+  }
+}
+carrier_id {
+  canonical_id: 2536
+  carrier_name: "1&1"
+  carrier_attribute {
+    mccmnc_tuple: "26223"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "26207"
+    gid1: "118004"
+    gid1: "118006"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "26207"
+    imsi_prefix_xpattern: "26207414x"
+    gid1: "250109"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "26203"
+    imsi_prefix_xpattern: "26203293x"
+    imsi_prefix_xpattern: "26203330x"
+  }
+}
+carrier_id {
+  canonical_id: 2537
+  carrier_name: "CBRS"
+  carrier_attribute {
+    mccmnc_tuple: "315010"
+  }
+}
+carrier_id {
+  canonical_id: 2538
+  carrier_name: "Universal DISH - MVNO2"
+  carrier_attribute {
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "311180"
+    gid1: "3438"
+  }
+}
+carrier_id {
+  canonical_id: 2539
+  carrier_name: "Project Genesis - MVNO2"
+  carrier_attribute {
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "311180"
+    gid1: "3440"
+  }
+}
+carrier_id {
+  canonical_id: 2540
+  carrier_name: "mate."
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "mate."
+  }
+}
+carrier_id {
+  canonical_id: 2541
+  carrier_name: "Exetel"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "Exetel"
+  }
+}
+carrier_id {
+  canonical_id: 2542
+  carrier_name: "Konec"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "Konec"
+  }
+}
+carrier_id {
+  canonical_id: 2543
+  carrier_name: "More"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "More"
+  }
+}
+carrier_id {
+  canonical_id: 2544
+  carrier_name: "TANGERINE"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "TANGERINE"
+  }
+}
+carrier_id {
+  canonical_id: 2545
+  carrier_name: "Your provider"
+  carrier_attribute {
+    mccmnc_tuple: "50501"
+    spn: "Your provider"
+  }
+}
+carrier_id {
+  canonical_id: 2546
+  carrier_name: "Wizzee"
+  carrier_attribute {
+    mccmnc_tuple: "34020"
+    imsi_prefix_xpattern: "3402002"
+  }
+}
+carrier_id {
+  canonical_id: 2547
+  carrier_name: "Telet"
+  carrier_attribute {
+    mccmnc_tuple: "23488"
+    mccmnc_tuple: "23588"
+    spn: "Telet"
+  }
+}
+carrier_id {
+  canonical_id: 2548
+  carrier_name: "Ice Norway"
+  carrier_attribute {
+    mccmnc_tuple: "24214"
+  }
+}
+carrier_id {
+  canonical_id: 2549
+  carrier_name: "Lycamobile"
+  carrier_attribute {
+    mccmnc_tuple: "50519"
+    spn: "Lycamobile"
+  }
+}
+carrier_id {
+  canonical_id: 2550
+  carrier_name: "Vodafone"
+  carrier_attribute {
+    mccmnc_tuple: "54715"
+    spn: "Vodafone PF"
+  }
+}
+carrier_id {
+  canonical_id: 2551
+  carrier_name: "Magenta Telekom"
+  carrier_attribute {
+    mccmnc_tuple: "23203"
+    mccmnc_tuple: "23207"
+  }
+}
+carrier_id {
+  canonical_id: 2552
+  carrier_name: "Mytel"
+  carrier_attribute {
+    mccmnc_tuple: "41409"
+  }
+}
+carrier_id {
+  canonical_id: 2553
+  carrier_name: "4ka SK"
+  carrier_attribute {
+    mccmnc_tuple: "23103"
+  }
+}
+carrier_id {
+  canonical_id: 2554
+  carrier_name: "Cellhire"
+  carrier_attribute {
+    mccmnc_tuple: "20834"
+    spn: "eSIMsmart"
+    spn: "O-Events"
+  }
+}
+carrier_id {
+  canonical_id: 2555
+  carrier_name: "Vimla"
+  carrier_attribute {
+    mccmnc_tuple: "24006"
+  }
+}
+carrier_id {
+  canonical_id: 2556
+  carrier_name: "Xfinity Mobile 2.0"
+  carrier_attribute {
+    mccmnc_tuple: "310590"
+    mccmnc_tuple: "310591"
+    mccmnc_tuple: "310599"
+    mccmnc_tuple: "311480"
+    mccmnc_tuple: "311481"
+    mccmnc_tuple: "311482"
+    mccmnc_tuple: "311483"
+    mccmnc_tuple: "311484"
+    mccmnc_tuple: "311485"
+    mccmnc_tuple: "311486"
+    mccmnc_tuple: "311487"
+    mccmnc_tuple: "311488"
+    mccmnc_tuple: "311489"
+    gid1: "BA01640000000000"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "314240"
+  }
+}
+carrier_id {
+  canonical_id: 2557
+  carrier_name: "fraenk"
+  carrier_attribute {
+    mccmnc_tuple: "26201"
+    mccmnc_tuple: "26206"
+    spn: "fraenk"
+    gid1: "44"
+  }
+}
+carrier_id {
+  canonical_id: 2558
+  carrier_name: "Wintel"
+  carrier_attribute {
+    mccmnc_tuple: "45209"
+  }
+}
+carrier_id {
+  canonical_id: 2559
+  carrier_name: "MONACO TELECOM"
+  carrier_attribute {
+    mccmnc_tuple: "212010"
+  }
+}
+carrier_id {
+  canonical_id: 2560
+  carrier_name: "U+264A"
+  carrier_attribute {
+    mccmnc_tuple: "23210"
+    gid1: "040D"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "23210"
+    gid1: "040E"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "302760"
+    gid1: "F1"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310240"
+    gid1: "4280"
+  }
+}
+carrier_id {
+  canonical_id: 2561
+  carrier_name: "Lebara"
+  carrier_attribute {
+    mccmnc_tuple: "20838"
+    spn: "Lebara"
+  }
+}
+carrier_id {
+  canonical_id: 2562
+  carrier_name: "Lebara"
+  carrier_attribute {
+    mccmnc_tuple: "26214"
+    spn: "Lebara"
+  }
+}
+carrier_id {
+  canonical_id: 2563
+  carrier_name: "Lebara"
+  carrier_attribute {
+    mccmnc_tuple: "20417"
+    spn: "Lebara"
+  }
+}
+carrier_id {
+  canonical_id: 2564
+  carrier_name: "Lebara"
+  carrier_attribute {
+    mccmnc_tuple: "23487"
+    spn: "Lebara"
+  }
+}
+carrier_id {
+  canonical_id: 2565
+  carrier_name: "Best Telecom"
+  carrier_attribute {
+    mccmnc_tuple: "45707"
+    imsi_prefix_xpattern: "457070001"
+    spn: "Best Mobile"
+  }
+}
+carrier_id {
+  canonical_id: 2566
+  carrier_name: "Zeop_RE"
+  carrier_attribute {
+    mccmnc_tuple: "64704"
+  }
+}
+carrier_id {
+  canonical_id: 2567
+  carrier_name: "SSi Mobile"
+  carrier_attribute {
+    mccmnc_tuple: "302480"
+    imsi_prefix_xpattern: "302480017"
+    spn: "SSi Mobile"
+    gid1: "FF"
+  }
+}
+carrier_id {
+  canonical_id: 2568
+  carrier_name: "Eeyou Mobility"
+  carrier_attribute {
+    mccmnc_tuple: "302480"
+    imsi_prefix_xpattern: "3024800002"
+    spn: "Eeyou Mobility"
+    gid1: "FF"
+  }
+}
+carrier_id {
+  canonical_id: 2569
+  carrier_name: "Safaricom Telecommunications Ethiopia"
+  carrier_attribute {
+    mccmnc_tuple: "63602"
+  }
+}
+carrier_id {
+  canonical_id: 10000
+  carrier_name: "Tracfone-ATT"
+  carrier_attribute {
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "311180"
+    gid1: "DDFF"
+    gid1: "DEFF"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310950"
+    gid1: "DDFF"
+  }
+  parent_canonical_id: 2022
+}
+carrier_id {
+  canonical_id: 10001
+  carrier_name: "Tracfone-TMO"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "DDFF"
+    gid1: "DEFF"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310240"
+    gid1: "DEFF"
+  }
+  parent_canonical_id: 2022
+}
+carrier_id {
+  canonical_id: 10002
+  carrier_name: "o2prepaid_gb"
+  carrier_attribute {
+    mccmnc_tuple: "23410"
+    gid1: "61"
+    gid1: "67"
+    gid1: "85"
+    gid1: "99"
+  }
+  parent_canonical_id: 1492
+}
+carrier_id {
+  canonical_id: 10003
+  carrier_name: "o2prepaid_de"
+  carrier_attribute {
+    mccmnc_tuple: "26207"
+    imsi_prefix_xpattern: "2620749"
+  }
+  parent_canonical_id: 1454
+}
+carrier_id {
+  canonical_id: 10004
+  carrier_name: "sprintprepaid_us"
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    gid1: "000004"
+  }
+  parent_canonical_id: 1788
+}
+carrier_id {
+  canonical_id: 10005
+  carrier_name: "pcmobile_prepaid_bell"
+  carrier_attribute {
+    mccmnc_tuple: "30264"
+    mccmnc_tuple: "302610"
+    mccmnc_tuple: "302630"
+    mccmnc_tuple: "302640"
+    gid1: "40"
+  }
+  parent_canonical_id: 2053
+}
+carrier_id {
+  canonical_id: 10006
+  carrier_name: "pcmobile_postpaid_telus"
+  carrier_attribute {
+    mccmnc_tuple: "302220"
+    mccmnc_tuple: "302221"
+    gid1: "5043"
+  }
+  parent_canonical_id: 2053
+}
+carrier_id {
+  canonical_id: 10008
+  carrier_name: "Tracfone-VZW"
+  carrier_attribute {
+    mccmnc_tuple: "310590"
+    mccmnc_tuple: "310591"
+    mccmnc_tuple: "310592"
+    mccmnc_tuple: "310593"
+    mccmnc_tuple: "310594"
+    mccmnc_tuple: "310595"
+    mccmnc_tuple: "310596"
+    mccmnc_tuple: "310597"
+    mccmnc_tuple: "310598"
+    mccmnc_tuple: "310599"
+    mccmnc_tuple: "311480"
+    gid1: "BA01270000000000"
+  }
+  parent_canonical_id: 2022
+}
+carrier_id {
+  canonical_id: 10009
+  carrier_name: "C Spire-US"
+  carrier_attribute {
+    mccmnc_tuple: "311230"
+    mccmnc_tuple: "310023"
+  }
+  parent_canonical_id: 1836
+}
+carrier_id {
+  canonical_id: 10010
+  carrier_name: "C Spire-NL"
+  carrier_attribute {
+    mccmnc_tuple: "20404"
+    spn: "C Spire"
+  }
+  parent_canonical_id: 1836
+}
+carrier_id {
+  canonical_id: 10011
+  carrier_name: "Red Pocket-TMO"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "4201"
+  }
+  parent_canonical_id: 2026
+}
+carrier_id {
+  canonical_id: 10012
+  carrier_name: "Red Pocket-ATT"
+  carrier_attribute {
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+    gid1: "4201"
+  }
+  parent_canonical_id: 2026
+}
+carrier_id {
+  canonical_id: 10013
+  carrier_name: "FirstNet Pacific"
+  carrier_attribute {
+    mccmnc_tuple: "313110"
+    mccmnc_tuple: "313120"
+  }
+  parent_canonical_id: 2119
+}
+carrier_id {
+  canonical_id: 10014
+  carrier_name: "Google Fi-TMO"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    imsi_prefix_xpattern: "31026097"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "4276"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310240"
+    gid1: "4276"
+  }
+  parent_canonical_id: 1989
+}
+carrier_id {
+  canonical_id: 10015
+  carrier_name: "Google Fi-Sprint"
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    spn: "Fi Network"
+    spn: "nova"
+    spn: "Google Fi"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    gid1: "A00184"
+    gid1: "A00184FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+  }
+  carrier_attribute {
+    mccmnc_tuple: "310120"
+    privilege_access_rule: "4C36AF4A5BDAD97C1F3D8B283416D244496C2AC5EAFE8226079EF6F676FD1859"
+  }
+  parent_canonical_id: 1989
+}
+carrier_id {
+  canonical_id: 10016
+  carrier_name: "Google Fi-USCellular"
+  carrier_attribute {
+    mccmnc_tuple: "311580"
+    imsi_prefix_xpattern: "3115801"
+  }
+  parent_canonical_id: 1989
+}
+carrier_id {
+  canonical_id: 10017
+  carrier_name: "Google Fi-3UK"
+  carrier_attribute {
+    mccmnc_tuple: "23420"
+    gid1: "0306"
+  }
+  parent_canonical_id: 1989
+}
+carrier_id {
+  canonical_id: 10018
+  carrier_name: "Google Fi-3HK"
+  carrier_attribute {
+    mccmnc_tuple: "45403"
+    gid1: "0206"
+  }
+  parent_canonical_id: 1989
+}
+carrier_id {
+  canonical_id: 10019
+  carrier_name: "Google Fi-3AT"
+  carrier_attribute {
+    mccmnc_tuple: "23210"
+    gid1: "0306"
+  }
+  parent_canonical_id: 1989
+}
+carrier_id {
+  canonical_id: 10020
+  carrier_name: "CTC Telecom Inc"
+  carrier_attribute {
+    mccmnc_tuple: "20404"
+    mccmnc_tuple: "45403"
+    mccmnc_tuple: "45431"
+    iccid_prefix: "898603"
+    iccid_prefix: "898611"
+  }
+  parent_canonical_id: 1854
+}
+carrier_id {
+  canonical_id: 10021
+  carrier_name: "AT&T 5G"
+  carrier_attribute {
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+    gid1: "53FF"
+  }
+  parent_canonical_id: 1187
+}
+carrier_id {
+  canonical_id: 10022
+  carrier_name: "Consumer Cellular ATT"
+  carrier_attribute {
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+    gid1: "2AC9"
+  }
+  parent_canonical_id: 2023
+}
+carrier_id {
+  canonical_id: 10023
+  carrier_name: "Consumer Cellular TMO"
+  carrier_attribute {
+    mccmnc_tuple: "310260"
+    gid1: "2AC9"
+  }
+  parent_canonical_id: 2023
+}
+carrier_id {
+  canonical_id: 10024
+  carrier_name: "Cellcom Core"
+  carrier_attribute {
+    mccmnc_tuple: "311840"
+    gid1: "c1000000"
+  }
+  parent_canonical_id: 1802
+}
+carrier_id {
+  canonical_id: 10025
+  carrier_name: "Rogers 5G"
+  carrier_attribute {
+    mccmnc_tuple: "302720"
+    gid1: "A4"
+  }
+  parent_canonical_id: 1403
+}
+carrier_id {
+  canonical_id: 10026
+  carrier_name: "DOCOMO ahamo"
+  carrier_attribute {
+    mccmnc_tuple: "44010"
+    gid1: "01FFFF"
+  }
+  parent_canonical_id: 850
+}
+carrier_id {
+  canonical_id: 10027
+  carrier_name: "LINEMO"
+  carrier_attribute {
+    mccmnc_tuple: "44020"
+    gid1: "48FFFF"
+  }
+  parent_canonical_id: 1894
+}
+carrier_id {
+  canonical_id: 10028
+  carrier_name: "AT&T 5G SA"
+  carrier_attribute {
+    mccmnc_tuple: "310280"
+    mccmnc_tuple: "310410"
+    mccmnc_tuple: "310950"
+    mccmnc_tuple: "311180"
+    gid1: "52FF"
+  }
+  parent_canonical_id: 1187
+}
+carrier_id {
+  canonical_id: 10029
+  carrier_name: "Cricket 5G"
+  carrier_attribute {
+    mccmnc_tuple: "310150"
+    gid1: "53FF"
+  }
+  parent_canonical_id: 1779
+}
+carrier_id {
+  canonical_id: 10030
+  carrier_name: "TANGO-US"
+  carrier_attribute {
+    mccmnc_tuple: "313770"
+  }
+  parent_canonical_id: 2531
+}
+carrier_id {
+  canonical_id: 10031
+  carrier_name: "TANGO-UK"
+  carrier_attribute {
+    mccmnc_tuple: "23453"
+  }
+  parent_canonical_id: 2531
+}
+carrier_id {
+  canonical_id: 10032
+  carrier_name: "U+264A-3AT Operational"
+  carrier_attribute {
+    mccmnc_tuple: "23210"
+    gid1: "040D"
+  }
+  parent_canonical_id: 2560
+}
+carrier_id {
+  canonical_id: 10033
+  carrier_name: "U+264A-3AT Provisioning"
+  carrier_attribute {
+    mccmnc_tuple: "23210"
+    gid1: "040E"
+  }
+  parent_canonical_id: 2560
+}
+carrier_id {
+  canonical_id: 10034
+  carrier_name: "U+264A-Telus"
+  carrier_attribute {
+    mccmnc_tuple: "302760"
+    gid1: "F1"
+  }
+  parent_canonical_id: 2560
+}
+carrier_id {
+  canonical_id: 10035
+  carrier_name: "U+264A-TMO"
+  carrier_attribute {
+    mccmnc_tuple: "310240"
+    gid1: "4280"
+  }
+  parent_canonical_id: 2560
+}
+version: 100663322
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 0bbaa47..2da01b2 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -17,5 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" product="tablet" msgid="9194799012395299737">"మొబైల్ నెట్‌వర్క్ కాన్ఫిగరేషన్"</string>
-    <string name="app_label" product="default" msgid="8338087656149558019">"ఫోన్ మరియు సందేశ నిల్వ"</string>
+    <string name="app_label" product="default" msgid="8338087656149558019">"ఫోన్ మరియు సందేశ స్టోరేజ్‌"</string>
 </resources>
diff --git a/src/com/android/providers/telephony/CarrierIdProvider.java b/src/com/android/providers/telephony/CarrierIdProvider.java
index 9b6c2c0..c06c115 100644
--- a/src/com/android/providers/telephony/CarrierIdProvider.java
+++ b/src/com/android/providers/telephony/CarrierIdProvider.java
@@ -51,6 +51,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -433,8 +434,9 @@
             CarrierIdProto.CarrierAttribute attr, int index) {
         if (index > CARRIER_ATTR_END_IDX) {
             ContentValues carrier = new ContentValues(cv);
-            if (!cvs.contains(carrier))
-            cvs.add(carrier);
+            if (!cvs.contains(carrier)) {
+                cvs.add(carrier);
+            }
             return;
         }
         boolean found = false;
@@ -457,7 +459,7 @@
                 break;
             case GID1_INDEX:
                 for (String str : attr.gid1) {
-                    cv.put(CarrierId.All.GID1, str.toLowerCase());
+                    cv.put(CarrierId.All.GID1, str.toLowerCase(Locale.ROOT));
                     convertCarrierAttrToContentValues(cv, cvs, attr, index + 1);
                     cv.remove(CarrierId.All.GID1);
                     found = true;
@@ -465,7 +467,7 @@
                 break;
             case GID2_INDEX:
                 for (String str : attr.gid2) {
-                    cv.put(CarrierId.All.GID2, str.toLowerCase());
+                    cv.put(CarrierId.All.GID2, str.toLowerCase(Locale.ROOT));
                     convertCarrierAttrToContentValues(cv, cvs, attr, index + 1);
                     cv.remove(CarrierId.All.GID2);
                     found = true;
@@ -481,7 +483,7 @@
                 break;
             case SPN_INDEX:
                 for (String str : attr.spn) {
-                    cv.put(CarrierId.All.SPN, str.toLowerCase());
+                    cv.put(CarrierId.All.SPN, str.toLowerCase(Locale.ROOT));
                     convertCarrierAttrToContentValues(cv, cvs, attr, index + 1);
                     cv.remove(CarrierId.All.SPN);
                     found = true;
diff --git a/src/com/android/providers/telephony/MmsPartsCleanup.java b/src/com/android/providers/telephony/MmsPartsCleanup.java
new file mode 100644
index 0000000..8de1006
--- /dev/null
+++ b/src/com/android/providers/telephony/MmsPartsCleanup.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.telephony;
+
+import static java.util.Arrays.stream;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.os.Bundle;
+import android.os.FileUtils;
+import android.provider.Telephony;
+import android.util.Log;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/** Tools to find and delete unreferenced MMS parts from the parts directory. */
+public class MmsPartsCleanup {
+    private static final String TAG = "MmsPartsCleanup";
+
+    static final String PART_FILE_COUNT = "part_file_count";
+    static final String PART_TABLE_ENTRY_COUNT = "part_table_entry_count";
+    static final String DELETED_COUNT = "deleted_count";
+
+    /**
+     * @param context
+     * @param doDelete if true, delete the unreferenced MMS part files found in the data dir.
+     *                 if false, compute the number of unreferenced part files and return the
+     *                 results, but don't actually delete the files
+     * @param bundle an existing bundle where int values will be added:
+     *               PART_FILE_COUNT - an int count of MMS attachment files in the parts
+     *                                 directory
+     *               PART_TABLE_ENTRY_COUNT - an int count of MMS attachments referenced
+     *                                        by existing MMS messages
+     *               DELETED_COUNT - the number of non-referenced MMS part files delete (or would
+     *                               be deleted if doDelete is true)
+     */
+    public static void cleanupDanglingParts(Context context, boolean doDelete, Bundle bundle) {
+        Set<String> danglingFilePathsToDelete = getDanglingMmsParts(context, bundle);
+        danglingFilePathsToDelete.forEach(path -> {
+            File partFile = new File(path);
+            if (partFile.exists()) {
+                if (doDelete) {
+                    Log.d(TAG, "Deleting dangling MMS part: " + partFile.getAbsolutePath());
+                    partFile.delete();
+                } else {
+                    Log.d(TAG,
+                            "Would have deleted dangling MMS part: "
+                                    + partFile.getAbsolutePath());
+                }
+            } else {
+                Log.wtf(TAG,
+                        "Part file path does not exist: "
+                                + partFile.getAbsolutePath());
+            }
+        });
+        bundle.putInt(DELETED_COUNT, danglingFilePathsToDelete.size());
+    }
+
+    /**
+     * @param context
+     * @return a set of file path names for every MMS attachment file found in the data directory
+     */
+    @NonNull
+    private static Set<String> getAllMmsPartsInPartsDir(Context context) {
+        Set<String> allMmsAttachments = new HashSet<>();
+        try {
+            String partsDirPath = context.getDir(MmsProvider.PARTS_DIR_NAME, 0)
+                    .getCanonicalPath();
+            Log.d(TAG, "getDanglingMmsParts: " + partsDirPath);
+            File partsDir = new File(partsDirPath);
+            allMmsAttachments = Arrays.stream(FileUtils.listFilesOrEmpty(partsDir)).map(p ->
+            {
+                try {
+                    return p.getCanonicalPath();
+                } catch (IOException e) {
+                    Log.d(TAG, "getDanglingMmsParts: couldn't get path for " + p);
+                }
+                return null;
+            }).filter(path -> path != null).collect(Collectors.toSet());
+        } catch (IOException e) {
+            Log.e(TAG, "getDanglingMmsParts: failed " + e, e);
+            allMmsAttachments.clear();
+        }
+        return allMmsAttachments;
+    }
+
+    /**
+     * @param partFilePaths the incoming set contains the file paths of all MMS attachments in the
+     *                      data directory. This function modifies this set by removing any path
+     *                      that is referenced from an MMS part in the parts table. In other words,
+     *                      when this function returns, partFilePaths contains only the unreferenced
+     *                      file paths
+     * @param context
+     * @return the number of MMS parts that are referenced and still attached to an MMS message
+     */
+    @NonNull
+    private static int removeReferencedPartsFromSet(Set<String> partFilePaths, Context context) {
+        if (partFilePaths.isEmpty()) {
+            return 0;
+        }
+        SQLiteDatabase db = MmsSmsDatabaseHelper.getInstanceForCe(context).getReadableDatabase();
+        int referencedPartCount = 0;
+        try (Cursor partRows =
+                     db.query(
+                             MmsProvider.TABLE_PART,
+                             new String[] {Telephony.Mms.Part._DATA},
+                             Telephony.Mms.Part._DATA + " IS NOT NULL AND "
+                                     + Telephony.Mms.Part._DATA + " <> ''",
+                             null,
+                             null,
+                             null,
+                             null)) {
+            if (partRows != null) {
+                while (partRows.moveToNext()) {
+                    String path = partRows.getString(0);
+                    if (path != null) {
+                        if (partFilePaths.remove(path)) {
+                            ++referencedPartCount;
+                        }
+                    }
+                }
+            }
+        }
+        return referencedPartCount;
+    }
+
+    /**
+     * @param context
+     * @param bundle an existing bundle that is modified to contain two possible key/values:
+     *               PART_FILE_COUNT - an int count of MMS attachment files in the parts directory
+     *               PART_TABLE_ENTRY_COUNT - an int count of MMS attachments referenced by existing
+     *                                        MMS messages
+     * @return a set of file path names for MMS attachments that live in the data directory, but
+     *         aren't referenced by any existing MMS message
+     */
+    @NonNull
+    private static Set<String> getDanglingMmsParts(Context context, Bundle bundle) {
+        Set<String> allExistingMmsAttachments = getAllMmsPartsInPartsDir(context);
+        bundle.putInt(PART_FILE_COUNT, allExistingMmsAttachments.size());
+        bundle.putInt(PART_TABLE_ENTRY_COUNT,
+                removeReferencedPartsFromSet(allExistingMmsAttachments, context));
+
+        return allExistingMmsAttachments;
+    }
+}
diff --git a/src/com/android/providers/telephony/MmsProvider.java b/src/com/android/providers/telephony/MmsProvider.java
index 5ddd6ac..28c9074 100644
--- a/src/com/android/providers/telephony/MmsProvider.java
+++ b/src/com/android/providers/telephony/MmsProvider.java
@@ -18,13 +18,17 @@
 
 import android.annotation.NonNull;
 import android.app.AppOpsManager;
+import android.content.BroadcastReceiver;
 import android.content.ContentProvider;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.UriMatcher;
 import android.database.Cursor;
+import android.database.DatabaseUtils;
+import android.database.MatrixCursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteException;
 import android.database.sqlite.SQLiteOpenHelper;
@@ -33,22 +37,28 @@
 import android.os.Binder;
 import android.os.ParcelFileDescriptor;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.BaseColumns;
 import android.provider.Telephony;
 import android.provider.Telephony.CanonicalAddressesColumns;
 import android.provider.Telephony.Mms;
 import android.provider.Telephony.Mms.Addr;
-import android.provider.Telephony.Mms.Inbox;
 import android.provider.Telephony.Mms.Part;
 import android.provider.Telephony.Mms.Rate;
 import android.provider.Telephony.MmsSms;
 import android.provider.Telephony.Threads;
 import android.system.ErrnoException;
 import android.system.Os;
+import android.telephony.SmsManager;
+import android.telephony.SubscriptionManager;
 import android.text.TextUtils;
 import android.util.EventLog;
 import android.util.Log;
 
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.TelephonyPermissions;
+import com.android.internal.telephony.util.TelephonyUtils;
+
 import com.google.android.mms.pdu.PduHeaders;
 import com.google.android.mms.util.DownloadDrmHelper;
 
@@ -72,14 +82,36 @@
     // The name of parts directory. The full dir is "app_parts".
     static final String PARTS_DIR_NAME = "parts";
 
+    private ProviderUtilWrapper providerUtilWrapper = new ProviderUtilWrapper();
+
+    @VisibleForTesting
+    public void setProviderUtilWrapper(ProviderUtilWrapper providerUtilWrapper) {
+        this.providerUtilWrapper = providerUtilWrapper;
+    }
+
     @Override
     public boolean onCreate() {
         setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
         mOpenHelper = MmsSmsDatabaseHelper.getInstanceForCe(getContext());
         TelephonyBackupAgent.DeferredSmsMmsRestoreService.startIfFilesExist(getContext());
+
+        // Creating intent broadcast receiver for user actions like Intent.ACTION_USER_REMOVED,
+        // where we would need to remove MMS related to removed user.
+        IntentFilter userIntentFilter = new IntentFilter(Intent.ACTION_USER_REMOVED);
+        getContext().registerReceiver(mUserIntentReceiver, userIntentFilter,
+                Context.RECEIVER_NOT_EXPORTED);
+
         return true;
     }
 
+    // wrapper class to allow easier mocking of the static ProviderUtil in tests
+    @VisibleForTesting
+    public static class ProviderUtilWrapper {
+        public boolean isAccessRestricted(Context context, String packageName, int uid) {
+            return ProviderUtil.isAccessRestricted(context, packageName, uid);
+        }
+    }
+
     /**
      * Return the proper view of "pdu" table for the current access status.
      *
@@ -93,14 +125,17 @@
     @Override
     public Cursor query(Uri uri, String[] projection,
             String selection, String[] selectionArgs, String sortOrder) {
+        final int callerUid = Binder.getCallingUid();
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
         // First check if a restricted view of the "pdu" table should be used based on the
         // caller's identity. Only system, phone or the default sms app can have full access
         // of mms data. For other apps, we present a restricted view which only contains sent
         // or received messages, without wap pushes.
         final boolean accessRestricted = ProviderUtil.isAccessRestricted(
-                getContext(), getCallingPackage(), Binder.getCallingUid());
+                getContext(), getCallingPackage(), callerUid);
 
         // If access is restricted, we don't allow subqueries in the query.
+        Log.v(TAG, "accessRestricted=" + accessRestricted);
         if (accessRestricted) {
             SqlQueryChecker.checkQueryParametersForSubqueries(projection, selection, sortOrder);
         }
@@ -231,6 +266,21 @@
                 return null;
         }
 
+        String selectionBySubIds;
+        final long token = Binder.clearCallingIdentity();
+        try {
+            // Filter MMS based on subId.
+            selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+                    callerUserHandle);
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+        if (selectionBySubIds == null) {
+            // No subscriptions associated with user, return empty cursor.
+            return new MatrixCursor((projection == null) ? (new String[] {}) : projection);
+        }
+        selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
         String finalSortOrder = null;
         if (TextUtils.isEmpty(sortOrder)) {
             if (qb.getTables().equals(pduTable)) {
@@ -312,10 +362,20 @@
     @Override
     public Uri insert(Uri uri, ContentValues values) {
         final int callerUid = Binder.getCallingUid();
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
         final String callerPkg = getCallingPackage();
         int msgBox = Mms.MESSAGE_BOX_ALL;
         boolean notify = true;
 
+        boolean forceNoNotify = values.containsKey(TelephonyBackupAgent.NOTIFY)
+                && !values.getAsBoolean(TelephonyBackupAgent.NOTIFY);
+        values.remove(TelephonyBackupAgent.NOTIFY);
+        // check isAccessRestricted to prevent third parties from setting NOTIFY = false maliciously
+        if (forceNoNotify && !providerUtilWrapper.isAccessRestricted(
+                getContext(), getCallingPackage(), callerUid)) {
+            notify = false;
+        }
+
         int match = sURLMatcher.match(uri);
         if (LOCAL_LOGV) {
             Log.v(TAG, "Insert uri=" + uri + ", match=" + match);
@@ -372,7 +432,26 @@
         Uri caseSpecificUri = null;
         long rowId;
 
+        int subId;
+        if (values.containsKey(Telephony.Sms.SUBSCRIPTION_ID)) {
+            subId = values.getAsInteger(Telephony.Sms.SUBSCRIPTION_ID);
+        } else {
+            // TODO (b/256992531): Currently, one sim card is set as default sms subId in work
+            //  profile. Default sms subId should be updated based on user pref.
+            subId = SmsManager.getDefaultSmsSubscriptionId();
+            if (SubscriptionManager.isValidSubscriptionId(subId)) {
+                values.put(Telephony.Sms.SUBSCRIPTION_ID, subId);
+            }
+        }
+
         if (table.equals(TABLE_PDU)) {
+            if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(), subId,
+                    callerUserHandle)) {
+                TelephonyUtils.showSwitchToManagedProfileDialogIfAppropriate(getContext(), subId,
+                        callerUid, callerPkg);
+                return null;
+            }
+
             boolean addDate = !values.containsKey(Mms.DATE);
             boolean addMsgBox = !values.containsKey(Mms.MESSAGE_BOX);
 
@@ -564,6 +643,7 @@
                 cv.put(Telephony.MmsSms.WordsTable.INDEXED_TEXT, values.getAsString("text"));
                 cv.put(Telephony.MmsSms.WordsTable.SOURCE_ROW_ID, rowId);
                 cv.put(Telephony.MmsSms.WordsTable.TABLE_ID, 2);
+                cv.put(MmsSms.WordsTable.SUBSCRIPTION_ID, subId);
                 db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv);
             }
 
@@ -578,6 +658,7 @@
                     + "/PART_" + System.currentTimeMillis();
             finalValues = new ContentValues(1);
             finalValues.put("_data", path);
+            finalValues.put("sub_id", subId);
 
             File partFile = new File(path);
             if (!partFile.exists()) {
@@ -630,6 +711,7 @@
     @Override
     public int delete(Uri uri, String selection,
             String[] selectionArgs) {
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
         int match = sURLMatcher.match(uri);
         if (LOCAL_LOGV) {
             Log.v(TAG, "Delete uri=" + uri + ", match=" + match);
@@ -687,6 +769,21 @@
         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         int deletedRows = 0;
 
+        final long token = Binder.clearCallingIdentity();
+        String selectionBySubIds;
+        try {
+            // Filter SMS based on subId.
+            selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+                    callerUserHandle);
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+        if (selectionBySubIds == null) {
+            // No subscriptions associated with user, return 0.
+            return 0;
+        }
+        finalSelection = DatabaseUtils.concatenateWhere(finalSelection, selectionBySubIds);
+
         if (TABLE_PDU.equals(table)) {
             deletedRows = deleteMessages(getContext(), db, finalSelection,
                                          selectionArgs, uri);
@@ -791,6 +888,7 @@
             return 0;
         }
         final int callerUid = Binder.getCallingUid();
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
         final String callerPkg = getCallingPackage();
         int match = sURLMatcher.match(uri);
         if (LOCAL_LOGV) {
@@ -828,15 +926,16 @@
                         uri.getPathSegments().get(1);
 
                 try {
+                    File canonicalFile = new File(path).getCanonicalFile();
                     String partsDirPath = getContext().getDir(PARTS_DIR_NAME, 0).getCanonicalPath();
-                    if (!new File(path).getCanonicalPath().startsWith(partsDirPath)) {
+                    if (!canonicalFile.getPath().startsWith(partsDirPath + '/')) {
                         EventLog.writeEvent(0x534e4554, "240685104",
-                                Binder.getCallingUid(), (TAG + " update: path " + path +
+                                callerUid, (TAG + " update: path " + path +
                                         " does not start with " + partsDirPath));
                         return 0;
                     }
                     // Reset the file permission back to read for everyone but me.
-                    Os.chmod(path, 0644);
+                    Os.chmod(canonicalFile.getPath(), 0644);
                     if (LOCAL_LOGV) {
                         Log.d(TAG, "MmsProvider.update chmod is successful for path: " + path);
                     }
@@ -851,6 +950,21 @@
         }
 
         String extraSelection = null;
+        final long token = Binder.clearCallingIdentity();
+        String selectionBySubIds;
+        try {
+            // Filter MMS based on subId.
+            selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+                    callerUserHandle);
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+        if (selectionBySubIds == null) {
+            // No subscriptions associated with user, return 0.
+            return 0;
+        }
+        extraSelection = DatabaseUtils.concatenateWhere(extraSelection, selectionBySubIds);
+
         ContentValues finalValues;
         if (table.equals(TABLE_PDU)) {
             // Filter keys that we don't support yet.
@@ -1070,7 +1184,8 @@
         sURLMatcher.addURI("mms", "resetFilePerm/*",    MMS_PART_RESET_FILE_PERMISSION);
     }
 
-    private SQLiteOpenHelper mOpenHelper;
+    @VisibleForTesting
+    public SQLiteOpenHelper mOpenHelper;
 
     private static String concatSelections(String selection1, String selection2) {
         if (TextUtils.isEmpty(selection1)) {
@@ -1081,4 +1196,49 @@
             return selection1 + " AND " + selection2;
         }
     }
+
+    private BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            switch (intent.getAction()) {
+                case Intent.ACTION_USER_REMOVED:
+                    UserHandle userToBeRemoved  = intent.getParcelableExtra(Intent.EXTRA_USER,
+                            UserHandle.class);
+                    UserManager userManager = context.getSystemService(UserManager.class);
+                    if ((userToBeRemoved == null) || (userManager == null) ||
+                            (!userManager.isManagedProfile(userToBeRemoved.getIdentifier()))) {
+                        // Do not delete MMS if removed profile is not managed profile.
+                        return;
+                    }
+                    Log.d(TAG, "Received ACTION_USER_REMOVED for managed profile - Deleting MMS.");
+
+                    // Deleting MMS related to managed profile.
+                    Uri uri = Telephony.Mms.CONTENT_URI;
+                    SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+
+                    final long token = Binder.clearCallingIdentity();
+                    String selectionBySubIds;
+                    try {
+                        // Filter MMS based on subId.
+                        selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+                                userToBeRemoved);
+                    } finally {
+                        Binder.restoreCallingIdentity(token);
+                    }
+                    if (selectionBySubIds == null) {
+                        // No subscriptions associated with user, return.
+                        return;
+                    }
+
+                    int deletedRows = deleteMessages(getContext(), db, selectionBySubIds,
+                            null, uri);
+                    if (deletedRows > 0) {
+                        // Don't update threads unless something changed.
+                        MmsSmsDatabaseHelper.updateThreads(db, selectionBySubIds, null);
+                        notifyChange(uri, null);
+                    }
+                    break;
+            }
+        }
+    };
 }
diff --git a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
index 73ffa3b..4bc1642 100644
--- a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
+++ b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
@@ -31,6 +31,7 @@
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteException;
 import android.database.sqlite.SQLiteOpenHelper;
+import android.os.FileUtils;
 import android.os.storage.StorageManager;
 import android.preference.PreferenceManager;
 import android.provider.BaseColumns;
@@ -44,11 +45,13 @@
 import android.provider.Telephony.Sms;
 import android.provider.Telephony.Sms.Intents;
 import android.provider.Telephony.Threads;
+import android.telephony.AnomalyReporter;
 import android.telephony.SubscriptionManager;
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.TelephonyStatsLog;
 
 import com.google.android.mms.pdu.EncodedStringValue;
 import com.google.android.mms.pdu.PduHeaders;
@@ -60,6 +63,7 @@
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.UUID;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -81,6 +85,14 @@
  */
 public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
     private static final String TAG = "MmsSmsDatabaseHelper";
+    private static final int SECURITY_EXCEPTION = TelephonyStatsLog
+            .MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED__FAILURE_CODE__FAILURE_SECURITY_EXCEPTION;
+    private static final int FAILURE_UNKNOWN = TelephonyStatsLog
+        .MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED__FAILURE_CODE__FAILURE_UNKNOWN;
+    private static final int SQL_EXCEPTION = TelephonyStatsLog
+            .MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED__FAILURE_CODE__FAILURE_SQL_EXCEPTION;
+    private static final int IO_EXCEPTION = TelephonyStatsLog
+            .MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED__FAILURE_CODE__FAILURE_IO_EXCEPTION;
 
     private static final String SMS_UPDATE_THREAD_READ_BODY =
                         "  UPDATE threads SET read = " +
@@ -252,7 +264,7 @@
     private static boolean sFakeLowStorageTest = false;     // for testing only
 
     static final String DATABASE_NAME = "mmssms.db";
-    static final int DATABASE_VERSION = 67;
+    static final int DATABASE_VERSION = 68;
     private static final int IDLE_CONNECTION_TIMEOUT_MS = 30000;
 
     private final Context mContext;
@@ -264,6 +276,9 @@
     // cache for INITIAL_CREATE_DONE shared pref so access to it can be avoided when possible
     private static AtomicBoolean sInitialCreateDone = new AtomicBoolean(false);
 
+    private static final UUID CREATE_CALLED_MULTIPLE_TIMES_UUID = UUID.fromString(
+        "6ead002e-c001-4c05-9bca-67d7c4e29782");
+
     /**
      * The primary purpose of this DatabaseErrorHandler is to broadcast an intent on corruption and
      * print a Log.wtf so database corruption can be caught earlier.
@@ -332,7 +347,7 @@
      */
     /* package */ static synchronized MmsSmsDatabaseHelper getInstanceForCe(Context context) {
         if (sCeInstance == null) {
-            if (StorageManager.isFileEncryptedNativeOrEmulated()) {
+            if (StorageManager.isFileEncrypted()) {
                 Context ceContext = ProviderUtil.getCredentialEncryptedContext(context);
                 sCeInstance = new MmsSmsDatabaseHelper(ceContext, getDbErrorHandler(ceContext));
             } else {
@@ -523,6 +538,21 @@
         return rows;
     }
 
+    private void clearMmsParts() {
+        try {
+            String partsDirPath = mContext.getDir(MmsProvider.PARTS_DIR_NAME, 0)
+                    .getCanonicalPath();
+            localLog("clearMmsParts: removing all attachments from: " + partsDirPath);
+            File partsDir = new File(partsDirPath);
+            if (!FileUtils.deleteContents(partsDir)) {
+                localLogWtf("clearMmsParts: couldn't delete all attachments");
+            }
+        }
+        catch (IOException e){
+            Log.e(TAG, "clearMmsParts: failed " + e, e);
+        }
+    }
+
     @Override
     public void onCreate(SQLiteDatabase db) {
         localLog("onCreate: Creating all SMS-MMS tables.");
@@ -535,8 +565,10 @@
         createWordsTables(db);
         createIndices(db);
 
+        clearMmsParts();    // leave no dangling MMS attachments when rebuilding the DB
+
         // if FBE is not supported, or if this onCreate is for CE partition database
-        if (!StorageManager.isFileEncryptedNativeOrEmulated()
+        if (!StorageManager.isFileEncrypted()
                 || (mContext != null && mContext.isCredentialProtectedStorage())) {
             localLog("onCreate: broadcasting ACTION_SMS_MMS_DB_CREATED");
             // Broadcast ACTION_SMS_MMS_DB_CREATED
@@ -546,7 +578,9 @@
             if (isInitialCreateDone()) {
                 // this onCreate is called after onCreate was called once initially. The db file
                 // disappeared mysteriously?
-                localLogWtf("onCreate: was already called once earlier");
+                AnomalyReporter.reportAnomaly(CREATE_CALLED_MULTIPLE_TIMES_UUID,
+                                              "MmsSmsDatabaseHelper: onCreate() was already "
+                                              + "called once earlier");
                 intent.putExtra(Intents.EXTRA_IS_INITIAL_CREATE, false);
             } else {
                 setInitialCreateDone();
@@ -608,6 +642,7 @@
                         cv.put(Telephony.MmsSms.WordsTable.INDEXED_TEXT, body);
                         cv.put(Telephony.MmsSms.WordsTable.SOURCE_ROW_ID, id);
                         cv.put(Telephony.MmsSms.WordsTable.TABLE_ID, 1);
+                        cv.put(MmsSms.WordsTable.SUBSCRIPTION_ID, -1);
                         db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv);
                     }
                 }
@@ -641,6 +676,7 @@
                         cv.put(Telephony.MmsSms.WordsTable.INDEXED_TEXT, body);
                         cv.put(Telephony.MmsSms.WordsTable.SOURCE_ROW_ID, id);
                         cv.put(Telephony.MmsSms.WordsTable.TABLE_ID, 1);
+                        cv.put(MmsSms.WordsTable.SUBSCRIPTION_ID, -1);
                         db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv);
                     }
                 }
@@ -653,8 +689,13 @@
     }
 
     private void createWordsTables(SQLiteDatabase db) {
+        createWordsTables(db, -1, -1, -1);
+    }
+
+    private void createWordsTables(
+            SQLiteDatabase db, int oldVersion, int currentVersion, int upgradeVersion) {
         try {
-            db.execSQL("CREATE VIRTUAL TABLE words USING FTS3 (_id INTEGER PRIMARY KEY, index_text TEXT, source_id INTEGER, table_to_use INTEGER);");
+            db.execSQL("CREATE VIRTUAL TABLE words USING FTS3 (_id INTEGER PRIMARY KEY, index_text TEXT, source_id INTEGER, table_to_use INTEGER, sub_id INTEGER);");
 
             // monitor the sms table
             // NOTE don't handle inserts using a trigger because it has an unwanted
@@ -670,6 +711,7 @@
             populateWordsTable(db);
         } catch (Exception ex) {
             Log.e(TAG, "got exception creating words table: " + ex.toString());
+            logException(ex, oldVersion, currentVersion, upgradeVersion);
         }
     }
 
@@ -681,112 +723,165 @@
     }
 
     private void createThreadIdIndex(SQLiteDatabase db) {
+        createThreadIdIndex(db, -1, -1, -1);
+    }
+
+    private void createThreadIdIndex(
+            SQLiteDatabase db, int oldVersion, int currentVersion, int upgradeVersion) {
         try {
             db.execSQL("CREATE INDEX IF NOT EXISTS typeThreadIdIndex ON sms" +
             " (type, thread_id);");
         } catch (Exception ex) {
             Log.e(TAG, "got exception creating indices: " + ex.toString());
+            logException(ex, oldVersion, currentVersion, upgradeVersion);
         }
     }
 
     private void createThreadIdDateIndex(SQLiteDatabase db) {
+        createThreadIdDateIndex(db, -1, -1, -1);
+    }
+
+    private void createThreadIdDateIndex(
+            SQLiteDatabase db, int oldVersion, int currentVersion, int upgradeVersion) {
         try {
             db.execSQL("CREATE INDEX IF NOT EXISTS threadIdDateIndex ON sms" +
             " (thread_id, date);");
         } catch (Exception ex) {
             Log.e(TAG, "got exception creating indices: " + ex.toString());
+            logException(ex, oldVersion, currentVersion, upgradeVersion);
         }
     }
 
     private void createPartMidIndex(SQLiteDatabase db) {
+        createPartMidIndex(db, -1, -1, -1);
+    }
+
+    private void createPartMidIndex(
+            SQLiteDatabase db, int oldVersion, int currentVersion, int upgradeVersion) {
         try {
             db.execSQL("CREATE INDEX IF NOT EXISTS partMidIndex ON part (mid)");
         } catch (Exception ex) {
             Log.e(TAG, "got exception creating indices: " + ex.toString());
+            logException(ex, oldVersion, currentVersion, upgradeVersion);
         }
     }
 
     private void createAddrMsgIdIndex(SQLiteDatabase db) {
+        createAddrMsgIdIndex(db, -1, -1, -1);
+    }
+
+    private void createAddrMsgIdIndex(
+            SQLiteDatabase db, int oldVersion, int currentVersion, int upgradeVersion) {
         try {
             db.execSQL("CREATE INDEX IF NOT EXISTS addrMsgIdIndex ON addr (msg_id)");
         } catch (Exception ex) {
             Log.e(TAG, "got exception creating indices: " + ex.toString());
+            logException(ex, oldVersion, currentVersion, upgradeVersion);
         }
     }
 
+
+    @VisibleForTesting
+    public static String CREATE_ADDR_TABLE_STR =
+            "CREATE TABLE " + MmsProvider.TABLE_ADDR + " (" +
+            Addr._ID + " INTEGER PRIMARY KEY," +
+            Addr.MSG_ID + " INTEGER," +
+            Addr.CONTACT_ID + " INTEGER," +
+            Addr.ADDRESS + " TEXT," +
+            Addr.TYPE + " INTEGER," +
+            Addr.CHARSET + " INTEGER," +
+            Addr.SUBSCRIPTION_ID + " INTEGER DEFAULT -1" +
+                    ");";
+
+    @VisibleForTesting
+    public static String CREATE_PART_TABLE_STR =
+            "CREATE TABLE " + MmsProvider.TABLE_PART + " (" +
+            Part._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
+            Part.MSG_ID + " INTEGER," +
+            Part.SEQ + " INTEGER DEFAULT 0," +
+            Part.CONTENT_TYPE + " TEXT," +
+            Part.NAME + " TEXT," +
+            Part.CHARSET + " INTEGER," +
+            Part.CONTENT_DISPOSITION + " TEXT," +
+            Part.FILENAME + " TEXT," +
+            Part.CONTENT_ID + " TEXT," +
+            Part.CONTENT_LOCATION + " TEXT," +
+            Part.CT_START + " INTEGER," +
+            Part.CT_TYPE + " TEXT," +
+            Part._DATA + " TEXT," +
+            Part.TEXT + " TEXT," +
+            Part.SUBSCRIPTION_ID + " INTEGER DEFAULT -1" +
+                    ");";
+
+    public static String CREATE_PDU_TABLE_STR =
+            "CREATE TABLE " + MmsProvider.TABLE_PDU + " (" +
+            Mms._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
+            Mms.THREAD_ID + " INTEGER," +
+            Mms.DATE + " INTEGER," +
+            Mms.DATE_SENT + " INTEGER DEFAULT 0," +
+            Mms.MESSAGE_BOX + " INTEGER," +
+            Mms.READ + " INTEGER DEFAULT 0," +
+            Mms.MESSAGE_ID + " TEXT," +
+            Mms.SUBJECT + " TEXT," +
+            Mms.SUBJECT_CHARSET + " INTEGER," +
+            Mms.CONTENT_TYPE + " TEXT," +
+            Mms.CONTENT_LOCATION + " TEXT," +
+            Mms.EXPIRY + " INTEGER," +
+            Mms.MESSAGE_CLASS + " TEXT," +
+            Mms.MESSAGE_TYPE + " INTEGER," +
+            Mms.MMS_VERSION + " INTEGER," +
+            Mms.MESSAGE_SIZE + " INTEGER," +
+            Mms.PRIORITY + " INTEGER," +
+            Mms.READ_REPORT + " INTEGER," +
+            Mms.REPORT_ALLOWED + " INTEGER," +
+            Mms.RESPONSE_STATUS + " INTEGER," +
+            Mms.STATUS + " INTEGER," +
+            Mms.TRANSACTION_ID + " TEXT," +
+            Mms.RETRIEVE_STATUS + " INTEGER," +
+            Mms.RETRIEVE_TEXT + " TEXT," +
+            Mms.RETRIEVE_TEXT_CHARSET + " INTEGER," +
+            Mms.READ_STATUS + " INTEGER," +
+            Mms.CONTENT_CLASS + " INTEGER," +
+            Mms.RESPONSE_TEXT + " TEXT," +
+            Mms.DELIVERY_TIME + " INTEGER," +
+            Mms.DELIVERY_REPORT + " INTEGER," +
+            Mms.LOCKED + " INTEGER DEFAULT 0," +
+            Mms.SUBSCRIPTION_ID + " INTEGER DEFAULT "
+                    + SubscriptionManager.INVALID_SUBSCRIPTION_ID + ", " +
+            Mms.SEEN + " INTEGER DEFAULT 0," +
+            Mms.CREATOR + " TEXT," +
+            Mms.TEXT_ONLY + " INTEGER DEFAULT 0);";
+
+    @VisibleForTesting
+    public static String CREATE_RATE_TABLE_STR =
+            "CREATE TABLE " + MmsProvider.TABLE_RATE + " (" +
+            Rate.SENT_TIME + " INTEGER," +
+                    Rate.SUBSCRIPTION_ID + " INTEGER DEFAULT -1" +
+                    ");";
+
+    @VisibleForTesting
+    public static String CREATE_DRM_TABLE_STR =
+            "CREATE TABLE " + MmsProvider.TABLE_DRM + " (" +
+            BaseColumns._ID + " INTEGER PRIMARY KEY," +
+            "_data TEXT," +
+            "sub_id INTEGER DEFAULT -1" +
+                    ");";
+
+
     @VisibleForTesting
     void createMmsTables(SQLiteDatabase db) {
         // N.B.: Whenever the columns here are changed, the columns in
         // {@ref MmsSmsProvider} must be changed to match.
-        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PDU + " (" +
-                   Mms._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
-                   Mms.THREAD_ID + " INTEGER," +
-                   Mms.DATE + " INTEGER," +
-                   Mms.DATE_SENT + " INTEGER DEFAULT 0," +
-                   Mms.MESSAGE_BOX + " INTEGER," +
-                   Mms.READ + " INTEGER DEFAULT 0," +
-                   Mms.MESSAGE_ID + " TEXT," +
-                   Mms.SUBJECT + " TEXT," +
-                   Mms.SUBJECT_CHARSET + " INTEGER," +
-                   Mms.CONTENT_TYPE + " TEXT," +
-                   Mms.CONTENT_LOCATION + " TEXT," +
-                   Mms.EXPIRY + " INTEGER," +
-                   Mms.MESSAGE_CLASS + " TEXT," +
-                   Mms.MESSAGE_TYPE + " INTEGER," +
-                   Mms.MMS_VERSION + " INTEGER," +
-                   Mms.MESSAGE_SIZE + " INTEGER," +
-                   Mms.PRIORITY + " INTEGER," +
-                   Mms.READ_REPORT + " INTEGER," +
-                   Mms.REPORT_ALLOWED + " INTEGER," +
-                   Mms.RESPONSE_STATUS + " INTEGER," +
-                   Mms.STATUS + " INTEGER," +
-                   Mms.TRANSACTION_ID + " TEXT," +
-                   Mms.RETRIEVE_STATUS + " INTEGER," +
-                   Mms.RETRIEVE_TEXT + " TEXT," +
-                   Mms.RETRIEVE_TEXT_CHARSET + " INTEGER," +
-                   Mms.READ_STATUS + " INTEGER," +
-                   Mms.CONTENT_CLASS + " INTEGER," +
-                   Mms.RESPONSE_TEXT + " TEXT," +
-                   Mms.DELIVERY_TIME + " INTEGER," +
-                   Mms.DELIVERY_REPORT + " INTEGER," +
-                   Mms.LOCKED + " INTEGER DEFAULT 0," +
-                   Mms.SUBSCRIPTION_ID + " INTEGER DEFAULT "
-                           + SubscriptionManager.INVALID_SUBSCRIPTION_ID + ", " +
-                   Mms.SEEN + " INTEGER DEFAULT 0," +
-                   Mms.CREATOR + " TEXT," +
-                   Mms.TEXT_ONLY + " INTEGER DEFAULT 0" +
-                   ");");
 
-        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_ADDR + " (" +
-                   Addr._ID + " INTEGER PRIMARY KEY," +
-                   Addr.MSG_ID + " INTEGER," +
-                   Addr.CONTACT_ID + " INTEGER," +
-                   Addr.ADDRESS + " TEXT," +
-                   Addr.TYPE + " INTEGER," +
-                   Addr.CHARSET + " INTEGER);");
+        db.execSQL(CREATE_PDU_TABLE_STR);
 
-        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PART + " (" +
-                   Part._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
-                   Part.MSG_ID + " INTEGER," +
-                   Part.SEQ + " INTEGER DEFAULT 0," +
-                   Part.CONTENT_TYPE + " TEXT," +
-                   Part.NAME + " TEXT," +
-                   Part.CHARSET + " INTEGER," +
-                   Part.CONTENT_DISPOSITION + " TEXT," +
-                   Part.FILENAME + " TEXT," +
-                   Part.CONTENT_ID + " TEXT," +
-                   Part.CONTENT_LOCATION + " TEXT," +
-                   Part.CT_START + " INTEGER," +
-                   Part.CT_TYPE + " TEXT," +
-                   Part._DATA + " TEXT," +
-                   Part.TEXT + " TEXT);");
+        db.execSQL(CREATE_ADDR_TABLE_STR);
 
-        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_RATE + " (" +
-                   Rate.SENT_TIME + " INTEGER);");
+        db.execSQL(CREATE_PART_TABLE_STR);
 
-        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_DRM + " (" +
-                   BaseColumns._ID + " INTEGER PRIMARY KEY," +
-                   "_data TEXT);");
+        db.execSQL(CREATE_RATE_TABLE_STR);
+
+        db.execSQL(CREATE_DRM_TABLE_STR);
 
         // Restricted view of pdu table, only sent/received messages without wap pushes
         db.execSQL("CREATE VIEW " + MmsProvider.VIEW_PDU_RESTRICTED + " AS " +
@@ -1015,7 +1110,9 @@
             "CREATE TABLE attachments (" +
             "sms_id INTEGER," +
             "content_url TEXT," +
-            "offset INTEGER);";
+            "offset INTEGER," +
+            "sub_id INTEGER DEFAULT -1" +
+                    ");";
 
     /**
      * This table is used by the SMS dispatcher to hold
@@ -1054,7 +1151,9 @@
         db.execSQL("CREATE TABLE sr_pending (" +
                    "reference_number INTEGER," +
                    "action TEXT," +
-                   "data TEXT);");
+                   "data TEXT," +
+                   "sub_id INTEGER DEFAULT -1" +
+                ");");
 
         // Restricted view of sms table, only sent/received messages
         db.execSQL("CREATE VIEW " + SmsProvider.VIEW_SMS_RESTRICTED + " AS " +
@@ -1103,7 +1202,9 @@
          */
         db.execSQL("CREATE TABLE canonical_addresses (" +
                    "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
-                   "address TEXT);");
+                   "address TEXT," +
+                   Telephony.CanonicalAddressesColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1"
+                + ");");
 
         /**
          * This table maps the subject and an ordered set of recipient
@@ -1124,7 +1225,9 @@
                    Threads.ARCHIVED + " INTEGER DEFAULT 0," +
                    Threads.TYPE + " INTEGER DEFAULT 0," +
                    Threads.ERROR + " INTEGER DEFAULT 0," +
-                   Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0);");
+                   Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0," +
+                   Threads.SUBSCRIPTION_ID + " INTEGER DEFAULT -1" +
+                ");");
 
         /**
          * This table stores the queue of messages to be sent/downloaded.
@@ -1248,6 +1351,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 41);
                 break;
             } finally {
                 db.endTransaction();
@@ -1264,6 +1368,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 42);
                 break;
             } finally {
                 db.endTransaction();
@@ -1280,6 +1385,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 43);
                 break;
             } finally {
                 db.endTransaction();
@@ -1296,6 +1402,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 44);
                 break;
             } finally {
                 db.endTransaction();
@@ -1312,6 +1419,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 45);
                 break;
             } finally {
                 db.endTransaction();
@@ -1323,10 +1431,11 @@
             }
             db.beginTransaction();
             try {
-                upgradeDatabaseToVersion46(db);
+                upgradeDatabaseToVersion46(db, oldVersion, currentVersion);
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 46);
                 break;
             } finally {
                 db.endTransaction();
@@ -1343,6 +1452,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 47);
                 break;
             } finally {
                 db.endTransaction();
@@ -1359,6 +1469,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 48);
                 break;
             } finally {
                 db.endTransaction();
@@ -1371,10 +1482,11 @@
 
             db.beginTransaction();
             try {
-                createWordsTables(db);
+                createWordsTables(db, oldVersion, currentVersion, 49);
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 49);
                 break;
             } finally {
                 db.endTransaction();
@@ -1386,10 +1498,11 @@
             }
             db.beginTransaction();
             try {
-                createThreadIdIndex(db);
+                createThreadIdIndex(db, oldVersion, currentVersion, 50);
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 50);
                 break; // force to destroy all old data;
             } finally {
                 db.endTransaction();
@@ -1406,6 +1519,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 51);
                 break;
             } finally {
                 db.endTransaction();
@@ -1428,6 +1542,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 53);
                 break;
             } finally {
                 db.endTransaction();
@@ -1444,6 +1559,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 54);
                 break;
             } finally {
                 db.endTransaction();
@@ -1460,6 +1576,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 55);
                 break;
             } finally {
                 db.endTransaction();
@@ -1476,6 +1593,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 56);
                 break;
             } finally {
                 db.endTransaction();
@@ -1492,6 +1610,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 57);
                 break;
             } finally {
                 db.endTransaction();
@@ -1508,6 +1627,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 58);
                 break;
             } finally {
                 db.endTransaction();
@@ -1524,6 +1644,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 59);
                 break;
             } finally {
                 db.endTransaction();
@@ -1540,6 +1661,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 60);
                 break;
             } finally {
                 db.endTransaction();
@@ -1556,6 +1678,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 61);
                 break;
             } finally {
                 db.endTransaction();
@@ -1568,10 +1691,11 @@
 
             db.beginTransaction();
             try {
-                upgradeDatabaseToVersion62(db);
+                upgradeDatabaseToVersion62(db, oldVersion, currentVersion);
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 62);
                 break;
             } finally {
                 db.endTransaction();
@@ -1585,10 +1709,11 @@
             db.beginTransaction();
             try {
                 // upgrade to 63: just add a happy little index.
-                createThreadIdDateIndex(db);
+                createThreadIdDateIndex(db, oldVersion, currentVersion, 63);
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 63);
                 break;
             } finally {
                 db.endTransaction();
@@ -1605,6 +1730,7 @@
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 64);
                 break;
             } finally {
                 db.endTransaction();
@@ -1617,10 +1743,11 @@
 
             db.beginTransaction();
             try {
-                upgradeDatabaseToVersion65(db);
+                upgradeDatabaseToVersion65(db, oldVersion, currentVersion);
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 65);
                 break;
             } finally {
                 db.endTransaction();
@@ -1633,10 +1760,11 @@
 
             db.beginTransaction();
             try {
-                upgradeDatabaseToVersion66(db);
+                upgradeDatabaseToVersion66(db, oldVersion, currentVersion);
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 66);
                 break;
             } finally {
                 db.endTransaction();
@@ -1648,11 +1776,27 @@
             }
             db.beginTransaction();
             try {
-                createPartMidIndex(db);
-                createAddrMsgIdIndex(db);
+                createPartMidIndex(db, oldVersion, currentVersion, 67);
+                createAddrMsgIdIndex(db, oldVersion, currentVersion, 67);
                 db.setTransactionSuccessful();
             } catch (Throwable ex) {
                 Log.e(TAG, ex.getMessage(), ex);
+                logException(ex, oldVersion, currentVersion, 67);
+                break; // force to destroy all old data;
+            } finally {
+                db.endTransaction();
+            }
+            // fall through
+        case 67:
+            if (currentVersion <= 67) {
+                return;
+            }
+            db.beginTransaction();
+            try {
+                upgradeDatabaseToVersion68(db, oldVersion, currentVersion);
+                db.setTransactionSuccessful();
+            } catch(Throwable ex) {
+                Log.e(TAG, ex.getMessage(), ex);
                 break; // force to destroy all old data;
             } finally {
                 db.endTransaction();
@@ -1661,30 +1805,38 @@
         }
 
         Log.e(TAG, "Destroying all old data.");
-        localLog("onUpgrade: Calling dropAll() and onCreate(). Upgrading database"
+        localLog("onUpgrade: Calling wipeDbOnFailedUpgrade() and onCreate()."
+                + " Upgrading database"
                 + " from version " + oldVersion + " to " + currentVersion + "failed.");
-        dropAll(db);
+        db = wipeDbOnFailedUpgrade(db);
         onCreate(db);
     }
 
-    private void dropAll(SQLiteDatabase db) {
-        // Clean the database out in order to start over from scratch.
-        // We don't need to drop our triggers here because SQLite automatically
-        // drops a trigger when its attached database is dropped.
-        localLog("****DROPPING ALL SMS-MMS TABLES****");
-        db.execSQL("DROP TABLE IF EXISTS canonical_addresses");
-        db.execSQL("DROP TABLE IF EXISTS threads");
-        db.execSQL("DROP TABLE IF EXISTS " + MmsSmsProvider.TABLE_PENDING_MSG);
-        db.execSQL("DROP TABLE IF EXISTS sms");
-        db.execSQL("DROP TABLE IF EXISTS raw");
-        db.execSQL("DROP TABLE IF EXISTS attachments");
-        db.execSQL("DROP TABLE IF EXISTS thread_ids");
-        db.execSQL("DROP TABLE IF EXISTS sr_pending");
-        db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_PDU + ";");
-        db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_ADDR + ";");
-        db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_PART + ";");
-        db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_RATE + ";");
-        db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_DRM + ";");
+    private void logException(
+            Throwable ex, int oldVersion, int currentVersion, int upgradeVersion) {
+        int exception = FAILURE_UNKNOWN;
+        if (ex instanceof SQLiteException) {
+            exception = SQL_EXCEPTION;
+        } else if (ex instanceof IOException) {
+            exception = IO_EXCEPTION;
+        } else if (ex instanceof SecurityException) {
+            exception = SECURITY_EXCEPTION;
+        }
+        TelephonyStatsLog.write(
+            TelephonyStatsLog.MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED,
+            oldVersion,
+            currentVersion,
+            upgradeVersion,
+            exception);
+    }
+
+    public SQLiteDatabase wipeDbOnFailedUpgrade(SQLiteDatabase db) {
+        // Delete the database in order to start over from scratch.
+        File databaseFile = new File(db.getPath());
+        db.close();
+        boolean didDelete = SQLiteDatabase.deleteDatabase(databaseFile);
+        Log.e(TAG, "wipeDbOnFailedUpgrade: didDelete: " + didDelete);
+        return getWritableDatabase();
     }
 
     private void upgradeDatabaseToVersion41(SQLiteDatabase db) {
@@ -1733,7 +1885,7 @@
         db.execSQL("ALTER TABLE pdu ADD COLUMN " + Mms.LOCKED + " INTEGER DEFAULT 0");
     }
 
-    private void upgradeDatabaseToVersion46(SQLiteDatabase db) {
+    private void upgradeDatabaseToVersion46(SQLiteDatabase db, int oldVersion, int currentVersion) {
         // add the "text" column for caching inline text (e.g. strings) instead of
         // putting them in an external file
         db.execSQL("ALTER TABLE part ADD COLUMN " + Part.TEXT + " TEXT");
@@ -1771,6 +1923,7 @@
                         } catch (IOException e) {
                             // TODO Auto-generated catch block
                             e.printStackTrace();
+                            logException(e, oldVersion, currentVersion, 46);
                         }
                     }
                 }
@@ -1783,6 +1936,7 @@
                     (new File(pathToDelete)).delete();
                 } catch (SecurityException ex) {
                     Log.e(TAG, "unable to clean up old mms file for " + pathToDelete, ex);
+                    logException(ex, oldVersion, currentVersion, 46);
                 }
             }
             if (textRows != null) {
@@ -1904,7 +2058,7 @@
 
     }
 
-    private void upgradeDatabaseToVersion62(SQLiteDatabase db) {
+    private void upgradeDatabaseToVersion62(SQLiteDatabase db, int oldVersion, int currentVersion) {
         // When a non-FBE device is upgraded to N, all MMS attachment files are moved from
         // /data/data to /data/user_de. We need to update the paths stored in the parts table to
         // reflect this change.
@@ -1914,6 +2068,7 @@
         }
         catch (IOException e){
             Log.e(TAG, "openFile: check file path failed " + e, e);
+            logException(e, oldVersion, currentVersion, 62);
             return;
         }
 
@@ -1938,7 +2093,7 @@
         db.execSQL("ALTER TABLE " + SmsProvider.TABLE_RAW +" ADD COLUMN deleted INTEGER DEFAULT 0");
     }
 
-    private void upgradeDatabaseToVersion65(SQLiteDatabase db) {
+    private void upgradeDatabaseToVersion65(SQLiteDatabase db, int oldVersion, int currentVersion) {
         // aosp and internal code diverged at version 63. Aosp did createThreadIdDateIndex() on
         // upgrading to 63, whereas internal (nyc) added column 'deleted'. A device upgrading from
         // nyc will have columns deleted and message_body in raw table with version 64, but not
@@ -1948,17 +2103,55 @@
         } catch (SQLiteException e) {
             Log.w(TAG, "[upgradeDatabaseToVersion65] Exception adding column message_body; " +
                     "trying createThreadIdDateIndex() instead: " + e);
+            logException(e, oldVersion, currentVersion, 65);
             createThreadIdDateIndex(db);
         }
     }
 
-    private void upgradeDatabaseToVersion66(SQLiteDatabase db) {
+    private void upgradeDatabaseToVersion66(SQLiteDatabase db, int oldVersion, int currentVersion) {
         try {
             db.execSQL("ALTER TABLE " + SmsProvider.TABLE_RAW
                     + " ADD COLUMN display_originating_addr TEXT");
         } catch (SQLiteException e) {
             Log.e(TAG, "[upgradeDatabaseToVersion66] Exception adding column "
                     + "display_originating_addr; " + e);
+            logException(e, oldVersion, currentVersion, 66);
+        }
+    }
+
+    private void upgradeDatabaseToVersion68(SQLiteDatabase db, int oldVersion, int currentVersion) {
+        try {
+            db.execSQL("ALTER TABLE " + MmsSmsProvider.TABLE_THREADS
+                    + " ADD COLUMN " + Telephony.ThreadsColumns.SUBSCRIPTION_ID
+                    + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+            db.execSQL("ALTER TABLE " + MmsProvider.TABLE_PART
+                    + " ADD COLUMN " + Part.SUBSCRIPTION_ID
+                    + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+            db.execSQL("ALTER TABLE " + SmsProvider.TABLE_CANONICAL_ADDRESSES
+                    + " ADD COLUMN " + Telephony.CanonicalAddressesColumns.SUBSCRIPTION_ID
+                    + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+            db.execSQL("ALTER TABLE " + SmsProvider.TABLE_ATTACHMENTS
+                    + " ADD COLUMN sub_id"
+                    + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+            db.execSQL("ALTER TABLE " + MmsProvider.TABLE_ADDR
+                    + " ADD COLUMN " + Addr.SUBSCRIPTION_ID
+                    + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+            db.execSQL("ALTER TABLE " + MmsProvider.TABLE_RATE
+                    + " ADD COLUMN " + Rate.SUBSCRIPTION_ID
+                    + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+            db.execSQL("ALTER TABLE " + MmsProvider.TABLE_DRM
+                    + " ADD COLUMN sub_id"
+                    + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+            db.execSQL("ALTER TABLE " + MmsProvider.TABLE_WORDS
+                    + " ADD COLUMN sub_id"
+                    + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+            db.execSQL("ALTER TABLE " + SmsProvider.TABLE_SR_PENDING
+                    + " ADD COLUMN sub_id"
+                    + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        } catch (SQLiteException e) {
+            Log.e(TAG, "[upgradeDatabaseToVersion68] Exception adding column "
+                    + "sub_id; " + e);
+            logException(e, oldVersion, currentVersion, 68);
         }
     }
 
@@ -2148,7 +2341,9 @@
                 Threads.READ + " INTEGER DEFAULT 1," +
                 Threads.TYPE + " INTEGER DEFAULT 0," +
                 Threads.ERROR + " INTEGER DEFAULT 0," +
-                Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0);");
+                Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0," +
+                Threads.SUBSCRIPTION_ID + " INTEGER DEFAULT -1"
+                +");");
 
         db.execSQL("INSERT INTO threads_temp SELECT * from threads;");
         db.execSQL("DROP TABLE threads;");
@@ -2170,7 +2365,9 @@
         // Have to create a new temp canonical_addresses table. Copy all the info from the old
         // table. Drop the old table and rename the new table to that of the old.
         db.execSQL("CREATE TABLE canonical_addresses_temp (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
-                "address TEXT);");
+                "address TEXT," +
+                Telephony.CanonicalAddressesColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1" +
+                ");");
 
         db.execSQL("INSERT INTO canonical_addresses_temp SELECT * from canonical_addresses;");
         db.execSQL("DROP TABLE canonical_addresses;");
@@ -2205,7 +2402,9 @@
                 Part.CT_START + " INTEGER," +
                 Part.CT_TYPE + " TEXT," +
                 Part._DATA + " TEXT," +
-                Part.TEXT + " TEXT);");
+                Part.TEXT + " TEXT," +
+                Part.SUBSCRIPTION_ID + " INTEGER DEFAULT -1"
+                + ");");
 
         db.execSQL("INSERT INTO part_temp SELECT * from part;");
         db.execSQL("DROP TABLE part;");
diff --git a/src/com/android/providers/telephony/MmsSmsProvider.java b/src/com/android/providers/telephony/MmsSmsProvider.java
index 8e01bcc..1d45803 100644
--- a/src/com/android/providers/telephony/MmsSmsProvider.java
+++ b/src/com/android/providers/telephony/MmsSmsProvider.java
@@ -23,6 +23,7 @@
 import android.content.UriMatcher;
 import android.database.Cursor;
 import android.database.DatabaseUtils;
+import android.database.MatrixCursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
 import android.database.sqlite.SQLiteQueryBuilder;
@@ -40,9 +41,15 @@
 import android.provider.Telephony.Sms.Conversations;
 import android.provider.Telephony.Threads;
 import android.provider.Telephony.ThreadsColumns;
+import android.telephony.SmsManager;
+import android.telephony.SubscriptionManager;
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.internal.telephony.TelephonyPermissions;
+import com.android.internal.telephony.TelephonyStatsLog;
+import com.android.internal.telephony.util.TelephonyUtils;
+
 import com.google.android.mms.pdu.PduHeaders;
 
 import java.io.FileDescriptor;
@@ -50,6 +57,7 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
 import java.util.Set;
 
 /**
@@ -78,6 +86,10 @@
             new UriMatcher(UriMatcher.NO_MATCH);
     private static final String LOG_TAG = "MmsSmsProvider";
     private static final boolean DEBUG = false;
+    private static final int MULTIPLE_THREAD_IDS_FOUND = TelephonyStatsLog
+        .MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED__FAILURE_CODE__FAILURE_MULTIPLE_THREAD_IDS_FOUND;
+    private static final int FAILURE_FIND_OR_CREATE_THREAD_ID_SQL = TelephonyStatsLog
+        .MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED__FAILURE_CODE__FAILURE_FIND_OR_CREATE_THREAD_ID_SQL;
 
     private static final String NO_DELETES_INSERTS_OR_UPDATES =
             "MmsSmsProvider does not support deletes, inserts, or updates for this URI.";
@@ -306,8 +318,11 @@
 
     private boolean mUseStrictPhoneNumberComparation;
 
+    // Call() methods and parameters
     private static final String METHOD_IS_RESTORING = "is_restoring";
     private static final String IS_RESTORING_KEY = "restoring";
+    private static final String METHOD_GARBAGE_COLLECT = "garbage_collect";
+    private static final String DO_DELETE = "delete";
 
     @Override
     public boolean onCreate() {
@@ -323,12 +338,15 @@
     @Override
     public Cursor query(Uri uri, String[] projection,
             String selection, String[] selectionArgs, String sortOrder) {
+        final int callerUid = Binder.getCallingUid();
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
+
         // First check if restricted views of the "sms" and "pdu" tables should be used based on the
         // caller's identity. Only system, phone or the default sms app can have full access
         // of sms/mms data. For other apps, we present a restricted view which only contains sent
         // or received messages, without wap pushes.
         final boolean accessRestricted = ProviderUtil.isAccessRestricted(
-                getContext(), getCallingPackage(), Binder.getCallingUid());
+                getContext(), getCallingPackage(), callerUid);
         final String pduTable = MmsProvider.getPduTable(accessRestricted);
         final String smsTable = SmsProvider.getSmsTable(accessRestricted);
 
@@ -342,11 +360,28 @@
             }
         }
 
+        String selectionBySubIds;
+        final long token = Binder.clearCallingIdentity();
+        try {
+            // Filter MMS/SMS based on subId
+            selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(), callerUserHandle);
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+
         SQLiteDatabase db = mOpenHelper.getReadableDatabase();
         Cursor cursor = null;
+        Cursor emptyCursor = new MatrixCursor((projection == null) ?
+                (new String[] {}) : projection);
         final int match = URI_MATCHER.match(uri);
         switch (match) {
             case URI_COMPLETE_CONVERSATIONS:
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return empty cursor.
+                    return emptyCursor;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 cursor = getCompleteConversations(projection, selection, sortOrder, smsTable,
                         pduTable);
                 break;
@@ -355,17 +390,36 @@
                 if ((simple != null) && simple.equals("true")) {
                     String threadType = uri.getQueryParameter("thread_type");
                     if (!TextUtils.isEmpty(threadType)) {
-                        selection = concatSelections(
-                                selection, Threads.TYPE + "=" + threadType);
+                        try {
+                            Integer.parseInt(threadType);
+                            selection = concatSelections(
+                                    selection, Threads.TYPE + "=" + threadType);
+                        } catch (NumberFormatException ex) {
+                            Log.e(LOG_TAG, "Thread type must be int");
+                            // return empty cursor
+                            break;
+                        }
                     }
                     cursor = getSimpleConversations(
                             projection, selection, selectionArgs, sortOrder);
                 } else {
+                    if (selectionBySubIds == null) {
+                        // No subscriptions associated with user, return empty cursor.
+                        return emptyCursor;
+                    }
+                    selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                     cursor = getConversations(
                             projection, selection, sortOrder, smsTable, pduTable);
                 }
                 break;
             case URI_CONVERSATIONS_MESSAGES:
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return empty cursor.
+                    return emptyCursor;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 cursor = getConversationMessages(uri.getPathSegments().get(1), projection,
                         selection, sortOrder, smsTable, pduTable);
                 break;
@@ -380,6 +434,12 @@
                         selectionArgs, sortOrder);
                 break;
             case URI_MESSAGES_BY_PHONE:
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return emptyCursor.
+                    return emptyCursor;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 cursor = getMessagesByPhoneNumber(
                         uri.getPathSegments().get(2), projection, selection, sortOrder, smsTable,
                         pduTable);
@@ -390,6 +450,12 @@
                 cursor = getThreadId(recipients);
                 break;
             case URI_CANONICAL_ADDRESS: {
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return empty cursor.
+                    return emptyCursor;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 String extraSelection = "_id=" + uri.getPathSegments().get(1);
                 String finalSelection = TextUtils.isEmpty(selection)
                         ? extraSelection : extraSelection + " AND " + selection;
@@ -402,6 +468,12 @@
                 break;
             }
             case URI_CANONICAL_ADDRESSES:
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return empty cursor.
+                    return emptyCursor;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 cursor = db.query(TABLE_CANONICAL_ADDRESSES,
                         CANONICAL_ADDRESSES_COLUMNS_2,
                         selection,
@@ -485,8 +557,22 @@
                 String extraSelection = (proto != -1) ?
                         (PendingMessages.PROTO_TYPE + "=" + proto) : " 0=0 ";
                 if (!TextUtils.isEmpty(msgId)) {
-                    extraSelection += " AND " + PendingMessages.MSG_ID + "=" + msgId;
+                    try {
+                        Long.parseLong(msgId);
+                        extraSelection += " AND " + PendingMessages.MSG_ID + "=" + msgId;
+                    } catch(NumberFormatException ex) {
+                        Log.e(LOG_TAG, "MSG ID must be a Long.");
+                        // return empty cursor
+                        break;
+                    }
                 }
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return empty cursor.
+                    return emptyCursor;
+                }
+                // In PendingMessages table, SUBSCRIPTION_ID column name is pending_sub_id.
+                selectionBySubIds = "pending_" + selectionBySubIds;
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
 
                 String finalSelection = TextUtils.isEmpty(selection)
                         ? extraSelection : ("(" + extraSelection + ") AND " + selection);
@@ -497,11 +583,23 @@
                 break;
             }
             case URI_UNDELIVERED_MSG: {
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return empty cursor.
+                    return emptyCursor;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 cursor = getUndeliveredMessages(projection, selection,
                         selectionArgs, sortOrder, smsTable, pduTable);
                 break;
             }
             case URI_DRAFT: {
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return empty cursor.
+                    return emptyCursor;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 cursor = getDraftThread(projection, selection, sortOrder, smsTable, pduTable);
                 break;
             }
@@ -513,11 +611,25 @@
                     Log.e(LOG_TAG, "Thread ID must be a long.");
                     break;
                 }
-                cursor = getFirstLockedMessage(projection, "thread_id=" + Long.toString(threadId),
-                        sortOrder, smsTable, pduTable);
+                selection = DatabaseUtils.concatenateWhere(selection, ("thread_id=" + threadId));
+
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return empty cursor.
+                    return emptyCursor;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
+                cursor = getFirstLockedMessage(projection, selection, sortOrder,
+                        smsTable, pduTable);
                 break;
             }
             case URI_FIRST_LOCKED_MESSAGE_ALL: {
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return empty cursor.
+                    return emptyCursor;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 cursor = getFirstLockedMessage(
                         projection, selection, sortOrder, smsTable, pduTable);
                 break;
@@ -542,7 +654,7 @@
         // We lowercase all email addresses, but not addresses that aren't numbers, because
         // that would incorrectly turn an address such as "My Vodafone" into "my vodafone"
         // and the thread title would be incorrect when displayed in the UI.
-        String refinedAddress = isEmail ? address.toLowerCase() : address;
+        String refinedAddress = isEmail ? address.toLowerCase(Locale.ROOT) : address;
 
         String selection = "address=?";
         String[] selectionArgs;
@@ -568,15 +680,19 @@
                     selection, selectionArgs, null, null, null);
 
             if (cursor.getCount() == 0) {
+                // TODO (b/256992531): Currently, one sim card is set as default sms subId in work
+                //  profile. Default sms subId should be updated based on user pref.
+                int subId = SmsManager.getDefaultSmsSubscriptionId();
                 ContentValues contentValues = new ContentValues(1);
                 contentValues.put(CanonicalAddressesColumns.ADDRESS, refinedAddress);
+                contentValues.put(CanonicalAddressesColumns.SUBSCRIPTION_ID, subId);
 
                 db = mOpenHelper.getWritableDatabase();
                 retVal = db.insert("canonical_addresses",
                         CanonicalAddressesColumns.ADDRESS, contentValues);
 
                 Log.d(LOG_TAG, "getSingleAddressId: insert new canonical_address for " +
-                        /*address*/ "xxxxxx" + ", _id=" + retVal);
+                        /*address*/ "xxxxxx" + ", sub_id=" + subId + ", _id=" + retVal);
 
                 return retVal;
             }
@@ -657,6 +773,9 @@
         long date = System.currentTimeMillis();
         values.put(ThreadsColumns.DATE, date - date % 1000);
         values.put(ThreadsColumns.RECIPIENT_IDS, recipientIds);
+        // TODO (b/256992531): Currently, one sim card is set as default sms subId in work
+        //  profile. Default sms subId should be updated based on user pref.
+        values.put(ThreadsColumns.SUBSCRIPTION_ID, SmsManager.getDefaultSmsSubscriptionId());
         if (numberOfRecipients > 1) {
             values.put(Threads.TYPE, Threads.BROADCAST_THREAD);
         }
@@ -686,6 +805,10 @@
         if (addressIds.size() == 0) {
             Log.e(LOG_TAG, "getThreadId: NO receipients specified -- NOT creating thread",
                     new Exception());
+            TelephonyStatsLog.write(
+                TelephonyStatsLog.MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED,
+                TelephonyStatsLog
+                    .MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED__FAILURE_CODE__FAILURE_NO_RECIPIENTS);
             return null;
         } else if (addressIds.size() == 1) {
             // optimize for size==1, which should be most of the cases
@@ -724,12 +847,18 @@
             db.setTransactionSuccessful();
         } catch (Throwable ex) {
             Log.e(LOG_TAG, ex.getMessage(), ex);
+            TelephonyStatsLog.write(
+                TelephonyStatsLog.MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED,
+                FAILURE_FIND_OR_CREATE_THREAD_ID_SQL);
         } finally {
             db.endTransaction();
         }
 
         if (cursor != null && cursor.getCount() > 1) {
             Log.w(LOG_TAG, "getThreadId: why is cursorCount=" + cursor.getCount());
+            TelephonyStatsLog.write(
+                TelephonyStatsLog.MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED,
+                MULTIPLE_THREAD_IDS_FOUND);
         }
         return cursor;
     }
@@ -1022,7 +1151,6 @@
     private Cursor getMessagesByPhoneNumber(
             String phoneNumber, String[] projection, String selection,
             String sortOrder, String smsTable, String pduTable) {
-        String escapedPhoneNumber = DatabaseUtils.sqlEscapeString(phoneNumber);
         int minMatch =
             getContext().getResources().getInteger(
                     com.android.internal.R.integer.config_phonenumber_compare_min_match);
@@ -1033,8 +1161,7 @@
         String finalSmsSelection =
                 concatSelections(
                         selection,
-                        "(address=" + escapedPhoneNumber + " OR PHONE_NUMBERS_EQUAL(address, " +
-                        escapedPhoneNumber +
+                        "(address=? OR PHONE_NUMBERS_EQUAL(address, ?" +
                         (mUseStrictPhoneNumberComparation ? ", 1))" : ", 0, " + minMatch + "))"));
         SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
         SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
@@ -1044,9 +1171,8 @@
         mmsQueryBuilder.setTables(
                 pduTable +
                 ", (SELECT msg_id AS address_msg_id " +
-                "FROM addr WHERE (address=" + escapedPhoneNumber +
-                " OR PHONE_NUMBERS_EQUAL(addr.address, " +
-                escapedPhoneNumber +
+                "FROM addr WHERE (address=?" +
+                " OR PHONE_NUMBERS_EQUAL(addr.address, ?" +
                 (mUseStrictPhoneNumberComparation ? ", 1))) " : ", 0, " + minMatch + "))) ") +
                 "AS matching_addresses");
         smsQueryBuilder.setTables(smsTable);
@@ -1065,7 +1191,8 @@
         String unionQuery = unionQueryBuilder.buildUnionQuery(
                 new String[] { mmsSubQuery, smsSubQuery }, sortOrder, null);
 
-        return mOpenHelper.getReadableDatabase().rawQuery(unionQuery, EMPTY_STRING_ARRAY);
+        return mOpenHelper.getReadableDatabase().rawQuery(unionQuery,
+                new String[] { phoneNumber, phoneNumber, phoneNumber, phoneNumber });
     }
 
     /**
@@ -1233,6 +1360,16 @@
     @Override
     public int delete(Uri uri, String selection,
             String[] selectionArgs) {
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
+        String selectionBySubIds;
+        final long token = Binder.clearCallingIdentity();
+        try {
+            // Filter MMS/SMS based on subId
+            selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(), callerUserHandle);
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+
         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         Context context = getContext();
         int affectedRows = 0;
@@ -1246,10 +1383,23 @@
                     Log.e(LOG_TAG, "Thread ID must be a long.");
                     break;
                 }
+
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return 0.
+                    return 0;
+                }
+                selection = DatabaseUtils.concatenateWhere(selectionBySubIds, selection);
+
                 affectedRows = deleteConversation(uri, selection, selectionArgs);
                 MmsSmsDatabaseHelper.updateThread(db, threadId);
                 break;
             case URI_CONVERSATIONS:
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return 0.
+                    return 0;
+                }
+                selection = DatabaseUtils.concatenateWhere(selectionBySubIds, selection);
+
                 affectedRows = MmsProvider.deleteMessages(context, db,
                                         selection, selectionArgs, uri)
                         + db.delete("sms", selection, selectionArgs);
@@ -1289,13 +1439,41 @@
 
     @Override
     public Uri insert(Uri uri, ContentValues values) {
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
+        final int callerUid = Binder.getCallingUid();
         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         int matchIndex = URI_MATCHER.match(uri);
 
+        // TODO (b/256992531): Currently, one sim card is set as default sms subId in work
+        //  profile. Default sms subId should be updated based on user pref.
+        int defaultSmsSubId = SmsManager.getDefaultSmsSubscriptionId();
         if (matchIndex == URI_PENDING_MSG) {
+            int subId;
+            if (values.containsKey(PendingMessages.SUBSCRIPTION_ID)) {
+                subId = values.getAsInteger(PendingMessages.SUBSCRIPTION_ID);
+            } else {
+                subId = defaultSmsSubId;
+                if (SubscriptionManager.isValidSubscriptionId(subId)) {
+                    values.put(PendingMessages.SUBSCRIPTION_ID, subId);
+                }
+            }
+
+            if (!TelephonyPermissions
+                    .checkSubscriptionAssociatedWithUser(getContext(), subId, callerUserHandle)) {
+                TelephonyUtils.showSwitchToManagedProfileDialogIfAppropriate(getContext(), subId,
+                        callerUid, getCallingPackage());
+                return null;
+            }
+
             long rowId = db.insert(TABLE_PENDING_MSG, null, values);
             return uri.buildUpon().appendPath(Long.toString(rowId)).build();
         } else if (matchIndex == URI_CANONICAL_ADDRESS) {
+            if (!values.containsKey(CanonicalAddressesColumns.SUBSCRIPTION_ID)) {
+                if (SubscriptionManager.isValidSubscriptionId(defaultSmsSubId)) {
+                    values.put(CanonicalAddressesColumns.SUBSCRIPTION_ID, defaultSmsSubId);
+                }
+            }
+
             long rowId = db.insert(TABLE_CANONICAL_ADDRESSES, null, values);
             return uri.buildUpon().appendPath(Long.toString(rowId)).build();
         }
@@ -1306,21 +1484,52 @@
     public int update(Uri uri, ContentValues values,
             String selection, String[] selectionArgs) {
         final int callerUid = Binder.getCallingUid();
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
         final String callerPkg = getCallingPackage();
+
+        String selectionBySubIds;
+        final long token = Binder.clearCallingIdentity();
+        try {
+            // Filter MMS/SMS based on subId.
+            selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(), callerUserHandle);
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+
         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         int affectedRows = 0;
         switch(URI_MATCHER.match(uri)) {
             case URI_CONVERSATIONS_MESSAGES:
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return 0.
+                    return 0;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 String threadIdString = uri.getPathSegments().get(1);
                 affectedRows = updateConversation(threadIdString, values,
                         selection, selectionArgs, callerUid, callerPkg);
                 break;
 
             case URI_PENDING_MSG:
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return 0.
+                    return 0;
+                }
+                // In PendingMessages table, SUBSCRIPTION_ID column name is pending_sub_id.
+                selectionBySubIds = "pending_" + selectionBySubIds;
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 affectedRows = db.update(TABLE_PENDING_MSG, values, selection, null);
                 break;
 
             case URI_CANONICAL_ADDRESS: {
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return 0.
+                    return 0;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 String extraSelection = "_id=" + uri.getPathSegments().get(1);
                 String finalSelection = TextUtils.isEmpty(selection)
                         ? extraSelection : extraSelection + " AND " + selection;
@@ -1330,6 +1539,12 @@
             }
 
             case URI_CONVERSATIONS: {
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return 0.
+                    return 0;
+                }
+                selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
                 final ContentValues finalValues = new ContentValues(1);
                 if (values.containsKey(Threads.ARCHIVED)) {
                     // Only allow update archived
@@ -1418,10 +1633,19 @@
 
     @Override
     public Bundle call(String method, String arg, Bundle extras) {
+        if (ProviderUtil.isAccessRestricted(
+                getContext(), getCallingPackage(), Binder.getCallingUid())) {
+            return null;
+        }
         if (METHOD_IS_RESTORING.equals(method)) {
             Bundle result = new Bundle();
             result.putBoolean(IS_RESTORING_KEY, TelephonyBackupAgent.getIsRestoring());
             return result;
+        } else if (METHOD_GARBAGE_COLLECT.equals(method)) {
+            Bundle result = new Bundle();
+            boolean doDelete = TextUtils.equals(DO_DELETE, arg);
+            MmsPartsCleanup.cleanupDanglingParts(getContext(), doDelete, result);
+            return result;
         }
         Log.w(LOG_TAG, "Ignored unsupported " + method + " call");
         return null;
diff --git a/src/com/android/providers/telephony/ProviderUtil.java b/src/com/android/providers/telephony/ProviderUtil.java
index cd0f351..fe3ba24 100644
--- a/src/com/android/providers/telephony/ProviderUtil.java
+++ b/src/com/android/providers/telephony/ProviderUtil.java
@@ -16,18 +16,32 @@
 
 package com.android.providers.telephony;
 
+import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.content.ComponentName;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
+import android.os.Binder;
 import android.os.Process;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.Telephony;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.telephony.emergency.EmergencyNumber;
 import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.internal.telephony.SmsApplication;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 /**
  * Helpers
  */
@@ -126,4 +140,84 @@
         }
         return context.createDeviceProtectedStorageContext();
     }
+
+    /**
+     * Get subscriptions associated with the user in the format of a selection string.
+     * @param context context
+     * @param userHandle caller user handle.
+     * @return subscriptions associated with the user in the format of a selection string
+     * or {@code null} if user is not associated with any subscription.
+     */
+    @Nullable
+    public static String getSelectionBySubIds(Context context, @NonNull UserHandle userHandle) {
+        List<SubscriptionInfo> associatedSubscriptionsList = new ArrayList<>();
+        SubscriptionManager subManager = context.getSystemService(SubscriptionManager.class);
+        if (subManager != null) {
+            // Get list of subscriptions associated with this user.
+            associatedSubscriptionsList = subManager
+                    .getSubscriptionInfoListAssociatedWithUser(userHandle);
+        }
+
+        UserManager userManager = context.getSystemService(UserManager.class);
+        if ((userManager != null) && (!userManager.isManagedProfile(userHandle.getIdentifier()))) {
+            // SMS/MMS restored from another device have sub_id=-1.
+            // To query/update/delete those messages, sub_id=-1 should be in the selection string.
+            SubscriptionInfo invalidSubInfo = new SubscriptionInfo.Builder()
+                    .setId(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
+                    .build();
+            associatedSubscriptionsList.add(invalidSubInfo);
+        }
+
+        if (associatedSubscriptionsList.isEmpty()) {
+            return null;
+        }
+
+        // Converts [1,2,3,4,-1] to "'1','2','3','4','-1'" so that it can be appended to
+        // selection string
+        String subIdListStr = associatedSubscriptionsList.stream()
+                .map(subInfo -> ("'" + subInfo.getSubscriptionId() + "'"))
+                .collect(Collectors.joining(","));
+        String selectionBySubId = (Telephony.Sms.SUBSCRIPTION_ID + " IN (" + subIdListStr + ")");
+        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            Log.d(TAG, "getSelectionBySubIds: " + selectionBySubId);
+        }
+        return selectionBySubId;
+    }
+
+    /**
+     * Get emergency number list in the format of a selection string.
+     * @param context context
+     * @return emergency number list in the format of a selection string
+     * or {@code null} if emergency number list is empty.
+     */
+    @Nullable
+    public static String getSelectionByEmergencyNumbers(@NonNull Context context) {
+        // Get emergency number list to add it to selection string.
+        TelephonyManager tm = context.getSystemService(TelephonyManager.class);
+        Map<Integer, List<EmergencyNumber>> emergencyNumberList = null;
+        try {
+            if (tm != null) {
+                emergencyNumberList = tm.getEmergencyNumberList();
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "Cannot get emergency number list: " + e);
+        }
+
+        String selectionByEmergencyNumber = null;
+        if (emergencyNumberList != null && !emergencyNumberList.isEmpty()) {
+            String emergencyNumberListStr = "";
+            for (Map.Entry<Integer, List<EmergencyNumber>> entry : emergencyNumberList.entrySet()) {
+                if (!emergencyNumberListStr.isEmpty() && !entry.getValue().isEmpty()) {
+                    emergencyNumberListStr += ',';
+                }
+
+                emergencyNumberListStr += entry.getValue().stream()
+                        .map(emergencyNumber -> ("'" + emergencyNumber.getNumber() + "'"))
+                        .collect(Collectors.joining(","));
+            }
+            selectionByEmergencyNumber = Telephony.Sms.ADDRESS +
+                    " IN (" + emergencyNumberListStr + ")";
+        }
+        return selectionByEmergencyNumber;
+    }
 }
diff --git a/src/com/android/providers/telephony/SatelliteDatabaseHelper.java b/src/com/android/providers/telephony/SatelliteDatabaseHelper.java
new file mode 100644
index 0000000..9674b0c
--- /dev/null
+++ b/src/com/android/providers/telephony/SatelliteDatabaseHelper.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.telephony;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.provider.Telephony;
+
+public class SatelliteDatabaseHelper extends SQLiteOpenHelper {
+    private static final String TAG = "SatelliteDatabaseHelper";
+    private static final String DATABASE_NAME = "satellite.db";
+    private static final int DATABASE_VERSION = 1;
+
+    /**
+     * SatelliteDatabaseHelper satellite datagrams database helper class.
+     *
+     * @param context of the user.
+     */
+    public SatelliteDatabaseHelper(Context context) {
+        super(context, DATABASE_NAME, null, DATABASE_VERSION);
+        setWriteAheadLoggingEnabled(false);
+    }
+
+    public static String getStringForDatagramTableCreation(String tableName) {
+        return "CREATE TABLE " + tableName + "("
+                + Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID
+                + " INTEGER PRIMARY KEY,"
+                + Telephony.SatelliteDatagrams.COLUMN_DATAGRAM + " BLOB DEFAULT ''" +
+                ");";
+    }
+
+    @Override
+    public void onCreate(SQLiteDatabase db) {
+        createDatagramsTable(db);
+    }
+
+    public void createDatagramsTable(SQLiteDatabase db) {
+        db.execSQL(getStringForDatagramTableCreation(Telephony.SatelliteDatagrams.TABLE_NAME));
+    }
+
+    public void dropDatagramsTable(SQLiteDatabase db) {
+        db.execSQL("DROP TABLE IF EXISTS " + Telephony.SatelliteDatagrams.TABLE_NAME + ";");
+    }
+
+    @Override
+    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+        // do nothing
+    }
+}
diff --git a/src/com/android/providers/telephony/SatelliteProvider.java b/src/com/android/providers/telephony/SatelliteProvider.java
new file mode 100644
index 0000000..110bc7d
--- /dev/null
+++ b/src/com/android/providers/telephony/SatelliteProvider.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.telephony;
+
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+import android.provider.Telephony;
+import android.util.Log;
+
+import java.util.Arrays;
+
+public class SatelliteProvider extends ContentProvider {
+    private static final String TAG = "SatelliteProvider";
+    private static final boolean VDBG = false; // STOPSHIP if true
+
+    private SatelliteDatabaseHelper mDbHelper;
+
+    @Override
+    public boolean onCreate() {
+        Log.d(TAG, "onCreate");
+        mDbHelper = new SatelliteDatabaseHelper(getContext());
+        return true;
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+            String sortOrder) {
+        if (VDBG) {
+            Log.d(TAG, "query:"
+                    + " uri=" + uri
+                    + " values=" + Arrays.toString(projection)
+                    + " selection=" + selection
+                    + " selectionArgs=" + Arrays.toString(selectionArgs));
+        }
+        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+        qb.setTables(Telephony.SatelliteDatagrams.TABLE_NAME);
+
+        SQLiteDatabase db = getReadableDatabase();
+        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
+        return c;
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        return null;
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        if (VDBG) {
+            Log.d(TAG, "insert:"
+                    + " uri=" + uri
+                    + " values=" + values);
+        }
+        long row = getWritableDatabase().insertOrThrow(Telephony.SatelliteDatagrams.TABLE_NAME,
+                null, values);
+        if (row > 0) {
+            Uri newUri = ContentUris.withAppendedId(Telephony.SatelliteDatagrams.CONTENT_URI, row);
+            getContext().getContentResolver().notifyChange(newUri, null);
+            return newUri;
+        }
+        return null;
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        if (VDBG) {
+            Log.d(TAG, "delete:"
+                    + " uri=" + uri
+                    + " selection={" + selection + "}"
+                    + " selection=" + selection
+                    + " selectionArgs=" + Arrays.toString(selectionArgs));
+        }
+        final int count = getWritableDatabase().delete(Telephony.SatelliteDatagrams.TABLE_NAME,
+                selection, selectionArgs);
+        Log.d(TAG, "  delete.count=" + count);
+        return count;
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+       return 0;
+    }
+
+    /**
+     * These methods can be overridden in a subclass for testing SatelliteProvider using an
+     * in-memory database.
+     */
+    SQLiteDatabase getReadableDatabase() {
+        return mDbHelper.getReadableDatabase();
+    }
+    SQLiteDatabase getWritableDatabase() {
+        return mDbHelper.getWritableDatabase();
+    }
+}
diff --git a/src/com/android/providers/telephony/SmsProvider.java b/src/com/android/providers/telephony/SmsProvider.java
index d378c64..579b59d 100644
--- a/src/com/android/providers/telephony/SmsProvider.java
+++ b/src/com/android/providers/telephony/SmsProvider.java
@@ -18,10 +18,13 @@
 
 import android.annotation.NonNull;
 import android.app.AppOpsManager;
+import android.content.BroadcastReceiver;
 import android.content.ContentProvider;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.UriMatcher;
 import android.database.Cursor;
 import android.database.DatabaseUtils;
@@ -32,6 +35,7 @@
 import android.net.Uri;
 import android.os.Binder;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.Contacts;
 import android.provider.Telephony;
 import android.provider.Telephony.MmsSms;
@@ -44,6 +48,8 @@
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.TelephonyPermissions;
+import com.android.internal.telephony.util.TelephonyUtils;
 
 import java.util.HashMap;
 import java.util.List;
@@ -57,7 +63,9 @@
     private static final Uri ICC_SUBID_URI = Uri.parse("content://sms/icc_subId");
     static final String TABLE_SMS = "sms";
     static final String TABLE_RAW = "raw";
-    private static final String TABLE_SR_PENDING = "sr_pending";
+    static final String TABLE_ATTACHMENTS = "attachments";
+    static final String TABLE_CANONICAL_ADDRESSES = "canonical_addresses";
+    static final String TABLE_SR_PENDING = "sr_pending";
     private static final String TABLE_WORDS = "words";
     static final String VIEW_SMS_RESTRICTED = "sms_restricted";
 
@@ -101,6 +109,13 @@
         mDeOpenHelper = MmsSmsDatabaseHelper.getInstanceForDe(getContext());
         mCeOpenHelper = MmsSmsDatabaseHelper.getInstanceForCe(getContext());
         TelephonyBackupAgent.DeferredSmsMmsRestoreService.startIfFilesExist(getContext());
+
+        // Creating intent broadcast receiver for user actions like Intent.ACTION_USER_REMOVED,
+        // where we would need to remove SMS related to removed user.
+        IntentFilter userIntentFilter = new IntentFilter(Intent.ACTION_USER_REMOVED);
+        getContext().registerReceiver(mUserIntentReceiver, userIntentFilter,
+                Context.RECEIVER_NOT_EXPORTED);
+
         return true;
     }
 
@@ -117,12 +132,15 @@
     @Override
     public Cursor query(Uri url, String[] projectionIn, String selection,
             String[] selectionArgs, String sort) {
+        final int callingUid = Binder.getCallingUid();
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
+
         // First check if a restricted view of the "sms" table should be used based on the
         // caller's identity. Only system, phone or the default sms app can have full access
         // of sms data. For other apps, we present a restricted view which only contains sent
         // or received messages.
         final boolean accessRestricted = ProviderUtil.isAccessRestricted(
-                getContext(), getCallingPackage(), Binder.getCallingUid());
+                getContext(), getCallingPackage(), callingUid);
         final String smsTable = getSmsTable(accessRestricted);
         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
 
@@ -136,6 +154,9 @@
             }
         }
 
+        Cursor emptyCursor = new MatrixCursor((projectionIn == null) ?
+                (new String[] {}) : projectionIn);
+
         // Generate the body of the query.
         int match = sURLMatcher.match(url);
         SQLiteDatabase db = getReadableDatabase(match);
@@ -271,6 +292,13 @@
                             throw new IllegalArgumentException("Wrong path segements, uri= " + url);
                         }
                     }
+
+                    if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(),
+                            subId, callerUserHandle)) {
+                        // If subId is not associated with user, return empty cursor.
+                        return emptyCursor;
+                    }
+
                     Cursor ret = getAllMessagesFromIcc(subId);
                     ret.setNotificationUri(getContext().getContentResolver(),
                             match == SMS_ALL_ICC ? ICC_URI : ICC_SUBID_URI);
@@ -293,6 +321,13 @@
                     } catch (NumberFormatException e) {
                         throw new IllegalArgumentException("Wrong path segements, uri= " + url);
                     }
+
+                    if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(),
+                            subId, callerUserHandle)) {
+                        // If subId is not associated with user, return empty cursor.
+                        return emptyCursor;
+                    }
+
                     Cursor ret = getSingleMessageFromIcc(subId, messageIndex);
                     ret.setNotificationUri(getContext().getContentResolver(),
                             match == SMS_ICC ? ICC_URI : ICC_SUBID_URI);
@@ -304,6 +339,43 @@
                 return null;
         }
 
+        final long token = Binder.clearCallingIdentity();
+        String selectionBySubIds = null;
+        String selectionByEmergencyNumbers = null;
+        try {
+            // Filter SMS based on subId and emergency numbers.
+            selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+                    callerUserHandle);
+            if (qb.getTables().equals(smsTable)) {
+                selectionByEmergencyNumbers = ProviderUtil
+                        .getSelectionByEmergencyNumbers(getContext());
+            }
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+
+        if (qb.getTables().equals(smsTable)) {
+            if (selectionBySubIds == null && selectionByEmergencyNumbers == null) {
+                // No subscriptions associated with user
+                // and no emergency numbers return empty cursor.
+                return emptyCursor;
+            }
+        } else {
+            if (selectionBySubIds == null) {
+                // No subscriptions associated with user return empty cursor.
+                return emptyCursor;
+            }
+        }
+
+        String filter = "";
+        if (selectionBySubIds != null && selectionByEmergencyNumbers != null) {
+            filter = (selectionBySubIds + " OR " + selectionByEmergencyNumbers);
+        } else {
+            filter = selectionBySubIds == null ?
+                    selectionByEmergencyNumbers : selectionBySubIds;
+        }
+        selection = DatabaseUtils.concatenateWhere(selection, filter);
+
         String orderBy = null;
 
         if (!TextUtils.isEmpty(sort)) {
@@ -314,7 +386,6 @@
 
         Cursor ret = qb.query(db, projectionIn, selection, selectionArgs,
                               null, null, orderBy);
-
         // TODO: Since the URLs are a mess, always use content://sms
         ret.setNotificationUri(getContext().getContentResolver(),
                 NOTIFICATION_URI);
@@ -510,12 +581,14 @@
     @Override
     public int bulkInsert(@NonNull Uri url, @NonNull ContentValues[] values) {
         final int callerUid = Binder.getCallingUid();
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
         final String callerPkg = getCallingPackage();
         long token = Binder.clearCallingIdentity();
         try {
             int messagesInserted = 0;
             for (ContentValues initialValues : values) {
-                Uri insertUri = insertInner(url, initialValues, callerUid, callerPkg);
+                Uri insertUri = insertInner(url, initialValues, callerUid, callerPkg,
+                        callerUserHandle);
                 if (insertUri != null) {
                     messagesInserted++;
                 }
@@ -535,15 +608,15 @@
     @Override
     public Uri insert(Uri url, ContentValues initialValues) {
         final int callerUid = Binder.getCallingUid();
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
         final String callerPkg = getCallingPackage();
         long token = Binder.clearCallingIdentity();
         try {
-            Uri insertUri = insertInner(url, initialValues, callerUid, callerPkg);
+            Uri insertUri = insertInner(url, initialValues, callerUid, callerPkg, callerUserHandle);
 
-            int match = sURLMatcher.match(url);
-            // Skip notifyChange() if insertUri is null for SMS_ALL_ICC or SMS_ALL_ICC_SUBID caused
-            // by failure of insertMessageToIcc()(e.g. SIM full).
-            if (insertUri != null || (match != SMS_ALL_ICC && match != SMS_ALL_ICC_SUBID)) {
+            // Skip notifyChange() if insertUri is null
+            if (insertUri != null) {
+                int match = sURLMatcher.match(url);
                 // The raw table is used by the telephony layer for storing an sms before sending
                 // out a notification that an sms has arrived. We don't want to notify the default
                 // sms app of changes to this table.
@@ -556,7 +629,8 @@
         }
     }
 
-    private Uri insertInner(Uri url, ContentValues initialValues, int callerUid, String callerPkg) {
+    private Uri insertInner(Uri url, ContentValues initialValues, int callerUid, String callerPkg,
+            UserHandle callerUserHandle) {
         ContentValues values;
         long rowID;
         int type = Sms.MESSAGE_TYPE_ALL;
@@ -629,6 +703,13 @@
                     }
                 }
 
+                if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(), subId,
+                    callerUserHandle)) {
+                    TelephonyUtils.showSwitchToManagedProfileDialogIfAppropriate(getContext(),
+                        subId, callerUid, callerPkg);
+                    return null;
+                }
+
                 if (initialValues == null) {
                     throw new IllegalArgumentException("ContentValues is null");
                 }
@@ -724,7 +805,7 @@
                                 CONTACT_QUERY_PROJECTION,
                                 null, null, null);
 
-                        if (cursor.moveToFirst()) {
+                        if (cursor != null && cursor.moveToFirst()) {
                             Long id = Long.valueOf(cursor.getLong(PERSON_ID_COLUMN));
                             values.put(Sms.PERSON, id);
                         }
@@ -755,6 +836,35 @@
             }
         }
 
+        // Insert subId value
+        int subId;
+        if (values.containsKey(Telephony.Sms.SUBSCRIPTION_ID)) {
+            subId = values.getAsInteger(Telephony.Sms.SUBSCRIPTION_ID);
+        } else {
+            // TODO (b/256992531): Currently, one sim card is set as default sms subId in work
+            //  profile. Default sms subId should be updated based on user pref.
+            subId = SmsManager.getDefaultSmsSubscriptionId();
+            if (SubscriptionManager.isValidSubscriptionId(subId)) {
+                values.put(Telephony.Sms.SUBSCRIPTION_ID, subId);
+            }
+        }
+
+
+        if (table.equals(TABLE_SMS)) {
+            // Get destination address from values
+            String address = "";
+            if (values.containsKey(Sms.ADDRESS)) {
+                address = values.getAsString(Sms.ADDRESS);
+            }
+
+            if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(), subId,
+                    callerUserHandle, address)) {
+                TelephonyUtils.showSwitchToManagedProfileDialogIfAppropriate(getContext(), subId,
+                        callerUid, callerPkg);
+                return null;
+            }
+        }
+
         rowID = db.insert(table, "body", values);
 
         // Don't use a trigger for updating the words table because of a bug
@@ -769,6 +879,7 @@
             cv.put(Telephony.MmsSms.WordsTable.INDEXED_TEXT, values.getAsString("body"));
             cv.put(Telephony.MmsSms.WordsTable.SOURCE_ROW_ID, rowID);
             cv.put(Telephony.MmsSms.WordsTable.TABLE_ID, 1);
+            cv.put(MmsSms.WordsTable.SUBSCRIPTION_ID, subId);
             db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv);
         }
         if (rowID > 0) {
@@ -848,12 +959,44 @@
 
     @Override
     public int delete(Uri url, String where, String[] whereArgs) {
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
+        final int callerUid = Binder.getCallingUid();
+        final long token = Binder.clearCallingIdentity();
+
+        String selectionBySubIds = null;
+        String selectionByEmergencyNumbers = null;
+        try {
+            // Filter SMS based on subId and emergency numbers.
+            selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+                    callerUserHandle);
+            selectionByEmergencyNumbers = ProviderUtil
+                    .getSelectionByEmergencyNumbers(getContext());
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+
+        String filter = "";
+        if (selectionBySubIds == null && selectionByEmergencyNumbers == null) {
+            // No subscriptions associated with user and no emergency numbers
+            filter = null;
+        } else if (selectionBySubIds != null && selectionByEmergencyNumbers != null) {
+            filter = (selectionBySubIds + " OR " + selectionByEmergencyNumbers);
+        } else {
+            filter = selectionBySubIds == null ?
+                    selectionByEmergencyNumbers : selectionBySubIds;
+        }
+
         int count;
         int match = sURLMatcher.match(url);
         SQLiteDatabase db = getWritableDatabase(match);
         boolean notifyIfNotDefault = true;
         switch (match) {
             case SMS_ALL:
+                if (filter == null) {
+                    // No subscriptions associated with user and no emergency numbers, return 0.
+                    return 0;
+                }
+                where = DatabaseUtils.concatenateWhere(where, filter);
                 count = db.delete(TABLE_SMS, where, whereArgs);
                 if (count != 0) {
                     // Don't update threads unless something changed.
@@ -884,6 +1027,11 @@
 
                 // delete the messages from the sms table
                 where = DatabaseUtils.concatenateWhere("thread_id=" + threadID, where);
+                if (filter == null) {
+                    // No subscriptions associated with user and no emergency numbers, return 0.
+                    return 0;
+                }
+                where = DatabaseUtils.concatenateWhere(where, filter);
                 count = db.delete(TABLE_SMS, where, whereArgs);
                 MmsSmsDatabaseHelper.updateThread(db, threadID);
                 break;
@@ -907,6 +1055,11 @@
                 break;
 
             case SMS_STATUS_PENDING:
+                if (selectionBySubIds == null) {
+                    // No subscriptions associated with user, return 0.
+                    return 0;
+                }
+                where = DatabaseUtils.concatenateWhere(where, selectionBySubIds);
                 count = db.delete("sr_pending", where, whereArgs);
                 break;
 
@@ -924,6 +1077,13 @@
                             throw new IllegalArgumentException("Wrong path segements, uri= " + url);
                         }
                     }
+
+                    if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(),
+                            subId, callerUserHandle)) {
+                        // If subId is not associated with user, return 0.
+                        return 0;
+                    }
+
                     deletedCnt = deleteAllMessagesFromIcc(subId);
                     // Notify changes even failure case since there might be some changes should be
                     // known.
@@ -954,6 +1114,13 @@
                     } catch (NumberFormatException e) {
                         throw new IllegalArgumentException("Wrong path segements, uri= " + url);
                     }
+
+                    if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(),
+                            subId, callerUserHandle)) {
+                        // If subId is not associated with user, return 0.
+                        return 0;
+                    }
+
                     success = deleteMessageFromIcc(subId, messageIndex);
                     // Notify changes even failure case since there might be some changes should be
                     // known.
@@ -1034,6 +1201,7 @@
     @Override
     public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
         final int callerUid = Binder.getCallingUid();
+        final UserHandle callerUserHandle = Binder.getCallingUserHandle();
         final String callerPkg = getCallingPackage();
         int count = 0;
         String table = TABLE_SMS;
@@ -1103,6 +1271,43 @@
             values.remove(Sms.CREATOR);
         }
 
+        final long token = Binder.clearCallingIdentity();
+        String selectionBySubIds = null;
+        String selectionByEmergencyNumbers = null;
+        try {
+            // Filter SMS based on subId and emergency numbers.
+            selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+                    callerUserHandle);
+            if (table.equals(TABLE_SMS)) {
+                selectionByEmergencyNumbers = ProviderUtil
+                        .getSelectionByEmergencyNumbers(getContext());
+            }
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+
+        if (table.equals(TABLE_SMS)) {
+            if (selectionBySubIds == null && selectionByEmergencyNumbers == null) {
+                // No subscriptions associated with user and no emergency numbers, return 0.
+                return 0;
+            }
+        } else {
+            if (selectionBySubIds == null) {
+                // No subscriptions associated with user, return 0.
+                return 0;
+            }
+        }
+
+
+        String filter = "";
+        if (selectionBySubIds != null && selectionByEmergencyNumbers != null) {
+            filter = (selectionBySubIds + " OR " + selectionByEmergencyNumbers);
+        } else {
+            filter = selectionBySubIds == null ?
+                    selectionByEmergencyNumbers : selectionBySubIds;
+        }
+        where = DatabaseUtils.concatenateWhere(where, filter);
+
         where = DatabaseUtils.concatenateWhere(where, extraWhere);
         count = db.update(table, values, where, whereArgs);
 
@@ -1192,13 +1397,13 @@
         sURLMatcher.addURI("sms", "failed/#", SMS_FAILED_ID);
         sURLMatcher.addURI("sms", "queued", SMS_QUEUED);
         sURLMatcher.addURI("sms", "conversations", SMS_CONVERSATIONS);
-        sURLMatcher.addURI("sms", "conversations/*", SMS_CONVERSATIONS_ID);
+        sURLMatcher.addURI("sms", "conversations/#", SMS_CONVERSATIONS_ID);
         sURLMatcher.addURI("sms", "raw", SMS_RAW_MESSAGE);
         sURLMatcher.addURI("sms", "raw/permanentDelete", SMS_RAW_MESSAGE_PERMANENT_DELETE);
         sURLMatcher.addURI("sms", "attachments", SMS_ATTACHMENT);
         sURLMatcher.addURI("sms", "attachments/#", SMS_ATTACHMENT_ID);
         sURLMatcher.addURI("sms", "threadID", SMS_NEW_THREAD_ID);
-        sURLMatcher.addURI("sms", "threadID/*", SMS_QUERY_THREAD_ID);
+        sURLMatcher.addURI("sms", "threadID/#", SMS_QUERY_THREAD_ID);
         sURLMatcher.addURI("sms", "status/#", SMS_STATUS_ID);
         sURLMatcher.addURI("sms", "sr_pending", SMS_STATUS_PENDING);
         sURLMatcher.addURI("sms", "icc", SMS_ALL_ICC);
@@ -1221,4 +1426,49 @@
     SQLiteDatabase getWritableDatabase(int match) {
         return  getDBOpenHelper(match).getWritableDatabase();
     }
+
+    private BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            switch (intent.getAction()) {
+                case Intent.ACTION_USER_REMOVED:
+                    UserHandle userToBeRemoved  = intent.getParcelableExtra(Intent.EXTRA_USER,
+                            UserHandle.class);
+                    UserManager userManager = context.getSystemService(UserManager.class);
+                    if ((userToBeRemoved == null) || (userManager == null) ||
+                            (!userManager.isManagedProfile(userToBeRemoved.getIdentifier()))) {
+                        // Do not delete SMS if removed profile is not managed profile.
+                        return;
+                    }
+                    Log.d(TAG, "Received ACTION_USER_REMOVED for managed profile - Deleting SMS.");
+
+                    // Deleting SMS related to managed profile.
+                    Uri uri = Sms.CONTENT_URI;
+                    int match = sURLMatcher.match(uri);
+                    SQLiteDatabase db = getWritableDatabase(match);
+
+                    final long token = Binder.clearCallingIdentity();
+                    String selectionBySubIds;
+                    try {
+                        // Filter SMS based on subId.
+                        selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+                                userToBeRemoved);
+                    } finally {
+                        Binder.restoreCallingIdentity(token);
+                    }
+                    if (selectionBySubIds == null) {
+                        // No subscriptions associated with user, return.
+                        return;
+                    }
+
+                    int count = db.delete(TABLE_SMS, selectionBySubIds, null);
+                    if (count != 0) {
+                        // Don't update threads unless something changed.
+                        MmsSmsDatabaseHelper.updateThreads(db, selectionBySubIds, null);
+                        notifyChange(true, uri, getCallingPackage());
+                    }
+                    break;
+            }
+        }
+    };
 }
diff --git a/src/com/android/providers/telephony/SqlQueryChecker.java b/src/com/android/providers/telephony/SqlQueryChecker.java
index a98dd25..f9e3c17 100644
--- a/src/com/android/providers/telephony/SqlQueryChecker.java
+++ b/src/com/android/providers/telephony/SqlQueryChecker.java
@@ -16,11 +16,13 @@
 
 package com.android.providers.telephony;
 
+import android.util.Log;
+
 public class SqlQueryChecker {
     private static final String SELECT_TOKEN = "select";
 
     static void checkToken(String token) {
-        if (SELECT_TOKEN.equals(token.toLowerCase())) {
+        if (SELECT_TOKEN.equalsIgnoreCase(token)) {
             throw new IllegalArgumentException("SELECT token not allowed in query");
         }
     }
@@ -32,14 +34,18 @@
      */
     static void checkQueryParametersForSubqueries(String[] projection,
             String selection, String sortOrder) {
+        Log.v("MmsProvider", "inside checkQueryParametersForSubqueries");
         if (projection != null) {
             for (String proj : projection) {
+                Log.v("MmsProvider", "checkQueryParametersForSubqueries checking proj: " + proj);
                 SQLiteTokenizer.tokenize(proj, SQLiteTokenizer.OPTION_NONE,
                         SqlQueryChecker::checkToken);
             }
         }
+        Log.v("MmsProvider", "checkQueryParametersForSubqueries checking sel: " + selection);
         SQLiteTokenizer.tokenize(selection, SQLiteTokenizer.OPTION_NONE,
                 SqlQueryChecker::checkToken);
+        Log.v("MmsProvider", "checkQueryParametersForSubqueries checking sort: " + sortOrder);
         SQLiteTokenizer.tokenize(sortOrder, SQLiteTokenizer.OPTION_NONE,
                 SqlQueryChecker::checkToken);
     }
diff --git a/src/com/android/providers/telephony/TelephonyBackupAgent.java b/src/com/android/providers/telephony/TelephonyBackupAgent.java
index 34fed99..5f75117 100644
--- a/src/com/android/providers/telephony/TelephonyBackupAgent.java
+++ b/src/com/android/providers/telephony/TelephonyBackupAgent.java
@@ -31,11 +31,11 @@
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.database.Cursor;
-import android.database.DatabaseUtils;
 import android.net.Uri;
 import android.os.Build;
 import android.os.ParcelFileDescriptor;
 import android.os.PowerManager;
+import android.os.UserHandle;
 import android.preference.PreferenceManager;
 import android.provider.BaseColumns;
 import android.provider.Telephony;
@@ -288,6 +288,8 @@
     private static final String QUOTA_RESET_TIME = "reset_quota_time";
     private static final long QUOTA_RESET_INTERVAL = 30 * AlarmManager.INTERVAL_DAY; // 30 days.
 
+    // Key for explicitly settings whether mms restore should notify or not
+    static final String NOTIFY = "notify";
 
     static {
         // Consider restored messages read and seen by default. The actual data can override
@@ -732,6 +734,7 @@
         jsonReader.beginArray();
         int total = 0;
         int numExceptions = 0;
+        final int notifyAfterCount = mMaxMsgPerFile;
         while (jsonReader.hasNext()) {
             final Mms mms = readMmsFromReader(jsonReader);
             if (DEBUG) {
@@ -747,17 +750,32 @@
                     continue;
                 }
                 total++;
+                mms.values.put(NOTIFY, false);
                 addMmsMessage(mms);
+                // notifying every 1000 messages to follow sms restore pattern
+                if (total % notifyAfterCount == 0) {
+                    notifyBulkMmsChange();
+                }
             } catch (Exception e) {
                 Log.e(TAG, "putMmsMessagesToProvider", e);
                 numExceptions++;
                 DeferredSmsMmsRestoreService.localLog("putMmsMessagesToProvider: Exception " + e);
             }
         }
+        // notifying for any remaining messages
+        if (total % notifyAfterCount > 0) {
+            notifyBulkMmsChange();
+        }
         Log.d(TAG, "putMmsMessagesToProvider handled " + total + " new messages.");
         incremenentSharedPref(false, total, numExceptions);
     }
 
+    private void notifyBulkMmsChange() {
+        mContentResolver.notifyChange(Telephony.MmsSms.CONTENT_URI, null,
+                ContentResolver.NOTIFY_SYNC_TO_NETWORK, UserHandle.USER_ALL);
+        ProviderUtil.notifyIfNotDefaultSmsApp(Telephony.Mms.CONTENT_URI, null, this);
+    }
+
     @VisibleForTesting
     static final String[] PROJECTION_ID = {BaseColumns._ID};
     private static final int ID_IDX = 0;
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index e09fa72..1364afc 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -108,6 +108,8 @@
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Telephony;
+import android.service.carrier.IApnSourceService;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.telephony.TelephonyProtoEnums;
@@ -116,41 +118,42 @@
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.AtomicFile;
+import android.util.IndentingPrintWriter;
+import android.util.LocalLog;
 import android.util.Log;
 import android.util.Pair;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.TelephonyStatsLog;
 import com.android.internal.util.XmlUtils;
-import android.service.carrier.IApnSourceService;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileDescriptor;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
-import java.lang.Integer;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
-import java.util.zip.CheckedInputStream;
 import java.util.zip.CRC32;
+import java.util.zip.CheckedInputStream;
 
 public class TelephonyProvider extends ContentProvider
 {
@@ -159,7 +162,7 @@
     private static final boolean DBG = true;
     private static final boolean VDBG = false; // STOPSHIP if true
 
-    private static final int DATABASE_VERSION = 57 << 16;
+    private static final int DATABASE_VERSION = 62 << 16;
     private static final int URL_UNKNOWN = 0;
     private static final int URL_TELEPHONY = 1;
     private static final int URL_CURRENT = 2;
@@ -281,6 +284,8 @@
 
     private boolean mManagedApnEnforced;
 
+    private final LocalLog mLocalLog = new LocalLog(128);
+
     /**
      * Mobile country codes where there is a high likelyhood that the MNC has 3 digits
      * and need one more prefix zero to set correct mobile network code value.
@@ -443,6 +448,8 @@
         SIM_INFO_COLUMNS_TO_BACKUP.put(
                 Telephony.SimInfo.COLUMN_USAGE_SETTING,
                 Cursor.FIELD_TYPE_INTEGER);
+        SIM_INFO_COLUMNS_TO_BACKUP.put(
+                Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES, Cursor.FIELD_TYPE_STRING);
     }
 
     @VisibleForTesting
@@ -562,6 +569,7 @@
                 + Telephony.SimInfo.SUBSCRIPTION_TYPE_LOCAL_SIM + ","
                 + Telephony.SimInfo.COLUMN_GROUP_OWNER + " TEXT,"
                 + Telephony.SimInfo.COLUMN_DATA_ENABLED_OVERRIDE_RULES + " TEXT,"
+                + Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES + " TEXT,"
                 + Telephony.SimInfo.COLUMN_IMSI + " TEXT,"
                 + Telephony.SimInfo.COLUMN_UICC_APPLICATIONS_ENABLED + " INTEGER DEFAULT 1,"
                 + Telephony.SimInfo.COLUMN_ALLOWED_NETWORK_TYPES + " BIGINT DEFAULT -1,"
@@ -577,7 +585,12 @@
                 + Telephony.SimInfo.COLUMN_PHONE_NUMBER_SOURCE_IMS + " TEXT,"
                 + Telephony.SimInfo.COLUMN_PORT_INDEX + "  INTEGER DEFAULT -1,"
                 + Telephony.SimInfo.COLUMN_USAGE_SETTING + " INTEGER DEFAULT "
-                + SubscriptionManager.USAGE_SETTING_UNKNOWN
+                + SubscriptionManager.USAGE_SETTING_UNKNOWN + ","
+                + Telephony.SimInfo.COLUMN_TP_MESSAGE_REF +
+                "  INTEGER DEFAULT -1,"
+                + Telephony.SimInfo.COLUMN_USER_HANDLE + " INTEGER DEFAULT "
+                + UserHandle.USER_NULL + ","
+                + Telephony.SimInfo.COLUMN_SATELLITE_ENABLED + " INTEGER DEFAULT -1"
                 + ");";
     }
 
@@ -1805,6 +1818,94 @@
                 oldVersion = 57 << 16 | 6;
             }
 
+            if (oldVersion < (58 << 16 | 6)) {
+                try {
+                    // Try to update the siminfo table with new columns.
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + Telephony.SimInfo.COLUMN_TP_MESSAGE_REF
+                            + "  INTEGER DEFAULT -1;");
+                } catch (SQLiteException e) {
+                    if (DBG) {
+                        log("onUpgrade failed to update " + SIMINFO_TABLE
+                                + " to add message Reference. ");
+                    }
+                }
+                oldVersion = 58 << 16 | 6;
+            }
+
+            if (oldVersion < (59 << 16 | 6)) {
+                try {
+                    // Try to update the siminfo table with new columns.
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + Telephony.SimInfo.COLUMN_USER_HANDLE
+                            + "  INTEGER DEFAULT " + UserHandle.USER_NULL +";");
+                } catch (SQLiteException e) {
+                    if (DBG) {
+                        log("onUpgrade failed to update " + SIMINFO_TABLE
+                                + " to add message Reference. ");
+                    }
+                }
+                oldVersion = 59 << 16 | 6;
+            }
+            if (oldVersion < (60 << 16 | 6)) {
+                // Update the siminfo table with new column enabled_data_mobile_policies
+                // and set its value to be a copy of data_enabled_override_rules.
+                try {
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES
+                            + " TEXT;");
+                } catch (SQLiteException e) {
+                    if (DBG) {
+                        log("onUpgrade failed to insert "
+                                +Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES +" to "
+                                + SIMINFO_TABLE);
+                    }
+                }
+                // Migrate the old Long values over to String
+                String[] proj = {Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
+                        Telephony.SimInfo.COLUMN_DATA_ENABLED_OVERRIDE_RULES};
+                try (Cursor c = db.query(SIMINFO_TABLE, proj, null, null, null, null, null)) {
+                    while (c.moveToNext()) {
+                        fillInEnabledMobileDataPoliciesAtCursor(db, c);
+                    }
+                } catch (SQLiteException e) {
+                    if (DBG) {
+                        log("can't migrate value from COLUMN_DATA_ENABLED_OVERRIDE_RULES to "
+                                + "COLUMN_ENABLED_MOBILE_DATA_POLICIES");
+                    }
+                }
+                oldVersion = 60 << 16 | 6;
+            }
+
+            if (oldVersion < (61 << 16 | 6)) {
+                try {
+                    // If default value of USER_HANDLE column is set to -1, then update it to -10000
+                    db.execSQL("UPDATE " + SIMINFO_TABLE + " SET "
+                            + Telephony.SimInfo.COLUMN_USER_HANDLE + "=" + UserHandle.USER_NULL
+                            + "  WHERE " + Telephony.SimInfo.COLUMN_USER_HANDLE + "=-1;");
+                } catch (SQLiteException e) {
+                    if (DBG) {
+                        log("onUpgrade failed to update " + SIMINFO_TABLE
+                                + " to add message Reference. ");
+                    }
+                }
+                oldVersion = 61 << 16 | 6;
+            }
+
+            if (oldVersion < (62 << 16 | 6)) {
+                try {
+                    // Try to update the siminfo table with new columns.
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + Telephony.SimInfo.COLUMN_SATELLITE_ENABLED
+                            + "  INTEGER DEFAULT -1;");
+                } catch (SQLiteException e) {
+                    if (DBG) {
+                        log("onUpgrade failed to update " + SIMINFO_TABLE
+                                + " to add satellite enabled. ");
+                    }
+                }
+                oldVersion = 62 << 16 | 6;
+            }
             if (DBG) {
                 log("dbh.onUpgrade:- db=" + db + " oldV=" + oldVersion + " newV=" + newVersion);
             }
@@ -2631,8 +2732,8 @@
                 if (oldType.equals("") || newType.equals("")) {
                     newRow.put(TYPE, "");
                 } else {
-                    String[] oldTypes = oldType.toLowerCase().split(",");
-                    String[] newTypes = newType.toLowerCase().split(",");
+                    String[] oldTypes = oldType.toLowerCase(Locale.ROOT).split(",");
+                    String[] newTypes = newType.toLowerCase(Locale.ROOT).split(",");
 
                     if (VDBG) {
                         log("mergeFieldsAndUpdateDb: Calling separateRowsNeeded() oldType=" +
@@ -3025,13 +3126,6 @@
     @Override
     public boolean onCreate() {
         mOpenHelper = new DatabaseHelper(getContext());
-
-        try {
-            PhoneFactory.addLocalLog(TAG, 64);
-        } catch (IllegalArgumentException e) {
-            // ignore
-        }
-
         boolean isNewBuild = false;
         String newBuildId = SystemProperties.get("ro.build.id", null);
         SharedPreferences sp = getContext().getSharedPreferences(BUILD_ID_FILE,
@@ -3101,9 +3195,9 @@
         }
     }
 
-    private static void localLog(String logMsg) {
+    private void localLog(String logMsg) {
         Log.d(TAG, logMsg);
-        PhoneFactory.localLog(TAG, logMsg);
+        mLocalLog.log(logMsg);
     }
 
     private synchronized boolean isManagedApnEnforced() {
@@ -3638,7 +3732,7 @@
                 PersistableBundle backedUpSimInfoEntry, int backupDataFormatVersion,
                 String isoCountryCodeFromDb,
                 List<String> wfcRestoreBlockedCountries) {
-            if (DATABASE_VERSION != 57 << 16) {
+            if (DATABASE_VERSION != 62 << 16) {
                 throw new AssertionError("The database schema has been updated which might make "
                     + "the format of #BACKED_UP_SIM_SPECIFIC_SETTINGS_FILE outdated. Make sure to "
                     + "1) review whether any of the columns in #SIM_INFO_COLUMNS_TO_BACKUP have "
@@ -3680,6 +3774,12 @@
              * Also make sure to add necessary removal of sensitive settings in
              * polishContentValues(ContentValues contentValues).
              */
+            if (backupDataFormatVersion >= 60 << 16) {
+                contentValues.put(Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES,
+                        backedUpSimInfoEntry.getString(
+                                Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES,
+                                DEFAULT_STRING_COLUMN_VALUE));
+            }
             if (backupDataFormatVersion >= 57 << 16) {
                 contentValues.put(Telephony.SimInfo.COLUMN_USAGE_SETTING,
                         backedUpSimInfoEntry.getInt(
@@ -3718,7 +3818,7 @@
                             DEFAULT_INT_COLUMN_VALUE));
             if (isoCountryCodeFromDb != null
                     && !wfcRestoreBlockedCountries
-                            .contains(isoCountryCodeFromDb.toLowerCase())) {
+                            .contains(isoCountryCodeFromDb.toLowerCase(Locale.ROOT))) {
                 // Don't restore COLUMN_WFC_IMS_ENABLED if the sim is from one of the countries that
                 // requires WFC entitlement.
                 contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED,
@@ -3820,10 +3920,19 @@
     }
 
     @Override
-    public synchronized Cursor query(Uri url, String[] projectionIn, String selection,
+    public Cursor query(Uri url, String[] projectionIn, String selection,  String[] selectionArgs,
+            String sort) {
+        if (VDBG) log("query: url=" + url + ", projectionIn=" + Arrays.toString(projectionIn)
+                + ", selection=" + selection + "selectionArgs=" + Arrays.toString(selectionArgs)
+                + ", sort=" + sort);
+        int match = s_urlMatcher.match(url);
+        checkPermissionCompat(match, projectionIn);
+
+        return queryInternal(url, projectionIn, selection, selectionArgs, sort);
+    }
+
+    private synchronized Cursor queryInternal(Uri url, String[] projectionIn, String selection,
             String[] selectionArgs, String sort) {
-        if (VDBG) log("query: url=" + url + ", projectionIn=" + projectionIn + ", selection="
-                + selection + "selectionArgs=" + selectionArgs + ", sort=" + sort);
         int subId = SubscriptionManager.getDefaultSubscriptionId();
         String subIdString;
         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
@@ -3833,7 +3942,6 @@
         List<String> constraints = new ArrayList<String>();
 
         int match = s_urlMatcher.match(url);
-        checkPermissionCompat(match, projectionIn);
         switch (match) {
             case URL_TELEPHONY_USING_SUBID: {
                 // The behaves exactly same as URL_SIM_APN_LIST_ID.
@@ -4018,7 +4126,7 @@
                     qb.appendWhereStandalone(IS_NOT_OWNED_BY_DPC);
                 }
                 return getSubscriptionMatchingAPNList(qb, projectionIn, selection, selectionArgs,
-                    sort, subId);
+                        sort, subId);
             }
 
             default: {
@@ -4120,11 +4228,12 @@
 
         ret = qb.query(db, null, selection, selectionArgs, null, null, sort);
         if (ret == null) {
-            loge("query current APN but cursor is null.");
+            loge("subId:" + subId + " query current APN but cursor is null.");
             return null;
         }
 
-        if (DBG) log("match current APN size:  " + ret.getCount());
+        if (DBG) log("subId:" + subId + " mccmnc=" + mccmnc + " carrierId=" + carrierId +
+                ", match current APN size:  " + ret.getCount());
 
         String[] columnNames = projectionIn != null ? projectionIn : ret.getColumnNames();
         MatrixCursor currentCursor = new MatrixCursor(columnNames);
@@ -4935,6 +5044,12 @@
                                         Telephony.SimInfo.COLUMN_USAGE_SETTING),
                                 usingSubId, subId), null, true, UserHandle.USER_ALL);
                     }
+                    if (values.containsKey(Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES)) {
+                        getContext().getContentResolver().notifyChange(getNotifyContentUri(
+                                Uri.withAppendedPath(Telephony.SimInfo.CONTENT_URI,
+                                        Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES),
+                                usingSubId, subId), null, true, UserHandle.USER_ALL);
+                    }
                     break;
                 default:
                     getContext().getContentResolver().notifyChange(
@@ -5268,7 +5383,7 @@
     }
 
     private static int getMvnoTypeIntFromString(String mvnoType) {
-        String mvnoTypeString = TextUtils.isEmpty(mvnoType) ? mvnoType : mvnoType.toLowerCase();
+        String mvnoTypeString = TextUtils.isEmpty(mvnoType) ? mvnoType : mvnoType.toLowerCase(Locale.ROOT);
         Integer mvnoTypeInt = MVNO_TYPE_STRING_MAP.get(mvnoTypeString);
         return  mvnoTypeInt == null ? 0 : mvnoTypeInt;
     }
@@ -5435,4 +5550,115 @@
                     new String[]{subId});
         }
     }
+
+    /**
+     * Migrate the old values{@link Telephony.SimInfo#COLUMN_DATA_ENABLED_OVERRIDE_RULES} over to
+     * String{@link Telephony.SimInfo#COLUMN_ENABLED_MOBILE_DATA_POLICIES}
+     *
+     * @param db The sqlite database to write to
+     * @param c The {@link Telephony.SimInfo#COLUMN_DATA_ENABLED_OVERRIDE_RULES} values in the sim info
+     *         table.
+     */
+    public static void fillInEnabledMobileDataPoliciesAtCursor(SQLiteDatabase db, Cursor c) {
+        String overrideRule;
+        String subId;
+        try {
+            overrideRule = c.getString(
+                    c.getColumnIndexOrThrow(Telephony.SimInfo.COLUMN_DATA_ENABLED_OVERRIDE_RULES));
+            subId = c.getString(c.getColumnIndexOrThrow(
+                    Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
+        } catch (IllegalArgumentException e) {
+            Log.e(TAG, "COLUMN_DATA_ENABLED_OVERRIDE_RULES not found.");
+            return;
+        }
+
+        if (overrideRule != null) {
+            ContentValues cv = new ContentValues(1);
+
+            // convert override rule to its corresponding mobile data policy
+            overrideRule = overrideRule.contains("mms") ?
+                    String.valueOf(TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED): "";
+            cv.put(Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES, overrideRule);
+            db.update(SIMINFO_TABLE, cv,
+                    Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID + "=?",
+                    new String[]{subId});
+        }
+    }
+
+    /**
+     * Dump the database table.
+     *
+     * @param tableName Table name.
+     * @param pw Print writer.
+     */
+    private void dumpTable(@NonNull String tableName, @NonNull IndentingPrintWriter pw) {
+        try (Cursor cursor = getReadableDatabase().query(false, tableName, null,
+                null, null, null, null, null, null)) {
+            pw.println(tableName + " table:");
+            pw.increaseIndent();
+            while (cursor != null && cursor.moveToNext()) {
+                List<String> columnStrings = new ArrayList<>();
+                String str = "";
+                for (int i = 0; i < cursor.getColumnCount(); i++) {
+                    str = cursor.getColumnName(i) + "=";
+                    int type = cursor.getType(i);
+                    try {
+                        switch (type) {
+                            case 0 /*FIELD_TYPE_NULL*/:
+                                str += "null";
+                                break;
+                            case 1 /*FIELD_TYPE_INTEGER*/:
+                                str += cursor.getInt(i);
+                                break;
+                            case 2 /*FIELD_TYPE_FLOAT*/:
+                                str += cursor.getFloat(i);
+                                break;
+                            case 3 /*FIELD_TYPE_STRING*/:
+                                String columnValue = cursor.getString(i);
+                                // Redact icc_id and card_id
+                                if (SIMINFO_TABLE.equals(tableName)
+                                        && (Telephony.SimInfo.COLUMN_ICC_ID.equals(
+                                                cursor.getColumnName(i))
+                                        || Telephony.SimInfo.COLUMN_CARD_ID.equals(
+                                                cursor.getColumnName(i)))) {
+                                    columnValue = SubscriptionInfo.getPrintableId(columnValue);
+                                }
+                                str += columnValue;
+                                break;
+                            case 4 /*FIELD_TYPE_BLOB*/:
+                                str += "[blob]";
+                                break;
+                            default:
+                                str += "unknown";
+                                break;
+                        }
+                    } catch (Exception e) {
+                        str += "exception";
+                    }
+                    columnStrings.add(str);
+                }
+                pw.println(TextUtils.join(", ", columnStrings));
+            }
+            pw.decreaseIndent();
+        } catch (Exception ex) {
+            pw.println("Exception while dumping the table " + tableName + ", ex=" + ex);
+        }
+    }
+
+    @Override
+    public void dump(FileDescriptor fd, PrintWriter printWriter, String[] args) {
+        IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, "  ");
+        pw.println(TAG + ":");
+        pw.increaseIndent();
+        pw.println("Database:");
+        pw.increaseIndent();
+        dumpTable(SIMINFO_TABLE, pw);
+        dumpTable(CARRIERS_TABLE, pw);
+        pw.decreaseIndent();
+        pw.println("Local log:");
+        pw.increaseIndent();
+        mLocalLog.dump(pw);
+        pw.decreaseIndent();
+        pw.decreaseIndent();
+    }
 }
diff --git a/tests/Android.bp b/tests/Android.bp
index 7695c03..0945bfa 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -10,6 +10,7 @@
         "compatibility-device-util-axt",
         "androidx.test.rules",
         "truth-prebuilt",
+        "androidx.test.core",
     ],
     libs: [
         "android.test.runner",
diff --git a/tests/src/com/android/providers/telephony/MmsProviderTest.java b/tests/src/com/android/providers/telephony/MmsProviderTest.java
new file mode 100644
index 0000000..2e618b0
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/MmsProviderTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.telephony;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.AppOpsManager;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.provider.Telephony;
+import android.telephony.TelephonyManager;
+import android.test.mock.MockContentResolver;
+import android.util.Log;
+
+import junit.framework.TestCase;
+
+import org.junit.Test;
+
+public class MmsProviderTest extends TestCase {
+    private static final String TAG = "MmsProviderTest";
+
+    private MockContentResolver mContentResolver;
+    private MmsProviderTestable mMmsProviderTestable;
+
+    private int notifyChangeCount;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mMmsProviderTestable = new MmsProviderTestable();
+
+        // setup mocks
+        Context context = mock(Context.class);
+        PackageManager packageManager = mock(PackageManager.class);
+        Resources resources = mock(Resources.class);
+        when(context.getSystemService(eq(Context.APP_OPS_SERVICE)))
+                .thenReturn(mock(AppOpsManager.class));
+        when(context.getSystemService(eq(Context.TELEPHONY_SERVICE)))
+                .thenReturn(mock(TelephonyManager.class));
+
+        when(context.checkCallingOrSelfPermission(anyString()))
+                .thenReturn(PackageManager.PERMISSION_GRANTED);
+        when(context.getUserId()).thenReturn(0);
+        when(context.getPackageManager()).thenReturn(packageManager);
+        when(context.getResources()).thenReturn(resources);
+        when(resources.getString(anyInt())).thenReturn("");
+
+        /**
+         * This is used to give the MmsProviderTest a mocked context which takes a
+         * MmsProvider and attaches it to the ContentResolver with telephony authority.
+         * The mocked context also gives WRITE_APN_SETTINGS permissions
+         */
+        mContentResolver = new MockContentResolver() {
+            @Override
+            public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork,
+                    int userHandle) {
+                notifyChangeCount++;
+            }
+        };
+        when(context.getContentResolver()).thenReturn(mContentResolver);
+
+        // Add authority="mms" to given mmsProvider
+        ProviderInfo providerInfo = new ProviderInfo();
+        providerInfo.authority = "mms";
+
+        // Add context to given mmsProvider
+        mMmsProviderTestable.attachInfoForTesting(context, providerInfo);
+        Log.d(TAG, "MockContextWithProvider: mmsProvider.getContext(): "
+                + mMmsProviderTestable.getContext());
+
+        // Add given MmsProvider to mResolver with authority="mms" so that
+        // mResolver can send queries to mMmsProvider
+        mContentResolver.addProvider("mms", mMmsProviderTestable);
+        Log.d(TAG, "MockContextWithProvider: Add MmsProvider to mResolver");
+        notifyChangeCount = 0;
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mMmsProviderTestable.closeDatabase();
+    }
+
+    @Test
+    public void testInsertMms() {
+        final ContentValues values = getTestContentValues();
+
+        Uri expected = Uri.parse("content://mms/1");
+        Uri actual = mContentResolver.insert(Telephony.Mms.CONTENT_URI, values);
+
+        assertEquals(expected, actual);
+        assertEquals(1, notifyChangeCount);
+    }
+
+    @Test
+    public void testInsertMmsWithoutNotify() {
+
+        MmsProvider.ProviderUtilWrapper providerUtilWrapper =
+                mock(MmsProvider.ProviderUtilWrapper.class);
+        when(providerUtilWrapper.isAccessRestricted(
+                any(Context.class), anyString(), anyInt())).thenReturn(false);
+        mMmsProviderTestable.setProviderUtilWrapper(providerUtilWrapper);
+
+        final ContentValues values = getTestContentValues();
+        values.put(TelephonyBackupAgent.NOTIFY, false);
+
+        Uri expected = Uri.parse("content://mms/1");
+        Uri actual = mContentResolver.insert(Telephony.Mms.CONTENT_URI, values);
+
+        assertEquals(expected, actual);
+        assertEquals(0, notifyChangeCount);
+    }
+
+    private ContentValues getTestContentValues() {
+        final ContentValues values = new ContentValues();
+        values.put(Telephony.Mms.READ, 1);
+        values.put(Telephony.Mms.SEEN, 1);
+        values.put(Telephony.Mms.SUBSCRIPTION_ID, 1);
+        values.put(Telephony.Mms.MESSAGE_BOX, Telephony.Mms.MESSAGE_BOX_ALL);
+        values.put(Telephony.Mms.TEXT_ONLY, 1);
+        values.put(Telephony.Mms.THREAD_ID, 1);
+        return values;
+    }
+}
diff --git a/tests/src/com/android/providers/telephony/MmsProviderTestable.java b/tests/src/com/android/providers/telephony/MmsProviderTestable.java
new file mode 100644
index 0000000..cfc0359
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/MmsProviderTestable.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.providers.telephony;
+
+import static com.android.providers.telephony.MmsSmsDatabaseHelper.CREATE_ADDR_TABLE_STR;
+import static com.android.providers.telephony.MmsSmsDatabaseHelper.CREATE_DRM_TABLE_STR;
+import static com.android.providers.telephony.MmsSmsDatabaseHelper.CREATE_PART_TABLE_STR;
+import static com.android.providers.telephony.MmsSmsDatabaseHelper.CREATE_PDU_TABLE_STR;
+import static com.android.providers.telephony.MmsSmsDatabaseHelper.CREATE_RATE_TABLE_STR;
+
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.util.Log;
+
+/**
+ * A subclass of MmsProvider used for testing on an in-memory database
+ */
+public class MmsProviderTestable extends MmsProvider {
+    private static final String TAG = "MmsProviderTestable";
+
+    @Override
+    public boolean onCreate() {
+        Log.d(TAG, "onCreate called: mDbHelper = new InMemoryMmsProviderDbHelper()");
+        mOpenHelper = new InMemoryMmsProviderDbHelper();
+        return true;
+    }
+
+    // close mDbHelper database object
+    protected void closeDatabase() {
+        mOpenHelper.close();
+    }
+
+    /**
+     * An in memory DB for MmsProviderTestable to use
+     */
+    public static class InMemoryMmsProviderDbHelper extends SQLiteOpenHelper {
+
+
+        public InMemoryMmsProviderDbHelper() {
+            super(null,      // no context is needed for in-memory db
+                  null,      // db file name is null for in-memory db
+                  null,      // CursorFactory is null by default
+                  1);        // db version is no-op for tests
+            Log.d(TAG, "InMemoryMmsProviderDbHelper creating in-memory database");
+        }
+
+        @Override
+        public void onCreate(SQLiteDatabase db) {
+            // Set up the mms tables
+            Log.d(TAG, "InMemoryMmsProviderDbHelper onCreate creating the mms tables");
+            db.execSQL(CREATE_PDU_TABLE_STR);
+            db.execSQL(CREATE_ADDR_TABLE_STR);
+            db.execSQL(CREATE_PART_TABLE_STR);
+            db.execSQL(CREATE_RATE_TABLE_STR);
+            db.execSQL(CREATE_DRM_TABLE_STR);
+        }
+
+        @Override
+        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+            Log.d(TAG, "InMemorySmsProviderDbHelper onUpgrade doing nothing");
+        }
+    }
+}
diff --git a/tests/src/com/android/providers/telephony/ProviderUtilTest.java b/tests/src/com/android/providers/telephony/ProviderUtilTest.java
new file mode 100644
index 0000000..1e3020c
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/ProviderUtilTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.telephony;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.telephony.emergency.EmergencyNumber;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class ProviderUtilTest {
+    private static final String TAG = "ProviderUtilTest";
+
+    private Context mContext;
+    @Mock
+    private SubscriptionManager mSubscriptionManager;
+    @Mock
+    private TelephonyManager mTelephonyManager;
+
+    private Map<Integer, List<EmergencyNumber>> mEmergencyNumberList;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+
+        when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+        when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void getSelectionBySubIds_noSubscription() {
+        List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
+        doReturn(subscriptionInfoList).when(mSubscriptionManager)
+                .getSubscriptionInfoListAssociatedWithUser(UserHandle.SYSTEM);
+
+        assertThat(ProviderUtil.getSelectionBySubIds(mContext, UserHandle.SYSTEM))
+                .isEqualTo("sub_id IN ('-1')");
+    }
+
+    @Test
+    public void getSelectionBySubIds_withDefaultSubId() {
+        // As sub_id is not set explicitly, its value will be -1
+        SubscriptionInfo subscriptionInfo1 = new SubscriptionInfo.Builder()
+                .setSimSlotIndex(0)
+                .build();
+        List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
+        subscriptionInfoList.add(subscriptionInfo1);
+
+        doReturn(subscriptionInfoList).when(mSubscriptionManager)
+                .getSubscriptionInfoListAssociatedWithUser(UserHandle.SYSTEM);
+
+        assertThat(ProviderUtil.getSelectionBySubIds(mContext, UserHandle.SYSTEM))
+                .isEqualTo("sub_id IN ('-1','-1')");
+    }
+
+    @Test
+    public void getSelectionBySubIds_withActiveSubscriptions() {
+        SubscriptionInfo subscriptionInfo1 = new SubscriptionInfo.Builder()
+                .setId(1)
+                .setSimSlotIndex(0)
+                .build();
+        List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
+
+        SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo.Builder()
+                .setId(2)
+                .setSimSlotIndex(1)
+                .build();
+
+        subscriptionInfoList.add(subscriptionInfo1);
+        subscriptionInfoList.add(subscriptionInfo2);
+        doReturn(subscriptionInfoList).when(mSubscriptionManager)
+                .getSubscriptionInfoListAssociatedWithUser(UserHandle.SYSTEM);
+
+        assertThat(ProviderUtil.getSelectionBySubIds(mContext, UserHandle.SYSTEM))
+                .isEqualTo("sub_id IN ('1','2','-1')");
+    }
+
+    @Test
+    public void getSelectionByEmergencyNumbers_nullEmergencyNumberList() {
+        doReturn(null).when(mTelephonyManager).getEmergencyNumberList();
+
+        assertThat(ProviderUtil.getSelectionByEmergencyNumbers(mContext))
+                .isEqualTo(null);
+    }
+
+    @Test
+    public void getSelectionByEmergencyNumbers_emptyEmergencyNumberList() {
+        mEmergencyNumberList = Map.of();
+        doReturn(mEmergencyNumberList).when(mTelephonyManager).getEmergencyNumberList();
+
+        assertThat(ProviderUtil.getSelectionByEmergencyNumbers(mContext))
+                .isEqualTo(null);
+    }
+
+    @Test
+    public void getSelectionBySubIds_withEmergencyNumberList() {
+        // Create emergencyNumberList for testing.
+        List<EmergencyNumber> emergencyNumberList1 = new ArrayList<EmergencyNumber>();
+        emergencyNumberList1.add(new EmergencyNumber("911", "us", "000",
+                EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE,null, 0, 0));
+        emergencyNumberList1.add(new EmergencyNumber("112", "us", "000",
+                EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE,null, 0, 0));
+        mEmergencyNumberList = Map.of(-1, emergencyNumberList1);
+        doReturn(mEmergencyNumberList).when(mTelephonyManager).getEmergencyNumberList();
+
+        assertThat(ProviderUtil.getSelectionByEmergencyNumbers(mContext))
+                .isEqualTo("address IN ('911','112')");
+    }
+}
\ No newline at end of file
diff --git a/tests/src/com/android/providers/telephony/SatelliteProviderTest.java b/tests/src/com/android/providers/telephony/SatelliteProviderTest.java
new file mode 100644
index 0000000..21fa38c
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/SatelliteProviderTest.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.telephony;
+
+import android.content.ContentValues;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.provider.Telephony;
+import android.test.mock.MockContentResolver;
+import android.test.mock.MockContext;
+import android.text.TextUtils;
+import android.util.Log;
+
+import junit.framework.TestCase;
+
+import org.junit.Test;
+
+public class SatelliteProviderTest extends TestCase {
+    private static final String TAG = "SatelliteProviderTest";
+
+    private MockContextWithProvider mContext;
+    private MockContentResolver mContentResolver;
+    private SatelliteProviderTestable mSatelliteProviderTestable;
+
+    /**
+     * This is used to give the SatelliteProviderTest a mocked context which takes a
+     * SatelliteProvider and attaches it to the ContentResolver.
+     */
+    private class MockContextWithProvider extends MockContext {
+        private final MockContentResolver mResolver;
+
+        public MockContextWithProvider(SatelliteProvider satelliteProvider) {
+            mResolver = new MockContentResolver();
+
+            ProviderInfo providerInfo = new ProviderInfo();
+            providerInfo.authority = Telephony.SatelliteDatagrams.PROVIDER_NAME;
+
+            // Add context to given satelliteProvider
+            satelliteProvider.attachInfoForTesting(this, providerInfo);
+            Log.d(TAG, "MockContextWithProvider: satelliteProvider.getContext(): "
+                    + satelliteProvider.getContext());
+
+            // Add given satelliteProvider to mResolver, so that mResolver can send queries
+            // to the provider.
+            mResolver.addProvider(Telephony.SatelliteDatagrams.PROVIDER_NAME, satelliteProvider);
+            Log.d(TAG, "MockContextWithProvider: Add satelliteProvider to mResolver");
+        }
+
+        @Override
+        public Object getSystemService(String name) {
+            Log.d(TAG, "getSystemService: returning null");
+            return null;
+        }
+
+        @Override
+        public Resources getResources() {
+            Log.d(TAG, "getResources: returning null");
+            return null;
+        }
+
+        @Override
+        public MockContentResolver getContentResolver() {
+            return mResolver;
+        }
+
+        // Gives permission to write to the apn table within the MockContext
+        @Override
+        public int checkCallingOrSelfPermission(String permission) {
+            if (TextUtils.equals(permission, "android.permission.WRITE_APN_SETTINGS")) {
+                Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
+                        + ", returning PackageManager.PERMISSION_GRANTED");
+                return PackageManager.PERMISSION_GRANTED;
+            } else {
+                Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
+                        + ", returning PackageManager.PERMISSION_DENIED");
+                return PackageManager.PERMISSION_DENIED;
+            }
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mSatelliteProviderTestable = new SatelliteProviderTestable();
+        mContext = new MockContextWithProvider(mSatelliteProviderTestable);
+        mContentResolver = (MockContentResolver) mContext.getContentResolver();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mSatelliteProviderTestable.closeDatabase();
+    }
+
+    @Test
+    public void testInsertDatagram() {
+        long testDatagramId = 1;
+        String testDatagram = "testInsertDatagram";
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID,
+                testDatagramId);
+        contentValues.put(Telephony.SatelliteDatagrams.COLUMN_DATAGRAM, testDatagram.getBytes());
+
+        try {
+            mContentResolver.insert(Telephony.SatelliteDatagrams.CONTENT_URI, contentValues);
+        } catch (Exception e){
+            Log.d(TAG, "Error inserting satellite datagram:" + e);
+        }
+
+        String whereClause = (Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID
+                + "=" +testDatagramId);
+        try (Cursor cursor = mContentResolver.query(Telephony.SatelliteDatagrams.CONTENT_URI,
+                null, whereClause, null, null)) {
+            cursor.moveToFirst();
+            byte[] datagram = cursor.getBlob(0);
+            assertEquals(testDatagram, new String(datagram));
+        } catch (Exception e) {
+            Log.d(TAG, "Exception in getting count:" + e);
+        }
+    }
+
+    @Test
+    public void testDeleteDatagram() {
+        long testDatagramId = 10;
+        String testDatagram = "testDeleteDatagram";
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID,
+                testDatagramId);
+        contentValues.put(Telephony.SatelliteDatagrams.COLUMN_DATAGRAM, testDatagram.getBytes());
+
+        try {
+            mContentResolver.insert(Telephony.SatelliteDatagrams.CONTENT_URI, contentValues);
+        } catch (Exception e){
+            Log.d(TAG, "Error inserting satellite datagram:" + e);
+        }
+
+        int numRowsDeleted = -1;
+        String whereClause = (Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID
+                + "=" +testDatagramId);
+        try {
+            numRowsDeleted = mContentResolver.delete(Telephony.SatelliteDatagrams.CONTENT_URI,
+                    whereClause, null);
+        } catch (Exception e) {
+            Log.d(TAG, "Error deleting values:" + e);
+        }
+        assertEquals(1, numRowsDeleted);
+
+        try (Cursor cursor = mContentResolver.query(Telephony.SatelliteDatagrams.CONTENT_URI,
+                null, whereClause, null, null)) {
+            assertNotNull(cursor);
+            assertEquals(0, cursor.getCount());
+        } catch (Exception e) {
+            Log.d(TAG, "Exception in getting count:" + e);
+        }
+    }
+}
diff --git a/tests/src/com/android/providers/telephony/SatelliteProviderTestable.java b/tests/src/com/android/providers/telephony/SatelliteProviderTestable.java
new file mode 100644
index 0000000..ba40214
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/SatelliteProviderTestable.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.telephony;
+
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.provider.Telephony;
+import android.util.Log;
+
+import static com.android.providers.telephony.SatelliteDatabaseHelper.*;
+
+/**
+ * A subclass of SatelliteProvider used for testing on an in-memory database.
+ */
+public class SatelliteProviderTestable extends SatelliteProvider {
+    private static final String TAG = "SatelliteProviderTestable";
+
+    private InMemorySatelliteProviderDbHelper mDbHelper;
+
+    @Override
+    public boolean onCreate() {
+        Log.d(TAG, "onCreate called: mDbHelper = new InMemorySatelliteProviderDbHelper()");
+        mDbHelper = new InMemorySatelliteProviderDbHelper();
+        return true;
+    }
+
+    // close mDbHelper database object
+    protected void closeDatabase() {
+        mDbHelper.close();
+    }
+
+    @Override
+    SQLiteDatabase getReadableDatabase() {
+        Log.d(TAG, "getReadableDatabase called" + mDbHelper.getReadableDatabase());
+        return mDbHelper.getReadableDatabase();
+    }
+
+    @Override
+    SQLiteDatabase getWritableDatabase() {
+        Log.d(TAG, "getWritableDatabase called" + mDbHelper.getWritableDatabase());
+        return mDbHelper.getWritableDatabase();
+    }
+
+    public static class InMemorySatelliteProviderDbHelper extends SQLiteOpenHelper {
+
+        public InMemorySatelliteProviderDbHelper() {
+            super(null,      // no context is needed for in-memory db
+                    null,    // db file name is null for in-memory db
+                    null,    // CursorFactory is null by default
+                    1);      // db version is no-op for tests
+            Log.d(TAG, "InMemorySatelliteProviderDbHelper creating in-memory database");
+        }
+
+        @Override
+        public void onCreate(SQLiteDatabase db) {
+            //set up the Datagram table
+            Log.d(TAG, "InMemorySatelliteProviderDbHelper onCreate creating the "
+                    + "datagram table");
+            db.execSQL(getStringForDatagramTableCreation(Telephony.SatelliteDatagrams.TABLE_NAME));
+        }
+
+        @Override
+        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+            Log.d(TAG, "InMemorySatelliteProviderDbHelper onUpgrade doing nothing");
+            return;
+        }
+    }
+ }
diff --git a/tests/src/com/android/providers/telephony/SmsProviderTest.java b/tests/src/com/android/providers/telephony/SmsProviderTest.java
index 6a225af..37bbb29 100644
--- a/tests/src/com/android/providers/telephony/SmsProviderTest.java
+++ b/tests/src/com/android/providers/telephony/SmsProviderTest.java
@@ -17,9 +17,11 @@
 package com.android.providers.telephony;
 
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.spy;
 
 import android.app.AppOpsManager;
 import android.content.ContentResolver;
@@ -33,13 +35,19 @@
 import android.net.Uri;
 import android.os.Build;
 import android.os.Process;
+import android.os.UserHandle;
 import android.provider.Telephony;
+import android.telephony.SmsManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.test.mock.MockContentResolver;
 import android.test.mock.MockContext;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.Log;
 
+
+import androidx.test.core.app.ApplicationProvider;
 import androidx.test.InstrumentationRegistry;
 
 import junit.framework.TestCase;
@@ -49,6 +57,9 @@
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Tests for testing CRUD operations of SmsProvider.
  * Uses a MockContentResolver to test insert
@@ -64,11 +75,12 @@
 public class SmsProviderTest extends TestCase {
     private static final String TAG = "SmsProviderTest";
 
-    @Mock private Context mContext;
+    private Context mContext;
     private MockContentResolver mContentResolver;
     private SmsProviderTestable mSmsProviderTestable;
     @Mock private PackageManager mPackageManager;
     @Mock private Resources mMockResources;
+    @Mock private SubscriptionManager mSubscriptionManager;
 
     private int notifyChangeCount;
 
@@ -92,6 +104,7 @@
         super.setUp();
         MockitoAnnotations.initMocks(this);
         mSmsProviderTestable = new SmsProviderTestable();
+        mContext = spy(ApplicationProvider.getApplicationContext());
 
         when(mContext.getSystemService(eq(Context.APP_OPS_SERVICE)))
                 .thenReturn(mock(AppOpsManager.class));
@@ -137,6 +150,20 @@
         mContentResolver.addProvider("sms", mSmsProviderTestable);
         Log.d(TAG, "MockContextWithProvider: Add SmsProvider to mResolver");
         notifyChangeCount = 0;
+
+        when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+        List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
+        SubscriptionInfo subscriptionInfo1 = new SubscriptionInfo.Builder()
+                .setId(SmsManager.getDefaultSmsSubscriptionId())
+                .setSimSlotIndex(0)
+                .build();
+        subscriptionInfoList.add(subscriptionInfo1);
+        // Return subscriptions associated with SYSTEM user.
+        doReturn(subscriptionInfoList).when(mSubscriptionManager)
+                .getSubscriptionInfoListAssociatedWithUser(UserHandle.SYSTEM);
+        doReturn(true).when(mSubscriptionManager).isSubscriptionAssociatedWithUser(
+                SubscriptionManager.getDefaultSmsSubscriptionId(),
+                UserHandle.of(UserHandle.USER_SYSTEM));
     }
 
     @Override
@@ -150,7 +177,6 @@
     public void testInsertUri() {
         // insert test contentValues
         final ContentValues values = new ContentValues();
-        values.put(Telephony.Sms.SUBSCRIPTION_ID, 1);
         values.put(Telephony.Sms.ADDRESS, "12345");
         values.put(Telephony.Sms.BODY, "test");
         values.put(Telephony.Sms.DATE, System.currentTimeMillis()); // milliseconds
diff --git a/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
index f6a9c7f..bf0f49b 100644
--- a/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
@@ -19,7 +19,6 @@
 import static org.junit.Assert.assertArrayEquals;
 
 import android.annotation.TargetApi;
-import android.app.backup.BackupDataOutput;
 import android.app.backup.FullBackupDataOutput;
 import android.content.ContentProvider;
 import android.content.ContentResolver;
@@ -43,6 +42,7 @@
 import android.util.JsonWriter;
 import android.util.SparseArray;
 
+import com.android.compatibility.common.util.ShellIdentityUtils;
 import com.android.internal.telephony.PhoneFactory;
 
 import libcore.io.IoUtils;
@@ -54,13 +54,11 @@
 import org.json.JSONObject;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -652,13 +650,21 @@
 
     /**
      * Test restore mms with the empty json array "[]".
-     * @throws Exception
      */
-    public void testRestoreMms_NoMms() throws Exception {
+    public void testRestoreMms_NoMms() {
         JsonReader jsonReader = new JsonReader(new StringReader(EMPTY_JSON_ARRAY));
         FakeMmsProvider mmsProvider = new FakeMmsProvider(null);
         mMockContentResolver.addProvider("mms", mmsProvider);
-        mTelephonyBackupAgent.putMmsMessagesToProvider(jsonReader);
+        ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyBackupAgent, (agent) -> {
+                    try {
+                        agent.putMmsMessagesToProvider(jsonReader);
+                    } catch (IOException e) {
+                        fail("Encountered exception: " + e);
+                    }
+                    return null;
+                }
+        );
         assertEquals(0, mmsProvider.getRowsAdded());
     }
 
@@ -670,7 +676,16 @@
         JsonReader jsonReader = new JsonReader(new StringReader(addRandomDataToJson(mAllMmsJson)));
         FakeMmsProvider mmsProvider = new FakeMmsProvider(mMmsAllContentValues);
         mMockContentResolver.addProvider("mms", mmsProvider);
-        mTelephonyBackupAgent.putMmsMessagesToProvider(jsonReader);
+        ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyBackupAgent, (agent) -> {
+                    try {
+                        agent.putMmsMessagesToProvider(jsonReader);
+                    } catch (IOException e) {
+                        fail("Encountered exception: " + e);
+                    }
+                    return null;
+                }
+        );
         assertEquals(18, mmsProvider.getRowsAdded());
         assertEquals(mThreadProvider.mIsThreadArchived, mThreadProvider.mUpdateThreadsArchived);
     }
@@ -684,7 +699,16 @@
                 (new StringReader(addRandomDataToJson(mMmsAllAttachmentJson)));
         FakeMmsProvider mmsProvider = new FakeMmsProvider(mMmsAllContentValues);
         mMockContentResolver.addProvider("mms", mmsProvider);
-        mTelephonyBackupAgent.putMmsMessagesToProvider(jsonReader);
+        ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyBackupAgent, (agent) -> {
+                    try {
+                        agent.putMmsMessagesToProvider(jsonReader);
+                    } catch (IOException e) {
+                        fail("Encountered exception: " + e);
+                    }
+                    return null;
+                }
+        );
         assertEquals(7, mmsProvider.getRowsAdded());
     }
 
@@ -694,7 +718,16 @@
         FakeMmsProvider mmsProvider = new FakeMmsProvider(mMmsNullBodyContentValues);
         mMockContentResolver.addProvider("mms", mmsProvider);
 
-        mTelephonyBackupAgent.putMmsMessagesToProvider(jsonReader);
+        ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyBackupAgent, (agent) -> {
+                    try {
+                        agent.putMmsMessagesToProvider(jsonReader);
+                    } catch (IOException e) {
+                        fail("Encountered exception: " + e);
+                    }
+                    return null;
+                }
+        );
 
         assertEquals(3, mmsProvider.getRowsAdded());
     }
@@ -943,6 +976,8 @@
             for (String key : modifiedValues.keySet()) {
                 assertEquals("Key:"+key, modifiedValues.get(key), values.get(key));
             }
+            values.remove(TelephonyBackupAgent.NOTIFY); // notify gets removed before final values
+
             assertEquals(modifiedValues.size(), values.size());
             return retUri;
         }
diff --git a/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java b/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
index 9de138c..26a3a46 100644
--- a/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
@@ -19,12 +19,16 @@
 import static android.provider.Telephony.Carriers;
 
 import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
+import android.os.UserHandle;
 import android.provider.Telephony;
 import android.telephony.SubscriptionManager;
 import android.text.TextUtils;
@@ -317,6 +321,40 @@
     }
 
     @Test
+    public void databaseHelperOnUpgrade_hasMessageReferenceField() {
+        Log.d(TAG, "databaseHelperOnUpgrade_hasMessageReferenceField");
+        // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+        SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+        mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext));
+
+        // the upgraded db must have
+        // Telephony.SimInfo.COLUMN_TP_MESSAGE_REF
+        Cursor cursor = db.query("siminfo", null, null, null, null, null, null);
+        String[] upgradedColumns = cursor.getColumnNames();
+        Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns));
+
+        assertTrue(Arrays.asList(upgradedColumns).contains(
+                Telephony.SimInfo.COLUMN_TP_MESSAGE_REF));
+    }
+
+    @Test
+    public void databaseHelperOnUpgrade_hasEnabledMobileDataPolicies() {
+        Log.d(TAG, "databaseHelperOnUpgrade_hasEnabledMobileDataPolicies");
+        // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+        SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+        mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext));
+
+        // the upgraded db must have
+        // Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES field
+        Cursor cursor = db.query("siminfo", null, null, null, null, null, null);
+        String[] upgradedColumns = cursor.getColumnNames();
+        Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns));
+
+        assertTrue(Arrays.asList(upgradedColumns).contains(
+                Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES));
+    }
+
+    @Test
     public void databaseHelperOnUpgrade_hasLingeringNetworkTypeAlwaysOnMtuFields() {
         Log.d(TAG, "databaseHelperOnUpgrade_hasLingeringNetworkTypeAlwaysOnMtuFields");
         // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
@@ -351,6 +389,93 @@
                 Telephony.SimInfo.COLUMN_USAGE_SETTING));
     }
 
+    @Test
+    public void databaseHelperOnUpgrade_hasUserHandleField() {
+        Log.d(TAG, "databaseHelperOnUpgrade_hasUserHandleField");
+        // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+        SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+        mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext));
+
+        // the upgraded db must have
+        // Telephony.SimInfo.COLUMN_USER_HANDLE
+        Cursor cursor = db.query("siminfo", null, null, null, null, null, null);
+        String[] upgradedColumns = cursor.getColumnNames();
+        Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns));
+
+        assertTrue(Arrays.asList(upgradedColumns).contains(
+                Telephony.SimInfo.COLUMN_USER_HANDLE));
+    }
+
+    @Test
+    public void databaseHelperOnUpgrade_hasUserHandleField_updateNullUserHandleValue() {
+        Log.d(TAG, "databaseHelperOnUpgrade_hasUserHandleField_updateNullUserHandleValue");
+        // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+        SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+        // UserHandle column is added in version 59 .
+        mHelper.onUpgrade(db, (4 << 16), 59);
+
+        // The upgraded db must have Telephony.SimInfo.COLUMN_USER_HANDLE.
+        Cursor cursor = db.query("siminfo", null, null, null,
+                null, null, null);
+        String[] upgradedColumns = cursor.getColumnNames();
+        Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns));
+        assertTrue(Arrays.asList(upgradedColumns).contains(Telephony.SimInfo.COLUMN_USER_HANDLE));
+
+        // Insert test contentValues into db.
+        final int insertSubId = 11;
+        ContentValues contentValues = new ContentValues();
+        // Set userHandle=-1
+        contentValues.put(Telephony.SimInfo.COLUMN_USER_HANDLE, -1);
+        contentValues.put(Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID, insertSubId);
+        // Populate NON NULL columns.
+        contentValues.put(Telephony.SimInfo.COLUMN_ICC_ID, "123");
+        contentValues.put(Telephony.SimInfo.COLUMN_DISPLAY_NUMBER_FORMAT, 0);
+        contentValues.put(Telephony.SimInfo.COLUMN_CARD_ID, "123");
+        db.insert("siminfo", null, contentValues);
+
+        // Query UserHandle value from db which should be equal to -1.
+        final String[] testProjection = {Telephony.SimInfo.COLUMN_USER_HANDLE};
+        final String selection = Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID + "=?";
+        String[] selectionArgs = { Integer.toString(insertSubId) };
+        cursor = db.query("siminfo", testProjection, selection, selectionArgs,
+                null, null, null);
+        assertNotNull(cursor);
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+        int userHandleVal = cursor.getInt(0);
+        assertEquals(-1, userHandleVal);
+
+        // Upgrade db from version 59 to version 61.
+        mHelper.onUpgrade(db, (59 << 16), 61);
+
+        // Query userHandle value from db which should be equal to UserHandle.USER_NULL(-10000)
+        // after db upgrade.
+        cursor = db.query("siminfo", testProjection, selection, selectionArgs,
+                null, null, null);
+        assertNotNull(cursor);
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+        userHandleVal = cursor.getInt(0);
+        assertEquals(UserHandle.USER_NULL, userHandleVal);
+    }
+
+    @Test
+    public void databaseHelperOnUpgrade_hasSatelliteEnabledField() {
+        Log.d(TAG, "databaseHelperOnUpgrade_hasSatelliteEnabledField");
+        // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+        SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+        mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext));
+
+        // the upgraded db must have
+        // Telephony.SimInfo.COLUMN_SATELLITE_ENABLED
+        Cursor cursor = db.query("siminfo", null, null, null, null, null, null);
+        String[] upgradedColumns = cursor.getColumnNames();
+        Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns));
+
+        assertTrue(Arrays.asList(upgradedColumns).contains(
+                Telephony.SimInfo.COLUMN_SATELLITE_ENABLED));
+    }
+
     /**
      * Helper for an in memory DB used to test the TelephonyProvider#DatabaseHelper.
      *
diff --git a/tests/src/com/android/providers/telephony/TelephonyProviderTest.java b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
index b3892be..de4c6c5 100644
--- a/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
@@ -48,7 +48,7 @@
 import android.test.suitebuilder.annotation.SmallTest;
 import android.text.TextUtils;
 import android.util.Log;
-
+import com.android.internal.telephony.LocalLog;
 import androidx.test.InstrumentationRegistry;
 
 import junit.framework.TestCase;
@@ -64,7 +64,9 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 import java.util.stream.IntStream;
 
@@ -216,6 +218,8 @@
                 arbitraryStringVal);
         contentValues.put(Telephony.SimInfo.COLUMN_NR_ADVANCED_CALLING_ENABLED, arbitraryIntVal);
         contentValues.put(Telephony.SimInfo.COLUMN_USAGE_SETTING, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES,
+                arbitraryStringVal);
         if (isoCountryCode != null) {
             contentValues.put(Telephony.SimInfo.COLUMN_ISO_COUNTRY_CODE, isoCountryCode);
         }
@@ -358,6 +362,12 @@
         notifyChangeRestoreCount = 0;
         // Required to access SIMINFO table
         mTelephonyProviderTestable.fakeCallingUid(Process.PHONE_UID);
+        // Ignore local log during test
+        Field field = PhoneFactory.class.getDeclaredField("sLocalLogs");
+        field.setAccessible(true);
+        HashMap<String, LocalLog> localLogs = new HashMap<>();
+        localLogs.put("TelephonyProvider", new LocalLog(0));
+        field.set(null, localLogs);
     }
 
     private void setUpMockContext(boolean isActiveSubId) {
@@ -424,9 +434,9 @@
         };
         final String selection = Carriers.NUMERIC + "=?";
         String[] selectionArgs = { insertNumeric };
-        Log.d(TAG, "testInsertCarriers query projection: " + testProjection
+        Log.d(TAG, "testInsertCarriers query projection: " + Arrays.toString(testProjection)
                 + "\ntestInsertCarriers selection: " + selection
-                + "\ntestInsertCarriers selectionArgs: " + selectionArgs);
+                + "\ntestInsertCarriers selectionArgs: " + Arrays.toString(selectionArgs));
         Cursor cursor = mContentResolver.query(Carriers.CONTENT_URI,
                 testProjection, selection, selectionArgs, null);
 
@@ -600,9 +610,9 @@
         };
         final String selection = Carriers.NUMERIC + "=?";
         String[] selectionArgs = { insertNumeric };
-        Log.d(TAG, "testInsertCarriers query projection: " + testProjection
+        Log.d(TAG, "testInsertCarriers query projection: " + Arrays.toString(testProjection)
                 + "\ntestInsertCarriers selection: " + selection
-                + "\ntestInsertCarriers selectionArgs: " + selectionArgs);
+                + "\ntestInsertCarriers selectionArgs: " + Arrays.toString(selectionArgs));
         Cursor cursor = mContentResolver.query(uri, testProjection, selection, selectionArgs, null);
 
         // verify that inserted values match results of query
@@ -618,7 +628,7 @@
         final String selectionToDelete = Carriers.NUMERIC + "=?";
         String[] selectionArgsToDelete = { insertNumeric };
         Log.d(TAG, "testInsertCarriers deleting selection: " + selectionToDelete
-                + "testInsertCarriers selectionArgs: " + selectionArgs);
+                + "testInsertCarriers selectionArgs: " + Arrays.toString(selectionArgs));
         int numRowsDeleted = mContentResolver.delete(uri, selectionToDelete, selectionArgsToDelete);
         assertEquals(1, numRowsDeleted);
 
@@ -655,9 +665,9 @@
         };
         final String selection = Carriers.NUMERIC + "=?";
         String[] selectionArgs = { insertNumeric };
-        Log.d(TAG, "testInsertCarriers query projection: " + testProjection
+        Log.d(TAG, "testInsertCarriers query projection: " + Arrays.toString(testProjection)
                 + "\ntestInsertCarriers selection: " + selection
-                + "\ntestInsertCarriers selectionArgs: " + selectionArgs);
+                + "\ntestInsertCarriers selectionArgs: " + Arrays.toString(selectionArgs));
         Cursor cursor = mContentResolver.query(Carriers.CONTENT_URI,
                 testProjection, selection, selectionArgs, null);
 
@@ -677,7 +687,7 @@
         final String selectionToDelete = Carriers.NUMERIC + "=?";
         String[] selectionArgsToDelete = { insertNumeric };
         Log.d(TAG, "testInsertCarriers deleting selection: " + selectionToDelete
-                + "testInsertCarriers selectionArgs: " + selectionArgs);
+                + "testInsertCarriers selectionArgs: " + Arrays.toString(selectionArgs));
         int numRowsDeleted = mContentResolver.delete(Carriers.CONTENT_URI,
                 selectionToDelete, selectionArgsToDelete);
         assertEquals(1, numRowsDeleted);
@@ -706,6 +716,8 @@
         final String insertCardId = "exampleCardId";
         final int insertProfileClass = SubscriptionManager.PROFILE_CLASS_DEFAULT;
         final int insertPortIndex = 1;
+        final int insertUserHandle = 0;
+        final int insertSatelliteEnabled = 1;
         contentValues.put(SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID, insertSubId);
         contentValues.put(SubscriptionManager.DISPLAY_NAME, insertDisplayName);
         contentValues.put(SubscriptionManager.CARRIER_NAME, insertCarrierName);
@@ -713,6 +725,8 @@
         contentValues.put(SubscriptionManager.CARD_ID, insertCardId);
         contentValues.put(SubscriptionManager.PROFILE_CLASS, insertProfileClass);
         contentValues.put(SubscriptionManager.PORT_INDEX, insertPortIndex);
+        contentValues.put(SubscriptionManager.USER_HANDLE, insertUserHandle);
+        contentValues.put(SubscriptionManager.SATELLITE_ENABLED, insertSatelliteEnabled);
 
         Log.d(TAG, "testSimTable Inserting contentValues: " + contentValues);
         mContentResolver.insert(SimInfo.CONTENT_URI, contentValues);
@@ -725,11 +739,13 @@
             SubscriptionManager.CARD_ID,
             SubscriptionManager.PROFILE_CLASS,
             SubscriptionManager.PORT_INDEX,
+            SubscriptionManager.USER_HANDLE,
+            SubscriptionManager.SATELLITE_ENABLED,
         };
         final String selection = SubscriptionManager.DISPLAY_NAME + "=?";
         String[] selectionArgs = { insertDisplayName };
         Log.d(TAG,"\ntestSimTable selection: " + selection
-                + "\ntestSimTable selectionArgs: " + selectionArgs.toString());
+                + "\ntestSimTable selectionArgs: " + Arrays.toString(selectionArgs));
         Cursor cursor = mContentResolver.query(SimInfo.CONTENT_URI,
                 testProjection, selection, selectionArgs, null);
 
@@ -742,16 +758,20 @@
         final String resultCardId = cursor.getString(2);
         final int resultProfileClass = cursor.getInt(3);
         final int resultPortIndex = cursor.getInt(4);
+        final int resultUserHandle = cursor.getInt(5);
+        final int resultSatelliteEnabled = cursor.getInt(6);
         assertEquals(insertSubId, resultSubId);
         assertEquals(insertCarrierName, resultCarrierName);
         assertEquals(insertCardId, resultCardId);
         assertEquals(insertPortIndex, resultPortIndex);
+        assertEquals(insertUserHandle, resultUserHandle);
+        assertEquals(insertSatelliteEnabled, resultSatelliteEnabled);
 
         // delete test content
         final String selectionToDelete = SubscriptionManager.DISPLAY_NAME + "=?";
         String[] selectionArgsToDelete = { insertDisplayName };
         Log.d(TAG, "testSimTable deleting selection: " + selectionToDelete
-                + "testSimTable selectionArgs: " + selectionArgs);
+                + "testSimTable selectionArgs: " + Arrays.toString(selectionArgs));
         int numRowsDeleted = mContentResolver.delete(SimInfo.CONTENT_URI,
                 selectionToDelete, selectionArgsToDelete);
         assertEquals(1, numRowsDeleted);
@@ -804,6 +824,9 @@
                 ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
                 getIntValueFromCursor(
                         cursor, Telephony.SimInfo.COLUMN_NR_ADVANCED_CALLING_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1,
+                getStringValueFromCursor(cursor,
+                        Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES));
         assertRestoredSubIdIsRemembered();
     }
 
@@ -990,6 +1013,11 @@
         return cursor.getInt(columnIndex);
     }
 
+    private String getStringValueFromCursor(Cursor cursor, String columnName) {
+        int columnIndex = cursor.getColumnIndex(columnName);
+        return cursor.getString(columnIndex);
+    }
+
     private int parseIdFromInsertedUri(Uri uri) throws NumberFormatException {
         return (uri != null) ? Integer.parseInt(uri.getLastPathSegment()) : -1;
     }
@@ -1671,7 +1699,6 @@
         assertEquals(1, cursor.getCount());
         cursor.moveToFirst();
         assertEquals(otherName, cursor.getString(0));
-        PhoneFactory.addLocalLog("TelephonyProvider", 1);
     }
 
     /**