<!--
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
-->
<select class="padding0 TZSelect form-control" ng-model="ngModel"
  ng-required="required">
  <option value="" disabled style='display:none;'>-Select timezone-</option>
  <option value="UTC">UTC</option>
  <option value="GMT-12:00">(GMT -12:00) Eniwetok, Kwajalein</option>
  <option value="GMT-11:00">(GMT -11:00) Midway Island, Samoa</option>
  <option value="GMT-10:00">(GMT -10:00) Hawaii</option>
  <option value="GMT-09:00">(GMT -9:00) Alaska</option>
  <option value="GMT-08:00">(GMT -8:00) Pacific Time (US &amp; Canada)</option>
  <option value="GMT-07:00">(GMT -7:00) Mountain Time (US &amp; Canada)</option>
  <option value="GMT-06:00">(GMT -6:00) Central Time (US &amp; Canada), Mexico City</option>
  <option value="GMT-05:00">(GMT -5:00) Eastern Time (US &amp; Canada), Bogota, Lima</option>
  <option value="GMT-04:00">(GMT -4:00) Atlantic Time (Canada), Caracas, La Paz</option>
  <option value="GMT-03:30">(GMT -3:30) Newfoundland</option>
  <option value="GMT-03:00">(GMT -3:00) Brazil, Buenos Aires, Georgetown</option>
  <option value="GMT-02:00">(GMT -2:00) Mid-Atlantic</option>
  <option value="GMT-01:00">(GMT -1:00 hour) Azores, Cape Verde Islands</option>
  <option value="GMT+00:00">(GMT) Western Europe Time, London, Lisbon, Casablanca</option>
  <option value="GMT+01:00">(GMT +1:00 hour) Brussels, Copenhagen, Madrid, Paris</option>
  <option value="GMT+02:00">(GMT +2:00) Kaliningrad, South Africa</option>
  <option value="GMT+03:00">(GMT +3:00) Baghdad, Riyadh, Moscow, St. Petersburg</option>
  <option value="GMT+03:30">(GMT +3:30) Tehran</option>
  <option value="GMT+04:00">(GMT +4:00) Abu Dhabi, Muscat, Baku, Tbilisi</option>
  <option value="GMT+04:30">(GMT +4:30) Kabul</option>
  <option value="GMT+05:00">(GMT +5:00) Ekaterinburg, Islamabad, Karachi, Tashkent</option>
  <option value="GMT+05:30">(GMT +5:30) Bombay, Calcutta, Madras, New Delhi</option>
  <option value="GMT+05:45">(GMT +5:45) Kathmandu</option>
  <option value="GMT+06:00">(GMT +6:00) Almaty, Dhaka, Colombo</option>
  <option value="GMT+07:00">(GMT +7:00) Bangkok, Hanoi, Jakarta</option>
  <option value="GMT+08:00">(GMT +8:00) Beijing, Perth, Singapore, Hong Kong</option>
  <option value="GMT+09:00">(GMT +9:00) Tokyo, Seoul, Osaka, Sapporo, Yakutsk</option>
  <option value="GMT+09:30">(GMT +9:30) Adelaide, Darwin</option>
  <option value="GMT+10:00">(GMT +10:00) Eastern Australia, Guam, Vladivostok</option>
  <option value="GMT+11:00">(GMT +11:00) Magadan, Solomon Islands, New Caledonia</option>
  <option value="GMT+12:00">(GMT +12:00) Auckland, Wellington, Fiji, Kamchatka</option>
</select>
